Skip to content

Commit

Permalink
Improve performance of adding/removing bonjour bookmarks. Limit bookm…
Browse files Browse the repository at this point in the history
…arks in menus to 100 or 50 for bonjour folder to improve performance.
  • Loading branch information
gnachman committed May 1, 2011
1 parent 26f24c7 commit 5469e0f
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 16 deletions.
7 changes: 4 additions & 3 deletions BookmarkListView.m
Expand Up @@ -191,10 +191,11 @@ - (BookmarkModel*)underlyingModel
- (void)sync
{
[bookmarks removeAllObjects];
int n = [underlyingModel numberOfBookmarksWithFilter:filter];
for (int i = 0; i < n; ++i) {
NSArray* filteredBookmarks = [underlyingModel bookmarkIndicesMatchingFilter:filter];
for (NSNumber* n in filteredBookmarks) {
int i = [n intValue];
//NSLog(@"Wrapper at %p add bookmark %@ at index %d", self, [[underlyingModel bookmarkAtIndex:i] objectForKey:KEY_NAME], i);
[bookmarks addObject:[[[BookmarkRow alloc] initWithBookmark:[underlyingModel bookmarkAtIndex:i withFilter:filter]
[bookmarks addObject:[[[BookmarkRow alloc] initWithBookmark:[underlyingModel bookmarkAtIndex:i]
underlyingModel:underlyingModel] autorelease]];
}
[self sort];
Expand Down
30 changes: 29 additions & 1 deletion BookmarkModel.m
Expand Up @@ -121,6 +121,19 @@ - (NSArray*)parseFilter:(NSString*)filter
return [filter componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
}

- (NSArray*)bookmarkIndicesMatchingFilter:(NSString*)filter
{
NSMutableArray* result = [NSMutableArray arrayWithCapacity:[bookmarks_ count]];
NSArray* tokens = [self parseFilter:filter];
int count = [bookmarks_ count];
for (int i = 0; i < count; ++i) {
if ([self doesBookmarkAtIndex:i matchFilter:tokens]) {
[result addObject:[NSNumber numberWithInt:i]];
}
}
return result;
}

- (int)numberOfBookmarksWithFilter:(NSString*)filter
{
NSArray* tokens = [self parseFilter:filter];
Expand Down Expand Up @@ -251,9 +264,24 @@ - (int)convertFilteredIndex:(int)theIndex withFilter:(NSString*)filter
return -1;
}

- (void)removeBookmarksAtIndices:(NSArray*)indices
{
NSArray* sorted = [indices sortedArrayUsingSelector:@selector(compare:)];
for (int j = [sorted count] - 1; j >= 0; j--) {
int i = [[sorted objectAtIndex:j] intValue];
assert(i >= 0);

[bookmarks_ removeObjectAtIndex:i];
if (![self defaultBookmark] && [bookmarks_ count]) {
[self setDefaultByGuid:[[bookmarks_ objectAtIndex:0] objectForKey:KEY_GUID]];
}
}
[self postChangeNotification];
}

- (void)removeBookmarkAtIndex:(int)i
{
NSAssert(i >= 0, @"Bounds");
assert(i >= 0);
[bookmarks_ removeObjectAtIndex:i];
if (![self defaultBookmark] && [bookmarks_ count]) {
[self setDefaultByGuid:[[bookmarks_ objectAtIndex:0] objectForKey:KEY_GUID]];
Expand Down
2 changes: 2 additions & 0 deletions Headers/iTerm/BookmarkModel.h
Expand Up @@ -39,13 +39,15 @@ typedef NSDictionary Bookmark;
+ (NSString*)freshGuid;
- (int)numberOfBookmarks;
- (int)numberOfBookmarksWithFilter:(NSString*)filter;
- (NSArray*)bookmarkIndicesMatchingFilter:(NSString*)filter;
- (int)indexOfBookmarkWithGuid:(NSString*)guid;
- (int)indexOfBookmarkWithGuid:(NSString*)guid withFilter:(NSString*)filter;
- (Bookmark*)bookmarkAtIndex:(int)index;
- (Bookmark*)bookmarkAtIndex:(int)index withFilter:(NSString*)filter;
- (void)addBookmark:(Bookmark*)bookmark;
- (void)addBookmark:(Bookmark*)bookmark inSortedOrder:(BOOL)sort;
- (void)removeBookmarkWithGuid:(NSString*)guid;
- (void)removeBookmarksAtIndices:(NSArray*)indices;
- (void)removeBookmarkAtIndex:(int)index;
- (void)removeBookmarkAtIndex:(int)index withFilter:(NSString*)filter;
- (void)setBookmark:(Bookmark*)bookmark atIndex:(int)index;
Expand Down
10 changes: 4 additions & 6 deletions ITAddressBookMgr.m
Expand Up @@ -283,18 +283,16 @@ - (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didRemoveSer
// remove host entry from this group
NSMutableArray* toRemove = [[[NSMutableArray alloc] init] autorelease];
NSString* sftpName = [NSString stringWithFormat:@"%@-sftp", [aNetService name]];
for (int i = 0; i < [[BookmarkModel sharedInstance] numberOfBookmarksWithFilter:@"bonjour"]; ++i) {
Bookmark* bookmark = [[BookmarkModel sharedInstance] bookmarkAtIndex:i withFilter:@"bonjour"];
for (NSNumber* n in [[BookmarkModel sharedInstance] bookmarkIndicesMatchingFilter:@"bonjour"]) {
int i = [n intValue];
Bookmark* bookmark = [[BookmarkModel sharedInstance] bookmarkAtIndex:i];
NSString* bookmarkName = [bookmark objectForKey:KEY_NAME];
if ([bookmarkName isEqualToString:[aNetService name]] ||
[bookmarkName isEqualToString:sftpName]) {
[toRemove addObject:[NSNumber numberWithInt:i]];
}
}
for (int i = [toRemove count]-1; i >= 0; --i) {
[[BookmarkModel sharedInstance] removeBookmarkAtIndex:[[toRemove objectAtIndex:i] intValue] withFilter:@"bonjour"];
}
[toRemove removeAllObjects];
[[BookmarkModel sharedInstance] removeBookmarksAtIndices:toRemove];
}

+ (NSString*)descFromFont:(NSFont*)font
Expand Down
26 changes: 20 additions & 6 deletions iTermController.m
Expand Up @@ -495,22 +495,36 @@ - (void)_addBookmarksForTag:(NSString*)tag toMenu:(NSMenu*)aMenu target:(id)aTar
NSMenuItem* aMenuItem = [[NSMenuItem alloc] initWithTitle:tag action:@selector(noAction:) keyEquivalent:@""];
NSMenu* subMenu = [[[NSMenu alloc] init] autorelease];
int count = 0;
int MAX_MENU_ITEMS = 100;
if ([tag isEqualToString:@"bonjour"]) {
MAX_MENU_ITEMS = 50;
}
for (int i = 0; i < [[BookmarkModel sharedInstance] numberOfBookmarks]; ++i) {
Bookmark* bookmark = [[BookmarkModel sharedInstance] bookmarkAtIndex:i];
NSArray* tags = [bookmark objectForKey:KEY_TAGS];
for (int j = 0; j < [tags count]; ++j) {
if ([tag localizedCaseInsensitiveCompare:[tags objectAtIndex:j]] == NSOrderedSame) {
++count;
[self _addBookmark:bookmark
toMenu:subMenu
target:aTarget
withShortcuts:withShortcuts
selector:selector
alternateSelector:alternateSelector];
if (count <= MAX_MENU_ITEMS) {
[self _addBookmark:bookmark
toMenu:subMenu
target:aTarget
withShortcuts:withShortcuts
selector:selector
alternateSelector:alternateSelector];
}
break;
}
}
}
if ([[BookmarkModel sharedInstance] numberOfBookmarks] > MAX_MENU_ITEMS) {
int overflow = [[BookmarkModel sharedInstance] numberOfBookmarks] - MAX_MENU_ITEMS;
NSMenuItem* overflowItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:@"[%d profiles not shown]", overflow]
action:nil
keyEquivalent:@""];
[subMenu addItem:overflowItem];
[overflowItem release];
}
[aMenuItem setSubmenu:subMenu];
[aMenuItem setTarget:self];
[aMenu addItem:aMenuItem];
Expand Down

0 comments on commit 5469e0f

Please sign in to comment.