changeset 682:de4aa126fb2f

Fixes for tree packing and a data source issue. Implemented most of the missing tree functions.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 02 Mar 2011 17:29:33 +0000
parents 5fe12469c1fb
children 7385011c3327
files mac/dw.m
diffstat 1 files changed, 93 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/mac/dw.m	Wed Mar 02 13:43:04 2011 +0000
+++ b/mac/dw.m	Wed Mar 02 17:29:33 2011 +0000
@@ -768,6 +768,42 @@
 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
 @end
 
+/* Dive into the tree showing all nodes */
+void _free_tree_recurse(NSMutableArray *node, NSPointerArray *item)
+{
+    if(node)
+    {
+        int count = (int)[node count];
+        int z;
+        
+        for(z=0;z<count;z++)
+        {
+            NSPointerArray *pnt = [node objectAtIndex:z];
+            NSMutableArray *children = (NSMutableArray *)[pnt pointerAtIndex:3];
+            
+            if(children)
+            {
+                if(item == pnt)
+                {
+                    _free_tree_recurse(children, NULL);
+                }
+                else
+                {
+                    _free_tree_recurse(children, item);
+                }
+            }
+            if(!item || item == pnt)
+            {
+                [pnt release];
+            }
+        }
+    }
+    if(!item)
+    {
+        [node release];
+    }
+}
+
 /* Subclass for a Tree type */
 @interface DWTree : NSOutlineView <NSOutlineViewDataSource>
 {
@@ -789,6 +825,8 @@
 -(void)setUserdata:(void *)input;
 -(NSScrollView *)scrollview;
 -(void)setScrollview:(NSScrollView *)input;
+-(void)deleteNode:(NSPointerArray *)item;
+-(void)clear;
 @end
 
 @implementation DWTree
@@ -806,12 +844,13 @@
         [self addTableColumn:imagecol];
         textcol = [[NSTableColumn alloc] init];
         [self addTableColumn:textcol];
+        [self setOutlineTableColumn:textcol];
     }
     return self;
 }
 -(id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item
 {
-	if (item) 
+	if(item) 
     {
         NSMutableArray *array = [item pointerAtIndex:3];
 		return array ? [array objectAtIndex:index] : nil;
@@ -880,7 +919,7 @@
     {
         if(!data)
         {
-            data = [[NSMutableArray alloc] init];
+            children = data = [[NSMutableArray alloc] init];
         }
     }
     [children addObject:item];
@@ -889,6 +928,17 @@
 -(void)setUserdata:(void *)input { userdata = input; }
 -(NSScrollView *)scrollview { return scrollview; }
 -(void)setScrollview:(NSScrollView *)input { scrollview = input; }
+-(void)deleteNode:(NSPointerArray *)item { _free_tree_recurse(data, item); }
+-(void)clear { NSMutableArray *toclear = data; data = nil; _free_tree_recurse(toclear, NULL); [self reloadData]; }
+-(void)dealloc 
+{ 
+    UserData *root = userdata; 
+    _remove_userdata(&root, NULL, TRUE); 
+    _free_tree_recurse(data, NULL); 
+    [imagecol release];
+    [textcol release];
+    [super dealloc]; 
+}
 @end
 
 /* Subclass for a Calendar type */
@@ -1926,6 +1976,11 @@
 		DWContainer *cont = item;
 		this = item = [cont scrollview];
 	}
+	else if([ object isKindOfClass:[ DWTree class ] ])
+	{
+		DWTree *tree = item;
+		this = item = [tree scrollview];
+	}
     
 	/* Duplicate the existing data */
     tmpitem = malloc(sizeof(Item)*(thisbox->count+1));
@@ -2011,6 +2066,11 @@
 		DWContainer *cont = item;
 		this = item = [cont scrollview];
 	}
+	else if([ object isKindOfClass:[ DWTree class ] ])
+	{
+		DWTree *tree = item;
+		this = item = [tree scrollview];
+	}
 
 	/* Duplicate the existing data */
     tmpitem = malloc(sizeof(Item)*(thisbox->count+1));
@@ -3438,7 +3498,18 @@
  */
 void API dw_tree_item_change(HWND handle, HTREEITEM item, char *title, HICN icon)
 {
-	NSLog(@"dw_tree_item_change() unimplemented\n");
+    DWTree *tree = handle;
+    NSPointerArray *array = (NSPointerArray *)item;
+    if(title)
+    {
+        NSString *nstr = [NSString stringWithUTF8String:title];
+        [array replacePointerAtIndex:1 withPointer:nstr];
+    }
+    if(icon)
+    {
+        [array replacePointerAtIndex:0 withPointer:icon];
+    }
+    [tree reloadData];
 }
 
 /*
@@ -3450,7 +3521,8 @@
  */
 void API dw_tree_item_set_data(HWND handle, HTREEITEM item, void *itemdata)
 {
-	NSLog(@"dw_tree_item_set_data() unimplemented\n");
+    NSPointerArray *array = (NSPointerArray *)item;
+    [array replacePointerAtIndex:2 withPointer:itemdata];
 }
 
 /*
@@ -3461,8 +3533,8 @@
  */
 void * API dw_tree_item_get_data(HWND handle, HTREEITEM item)
 {
-	NSLog(@"dw_tree_item_get_data() unimplemented\n");
-	return NULL;
+    NSPointerArray *array = (NSPointerArray *)item;
+    return [array pointerAtIndex:2];
 }
 
 /*
@@ -3473,7 +3545,12 @@
  */
 void API dw_tree_item_select(HWND handle, HTREEITEM item)
 {
-	NSLog(@"dw_tree_item_select() unimplemented\n");
+    DWTree *tree = handle;
+    NSInteger itemIndex = [tree rowForItem:item];
+    if(itemIndex > -1)
+    {
+        [tree selectRowIndexes:[NSIndexSet indexSetWithIndex:itemIndex] byExtendingSelection:NO];
+    }
 }
 
 /*
@@ -3483,7 +3560,8 @@
  */
 void API dw_tree_clear(HWND handle)
 {
-	NSLog(@"dw_tree_clear() unimplemented\n");
+    DWTree *tree = handle;
+    [tree clear];
 }
 
 /*
@@ -3494,7 +3572,8 @@
  */
 void API dw_tree_item_expand(HWND handle, HTREEITEM item)
 {
-	NSLog(@"dw_tree_item_expand() unimplemented\n");
+    DWTree *tree = handle;
+    [tree expandItem:item];
 }
 
 /*
@@ -3505,7 +3584,8 @@
  */
 void API dw_tree_item_collapse(HWND handle, HTREEITEM item)
 {
-	NSLog(@"dw_tree_item_collapse() unimplemented\n");
+    DWTree *tree = handle;
+    [tree collapseItem:item];
 }
 
 /*
@@ -3516,7 +3596,9 @@
  */
 void API dw_tree_item_delete(HWND handle, HTREEITEM item)
 {
-	NSLog(@"dw_tree_item_delete() unimplemented\n");
+    DWTree *tree = handle;
+    [tree deleteNode:item];
+    [tree reloadData];
 }
 
 /*