This is MiscTabActionCell.m in view mode; [Download] [Up]
/* MiscTabActionCell.m * * By Bill Edney, Sean Hill, Mark Onyschuk, and Art Isbell * Copyright (C) 1996. Use governed by the MiscKit license. */ #import "MiscTabActionCell.h" #import <AppKit/AppKit.h> #import "MiscDrawTab.h" // pswrap that draws tab ends. static NSColor * scaleRGBColor(NSColor * color, float scale); static void drawTabLeft(int x, int y, int intImageWidth, int tabHeight, NSColor *strokeColor, NSColor *fillColor ); static void drawTabRight(int x, int y, int intImageWidth, int tabHeight, NSColor *strokeColor, NSColor *fillColor, NSColor *upperStrokeColor ); @implementation MiscTabActionCell //Not used ... - (id)init { [super init]; [self setType:NSTextCellType]; [self setColor:[NSColor lightGrayColor]]; [self setFont:[NSFont systemFontOfSize:12]]; [self setStringValue:@"Tatooo"]; return self; } // Methods Overridden From the Superclass - initTextCell:(NSString *)aString // Initializes a new instance of the receiver. { [super initTextCell:aString]; [self setColor:[NSColor lightGrayColor]]; [self setFont:[NSFont systemFontOfSize:12]]; return self; } - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeValueOfObjCType:"f" at:&tabHeight]; [coder encodeValueOfObjCType:"f" at:&tabBezierImageWidth]; [coder encodeObject:_color]; return; } - (id)initWithCoder:(NSCoder *)coder // Performs additional intialization of the receiver after decoding { NSColor *aColor; // do the superclass' initWithCoder method [super initWithCoder:coder]; // finish the initializing process [coder decodeValueOfObjCType:"f" at:&tabHeight]; [coder decodeValueOfObjCType:"f" at:&tabBezierImageWidth]; aColor = [coder decodeObject]; [self setColor:aColor]; [self updateForFont]; return self; } - (void)dealloc { // This cause IB to crash ... !!! Why ?????? // [_color autorelease]; [super dealloc]; } - (id)copyWithZone:(NSZone *)zone { MiscTabActionCell *cellCopy = [super copyWithZone:zone]; /* Assume that other initialization takes place here. */ cellCopy->_color = nil; [cellCopy setColor:[self color]]; return cellCopy; } - (void)updateForFont { float lineHeight, ascender, descender; NSFont *fontObj = [self font]; // Grab the font information for the contents of the cell ascender = [fontObj ascender]; descender = [fontObj descender]; lineHeight = [fontObj capHeight]; // Set tabHeight to match that in EOF IB's StackView. This results in a // height of 17 for Helvetica 12. tabHeight = lineHeight - descender + 5.0; // Set tabBezierImageWidth to provide reasonable scaling behavior. tabBezierImageWidth = tabHeight * 14.0 / 17.0; } - (void)setFont:(NSFont *)fontObj // Sets the receiver's font to <fontObj> and fetches font info used // during the receiver's display. { // Do the superclass' init method [super setFont:fontObj]; [self updateForFont]; } - (void)setColor:(NSColor *)aColor { // if(![_color isEqual:aColor]) { [_color autorelease]; _color = [scaleRGBColor(aColor,1.) retain]; _leftUpperSelectedStrokeColor = [scaleRGBColor(_color,1.8) retain]; _leftUpperStrokeColor = [scaleRGBColor(_color,(2.5/3.)) retain]; _rightStrokeColor = [scaleRGBColor(_color,(0.4)) retain]; _selectedFillColor = [scaleRGBColor(_color,1.) retain]; _fillColor = [scaleRGBColor(_color,0.6) retain]; // } } - (NSColor *)color { return _color; } - (void)takeColorFrom:sender { [self setColor:[sender color]]; } - (NSColor *)leftUpperSelectedStrokeColor { return _leftUpperSelectedStrokeColor; } - (NSColor *)leftUpperStrokeColor { return _leftUpperStrokeColor; } - (NSColor *)rightStrokeColor { return _rightStrokeColor; } - (NSColor *)selectedFillColor { return _selectedFillColor; } - (NSColor *)fillColor { return _fillColor; } - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:controlView // Draws the receiver inside <cellFrame> in view <controlView>. { float halfImageWidth = tabBezierImageWidth / 2.0; NSPoint leftImageOrigin, rightImageOrigin; float unselectedGray; NSRect textFrame, lowerBezelFrame; NSArray *controlCellList; int indx, intImageWidth = (int)(tabBezierImageWidth + 0.5); // if there are no contents, then punt... if (![self stringValue]) { return; } if([NSWindow defaultDepthLimit]<=NSBestDepth(NSCalibratedWhiteColorSpace, 2, 2, YES, NULL)) unselectedGray = NSDarkGray; else unselectedGray = 0.5; // if <controlView> is not a kind of Matrix (i.e. in IB) if (![controlView isKindOfClass:[NSMatrix class]]) { [super drawInteriorWithFrame:cellFrame inView:controlView]; return; } if ([controlView drawsBackground]) { [[controlView backgroundColor] set]; NSRectFill(cellFrame); } // fetch information about ourselves in our Matrix controlCellList = [controlView cells]; indx = [[controlView cells] indexOfObject:self]; // set up the lowerBezelFrame that will be used for drawing the bezel // at our bottom lowerBezelFrame = NSMakeRect(NSMinX(cellFrame) + halfImageWidth, NSMaxY(cellFrame)-1.0, NSWidth(cellFrame), 1.0); // set textFrame to cellFrame textFrame = cellFrame; // set up the leftImageOrigin leftImageOrigin.x = NSMinX(cellFrame); leftImageOrigin.y = NSMaxY(cellFrame); // if indx is 0 (we are the first cell) if (indx == 0) { // if we are selected if ([self isSelected]) { // Draw selected left tab bezier at leftImageOrigin. /* Misc_drawLeftTabBezier((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, NSWhite, NSLightGray); */ drawTabLeft((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, [self leftUpperSelectedStrokeColor], [self selectedFillColor]); } else { // Otherwise, draw left tab bezier at leftImageOrigin. /* Misc_drawLeftTabBezier((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, NSLightGray, unselectedGray); */ drawTabLeft((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, [self leftUpperStrokeColor], [self fillColor]); // subtract a half tabBezierImageWidth from lowerBezelFrame's x lowerBezelFrame.origin.x -= halfImageWidth; } // add a tabBezierImageWidth to textFrame's x textFrame.origin.x += tabBezierImageWidth; // subtract a tabBezierImageWidth plus half tabBezierImageWidth minus 1.0 // from textFrame's width textFrame.size.width -= tabBezierImageWidth + halfImageWidth - 1.0; } else { // subtract a half tabBezierImageWidth from leftImageOrigin's x leftImageOrigin.x -= halfImageWidth; // if the cell to left of us is selected if ([[[controlView cells] objectAtIndex:indx - 1] isSelected]) { // Draw left tab bezier at leftImageOrigin. /* Misc_drawLeftTabBezier((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, NSLightGray, unselectedGray); */ drawTabLeft((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, [self leftUpperStrokeColor], [self fillColor]); // Draw selected right tab bezier at leftImageOrigin. /* Misc_drawRightTabBezier((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, NSBlack, NSLightGray); */ drawTabRight((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, // [self rightStrokeColor], [[[controlView cells] objectAtIndex:indx-1] rightStrokeColor], [[[controlView cells] objectAtIndex:indx-1] selectedFillColor], [[[controlView cells] objectAtIndex:indx-1] leftUpperSelectedStrokeColor]); } else if ([self isSelected]) { // otherwise, if we are selected // Draw right tab bezier at leftImageOrigin. // composite tabEndImage to leftImageOrigin /* Misc_drawRightTabBezier((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, NSBlack, unselectedGray); */ drawTabRight((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, // [self rightStrokeColor], [[[controlView cells] objectAtIndex:indx-1] rightStrokeColor], [[[controlView cells] objectAtIndex:indx-1] fillColor], [[[controlView cells] objectAtIndex:indx-1] leftUpperStrokeColor]); // Draw selected left tab bezier at leftImageOrigin. /* Misc_drawLeftTabBezier((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, NSWhite, NSLightGray); */ drawTabLeft((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, [self leftUpperSelectedStrokeColor], [self selectedFillColor]); } else { // Draw left tab bezier at leftImageOrigin. /* Misc_drawLeftTabBezier((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, NSLightGray, unselectedGray); */ drawTabLeft((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, [self leftUpperStrokeColor], [self fillColor]); // Draw right tab bezier at leftImageOrigin. /* Misc_drawRightTabBezier((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, NSBlack, unselectedGray); */ drawTabRight((int)leftImageOrigin.x, (int)leftImageOrigin.y, intImageWidth, (int)tabHeight, // [self rightStrokeColor], [[[controlView cells] objectAtIndex:indx-1] rightStrokeColor], [[[controlView cells] objectAtIndex:indx-1] fillColor], [[[controlView cells] objectAtIndex:indx-1] leftUpperStrokeColor]); // subtract a half tabBezierImageWidth from lowerBezelFrame's x lowerBezelFrame.origin.x -= tabBezierImageWidth; // add 1.0 to lowerBezelFrame's width lowerBezelFrame.size.width += 1.0; } // add a half tabBezierImageWidth to textFrame's x textFrame.origin.x += halfImageWidth; // subtract a tabBezierImageWidth minus 1.0 from textFrame's width textFrame.size.width -= tabBezierImageWidth - 1.0; } // if indx is less than controlCellList's count minus 1 then we're // not the last cell, and... if (indx < [[controlView cells] count] - 1) { // draw the cell to the right of us [controlView drawCell:[[controlView cells] objectAtIndex:indx + 1]]; [controlView setNeedsDisplay:YES]; } /*********** WE ARE THE LAST CELL !!!! *************/ else { [controlView setNeedsDisplay:YES]; // set up the rightImageOrigin rightImageOrigin.x = NSMinX(cellFrame) + NSWidth(cellFrame) - tabBezierImageWidth; rightImageOrigin.y = NSMinY(cellFrame) + NSHeight(cellFrame); // if we are selected if ([self isSelected]) { // Draw selected right tab bezier at rightImageOrigin. /* Misc_drawRightTabBezier((int)rightImageOrigin.x, (int)rightImageOrigin.y, intImageWidth, (int)tabHeight, NSBlack, NSLightGray); */ drawTabRight((int)rightImageOrigin.x, (int)rightImageOrigin.y, intImageWidth, (int)tabHeight, [self rightStrokeColor], [self selectedFillColor], [self leftUpperSelectedStrokeColor] ); } else { // Draw right tab bezier at rightImageOrigin. /* Misc_drawRightTabBezier((int)rightImageOrigin.x, (int)rightImageOrigin.y, intImageWidth, (int)tabHeight, NSBlack, unselectedGray); */ drawTabRight((int)rightImageOrigin.x, (int)rightImageOrigin.y, intImageWidth, (int)tabHeight, [self rightStrokeColor], [self fillColor], [self leftUpperStrokeColor]); } // subtract a tabBezierImageWidth from textFrame's width textFrame.size.width -= halfImageWidth; // add a half tabBezierImageWidth to lowerBezelFrame's width lowerBezelFrame.size.width += halfImageWidth + 1.0; } //********************** erase the cell ***************** // if we are selected if ([self isSelected]) { // set our drawing color to NX_LTGRAY // PSsetgray(NSLightGray); [[self selectedFillColor] set]; } else { // PSsetgray(unselectedGray); [[self fillColor] set]; } textFrame.size.height = tabHeight; textFrame.origin.y = NSMaxY(cellFrame) - tabHeight; NSRectFill(textFrame); // fill in textFrame // NSRectFill(textFrame); //**************** now draw the upper bezel ************** // set our drawing color to NSWhite // if we are selected if ([self isSelected]) { // PSsetgray(NSWhite); [[self leftUpperSelectedStrokeColor] set]; } else { // PSsetgray(NSLightGray); [[self leftUpperStrokeColor] set]; } // set textFrame's height to 1.0 textFrame.size.height = 1.0; if (indx < [[controlView cells] count] - 1) { textFrame.size.width += 2.; } //Last tab else { textFrame.size.width += 0.; } // fill in textFrame NSRectFill(textFrame); //**************** now draw the text ************** // If we are enabled, draw NSBlack, else draw NSLightGray if ([self isEnabled]) PSsetgray(NSBlack); else PSsetgray(NSLightGray); // [lightColor set]; // draw the cell's contents if ([[NSDPSContext currentContext] isDrawingToScreen] && [[self font] screenFont]) [[[self font] screenFont] set]; else [[self font] set]; // The offsets were empirically set by emulating the StackView used in the // EOF IB's File Window. PSmoveto(NSMinX(textFrame) + 3.0, NSMinY(textFrame) + tabHeight - 4.0); PSshow([[self stringValue] cString]); //**************** draw the lower bezel **************** // if we are not selected if (![self isSelected]) { // draw the lower bezel // set our drawing color to NX_WHITE // PSsetgray(NSWhite); [[[[self controlView] selectedCell] leftUpperSelectedStrokeColor] set]; // fill in lowerBezelFrame NSRectFill(lowerBezelFrame); } [[controlView window] flushWindow]; } - (void)highlight:(BOOL)flag withFrame:(NSRect)cellFrame inView:(NSView *)aView { [super highlight:flag withFrame:cellFrame inView:aView]; [self drawInteriorWithFrame:cellFrame inView:aView]; } - (NSSize)cellSizeForBounds:(NSRect)aRect { NSSize theSize; theSize.height = tabHeight; theSize.width = (2*tabBezierImageWidth+ [[self font] widthOfString:[self stringValue]]); return theSize; } - (BOOL)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame ofView:(NSView *)controlView untilMouseUp:(BOOL)flag { BOOL boolValue = [super trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame ofView:controlView untilMouseUp:(BOOL)flag]; [controlView display]; [controlView setNeedsDisplay:YES]; if ([theEvent type] == NSLeftMouseUp) { [self setState:![self state]]; } return boolValue; } - (BOOL)startTrackingAt:(NSPoint)startPoint inView:aView { [aView sendAction]; return NO; } // Accessor Methods - (BOOL)isSelected { return ([self isHighlighted] || [self state]); } @end static NSColor * scaleRGBColor(NSColor * c, float scale) { return [NSColor colorWithCalibratedRed :[[c colorUsingColorSpaceName:NSCalibratedRGBColorSpace] redComponent]*scale green:[[c colorUsingColorSpaceName:NSCalibratedRGBColorSpace] greenComponent]*scale blue:[[c colorUsingColorSpaceName:NSCalibratedRGBColorSpace] blueComponent]*scale alpha:1.0]; } static void drawTabLeft(int x, int y, int intImageWidth, int tabHeight, NSColor *strokeColor, NSColor *fillColor ) { float stroke_red, stroke_green, stroke_blue; float fill_red, fill_green, fill_blue; stroke_red = [[strokeColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] redComponent]; stroke_green = [[strokeColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] greenComponent]; stroke_blue = [[strokeColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] blueComponent]; fill_red = [[fillColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] redComponent]; fill_green = [[fillColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] greenComponent]; fill_blue = [[fillColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] blueComponent]; Misc_drawColorLeftTabBezier((int)x, (int)y, intImageWidth, (int)tabHeight, stroke_red, stroke_green, stroke_blue, fill_red, fill_green, fill_blue); } static void drawTabRight(int x, int y, int intImageWidth, int tabHeight, NSColor *strokeColor, NSColor *fillColor, NSColor *upperStrokeColor ) { float stroke_red, stroke_green, stroke_blue; float fill_red, fill_green, fill_blue; float upper_stroke_red, upper_stroke_green, upper_stroke_blue; stroke_red = [[strokeColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] redComponent]; stroke_green = [[strokeColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] greenComponent]; stroke_blue = [[strokeColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] blueComponent]; fill_red = [[fillColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] redComponent]; fill_green = [[fillColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] greenComponent]; fill_blue = [[fillColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] blueComponent]; upper_stroke_red = [[upperStrokeColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] redComponent]; upper_stroke_green = [[upperStrokeColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] greenComponent]; upper_stroke_blue = [[upperStrokeColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] blueComponent]; //Il faut mofifier cette fonction pour rajouter la couleur du petit segment //du dessus. Misc_drawColorRightTabBezier((int)x, (int)y, intImageWidth, (int)tabHeight, stroke_red, stroke_green, stroke_blue, fill_red, fill_green, fill_blue, upper_stroke_red, upper_stroke_green, upper_stroke_blue); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.