This is FtpBrowserCell.m in view mode; [Download] [Up]
#import "FtpBrowserCell.h"
#import "FtpFile.h"
#import "FtpDirectory.h"
#import "NXmystd.h"
#define IMAGEMARGIN 0.0
#define FILESIZEWIDTH 32.0
#undef LEFT // filesize in the right
static NXAtom convertSize(long lsize)
{
char buf[1000];
char letter;
double size = lsize;
if (lsize == -1)
return NXUniqueString("???");
#if 0 // too big for 32bit :(
else if (size > 900e9) // Tera :)
{
size = size / (1024L*1024*1024*1024);
letter = 'T';
}
#endif
else if (size > 900e6)
{
size = size / (1024*1024*1024);
letter = 'G';
}
else if (size > 900e3)
{
size = size / (1024*1024);
letter = 'M';
}
else // if (size > 900)
{
size = size / 1024;
letter = 'K';
}
/*
else
{
letter = 0x80;
}
*/
//if (size < 1)
// size = 1;
sprintf(buf,"%0f",size);
buf[3] = letter;
buf[4] = '\0';
//fprintf(stderr,"%f = %s\n",size,buf);
if (buf[2] == '0')
{
if (buf[1] == '0')
{
if (buf[0] == '.')
{
buf[0] = '0';
buf[1] = letter;
buf[2] = '\0';
}
}
else if (buf[1] == '.')
{
buf[1] = letter;
buf[2] = '\0';
}
else if (buf[0] == '.')
{
buf[2] = letter;
buf[3] = '\0';
}
}
else if (buf[2] == '.')
{
buf[2] = letter;
buf[3] = '\0';
}
return NXUniqueString(buf);
}
@implementation FtpBrowserCell
- initTextCell:(const char *)aString;
{
needsUpdate = NO;
parentNeedsUpdate = NO;
isNew = NO;
myFile = nil;
return [super initTextCell:aString];
}
- setFile:aFile;
{
myFile = aFile;
return self;
}
- file;
{
return myFile;
}
- setFileSize:(long) size;
{
filesize = convertSize(size);
return self;
}
- setParentNeedsUpdate:(BOOL) flag;
{
parentNeedsUpdate = flag;
return self;
}
- (BOOL) parentNeedsUpdate;
{
return parentNeedsUpdate;
}
- setNeedsCheck:(BOOL) flag;
{
needsCheck = flag;
return self;
}
- (BOOL) needsCheck;
{
return needsCheck;
}
- setNeedsUpdate:(BOOL) flag;
{
needsUpdate = flag;
return self;
}
- (BOOL) needsUpdate;
{
return needsUpdate;
}
- setNeedsFirstUpdate:(BOOL) flag;
{
needsFirstUpdate = flag;
return self;
}
- (BOOL) needsFirstUpdate;
{
return needsFirstUpdate;
}
- setNew:(BOOL)flag;
{
isNew = flag;
return self;
}
- (BOOL) isNew;
{
return isNew;
}
- drawInside:(const NXRect *)cellFrame inView:controlView;
{
/* every CustomCell needs these */
static id knobImage = nil;
static id arrowImage = nil;
static id doubleArrowImage = nil;
static id newImage = nil;
static id dimpleImage = nil;
static id sharedTextCell = nil;
static id sharedFixedFont = nil;
static int sharedfilesizewidth = 0;
id theImage = nil;
NXRect rect = *cellFrame;
NXRect filesizerect;
NXPoint imageOrigin;
NXSize imageSize;
if (!knobImage) {
knobImage = [NXImage findImageNamed:"knob_nib"];
}
if (!arrowImage) {
arrowImage = [NXImage findImageNamed:"arrow"];
}
if (!doubleArrowImage) {
doubleArrowImage = [NXImage findImageNamed:"DBDoubleArrow"];
}
if (!newImage) {
newImage = [NXImage findImageNamed:"connectIcon_nib"];
}
if (!dimpleImage) {
dimpleImage = [NXImage findImageNamed:"dimple_nib"];
}
if ([myFile transferStatus] && ([myFile isFile] || [myFile shouldTransferIfNeeded]))
{
theImage = knobImage;
}
else if ([self isNew])
{
theImage = dimpleImage;
}
[knobImage getSize:&imageSize];
/* erase the cell */
PSsetgray((cFlags1.state || cFlags1.highlighted) ? NX_WHITE : NX_LTGRAY);
NXRectFill(cellFrame);
/* draw the left image */
imageOrigin.x = NX_X(cellFrame) + IMAGEMARGIN;
imageOrigin.y = NX_Y(cellFrame) + NX_HEIGHT(cellFrame) -
(NX_HEIGHT(cellFrame) - imageSize.height) / 2.0;
[theImage composite:NX_SOVER toPoint:&imageOrigin];
NX_WIDTH(&rect) -= (imageSize.width + IMAGEMARGIN * 2.0);// - NX_X(&rect));
NX_X(&rect) += imageSize.width; // + IMAGEMARGIN * 2.0;
/* draw the right image */
if (![self isLeaf])
{
if ([self needsFirstUpdate])
theImage = newImage;
else if ([self needsUpdate])
theImage = doubleArrowImage;
else if ([self needsCheck])
theImage = doubleArrowImage;
else
theImage = arrowImage;
[theImage getSize:&imageSize];
imageOrigin.x = NX_X(cellFrame) + NX_WIDTH(cellFrame) - IMAGEMARGIN - imageSize.width;
imageOrigin.y = NX_Y(cellFrame) + NX_HEIGHT(cellFrame) -
(NX_HEIGHT(cellFrame) - imageSize.height) / 2.0;
[theImage composite:NX_SOVER toPoint:&imageOrigin];
NX_WIDTH(&rect) -= (imageSize.width + IMAGEMARGIN * 2.0);// - NX_X(&rect));
}
if (!sharedTextCell) {
sharedTextCell = [[Cell alloc] init];
[sharedTextCell setWrap:NO];
}
if (!sharedFixedFont) {
sharedFixedFont = [Font newFont:"Ohlfs" size:10 matrix:NX_FLIPPEDMATRIX];
}
/*if (0 == sharedfilesizewidth) {
sharedfilesizewidth = [sharedFixedFont getWidthOf:"XXXX"];
}*/
if ([myFile isFile]&&![myFile isDummy])
{
static NXSize minSize;
[sharedTextCell setStringValue:filesize];
[sharedTextCell setAlignment:NX_RIGHTALIGNED];
[sharedTextCell setFont:sharedFixedFont];
[sharedTextCell setEnabled:NO];
[sharedTextCell calcCellSize:&minSize];
sharedfilesizewidth = minSize.width;
NX_WIDTH(&filesizerect) = sharedfilesizewidth;
NX_HEIGHT(&filesizerect) = NX_HEIGHT(&rect);
#ifdef LEFT
NX_X(&filesizerect) = NX_X(&rect);
#else
NX_X(&filesizerect) = NX_MAXX(&rect) - NX_WIDTH(&filesizerect);
#endif
NX_Y(&filesizerect) = NX_Y(&rect)+2;
[sharedTextCell drawInside:&filesizerect inView:controlView];
if (!strchr(filesize,'K'))
{
NX_X(&filesizerect)--;
[sharedTextCell drawInside:&filesizerect inView:controlView];
}
#ifndef LEFT
NX_WIDTH(&rect) -= sharedfilesizewidth;
#endif
}
#ifdef LEFT
NX_X(&rect) += sharedfilesizewidth;
NX_WIDTH(&rect) -= sharedfilesizewidth;
#endif
[sharedTextCell setStringValue:[self stringValue]];
[sharedTextCell setAlignment:NX_LEFTALIGNED];
//[sharedTextCell setFont:[Font userFontOfSize:10 matrix:NX_FLIPPEDMATRIX]];
[sharedTextCell setFont:[self font]];
[sharedTextCell setEnabled:[self isEnabled]];
[sharedTextCell drawInside:&rect inView:controlView];
/* all drawing from now on will be in dark gray */
PSsetgray(NX_DKGRAY);
/* draw the two dark gray lines above and below the cell */
if (cFlags1.state || cFlags1.highlighted) {
NXRect rectArray[2];
/*
* draw 1-pixel tall 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;
}
- highlight:(const NXRect *)cellFrame inView:controlView lit:(BOOL)flag
{
if (cFlags1.highlighted != flag) {
cFlags1.highlighted = flag;
[self drawInside:cellFrame inView:controlView];
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.