This is ExistenceTextFieldCell.m in view mode; [Download] [Up]
/* * This sourcecode is part of FileSpy, a logfile observing utility. * Copyright (C) 1996 Felix Rauch * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Notice that this program may not be possessed, used, copied, * distributed or modified by people having to do with nuclear * weapons. See the file CONDITIONS for details. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * To contact the original author, try: * e-mail: Felix.Rauch@nice.ch * Traditional mail: Felix Rauch * Sempacherstrasse 33 * 8032 Zurich * Switzerland */ // Most of this file is from: // CustomCell.m // By Jayson Adams, NeXT Developer Support Team // You may freely copy, distribute and reuse the code in this example. // NeXT disclaims any warranty of any kind, expressed or implied, as to its // fitness for any particular use. // This subclass of cell draws a dot image to the right of the text // and provides fancy, printable highlighting. #import <appkit/appkit.h> #import "ExistenceTextFieldCell.h" @implementation ExistenceTextFieldCell #define IMAGEMARGIN 4.0 - drawInside:(const NXRect *)cellFrame inView:controlView { /* every CustomCell needs these two */ static id plusImage = nil, minusImage = nil, questionImage = nil; static id sharedTextCell = nil; NXRect rect = *cellFrame; NXPoint imageOrigin; NXSize plusSize, minusSize, questionSize; char *str, tmpStr[6]; int t; if (!plusImage) { plusImage = [NXImage findImageNamed:"plus"]; } [plusImage getSize:&plusSize]; if (!minusImage) { minusImage = [NXImage findImageNamed:"minus"]; } [minusImage getSize:&minusSize]; if (!questionImage) { questionImage = [NXImage findImageNamed:"questionmark"]; } [questionImage getSize:&questionSize]; /* erase the cell */ PSsetgray((cFlags1.state || cFlags1.highlighted) ? NX_WHITE : NX_LTGRAY); NXRectFill(cellFrame); if(![myDelegate permissionOk]) { /* draw the "attachment" image */ imageOrigin.x = NX_X(cellFrame) + IMAGEMARGIN; imageOrigin.y = NX_Y(cellFrame) + NX_HEIGHT(cellFrame) - (NX_HEIGHT(cellFrame) - questionSize.height) / 2.0; [questionImage composite:NX_SOVER toPoint:&imageOrigin]; NX_WIDTH(&rect) -= (questionSize.width + IMAGEMARGIN * 2.0 - NX_X(&rect)); NX_X(&rect) += questionSize.width + IMAGEMARGIN * 2.0; } else if([myDelegate fileExists]) { /* draw the "attachment" image */ imageOrigin.x = NX_X(cellFrame) + IMAGEMARGIN; imageOrigin.y = NX_Y(cellFrame) + NX_HEIGHT(cellFrame) - (NX_HEIGHT(cellFrame) - plusSize.height) / 2.0; [plusImage composite:NX_SOVER toPoint:&imageOrigin]; NX_WIDTH(&rect) -= (plusSize.width + IMAGEMARGIN * 2.0 - NX_X(&rect)); NX_X(&rect) += plusSize.width + IMAGEMARGIN * 2.0; } else { /* draw the "attachment" image */ imageOrigin.x = NX_X(cellFrame) + IMAGEMARGIN; imageOrigin.y = NX_Y(cellFrame) + NX_HEIGHT(cellFrame) - (NX_HEIGHT(cellFrame) - plusSize.height) / 2.0; [minusImage composite:NX_SOVER toPoint:&imageOrigin]; NX_WIDTH(&rect) -= (minusSize.width + IMAGEMARGIN * 2.0 - NX_X(&rect)); NX_X(&rect) += minusSize.width + IMAGEMARGIN * 2.0; } if (!sharedTextCell) { sharedTextCell = [[Cell alloc] init]; [sharedTextCell setWrap:NO]; } if([myDelegate showTime]) { BOOL didPrint = NO; str = (char *)alloca(strlen([self stringValue]) + 17); // + " [1000d24h60m60s]" // strcpy and strcat should be thread-safe, as they're no i/o-functions (?) strcpy(str, [self stringValue]); strcat(str, " ["); if((t = timeDiff/(60*60*24)) > 0) { sprintf(tmpStr, "%dd", t); strcat(str, tmpStr); didPrint = YES; } if((t = (timeDiff/(60*60) % 24)) > 0) { sprintf(tmpStr, didPrint ? " %dh" : "%dh", t); strcat(str, tmpStr); didPrint = YES; } if((t = ((timeDiff/60) % 60)) > 0) { sprintf(tmpStr, didPrint ? " %dm" : "%dm", t); strcat(str, tmpStr); didPrint = YES; } t = (timeDiff % 60); sprintf(tmpStr, didPrint ? " %ds]" : "%ds]", t); strcat(str, tmpStr); } else { str = (char *)[self stringValue]; } [sharedTextCell setFont:[self font]]; [sharedTextCell setStringValue:str]; [sharedTextCell drawInside:&rect inView:controlView]; /* all drawing from now on will be in dark gray */ PSsetgray(NX_DKGRAY); /* draw the two dark gray lines above and below the cell */ if (cFlags1.state || cFlags1.highlighted) { NXRect rectArray[2]; /* * draw 1-pixel tall rectangles instead of lines (this is faster than * PSmoveto(); PSlineto()). */ NXSetRect(&(rectArray[0]), NX_X(cellFrame), NX_Y(cellFrame), NX_WIDTH(cellFrame), 1.0); NXSetRect(&(rectArray[1]), NX_X(cellFrame), NX_MAXY(cellFrame) - 1.0, NX_WIDTH(cellFrame), 1.0); /* using NXRectFillList is faster than separate calls to NXRectFill */ NXRectFillList(rectArray, 2); } return self; } - highlight:(const NXRect *)cellFrame inView:controlView lit:(BOOL)flag { if (cFlags1.highlighted != flag) { cFlags1.highlighted = flag; [self drawInside:cellFrame inView:controlView]; } return self; } - setMyDelegate:del { myDelegate = del; return self; } - setTime:(time_t)newTime { time = newTime; timeDiff = 0; return self; } - changeTime:(time_t)newTime { timeDiff = newTime - time; // time = newTime; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.