comparison mac/dw.m @ 680:db315779a283

Initial tree support, lots more to do but basics are there.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 02 Mar 2011 05:53:27 +0000
parents d2d7d1802af4
children 5fe12469c1fb
comparison
equal deleted inserted replaced
679:d2d7d1802af4 680:db315779a283
766 return nil; 766 return nil;
767 } 767 }
768 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } 768 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
769 @end 769 @end
770 770
771 /* Subclass for a Tree type */
772 @interface DWTree : NSOutlineView <NSOutlineViewDataSource>
773 {
774 void *userdata;
775 NSTableColumn *imagecol;
776 NSTableColumn *textcol;
777 NSMutableArray *data;
778 /* Each data item consists of a linked lists of tree item data.
779 * NSImage *, NSString *, Item Data *, NSMutableArray * of Children
780 */
781 id scrollview;
782 }
783 -(id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item;
784 -(BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item;
785 -(int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item;
786 -(id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item;
787 -(void)addTree:(NSPointerArray *)item and:(NSPointerArray *)parent;
788 -(void *)userdata;
789 -(void)setUserdata:(void *)input;
790 -(NSScrollView *)scrollview;
791 -(void)setScrollview:(NSScrollView *)input;
792 @end
793
794 @implementation DWTree
795 -(id)init
796 {
797 self = [super init];
798
799 if (self)
800 {
801 imagecol = [[NSTableColumn alloc] init];
802 NSImageCell *imagecell = [[[NSImageCell alloc] init] autorelease];
803 [imagecol setDataCell:imagecell];
804 [imagecol setResizingMask:NSTableColumnNoResizing];
805 [imagecol setWidth:20];
806 [self addTableColumn:imagecol];
807 textcol = [[NSTableColumn alloc] init];
808 [self addTableColumn:textcol];
809 }
810 return self;
811 }
812 -(id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item
813 {
814 if (item)
815 {
816 NSMutableArray *array = [item pointerAtIndex:3];
817 return array ? [array objectAtIndex:index] : nil;
818 }
819 else
820 {
821 return [data objectAtIndex:index];
822 }
823 }
824 -(BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
825 {
826 return [self outlineView:outlineView numberOfChildrenOfItem:item] != 0;
827 }
828 -(int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
829 {
830 if(item)
831 {
832 if([item isKindOfClass:[NSPointerArray class]])
833 {
834 NSMutableArray *array = [item pointerAtIndex:3];
835 return array ? (int)[array count] : 0;
836 }
837 else
838 {
839 return 0;
840 }
841 }
842 else
843 {
844 return data ? (int)[data count] : 0;
845 }
846 }
847 -(id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
848 {
849 if(item)
850 {
851 if([item isKindOfClass:[NSPointerArray class]])
852 {
853 NSPointerArray *this = (NSPointerArray *)item;
854 if(tableColumn == imagecol)
855 {
856 return [this pointerAtIndex:0];
857 }
858 return [this pointerAtIndex:1];
859 }
860 else
861 {
862 return nil;
863 }
864 }
865 return @"List Root";
866 }
867 -(void)addTree:(NSPointerArray *)item and:(NSPointerArray *)parent;
868 {
869 NSMutableArray *children = data;
870 if(parent)
871 {
872 children = [parent pointerAtIndex:3];
873 if(!children)
874 {
875 children = [[NSMutableArray alloc] init];
876 [parent replacePointerAtIndex:3 withPointer:children];
877 }
878 }
879 else
880 {
881 if(!data)
882 {
883 data = [[NSMutableArray alloc] init];
884 }
885 }
886 [children addObject:item];
887 }
888 -(void *)userdata { return userdata; }
889 -(void)setUserdata:(void *)input { userdata = input; }
890 -(NSScrollView *)scrollview { return scrollview; }
891 -(void)setScrollview:(NSScrollView *)input { scrollview = input; }
892 @end
893
771 /* Subclass for a Calendar type */ 894 /* Subclass for a Calendar type */
772 @interface DWCalendar : NSDatePicker 895 @interface DWCalendar : NSDatePicker
773 { 896 {
774 void *userdata; 897 void *userdata;
775 } 898 }
3225 * id: An ID to be used for getting the resource from the 3348 * id: An ID to be used for getting the resource from the
3226 * resource file. 3349 * resource file.
3227 */ 3350 */
3228 HWND API dw_tree_new(ULONG id) 3351 HWND API dw_tree_new(ULONG id)
3229 { 3352 {
3230 NSLog(@"dw_tree_new() unimplemented\n"); 3353 NSScrollView *scrollview = [[NSScrollView alloc] init];
3231 return HWND_DESKTOP; 3354 DWTree *tree = [[DWTree alloc] init];
3355
3356 [tree setScrollview:scrollview];
3357 [scrollview setBorderType:NSBezelBorder];
3358 [scrollview setHasVerticalScroller:YES];
3359 [scrollview setAutohidesScrollers:YES];
3360
3361 [tree setAllowsMultipleSelection:NO];
3362 [tree setDataSource:tree];
3363 [scrollview setDocumentView:tree];
3364 [tree setHeaderView:nil];
3365 return tree;
3232 } 3366 }
3233 3367
3234 /* 3368 /*
3235 * Inserts an item into a tree window (widget) after another item. 3369 * Inserts an item into a tree window (widget) after another item.
3236 * Parameters: 3370 * Parameters:
3241 * parent: Parent handle or 0 if root. 3375 * parent: Parent handle or 0 if root.
3242 * itemdata: Item specific data. 3376 * itemdata: Item specific data.
3243 */ 3377 */
3244 HTREEITEM API dw_tree_insert_after(HWND handle, HTREEITEM item, char *title, HICN icon, HTREEITEM parent, void *itemdata) 3378 HTREEITEM API dw_tree_insert_after(HWND handle, HTREEITEM item, char *title, HICN icon, HTREEITEM parent, void *itemdata)
3245 { 3379 {
3246 NSLog(@"dw_tree_insert_item_after() unimplemented\n"); 3380 DWTree *tree = handle;
3247 return HWND_DESKTOP; 3381 NSString *nstr = [NSString stringWithUTF8String:title];
3382 NSPointerArray *treenode = [NSPointerArray pointerArrayWithWeakObjects];
3383 [treenode addPointer:icon];
3384 [treenode addPointer:nstr];
3385 [treenode addPointer:itemdata];
3386 [treenode addPointer:NULL];
3387 [tree addTree:treenode and:parent];
3388 [tree reloadData];
3389 return treenode;
3248 } 3390 }
3249 3391
3250 /* 3392 /*
3251 * Inserts an item into a tree window (widget). 3393 * Inserts an item into a tree window (widget).
3252 * Parameters: 3394 * Parameters:
3256 * parent: Parent handle or 0 if root. 3398 * parent: Parent handle or 0 if root.
3257 * itemdata: Item specific data. 3399 * itemdata: Item specific data.
3258 */ 3400 */
3259 HTREEITEM API dw_tree_insert(HWND handle, char *title, HICN icon, HTREEITEM parent, void *itemdata) 3401 HTREEITEM API dw_tree_insert(HWND handle, char *title, HICN icon, HTREEITEM parent, void *itemdata)
3260 { 3402 {
3261 NSLog(@"dw_tree_insert_item() unimplemented\n"); 3403 return dw_tree_insert_after(handle, NULL, title, icon, parent, itemdata);
3262 return HWND_DESKTOP;
3263 } 3404 }
3264 3405
3265 /* 3406 /*
3266 * Gets the text an item in a tree window (widget). 3407 * Gets the text an item in a tree window (widget).
3267 * Parameters: 3408 * Parameters:
3268 * handle: Handle to the tree containing the item. 3409 * handle: Handle to the tree containing the item.
3269 * item: Handle of the item to be modified. 3410 * item: Handle of the item to be modified.
3270 */ 3411 */
3271 char * API dw_tree_get_title(HWND handle, HTREEITEM item) 3412 char * API dw_tree_get_title(HWND handle, HTREEITEM item)
3272 { 3413 {
3273 NSLog(@"dw_tree_get_title() unimplemented\n"); 3414 NSPointerArray *array = (NSPointerArray *)item;
3274 return NULL; 3415 NSString *nstr = (NSString *)[array pointerAtIndex:1];
3416 return strdup([nstr UTF8String]);
3275 } 3417 }
3276 3418
3277 /* 3419 /*
3278 * Gets the text an item in a tree window (widget). 3420 * Gets the text an item in a tree window (widget).
3279 * Parameters: 3421 * Parameters: