This is UITabActionCell.m in view mode; [Download] [Up]
#import "UITabActionCell.h"
#import <appkit/appkit.h>
#import <objc/List.h>
#define TAB_IMAGE_WIDTH 14.0
#define TAB_IMAGE_HEIGHT 17.0
#define HALF_TAB_WIDTH TAB_IMAGE_WIDTH / 2
@implementation UITabActionCell
// Methods Overridden From the Superclass
- initTextCell:(const char *)aString
// Initializes a new instance of the receiver.
{
[super initTextCell:aString];
// finish the initialization process
[self finishInitializing];
return self;
}
- awake
// Performs additional intialization of the receiver after reading
// from an NXTypedStream.
{
// do the superclass' awake method
[super awake];
// finish the initializing process
[self finishInitializing];
return self;
}
- setFont: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];
// Grab the font information for the contents of the cell
NXTextFontInfo(fontObj, &ascender, &descender, &lineHeight);
return self;
}
- drawInside:(const NXRect *)cellFrame inView:controlView
// Draws the receiver inside <cellFrame> in view <controlView>.
{
NXPoint leftImageOrigin,
rightImageOrigin;
NXRect textFrame,
lowerBezelFrame;
List *controlCellList;
int index;
// if there are no contents, then punt...
if (!contents) {
return self;
}
// if <controlView> is not a kind of Matrix (i.e. in IB)
if (![controlView isKindOf:[Matrix class]]) {
[super drawInside:cellFrame inView:controlView];
return self;
}
//PSsetgray(NX_DKGRAY);
//NXRectFill(cellFrame);
// fetch information about ourselves in our Matrix
controlCellList = [controlView cellList];
index = [controlCellList indexOf:self];
// set drawing to opaque
PSsetalpha(1.0);
// set up the lowerBezelFrame that will be used for drawing the bezel
// at our bottom
NXSetRect(&lowerBezelFrame,
NX_X(cellFrame) + HALF_TAB_WIDTH,
NX_MAXY(cellFrame) - 1.0,
NX_WIDTH(cellFrame),
1.0);
// set textFrame to cellFrame
textFrame = *cellFrame;
// set up the leftImageOrigin
leftImageOrigin.x = NX_X(cellFrame);
leftImageOrigin.y = NX_MAXY(cellFrame);
// if index is 0 (we are the first cell)
if (index == 0) {
// if we are selected
if ([self isSelected]) {
// composite tabBeginSelectedImage to leftImageOrigin
[tabBeginSelectedImage
composite:NX_SOVER
toPoint:&leftImageOrigin];
} else {
// otherwise, composite tabBeginImage to leftImageOrigin
[tabBeginImage
composite:NX_SOVER
toPoint:&leftImageOrigin];
// subtract a HALF_TAB_WIDTH from lowerBezelFrame's x
lowerBezelFrame.origin.x -= HALF_TAB_WIDTH;
}
// add a TAB_IMAGE_WIDTH to textFrame's x
textFrame.origin.x += TAB_IMAGE_WIDTH;
// subtract a TAB_IMAGE_WIDTH plus HALF_TAB_WIDTH minus 1.0
// from textFrame's width
textFrame.size.width -= TAB_IMAGE_WIDTH + HALF_TAB_WIDTH - 1.0;
} else {
// subtract a HALF_TAB_WIDTH from leftImageOrigin's x
leftImageOrigin.x -= HALF_TAB_WIDTH;
// if the cell to left of us is selected
if ([[controlCellList objectAt:index - 1] isSelected]) {
// composite tabBeginImage to leftImageOrigin
[tabBeginImage
composite:NX_SOVER
toPoint:&leftImageOrigin];
// composite tabEndSelectedImage to leftImageOrigin
[tabEndSelectedImage
composite:NX_SOVER
toPoint:&leftImageOrigin];
} else if ([self isSelected]) {
// otherwise, if we are selected
// composite tabEndImage to leftImageOrigin
[tabEndImage
composite:NX_SOVER
toPoint:&leftImageOrigin];
// composite tabBeginSelectedImage to leftImageOrigin
[tabBeginSelectedImage
composite:NX_SOVER
toPoint:&leftImageOrigin];
} else {
// composite tabBeginImage to leftImageOrigin
[tabBeginImage
composite:NX_SOVER
toPoint:&leftImageOrigin];
// composite tabEndImage to leftImageOrigin
[tabEndImage
composite:NX_SOVER
toPoint:&leftImageOrigin];
// subtract a HALF_TAB_WIDTH from lowerBezelFrame's x
lowerBezelFrame.origin.x -= TAB_IMAGE_WIDTH;
// add 1.0 to lowerBezelFrame's width
lowerBezelFrame.size.width += 1.0;
}
// add a HALF_TAB_WIDTH to textFrame's x
textFrame.origin.x += HALF_TAB_WIDTH;
// subtract a TAB_IMAGE_WIDTH minus 1.0 from textFrame's width
textFrame.size.width -= TAB_IMAGE_WIDTH - 1.0;
}
// if index is less than controlCellList's count minus 1 then we're
// not the last cell, and...
if (index < [controlCellList count] - 1) {
// draw the cell to the right of us
[controlView drawCell:[controlCellList objectAt:index + 1]];
} else {
// set up the rightImageOrigin
rightImageOrigin.x = NX_X(cellFrame) + NX_WIDTH(cellFrame)
- TAB_IMAGE_WIDTH;
rightImageOrigin.y = NX_Y(cellFrame) + NX_HEIGHT(cellFrame);
// if we are selected
if ([self isSelected]) {
// composite tabEndSelectedImage to rightImageOrigin
[tabEndSelectedImage
composite:NX_SOVER
toPoint:&rightImageOrigin];
} else {
// composite tabEndImage to rightImageOrigin
[tabEndImage
composite:NX_SOVER
toPoint:&rightImageOrigin];
}
// subtract a TAB_IMAGE_WIDTH from textFrame's width
textFrame.size.width -= HALF_TAB_WIDTH;
// add a HALF_TAB_WIDTH to lowerBezelFrame's width
lowerBezelFrame.size.width += HALF_TAB_WIDTH;
}
// erase the cell
// if we are selected
if ([self isSelected]) {
// set our drawing color to NX_LTGRAY
PSsetgray(NX_LTGRAY);
} else {
PSsetgray(.5);
}
textFrame.size.height = TAB_IMAGE_HEIGHT;
textFrame.origin.y = NX_MAXY(cellFrame)-TAB_IMAGE_HEIGHT;
// fill in textFrame
NXRectFill(&textFrame);
// now draw the upper bezel
// set our drawing color to NX_LTGRAY
PSsetgray(NX_LTGRAY);
// set textFrame's height to 1.0
textFrame.size.height = 1.0;
// fill in textFrame
NXRectFill(&textFrame);
// now draw the text
// set our drawing color to NX_BLACK
PSsetgray(NX_BLACK);
// draw the cell's contents
PSmoveto(NX_X(&textFrame),
NX_Y(&textFrame) + lineHeight - descender + 2.0);
PSshow(contents);
// if we are not selected
if (![self isSelected]) {
// draw the lower bezel
// set our drawing color to NX_WHITE
PSsetgray(NX_WHITE);
// fill in lowerBezelFrame
NXRectFill(&lowerBezelFrame);
}
return self;
}
// Other Instance Methods
- finishInitializing
{
// get the "tabBegin" image
if (!tabBeginImage) {
tabBeginImage = [NXImage findImageNamed:"TabBegin"];
}
// get the "tabEnd" image
if (!tabEndImage) {
tabEndImage = [NXImage findImageNamed:"TabEnd"];
}
// get the "tabBeginSelected" image
if (!tabBeginSelectedImage) {
tabBeginSelectedImage = [NXImage findImageNamed:"TabBeginSelected"];
}
// Get the "tabEndSelected" image
if (!tabEndSelectedImage) {
tabEndSelectedImage = [NXImage findImageNamed:"TabEndSelected"];
}
// all text displayed will be in Helvetica, 12 point
[self setFont:[Font newFont:"Helvetica" size:12.0]];
return self;
}
- highlight:(const NXRect *)cellFrame inView:aView lit:(BOOL)flag
{
[self drawInside:cellFrame inView:aView];
return self;
}
- calcCellSize:(NXSize *)theSize inRect:(const NXRect *)aRect
{
theSize->height = TAB_IMAGE_HEIGHT;
theSize->width = (2*TAB_IMAGE_WIDTH+
[[self font] getWidthOf:[self stringValue]]);
return self;
}
- (BOOL)isSelected
{
// return YES if either one of these flags are on
return (cFlags1.state || cFlags1.highlighted);
}
@endThese are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.