comparison mac/dw.m @ 2177:7213842143f5

Mac: Switch to using NSTableCellView to store the data directly. Might use more memory to store the data, but allows better performance since the data can be use for display directly.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 12 Oct 2020 22:55:37 +0000
parents 288416bd6d3e
children 2fa38504803e
comparison
equal deleted inserted replaced
2176:288416bd6d3e 2177:7213842143f5
2361 2361
2362 #define _DW_CONTAINER_ICON_WIDTH 16 2362 #define _DW_CONTAINER_ICON_WIDTH 16
2363 #define _DW_CONTAINER_ICON_HEIGHT 16 2363 #define _DW_CONTAINER_ICON_HEIGHT 16
2364 #define _DW_CONTAINER_ROW_HEIGHT 20 2364 #define _DW_CONTAINER_ROW_HEIGHT 20
2365 2365
2366 #ifdef BUILDING_FOR_YOSEMITE
2367 NSTableCellView *_dw_table_cell_view_new(NSImage *icon, NSString *text)
2368 {
2369 id browsercell = [[[NSTableCellView alloc] init] autorelease];
2370 if(icon)
2371 {
2372 NSImageView *iv = [[[NSImageView alloc] init] autorelease];
2373 [browsercell setImageView:iv];
2374 [browsercell addSubview:iv];
2375 [iv setImage:icon];
2376 }
2377 if(text)
2378 {
2379 NSTextField *tf = [[[NSTextField alloc] init] autorelease];
2380 [browsercell setTextField:tf];
2381 [browsercell addSubview:tf];
2382 [tf setStringValue:text];
2383 [tf setEditable:NO];
2384 [tf setBezeled:NO];
2385 [tf setBordered:NO];
2386 }
2387 return browsercell;
2388 }
2389 #endif
2390
2366 /* Subclass for a Container/List type */ 2391 /* Subclass for a Container/List type */
2367 @interface DWContainer : NSTableView 2392 @interface DWContainer : NSTableView
2368 #ifdef BUILDING_FOR_SNOW_LEOPARD 2393 #ifdef BUILDING_FOR_SNOW_LEOPARD
2369 <NSTableViewDataSource,NSTableViewDelegate> 2394 <NSTableViewDataSource,NSTableViewDelegate>
2370 #endif 2395 #endif
2595 */ 2620 */
2596 [result setIdentifier:tableColumn.identifier]; 2621 [result setIdentifier:tableColumn.identifier];
2597 } 2622 }
2598 } 2623 }
2599 2624
2600 /* result is now guaranteed to be valid, either as a reused cell
2601 * or as a new cell, so set the text or image
2602 */
2603 if([celldata isMemberOfClass:[NSImage class]])
2604 {
2605 NSImageView *iv = [result imageView];
2606 if(!iv)
2607 {
2608 iv = [[[NSImageView alloc] init] autorelease];
2609 [result setImageView:iv];
2610 [result addSubview:iv];
2611 }
2612 [iv setImage:celldata];
2613 }
2614 if([celldata isKindOfClass:[NSString class]])
2615 {
2616 NSTextField *tf = [result textField];
2617 if(!tf)
2618 {
2619 tf = [[[NSTextField alloc] init] autorelease];
2620 [result setTextField:tf];
2621 [result addSubview:tf];
2622 }
2623 [tf setStringValue:celldata];
2624 }
2625 /* Adjust the frames of the textField and imageView */ 2625 /* Adjust the frames of the textField and imageView */
2626 if([result imageView]) 2626 if([result imageView])
2627 { 2627 {
2628 NSRect rect = NSMakeRect((_DW_CONTAINER_ROW_HEIGHT - _DW_CONTAINER_ICON_WIDTH) / 2, 2628 NSRect rect = NSMakeRect((_DW_CONTAINER_ROW_HEIGHT - _DW_CONTAINER_ICON_WIDTH) / 2,
2629 (_DW_CONTAINER_ROW_HEIGHT - _DW_CONTAINER_ICON_HEIGHT) / 2, 2629 (_DW_CONTAINER_ROW_HEIGHT - _DW_CONTAINER_ICON_HEIGHT) / 2,
7635 DW_FUNCTION_NO_RETURN(dw_container_set_item) 7635 DW_FUNCTION_NO_RETURN(dw_container_set_item)
7636 DW_FUNCTION_RESTORE_PARAM5(handle, HWND, pointer, void *, column, int, row, int, data, void *) 7636 DW_FUNCTION_RESTORE_PARAM5(handle, HWND, pointer, void *, column, int, row, int, data, void *)
7637 { 7637 {
7638 DW_FUNCTION_INIT; 7638 DW_FUNCTION_INIT;
7639 DWContainer *cont = handle; 7639 DWContainer *cont = handle;
7640 id object = nil; 7640 id object = nil, icon = nil, text = nil;
7641 int type = [cont cellType:column]; 7641 int type = [cont cellType:column];
7642 int lastadd = 0; 7642 int lastadd = 0;
7643 7643
7644 /* If pointer is NULL we are getting a change request instead of set */ 7644 /* If pointer is NULL we are getting a change request instead of set */
7645 if(pointer) 7645 if(pointer)
7649 7649
7650 if(data) 7650 if(data)
7651 { 7651 {
7652 if(type & DW_CFA_BITMAPORICON) 7652 if(type & DW_CFA_BITMAPORICON)
7653 { 7653 {
7654 object = *((NSImage **)data); 7654 icon = *((NSImage **)data);
7655 } 7655 }
7656 else if(type & DW_CFA_STRING) 7656 else if(type & DW_CFA_STRING)
7657 { 7657 {
7658 char *str = *((char **)data); 7658 char *str = *((char **)data);
7659 object = [ NSString stringWithUTF8String:str ]; 7659 text = [ NSString stringWithUTF8String:str ];
7660 } 7660 }
7661 else 7661 else
7662 { 7662 {
7663 char textbuffer[101] = {0}; 7663 char textbuffer[101] = {0};
7664 7664
7691 curtm.tm_sec = ctime.seconds; 7691 curtm.tm_sec = ctime.seconds;
7692 7692
7693 strftime(textbuffer, 100, "%X", &curtm); 7693 strftime(textbuffer, 100, "%X", &curtm);
7694 } 7694 }
7695 if(textbuffer[0]) 7695 if(textbuffer[0])
7696 object = [ NSString stringWithUTF8String:textbuffer ]; 7696 text = [ NSString stringWithUTF8String:textbuffer ];
7697 } 7697 }
7698 } 7698 }
7699
7700 #ifdef BUILDING_FOR_YOSEMITE
7701 object = _dw_table_cell_view_new(icon, text);
7702 #else
7703 object = icon ? icon : text;
7704 #endif
7699 7705
7700 [cont editCell:object at:(row+lastadd) and:column]; 7706 [cont editCell:object at:(row+lastadd) and:column];
7701 [cont setNeedsDisplay:YES]; 7707 [cont setNeedsDisplay:YES];
7702 DW_FUNCTION_RETURN_NOTHING; 7708 DW_FUNCTION_RETURN_NOTHING;
7703 } 7709 }
7770 { 7776 {
7771 lastadd = [cont lastAddPoint]; 7777 lastadd = [cont lastAddPoint];
7772 } 7778 }
7773 7779
7774 #ifdef BUILDING_FOR_YOSEMITE 7780 #ifdef BUILDING_FOR_YOSEMITE
7775 browsercell = [[[NSTableCellView alloc] init] autorelease]; 7781 browsercell = _dw_table_cell_view_new(icon, [NSString stringWithUTF8String:filename]);
7776 [browsercell setImageView:[[[NSImageView alloc] init] autorelease]];
7777 [browsercell addSubview:[browsercell imageView]];
7778 [[browsercell imageView] setImage:icon];
7779 [browsercell setTextField:[[[NSTextField alloc] init] autorelease]];
7780 [browsercell addSubview:[browsercell textField]];
7781 [[browsercell textField] setStringValue:[NSString stringWithUTF8String:filename]];
7782 #else 7782 #else
7783 browsercell = [[[DWImageAndTextCell alloc] init] autorelease]; 7783 browsercell = [[[DWImageAndTextCell alloc] init] autorelease];
7784 [browsercell setImage:icon]; 7784 [browsercell setImage:icon];
7785 [browsercell setStringValue:[ NSString stringWithUTF8String:filename ]]; 7785 [browsercell setStringValue:[ NSString stringWithUTF8String:filename ]];
7786 #endif 7786 #endif