This is STAdjFontTextField.m in view mode; [Download] [Up]
/* STAdjFontTextField class, written by Robert Vasvari this class displays a string of any length by first: cutting down the size of the font until it reaches the specified minimum font second: the text will be truncated until it fits into the textfield setup: [adjFontTextObject setFont:"SomeFontName"]; [adjFontTextObject setAttributes:minsize :maxsize align:NX_CENTERED lines:1]; the numbers minsize and maxsize are indices in the array containing the known font sizes: 8,9,10,12,14, etc... So, 0 stands for point size 8, 1 for 9 etc... STAdjFontTextField will always try to use the maximum font size. STAdjFontTextField will use the specified alignment, such as NX_LEFTALIGNED, NX_CENTERED, etc. textGray defaults to NX_BLACK, backgroundGraydefaults to NX_LTGRAY */ #import <stdio.h> #import <stdlib.h> #import "STAdjFontTextField.h" #define BUFSIZE 1024 #define ELLIPSIS ('\274') @implementation STAdjFontTextField - initFrame:(const NXRect *)f { [super initFrame:f]; [self setSelectable:NO]; [self setBordered:NO]; [self setBackgroundGray:NX_LTGRAY]; [self setTextGray:NX_BLACK]; return self; } - setFontString:(const char *)aFont { fontString=aFont; font=[self font]; return self; } - setAttributes:(int)min :(int)max align:(int)aMode lines:(int)numLines { minSize=min; maxSize=max; curSize=0; [cell setAlignment:aMode]; lines=numLines; return self; } - setStringValue:(const char *)text { static float sizes[]={8.0,9.0,10.0,11.0,12.0,14.0,16.0,18.0, 24.0,36.0,48.0,64.0}; NXSize s; NXRect r=frame; r.size.height=36.0; [super setStringValue:text]; if(curSize!=maxSize) { font=[Font newFont:fontString size:sizes[maxSize] matrix:NX_FLIPPEDMATRIX]; [self setFont:font]; curSize=maxSize; } [cell calcCellSize:&s inRect:&r]; while(curSize>0 && (int)(s.height/sizes[curSize])>lines) { curSize--; font=[Font newFont:fontString size:sizes[curSize] matrix:NX_FLIPPEDMATRIX]; [self setFont:font]; [cell calcCellSize:&s inRect:&r]; } if(!curSize) { /* the text is still too large let's cut it down */ char *p, shortNameBuf[BUFSIZE+1]=""; strcpy(shortNameBuf,text); p=strchr(shortNameBuf,'\0'); while((int)(s.height/sizes[curSize])>lines) { p--; *p=ELLIPSIS; p[1]='\0'; [super setStringValue:shortNameBuf]; [cell calcCellSize:&s inRect:&r]; } [cell calcCellSize:&s inRect:&r]; } [self sizeTo:bounds.size.width :s.height]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.