This is BarGauge.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ /* the current font size calculation is totally wrong and should be changed */ /* it should actually put a string into a certain font size, see how big it is compared to the space and /* rescale the font to fit the space */ #import "BarGauge.h" #import "strings.h" #define HEIGHT_LABLES 0.30 #define HEIGHT_NOLABEL 0.10 #define WIDTH_LABLES 0.30 #define WIDTH_NOLABEL 0.10 #define SPACING 3.0 /* spacing between labels and drawing */ #define TICBAR 4.0 /* thickness of a tic marker */ @implementation BarGauge + newFrame: (NXRect *) r { self = [super newFrame:r]; GaugeFlags.borderType = NX_BEZEL; [self refreshBackground:self]; return self; } - refreshBackground:sender; /* for some reason the vertical bars (height greater than width work as expect) /* but the horizonatal bars seem to have a reverse coordinate system /* sometimes (always?) */ /* could it be that locking focus on a bitmap causes view to have inveted /* coordinate systems? Maybe! */ { float LabelHOff,LabelWOff; float TicSpacing; int i; NXRect ticRect; /* to do fancy tics (which are really boxes) */ char labelStr[20]; /* The could never be this big */ /* (famous last words) */ int probTicSize; /*prob. max tic str size based on labelTicPat*/ id ticFont; sprintf(labelStr,GaugeDat.labelTicPat,GAUGEMAX); probTicSize = strlen(labelStr); if (!GaugeDat.labelTicPat || !*GaugeDat.labelTicPat) GaugeDat.labelTicPat = "%1.1f"; FaceRect = bounds; FaceRect.origin.x += SPACING; FaceRect.origin.y += SPACING; FaceRect.size.height -= 2*SPACING; FaceRect.size.width -= 2*SPACING; if (GaugeFlags.labelTicsOn){ LabelHOff = (HEIGHT_LABLES * NX_HEIGHT(&bounds)) + SPACING; LabelWOff = (WIDTH_LABLES * NX_WIDTH(&bounds)) + SPACING; } else { LabelHOff = (HEIGHT_NOLABEL * NX_HEIGHT(&bounds)); LabelWOff = (WIDTH_NOLABEL * NX_WIDTH(&bounds)); } [[GaugeDat.bm contentView] lockFocus]; PSsetlinewidth(0.0); PSsetgray(GaugeDat.backGray); NXRectFill(&bounds); /* do this in case no border */ PSsetgray(GaugeDat.faceGray); NXRectFill(&FaceRect); /* don't know if i should do this but */ FancyBack(&bounds); if (bounds.size.width > bounds.size.height){ /* do horizontal bar */ if (GaugeFlags.ticsOn){ FaceRect.origin.y += LabelHOff; FaceRect.size.height -= LabelHOff; } TicSpacing = (NX_WIDTH(&FaceRect)-TICBAR) / (GaugeDat.numMajor-1); ticFont = [Font newFont:GaugeDat.ticFontName size:(1.5*TicSpacing/probTicSize) /* 1.5 times is total kludge for now */ style:0 matrix:NX_IDENTITYMATRIX]; [ticFont set]; for (i = 0 ; i < GaugeDat.numMajor; i ++){ NX_X(&ticRect) = NX_X(&FaceRect)+(i*TicSpacing); NX_WIDTH(&ticRect) = TICBAR; if (GaugeFlags.labelTicsOn) NX_Y(&ticRect)=NX_Y(&FaceRect) - SPACING; else NX_Y(&ticRect)=NX_Y(&FaceRect) - LabelHOff; NX_HEIGHT(&ticRect)= NX_MAXY(&FaceRect)-NX_Y(&ticRect); if (GaugeFlags.labelTicsOn){ PSsetgray(GaugeDat.textGray); sprintf(labelStr,GaugeDat.labelTicPat, (i)*GaugeDat.ticSize + GaugeDat.startValue); PSmoveto(NX_X(&ticRect)- ((float)i/GaugeDat.numMajor)* ([ticFont getWidthOf:labelStr] - NX_WIDTH(&ticRect)), NX_Y(&bounds)+SPACING); PSshow(labelStr); } PSsetgray(GaugeDat.ticGray); if (GaugeFlags.borderType == NX_NOBORDER) NXFrameRect(&ticRect); else {FancyRect(&ticRect)} } if ((!GaugeFlags.labelTicsOn) && GaugeFlags.ticsOn) FaceRect.origin.y -= (LabelHOff / 2.0); }else{ /* do vertical bar */ if (GaugeFlags.ticsOn){ FaceRect.origin.x += LabelWOff; FaceRect.size.width -= LabelWOff; } TicSpacing = (NX_HEIGHT(&FaceRect)-TICBAR)/ (GaugeDat.numMajor-1); ticFont = [Font newFont:GaugeDat.ticFontName size:(1.5* TicSpacing/probTicSize) /* 1.5* is total kludge for now */ style:0 matrix:NX_IDENTITYMATRIX]; [ticFont set]; for (i=0; i < GaugeDat.numMajor; i++){ NX_Y(&ticRect) = NX_Y(&FaceRect) +(i*TicSpacing); NX_HEIGHT(&ticRect) = TICBAR; if (GaugeFlags.labelTicsOn) NX_X(&ticRect) = NX_X(&FaceRect)-SPACING; else NX_X(&ticRect) = NX_X(&FaceRect)-LabelWOff; NX_WIDTH(&ticRect)=NX_MAXX(&FaceRect)-NX_X(&ticRect); if (GaugeFlags.labelTicsOn){ PSsetgray(GaugeDat.textGray); sprintf(labelStr,GaugeDat.labelTicPat, i*GaugeDat.ticSize + GaugeDat.startValue); PSmoveto(NX_X(&bounds)+SPACING,NX_Y(&ticRect)- (((float)i/GaugeDat.numMajor)* ([ticFont pointSize]- NX_HEIGHT(&ticRect)))); PSshow(labelStr); } PSsetgray(GaugeDat.ticGray); if (GaugeFlags.borderType == NX_NOBORDER) NXFrameRect(&ticRect); else {FancyRect(&ticRect)} } if (!GaugeFlags.labelTicsOn && GaugeFlags.ticsOn) FaceRect.origin.x -= ( LabelWOff / 2.0); } if ((GaugeFlags.borderType == NX_NOBORDER) || (GaugeFlags.borderType == NX_LINE)){ PSsetlinewidth(SPACING); /* didn't affect it? */ NXFrameRect(&bounds); } PSstroke(); [[GaugeDat.bm contentView] unlockFocus]; [self display]; return self; } -drawSelf:(NXRect *)drawRects :(int)rectCount { NXRect dataRect; dataRect = FaceRect; PScomposite(0.0,0.0,bounds.size.width,bounds.size.height, GaugeDat.bmgState,0.0, 0.0,NX_COPY); /* now draw the bar */ PSsetgray(GaugeDat.ptGray); if (NX_WIDTH(&bounds) > NX_HEIGHT(&bounds)){ /* do horizontal bar */ dataRect.size.width = ((GaugeDat.value - GaugeDat.startValue) / GAUGESIZE) * NX_WIDTH(&dataRect); }else{ /* do vertical bar */ dataRect.size.height = ((GaugeDat.value - GaugeDat.startValue) / GAUGESIZE) * NX_HEIGHT(&dataRect); } if (GaugeFlags.borderType == NX_NOBORDER) { NXRectFill(&dataRect); if (GaugeFlags.overFlow) NXHighlightRect(&bounds); return self; /* exit quick */ } PSsetgray(GaugeDat.ticGray); FancyRect(&dataRect); if (GaugeFlags.overFlow) NXHighlightRect(&bounds); NXPing(); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.