This is Scale.c in view mode; [Download] [Up]
#if ( !defined(lint) && !defined(SABER))
static char PCN_rcsid[] = "$Header: /ufs/comp/mei/PROJ_PCN/onprofile/IFModel/Xsw/RCS/Scale.c,v 1.1 1992/04/17 18:26:39 mei Exp $";
#endif
/*AERO_MESG */
#include <math.h>
#include <X11/IntrinsicP.h>
#include "Xsw.h"
#include "ScaleP.h"
#define DIMENSION(widget) ( (widget->scale.vertical) ? (widget->core.height) : (widget->core.width) )
static XtResource resources[] = {
#define offset(field) XtOffset(ScaleWidget, scale.field)
{ XtNcallback, XtCCallback, XtRCallback, sizeof(XPointer),
offset(callback), XtRCallback, NULL },
{ XtNlongest, XtCLongest, XtRInt, sizeof(int),
offset(longest), XtRString, "0" },
{ XtNaxisLength, XtCAxisLength, XtRInt, sizeof(int),
offset(axis_length), XtRString, "0" },
{ XtNindent, XtCIndent, XtRInt, sizeof(int),
offset(indent), XtRString, "-1" },
{ XtNfont, XtCFont, XtRFontStruct, sizeof(XtPointer),
offset(font), XtRString, XtDefaultFont },
{ XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
offset(foreground), XtRString, XtDefaultForeground },
{ XtNmaximum, XtCMaximum, XtRFloat, sizeof(double),
offset(maximum), XtRString, "1.0" },
{ XtNminimum, XtCMinimum, XtRFloat, sizeof(double),
offset(minimum), XtRString, "0.0" },
{ XtNshowMax, XtCMaximum, XtRFloat, sizeof(double),
offset(maxinterval), XtRString, "1.0" },
{ XtNshowMin, XtCMinimum, XtRFloat, sizeof(double),
offset(mininterval), XtRString, "0.0" },
{ XtNvertical, XtCVertical, XtRBoolean, sizeof(Boolean),
offset(vertical), XtRString, "True" },
{ XtNlog, XtCLog, XtRBoolean, sizeof(Boolean),
offset(log), XtRString, "False" },
#undef offset
};
static void Initialize();
static void Redisplay();
static void Resize();
static void Destroy();
static Boolean SetValues();
static void SetScale();
ScaleClassRec scaleClassRec = {
{ /* core fields */
/* superclass */ (WidgetClass) &coreClassRec,
/* class_name */ "Scale",
/* widget_size */ sizeof(ScaleRec),
/* class_initialize */ NULL,
/* class_part_initialize */ NULL,
/* class_inited */ FALSE,
/* initialize */ Initialize,
/* initialize_hook */ NULL,
/* realize */ XtInheritRealize,
/* actions */ NULL,
/* num_actions */ 0,
/* resources */ resources,
/* num_resources */ XtNumber(resources),
/* xrm_class */ NULLQUARK,
/* compress_motion */ TRUE,
/* compress_exposure */ TRUE,
/* compress_enterleave */ TRUE,
/* visible_interest */ FALSE,
/* destroy */ Destroy,
/* resize */ Resize,
/* expose */ Redisplay,
/* set_values */ SetValues,
/* set_values_hook */ NULL,
/* set_values_almost */ XtInheritSetValuesAlmost,
/* get_values_hook */ NULL,
/* accept_focus */ NULL,
/* version */ XtVersion,
/* callback_private */ NULL,
/* tm_table */ NULL,
/* query_geometry */ XtInheritQueryGeometry,
/* display_accelerator */ XtInheritDisplayAccelerator,
/* extension */ NULL
},
{ /* template fields */
/* empty */ 0
}
};
WidgetClass scaleWidgetClass = (WidgetClass)&scaleClassRec;
int
XswScaleGetCoord(cw, value)
ScaleWidget cw;
double value;
{
int pos;
double temp, max, min, val;
/* hui 3/10 boundary check */
if(value < cw->scale.mininterval) value=cw->scale.mininterval;
if(value > cw->scale.maxinterval) value=cw->scale.maxinterval;
if (cw->scale.log) {
if (cw->scale.maxinterval > 0) max = log10(cw->scale.maxinterval);
else max = 0;
if (cw->scale.mininterval > 0) min = log10(cw->scale.mininterval);
else min = 0;
if (value > 0) val = log10(value);
else val = 0;
} else {
max = cw->scale.maxinterval;
min = cw->scale.mininterval;
val = value;
}
temp = (double)cw->scale.axis_length / (max - min);
pos = (int)(val > min ?
(val - min)*temp : 0) +
cw->scale.indent;
if (cw->scale.vertical)
pos = cw->core.height - pos;
return pos;
}
static void
GetAllGC(cw)
ScaleWidget cw;
{
XGCValues values;
XtGCMask mask = GCForeground | GCBackground | GCFont;
values.foreground = cw->core.background_pixel;
values.background = cw->core.background_pixel;
values.font = cw->scale.font->fid;
cw->scale.cleargc = XtGetGC((Widget) cw, mask, &values);
values.foreground = cw->scale.foreground;
cw->scale.normgc = XtGetGC((Widget) cw, mask, &values);
}
static void ShowList(cw)
ScaleWidget cw;
{
double dist, loc;
int len, ht;
double cur;
char buf[80];
double Del=0.0001;
if (cw->scale.axis_length <= 0) return;
dist = (double)cw->scale.axis_length / (double)cw->scale.numIntervals;
cur = cw->scale.mininterval;
if (cw->scale.vertical) {
loc = cw->core.height - cw->scale.indent;
dist = -dist;
} else {
loc = cw->scale.indent;
}
while (cur <= cw->scale.maxinterval + Del) {
sprintf (buf, "%g", cur);
if (cw->scale.vertical) {
ht = FONTHEIGHT(cw->scale.font);
len = XTextWidth (cw->scale.font, buf, strlen (buf));
XDrawString (XtDisplay(cw), XtWindow(cw), cw->scale.normgc,
cw->core.width - len,
loc + ht/2 <= cw->core.height ?
(int)loc + ht/2 : (int)loc,
buf, strlen (buf));
} else {
len = XTextWidth (cw->scale.font, buf, strlen (buf));
XDrawString (XtDisplay(cw), XtWindow(cw), cw->scale.normgc,
loc > len/2 ? (int)loc - len/2 : (int)loc,
cw->scale.font->max_bounds.ascent,
buf, strlen (buf));
}
loc += dist;
if (cw->scale.log) {
cur *= cw->scale.interval;
} else {
cur += cw->scale.interval;
}
}
}
/* ARGSUSED */
static void
Initialize(request, new)
ScaleWidget request, new;
{
GetAllGC(new);
SetScale(new);
if (new->scale.vertical) {
if (new->scale.indent < 0)
new->scale.indent = FONTHEIGHT(new->scale.font)/2 + 1;
if ((new->core.height >
new->scale.indent+FONTHEIGHT(new->scale.font)/2) &&
(new->scale.axis_length == 0)) {
new->scale.axis_length = new->core.height -
(new->scale.indent + FONTHEIGHT(new->scale.font)/2);
SetScale(new);
} else {
new->core.height = new->scale.axis_length + new->scale.indent +
FONTHEIGHT(new->scale.font)/2;
}
new->core.width = new->scale.longest > 0 ? new->scale.longest : 1;
new->scale.old_height = new->core.height;
} else {
if (new->scale.indent < 0)
new->scale.indent = new->scale.longest/2 + 1;
new->core.height = FONTHEIGHT(new->scale.font);
if ((new->core.width >
new->scale.indent+new->scale.longest/2) &&
(new->scale.axis_length == 0)) {
new->scale.axis_length = new->core.width -
(new->scale.indent + new->scale.longest/2);
SetScale(new);
} else {
new->core.width = new->scale.axis_length + new->scale.indent +
new->scale.longest/2;
}
new->scale.old_width = new->core.width;
}
}
/* ARGSUSED */
static void
Redisplay(cw, event)
ScaleWidget cw;
XExposeEvent *event;
{
if (!XtIsRealized((Widget) cw))
return;
ShowList(cw);
}
/* ARGSUSED */
static Boolean
SetValues(current, request, new)
Widget current, request, new;
{
ScaleWidget curcw = (ScaleWidget) current;
ScaleWidget newcw = (ScaleWidget) new;
Boolean redisplay = False;
if (curcw->scale.foreground != newcw->scale.foreground) {
if (newcw->scale.normgc)
XtReleaseGC((Widget) newcw, newcw->scale.normgc);
if (newcw->scale.cleargc)
XtReleaseGC((Widget) newcw, newcw->scale.cleargc);
GetAllGC(newcw);
redisplay = True;
}
if (curcw->scale.log != newcw->scale.log) {
redisplay = True;
}
if ((curcw->scale.maximum != newcw->scale.maximum) ||
(curcw->scale.minimum != newcw->scale.minimum)){
redisplay = True;
}
if (curcw->scale.axis_length != newcw->scale.axis_length) {
if (newcw->scale.vertical) {
newcw->core.width = newcw->scale.longest;
newcw->core.height = newcw->scale.axis_length+
FONTHEIGHT(newcw->scale.font)+newcw->scale.indent;
} else {
newcw->core.height = FONTHEIGHT(newcw->scale.font);
newcw->core.width = newcw->scale.axis_length +
newcw->scale.longest/2 + newcw->scale.indent;
newcw->scale.old_width = newcw->core.width;
}
}
SetScale(newcw);
return redisplay;
}
/* ARGSUSED */
static void
Resize(cw, event)
ScaleWidget cw;
XExposeEvent *event;
{
if (cw->scale.vertical) {
cw->scale.axis_length += cw->core.height - cw->scale.old_height;
cw->scale.old_height = cw->core.height;
} else {
cw->scale.axis_length += cw->core.width - cw->scale.old_width;
cw->scale.old_width = cw->core.width;
}
SetScale(cw);
}
static void
SetScale(cw)
ScaleWidget cw;
{
double interval, min, max, cur;
double old_max, old_min;
int nlabels, strwidth, maxwidth;
int maxsize;
double n;
char valbuf[80];
/* Set up x axis scaling, and x axis labels */
(void)sprintf (valbuf, "88%g", cw->scale.maximum);
strwidth = XTextWidth (cw->scale.font, valbuf, strlen (valbuf));
if (cw->scale.vertical) {
if ((nlabels = cw->scale.axis_length / FONTHEIGHT(cw->scale.font))
== 0) {
nlabels = 1;
}
} else {
if ((nlabels = cw->scale.axis_length / strwidth) == 0) {
nlabels = 1;
}
}
do {
if ((max = cw->scale.maximum) <= 0) max = 100.0;
min = cw->scale.minimum;
if (cw->scale.log) {
if (min <= 0.0) {
min = 0.1;
} else if (min > 1.0) {
min = 1.0;
}
if (min >= max) {
min = max/10;
}
log_scale (min, max, nlabels, &min, &max, &interval);
} else {
if (min >= max) {
if (min > 0) min = 0;
else if (min == 0) max = 1;
else max = 0;
}
linear_scale (min, max, nlabels, &min, &max, &interval);
}
if (interval > 0.0) {
if (cw->scale.log) {
n = (log10 (max) - log10 (min)) / log10 (interval);
} else {
n = (max-min) / interval;
}
} else {
n = max;
}
maxwidth = 0;
if (cw->scale.log) {
cur = min * interval;
} else {
cur = min + interval;
}
while (cur <= max) {
sprintf (valbuf, "88%g", cur);
if ((strwidth =
XTextWidth (cw->scale.font, valbuf, strlen (valbuf)))
> maxwidth) {
maxwidth = strwidth;
}
if (cw->scale.log) {
cur *= interval;
} else {
cur += interval;
}
}
if (cw->scale.vertical) {
maxsize = FONTHEIGHT(cw->scale.font);
} else {
maxsize = maxwidth;
}
nlabels -= 1;
} while (nlabels > 0 && ((int)n * maxsize) > cw->scale.axis_length);
old_max = cw->scale.maxinterval;
old_min = cw->scale.mininterval;
cw->scale.longest = maxwidth;
cw->scale.numIntervals = (int)n;
cw->scale.maxinterval = max;
cw->scale.mininterval = min;
cw->scale.interval = interval;
if ((cw->scale.maxinterval != old_max) ||
(cw->scale.mininterval != old_min)) {
XtCallCallbacks((Widget) cw, XtNcallback, NULL);
}
}
static void Destroy(cw)
ScaleWidget cw;
{
if (cw->scale.normgc)
XtReleaseGC((Widget) cw, cw->scale.normgc);
if (cw->scale.cleargc)
XtReleaseGC((Widget) cw, cw->scale.cleargc);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.