Mercurial > dwindows
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: |