Revision: 3203
          http://skim-app.svn.sourceforge.net/skim-app/?rev=3203&view=rev
Author:   hofman
Date:     2007-11-13 11:50:19 -0800 (Tue, 13 Nov 2007)

Log Message:
-----------
Order window menu items alphabetically.

Modified Paths:
--------------
    trunk/SKApplication.m

Modified: trunk/SKApplication.m
===================================================================
--- trunk/SKApplication.m       2007-11-13 10:09:30 UTC (rev 3202)
+++ trunk/SKApplication.m       2007-11-13 19:50:19 UTC (rev 3203)
@@ -121,50 +121,80 @@
 - (void)reorganizeWindowsItem:(NSWindow *)aWindow {
     NSMenu *windowsMenu = [self windowsMenu];
     NSWindowController *windowController = [aWindow windowController];
-    NSWindowController *mainWindowController = [[[windowController document] 
windowControllers] objectAtIndex:0];
+    NSWindowController *mainWindowController = [[[[aWindow windowController] 
document] windowControllers] objectAtIndex:0];
     int numberOfItems = [windowsMenu numberOfItems];
     int itemIndex = [windowsMenu indexOfItemWithTarget:aWindow 
andAction:@selector(makeKeyAndOrderFront:)];
     
     if (itemIndex != -1) {
         NSMenuItem *item = [windowsMenu itemAtIndex:itemIndex];
+        NSString *title = [item title];
         
         if ([windowController document] == nil) {
             int index = numberOfItems;
             while (index-- && [[windowsMenu itemAtIndex:index] 
isSeparatorItem] == NO && 
-                   [[[[windowsMenu itemAtIndex:index] target] 
windowController] document] == nil) {}
-            if (index >= 0) {
-                if (itemIndex < index) {
-                    [item retain];
-                    [windowsMenu removeItem:item];
-                    [windowsMenu insertItem:item atIndex:index];
-                    [item release];
-                    index--;
-                }
-                if ([[windowsMenu itemAtIndex:index] isSeparatorItem] == NO)
-                    [windowsMenu insertItem:[NSMenuItem separatorItem] 
atIndex:index + 1];
+                   [[[[windowsMenu itemAtIndex:index] target] 
windowController] document] == nil) {
+                    if ([[[windowsMenu itemAtIndex:index] title] 
caseInsensitiveCompare:title] == NSOrderedAscending)
+                        break;
             }
+            if (itemIndex != index + 1) {
+                [item retain];
+                [windowsMenu removeItem:item];
+                [windowsMenu insertItem:item atIndex:itemIndex <= index ? 
index : ++index];
+                [item release];
+                if (index > 0 && [[windowsMenu itemAtIndex:index - 1] 
isSeparatorItem] == NO)
+                    [windowsMenu insertItem:[NSMenuItem separatorItem] 
atIndex:index];
+            }
         } else if ([windowController isEqual:mainWindowController]) {
-            int index = itemIndex;
-            if ([[windowsMenu itemAtIndex:itemIndex - 1] isSeparatorItem] == 
NO) {
-                if ([[[[windowsMenu itemAtIndex:itemIndex - 1] target] 
windowController] document]) {
-                    while (++index < numberOfItems && [[windowsMenu 
itemAtIndex:index] isSeparatorItem] == NO) {}
-                    if (index == numberOfItems) {
-                        [windowsMenu insertItem:[NSMenuItem separatorItem] 
atIndex:index];
-                        numberOfItems++;
+            NSMutableArray *subitems = [NSMutableArray array];
+            NSMenuItem *anItem;
+            int index = numberOfItems;
+            int nextIndex = numberOfItems;
+            
+            while (index--) {
+                anItem = [windowsMenu itemAtIndex:index];
+                if (anItem != item && [anItem action] == 
@selector(makeKeyAndOrderFront:)) {
+                    id target = [anItem target];
+                    NSWindowController *aMainWindowController = [[[[target 
windowController] document] windowControllers] objectAtIndex:0];
+                    if ([aMainWindowController isEqual:mainWindowController]) {
+                        [subitems insertObject:anItem atIndex:0];
+                        [windowsMenu removeItemAtIndex:index];
+                        nextIndex--;
+                    } else if ([aMainWindowController isEqual:[target 
windowController]]) {
+                        NSComparisonResult comparison = [[anItem title] 
caseInsensitiveCompare:title];
+                        if (comparison == NSOrderedDescending)
+                            nextIndex = index;
+                    } else if ([[target windowController] document] == nil) {
+                        nextIndex = index;
                     }
-                } else {
-                    while (--index >= 0 && [[windowsMenu itemAtIndex:index] 
isSeparatorItem] == NO) {}
                 }
-                itemIndex = index < itemIndex ? index + 1 : index;
+            }
+            
+            if (itemIndex != nextIndex) {
                 [item retain];
-                [windowsMenu removeItem:item];
+                [windowsMenu removeItemAtIndex:itemIndex];
+                if (nextIndex > itemIndex)
+                    nextIndex--;
+                if (itemIndex < [windowsMenu numberOfItems] && itemIndex > 0 
&& [[windowsMenu itemAtIndex:itemIndex] isSeparatorItem] && [[windowsMenu 
itemAtIndex:itemIndex - 1] isSeparatorItem]) {
+                    [windowsMenu removeItemAtIndex:itemIndex];
+                    if (nextIndex > itemIndex)
+                        nextIndex--;
+                }
+                itemIndex = nextIndex++;
                 [windowsMenu insertItem:item atIndex:itemIndex];
                 [item release];
             }
-            index = itemIndex;
-            while (++index < numberOfItems && [[[[[windowsMenu 
itemAtIndex:index] target] windowController] document] 
isEqual:[windowController document]]) {}
-            if (index < numberOfItems && [[windowsMenu itemAtIndex:index] 
isSeparatorItem] == NO)
-                [windowsMenu insertItem:[NSMenuItem separatorItem] 
atIndex:index];
+            if (itemIndex > 1 && [[windowsMenu itemAtIndex:itemIndex - 1] 
isSeparatorItem] == NO) {
+                [windowsMenu insertItem:[NSMenuItem separatorItem] 
atIndex:itemIndex];
+                nextIndex++;
+            }
+            
+            NSEnumerator *itemEnum = [subitems objectEnumerator];
+            while (anItem = [itemEnum nextObject])
+                [windowsMenu insertItem:anItem atIndex:nextIndex++];
+            
+            if (nextIndex < [windowsMenu numberOfItems] && [[windowsMenu 
itemAtIndex:nextIndex] isSeparatorItem] == NO)
+                [windowsMenu insertItem:[NSMenuItem separatorItem] 
atIndex:nextIndex];
+            
         } else {
             int mainIndex = [windowsMenu 
indexOfItemWithTarget:[mainWindowController window] 
andAction:@selector(makeKeyAndOrderFront:)];
             int index = mainIndex;
@@ -172,8 +202,11 @@
             [item setIndentationLevel:1];
             
             if (index >= 0) {
-                while (++index < numberOfItems && [[windowsMenu 
itemAtIndex:index] isSeparatorItem] == NO) {}
-                if (itemIndex < mainIndex || itemIndex > index) {
+                while (++index < numberOfItems && [[windowsMenu 
itemAtIndex:index] isSeparatorItem] == NO) {
+                    if ([[[windowsMenu itemAtIndex:index] title] 
caseInsensitiveCompare:title] == NSOrderedDescending)
+                        break;
+                }
+                if (itemIndex != index - 1) {
                     [item retain];
                     [windowsMenu removeItem:item];
                     [windowsMenu insertItem:item atIndex:itemIndex < index ? 
--index : index];


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to