comparison mac/dw.m @ 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 d94a4fa0359e
comparison
equal deleted inserted replaced
881:7b2750744552 882:1e7b7f870d88
1100 -(void)setScrollview:(id)input; 1100 -(void)setScrollview:(id)input;
1101 -(void)addColumn:(NSTableColumn *)input andType:(int)type; 1101 -(void)addColumn:(NSTableColumn *)input andType:(int)type;
1102 -(NSTableColumn *)getColumn:(int)col; 1102 -(NSTableColumn *)getColumn:(int)col;
1103 -(int)addRow:(NSArray *)input; 1103 -(int)addRow:(NSArray *)input;
1104 -(int)addRows:(int)number; 1104 -(int)addRows:(int)number;
1105 -(void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row;
1105 -(void)editCell:(id)input at:(int)row and:(int)col; 1106 -(void)editCell:(id)input at:(int)row and:(int)col;
1106 -(void)removeRow:(int)row; 1107 -(void)removeRow:(int)row;
1107 -(void)setRow:(int)row title:(void *)input; 1108 -(void)setRow:(int)row title:(void *)input;
1108 -(void *)getRowTitle:(int)row; 1109 -(void *)getRowTitle:(int)row;
1109 -(id)getRow:(int)row and:(int)col; 1110 -(id)getRow:(int)row and:(int)col;
1214 [titles addPointer:NULL]; 1215 [titles addPointer:NULL];
1215 } 1216 }
1216 return (int)[titles count]; 1217 return (int)[titles count];
1217 } 1218 }
1218 return 0; 1219 return 0;
1220 }
1221 -(void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
1222 {
1223 if([cell isMemberOfClass:[NSBrowserCell class]])
1224 {
1225 int index = (int)(row * [tvcols count]);
1226 NSBrowserCell *browsercell = [data objectAtIndex:index];
1227 NSImage *img = [browsercell image];
1228 [(NSBrowserCell*)cell setImage:img];
1229 }
1219 } 1230 }
1220 -(void)editCell:(id)input at:(int)row and:(int)col 1231 -(void)editCell:(id)input at:(int)row and:(int)col
1221 { 1232 {
1222 if(tvcols && input) 1233 if(tvcols && input)
1223 { 1234 {
1350 1361
1351 -(void)tableView:(NSTableView *)tableView didClickTableColumn:(NSTableColumn *)tableColumn 1362 -(void)tableView:(NSTableView *)tableView didClickTableColumn:(NSTableColumn *)tableColumn
1352 { 1363 {
1353 NSUInteger index = [tvcols indexOfObject:tableColumn]; 1364 NSUInteger index = [tvcols indexOfObject:tableColumn];
1354 1365
1355 if(filesystem && index > 0)
1356 {
1357 index--;
1358 }
1359 /* Handler for column click class */ 1366 /* Handler for column click class */
1360 _event_handler(self, (NSEvent *)index, 17); 1367 _event_handler(self, (NSEvent *)index, 17);
1361 } 1368 }
1362 -(void)selectionChanged:(id)sender 1369 -(void)selectionChanged:(id)sender
1363 { 1370 {
1414 #ifdef BUILDING_FOR_SNOW_LEOPARD 1421 #ifdef BUILDING_FOR_SNOW_LEOPARD
1415 <NSOutlineViewDataSource,NSOutlineViewDelegate> 1422 <NSOutlineViewDataSource,NSOutlineViewDelegate>
1416 #endif 1423 #endif
1417 { 1424 {
1418 void *userdata; 1425 void *userdata;
1419 NSTableColumn *imagecol; 1426 NSTableColumn *treecol;
1420 NSTableColumn *textcol;
1421 NSMutableArray *data; 1427 NSMutableArray *data;
1422 /* Each data item consists of a linked lists of tree item data. 1428 /* Each data item consists of a linked lists of tree item data.
1423 * NSImage *, NSString *, Item Data *, NSMutableArray * of Children 1429 * NSImage *, NSString *, Item Data *, NSMutableArray * of Children
1424 */ 1430 */
1425 id scrollview; 1431 id scrollview;
1427 } 1433 }
1428 -(id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item; 1434 -(id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item;
1429 -(BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item; 1435 -(BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item;
1430 -(int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item; 1436 -(int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item;
1431 -(id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item; 1437 -(id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item;
1438 -(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item;
1432 -(BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item; 1439 -(BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item;
1433 -(void)addTree:(NSPointerArray *)item and:(NSPointerArray *)parent; 1440 -(void)addTree:(NSPointerArray *)item and:(NSPointerArray *)parent;
1434 -(void *)userdata; 1441 -(void *)userdata;
1435 -(void)setUserdata:(void *)input; 1442 -(void)setUserdata:(void *)input;
1436 -(void)treeSelectionChanged:(id)sender; 1443 -(void)treeSelectionChanged:(id)sender;
1447 { 1454 {
1448 self = [super init]; 1455 self = [super init];
1449 1456
1450 if (self) 1457 if (self)
1451 { 1458 {
1452 imagecol = [[NSTableColumn alloc] init]; 1459 treecol = [[NSTableColumn alloc] init];
1453 NSImageCell *imagecell = [[[NSImageCell alloc] init] autorelease]; 1460 NSBrowserCell *browsercell = [[[NSBrowserCell alloc] init] autorelease];
1454 [imagecol setDataCell:imagecell]; 1461 [browsercell setLeaf:YES];
1455 [imagecol setResizingMask:NSTableColumnNoResizing]; 1462 [treecol setDataCell:browsercell];
1456 [imagecol setWidth:20]; 1463 [self addTableColumn:treecol];
1457 [self addTableColumn:imagecol]; 1464 [self setOutlineTableColumn:treecol];
1458 textcol = [[NSTableColumn alloc] init];
1459 [textcol setEditable:NO];
1460 [self addTableColumn:textcol];
1461 [self setOutlineTableColumn:textcol];
1462 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(treeSelectionChanged:) name:NSOutlineViewSelectionDidChangeNotification object:self]; 1465 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(treeSelectionChanged:) name:NSOutlineViewSelectionDidChangeNotification object:self];
1463 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(treeItemExpanded:) name:NSOutlineViewItemDidExpandNotification object:self]; 1466 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(treeItemExpanded:) name:NSOutlineViewItemDidExpandNotification object:self];
1464 } 1467 }
1465 return self; 1468 return self;
1466 } 1469 }
1504 if(item) 1507 if(item)
1505 { 1508 {
1506 if([item isKindOfClass:[NSPointerArray class]]) 1509 if([item isKindOfClass:[NSPointerArray class]])
1507 { 1510 {
1508 NSPointerArray *this = (NSPointerArray *)item; 1511 NSPointerArray *this = (NSPointerArray *)item;
1509 if(tableColumn == imagecol)
1510 {
1511 return [this pointerAtIndex:0];
1512 }
1513 return [this pointerAtIndex:1]; 1512 return [this pointerAtIndex:1];
1514 } 1513 }
1515 else 1514 else
1516 { 1515 {
1517 return nil; 1516 return nil;
1518 } 1517 }
1519 } 1518 }
1520 return @"List Root"; 1519 return @"List Root";
1520 }
1521 -(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
1522 {
1523 if([cell isMemberOfClass:[NSBrowserCell class]])
1524 {
1525 NSPointerArray *this = (NSPointerArray *)item;
1526 NSImage *img = [this pointerAtIndex:0];
1527 [(NSBrowserCell*)cell setImage:img];
1528 }
1521 } 1529 }
1522 -(BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item { return NO; } 1530 -(BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item { return NO; }
1523 -(void)addTree:(NSPointerArray *)item and:(NSPointerArray *)parent; 1531 -(void)addTree:(NSPointerArray *)item and:(NSPointerArray *)parent;
1524 { 1532 {
1525 NSMutableArray *children = data; 1533 NSMutableArray *children = data;
1575 -(NSScrollView *)scrollview { return scrollview; } 1583 -(NSScrollView *)scrollview { return scrollview; }
1576 -(void)setScrollview:(NSScrollView *)input { scrollview = input; } 1584 -(void)setScrollview:(NSScrollView *)input { scrollview = input; }
1577 -(void)deleteNode:(NSPointerArray *)item { _free_tree_recurse(data, item); } 1585 -(void)deleteNode:(NSPointerArray *)item { _free_tree_recurse(data, item); }
1578 -(void)setForegroundColor:(NSColor *)input 1586 -(void)setForegroundColor:(NSColor *)input
1579 { 1587 {
1580 NSTextFieldCell *cell = [textcol dataCell]; 1588 NSTextFieldCell *cell = [treecol dataCell];
1581 fgcolor = input; 1589 fgcolor = input;
1582 [fgcolor retain]; 1590 [fgcolor retain];
1583 [cell setTextColor:fgcolor]; 1591 [cell setTextColor:fgcolor];
1584 } 1592 }
1585 -(void)clear { NSMutableArray *toclear = data; data = nil; _free_tree_recurse(toclear, NULL); [self reloadData]; } 1593 -(void)clear { NSMutableArray *toclear = data; data = nil; _free_tree_recurse(toclear, NULL); [self reloadData]; }
1586 -(void)dealloc 1594 -(void)dealloc
1587 { 1595 {
1588 UserData *root = userdata; 1596 UserData *root = userdata;
1589 _remove_userdata(&root, NULL, TRUE); 1597 _remove_userdata(&root, NULL, TRUE);
1590 _free_tree_recurse(data, NULL); 1598 _free_tree_recurse(data, NULL);
1591 [imagecol release]; 1599 [treecol release];
1592 [textcol release];
1593 [super dealloc]; 1600 [super dealloc];
1594 } 1601 }
1595 @end 1602 @end
1596 1603
1597 /* Subclass for a Calendar type */ 1604 /* Subclass for a Calendar type */
4538 [scrollview setHasVerticalScroller:YES]; 4545 [scrollview setHasVerticalScroller:YES];
4539 [scrollview setAutohidesScrollers:YES]; 4546 [scrollview setAutohidesScrollers:YES];
4540 4547
4541 [tree setAllowsMultipleSelection:NO]; 4548 [tree setAllowsMultipleSelection:NO];
4542 [tree setDataSource:tree]; 4549 [tree setDataSource:tree];
4550 [tree setDelegate:tree];
4543 [scrollview setDocumentView:tree]; 4551 [scrollview setDocumentView:tree];
4544 [tree setHeaderView:nil]; 4552 [tree setHeaderView:nil];
4545 [tree setTag:cid]; 4553 [tree setTag:cid];
4546 [scrollview release]; 4554 [scrollview release];
4547 DW_MUTEX_UNLOCK; 4555 DW_MUTEX_UNLOCK;
4809 [[column headerCell] setStringValue:[ NSString stringWithUTF8String:titles[z] ]]; 4817 [[column headerCell] setStringValue:[ NSString stringWithUTF8String:titles[z] ]];
4810 if(flags[z] & DW_CFA_BITMAPORICON) 4818 if(flags[z] & DW_CFA_BITMAPORICON)
4811 { 4819 {
4812 NSImageCell *imagecell = [[NSImageCell alloc] init]; 4820 NSImageCell *imagecell = [[NSImageCell alloc] init];
4813 [column setDataCell:imagecell]; 4821 [column setDataCell:imagecell];
4814 if(z == 0 && titles[z] && strcmp(titles[z], "Icon") == 0)
4815 {
4816 [column setResizingMask:NSTableColumnNoResizing];
4817 [column setWidth:20];
4818 }
4819 [imagecell release]; 4822 [imagecell release];
4820 } 4823 }
4821 else if(flags[z] & DW_CFA_RIGHT) 4824 else if(flags[z] & DW_CFA_STRINGANDICON)
4825 {
4826 NSBrowserCell *browsercell = [[NSBrowserCell alloc] init];
4827 [browsercell setLeaf:YES];
4828 [column setDataCell:browsercell];
4829 [browsercell release];
4830 }
4831 /* Defaults to left justified so just handle right and center */
4832 if(flags[z] & DW_CFA_RIGHT)
4822 { 4833 {
4823 [(NSCell *)[column dataCell] setAlignment:NSRightTextAlignment]; 4834 [(NSCell *)[column dataCell] setAlignment:NSRightTextAlignment];
4824 [(NSCell *)[column headerCell] setAlignment:NSRightTextAlignment]; 4835 [(NSCell *)[column headerCell] setAlignment:NSRightTextAlignment];
4825 } 4836 }
4826 else if(flags[z] & DW_CFA_CENTER) 4837 else if(flags[z] & DW_CFA_CENTER)
4845 * titles: An array of strings with column text titles. 4856 * titles: An array of strings with column text titles.
4846 * count: The number of columns (this should match the arrays). 4857 * count: The number of columns (this should match the arrays).
4847 */ 4858 */
4848 int API dw_filesystem_setup(HWND handle, unsigned long *flags, char **titles, int count) 4859 int API dw_filesystem_setup(HWND handle, unsigned long *flags, char **titles, int count)
4849 { 4860 {
4850 char **newtitles = malloc(sizeof(char *) * (count + 2)); 4861 char **newtitles = malloc(sizeof(char *) * (count + 1));
4851 unsigned long *newflags = malloc(sizeof(unsigned long) * (count + 2)); 4862 unsigned long *newflags = malloc(sizeof(unsigned long) * (count + 1));
4852 DWContainer *cont = handle; 4863 DWContainer *cont = handle;
4853 4864
4854 newtitles[0] = "Icon"; 4865 newtitles[0] = "Filename";
4855 newtitles[1] = "Filename"; 4866
4856 4867 newflags[0] = DW_CFA_STRINGANDICON | DW_CFA_LEFT | DW_CFA_HORZSEPARATOR;
4857 newflags[0] = DW_CFA_BITMAPORICON | DW_CFA_LEFT | DW_CFA_HORZSEPARATOR; 4868
4858 newflags[1] = DW_CFA_STRING | DW_CFA_LEFT | DW_CFA_HORZSEPARATOR; 4869 memcpy(&newtitles[1], titles, sizeof(char *) * count);
4859 4870 memcpy(&newflags[1], flags, sizeof(unsigned long) * count);
4860 memcpy(&newtitles[2], titles, sizeof(char *) * count); 4871
4861 memcpy(&newflags[2], flags, sizeof(unsigned long) * count); 4872 dw_container_setup(handle, newflags, newtitles, count + 1, 0);
4862
4863 dw_container_setup(handle, newflags, newtitles, count + 2, 0);
4864 [cont setFilesystem:YES]; 4873 [cont setFilesystem:YES];
4865 4874
4866 free(newtitles); 4875 free(newtitles);
4867 free(newflags); 4876 free(newflags);
4868 return TRUE; 4877 return TRUE;
4990 * row: Zero based row of data being set. 4999 * row: Zero based row of data being set.
4991 * data: Pointer to the data to be added. 5000 * data: Pointer to the data to be added.
4992 */ 5001 */
4993 void API dw_filesystem_change_item(HWND handle, int column, int row, void *data) 5002 void API dw_filesystem_change_item(HWND handle, int column, int row, void *data)
4994 { 5003 {
4995 dw_container_change_item(handle, column+2, row, data); 5004 dw_container_change_item(handle, column+1, row, data);
4996 } 5005 }
4997 5006
4998 /* 5007 /*
4999 * Changes an item in specified row and column to the given data. 5008 * Changes an item in specified row and column to the given data.
5000 * Parameters: 5009 * Parameters:
5004 * row: Zero based row of data being set. 5013 * row: Zero based row of data being set.
5005 * data: Pointer to the data to be added. 5014 * data: Pointer to the data to be added.
5006 */ 5015 */
5007 void API dw_filesystem_change_file(HWND handle, int row, char *filename, HICN icon) 5016 void API dw_filesystem_change_file(HWND handle, int row, char *filename, HICN icon)
5008 { 5017 {
5009 dw_container_change_item(handle, 0, row, &icon); 5018 dw_filesystem_set_file(handle, NULL, row, filename, icon);
5010 dw_container_change_item(handle, 1, row, &filename);
5011 } 5019 }
5012 5020
5013 /* 5021 /*
5014 * Sets an item in specified row and column to the given data. 5022 * Sets an item in specified row and column to the given data.
5015 * Parameters: 5023 * Parameters:
5019 * row: Zero based row of data being set. 5027 * row: Zero based row of data being set.
5020 * data: Pointer to the data to be added. 5028 * data: Pointer to the data to be added.
5021 */ 5029 */
5022 void API dw_filesystem_set_file(HWND handle, void *pointer, int row, char *filename, HICN icon) 5030 void API dw_filesystem_set_file(HWND handle, void *pointer, int row, char *filename, HICN icon)
5023 { 5031 {
5024 dw_container_set_item(handle, pointer, 0, row, &icon); 5032 int _locked_by_me = FALSE;
5025 dw_container_set_item(handle, pointer, 1, row, &filename); 5033 DW_MUTEX_LOCK;
5034 DWContainer *cont = handle;
5035 NSBrowserCell *browsercell;
5036 int lastadd = 0;
5037
5038 /* If pointer is NULL we are getting a change request instead of set */
5039 if(pointer)
5040 {
5041 lastadd = [cont lastAddPoint];
5042 }
5043
5044 browsercell = [[NSBrowserCell alloc] init];
5045 [browsercell setLeaf:YES];
5046 [browsercell setImage:icon];
5047 [browsercell setStringValue:[ NSString stringWithUTF8String:filename ]];
5048 [cont editCell:browsercell at:(row+lastadd) and:0];
5049 [cont setNeedsDisplay:YES];
5050 DW_MUTEX_UNLOCK;
5026 } 5051 }
5027 5052
5028 /* 5053 /*
5029 * Sets an item in specified row and column to the given data. 5054 * Sets an item in specified row and column to the given data.
5030 * Parameters: 5055 * Parameters:
5034 * row: Zero based row of data being set. 5059 * row: Zero based row of data being set.
5035 * data: Pointer to the data to be added. 5060 * data: Pointer to the data to be added.
5036 */ 5061 */
5037 void API dw_filesystem_set_item(HWND handle, void *pointer, int column, int row, void *data) 5062 void API dw_filesystem_set_item(HWND handle, void *pointer, int column, int row, void *data)
5038 { 5063 {
5039 dw_container_set_item(handle, pointer, column+2, row, data); 5064 dw_container_set_item(handle, pointer, column+1, row, data);
5040 } 5065 }
5041 5066
5042 /* 5067 /*
5043 * Gets column type for a container column 5068 * Gets column type for a container column
5044 * Parameters: 5069 * Parameters:
5074 * handle: Handle to the container window (widget). 5099 * handle: Handle to the container window (widget).
5075 * column: Zero based column. 5100 * column: Zero based column.
5076 */ 5101 */
5077 int API dw_filesystem_get_column_type(HWND handle, int column) 5102 int API dw_filesystem_get_column_type(HWND handle, int column)
5078 { 5103 {
5079 return dw_container_get_column_type(handle, column+2); 5104 return dw_container_get_column_type(handle, column+1);
5080 } 5105 }
5081 5106
5082 /* 5107 /*
5083 * Sets the width of a column in the container. 5108 * Sets the width of a column in the container.
5084 * Parameters: 5109 * Parameters: