diff --git a/ChangeLog b/ChangeLog index 20e126f49..61389ce54 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Mon Feb 15 12:20:00 1999 Richard Frith-Macdonald + + * Source/NSBrowserCell.m: Code by Benhur to handle flipped views + * Source/NSButtonCell.m: ditto + * Source/NSCell.m: ditto + * Source/NSScrollView.m: ditto + 1999-02-13 Michael Hanni * Small change to gui/Tools/GNUmakefile.preamble to allow for easy diff --git a/Source/NSBrowserCell.m b/Source/NSBrowserCell.m index 0fb890fb6..e594ab3d9 100644 --- a/Source/NSBrowserCell.m +++ b/Source/NSBrowserCell.m @@ -256,7 +256,7 @@ NSImage *image = nil; [_browserText drawWithFrame:title_rect inView: controlView]; if (image) // Draw the image - [self _displayImage:image inFrame:image_rect]; + [self _drawImage:image inFrame:image_rect]; } - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView diff --git a/Source/NSButtonCell.m b/Source/NSButtonCell.m index a7f232c38..51daa642b 100644 --- a/Source/NSButtonCell.m +++ b/Source/NSButtonCell.m @@ -42,6 +42,7 @@ #include #include #include +#include @@ -121,10 +122,11 @@ - (void)setAlternateTitle:(NSString *)aString { -NSString* _string = [aString copy]; + NSString* _string = [aString copy]; - ASSIGN(altContents, _string); - [self setState:[self state]]; // update our state + ASSIGN(altContents, _string); + [_string release]; + [self setState:[self state]]; // update our state } // @@ -300,11 +302,174 @@ NSString* _string = [aString copy]; // // Displaying // +- (NSColor *)textColor +{ + if (([self state] && ([self showsStateBy] & NSChangeGrayCellMask)) + || ([self isHighlighted] && ([self highlightsBy] & NSChangeGrayCellMask))) + return [NSColor lightGrayColor]; + return [NSColor blackColor]; +} + - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { - control_view = controlView; // Save last view cell was drawn to + float backgroundGray = NSLightGray; + + // do nothing if cell's frame rect is zero + if (NSIsEmptyRect(cellFrame)) + return; + + PSgsave (); + +//fprintf(stderr,"XRButtonCell drawWithFrame \n"); + + // Save last view drawn to + [self setControlView: controlView]; + + // determine the background color + if ([self state]) + { + if ( [self showsStateBy] + & (NSChangeGrayCellMask | NSChangeBackgroundCellMask) ) + backgroundGray = NSWhite; + } + + if ([self isHighlighted]) + { + if ( [self highlightsBy] + & (NSChangeGrayCellMask | NSChangeBackgroundCellMask) ) + backgroundGray = NSWhite; + } + + // set cell's background color + [[NSColor colorWithCalibratedWhite:backgroundGray alpha:1.0] set]; + NSRectFill(cellFrame); + + // draw the border if needed + if ([self isBordered]) + { + if ([self isHighlighted] && ([self highlightsBy] & NSPushInCellMask)) + { + NSDrawGrayBezel (cellFrame, cellFrame); + cellFrame = NSInsetRect (cellFrame, 2, 2); + } + else + { + NSDrawButton (cellFrame, cellFrame); + cellFrame = NSInsetRect (cellFrame, 2, 2); + } + } + +// NSRectClip (cellFrame); + [self drawInteriorWithFrame: cellFrame inView: controlView]; + + PSgrestore (); } +- (void)drawInteriorWithFrame: (NSRect)cellFrame inView: (NSView *)controlView +{ + BOOL showAlternate = NO; + unsigned int mask; + NSImage *imageToDisplay; + NSString *titleToDisplay; + NSSize imageSize = {0, 0}; + NSRect rect; + + cellFrame = NSInsetRect (cellFrame, xDist, yDist); + + // Determine the image and the title that will be + // displayed. If the NSContentsCellMask is set the + // image and title are swapped only if state is 1 or + // if highlighting is set (when a button is pushed it's + // content is changed to the face of reversed state). + if ([self isHighlighted]) + mask = [self highlightsBy]; + else + mask = [self showsStateBy]; + if (mask & NSContentsCellMask) + showAlternate = [self state]; + + if (showAlternate || [self isHighlighted]) + { + imageToDisplay = [self alternateImage]; + titleToDisplay = [self alternateTitle]; + if (!titleToDisplay) + titleToDisplay = [self title]; + } + else + { + imageToDisplay = [self image]; + titleToDisplay = [self title]; + } + + if (imageToDisplay) + imageSize = [imageToDisplay size]; + rect = NSMakeRect (cellFrame.origin.x, cellFrame.origin.y, + imageSize.width, imageSize.height); + + switch ([self imagePosition]) + { + case NSNoImage: + // draw title only + [self _drawText: titleToDisplay inFrame: cellFrame]; + break; + + case NSImageOnly: + // draw image only + [self _drawImage: imageToDisplay inFrame: cellFrame]; + break; + + case NSImageLeft: + // draw image to the left of the title + rect.origin = cellFrame.origin; + rect.size.width = imageSize.width; + rect.size.height = cellFrame.size.height; + [self _drawImage: imageToDisplay inFrame: rect]; + + // draw title + rect.origin.x += imageSize.width + xDist; + rect.size.width = cellFrame.size.width - imageSize.width - xDist; + [self _drawText: titleToDisplay inFrame: rect]; + break; + + case NSImageRight: + // draw image to the right of the title + rect.origin.x = NSMaxX (cellFrame) - imageSize.width; + rect.origin.y = cellFrame.origin.y; + rect.size.width = imageSize.width; + rect.size.height = cellFrame.size.height; + [self _drawImage:imageToDisplay inFrame:rect]; + + // draw title + rect.origin = cellFrame.origin; + rect.size.width = cellFrame.size.width - imageSize.width - xDist; + rect.size.height = cellFrame.size.height; + [self _drawText: titleToDisplay inFrame: rect]; + break; + case NSImageBelow: + // draw image below title + cellFrame.size.height /= 2; + [self _drawImage: imageToDisplay inFrame: cellFrame]; + cellFrame.origin.y += cellFrame.size.height; + [self _drawText: titleToDisplay inFrame: cellFrame]; + break; + + case NSImageAbove: + // draw image above title + cellFrame.size.height /= 2; + [self _drawText: titleToDisplay inFrame: cellFrame]; + cellFrame.origin.y += cellFrame.size.height; + [self _drawImage: imageToDisplay inFrame: cellFrame]; + break; + + case NSImageOverlaps: + // draw title over the image + [self _drawImage: imageToDisplay inFrame: cellFrame]; + [self _drawText: titleToDisplay inFrame: cellFrame]; + break; + } +} + + - (id)copyWithZone:(NSZone*)zone { NSButtonCell* c = [super copyWithZone:zone]; diff --git a/Source/NSCell.m b/Source/NSCell.m index 4f691cbcf..b0da8cd61 100644 --- a/Source/NSCell.m +++ b/Source/NSCell.m @@ -41,6 +41,7 @@ #include #include #include +#include @@ -236,14 +237,14 @@ NSString* number_string = [[NSNumber numberWithInt:anInt] stringValue]; - (void)setStringValue:(NSString *)aString { -NSString* _string; + NSString* _string; - if (!aString) - _string = @""; - else - _string = [aString copy]; + if (!aString) + _string = @""; + else + _string = [[aString copy] autorelease]; - ASSIGN(contents, _string); + ASSIGN(contents, _string); } // @@ -414,36 +415,135 @@ NSString* _string; - (NSView *)controlView { return control_view; } - (void)setControlView:(NSView*)view { control_view = view; } +- (NSColor *)textColor +{ + if ([self isEnabled]) + return [NSColor blackColor]; + else + return [NSColor darkGrayColor]; +} + +- (void) _drawText: (NSString *) title inFrame: (NSRect) cellFrame +{ + NSColor *textColor; + NSFont *font; + float titleWidth; + float titleHeight; + + if (!title) + return; + + textColor = [self textColor]; + + font = [self font]; + if (!font) + [NSException raise:NSInvalidArgumentException + format:@"Request to draw a text cell but no font specified!"]; + titleWidth = [font widthOfString: title]; + titleHeight = [font pointSize]; + + // Determine the y position of the text + cellFrame.origin.y = NSMidY (cellFrame) - titleHeight / 2; + cellFrame.size.height = titleHeight; + + // Determine the x position of text + switch ([self alignment]) + { + // ignore the justified and natural alignments + case NSLeftTextAlignment: + case NSJustifiedTextAlignment: + case NSNaturalTextAlignment: + break; + case NSRightTextAlignment: + if (titleWidth < NSWidth (cellFrame)) + { + float shift = NSWidth (cellFrame) - titleWidth; + cellFrame.origin.x += shift; + cellFrame.size.width -= shift; + } + break; + case NSCenterTextAlignment: + if (titleWidth < NSWidth (cellFrame)) + { + float shift = (NSWidth (cellFrame) - titleWidth) / 2; + cellFrame.origin.x += shift; + cellFrame.size.width -= shift; + } + } + + [font set]; + [textColor set]; + [title drawInRect:cellFrame withAttributes: nil]; +} + +// Draw image centered in frame. +- (void) _drawImage: (NSImage *) image inFrame: (NSRect) cellFrame +{ + NSSize size; + NSPoint position; + + if (!image) + return; + + size = [image size]; + position.x = NSMidX (cellFrame) - size.width / 2; + position.y = NSMidY (cellFrame) - size.height / 2; + [image compositeToPoint: position operation: NSCompositeCopy]; +} + - (void) drawInteriorWithFrame: (NSRect)cellFrame inView: (NSView*)controlView { + cellFrame = NSInsetRect (cellFrame, xDist, yDist); + switch ([self type]) { case NSTextCellType: - { - NSText *fieldEditor; - fieldEditor = [[controlView window] fieldEditor: YES forObject: self]; - [fieldEditor setString: [self stringValue]]; - [fieldEditor setAlignment: [self alignment]]; - [fieldEditor setFont: [self font]]; - [fieldEditor setDrawsBackground: NO]; - if ([self isEnabled]) - [fieldEditor setTextColor: [NSColor blackColor]]; - else - [fieldEditor setTextColor: [NSColor darkGrayColor]]; - [fieldEditor setFrame: cellFrame]; - [controlView addSubview: fieldEditor]; - break; - } + [self _drawText: [self stringValue] inFrame: cellFrame]; + break; case NSImageCellType: - [self _displayImage:cell_image inFrame:cellFrame]; - break; + [self _drawImage: [self image] inFrame: cellFrame]; + break; case NSNullCellType: break; } } -- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView -{ // implemented in back end +- (void)drawWithFrame: (NSRect)cellFrame inView: (NSView *)controlView +{ + NSDebugLog (@"NSCell drawWithFrame:inView:"); + + // We apply a clipping rectangle so save the graphics state + PSgsave (); + + // Save last view drawn to + [self setControlView: controlView]; + + // Clear the cell frame + if ([self isOpaque]) + { + [[NSColor lightGrayColor] set]; + NSRectFill(cellFrame); + } + + // draw the border if needed + if ([self isBordered]) + { + if ([self isBezeled]) + { + NSDrawWhiteBezel (cellFrame, cellFrame); + cellFrame = NSInsetRect (cellFrame, 2, 2); + } + else + { + NSFrameRect (cellFrame); + cellFrame = NSInsetRect (cellFrame, 1, 1); + } + } + + NSRectClip (cellFrame); + [self drawInteriorWithFrame: cellFrame inView: controlView]; + + PSgrestore (); } - (BOOL)isHighlighted { return cell_highlighted; } @@ -794,8 +894,19 @@ NSCell* c = [[isa allocWithZone: zone] init]; @implementation NSCell (GNUstepBackend) + (NSSize)sizeForBorderType:(NSBorderType)aType -{ // Returns the size of a - return NSZeroSize; // border +{ + // Returns the size of a border + switch (aType) + { + case NSLineBorder: + return NSMakeSize(1, 1); + case NSGrooveBorder: + case NSBezelBorder: + return NSMakeSize(2, 2); + case NSNoBorder: + default: + return NSZeroSize; + } } @end diff --git a/Source/NSScrollView.m b/Source/NSScrollView.m index bcb63a846..5bccbd5da 100644 --- a/Source/NSScrollView.m +++ b/Source/NSScrollView.m @@ -510,10 +510,10 @@ static Class rulerViewClass = nil; float horizLinePosition, horizLineLength = [self bounds].size.width; float borderThickness = 0; - fprintf (stderr, - "NSScrollView drawRect: origin (%1.2f, %1.2f), size (%1.2f, %1.2f)\n", - rect.origin.x, rect.origin.y, - rect.size.width, rect.size.height); +// fprintf (stderr, +// "NSScrollView drawRect: origin (%1.2f, %1.2f), size (%1.2f, %1.2f)\n", +// rect.origin.x, rect.origin.y, +// rect.size.width, rect.size.height); PSgsave (); switch ([self borderType])