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: