743 lines
21 KiB
C
743 lines
21 KiB
C
|
#include <cdk.h>
|
||
|
|
||
|
/*
|
||
|
* $Author: garbled $
|
||
|
* $Date: 2001/01/04 19:58:08 $
|
||
|
* $Revision: 1.1.1.1 $
|
||
|
*/
|
||
|
|
||
|
DeclareCDKObjects(my_funcs,Histogram);
|
||
|
|
||
|
/*
|
||
|
* This creates a histogram widget.
|
||
|
*/
|
||
|
CDKHISTOGRAM *newCDKHistogram (CDKSCREEN *cdkscreen, int xplace, int yplace, int height, int width, int orient, char *title, boolean Box, boolean shadow)
|
||
|
{
|
||
|
/* Declare local variables. */
|
||
|
CDKHISTOGRAM *histogram = newCDKObject(CDKHISTOGRAM, &my_funcs);
|
||
|
int parentWidth = getmaxx(cdkscreen->window);
|
||
|
int parentHeight = getmaxy(cdkscreen->window);
|
||
|
int boxWidth = width;
|
||
|
int boxHeight = height;
|
||
|
int xpos = xplace;
|
||
|
int ypos = yplace;
|
||
|
int oldWidth = 0;
|
||
|
int oldHeight = 0;
|
||
|
char **temp = 0;
|
||
|
int x;
|
||
|
|
||
|
/*
|
||
|
* If the height is a negative value, the height will
|
||
|
* be ROWS-height, otherwise, the height will be the
|
||
|
* given height.
|
||
|
*/
|
||
|
boxHeight = setWidgetDimension (parentHeight, height, 2);
|
||
|
oldHeight = boxHeight;
|
||
|
|
||
|
/*
|
||
|
* If the width is a negative value, the width will
|
||
|
* be COLS-width, otherwise, the width will be the
|
||
|
* given width.
|
||
|
*/
|
||
|
boxWidth = setWidgetDimension (parentWidth, width, 0);
|
||
|
oldWidth = boxWidth;
|
||
|
|
||
|
/* Translate the char * items to chtype * */
|
||
|
if (title != 0)
|
||
|
{
|
||
|
/* We need to split the title on \n. */
|
||
|
temp = CDKsplitString (title, '\n');
|
||
|
histogram->titleLines = CDKcountStrings (temp);
|
||
|
|
||
|
/* For each line in the title, convert from char * to chtype * */
|
||
|
for (x=0; x < histogram->titleLines; x++)
|
||
|
{
|
||
|
histogram->title[x] = char2Chtype (temp[x], &histogram->titleLen[x], &histogram->titlePos[x]);
|
||
|
histogram->titlePos[x] = justifyString (boxWidth, histogram->titleLen[x], histogram->titlePos[x]);
|
||
|
}
|
||
|
|
||
|
CDKfreeStrings(temp);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* No title? Set the required variables. */
|
||
|
histogram->titleLines = 0;
|
||
|
}
|
||
|
|
||
|
/* Increment the height by the number of lines in the title. */
|
||
|
boxHeight += histogram->titleLines;
|
||
|
|
||
|
/*
|
||
|
* Make sure we didn't extend beyond the dimensions of the window.
|
||
|
*/
|
||
|
boxWidth = MINIMUM (boxWidth, parentWidth);
|
||
|
boxHeight = MINIMUM (boxHeight, parentHeight);
|
||
|
|
||
|
/* Rejustify the x and y positions if we need to. */
|
||
|
alignxy (cdkscreen->window, &xpos, &ypos, boxWidth, boxHeight);
|
||
|
|
||
|
/* Create the histogram pointer. */
|
||
|
ScreenOf(histogram) = cdkscreen;
|
||
|
histogram->parent = cdkscreen->window;
|
||
|
histogram->win = newwin (boxHeight + !!shadow, boxWidth + !!shadow, ypos, xpos);
|
||
|
histogram->boxWidth = boxWidth;
|
||
|
histogram->boxHeight = boxHeight;
|
||
|
histogram->fieldWidth = boxWidth-2;
|
||
|
histogram->fieldHeight = boxHeight-histogram->titleLines-2;
|
||
|
histogram->orient = orient;
|
||
|
histogram->shadow = shadow;
|
||
|
histogram->ULChar = ACS_ULCORNER;
|
||
|
histogram->URChar = ACS_URCORNER;
|
||
|
histogram->LLChar = ACS_LLCORNER;
|
||
|
histogram->LRChar = ACS_LRCORNER;
|
||
|
histogram->HChar = ACS_HLINE;
|
||
|
histogram->VChar = ACS_VLINE;
|
||
|
histogram->BoxAttrib = A_NORMAL;
|
||
|
|
||
|
/* Is the window null. */
|
||
|
if (histogram->win == 0)
|
||
|
{
|
||
|
/* Clean up any memory used. */
|
||
|
free (histogram);
|
||
|
|
||
|
/* Return a null pointer. */
|
||
|
return (0);
|
||
|
}
|
||
|
keypad (histogram->win, TRUE);
|
||
|
leaveok (histogram->win, TRUE);
|
||
|
|
||
|
/* Set up some default values. */
|
||
|
histogram->filler = '#' | A_REVERSE;
|
||
|
histogram->statsAttr = A_NORMAL;
|
||
|
histogram->statsPos = TOP;
|
||
|
histogram->viewType = vREAL;
|
||
|
histogram->high = 0;
|
||
|
histogram->low = 0;
|
||
|
histogram->value = 0;
|
||
|
histogram->lowx = 0;
|
||
|
histogram->lowy = 0;
|
||
|
histogram->highx = 0;
|
||
|
histogram->highy = 0;
|
||
|
histogram->curx = 0;
|
||
|
histogram->cury = 0;
|
||
|
histogram->lowString = 0;
|
||
|
histogram->highString = 0;
|
||
|
histogram->curString = 0;
|
||
|
ObjOf(histogram)->box = Box;
|
||
|
|
||
|
/* Register this baby. */
|
||
|
registerCDKObject (cdkscreen, vHISTOGRAM, histogram);
|
||
|
|
||
|
/* Return this thing. */
|
||
|
return (histogram);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This was added for the builder.
|
||
|
*/
|
||
|
void activateCDKHistogram (CDKHISTOGRAM *histogram, chtype *actions GCC_UNUSED)
|
||
|
{
|
||
|
drawCDKHistogram (histogram, ObjOf(histogram)->box);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This sets various histogram attributes.
|
||
|
*/
|
||
|
void setCDKHistogram (CDKHISTOGRAM *histogram, EHistogramDisplayType viewType, int statsPos, chtype statsAttr, int low, int high, int value, chtype filler, boolean Box)
|
||
|
{
|
||
|
setCDKHistogramDisplayType (histogram, viewType);
|
||
|
setCDKHistogramStatsPos (histogram, statsPos);
|
||
|
setCDKHistogramValue (histogram, low, high, value);
|
||
|
setCDKHistogramFillerChar (histogram, filler);
|
||
|
setCDKHistogramStatsAttr (histogram, statsAttr);
|
||
|
setCDKHistogramBox (histogram, Box);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This sets the values for the histogram.
|
||
|
*/
|
||
|
void setCDKHistogramValue (CDKHISTOGRAM *histogram, int low, int high, int value)
|
||
|
{
|
||
|
/* Declare local variables. */
|
||
|
char string[100];
|
||
|
int len;
|
||
|
|
||
|
/* We should error check the information we have. */
|
||
|
histogram->low = (low <= high ? low : 0);
|
||
|
histogram->high = (low <= high ? high : 0);
|
||
|
histogram->value = (low <= value && value <= high ? value : 0);
|
||
|
|
||
|
/* Determine the percentage of the given value. */
|
||
|
histogram->percent = (histogram->high == 0 ? 0 : ((float)histogram->value / (float)histogram->high));
|
||
|
|
||
|
/* Determine the size of the histogram bar. */
|
||
|
if (histogram->orient == VERTICAL)
|
||
|
{
|
||
|
histogram->barSize = (int)(histogram->percent * (float)histogram->fieldHeight);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
histogram->barSize = (int)(histogram->percent * (float)histogram->fieldWidth);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* We have a number of variables which determine the personality of
|
||
|
* the histogram. We have to go through each one methodically, and
|
||
|
* set them correctly. This section does this.
|
||
|
*/
|
||
|
if (histogram->viewType != vNONE)
|
||
|
{
|
||
|
if (histogram->orient == VERTICAL)
|
||
|
{
|
||
|
if (histogram->statsPos == LEFT || histogram->statsPos == BOTTOM)
|
||
|
{
|
||
|
/* Free the space used by the character strings. */
|
||
|
freeChar (histogram->lowString);
|
||
|
freeChar (histogram->highString);
|
||
|
freeChar (histogram->curString);
|
||
|
|
||
|
/* Set the low label attributes. */
|
||
|
sprintf (string, "%d", histogram->low);
|
||
|
len = (int)strlen (string);
|
||
|
histogram->lowString = copyChar (string);
|
||
|
histogram->lowx = 1;
|
||
|
histogram->lowy = histogram->boxHeight - len - 1;
|
||
|
|
||
|
/* Set the high label attributes. */
|
||
|
sprintf (string, "%d", histogram->high);
|
||
|
histogram->highString = copyChar (string);
|
||
|
histogram->highx = 1;
|
||
|
histogram->highy = histogram->titleLines + 1;
|
||
|
|
||
|
/* Set the current value attributes. */
|
||
|
if (histogram->viewType == vPERCENT)
|
||
|
{
|
||
|
sprintf (string, "%3.1f%%", (float) (histogram->percent * 100));
|
||
|
}
|
||
|
else if (histogram->viewType == vFRACTION)
|
||
|
{
|
||
|
sprintf (string, "%d/%d", histogram->value, histogram->high);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
sprintf (string, "%d", histogram->value);
|
||
|
}
|
||
|
len = (int)strlen (string);
|
||
|
histogram->curString = copyChar (string);
|
||
|
histogram->curx = 1;
|
||
|
histogram->cury = ((histogram->fieldHeight - len) / 2) + histogram->titleLines + 1;
|
||
|
}
|
||
|
else if (histogram->statsPos == CENTER)
|
||
|
{
|
||
|
/* Set the character strings correctly. */
|
||
|
freeChar (histogram->lowString);
|
||
|
freeChar (histogram->highString);
|
||
|
freeChar (histogram->curString);
|
||
|
|
||
|
/* Set the low label attributes. */
|
||
|
sprintf (string, "%d", histogram->low);
|
||
|
len = (int)strlen (string);
|
||
|
histogram->lowString = copyChar (string);
|
||
|
histogram->lowx = (histogram->fieldWidth/2) + 1;
|
||
|
histogram->lowy = histogram->boxHeight - len - 1;
|
||
|
|
||
|
/* Set the high label attributes. */
|
||
|
sprintf (string, "%d", histogram->high);
|
||
|
histogram->highString = copyChar (string);
|
||
|
histogram->highx = (histogram->fieldWidth/2) + 1;
|
||
|
histogram->highy = histogram->titleLines + 1;
|
||
|
|
||
|
/* Set the stats label attributes. */
|
||
|
if (histogram->viewType == vPERCENT)
|
||
|
{
|
||
|
sprintf (string, "%3.2f%%", (float) (histogram->percent * 100));
|
||
|
}
|
||
|
else if (histogram->viewType == vFRACTION)
|
||
|
{
|
||
|
sprintf (string, "%d/%d", histogram->value, histogram->high);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
sprintf (string, "%d", histogram->value);
|
||
|
}
|
||
|
len = (int)strlen (string);
|
||
|
histogram->curString = copyChar (string);
|
||
|
histogram->curx = (histogram->fieldWidth/2) + 1;
|
||
|
histogram->cury = ((histogram->fieldHeight - len)/2) + histogram->titleLines + 1;
|
||
|
}
|
||
|
else if (histogram->statsPos == RIGHT || histogram->statsPos == TOP)
|
||
|
{
|
||
|
/* Set the character strings correctly. */
|
||
|
freeChar (histogram->lowString);
|
||
|
freeChar (histogram->highString);
|
||
|
freeChar (histogram->curString);
|
||
|
|
||
|
/* Set the low label attributes. */
|
||
|
sprintf (string, "%d", histogram->low);
|
||
|
len = (int)strlen (string);
|
||
|
histogram->lowString = copyChar (string);
|
||
|
histogram->lowx = histogram->fieldWidth;
|
||
|
histogram->lowy = histogram->boxHeight - len - 1;
|
||
|
|
||
|
/* Set the high label attributes. */
|
||
|
sprintf (string, "%d", histogram->high);
|
||
|
histogram->highString = copyChar (string);
|
||
|
histogram->highx = histogram->fieldWidth;
|
||
|
histogram->highy = histogram->titleLines + 1;
|
||
|
|
||
|
/* Set the stats label attributes. */
|
||
|
if (histogram->viewType == vPERCENT)
|
||
|
{
|
||
|
sprintf (string, "%3.2f%%", (float) (histogram->percent * 100));
|
||
|
}
|
||
|
else if (histogram->viewType == vFRACTION)
|
||
|
{
|
||
|
sprintf (string, "%d/%d", histogram->value, histogram->high);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
sprintf (string, "%d", histogram->value);
|
||
|
}
|
||
|
len = (int)strlen (string);
|
||
|
histogram->curString = copyChar (string);
|
||
|
histogram->curx = histogram->fieldWidth;
|
||
|
histogram->cury = ((histogram->fieldHeight - len)/2) + histogram->titleLines + 1;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* Alignment is HORIZONTAL. */
|
||
|
if (histogram->statsPos == TOP || histogram->statsPos == RIGHT)
|
||
|
{
|
||
|
/* Set the character strings correctly. */
|
||
|
freeChar (histogram->lowString);
|
||
|
freeChar (histogram->highString);
|
||
|
freeChar (histogram->curString);
|
||
|
|
||
|
/* Set the low label attributes. */
|
||
|
sprintf (string, "%d", histogram->low);
|
||
|
histogram->lowString = copyChar (string);
|
||
|
histogram->lowx = 1;
|
||
|
histogram->lowy = histogram->titleLines + 1;
|
||
|
|
||
|
/* Set the high label attributes. */
|
||
|
sprintf (string, "%d", histogram->high);
|
||
|
len = (int)strlen(string);
|
||
|
histogram->highString = copyChar (string);
|
||
|
histogram->highx = histogram->boxWidth - len - 1;
|
||
|
histogram->highy = histogram->titleLines + 1;
|
||
|
|
||
|
/* Set the stats label attributes. */
|
||
|
if (histogram->viewType == vPERCENT)
|
||
|
{
|
||
|
sprintf (string, "%3.1f%%", (float) (histogram->percent * 100));
|
||
|
}
|
||
|
else if (histogram->viewType == vFRACTION)
|
||
|
{
|
||
|
sprintf (string, "%d/%d", histogram->value, histogram->high);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
sprintf (string, "%d", histogram->value);
|
||
|
}
|
||
|
len = (int)strlen(string);
|
||
|
histogram->curString = copyChar (string);
|
||
|
histogram->curx = (histogram->fieldWidth - len)/2 + 1;
|
||
|
histogram->cury = histogram->titleLines + 1;
|
||
|
}
|
||
|
else if (histogram->statsPos == CENTER)
|
||
|
{
|
||
|
/* Set the character strings correctly. */
|
||
|
freeChar (histogram->lowString);
|
||
|
freeChar (histogram->highString);
|
||
|
freeChar (histogram->curString);
|
||
|
|
||
|
/* Set the low label attributes. */
|
||
|
sprintf (string, "%d", histogram->low);
|
||
|
histogram->lowString = copyChar (string);
|
||
|
histogram->lowx = 1;
|
||
|
histogram->lowy = (histogram->fieldHeight/2) + histogram->titleLines + 1;
|
||
|
|
||
|
/* Set the high label attributes. */
|
||
|
sprintf (string, "%d", histogram->high);
|
||
|
len = (int)strlen (string);
|
||
|
histogram->highString = copyChar (string);
|
||
|
histogram->highx = histogram->boxWidth - len - 1;
|
||
|
histogram->highy = (histogram->fieldHeight/2) + histogram->titleLines + 1;
|
||
|
|
||
|
/* Set the stats label attributes. */
|
||
|
if (histogram->viewType == vPERCENT)
|
||
|
{
|
||
|
sprintf (string, "%3.1f%%", (float) (histogram->percent * 100));
|
||
|
}
|
||
|
else if (histogram->viewType == vFRACTION)
|
||
|
{
|
||
|
sprintf (string, "%d/%d", histogram->value, histogram->high);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
sprintf (string, "%d", histogram->value);
|
||
|
}
|
||
|
len = (int)strlen (string);
|
||
|
histogram->curString = copyChar (string);
|
||
|
histogram->curx = (histogram->fieldWidth - len)/2 + 1;
|
||
|
histogram->cury = (histogram->fieldHeight/2) + histogram->titleLines + 1;
|
||
|
}
|
||
|
else if (histogram->statsPos == BOTTOM || histogram->statsPos == LEFT)
|
||
|
{
|
||
|
/* Set the character strings correctly. */
|
||
|
freeChar (histogram->lowString);
|
||
|
freeChar (histogram->highString);
|
||
|
freeChar (histogram->curString);
|
||
|
|
||
|
/* Set the low label attributes. */
|
||
|
sprintf (string, "%d", histogram->low);
|
||
|
histogram->lowString = copyChar (string);
|
||
|
histogram->lowx = 1;
|
||
|
histogram->lowy = histogram->boxHeight - 2;
|
||
|
|
||
|
/* Set the high label attributes. */
|
||
|
sprintf (string, "%d", histogram->high);
|
||
|
len = (int)strlen (string);
|
||
|
histogram->highString = copyChar (string);
|
||
|
histogram->highx = histogram->boxWidth - len - 1;
|
||
|
histogram->highy = histogram->boxHeight - 2;
|
||
|
|
||
|
/* Set the stats label attributes. */
|
||
|
if (histogram->viewType == vPERCENT)
|
||
|
{
|
||
|
sprintf (string, "%3.1f%%", (float) (histogram->percent * 100));
|
||
|
}
|
||
|
else if (histogram->viewType == vFRACTION)
|
||
|
{
|
||
|
sprintf (string, "%d/%d", histogram->value, histogram->high);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
sprintf (string, "%d", histogram->value);
|
||
|
}
|
||
|
histogram->curString = copyChar (string);
|
||
|
histogram->curx = (histogram->fieldWidth - len)/2 + 1;
|
||
|
histogram->cury = histogram->boxHeight - 2;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
int getCDKHistogramValue (CDKHISTOGRAM *histogram)
|
||
|
{
|
||
|
return histogram->value;
|
||
|
}
|
||
|
int getCDKHistogramLowValue (CDKHISTOGRAM *histogram)
|
||
|
{
|
||
|
return histogram->low;
|
||
|
}
|
||
|
int getCDKHistogramHighValue (CDKHISTOGRAM *histogram)
|
||
|
{
|
||
|
return histogram->high;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This sets the histogram display type.
|
||
|
*/
|
||
|
void setCDKHistogramDisplayType (CDKHISTOGRAM *histogram, EHistogramDisplayType viewType)
|
||
|
{
|
||
|
histogram->viewType = viewType;
|
||
|
}
|
||
|
EHistogramDisplayType getCDKHistogramViewType (CDKHISTOGRAM *histogram)
|
||
|
{
|
||
|
return histogram->viewType;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This sets the position of the statistics information.
|
||
|
*/
|
||
|
void setCDKHistogramStatsPos (CDKHISTOGRAM *histogram, int statsPos)
|
||
|
{
|
||
|
histogram->statsPos = statsPos;
|
||
|
}
|
||
|
int getCDKHistogramStatsPos (CDKHISTOGRAM *histogram)
|
||
|
{
|
||
|
return histogram->statsPos;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This sets the attribute of the statistics.
|
||
|
*/
|
||
|
void setCDKHistogramStatsAttr (CDKHISTOGRAM *histogram, chtype statsAttr)
|
||
|
{
|
||
|
histogram->statsAttr = statsAttr;
|
||
|
}
|
||
|
chtype getCDKHistogramStatsAttr (CDKHISTOGRAM *histogram)
|
||
|
{
|
||
|
return histogram->statsAttr;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This sets the character to use when drawing the histogram.
|
||
|
*/
|
||
|
void setCDKHistogramFillerChar (CDKHISTOGRAM *histogram, chtype character)
|
||
|
{
|
||
|
histogram->filler = character;
|
||
|
}
|
||
|
chtype getCDKHistogramFillerChar (CDKHISTOGRAM *histogram)
|
||
|
{
|
||
|
return histogram->filler;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This sets the histogram box attribute.
|
||
|
*/
|
||
|
void setCDKHistogramBox (CDKHISTOGRAM *histogram, boolean Box)
|
||
|
{
|
||
|
ObjOf(histogram)->box = Box;
|
||
|
}
|
||
|
boolean getCDKHistogramBox (CDKHISTOGRAM *histogram)
|
||
|
{
|
||
|
return ObjOf(histogram)->box;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* These functions set the drawing characters of the widget.
|
||
|
*/
|
||
|
void setCDKHistogramULChar (CDKHISTOGRAM *histogram, chtype character)
|
||
|
{
|
||
|
histogram->ULChar = character;
|
||
|
}
|
||
|
void setCDKHistogramURChar (CDKHISTOGRAM *histogram, chtype character)
|
||
|
{
|
||
|
histogram->URChar = character;
|
||
|
}
|
||
|
void setCDKHistogramLLChar (CDKHISTOGRAM *histogram, chtype character)
|
||
|
{
|
||
|
histogram->LLChar = character;
|
||
|
}
|
||
|
void setCDKHistogramLRChar (CDKHISTOGRAM *histogram, chtype character)
|
||
|
{
|
||
|
histogram->LRChar = character;
|
||
|
}
|
||
|
void setCDKHistogramVerticalChar (CDKHISTOGRAM *histogram, chtype character)
|
||
|
{
|
||
|
histogram->VChar = character;
|
||
|
}
|
||
|
void setCDKHistogramHorizontalChar (CDKHISTOGRAM *histogram, chtype character)
|
||
|
{
|
||
|
histogram->HChar = character;
|
||
|
}
|
||
|
void setCDKHistogramBoxAttribute (CDKHISTOGRAM *histogram, chtype character)
|
||
|
{
|
||
|
histogram->BoxAttrib = character;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This sets the background color of the widget.
|
||
|
*/
|
||
|
void setCDKHistogramBackgroundColor (CDKHISTOGRAM *histogram, char *color)
|
||
|
{
|
||
|
chtype *holder = 0;
|
||
|
int junk1, junk2;
|
||
|
|
||
|
/* Make sure the color isn't null. */
|
||
|
if (color == 0)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/* Convert the value of the environment variable to a chtype. */
|
||
|
holder = char2Chtype (color, &junk1, &junk2);
|
||
|
|
||
|
/* Set the widgets background color. */
|
||
|
wbkgd (histogram->win, holder[0]);
|
||
|
|
||
|
/* Clean up. */
|
||
|
freeChtype (holder);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This moves the histogram field to the given location.
|
||
|
*/
|
||
|
static void _moveCDKHistogram (CDKOBJS *object, int xplace, int yplace, boolean relative, boolean refresh_flag)
|
||
|
{
|
||
|
CDKHISTOGRAM *histogram = (CDKHISTOGRAM *)object;
|
||
|
|
||
|
/*
|
||
|
* If this is a relative move, then we will adjust where we want
|
||
|
* to move to.
|
||
|
*/
|
||
|
if (relative)
|
||
|
{
|
||
|
xplace += getbegx(histogram->win);
|
||
|
yplace += getbegy(histogram->win);
|
||
|
}
|
||
|
|
||
|
/* Adjust the window if we need to. */
|
||
|
alignxy (WindowOf(histogram), &xplace, &yplace, histogram->boxWidth, histogram->boxHeight);
|
||
|
|
||
|
/* Move the window to the new location. */
|
||
|
moveCursesWindow(histogram->win, xplace, yplace);
|
||
|
|
||
|
/* Redraw the window, if they asked for it. */
|
||
|
if (refresh_flag)
|
||
|
{
|
||
|
drawCDKHistogram (histogram, ObjOf(histogram)->box);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This function draws the histogram.
|
||
|
*/
|
||
|
static void _drawCDKHistogram (CDKOBJS *object, boolean Box)
|
||
|
{
|
||
|
CDKHISTOGRAM *histogram = (CDKHISTOGRAM *)object;
|
||
|
chtype battr = 0;
|
||
|
chtype bchar = 0;
|
||
|
chtype fattr = histogram->filler & A_ATTRIBUTES;
|
||
|
chtype fchar = histogram->filler & A_CHARTEXT;
|
||
|
int histX = histogram->titleLines + 1;
|
||
|
int histY = histogram->barSize;
|
||
|
int len, x, y;
|
||
|
|
||
|
/* Erase the window. */
|
||
|
werase (histogram->win);
|
||
|
|
||
|
/* Box the widget if asked. */
|
||
|
if (Box)
|
||
|
{
|
||
|
attrbox (histogram->win,
|
||
|
histogram->ULChar, histogram->URChar,
|
||
|
histogram->LLChar, histogram->LRChar,
|
||
|
histogram->HChar, histogram->VChar,
|
||
|
histogram->BoxAttrib,
|
||
|
histogram->shadow);
|
||
|
}
|
||
|
|
||
|
/* Draw in the title if there is one. */
|
||
|
for (x=0; x < histogram->titleLines; x++)
|
||
|
{
|
||
|
writeChtype (histogram->win,
|
||
|
histogram->titlePos[x],
|
||
|
x + 1,
|
||
|
histogram->title[x],
|
||
|
HORIZONTAL, 0,
|
||
|
histogram->titleLen[x]);
|
||
|
}
|
||
|
|
||
|
/* If the user asked for labels, draw them in. */
|
||
|
if (histogram->viewType != vNONE)
|
||
|
{
|
||
|
/* Draw in the low label. */
|
||
|
if (histogram->lowString != 0)
|
||
|
{
|
||
|
len = (int)strlen (histogram->lowString);
|
||
|
writeCharAttrib (histogram->win,
|
||
|
histogram->lowx,
|
||
|
histogram->lowy,
|
||
|
histogram->lowString,
|
||
|
histogram->statsAttr,
|
||
|
histogram->orient,
|
||
|
0, len);
|
||
|
}
|
||
|
|
||
|
/* Draw in the current value label. */
|
||
|
if (histogram->curString != 0)
|
||
|
{
|
||
|
len = (int)strlen (histogram->curString);
|
||
|
writeCharAttrib (histogram->win,
|
||
|
histogram->curx,
|
||
|
histogram->cury,
|
||
|
histogram->curString,
|
||
|
histogram->statsAttr,
|
||
|
histogram->orient,
|
||
|
0, len);
|
||
|
}
|
||
|
|
||
|
/* Draw in the high label. */
|
||
|
if (histogram->highString != 0)
|
||
|
{
|
||
|
len = (int)strlen (histogram->highString);
|
||
|
writeCharAttrib (histogram->win,
|
||
|
histogram->highx,
|
||
|
histogram->highy,
|
||
|
histogram->highString,
|
||
|
histogram->statsAttr,
|
||
|
histogram->orient,
|
||
|
0, len);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* If the orientation is vertical, set
|
||
|
* where the bar will start drawing from.
|
||
|
*/
|
||
|
if (histogram->orient == VERTICAL)
|
||
|
{
|
||
|
histX = histogram->boxHeight - histogram->barSize - 1;
|
||
|
histY = histogram->fieldWidth;
|
||
|
}
|
||
|
|
||
|
/* Draw the histogram bar. */
|
||
|
for (x=histX; x < histogram->boxHeight-1; x++)
|
||
|
{
|
||
|
for (y=1; y <= histY; y++)
|
||
|
{
|
||
|
#ifdef HAVE_WINCHBUG
|
||
|
battr = ' ' | A_REVERSE;
|
||
|
#else
|
||
|
battr = mvwinch (histogram->win, x, y);
|
||
|
#endif
|
||
|
fchar = battr & A_ATTRIBUTES;
|
||
|
bchar = battr & A_CHARTEXT;
|
||
|
|
||
|
if (bchar == ' ')
|
||
|
{
|
||
|
mvwaddch (histogram->win, x, y, histogram->filler);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
mvwaddch (histogram->win, x, y, battr | fattr);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Refresh the window. */
|
||
|
wnoutrefresh (histogram->win);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This function destroys the histogram.
|
||
|
*/
|
||
|
void destroyCDKHistogram (CDKHISTOGRAM *histogram)
|
||
|
{
|
||
|
int x;
|
||
|
|
||
|
/* Erase the object. */
|
||
|
eraseCDKHistogram (histogram);
|
||
|
|
||
|
/* Clean up the char pointers. */
|
||
|
freeChar (histogram->curString);
|
||
|
freeChar (histogram->lowString);
|
||
|
freeChar (histogram->highString);
|
||
|
for (x=0; x < histogram->titleLines; x++)
|
||
|
{
|
||
|
freeChtype (histogram->title[x]);
|
||
|
}
|
||
|
|
||
|
/* Clean up the windows. */
|
||
|
deleteCursesWindow (histogram->win);
|
||
|
|
||
|
/* Unregister this object. */
|
||
|
unregisterCDKObject (vHISTOGRAM, histogram);
|
||
|
|
||
|
/* Finish cleaning up. */
|
||
|
free (histogram);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This function erases the histogram from the screen.
|
||
|
*/
|
||
|
static void _eraseCDKHistogram (CDKOBJS *object)
|
||
|
{
|
||
|
CDKHISTOGRAM *histogram = (CDKHISTOGRAM *)object;
|
||
|
|
||
|
eraseCursesWindow (histogram->win);
|
||
|
}
|