changeset 882:1e7b7f870d88

Experimental change to use a single column for holding the filename and icon on Mac. This improves the appearance of filesystem containers and the tree view with icons.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 07 Apr 2011 03:34:42 +0000
parents 7b2750744552
children 63a8e77191c7
files mac/dw.m
diffstat 1 files changed, 73 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/mac/dw.m	Wed Apr 06 22:51:30 2011 +0000
+++ b/mac/dw.m	Thu Apr 07 03:34:42 2011 +0000
@@ -1102,6 +1102,7 @@
 -(NSTableColumn *)getColumn:(int)col;
 -(int)addRow:(NSArray *)input;
 -(int)addRows:(int)number;
+-(void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row;
 -(void)editCell:(id)input at:(int)row and:(int)col;
 -(void)removeRow:(int)row;
 -(void)setRow:(int)row title:(void *)input;
@@ -1217,6 +1218,16 @@
     }
     return 0;
 }
+-(void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
+{
+    if([cell isMemberOfClass:[NSBrowserCell class]])
+    {
+        int index = (int)(row * [tvcols count]);
+        NSBrowserCell *browsercell = [data objectAtIndex:index];
+        NSImage *img = [browsercell image];
+        [(NSBrowserCell*)cell setImage:img];
+    }
+}
 -(void)editCell:(id)input at:(int)row and:(int)col
 {
     if(tvcols && input)
@@ -1352,10 +1363,6 @@
 {
     NSUInteger index = [tvcols indexOfObject:tableColumn];
     
-    if(filesystem && index > 0)
-    {
-        index--;
-    }
     /* Handler for column click class */
     _event_handler(self, (NSEvent *)index, 17);
 }
@@ -1416,8 +1423,7 @@
 #endif
 {
     void *userdata;
-    NSTableColumn *imagecol;
-    NSTableColumn *textcol;
+    NSTableColumn *treecol;
     NSMutableArray *data;
     /* Each data item consists of a linked lists of tree item data.
      * NSImage *, NSString *, Item Data *, NSMutableArray * of Children
@@ -1429,6 +1435,7 @@
 -(BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item;
 -(int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item;
 -(id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item;
+-(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item;
 -(BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item;
 -(void)addTree:(NSPointerArray *)item and:(NSPointerArray *)parent;
 -(void *)userdata;
@@ -1449,16 +1456,12 @@
 
     if (self)
     {
-        imagecol = [[NSTableColumn alloc] init];
-        NSImageCell *imagecell = [[[NSImageCell alloc] init] autorelease];
-        [imagecol setDataCell:imagecell];
-        [imagecol setResizingMask:NSTableColumnNoResizing];
-        [imagecol setWidth:20];
-        [self addTableColumn:imagecol];
-        textcol = [[NSTableColumn alloc] init];
-        [textcol setEditable:NO];
-        [self addTableColumn:textcol];
-        [self setOutlineTableColumn:textcol];
+        treecol = [[NSTableColumn alloc] init];
+        NSBrowserCell *browsercell = [[[NSBrowserCell alloc] init] autorelease];
+        [browsercell setLeaf:YES];
+        [treecol setDataCell:browsercell];
+        [self addTableColumn:treecol];
+        [self setOutlineTableColumn:treecol];
         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(treeSelectionChanged:) name:NSOutlineViewSelectionDidChangeNotification object:self];
         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(treeItemExpanded:) name:NSOutlineViewItemDidExpandNotification object:self];
     }
@@ -1506,10 +1509,6 @@
         if([item isKindOfClass:[NSPointerArray class]])
         {
             NSPointerArray *this = (NSPointerArray *)item;
-            if(tableColumn == imagecol)
-            {
-                return [this pointerAtIndex:0];
-            }
             return [this pointerAtIndex:1];
         }
         else
@@ -1519,6 +1518,15 @@
     }
     return @"List Root";
 }
+-(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
+{
+    if([cell isMemberOfClass:[NSBrowserCell class]])
+    {
+        NSPointerArray *this = (NSPointerArray *)item;
+        NSImage *img = [this pointerAtIndex:0];
+        [(NSBrowserCell*)cell setImage:img];
+    }
+}
 -(BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item { return NO; }
 -(void)addTree:(NSPointerArray *)item and:(NSPointerArray *)parent;
 {
@@ -1577,7 +1585,7 @@
 -(void)deleteNode:(NSPointerArray *)item { _free_tree_recurse(data, item); }
 -(void)setForegroundColor:(NSColor *)input 
 { 
-    NSTextFieldCell *cell = [textcol dataCell];
+    NSTextFieldCell *cell = [treecol dataCell];
     fgcolor = input; 
     [fgcolor retain]; 
     [cell setTextColor:fgcolor];
@@ -1588,8 +1596,7 @@
     UserData *root = userdata;
     _remove_userdata(&root, NULL, TRUE);
     _free_tree_recurse(data, NULL);
-    [imagecol release];
-    [textcol release];
+    [treecol release];
     [super dealloc];
 }
 @end
@@ -4540,6 +4547,7 @@
 
     [tree setAllowsMultipleSelection:NO];
     [tree setDataSource:tree];
+    [tree setDelegate:tree];
     [scrollview setDocumentView:tree];
     [tree setHeaderView:nil];
     [tree setTag:cid];
@@ -4811,14 +4819,17 @@
         {
             NSImageCell *imagecell = [[NSImageCell alloc] init];
             [column setDataCell:imagecell];
-            if(z == 0 && titles[z] && strcmp(titles[z], "Icon") == 0)
-            {
-                [column setResizingMask:NSTableColumnNoResizing];
-                [column setWidth:20];
-            }
             [imagecell release];
         }
-        else if(flags[z] & DW_CFA_RIGHT)
+        else if(flags[z] & DW_CFA_STRINGANDICON)
+        {
+            NSBrowserCell *browsercell = [[NSBrowserCell alloc] init];
+            [browsercell setLeaf:YES];
+            [column setDataCell:browsercell];
+            [browsercell release];
+        }
+        /* Defaults to left justified so just handle right and center */
+        if(flags[z] & DW_CFA_RIGHT)
         {
             [(NSCell *)[column dataCell] setAlignment:NSRightTextAlignment]; 
             [(NSCell *)[column headerCell] setAlignment:NSRightTextAlignment]; 
@@ -4847,20 +4858,18 @@
  */
 int API dw_filesystem_setup(HWND handle, unsigned long *flags, char **titles, int count)
 {
-    char **newtitles = malloc(sizeof(char *) * (count + 2));
-    unsigned long *newflags = malloc(sizeof(unsigned long) * (count + 2));
+    char **newtitles = malloc(sizeof(char *) * (count + 1));
+    unsigned long *newflags = malloc(sizeof(unsigned long) * (count + 1));
     DWContainer *cont = handle;
 
-    newtitles[0] = "Icon";
-    newtitles[1] = "Filename";
-
-    newflags[0] = DW_CFA_BITMAPORICON | DW_CFA_LEFT | DW_CFA_HORZSEPARATOR;
-    newflags[1] = DW_CFA_STRING | DW_CFA_LEFT | DW_CFA_HORZSEPARATOR;
-
-    memcpy(&newtitles[2], titles, sizeof(char *) * count);
-    memcpy(&newflags[2], flags, sizeof(unsigned long) * count);
-
-    dw_container_setup(handle, newflags, newtitles, count + 2, 0);
+    newtitles[0] = "Filename";
+
+    newflags[0] = DW_CFA_STRINGANDICON | DW_CFA_LEFT | DW_CFA_HORZSEPARATOR;
+
+    memcpy(&newtitles[1], titles, sizeof(char *) * count);
+    memcpy(&newflags[1], flags, sizeof(unsigned long) * count);
+
+    dw_container_setup(handle, newflags, newtitles, count + 1, 0);
     [cont setFilesystem:YES];
 
     free(newtitles);
@@ -4992,7 +5001,7 @@
  */
 void API dw_filesystem_change_item(HWND handle, int column, int row, void *data)
 {
-    dw_container_change_item(handle, column+2, row, data);
+    dw_container_change_item(handle, column+1, row, data);
 }
 
 /*
@@ -5006,8 +5015,7 @@
  */
 void API dw_filesystem_change_file(HWND handle, int row, char *filename, HICN icon)
 {
-    dw_container_change_item(handle, 0, row, &icon);
-    dw_container_change_item(handle, 1, row, &filename);
+    dw_filesystem_set_file(handle, NULL, row, filename, icon);
 }
 
 /*
@@ -5021,8 +5029,25 @@
  */
 void API dw_filesystem_set_file(HWND handle, void *pointer, int row, char *filename, HICN icon)
 {
-    dw_container_set_item(handle, pointer, 0, row, &icon);
-    dw_container_set_item(handle, pointer, 1, row, &filename);
+    int _locked_by_me = FALSE;
+    DW_MUTEX_LOCK;
+    DWContainer *cont = handle;
+    NSBrowserCell *browsercell;
+    int lastadd = 0;
+    
+    /* If pointer is NULL we are getting a change request instead of set */
+    if(pointer)
+    {
+        lastadd = [cont lastAddPoint];
+    }
+    
+    browsercell = [[NSBrowserCell alloc] init];
+    [browsercell setLeaf:YES];
+    [browsercell setImage:icon];
+    [browsercell setStringValue:[ NSString stringWithUTF8String:filename ]];
+    [cont editCell:browsercell at:(row+lastadd) and:0];
+    [cont setNeedsDisplay:YES];
+    DW_MUTEX_UNLOCK;
 }
 
 /*
@@ -5036,7 +5061,7 @@
  */
 void API dw_filesystem_set_item(HWND handle, void *pointer, int column, int row, void *data)
 {
-    dw_container_set_item(handle, pointer, column+2, row, data);
+    dw_container_set_item(handle, pointer, column+1, row, data);
 }
 
 /*
@@ -5076,7 +5101,7 @@
  */
 int API dw_filesystem_get_column_type(HWND handle, int column)
 {
-    return dw_container_get_column_type(handle, column+2);
+    return dw_container_get_column_type(handle, column+1);
 }
 
 /*