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