This is SubCell.m in view mode; [Download] [Up]
/*
* Copyright (C) 1993 Robert Davis
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of Version 2, or any later version, of
* the GNU General Public License as published by the Free Software
* Foundation.
*/
static char RCSId[]="$Id: SubCell.m,v 1.5 1993/05/04 16:22:56 davis Exp $";
/*
* Based on CustomCell in the NeXT Developer Example ScrollDoodScroll
* by Jayson Adams.
*/
#import <appkit/Font.h>
#import <appkit/NXImage.h>
#import <appkit/Text.h> /* NXTextFontInfo() */
#import <dpsclient/wraps.h>
#import "SubCell.h"
#import "SubObject.h"
#define FIRST_COLUMN_START 4.0
#define TEXT_COLUMN_START 20.0
@implementation SubCell
static id attachmentImage = nil;
static NXSize imageSize;
+ initialize
{
/* Get the "attachment" image -- like the image in NeXTMail */
if (!attachmentImage) {
attachmentImage = [NXImage findImageNamed:"Attachment"];
[attachmentImage getSize:&imageSize];
}
return self;
}
- init
{
[super init];
[self setStringValue:""];
return self;
}
- setFont:fontObj
{
[super setFont:fontObj];
/*
* Save this info so we don't have to look it up every time we
* draw. Note: "support" for a text Cell is a font object.
*/
NXTextFontInfo(support, &ascender, &descender, &lineHeight);
return self;
}
- drawInside:(const NXRect *)cellFrame inView:controlView
{
NXPoint imageOrigin;
NXRect rectArray[2];
/* Set the font according to our drawing status. */
if (NXDrawingStatus == NX_DRAWING)
[[support screenFont] set];
else
[support set];
/* Erase the cell. */
PSsetgray((cFlags1.state || cFlags1.highlighted) ? NX_WHITE : NX_LTGRAY);
NXRectFill(cellFrame);
/* Draw the "attachment" image, if the SubObject wants us to. */
if (showAttachment) {
imageOrigin.x = FIRST_COLUMN_START;
imageOrigin.y = NX_Y(cellFrame) + NX_HEIGHT(cellFrame) - 1
- (NX_HEIGHT(cellFrame) - imageSize.height) / 2.0;
[attachmentImage composite:NX_PLUSD toPoint:&imageOrigin];
}
/* Draw the text. */
PSsetgray(NX_BLACK);
PSmoveto(NX_X(cellFrame) + TEXT_COLUMN_START,
NX_Y(cellFrame) + lineHeight - descender);
PSshow(contents);
/* Draw the two dark gray lines above and below the cell. */
PSsetgray(NX_DKGRAY);
if (cFlags1.state || cFlags1.highlighted) {
/*
* Draw 1-pixel-high 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;
}
/*
* This class implements the SubCell category of Cell. Every cell
* that does so has associated with it an object which stores the
* information that the Cell displays. When the sub object is set,
* we set our instance variables to match it.
*/
- setSubObject:anObject
{
if (anObject) {
const char *aString;
subObject = anObject;
aString = [subObject stringValue];
[self setStringValue: aString? aString: ""];
showAttachment = [subObject isAttachment];
return self;
} else
return nil;
}
- subObject
{
return subObject;
}
// Shuts up the compiler about unused RCSId
- (const char *) rcsid
{
return RCSId;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.