Mercurial > dwindows
comparison mac/dw.m @ 1206:c7bb48cda53a
Switched from using NSBrowserCell to a DWImageAndTextCell subclass on Mac.
NSBrowserCell did not implement a lot of display options that were required
to implement the experimental dw_container_set_row_bg() function.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Sat, 08 Oct 2011 18:37:48 +0000 |
parents | 5cb7e52f76c7 |
children | 5a016a5a7412 |
comparison
equal
deleted
inserted
replaced
1205:39a5f5fc7628 | 1206:c7bb48cda53a |
---|---|
1314 -(void *)userdata { return userdata; } | 1314 -(void *)userdata { return userdata; } |
1315 -(void)setUserdata:(void *)input { userdata = input; } | 1315 -(void)setUserdata:(void *)input { userdata = input; } |
1316 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } | 1316 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } |
1317 @end | 1317 @end |
1318 | 1318 |
1319 /* Subclass NSTextFieldCell for displaying image and text */ | |
1320 @interface DWImageAndTextCell : NSTextFieldCell | |
1321 { | |
1322 @private | |
1323 NSImage *image; | |
1324 } | |
1325 -(void)setImage:(NSImage *)anImage; | |
1326 -(NSImage *)image; | |
1327 -(void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView; | |
1328 -(NSSize)cellSize; | |
1329 @end | |
1330 | |
1331 @implementation DWImageAndTextCell | |
1332 - (void)dealloc | |
1333 { | |
1334 [image release]; | |
1335 image = nil; | |
1336 [super dealloc]; | |
1337 } | |
1338 -copyWithZone:(NSZone *)zone | |
1339 { | |
1340 DWImageAndTextCell *cell = (DWImageAndTextCell *)[super copyWithZone:zone]; | |
1341 cell->image = [image retain]; | |
1342 return cell; | |
1343 } | |
1344 -(void)setImage:(NSImage *)anImage | |
1345 { | |
1346 if (anImage != image) | |
1347 { | |
1348 [image release]; | |
1349 image = [anImage retain]; | |
1350 } | |
1351 } | |
1352 -(NSImage *)image | |
1353 { | |
1354 return [[image retain] autorelease]; | |
1355 } | |
1356 -(NSRect)imageFrameForCellFrame:(NSRect)cellFrame | |
1357 { | |
1358 if (image != nil) | |
1359 { | |
1360 NSRect imageFrame; | |
1361 imageFrame.size = [image size]; | |
1362 imageFrame.origin = cellFrame.origin; | |
1363 imageFrame.origin.x += 3; | |
1364 imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2); | |
1365 return imageFrame; | |
1366 } | |
1367 else | |
1368 return NSZeroRect; | |
1369 } | |
1370 -(void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject event:(NSEvent *)theEvent | |
1371 { | |
1372 NSRect textFrame, imageFrame; | |
1373 NSDivideRect (aRect, &imageFrame, &textFrame, 3 + [image size].width, NSMinXEdge); | |
1374 [super editWithFrame: textFrame inView: controlView editor:textObj delegate:anObject event: theEvent]; | |
1375 } | |
1376 -(void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength | |
1377 { | |
1378 NSRect textFrame, imageFrame; | |
1379 NSDivideRect (aRect, &imageFrame, &textFrame, 3 + [image size].width, NSMinXEdge); | |
1380 [super selectWithFrame: textFrame inView: controlView editor:textObj delegate:anObject start:selStart length:selLength]; | |
1381 } | |
1382 -(void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView | |
1383 { | |
1384 if (image != nil) { | |
1385 NSSize imageSize; | |
1386 NSRect imageFrame; | |
1387 | |
1388 imageSize = [image size]; | |
1389 NSDivideRect(cellFrame, &imageFrame, &cellFrame, 3 + imageSize.width, NSMinXEdge); | |
1390 if ([self drawsBackground]) { | |
1391 [[self backgroundColor] set]; | |
1392 NSRectFill(imageFrame); | |
1393 } | |
1394 imageFrame.origin.x += 3; | |
1395 imageFrame.size = imageSize; | |
1396 | |
1397 if ([controlView isFlipped]) | |
1398 imageFrame.origin.y += ceil((cellFrame.size.height + imageFrame.size.height) / 2); | |
1399 else | |
1400 imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2); | |
1401 | |
1402 [image compositeToPoint:imageFrame.origin operation:NSCompositeSourceOver]; | |
1403 } | |
1404 [super drawWithFrame:cellFrame inView:controlView]; | |
1405 } | |
1406 -(NSSize)cellSize | |
1407 { | |
1408 NSSize cellSize = [super cellSize]; | |
1409 cellSize.width += (image ? [image size].width : 0) + 3; | |
1410 return cellSize; | |
1411 } | |
1412 @end | |
1413 | |
1319 /* Subclass for a Container/List type */ | 1414 /* Subclass for a Container/List type */ |
1320 @interface DWContainer : NSTableView | 1415 @interface DWContainer : NSTableView |
1321 #ifdef BUILDING_FOR_SNOW_LEOPARD | 1416 #ifdef BUILDING_FOR_SNOW_LEOPARD |
1322 <NSTableViewDataSource,NSTableViewDelegate> | 1417 <NSTableViewDataSource,NSTableViewDelegate> |
1323 #endif | 1418 #endif |
1325 void *userdata; | 1420 void *userdata; |
1326 NSMutableArray *tvcols; | 1421 NSMutableArray *tvcols; |
1327 NSMutableArray *data; | 1422 NSMutableArray *data; |
1328 NSMutableArray *types; | 1423 NSMutableArray *types; |
1329 NSPointerArray *titles; | 1424 NSPointerArray *titles; |
1330 NSColor *fgcolor; | 1425 NSColor *fgcolor, *oddcolor, *evencolor; |
1331 int lastAddPoint, lastQueryPoint; | 1426 int lastAddPoint, lastQueryPoint; |
1332 id scrollview; | 1427 id scrollview; |
1333 int filesystem; | 1428 int filesystem; |
1334 } | 1429 } |
1335 -(NSInteger)numberOfRowsInTableView:(NSTableView *)aTable; | 1430 -(NSInteger)numberOfRowsInTableView:(NSTableView *)aTable; |
1414 -(int)filesystem { return filesystem; } | 1509 -(int)filesystem { return filesystem; } |
1415 -(id)scrollview { return scrollview; } | 1510 -(id)scrollview { return scrollview; } |
1416 -(void)setScrollview:(id)input { scrollview = input; } | 1511 -(void)setScrollview:(id)input { scrollview = input; } |
1417 -(void)addColumn:(NSTableColumn *)input andType:(int)type { if(tvcols) { [tvcols addObject:input]; [types addObject:[NSNumber numberWithInt:type]]; } } | 1512 -(void)addColumn:(NSTableColumn *)input andType:(int)type { if(tvcols) { [tvcols addObject:input]; [types addObject:[NSNumber numberWithInt:type]]; } } |
1418 -(NSTableColumn *)getColumn:(int)col { if(tvcols) { return [tvcols objectAtIndex:col]; } return nil; } | 1513 -(NSTableColumn *)getColumn:(int)col { if(tvcols) { return [tvcols objectAtIndex:col]; } return nil; } |
1514 -(void)setRowBgOdd:(unsigned long)oddcol andEven:(unsigned long)evencol | |
1515 { | |
1516 NSColor *oldodd = oddcolor; | |
1517 NSColor *oldeven = evencolor; | |
1518 unsigned long _odd = _get_color(oddcol); | |
1519 unsigned long _even = _get_color(evencol); | |
1520 | |
1521 /* Get the NSColor for non-default colors */ | |
1522 if(oddcol != DW_CLR_DEFAULT) | |
1523 oddcolor = [[NSColor colorWithDeviceRed: DW_RED_VALUE(_odd)/255.0 green: DW_GREEN_VALUE(_odd)/255.0 blue: DW_BLUE_VALUE(_odd)/255.0 alpha: 1] retain]; | |
1524 else | |
1525 oddcolor = NULL; | |
1526 if(evencol != DW_CLR_DEFAULT) | |
1527 evencolor = [[NSColor colorWithDeviceRed: DW_RED_VALUE(_even)/255.0 green: DW_GREEN_VALUE(_even)/255.0 blue: DW_BLUE_VALUE(_even)/255.0 alpha: 1] retain]; | |
1528 else | |
1529 evencolor = NULL; | |
1530 [oldodd release]; | |
1531 [oldeven release]; | |
1532 } | |
1419 -(int)insertRow:(NSArray *)input at:(int)index | 1533 -(int)insertRow:(NSArray *)input at:(int)index |
1420 { | 1534 { |
1421 if(data) | 1535 if(data) |
1422 { | 1536 { |
1423 unsigned long start = [tvcols count] * index; | 1537 unsigned long start = [tvcols count] * index; |
1465 } | 1579 } |
1466 return 0; | 1580 return 0; |
1467 } | 1581 } |
1468 -(void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row | 1582 -(void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row |
1469 { | 1583 { |
1470 if([cell isMemberOfClass:[NSBrowserCell class]]) | 1584 DWImageAndTextCell *bcell = cell; |
1585 | |
1586 /* Handle drawing image and text if necessary */ | |
1587 if([cell isMemberOfClass:[DWImageAndTextCell class]]) | |
1471 { | 1588 { |
1472 int index = (int)(row * [tvcols count]); | 1589 int index = (int)(row * [tvcols count]); |
1473 NSBrowserCell *browsercell = [data objectAtIndex:index]; | 1590 DWImageAndTextCell *browsercell = [data objectAtIndex:index]; |
1474 NSImage *img = [browsercell image]; | 1591 NSImage *img = [browsercell image]; |
1475 [(NSBrowserCell*)cell setImage:img]; | 1592 [bcell setImage:img]; |
1593 } | |
1594 /* Handle drawing alternating row colors if enabled */ | |
1595 if ((row % 2) == 0) | |
1596 { | |
1597 if(evencolor) | |
1598 { | |
1599 [bcell setDrawsBackground:YES]; | |
1600 [bcell setBackgroundColor:evencolor]; | |
1601 } | |
1602 else | |
1603 [bcell setDrawsBackground:NO]; | |
1604 } | |
1605 else | |
1606 { | |
1607 if(oddcolor) | |
1608 { | |
1609 [bcell setDrawsBackground:YES]; | |
1610 [bcell setBackgroundColor:oddcolor]; | |
1611 } | |
1612 else | |
1613 [bcell setDrawsBackground:NO]; | |
1476 } | 1614 } |
1477 } | 1615 } |
1478 -(void)editCell:(id)input at:(int)row and:(int)col | 1616 -(void)editCell:(id)input at:(int)row and:(int)col |
1479 { | 1617 { |
1480 if(tvcols && input) | 1618 if(tvcols && input) |
1720 self = [super init]; | 1858 self = [super init]; |
1721 | 1859 |
1722 if (self) | 1860 if (self) |
1723 { | 1861 { |
1724 treecol = [[NSTableColumn alloc] init]; | 1862 treecol = [[NSTableColumn alloc] init]; |
1725 NSBrowserCell *browsercell = [[[NSBrowserCell alloc] init] autorelease]; | 1863 DWImageAndTextCell *browsercell = [[[DWImageAndTextCell alloc] init] autorelease]; |
1726 [browsercell setLeaf:YES]; | |
1727 [treecol setDataCell:browsercell]; | 1864 [treecol setDataCell:browsercell]; |
1728 [self addTableColumn:treecol]; | 1865 [self addTableColumn:treecol]; |
1729 [self setOutlineTableColumn:treecol]; | 1866 [self setOutlineTableColumn:treecol]; |
1730 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(treeSelectionChanged:) name:NSOutlineViewSelectionDidChangeNotification object:self]; | 1867 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(treeSelectionChanged:) name:NSOutlineViewSelectionDidChangeNotification object:self]; |
1731 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(treeItemExpanded:) name:NSOutlineViewItemDidExpandNotification object:self]; | 1868 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(treeItemExpanded:) name:NSOutlineViewItemDidExpandNotification object:self]; |
1783 } | 1920 } |
1784 return @"List Root"; | 1921 return @"List Root"; |
1785 } | 1922 } |
1786 -(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item | 1923 -(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item |
1787 { | 1924 { |
1788 if([cell isMemberOfClass:[NSBrowserCell class]]) | 1925 if([cell isMemberOfClass:[DWImageAndTextCell class]]) |
1789 { | 1926 { |
1790 NSMutableArray *this = (NSMutableArray *)item; | 1927 NSMutableArray *this = (NSMutableArray *)item; |
1791 NSImage *img = [this objectAtIndex:0]; | 1928 NSImage *img = [this objectAtIndex:0]; |
1792 if([img isKindOfClass:[NSImage class]]) | 1929 if([img isKindOfClass:[NSImage class]]) |
1793 [(NSBrowserCell*)cell setImage:img]; | 1930 [(DWImageAndTextCell*)cell setImage:img]; |
1794 } | 1931 } |
1795 } | 1932 } |
1796 -(BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item { return NO; } | 1933 -(BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item { return NO; } |
1797 -(void)addTree:(NSMutableArray *)item and:(NSMutableArray *)parent after:(NSMutableArray *)after | 1934 -(void)addTree:(NSMutableArray *)item and:(NSMutableArray *)parent after:(NSMutableArray *)after |
1798 { | 1935 { |
5327 [column setDataCell:imagecell]; | 5464 [column setDataCell:imagecell]; |
5328 [imagecell release]; | 5465 [imagecell release]; |
5329 } | 5466 } |
5330 else if(flags[z] & DW_CFA_STRINGANDICON) | 5467 else if(flags[z] & DW_CFA_STRINGANDICON) |
5331 { | 5468 { |
5332 NSBrowserCell *browsercell = [[NSBrowserCell alloc] init]; | 5469 DWImageAndTextCell *browsercell = [[DWImageAndTextCell alloc] init]; |
5333 [browsercell setLeaf:YES]; | |
5334 [column setDataCell:browsercell]; | 5470 [column setDataCell:browsercell]; |
5335 [browsercell release]; | 5471 [browsercell release]; |
5336 } | 5472 } |
5337 /* Defaults to left justified so just handle right and center */ | 5473 /* Defaults to left justified so just handle right and center */ |
5338 if(flags[z] & DW_CFA_RIGHT) | 5474 if(flags[z] & DW_CFA_RIGHT) |
5536 void API dw_filesystem_set_file(HWND handle, void *pointer, int row, char *filename, HICN icon) | 5672 void API dw_filesystem_set_file(HWND handle, void *pointer, int row, char *filename, HICN icon) |
5537 { | 5673 { |
5538 int _locked_by_me = FALSE; | 5674 int _locked_by_me = FALSE; |
5539 DW_MUTEX_LOCK; | 5675 DW_MUTEX_LOCK; |
5540 DWContainer *cont = handle; | 5676 DWContainer *cont = handle; |
5541 NSBrowserCell *browsercell; | 5677 DWImageAndTextCell *browsercell; |
5542 int lastadd = 0; | 5678 int lastadd = 0; |
5543 | 5679 |
5544 /* If pointer is NULL we are getting a change request instead of set */ | 5680 /* If pointer is NULL we are getting a change request instead of set */ |
5545 if(pointer) | 5681 if(pointer) |
5546 { | 5682 { |
5547 lastadd = [cont lastAddPoint]; | 5683 lastadd = [cont lastAddPoint]; |
5548 } | 5684 } |
5549 | 5685 |
5550 browsercell = [[NSBrowserCell alloc] init]; | 5686 browsercell = [[DWImageAndTextCell alloc] init]; |
5551 [browsercell setLeaf:YES]; | |
5552 [browsercell setImage:icon]; | 5687 [browsercell setImage:icon]; |
5553 [browsercell setStringValue:[ NSString stringWithUTF8String:filename ]]; | 5688 [browsercell setStringValue:[ NSString stringWithUTF8String:filename ]]; |
5554 [cont editCell:browsercell at:(row+lastadd) and:0]; | 5689 [cont editCell:browsercell at:(row+lastadd) and:0]; |
5555 [cont setNeedsDisplay:YES]; | 5690 [cont setNeedsDisplay:YES]; |
5556 DW_MUTEX_UNLOCK; | 5691 DW_MUTEX_UNLOCK; |
5606 * column: Zero based column. | 5741 * column: Zero based column. |
5607 */ | 5742 */ |
5608 int API dw_filesystem_get_column_type(HWND handle, int column) | 5743 int API dw_filesystem_get_column_type(HWND handle, int column) |
5609 { | 5744 { |
5610 return dw_container_get_column_type(handle, column+1); | 5745 return dw_container_get_column_type(handle, column+1); |
5746 } | |
5747 | |
5748 /* | |
5749 * Sets the alternating row colors for container window (widget) handle. | |
5750 * Parameters: | |
5751 * handle: The window (widget) handle. | |
5752 * oddcolor: Odd row background color in DW_RGB format or a default color index. | |
5753 * DW_CLR_DEFAULT will disable coloring odd rows. | |
5754 * evencolor: Even row background color in DW_RGB format or a default color index. | |
5755 * DW_CLR_DEFAULT will disable coloring even rows. | |
5756 */ | |
5757 void API dw_container_set_row_bg(HWND handle, unsigned long oddcolor, unsigned long evencolor) | |
5758 { | |
5759 int _locked_by_me = FALSE; | |
5760 DW_MUTEX_LOCK; | |
5761 DWContainer *cont = handle; | |
5762 [cont setRowBgOdd:oddcolor andEven:evencolor]; | |
5763 DW_MUTEX_UNLOCK; | |
5611 } | 5764 } |
5612 | 5765 |
5613 /* | 5766 /* |
5614 * Sets the width of a column in the container. | 5767 * Sets the width of a column in the container. |
5615 * Parameters: | 5768 * Parameters: |