Revision: 28409
http://sourceforge.net/p/bibdesk/svn/28409
Author: hofman
Date: 2023-10-29 15:26:42 +0000 (Sun, 29 Oct 2023)
Log Message:
-----------
always rebuild all windows menu items, as currently other items can be changed
by the default implementation
Modified Paths:
--------------
trunk/bibdesk/BDSKApplication.m
Modified: trunk/bibdesk/BDSKApplication.m
===================================================================
--- trunk/bibdesk/BDSKApplication.m 2023-10-15 08:56:13 UTC (rev 28408)
+++ trunk/bibdesk/BDSKApplication.m 2023-10-29 15:26:42 UTC (rev 28409)
@@ -96,129 +96,63 @@
[[NSNotificationCenter defaultCenter]
postNotificationName:BDSKFlagsChangedNotification object:self];
}
-- (void)reorganizeWindowsItem:(NSWindow *)aWindow {
+- (void)reorganizeWindowsItems {
NSMenu *windowsMenu = [self windowsMenu];
- NSWindowController *windowController = [aWindow windowController];
- NSWindowController *mainWindowController = [[[windowController document]
windowControllers] objectAtIndex:0];
- NSInteger numberOfItems = [windowsMenu numberOfItems];
- NSInteger itemIndex = [windowsMenu indexOfItemWithTarget:aWindow
andAction:@selector(makeKeyAndOrderFront:)];
+ NSInteger nItems = [windowsMenu numberOfItems];
+ NSInteger i = nItems;
+ NSMutableArray *mainItems = [NSMutableArray array];
+ NSMutableArray *auxItems = [NSMutableArray array];
+ NSMapTable *subItems = [NSMapTable strongToStrongObjectsMapTable];
+ NSMenuItem *item;
- if (itemIndex != -1) {
- NSMenuItem *item = [windowsMenu itemAtIndex:itemIndex];
- NSString *title = [item title];
+ while (i-- > 0) {
+ item = [windowsMenu itemAtIndex:i];
+ if ([item isSeparatorItem] || [item action] !=
@selector(makeKeyAndOrderFront:)) break;
- if ([windowController document] == nil) {
- NSInteger idx = numberOfItems;
- while (idx--) {
- NSMenuItem *anItem = [windowsMenu itemAtIndex:idx];
- if ([anItem isSeparatorItem] ||
- [[[anItem target] windowController] document] != nil ||
- [[anItem title] caseInsensitiveCompare:title] ==
NSOrderedAscending)
- break;
+ NSWindow *window = [item target];
+ NSWindowController *wc = [window windowController];
+ NSDocument *doc = [wc document];
+
+ if (doc == nil) {
+ [auxItems insertObject:item atIndex:0];
+ } else if ([wc isEqual:[[doc windowControllers] firstObject]]) {
+ [mainItems insertObject:item atIndex:0];
+ } else {
+ NSMutableArray *subArray = [subItems objectForKey:doc];
+ if (subArray == nil) {
+ subArray = [NSMutableArray array];
+ [subItems setObject:subArray forKey:doc];
}
- ++idx;
- if (itemIndex != idx) {
- if (itemIndex < idx)
- idx--;
- [item retain];
- [windowsMenu removeItem:item];
- [windowsMenu insertItem:item atIndex:idx];
- [item release];
- }
- if (idx > 0 && [[windowsMenu itemAtIndex:idx - 1] isSeparatorItem]
== NO && [[[[windowsMenu itemAtIndex:idx - 1] target] windowController]
document] != nil)
- [windowsMenu insertItem:[NSMenuItem separatorItem]
atIndex:idx];
- } else if ([windowController isEqual:mainWindowController]) {
- NSMutableArray *subitems = [NSMutableArray array];
- NSMenuItem *anItem;
- NSInteger idx = numberOfItems;
- NSInteger nextIndex = numberOfItems;
-
- while (idx--) {
- anItem = [windowsMenu itemAtIndex:idx];
- if (anItem != item && [anItem action] ==
@selector(makeKeyAndOrderFront:)) {
- id target = [anItem target];
- NSWindowController *aWindowController = [target
windowController];
- NSWindowController *aMainWindowController =
[[[aWindowController document] windowControllers] objectAtIndex:0];
- if ([aMainWindowController isEqual:mainWindowController]) {
- [subitems insertObject:anItem atIndex:0];
- [windowsMenu removeItemAtIndex:idx];
- nextIndex--;
- if (itemIndex > idx)
- itemIndex--;
- } else if ([aMainWindowController isEqual:[target
windowController]]) {
- NSComparisonResult comparison = [[anItem title]
caseInsensitiveCompare:title];
- if (comparison == NSOrderedDescending)
- nextIndex = idx;
- } else if ([[target windowController] document] == nil) {
- nextIndex = idx;
- }
- }
- }
-
- if (itemIndex != nextIndex) {
- [item retain];
- [windowsMenu removeItemAtIndex:itemIndex];
- if (nextIndex > itemIndex)
- nextIndex--;
- if (itemIndex < [windowsMenu numberOfItems] && [[windowsMenu
itemAtIndex:itemIndex] isSeparatorItem] &&
- (itemIndex == [windowsMenu numberOfItems] - 1 ||
(itemIndex > 0 && [[windowsMenu itemAtIndex:itemIndex - 1] isSeparatorItem]))) {
- [windowsMenu removeItemAtIndex:itemIndex];
- if (nextIndex > itemIndex)
- nextIndex--;
- }
- itemIndex = nextIndex++;
- [windowsMenu insertItem:item atIndex:itemIndex];
- [item release];
- }
- if (itemIndex > 1 && [[windowsMenu itemAtIndex:itemIndex - 1]
isSeparatorItem] == NO) {
- [windowsMenu insertItem:[NSMenuItem separatorItem]
atIndex:itemIndex];
- nextIndex++;
- }
-
- for (anItem in subitems)
- [windowsMenu insertItem:anItem atIndex:nextIndex++];
-
- if (nextIndex < [windowsMenu numberOfItems] && [[windowsMenu
itemAtIndex:nextIndex] isSeparatorItem] == NO)
- [windowsMenu insertItem:[NSMenuItem separatorItem]
atIndex:nextIndex];
-
- } else {
- NSInteger mainIndex = [windowsMenu
indexOfItemWithTarget:[mainWindowController window]
andAction:@selector(makeKeyAndOrderFront:)];
- NSInteger idx = mainIndex;
-
+ [subArray insertObject:item atIndex:0];
[item setIndentationLevel:1];
-
- if (idx >= 0) {
- while (++idx < numberOfItems) {
- NSMenuItem *anItem = [windowsMenu itemAtIndex:idx];
- if ([anItem isSeparatorItem] || [[anItem title]
caseInsensitiveCompare:title] == NSOrderedDescending)
- break;
- }
- if (itemIndex != idx - 1) {
- if (itemIndex < idx)
- idx--;
- [item retain];
- [windowsMenu removeItem:item];
- [windowsMenu insertItem:item atIndex:idx];
- [item release];
- }
- }
}
+ [windowsMenu removeItemAtIndex:i];
}
+
+ for (item in mainItems) {
+ [windowsMenu addItem:item];
+ NSArray *subArray = [subItems objectForKey:[[[item target]
windowController] document]];
+ if ([subArray count]) {
+ NSMenuItem *subItem;
+ for (subItem in subArray)
+ [windowsMenu addItem:subItem];
+ }
+ }
+
+ for (item in auxItems)
+ [windowsMenu addItem:item];
}
- (void)addWindowsItem:(NSWindow *)aWindow title:(NSString *)aString
filename:(BOOL)isFilename {
- NSInteger itemIndex = [[self windowsMenu] indexOfItemWithTarget:aWindow
andAction:@selector(makeKeyAndOrderFront:)];
-
[super addWindowsItem:aWindow title:aString filename:isFilename];
- if (itemIndex == -1)
- [self reorganizeWindowsItem:aWindow];
+ [self reorganizeWindowsItems];
}
- (void)changeWindowsItem:(NSWindow *)aWindow title:(NSString *)aString
filename:(BOOL)isFilename {
[super changeWindowsItem:aWindow title:aString filename:isFilename];
- [self reorganizeWindowsItem:aWindow];
+ [self reorganizeWindowsItems];
}
- (void)removeWindowsItem:(NSWindow *)aWindow {
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
Bibdesk-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit