From: <ste...@us...> - 2008-01-06 09:40:13
|
Revision: 1146 http://vienna-rss.svn.sourceforge.net/vienna-rss/?rev=1146&view=rev Author: stevewpalmer Date: 2008-01-06 01:40:08 -0800 (Sun, 06 Jan 2008) Log Message: ----------- Add auto/manual folder sorting. This is controlled by the View->Order By command and is designed to be easily extensible for other sorting methods although it isn't exactly trivial. Ideally more work is needed in FoldersTree to offload the responsibility to decide exactly when the list should be resorted but that's another work item. I've not fully updated localization files yet because I'm not yet 100% sure of the wording of the Order By options. Modified Paths: -------------- trunk/2.3.0/AppController.h trunk/2.3.0/AppController.m trunk/2.3.0/CHANGES trunk/2.3.0/Database.m trunk/2.3.0/FoldersTree.m trunk/2.3.0/MainMenu.nib/classes.nib trunk/2.3.0/MainMenu.nib/info.nib trunk/2.3.0/MainMenu.nib/keyedobjects.nib trunk/2.3.0/TreeNode.h trunk/2.3.0/TreeNode.m trunk/2.3.0/en.lproj/Localizable.strings trunk/2.3.0/notes.html Added Paths: ----------- trunk/2.3.0/es.lproj/InfoWindow.nib/data.dependency Removed Paths: ------------- trunk/2.3.0/es.lproj/AdvancedPreferences~.nib/ Modified: trunk/2.3.0/AppController.h =================================================================== --- trunk/2.3.0/AppController.h 2008-01-02 20:57:53 UTC (rev 1145) +++ trunk/2.3.0/AppController.h 2008-01-06 09:40:08 UTC (rev 1146) @@ -165,6 +165,7 @@ -(IBAction)hideFilterBar:(id)sender; -(IBAction)setFocusToSearchField:(id)sender; -(IBAction)localPerformFindPanelAction:(id)sender; +-(IBAction)keepFoldersArranged:(id)sender; // Public functions -(void)installCustomEventHandler; Modified: trunk/2.3.0/AppController.m =================================================================== --- trunk/2.3.0/AppController.m 2008-01-02 20:57:53 UTC (rev 1145) +++ trunk/2.3.0/AppController.m 2008-01-06 09:40:08 UTC (rev 1146) @@ -1207,6 +1207,14 @@ [mainWindow makeKeyAndOrderFront:self]; } +/* keepFoldersArranged + * Toggle the arrangement of the folders list. + */ +-(IBAction)keepFoldersArranged:(id)sender +{ + [[Preferences standardPreferences] setFoldersTreeSortMethod:[sender tag]]; +} + /* runAppleScript * Run an AppleScript script given a fully qualified path to the script. */ @@ -3746,6 +3754,12 @@ [menuItem setState:([menuItem tag] == [[Preferences standardPreferences] filterMode]) ? NSOnState : NSOffState]; return isMainWindowVisible; } + else if (theAction == @selector(keepFoldersArranged:)) + { + Preferences * prefs = [Preferences standardPreferences]; + [menuItem setState:([prefs foldersTreeSortMethod] == [menuItem tag]) ? NSOnState : NSOffState]; + return isMainWindowVisible; + } else if (theAction == @selector(setFocusToSearchField:)) { return isMainWindowVisible; Modified: trunk/2.3.0/CHANGES =================================================================== --- trunk/2.3.0/CHANGES 2008-01-02 20:57:53 UTC (rev 1145) +++ trunk/2.3.0/CHANGES 2008-01-06 09:40:08 UTC (rev 1146) @@ -8,8 +8,10 @@ Thanks! + 2.3.0.2300 ---------- +- Add folder ordering option (manually or by name). 2.2.2.2212 ---------- Modified: trunk/2.3.0/Database.m =================================================================== --- trunk/2.3.0/Database.m 2008-01-02 20:57:53 UTC (rev 1145) +++ trunk/2.3.0/Database.m 2008-01-06 09:40:08 UTC (rev 1146) @@ -786,8 +786,8 @@ } int nextSibling = 0; - BOOL autoSort = [[Preferences standardPreferences] foldersTreeSortMethod] == MA_FolderSort_ByName; - if (!autoSort) + BOOL manualSort = [[Preferences standardPreferences] foldersTreeSortMethod] == MA_FolderSort_Manual; + if (manualSort) { if (predecessorId > 0) { @@ -829,7 +829,7 @@ [folder setFlag:MA_FFlag_CheckForImage]; [foldersArray setObject:folder forKey:[NSNumber numberWithInt:newItemId]]; - if (!autoSort) + if (manualSort) { if (nextSibling > 0) [self setNextSibling:nextSibling forFolder:newItemId]; @@ -942,7 +942,7 @@ } // Update the sort order if necessary - if ([[Preferences standardPreferences] foldersTreeSortMethod] != MA_FolderSort_ByName) + if ([[Preferences standardPreferences] foldersTreeSortMethod] == MA_FolderSort_Manual) { [self verifyThreadSafety]; SQLResult * results = [sqlDatabase performQueryWithFormat:@"select folder_id from folders where parent_id=%d and next_sibling=%d", [folder parentId], folderId]; Modified: trunk/2.3.0/FoldersTree.m =================================================================== --- trunk/2.3.0/FoldersTree.m 2008-01-02 20:57:53 UTC (rev 1145) +++ trunk/2.3.0/FoldersTree.m 2008-01-06 09:40:08 UTC (rev 1146) @@ -151,11 +151,6 @@ [nc addObserver:self selector:@selector(handleFolderFontChange:) name:@"MA_Notify_FolderFontChange" object:nil]; [nc addObserver:self selector:@selector(handleShowFolderImagesChange:) name:@"MA_Notify_ShowFolderImages" object:nil]; [nc addObserver:self selector:@selector(handleAutoSortFoldersTreeChange:) name:@"MA_Notify_AutoSortFoldersTreeChange" object:nil]; - - // Make sure that folders are manually sorted. - // This will result in a call to handleAutoSortFoldersTreeChange: - if ([[Preferences standardPreferences] foldersTreeSortMethod] != MA_FolderSort_Manual) - [[Preferences standardPreferences] setFoldersTreeSortMethod:MA_FolderSort_Manual]; } /* handleFolderFontChange @@ -272,7 +267,7 @@ -(BOOL)loadTree:(NSArray *)listOfFolders rootNode:(TreeNode *)node { Folder * folder; - if ([[Preferences standardPreferences] foldersTreeSortMethod] == MA_FolderSort_ByName) + if ([[Preferences standardPreferences] foldersTreeSortMethod] != MA_FolderSort_Manual) { NSEnumerator * enumerator = [listOfFolders objectEnumerator]; while ((folder = [enumerator nextObject]) != nil) @@ -281,7 +276,7 @@ NSArray * listOfSubFolders = [[Database sharedDatabase] arrayOfFolders:itemId]; int count = [listOfSubFolders count]; TreeNode * subNode; - + subNode = [[TreeNode alloc] init:node atIndex:-1 folder:folder canHaveChildren:(count > 0)]; if (count) [self loadTree:listOfSubFolders rootNode:subNode]; @@ -687,8 +682,9 @@ TreeNode * parentNode = [node parentNode]; BOOL moveSelection = (folderId == [self actualSelection]); + if ([[Preferences standardPreferences] foldersTreeSortMethod] == MA_FolderSort_ByName) - [parentNode sortChildren]; + [parentNode sortChildren:MA_FolderSort_ByName]; [self reloadFolderItem:parentNode reloadChildren:YES]; if (moveSelection) @@ -1170,8 +1166,8 @@ // we have to watch for is to make sure that we don't re-parent to a subordinate // folder. Database * db = [Database sharedDatabase]; - BOOL autoSort = [[Preferences standardPreferences] foldersTreeSortMethod] == MA_FolderSort_ByName; - + BOOL autoSort = [[Preferences standardPreferences] foldersTreeSortMethod] != MA_FolderSort_Manual; + [db beginTransaction]; while (index < count) { @@ -1193,7 +1189,7 @@ if (newParentId == oldParentId) { - // With alphabetic sorting, moving under the same parent is impossible. + // With automatic sorting, moving under the same parent is impossible. if (autoSort) continue; // No need to move if destination is the same as origin. Modified: trunk/2.3.0/MainMenu.nib/classes.nib =================================================================== --- trunk/2.3.0/MainMenu.nib/classes.nib 2008-01-02 20:57:53 UTC (rev 1145) +++ trunk/2.3.0/MainMenu.nib/classes.nib 2008-01-06 09:40:08 UTC (rev 1146) @@ -24,6 +24,7 @@ handleAbout = id; hideFilterBar = id; importSubscriptions = id; + keepFoldersArranged = id; keyboardShortcutsHelp = id; localPerformFindPanelAction = id; mailLinkToArticlePage = id; @@ -34,6 +35,7 @@ markFlagged = id; markRead = id; moreStyles = id; + myAction = id; newGroupFolder = id; newSmartFolder = id; newSubscription = id; Modified: trunk/2.3.0/MainMenu.nib/info.nib =================================================================== --- trunk/2.3.0/MainMenu.nib/info.nib 2008-01-02 20:57:53 UTC (rev 1145) +++ trunk/2.3.0/MainMenu.nib/info.nib 2008-01-06 09:40:08 UTC (rev 1146) @@ -3,15 +3,15 @@ <plist version="1.0"> <dict> <key>IBDocumentLocation</key> - <string>76 193 774 513 0 0 1440 878 </string> + <string>367 150 774 513 0 0 1440 878 </string> <key>IBEditorPositions</key> <dict> <key>1148</key> - <string>600 418 719 649 0 0 1920 1178 </string> + <string>360 192 719 649 0 0 1440 878 </string> <key>1227</key> <string>660 515 120 142 0 0 1440 878 </string> <key>1251</key> - <string>830 857 259 64 0 0 1920 1178 </string> + <string>590 631 259 64 0 0 1440 878 </string> <key>1267</key> <string>690 575 60 70 0 0 1440 878 </string> <key>1288</key> @@ -19,7 +19,7 @@ <key>1300</key> <string>410 574 619 71 0 0 1440 878 </string> <key>29</key> - <string>833 1069 440 44 0 0 1920 1178 </string> + <string>127 1031 440 44 0 0 1920 1178 </string> <key>738</key> <string>660 539 120 142 0 0 1440 878 </string> <key>860</key> @@ -35,12 +35,9 @@ <integer>3</integer> <key>IBOpenObjects</key> <array> - <integer>21</integer> - <integer>1148</integer> - <integer>1251</integer> <integer>29</integer> </array> <key>IBSystem Version</key> - <string>9A581</string> + <string>9B18</string> </dict> </plist> Modified: trunk/2.3.0/MainMenu.nib/keyedobjects.nib =================================================================== (Binary files differ) Modified: trunk/2.3.0/TreeNode.h =================================================================== --- trunk/2.3.0/TreeNode.h 2008-01-02 20:57:53 UTC (rev 1145) +++ trunk/2.3.0/TreeNode.h 2008-01-06 09:40:08 UTC (rev 1146) @@ -41,7 +41,7 @@ -(void)addChild:(TreeNode *)child atIndex:(int)insertIndex; -(void)removeChildren; -(void)removeChild:(TreeNode *)child andChildren:(BOOL)removeChildrenFlag; --(void)sortChildren; +-(void)sortChildren:(int)sortMethod; -(NSString *)nodeName; -(TreeNode *)childByName:(NSString *)childName; -(TreeNode *)childByIndex:(int)index; @@ -53,4 +53,5 @@ -(int)countOfChildren; -(void)setCanHaveChildren:(BOOL)childflag; -(BOOL)canHaveChildren; +-(NSComparisonResult)folderNameCompare:(TreeNode *)otherObject; @end Modified: trunk/2.3.0/TreeNode.m =================================================================== --- trunk/2.3.0/TreeNode.m 2008-01-02 20:57:53 UTC (rev 1145) +++ trunk/2.3.0/TreeNode.m 2008-01-06 09:40:08 UTC (rev 1146) @@ -52,7 +52,7 @@ * is tightly coupled with the folder view and database. Specifically: * * 1. The folder type value dictates the order of each type relative to each other. - * 2. Within a specified type, all folders are organised by name in ascending order. + * 2. Within a specified type, all folders are organised by the active sort method. * * This function does not fail. It is assumed that the child can always be inserted into * place one way or the other. @@ -61,29 +61,27 @@ { NSAssert(canHaveChildren, @"Trying to add children to a node that cannot have children (canHaveChildren==NO)"); unsigned int count = [children count]; + int sortMethod = [[Preferences standardPreferences] foldersTreeSortMethod]; - if ([[Preferences standardPreferences] foldersTreeSortMethod] == MA_FolderSort_ByName) + if (sortMethod != MA_FolderSort_Manual) { TreeNode * forwardChild = nil; insertIndex = 0; - + if (count > 0u) forwardChild = [children objectAtIndex:0u]; while (insertIndex < count) { TreeNode * theChild = [children objectAtIndex:insertIndex]; - Folder * theChildFolder = [theChild folder]; - Folder * ourChildFolder = [child folder]; - - if (FolderType(ourChildFolder) < FolderType(theChildFolder)) - break; - else if (IsSameFolderType(theChildFolder, ourChildFolder)) + if (sortMethod == MA_FolderSort_ByName) { - NSString * theChildName = [theChildFolder name]; - NSString * ourChildName = [ourChildFolder name]; - if ([theChildName caseInsensitiveCompare:ourChildName] == NSOrderedDescending) + if ([child folderNameCompare:theChild] == NSOrderedAscending) break; } + else + { + NSAssert1(TRUE, @"Unsupported folder sort method in addChild: %d", sortMethod); + } ++insertIndex; } } @@ -108,9 +106,22 @@ /* sortChildren * Sort the children of this node. */ --(void)sortChildren +-(void)sortChildren:(int)sortMethod { - [children sortUsingSelector:@selector(folderNameCompare:)]; + switch (sortMethod) + { + case MA_FolderSort_Manual: + // Do nothing + break; + + case MA_FolderSort_ByName: + [children sortUsingSelector:@selector(folderNameCompare:)]; + break; + + default: + NSAssert1(TRUE, @"Unsupported folder sort method in sortChildren: %d", sortMethod); + break; + } } /* folderNameCompare @@ -120,6 +131,7 @@ { Folder * thisFolder = [self folder]; Folder * otherFolder = [otherObject folder]; + if (FolderType(thisFolder) < FolderType(otherFolder)) return NSOrderedAscending; if (FolderType(thisFolder) > FolderType(otherFolder)) Modified: trunk/2.3.0/en.lproj/Localizable.strings =================================================================== --- trunk/2.3.0/en.lproj/Localizable.strings 2008-01-02 20:57:53 UTC (rev 1145) +++ trunk/2.3.0/en.lproj/Localizable.strings 2008-01-06 09:40:08 UTC (rev 1146) @@ -383,4 +383,9 @@ |