This is TabMatrix.m in view mode; [Download] [Up]
/*
these methods are adopted from Bill Edney,
slightly modified by Heinrich Giesen 1996
*/
//#import "DarkGrayView.h"
#import "TabMatrix.h"
@implementation DarkGrayView
- drawSelf:(const NXRect *)rects :(int)count
{
PSsetgray(NX_DKGRAY); /* Set our drawing color to NX_DKGRAY */
NXRectFill(&bounds); /* Fill in our bounds */
return self;
}
@end
#define TAB_IMAGE_WIDTH 14.0
#define TAB_IMAGE_HEIGHT 17.0
#define HALF_TAB_WIDTH 7.0
static id tabBeginImage = nil; /* The "tabBegin" image */
static id tabEndImage = nil; /* The "tabEnd" image */
static id tabBeginSelectedImage = nil; /* The "tabBeginSelected" image */
static id tabEndSelectedImage = nil; /* The "tabEndSelected" image */
@implementation TabSelectionCell
/* Methods overridden from superclass */
- initTextCell:(const char *)aString
{
[super initTextCell:aString];
[self finishInitializing]; /* Finish the initializing process */
return self;
}
- awake
{
[super awake]; /* Do the superclass' awake method */
[self finishInitializing]; /* Finish the initializing process */
return self;
}
- setFont:fontObj
{
[super setFont:fontObj]; /* Do the superclass' init method */
/* Grab the font information for the contents of the cell */
NXTextFontInfo(fontObj,&ascender,&descender,&lineHeight);
return self;
}
- drawInside:(const NXRect *)cellFrame inView:controlView
{
NXPoint leftImageOrigin,rightImageOrigin;
NXRect textFrame,lowerBezelFrame;
id controlCellList = [controlView cellList];
int ourIndex = [controlCellList indexOf:self];
NXCoord delta;
if (!contents) { /* If there are no contents */
return self; /* Exit here! */
}
delta = NX_HEIGHT(cellFrame) - TAB_IMAGE_HEIGHT;
PSsetalpha(1.0); /* Set the drawing to be totally opaque */
/* 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 - delta,
NX_WIDTH(cellFrame),
1.0);
textFrame = *cellFrame; /* Set textFrame to cellFrame */
/* Set up the leftImageOrigin */
leftImageOrigin.x = NX_X(cellFrame);
leftImageOrigin.y = NX_MAXY(cellFrame) - delta;
if (ourIndex == 0) { /* If ourIndex is 0 (we are the first cell) */
if ([self isSelected]) { /* If we are selected */
/* 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:ourIndex-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 ourIndex is less than controlCellList's count minus 1 (we are not
the last cell) */
if (ourIndex < [controlCellList count]-1) {
/* Draw the cell to the right of us */
[controlView drawCell:[controlCellList objectAt:ourIndex+1]];
}
else { //€we are the last cell
/* Set up the rightImageOrigin */
rightImageOrigin.x = NX_X(cellFrame) + NX_WIDTH(cellFrame)
- TAB_IMAGE_WIDTH ;
rightImageOrigin.y = NX_Y(cellFrame) + NX_HEIGHT(cellFrame) - delta;
/* 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 */
PSsetgray( [self isSelected] ? NX_LTGRAY:0.5 ); // drawing color
NXRectFill(&textFrame); /* Fill in textFrame */
/* Now draw the upper bezel */
PSsetgray(NX_LTGRAY); /* Set our drawing color to NX_LTGRAY */
textFrame.size.height = 1.0; /* Set textFrame's height to 1.0 */
NXRectFill(&textFrame); /* Fill in textFrame */
/* Now draw the text */
PSsetgray(NX_BLACK); /* Set our drawing color to NX_BLACK */
/* Draw the cell's contents */
PSmoveto(NX_X(&textFrame)+3.0,NX_Y(&textFrame)+lineHeight-descender+1.0);
[[self font] set]; // else PS error: font missing
PSshow(contents);
if (![self isSelected]) { /* If we are not selected */
/* Draw the lower bezel */
PSsetgray(NX_WHITE); /* Set our drawing color to NX_WHITE */
NXRectFill(&lowerBezelFrame); /* Fill in lowerBezelFrame */
}
return self;
}
/* Other instance methods */
- finishInitializing
{
if (tabBeginImage) return self; // images are loaded
tabBeginImage = [NXImage findImageNamed:"Images/TabBegin"];
tabEndImage = [NXImage findImageNamed:"Images/TabEnd"];
tabBeginSelectedImage = [NXImage findImageNamed:"Images/TabBeginSelected"];
tabEndSelectedImage = [NXImage findImageNamed:"Images/TabEndSelected"];
/* All text displayed will be in Helvetica, 12 point */
[self setFont:[Font newFont:"Helvetica" size:12.0]];
return self;
}
- (BOOL)isSelected
{
/* Return YES if either one of these flags are on */
return (cFlags1.state || cFlags1.highlighted);
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.