# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1299086973 0 # Node ID de4aa126fb2f5877a4912f4c8f7a1dbbdac4619e # Parent 5fe12469c1fbc45e53a075070b3b01e91a98d9e7 Fixes for tree packing and a data source issue. Implemented most of the missing tree functions. diff -r 5fe12469c1fb -r de4aa126fb2f mac/dw.m --- 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 { @@ -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]; } /*