|
|
1.1 ! root 1: // CustomCell.m ! 2: // By Jayson Adams, NeXT Developer Support Team ! 3: // You may freely copy, distribute and reuse the code in this example. ! 4: // NeXT disclaims any warranty of any kind, expressed or implied, as to its ! 5: // fitness for any particular use. ! 6: ! 7: // This subclass of cell draws a dot image to the right of the text ! 8: // and provides fancy, printable highlighting. ! 9: ! 10: #import <appkit/appkit.h> ! 11: #import "CustomCell.h" ! 12: ! 13: @implementation CustomCell ! 14: ! 15: ! 16: #define IMAGEMARGIN 4.0 ! 17: ! 18: - drawInside:(const NXRect *)cellFrame inView:controlView ! 19: { ! 20: /* every CustomCell needs these two */ ! 21: static id dotImage = nil; ! 22: static id sharedTextCell = nil; ! 23: ! 24: NXRect rect = *cellFrame; ! 25: NXPoint imageOrigin; ! 26: NXSize dotSize; ! 27: ! 28: if (!dotImage) { ! 29: dotImage = [NXImage findImageNamed:"Dot"]; ! 30: } ! 31: [dotImage getSize:&dotSize]; ! 32: ! 33: /* erase the cell */ ! 34: PSsetgray((cFlags1.state || cFlags1.highlighted) ? NX_WHITE : NX_LTGRAY); ! 35: NXRectFill(cellFrame); ! 36: ! 37: /* draw the "attachment" image */ ! 38: imageOrigin.x = NX_X(cellFrame) + IMAGEMARGIN; ! 39: imageOrigin.y = NX_Y(cellFrame) + NX_HEIGHT(cellFrame) - ! 40: (NX_HEIGHT(cellFrame) - dotSize.height) / 2.0; ! 41: ! 42: [dotImage composite:NX_SOVER toPoint:&imageOrigin]; ! 43: ! 44: NX_WIDTH(&rect) -= (dotSize.width + IMAGEMARGIN * 2.0 - NX_X(&rect)); ! 45: NX_X(&rect) += dotSize.width + IMAGEMARGIN * 2.0; ! 46: ! 47: if (!sharedTextCell) { ! 48: sharedTextCell = [[Cell alloc] init]; ! 49: [sharedTextCell setWrap:NO]; ! 50: } ! 51: [sharedTextCell setFont:[self font]]; ! 52: [sharedTextCell setStringValue:[self stringValue]]; ! 53: [sharedTextCell drawInside:&rect inView:controlView]; ! 54: ! 55: /* all drawing from now on will be in dark gray */ ! 56: PSsetgray(NX_DKGRAY); ! 57: ! 58: /* draw the two dark gray lines above and below the cell */ ! 59: if (cFlags1.state || cFlags1.highlighted) { ! 60: NXRect rectArray[2]; ! 61: /* ! 62: * draw 1-pixel tall rectangles instead of lines (this is faster than ! 63: * PSmoveto(); PSlineto()). ! 64: */ ! 65: NXSetRect(&(rectArray[0]), NX_X(cellFrame), NX_Y(cellFrame), ! 66: NX_WIDTH(cellFrame), 1.0); ! 67: NXSetRect(&(rectArray[1]), NX_X(cellFrame), NX_MAXY(cellFrame) - 1.0, ! 68: NX_WIDTH(cellFrame), 1.0); ! 69: ! 70: /* using NXRectFillList is faster than separate calls to NXRectFill */ ! 71: NXRectFillList(rectArray, 2); ! 72: } ! 73: ! 74: return self; ! 75: } ! 76: ! 77: - highlight:(const NXRect *)cellFrame inView:controlView lit:(BOOL)flag ! 78: { ! 79: if (cFlags1.highlighted != flag) { ! 80: cFlags1.highlighted = flag; ! 81: [self drawInside:cellFrame inView:controlView]; ! 82: } ! 83: return self; ! 84: } ! 85: ! 86: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.