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

Reply via email to