Revision: 2923
          http://skim-app.svn.sourceforge.net/skim-app/?rev=2923&view=rev
Author:   hofman
Date:     2007-09-15 03:18:21 -0700 (Sat, 15 Sep 2007)

Log Message:
-----------
Add separator bookmarks.

Modified Paths:
--------------
    trunk/Dutch.lproj/BookmarksWindow.nib/classes.nib
    trunk/Dutch.lproj/BookmarksWindow.nib/keyedobjects.nib
    trunk/English.lproj/BookmarksWindow.nib/classes.nib
    trunk/English.lproj/BookmarksWindow.nib/keyedobjects.nib
    trunk/French.lproj/BookmarksWindow.nib/classes.nib
    trunk/French.lproj/BookmarksWindow.nib/keyedobjects.nib
    trunk/Italian.lproj/BookmarksWindow.nib/classes.nib
    trunk/Italian.lproj/BookmarksWindow.nib/keyedobjects.nib
    trunk/SKApplicationController.m
    trunk/SKBookmarkController.h
    trunk/SKBookmarkController.m

Modified: trunk/Dutch.lproj/BookmarksWindow.nib/classes.nib
===================================================================
--- trunk/Dutch.lproj/BookmarksWindow.nib/classes.nib   2007-09-13 22:25:15 UTC 
(rev 2922)
+++ trunk/Dutch.lproj/BookmarksWindow.nib/classes.nib   2007-09-15 10:18:21 UTC 
(rev 2923)
@@ -1,15 +1,25 @@
 {
     IBClasses = (
-        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {"" = id; }; 
+            CLASS = FirstResponder; 
+            LANGUAGE = ObjC; 
+            SUPERCLASS = NSObject; 
+        }, 
         {CLASS = NSObject; LANGUAGE = ObjC; }, 
         {CLASS = SKBookmark; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
         {
-            ACTIONS = {insertBookmarkFolder = id; openBookmark = id; }; 
+            ACTIONS = {
+                doubleClickBookmark = id; 
+                insertBookmarkFolder = id; 
+                insertBookmarkSeparator = id; 
+            }; 
             CLASS = SKBookmarkController; 
             LANGUAGE = ObjC; 
-            OUTLETS = {outlineView = SKOutlineView; statusBar = SKStatusBar; 
}; 
+            OUTLETS = {outlineView = SKBookmarkOutlineView; statusBar = 
SKStatusBar; }; 
             SUPERCLASS = NSWindowController; 
         }, 
+        {CLASS = SKBookmarkOutlineView; LANGUAGE = ObjC; SUPERCLASS = 
SKOutlineView; }, 
         {
             ACTIONS = {
                 copy = id; 

Modified: trunk/Dutch.lproj/BookmarksWindow.nib/keyedobjects.nib
===================================================================
(Binary files differ)

Modified: trunk/English.lproj/BookmarksWindow.nib/classes.nib
===================================================================
--- trunk/English.lproj/BookmarksWindow.nib/classes.nib 2007-09-13 22:25:15 UTC 
(rev 2922)
+++ trunk/English.lproj/BookmarksWindow.nib/classes.nib 2007-09-15 10:18:21 UTC 
(rev 2923)
@@ -1,15 +1,25 @@
 {
     IBClasses = (
-        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {"" = id; }; 
+            CLASS = FirstResponder; 
+            LANGUAGE = ObjC; 
+            SUPERCLASS = NSObject; 
+        }, 
         {CLASS = NSObject; LANGUAGE = ObjC; }, 
         {CLASS = SKBookmark; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
         {
-            ACTIONS = {insertBookmarkFolder = id; openBookmark = id; }; 
+            ACTIONS = {
+                doubleClickBookmark = id; 
+                insertBookmarkFolder = id; 
+                insertBookmarkSeparator = id; 
+            }; 
             CLASS = SKBookmarkController; 
             LANGUAGE = ObjC; 
-            OUTLETS = {outlineView = SKOutlineView; statusBar = SKStatusBar; 
}; 
+            OUTLETS = {outlineView = SKBookmarkOutlineView; statusBar = 
SKStatusBar; }; 
             SUPERCLASS = NSWindowController; 
         }, 
+        {CLASS = SKBookmarkOutlineView; LANGUAGE = ObjC; SUPERCLASS = 
SKOutlineView; }, 
         {
             ACTIONS = {
                 copy = id; 

Modified: trunk/English.lproj/BookmarksWindow.nib/keyedobjects.nib
===================================================================
(Binary files differ)

Modified: trunk/French.lproj/BookmarksWindow.nib/classes.nib
===================================================================
--- trunk/French.lproj/BookmarksWindow.nib/classes.nib  2007-09-13 22:25:15 UTC 
(rev 2922)
+++ trunk/French.lproj/BookmarksWindow.nib/classes.nib  2007-09-15 10:18:21 UTC 
(rev 2923)
@@ -1,15 +1,25 @@
 {
     IBClasses = (
-        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {"" = id; }; 
+            CLASS = FirstResponder; 
+            LANGUAGE = ObjC; 
+            SUPERCLASS = NSObject; 
+        }, 
         {CLASS = NSObject; LANGUAGE = ObjC; }, 
         {CLASS = SKBookmark; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
         {
-            ACTIONS = {insertBookmarkFolder = id; openBookmark = id; }; 
+            ACTIONS = {
+                doubleClickBookmark = id; 
+                insertBookmarkFolder = id; 
+                insertBookmarkSeparator = id; 
+            }; 
             CLASS = SKBookmarkController; 
             LANGUAGE = ObjC; 
-            OUTLETS = {outlineView = SKOutlineView; statusBar = SKStatusBar; 
}; 
+            OUTLETS = {outlineView = SKBookmarkOutlineView; statusBar = 
SKStatusBar; }; 
             SUPERCLASS = NSWindowController; 
         }, 
+        {CLASS = SKBookmarkOutlineView; LANGUAGE = ObjC; SUPERCLASS = 
SKOutlineView; }, 
         {
             ACTIONS = {
                 copy = id; 

Modified: trunk/French.lproj/BookmarksWindow.nib/keyedobjects.nib
===================================================================
(Binary files differ)

Modified: trunk/Italian.lproj/BookmarksWindow.nib/classes.nib
===================================================================
--- trunk/Italian.lproj/BookmarksWindow.nib/classes.nib 2007-09-13 22:25:15 UTC 
(rev 2922)
+++ trunk/Italian.lproj/BookmarksWindow.nib/classes.nib 2007-09-15 10:18:21 UTC 
(rev 2923)
@@ -1,15 +1,25 @@
 {
     IBClasses = (
-        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {"" = id; }; 
+            CLASS = FirstResponder; 
+            LANGUAGE = ObjC; 
+            SUPERCLASS = NSObject; 
+        }, 
         {CLASS = NSObject; LANGUAGE = ObjC; }, 
         {CLASS = SKBookmark; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
         {
-            ACTIONS = {insertBookmarkFolder = id; openBookmark = id; }; 
+            ACTIONS = {
+                doubleClickBookmark = id; 
+                insertBookmarkFolder = id; 
+                insertBookmarkSeparator = id; 
+            }; 
             CLASS = SKBookmarkController; 
             LANGUAGE = ObjC; 
-            OUTLETS = {outlineView = SKOutlineView; statusBar = SKStatusBar; 
}; 
+            OUTLETS = {outlineView = SKBookmarkOutlineView; statusBar = 
SKStatusBar; }; 
             SUPERCLASS = NSWindowController; 
         }, 
+        {CLASS = SKBookmarkOutlineView; LANGUAGE = ObjC; SUPERCLASS = 
SKOutlineView; }, 
         {
             ACTIONS = {
                 copy = id; 

Modified: trunk/Italian.lproj/BookmarksWindow.nib/keyedobjects.nib
===================================================================
(Binary files differ)

Modified: trunk/SKApplicationController.m
===================================================================
--- trunk/SKApplicationController.m     2007-09-13 22:25:15 UTC (rev 2922)
+++ trunk/SKApplicationController.m     2007-09-15 10:18:21 UTC (rev 2923)
@@ -249,6 +249,8 @@
             [item setImage:[bm icon]];
             [item setSubmenu:submenu];
             [self addMenuItemsForBookmarks:[bm children] toMenu:submenu];
+        } else if ([bm bookmarkType] == SKBookmarkTypeSeparator) {
+            [menu addItem:[NSMenuItem separatorItem]];
         } else {
             NSMenuItem *item = [menu addItemWithTitle:[bm label] 
action:@selector(openBookmark:)  keyEquivalent:@""];
             [item setTarget:self];

Modified: trunk/SKBookmarkController.h
===================================================================
--- trunk/SKBookmarkController.h        2007-09-13 22:25:15 UTC (rev 2922)
+++ trunk/SKBookmarkController.h        2007-09-15 10:18:21 UTC (rev 2923)
@@ -37,16 +37,18 @@
  */
 
 #import <Cocoa/Cocoa.h>
+#import "SKOutlineView.h"
 
[EMAIL PROTECTED] SKOutlineView, SKStatusBar;
[EMAIL PROTECTED] SKBookmarkOutlineView, SKStatusBar;
 
 enum {
     SKBookmarkTypeBookmark,
-    SKBookmarkTypeFolder
+    SKBookmarkTypeFolder,
+    SKBookmarkTypeSeparator
 };
 
 @interface SKBookmarkController : NSWindowController {
-    IBOutlet SKOutlineView *outlineView;
+    IBOutlet SKBookmarkOutlineView *outlineView;
     IBOutlet SKStatusBar *statusBar;
     NSMutableArray *bookmarks;
     NSMutableArray *recentDocuments;
@@ -72,6 +74,7 @@
 
 - (IBAction)doubleClickBookmark:(id)sender;
 - (IBAction)insertBookmarkFolder:(id)sender;
+- (IBAction)insertBookmarkSeparator:(id)sender;
 
 - (NSArray *)recentDocuments;
 - (void)addRecentDocumentForPath:(NSString *)path 
pageIndex:(unsigned)pageIndex snapshots:(NSArray *)setups;
@@ -97,6 +100,7 @@
 - (id)initWithPath:(NSString *)aPath pageIndex:(unsigned)aPageIndex 
label:(NSString *)aLabel;
 - (id)initFolderWithChildren:(NSArray *)aChildren label:(NSString *)aLabel;
 - (id)initFolderWithLabel:(NSString *)aLabel;
+- (id)initSeparator;
 - (id)initWithDictionary:(NSDictionary *)dictionary;
 
 - (NSDictionary *)dictionaryValue;
@@ -123,3 +127,12 @@
 - (BOOL)isDescendantOfArray:(NSArray *)bookmarks;
 
 @end
+
+
[EMAIL PROTECTED] SKBookmarkOutlineView : SKOutlineView
[EMAIL PROTECTED]
+
+
[EMAIL PROTECTED] NSObject (SKBookmarkOutlineViewDelegate)
+- (BOOL)outlineView:(NSOutlineView *)anOutlineView 
drawSeparatorRowForItem:(id)item;
[EMAIL PROTECTED]

Modified: trunk/SKBookmarkController.m
===================================================================
--- trunk/SKBookmarkController.m        2007-09-13 22:25:15 UTC (rev 2922)
+++ trunk/SKBookmarkController.m        2007-09-15 10:18:21 UTC (rev 2923)
@@ -376,6 +376,28 @@
     [outlineView editColumn:0 row:row withEvent:nil select:YES];
 }
 
+- (IBAction)insertBookmarkSeparator:(id)sender {
+    SKBookmark *separator = [[[SKBookmark alloc] initSeparator] autorelease];
+    int rowIndex = [[outlineView selectedRowIndexes] lastIndex];
+    SKBookmark *item = nil;
+    unsigned int index = [bookmarks count];
+    
+    if (rowIndex != NSNotFound) {
+        SKBookmark *selectedItem = [outlineView itemAtRow:rowIndex];
+        if ([outlineView isItemExpanded:selectedItem]) {
+            item = selectedItem;
+            index = [[item children] count];
+        } else {
+            item = [selectedItem parent];
+            index = [self indexOfChildBookmark:selectedItem] + 1;
+        }
+    }
+    [self bookmark:item insertChildBookmark:separator atIndex:index];
+    
+    int row = [outlineView rowForItem:separator];
+    [outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:row] 
byExtendingSelection:NO];
+}
+
 #pragma mark Undo support
 
 - (NSUndoManager *)undoManager {
@@ -417,6 +439,8 @@
 - (void)outlineView:(NSOutlineView *)ov setObjectValue:(id)object 
forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
     NSString *tcID = [tableColumn identifier];
     if ([tcID isEqualToString:@"label"]) {
+        if (object == nil)
+            object = @"";
         if ([object isEqualToString:[item label]] == NO)
             [item setLabel:object];
     }
@@ -475,6 +499,10 @@
 
 #pragma mark NSOutlineView delegate methods
 
+- (BOOL)outlineView:(NSOutlineView *)ov shouldEditTableColumn:(NSTableColumn 
*)tableColumn item:(id)item {
+    return [[tableColumn identifier] isEqualToString:@"label"] && [item 
bookmarkType] != SKBookmarkTypeSeparator;
+}
+
 - (NSString *)outlineView:(NSOutlineView *)ov toolTipForCell:(NSCell *)cell 
rect:(NSRectPointer)rect tableColumn:(NSTableColumn *)tc item:(id)item 
mouseLocation:(NSPoint)mouseLocation {
     NSString *tcID = [tc identifier];
     
@@ -499,6 +527,10 @@
     return [items count] > 0;
 }
 
+- (BOOL)outlineView:(NSOutlineView *)ov drawSeparatorRowForItem:(id)item {
+    return [item bookmarkType] == SKBookmarkTypeSeparator;
+}
+
 #pragma mark SKTypeSelectHelper datasource protocol
 
 - (NSArray *)typeSelectHelperSelectionItems:(SKTypeSelectHelper 
*)typeSelectHelper {
@@ -593,6 +625,18 @@
     return [self initFolderWithChildren:[NSArray array] label:aLabel];
 }
 
+- (id)initSeparator {
+    if (self = [super init]) {
+        bookmarkType = SKBookmarkTypeSeparator;
+        path = nil;
+        aliasData = nil;
+        pageIndex = NSNotFound;
+        label = nil;
+        children = nil;
+    }
+    return self;
+}
+
 - (id)initWithDictionary:(NSDictionary *)dictionary {
     if ([[dictionary objectForKey:@"type"] isEqualToString:@"folder"]) {
         NSEnumerator *dictEnum = [[dictionary objectForKey:@"children"] 
objectEnumerator];
@@ -601,6 +645,8 @@
         while (dict = [dictEnum nextObject])
             [newChildren addObject:[[[[self class] alloc] 
initWithDictionary:dict] autorelease]];
         return [self initFolderWithChildren:newChildren label:[dictionary 
objectForKey:@"label"]];
+    } else if ([[dictionary objectForKey:@"type"] 
isEqualToString:@"separator"]) {
+        return [self initSeparator];
     } else {
         return [self initWithPath:[dictionary objectForKey:@"path"] 
aliasData:[dictionary objectForKey:@"_BDAlias"] pageIndex:[[dictionary 
objectForKey:@"pageIndex"] unsignedIntValue] label:[dictionary 
objectForKey:@"label"]];
     }
@@ -609,6 +655,8 @@
 - (id)copyWithZone:(NSZone *)aZone {
     if (bookmarkType == SKBookmarkTypeFolder)
         return [[[self class] allocWithZone:aZone] 
initFolderWithChildren:[[[NSArray alloc] initWithArray:children copyItems:YES] 
autorelease] label:label];
+    else if (bookmarkType == SKBookmarkTypeSeparator)
+        return [[[self class] allocWithZone:aZone] initSeparator];
     else
         return [[[self class] allocWithZone:aZone] initWithPath:path 
aliasData:aliasData pageIndex:pageIndex label:label];
 }
@@ -625,6 +673,8 @@
 - (NSString *)description {
     if (bookmarkType == SKBookmarkTypeFolder)
         return [NSString stringWithFormat:@"<%@: label=%@, children=%@>", 
[self class], label, children];
+    else if (bookmarkType == SKBookmarkTypeSeparator)
+        return [NSString stringWithFormat:@"<%@: separator>", [self class]];
     else
         return [NSString stringWithFormat:@"<%@: label=%@, path=%@, page=%i>", 
[self class], label, path, pageIndex];
 }
@@ -632,6 +682,8 @@
 - (NSDictionary *)dictionaryValue {
     if (bookmarkType == SKBookmarkTypeFolder)
         return [NSDictionary dictionaryWithObjectsAndKeys:@"folder", @"type", 
[children valueForKey:@"dictionaryValue"], @"children", label, @"label", nil];
+    else if (bookmarkType == SKBookmarkTypeSeparator)
+        return [NSDictionary dictionaryWithObjectsAndKeys:@"separator", 
@"type", nil];
     else
         return [NSDictionary dictionaryWithObjectsAndKeys:@"bookmark", 
@"type", path, @"path", aliasData, @"_BDAlias", [NSNumber 
numberWithUnsignedInt:pageIndex], @"pageIndex", label, @"label", nil];
 }
@@ -658,6 +710,8 @@
 - (NSImage *)icon {
     if ([self bookmarkType] == SKBookmarkTypeFolder)
         return [NSImage imageNamed:@"SmallFolder"];
+    else if (bookmarkType == SKBookmarkTypeSeparator)
+        return nil;
     else
         return [[self class] smallImageForFile:[self resolvedPath]];
 }
@@ -739,3 +793,24 @@
 }
 
 @end
+
+#pragma mark -
+
[EMAIL PROTECTED] SKBookmarkOutlineView
+
+#define SEPARATOR_LEFT_INDENT 8.0
+#define SEPARATOR_RIGHT_INDENT 2.0
+
+- (void)drawRow:(int)rowIndex clipRect:(NSRect)clipRect {
+    if ([[self delegate] 
respondsToSelector:@selector(outlineView:drawSeparatorRowForItem:)] &&
+        [[self delegate] outlineView:self drawSeparatorRowForItem:[self 
itemAtRow:rowIndex]]) {
+        float indent = [self levelForItem:[self itemAtRow:rowIndex]] * [self 
indentationPerLevel];
+        NSRect rect = [self rectOfRow:rowIndex];
+        [[NSColor gridColor] setStroke];
+        [NSBezierPath strokeLineFromPoint:NSMakePoint(NSMinX(rect) + indent + 
SEPARATOR_LEFT_INDENT, floorf(NSMidY(rect)) + 0.5) 
toPoint:NSMakePoint(NSMaxX(rect) - SEPARATOR_RIGHT_INDENT, floorf(NSMidY(rect)) 
+ 0.5)];
+    } else {
+        [super drawRow:rowIndex clipRect:clipRect];
+    }
+}
+
[EMAIL PROTECTED]


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: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to