This is PXKButtonCell.m in view mode; [Download] [Up]
/* PXKButtonCell.m NSButtonCell for GNUstep GUI X/DPS Backend Copyright (C) 1996 Free Software Foundation, Inc. Author: Scott Christley <scottc@net-community.com> Date: March 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/PXKButtonCell.h> #include <gnustep/xdps/PXKView.h> #include <gnustep/xdps/PXKWindow.h> #include <gnustep/xdps/PXKDPSContext.h> @implementation PXKButtonCell /* Assumes frame has already been translated to X coordinates */ - (void)drawImage:(NSRect)cellFrame; { #if 0 const PXKRect *r = newFrame; frame = r[0]; #endif NSPoint location; NSSize size; NSImage *image; /* * Place image centered for now */ #if 0 location.x = 3; location.y = 3; #endif image = [self image]; if (image) { size = [image size]; location.x = cellFrame.size.width /2.0 - size.width/2.0; location.y = cellFrame.size.height/2.0 - size.height/2.0; //[image drawInView:self at:&location]; } } /* Assumes frame has already been translated to X coordinates */ - (void)drawBorder:(NSRect)cellFrame; { // No border then don't draw it if ([self isBordered] == NO) { return; } if (cell_type == NSMomentaryChangeButton) { [self drawBorderUp: cellFrame]; return; } if (cell_state == 0) { [self drawBorderUp: cellFrame]; } else { [self drawBorderDown: cellFrame]; } } /* Assumes frame has already been translated to X coordiantes */ - (void)drawBorderDown:(NSRect)cellFrame; { Window xWindow = [(PXKWindow *)[control_view window] xWindow]; Display *xdisplay = [(PXKDPSContext *)[NSDPSContext currentContext] xDisplay]; // draw the bottom and right lit edges XDrawLine(xdisplay, xWindow, pxkWhiteGC, cellFrame.origin.x, cellFrame.origin.y + cellFrame.size.height-1, cellFrame.origin.x + cellFrame.size.width-1, cellFrame.origin.y + cellFrame.size.height-1); XDrawLine(xdisplay, xWindow, pxkWhiteGC, cellFrame.origin.x + cellFrame.size.width-1, cellFrame.origin.y, cellFrame.origin.x + cellFrame.size.width-1, cellFrame.origin.y + cellFrame.size.height-1); /* XDrawLine(xdisplay, xWindow, pxkWhiteGC, cellFrame.origin.x + 2, cellFrame.origin.y + cellFrame.size.height-2, cellFrame.origin.x + cellFrame.size.width-2, cellFrame.origin.y + cellFrame.size.height-2); XDrawLine(xdisplay, xWindow, pxkWhiteGC, cellFrame.origin.x + cellFrame.size.width-2, cellFrame.origin.y + 1, cellFrame.origin.x + cellFrame.size.width-2, cellFrame.origin.y + cellFrame.size.height-2); */ // draw the top and left dark edges XDrawLine(xdisplay, xWindow, pxkBlackGC, cellFrame.origin.x, cellFrame.origin.y, cellFrame.origin.x + cellFrame.size.width-2, cellFrame.origin.y); XDrawLine(xdisplay, xWindow, pxkBlackGC, cellFrame.origin.x, cellFrame.origin.y, cellFrame.origin.x, cellFrame.origin.y + cellFrame.size.height-2); } /* Assumes frame has already been translated to X coordiantes */ - (void)drawBorderUp:(NSRect)cellFrame; { Window xWindow = [(PXKWindow *)[control_view window]xWindow]; Display *xdisplay = [(PXKDPSContext *)[NSDPSContext currentContext] xDisplay]; // draw the bottom and right dark edges XDrawLine(xdisplay, xWindow, pxkBlackGC, cellFrame.origin.x, cellFrame.origin.y + cellFrame.size.height-1, cellFrame.origin.x + cellFrame.size.width-1, cellFrame.origin.y + cellFrame.size.height-1); XDrawLine(xdisplay, xWindow, pxkBlackGC, cellFrame.origin.x + cellFrame.size.width-1, cellFrame.origin.y, cellFrame.origin.x + cellFrame.size.width-1, cellFrame.origin.y + cellFrame.size.height-1); /* XDrawLine(xdisplay, xWindow, pxkDarkgrayGC, cellFrame.origin.x + 2, cellFrame.origin.y + cellFrame.size.height-2, cellFrame.origin.x + cellFrame.size.width-2, cellFrame.origin.y + cellFrame.size.height-2); XDrawLine(xdisplay, xWindow, pxkDarkgrayGC, cellFrame.origin.x + cellFrame.size.width-2, cellFrame.origin.y + 1, cellFrame.origin.x + cellFrame.size.width-2, cellFrame.origin.y + cellFrame.size.height-2); */ // draw the top and left lit edges XDrawLine(xdisplay, xWindow, pxkWhiteGC, cellFrame.origin.x, cellFrame.origin.y, cellFrame.origin.x + cellFrame.size.width-2, cellFrame.origin.y); XDrawLine(xdisplay, xWindow, pxkWhiteGC, cellFrame.origin.x, cellFrame.origin.y, cellFrame.origin.x, cellFrame.origin.y + cellFrame.size.height-2); } /* Assumes frame has already been translated to X coordiantes */ - (void)drawText:(NSRect)cellFrame; { Window xWindow = [(PXKWindow *)[control_view window]xWindow]; NSDPSContext *cur = [NSDPSContext currentContext]; Display *xdisplay = [(PXKDPSContext *)cur xDisplay]; float len1; float width1; int x, y; float font_height; NSString *title; XFontStruct *win_font; NSColor *c = [NSColor blackColor]; GC xgc; (void)load_font(&win_font); title = [self title]; if (title) { /* need length for both XTextWidth and XDrawString */ len1 = [title length]; if (!win_font) { fprintf(stderr, "Error loading font. Exiting.\n"); exit(-1); } /* get string widths for centering */ width1 = (float)XTextWidth(win_font, [title cString], len1); font_height = win_font->ascent + win_font->descent; x = (int)(cellFrame.origin.x + ((cellFrame.size.width - width1)/2.0)); y = (int)(cellFrame.origin.y + (float)win_font->ascent + ((cellFrame.size.height - font_height)/2.0)); NSLog(@"PXKButtonCell text %f %f %d %d %f\n", width1, font_height, x, y, cellFrame.size.width); } #if 0 /* output text, centered on each line */ XDrawString(xDisplay, xWindow, win_gc, 5, font_height, stringValue, len1); #else // Set the color in the current GC [c set]; xgc = [(PXKDPSContext *)cur xGC]; if (title) { if (cell_state == 0) { /* output text, centered on each line */ XDrawString(xdisplay, xWindow, xgc, x, y, [title cString], len1); } else { XDrawString(xdisplay, xWindow, xgc, x + 1, y + 1, [title cString], len1); } } #endif } // OpenStep drawing methods - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { Window xWindow = [(PXKWindow *)[control_view window]xWindow]; Display *xdisplay = [(PXKDPSContext *)[NSDPSContext currentContext] xDisplay]; NSRect xframe = [[[controlView window] contentView] bounds]; NSRect cf = [controlView convertRect: cellFrame toView: nil]; // Flip the coordinate system cf.origin.y = xframe.size.height - cf.size.height - cf.origin.y; // Fill the interior if (cell_state == 0) XFillRectangle(xdisplay, xWindow, pxkLightgrayGC, cf.origin.x + 1, cf.origin.y + 1, cf.size.width - 2, cf.size.height - 2); else XFillRectangle(xdisplay, xWindow, pxkWhiteGC, cf.origin.x + 1, cf.origin.y + 1, cf.size.width - 2, cf.size.height - 2); // Draw the image or the text if (cell_type == NSImageCellType) [self drawImage: cf]; else [self drawText: cf]; } - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { NSRect xframe = [[[controlView window] contentView] bounds]; NSRect cf = [controlView convertRect: cellFrame toView: nil]; // Flip the coordinate system cf.origin.y = xframe.size.height - cf.size.height - cf.origin.y; // Save last view drawn to control_view = controlView; // now draw it [self drawBorder:cf]; [self drawInteriorWithFrame: cellFrame inView: controlView]; } - (void)highlight:(BOOL)lit withFrame:(NSRect)cellFrame inView:(NSView *)controlView { cell_highlighted = lit; cell_state = lit; [self drawWithFrame: cellFrame inView: controlView]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.