This is PXKCell.m in view mode; [Download] [Up]
/* PXKCell.m NSCell for GNUstep GUI X/DPS Backend Copyright (C) 1996 Free Software Foundation, Inc. Author: Pascal Forget <pascal@wsc.com> Date: January 1996 This file is part of the GNUstep GUI X/DPS Backend. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. If you are interested in a warranty or support for this source code, contact Scott Christley <scottc@net-community.com> for more information. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <gnustep/xdps/PXKCell.h> #include <AppKit/NSControl.h> NSMutableArray *_allCells; /* Contains all instances of the Cell class */ @implementation PXKCell + (void)initialize; { if (!_allCells) { _allCells = [NSMutableArray array]; } } - (NSSize)cellSizeForBounds:(NSRect)aRect; { NSSize invalidSize; if ((aRect.size.width >= cell_size.width) && (aRect.size.height >= cell_size.height)) { return aRect.size; } else { invalidSize.width = 0.0; invalidSize.height = 0.0; return invalidSize; } } - (NSComparisonResult)compare:(id)otherCell; { if ((!otherCell) || ([otherCell isKindOfClass:[NSCell class]] == NO)) { #if 0 NSRaiseException(NSBadComparisonException); /* Right syntax? */ #else exit(-1); /* Crash the program */ #endif } else { return [[self stringValue] compare:[otherCell stringValue]]; } } - (void)dealloc; { [_allCells removeObject:self]; [super dealloc]; } - (NSRect)drawingRectForBounds:(NSRect)theRect; { NSRect aRect; if (theRect.size.width >= cell_size.width) { aRect.size.width = theRect.size.width; } else { aRect.size.width = cell_size.width; } if (theRect.size.height >= cell_size.height) { aRect.size.height = theRect.size.height; } else { aRect.size.height = cell_size.height; } aRect.origin.x = theRect.origin.x; aRect.origin.y = theRect.origin.y; return aRect; } - (void)drawBorder; { /* Not implemented yet */ } - (void)drawImage; { /* Not implemented yet */ } #if 0 - (void)drawTextInRect:(NSRect)frame; { /* Goofy implementation for testing only */ int len1; int width; int font_height; int alignment = 0; XFontStruct *win_font; #if 0 fprintf(stdout, "Cell text frame: %d %d %d %d\n", frame.origin.x, frame.origin.y, frame.size.width, frame.size.height); #endif (void)load_font(&win_font); /* need length for both XTextWidth and XDrawString */ len1 = [stringValue length]; /* get string widths for centering */ width = XTextWidth(win_font, [stringValue cString], len1); font_height = win_font->ascent + win_font->descent; /* * Wipe out the contents of the window by filling its * area with the backGroundColor (defined in NSView.h) */ if (isOpaque) { XFillRectangle(NSDisplay, [_controlView xWindow], NSLightgrayGC, frame.origin.x+2, frame.origin.y+2, frame.size.width-4, frame.size.height-4); } if((alignment == NSALIGN_LEFT) && (width < frame.size.width)) { XDrawString(NSDisplay, [_controlView xWindow], NSBlackGC, frame.origin.x + 5, frame.origin.y + font_height, [stringValue cString], len1); } else if((alignment == NSALIGN_RIGHT) && ((width+5)<frame.size.width)) { XDrawString(NSDisplay, [_controlView xWindow], NSBlackGC, frame.origin.x + frame.size.width - 5 - width, frame.origin.y + font_height, [stringValue cString], len1); } else { if (width > (frame.size.width-4)) { XDrawString(NSDisplay, [_controlView xWindow], NSBlackGC, frame.origin.x + frame.size.width - width-5, frame.origin.y + font_height, [stringValue cString], len1); } else { /* output text, centered on each line */ XDrawString(NSDisplay, [_controlView xWindow], NSBlackGC, frame.origin.x + (frame.size.width - width-6)/2, frame.origin.y + font_height, [stringValue cString], len1); } } } #endif - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView; { #if 0 if (image) { [self drawImage]; } if (stringValue) { [self drawTextInRect:[self titleRectForBounds:cellFrame]]; } #endif } - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView; { [self drawBorder]; [self drawInteriorWithFrame:cellFrame inView:controlView]; } - (void)highlight:(BOOL)lit withFrame:(NSRect)cellFrame inView:(NSView *)controlView; { cell_highlighted = lit; [self drawWithFrame:cellFrame inView:controlView]; } - (NSRect)imageRectForBounds:(NSRect)theRect; { NSRect imageRect; if ([self isBordered] == NO) { imageRect.origin.x = theRect.origin.x; imageRect.origin.y = theRect.origin.y; imageRect.size.width = NSX_MAX(cell_size.width,theRect.size.width); imageRect.size.height = NSX_MAX(cell_size.width,theRect.size.height); } else { imageRect.origin.x = theRect.origin.x + 1.0; imageRect.origin.y = theRect.origin.y + 1.0; imageRect.size.width = NSX_MAX(cell_size.width - 2.0, theRect.size.width - 2.0); imageRect.size.height = NSX_MAX(cell_size.width - 2.0, theRect.size.height - 2.0); } return imageRect; } - (id)initImageCell:(NSImage *)anImage; { [super initImageCell:anImage]; [_allCells addObject:self]; return self; } - (id)initTextCell:(NSString *)aString; { [super initTextCell:aString]; [_allCells addObject:self]; return self; } - (BOOL)isEntryAcceptable:(NSString *)aString; { BOOL isNumeric = YES; /* Int, float or double */ BOOL isPositive = YES; /* Numeric > 0 */ BOOL isInt = YES; int i=0, count; const char *str; char c; int numberOfDots = 0; if ((entry_type == NSAnyType) || (aString == nil)) { return YES; } else { count = [aString length]; str = [aString cString]; if (entry_type == NSDateType) { /* VERY primitive date validation */ for (i=0; i<count; i++) { c = str[i]; if ((c=='k') || (c=='w') || (c=='x') || (c=='z') || (c<32) || (c>122)) { return NO; } } return YES; } else { /* Entry is of one of the numeric types */ /* Ignore leading blanks and TABS */ while (((c=str[i]) == ' ') || (c=='\t')) { i++; } /* See if the current char is a minus sign */ if (c == '-') { isPositive = NO; } for (; i<count; i++) { c = str[i]; if (c == '.') { numberOfDots++; if (numberOfDots > 1) { isNumeric = NO; } } else { if ((c>'9') || (c < '0')) { isNumeric = NO; } } } if (isNumeric && isInt && (((float)[aString intValue]) == [aString floatValue])) { isInt = YES; } else { isInt = NO; } if (entry_type == NSIntType) { if (isNumeric && isInt) { return YES; } else { return NO; } } else if (entry_type == NSPositiveIntType) { if (isNumeric && isInt && isPositive) { return YES; } else { return NO; } } else if (entry_type == NSFloatType) { if (isNumeric && (isInt == NO)) { return YES; } else { return NO; } } else if (entry_type == NSPositiveFloatType) { if (isNumeric && (isInt == NO) && isPositive) { return YES; } else { return NO; } } else if (entry_type == NSDoubleType) { if (isNumeric && (isInt == NO)) { return YES; } else { return NO; } } else if (entry_type == NSPositiveDoubleType) { if (isNumeric && (isInt == NO) && isPositive) { return YES; } else { return NO; } } } } return YES; } - (id)representedObject; { return represented_object; } - (void)setRepresentedObject:(id)anObject; { int i, count; NSCell *aCell; if (anObject == nil) { represented_object = nil; /* Set the instance variable, we're done. */ } else { represented_object = anObject; /* Set the instance variable */ count = [_allCells count]; /* * Look for an existing association between another cell * and anObject */ for (i=0; i<count; i++) { aCell = [_allCells objectAtIndex:i]; if ((aCell != self) && ([aCell representedObject] == anObject)) { [aCell setRepresentedObject:nil]; return; } } } } - (NSRect)titleRectForBounds:(NSRect)theRect; { #if 0 fprintf(stdout, "Cell titleRectForBounds: %d %d %d %d\n", theRect.origin.x, theRect.origin.y, theRect.size.width, theRect.size.height); #endif /* Goofy implementation for testing only */ return theRect; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.