file: stacktool.c
/* util.c - utility routines for XmdvTool */
/* Copyright 1994, Matthew O. Ward
*
* Permission to use, copy, modify, and distribute this
* software and its documentation for any purpose and without fee
* is granted provided that the above copyright notice appears in all copies.
* It is provided "as is" without express or implied warranty.
*/
/* callbacks for canvas processing, some currently empty callbacks for the
keys (later will provide more details on dimensions?), and some useful
utilities. */
#include <X11/Xatom.h>
#include "XmdvTool.h"
#include "hierarchy.h"
#include "stacktool.h"
#include "util.h"
#include "brush.h"
extern Widget appShell;
extern int dims;
extern char names[MAXDIM][MAXLABEL];
extern double *br_pos, *br_size;
extern double dim_min[MAXDIM], dim_max[MAXDIM];
extern unsigned long color_cells[NUM_COLOR_CELLS];
extern XColor outline_col;
extern GC gc;
/* is this a color display? */
extern int COLOR;
extern int X_SIZE, Y_SIZE;
Arg wargs[10];
int n;
/* stack brush tool brush variables */
int sbt_open = FALSE;
double sbt_br_pos[MAXDIM], sbt_br_size[MAXDIM];
Dimension sbt_x, sbt_y; /* Stack Brush Tool X/Y dims */
int sbt_left_offset, /* offsets from edge of brush tool */
sbt_bottom_offset;
/* button defines */
#define BUTTON_DOWN 1
#define BUTTON_DRAG 2
#define BUTTON_UP 3
#define BUTTON_CANCEL 4
void StackBToolRedrawCanvas(Widget w, caddr_t client_data,
XawDrawingAreaCallbackStruct *call_data)
{
StackBToolDoRedraw();
}
void StackBToolDoRedraw(void)
{
Widget sbt_canvas_w; /* the stack brush tool canvas */
int i,j;
int dpy_xmin, /* display min/max vars */
dpy_xmax,
dpy_ymin,
dpy_ymax;
XFontStruct *font; /* the font to draw text with */
unsigned long font_height; /* the height of the font */
int dummy; /* dummy var passed to XTextExtents() */
XCharStruct overall; /* for finding extents */
int label_len; /* the length of a label */
int x,y;
sbt_canvas_w = WcFullNameToWidget(appShell,"*stack_btool_canvas");
if(!sbt_canvas_w)
{
fprintf(stderr, "Error finding *stack_btool_canvas\n");
return;
}
/* if brush tool is not open, do nothing */
if(!sbt_open)
return;
/* get the new x/y dimensions of the brush tool */
n = 0;
XtSetArg(wargs[n],XtNwidth,&sbt_x); n++;
XtSetArg(wargs[n],XtNheight,&sbt_y); n++;
XtGetValues(sbt_canvas_w,wargs,n);
/* set the min/max vars */
dpy_xmin = sbt_left_offset;
dpy_xmax = sbt_x - SBT_SLIDER_WIDTH;
dpy_ymin = sbt_y/2 + SBT_SLIDER_WIDTH;
dpy_ymax = sbt_y - sbt_bottom_offset;
/* clear the canvas */
XClearWindow(XtDisplay(sbt_canvas_w), XtWindow(sbt_canvas_w));
/* set the brush color */
if(COLOR==1)
XSetForeground(XtDisplay(sbt_canvas_w), gc, outline_col.pixel);
for(i=0; i<dims; i++)
StackBToolDrawAxis(i);
/* set the foreground color for drawing outlines */
if(COLOR==1)
XSetForeground(XtDisplay(sbt_canvas_w), gc, color_cells[CCELL_DATA]);
XSetForeground(XtDisplay(sbt_canvas_w),gc, color_cells[CCELL_TEXT]);
/* draw the divider line */
XDrawLine(XtDisplay(sbt_canvas_w), XtWindow(sbt_canvas_w), gc,
0, sbt_y/2, sbt_x, sbt_y/2);
/* draw the slider outlines */
for(i=0; i<dims; i++)
{
/* if odd, draw on the upper half */
if(i%2)
{
XDrawRectangle(XtDisplay(sbt_canvas_w), XtWindow(sbt_canvas_w), gc,
dpy_xmin - 1, i*SBT_SLIDER_WIDTH - 1,
dpy_xmax - dpy_xmin + 1, SBT_SLIDER_WIDTH + 1);
}
/* if even, draw on lower half */
else
{
XDrawRectangle(XtDisplay(sbt_canvas_w), XtWindow(sbt_canvas_w), gc,
(i+1)*SBT_SLIDER_WIDTH - 1, dpy_ymin - 1,
SBT_SLIDER_WIDTH + 1, dpy_ymax - dpy_ymin + 1);
}
}
/* draw the labels */
/* get the font */
font = XQueryFont(XtDisplay(sbt_canvas_w), XGContextFromGC(gc));
#define SBT_TEXT_MAX_LETTERS 3
for(i=0; i<dims; i++)
{
/* determine the string length */
label_len = MIN(SBT_TEXT_MAX_LETTERS, strlen(names[i]));
/* find the extents of the string */
XTextExtents(font, names[i], label_len, &dummy, &dummy, &dummy,
&overall);
font_height = overall.ascent + overall.descent;
/* if odd, draw on the upper half */
if(i%2)
{
x = dpy_xmin - overall.width - font_height/3.;
y = i*SBT_SLIDER_WIDTH + SBT_SLIDER_WIDTH/2. + font_height/2.;
XDrawString(XtDisplay(sbt_canvas_w), XtWindow(sbt_canvas_w), gc,
x, y,
names[i], MIN(SBT_TEXT_MAX_LETTERS, strlen(names[i])));
}
/* if even, draw on lower half */
else
{
y = sbt_y - sbt_bottom_offset;
for(j=0; j<strlen(names[i]); j++)
{
XTextExtents(font, &names[i][j], 1, &dummy, &dummy, &dummy,
&overall);
x = SBT_SLIDER_WIDTH + SBT_SLIDER_WIDTH*i + overall.width/2;
y += overall.ascent + font_height * 0.2;
/* if about to go off the bottom border, stop */
if(y + overall.descent > sbt_y)
break;
XDrawString(XtDisplay(sbt_canvas_w), XtWindow(sbt_canvas_w), gc,
x, y,
&names[i][j], 1);
y += overall.descent;
}
}
}
}
/* stack brush tool button flags */
int sbt_button_one_down = FALSE;
int sbt_button_two_down = FALSE;
int sbt_button_three_down = FALSE;
void StackBToolMotionCanvas(Widget w, caddr_t client_data,
XawDrawingAreaCallbackStruct *call_data)
{
if(sbt_button_one_down)
{
StackBToolInteractiveResize(call_data->event->xmotion.x,
call_data->event->xmotion.y,
BUTTON_DRAG); //OVERLOAD CALL: BUTTON_DRAG: glyphtool.c(?), stacktool.c(?), util.c(?)
}
else if(sbt_button_two_down)
{
StackBToolInteractiveMove(call_data->event->xmotion.x,
call_data->event->xmotion.y,
BUTTON_DRAG); //OVERLOAD CALL: BUTTON_DRAG: glyphtool.c(?), stacktool.c(?), util.c(?)
}
else if(sbt_button_three_down)
{
}
}
void StackBToolInputCanvas(Widget w, caddr_t client_data,
XawDrawingAreaCallbackStruct *call_data)
{
int x, y;
switch (call_data->event->type)
{
/* Process mouse button events */
case ButtonPress:
x = call_data->event->xbutton.x;
y = call_data->event->xbutton.y;
switch (call_data->event->xbutton.button)
{
case 1: /* the resize button */
if(sbt_button_two_down)
{
XBell(XtDisplay(w), 0);
sbt_button_one_down = sbt_button_two_down = sbt_button_three_down = FALSE;
StackBToolInteractiveMove(x, y, BUTTON_CANCEL); //OVERLOAD CALL: BUTTON_CANCEL: glyphtool.c(?), stacktool.c(?), util.c(?)
break;
}
else if(sbt_button_three_down)
{
XBell(XtDisplay(w), 0);
sbt_button_one_down = sbt_button_two_down = sbt_button_three_down = FALSE;
break;
}
sbt_button_one_down = TRUE;
StackBToolInteractiveResize(x, y, BUTTON_DOWN); //OVERLOAD CALL: BUTTON_DOWN: glyphtool.c(?), stacktool.c(?), util.c(?)
break;
case 2: /* the move button */
if(sbt_button_one_down)
{
XBell(XtDisplay(w), 0);
sbt_button_one_down = sbt_button_two_down = sbt_button_three_down = FALSE;
StackBToolInteractiveResize(x, y, BUTTON_CANCEL); //OVERLOAD CALL: BUTTON_CANCEL: glyphtool.c(?), stacktool.c(?), util.c(?)
break;
}
else if(sbt_button_three_down)
{
XBell(XtDisplay(w), 0);
sbt_button_one_down = sbt_button_two_down = sbt_button_three_down = FALSE;
break;
}
sbt_button_two_down = TRUE;
StackBToolInteractiveMove(x, y, BUTTON_DOWN); //OVERLOAD CALL: BUTTON_DOWN: glyphtool.c(?), stacktool.c(?), util.c(?)
break;
case 3:
if(sbt_button_one_down)
{
XBell(XtDisplay(w), 0);
sbt_button_one_down = sbt_button_two_down = sbt_button_three_down = FALSE;
StackBToolInteractiveResize(x, y, BUTTON_CANCEL); //OVERLOAD CALL: BUTTON_CANCEL: glyphtool.c(?), stacktool.c(?), util.c(?)
break;
}
else if(sbt_button_two_down)
{
XBell(XtDisplay(w), 0);
sbt_button_one_down = sbt_button_two_down = sbt_button_three_down = FALSE;
StackBToolInteractiveMove(x, y, BUTTON_CANCEL); //OVERLOAD CALL: BUTTON_CANCEL: glyphtool.c(?), stacktool.c(?), util.c(?)
break;
}
sbt_button_three_down = TRUE;
break;
}
break;
case ButtonRelease:
x = call_data->event->xbutton.x;
y = call_data->event->xbutton.y;
switch (call_data->event->xbutton.button)
{
case 1:
if(!sbt_button_one_down)
break;
StackBToolInteractiveResize(x, y, BUTTON_UP); //OVERLOAD CALL: BUTTON_UP: glyphtool.c(?), stacktool.c(?), util.c(?)
sbt_button_one_down = FALSE;
break;
case 2:
if(!sbt_button_two_down)
break;
StackBToolInteractiveMove(x, y, BUTTON_UP); //OVERLOAD CALL: BUTTON_UP: glyphtool.c(?), stacktool.c(?), util.c(?)
sbt_button_two_down = FALSE;
break;
case 3:
if(!sbt_button_three_down)
break;
sbt_button_three_down = FALSE;
break;
}
break;
}
}
void StackBToolApply(Widget w, caddr_t client_data, caddr_t call_data)
{
int i;
/* copy the stack btool brush to the real brush */
for(i=0; i<dims; i++)
{
br_pos[i] = sbt_br_pos[i];
br_size[i] = sbt_br_size[i];
}
do_redraw();
}
void StackBToolInit(Widget w, caddr_t client_data, caddr_t call_data)
{
Widget sbt_canvas_w; /* the stack brush tool canvas widget */
int i;
XFontStruct *font; /* the font to draw text with */
int dummy; /* dummy var passed to XTextExtents() */
XCharStruct overall; /* for finding extents */
/* set the global tool open flag */
sbt_open = TRUE;
/* copy the real brush to the stack btool brush */
for(i=0; i<dims; i++)
{
sbt_br_pos[i] = br_pos[i];
sbt_br_size[i] = br_size[i];
}
/* resize the canvas */
if(!(sbt_canvas_w = WcFullNameToWidget(appShell,"*stack_btool_canvas")))
{
fprintf(stderr,
"Error finding *stack_btool_canvas in StackBToolInit()\n");
return;
}
/* calculate the needed canvas size */
if(dims%2)
sbt_x = (dims/2 + 1)*SBT_SLIDER_WIDTH*2 + SBT_SLIDER_WIDTH;
else
sbt_x = dims/2*SBT_SLIDER_WIDTH*2 + SBT_SLIDER_WIDTH;
sbt_y = (dims/2*SBT_SLIDER_WIDTH*2 + SBT_SLIDER_WIDTH)*2;
n = 0;
XtSetArg(wargs[n],XtNwidth,sbt_x); n++;
XtSetArg(wargs[n],XtNheight,sbt_y); n++;
XtSetValues(sbt_canvas_w,wargs,n);
/* calculate the offsets */
/* left offset should be large enough for three letters horizontally */
font = XQueryFont(XtDisplay(sbt_canvas_w), XGContextFromGC(gc));
XTextExtents(font, "XXX", 3, &dummy, &dummy, &dummy, &overall);
/* scale width up by 30% */
sbt_left_offset = overall.width * 1.3;
/* bottom offset should be large enough for three letters vertically */
/* scale up by 30% */
sbt_bottom_offset = (3.0 * (overall.ascent + overall.descent)) * 1.3;
}
/*
* StackBToolPopDown() - Callback when brush tool is popped down.
*/
void StackBToolPopDown(Widget w, caddr_t client_data, caddr_t call_data)
{
/* reset global tool open flag */
sbt_open = FALSE;
}
/*
* StackBToolUpdate() - Update the stack brush tool so that it matches
* the real brush.
*/
void StackBToolUpdate(void)
{
int i;
/* if brush tool is not open, do nothing */
if(!sbt_open)
return;
for(i = 0;i < dims;i++) {
sbt_br_pos[i] = br_pos[i];
sbt_br_size[i] = br_size[i];
}
/*
StackBToolInit(NULL, NULL, NULL);
*/
StackBToolDoRedraw();
}
void StackBToolInteractiveMove(int mouse_x, int mouse_y, int button)
{
Widget sbt_canvas_w; /* the stack brush tool canvas widget */
static int axis; /* axis for resize */
double new_pos; /* new brush position */
int h_axes, v_axes; /* horizontal and vertical axes */
sbt_canvas_w = WcFullNameToWidget(appShell,"*stack_btool_canvas");
if(!sbt_canvas_w)
{
fprintf(stderr, "Error finding *stack_btool_canvas\n");
return;
}
/* if this is a button down, determine axis */
if(button == BUTTON_DOWN) //OVERLOAD CALL: BUTTON_DOWN: glyphtool.c(?), stacktool.c(?), util.c(?)
{
v_axes = dims/2;
h_axes = dims/2 + dims%2;
/* check if on top half or bottom half */
if(mouse_y < sbt_y/2)
{
if(mouse_y < SBT_SLIDER_WIDTH)
{
axis = -1;
XBell(XtDisplay(sbt_canvas_w), 0);
return;
}
axis = (mouse_y - SBT_SLIDER_WIDTH) * (2*v_axes - 1) /
((2*v_axes - 1)*SBT_SLIDER_WIDTH);
if(axis%2)
{
axis = -1;
XBell(XtDisplay(sbt_canvas_w), 0);
return;
}
axis++;
}
else
{
if(mouse_x < SBT_SLIDER_WIDTH)
{
axis = -1;
XBell(XtDisplay(sbt_canvas_w), 0);
return;
}
axis = (mouse_x - SBT_SLIDER_WIDTH) * (2*h_axes - 1) /
((2*h_axes - 1)*SBT_SLIDER_WIDTH);
if(axis%2)
{
axis = -1;
XBell(XtDisplay(sbt_canvas_w), 0);
return;
}
}
/* sanity check */
if(axis < 0 || axis >= dims)
{
XBell(XtDisplay(sbt_canvas_w), 0);
return;
}
/* store old brush position for later retrieval on cancel */
}
else
{
/* sanity check */
if(axis < 0 || axis >= dims)
return;
}
/* erase the old axis */
StackBToolEraseAxis(axis);
/* calculate new position and bound it */
if(mouse_y < sbt_y/2)
{
new_pos = (mouse_x - sbt_left_offset) * (dim_max[axis] - dim_min[axis]) /
(sbt_x - sbt_left_offset - SBT_SLIDER_WIDTH);
new_pos += dim_min[axis];
}
else
{
new_pos = (sbt_y - sbt_bottom_offset - mouse_y) * (dim_max[axis] - dim_min[axis]) /
(sbt_y/2 - SBT_SLIDER_WIDTH - sbt_bottom_offset);
new_pos += dim_min[axis];
}
new_pos = MIN(new_pos, dim_max[axis]-sbt_br_size[axis]/2.);
new_pos = MAX(new_pos, dim_min[axis]+sbt_br_size[axis]/2.);
/* move brush to new location */
sbt_br_pos[axis] = new_pos;
/* set the brush color */
if(COLOR==1)
XSetForeground(XtDisplay(sbt_canvas_w), gc, outline_col.pixel);
/* draw the new axis */
StackBToolDrawAxis(axis);
}
/*
* StackBToolDrawAxis() - Draws the stack brush tool representation
* for a single axis on the stack brush tool.
*
* PARAMETERS
* axis The axis to draw
*
* RETURNS
* void
*/
void StackBToolDrawAxis(int axis)
{
Widget sbt_canvas_w; /* the stack brush tool canvas */
int dpy_xmin, /* display min/max vars */
dpy_xmax,
dpy_ymin,
dpy_ymax;
int rect_min, rect_max; /* min/max rectangle display values */
sbt_canvas_w = WcFullNameToWidget(appShell,"*stack_btool_canvas");
if(!sbt_canvas_w)
{
fprintf(stderr, "Error finding *stack_btool_canvas\n");
return;
}
/* set the min/max vars */
dpy_xmin = sbt_left_offset;
dpy_xmax = sbt_x - SBT_SLIDER_WIDTH;
dpy_ymin = sbt_y/2 + SBT_SLIDER_WIDTH;
dpy_ymax = sbt_y - sbt_bottom_offset;
/* if odd, draw on the upper half */
if(axis%2)
{
rect_min = (sbt_br_pos[axis] - sbt_br_size[axis]/2. - dim_min[axis]) /
(dim_max[axis] - dim_min[axis]) * (dpy_xmax - dpy_xmin);
rect_min += dpy_xmin;
rect_max = (sbt_br_pos[axis] + sbt_br_size[axis]/2. - dim_min[axis]) /
(dim_max[axis] - dim_min[axis]) * (dpy_xmax - dpy_xmin);
rect_max += dpy_xmin;
/* check lower bound on width */
if(rect_max <= rect_min)
{
if(rect_max == dpy_xmax)
rect_min = dpy_xmax-1;
else
rect_max = rect_min+1;
}
XFillRectangle(XtDisplay(sbt_canvas_w), XtWindow(sbt_canvas_w), gc,
rect_min, axis*SBT_SLIDER_WIDTH,
rect_max - rect_min, SBT_SLIDER_WIDTH);
}
/* if even, draw on lower half */
else
{
rect_min = (sbt_br_pos[axis] - sbt_br_size[axis]/2. - dim_min[axis]) /
(dim_max[axis] - dim_min[axis]) * (dpy_ymax - dpy_ymin);
rect_min = dpy_ymax - rect_min;
rect_max = (sbt_br_pos[axis] + sbt_br_size[axis]/2. - dim_min[axis]) /
(dim_max[axis] - dim_min[axis]) * (dpy_ymax - dpy_ymin);
rect_max = dpy_ymax - rect_max;
/* check lower bound on height */
if(rect_max >= rect_min)
{
if(rect_max == dpy_ymin)
rect_min = dpy_ymin+1;
else
rect_max = rect_min-1;
}
XFillRectangle(XtDisplay(sbt_canvas_w), XtWindow(sbt_canvas_w), gc,
(axis+1)*SBT_SLIDER_WIDTH, rect_max,
SBT_SLIDER_WIDTH, rect_min - rect_max);
}
}
/*
* StackBToolEraseAxis() - Erases the stack brush tool representation
* for a single axis on the stack brush tool.
*
* PARAMETERS
* axis The axis to erase
*
* RETURNS
* void
*/
void StackBToolEraseAxis(int axis)
{
Widget sbt_canvas_w; /* the stack brush tool canvas */
int dpy_xmin, /* display min/max vars */
dpy_xmax,
dpy_ymin,
dpy_ymax;
int rect_min, rect_max; /* min/max rectangle display values */
sbt_canvas_w = WcFullNameToWidget(appShell,"*stack_btool_canvas");
if(!sbt_canvas_w)
{
fprintf(stderr, "Error finding *stack_btool_canvas\n");
return;
}
/* set the min/max vars */
dpy_xmin = sbt_left_offset;
dpy_xmax = sbt_x - SBT_SLIDER_WIDTH;
dpy_ymin = sbt_y/2 + SBT_SLIDER_WIDTH;
dpy_ymax = sbt_y - sbt_bottom_offset;
/* if odd, erase upper half */
if(axis%2)
{
rect_min = (sbt_br_pos[axis] - sbt_br_size[axis]/2. - dim_min[axis]) /
(dim_max[axis] - dim_min[axis]) * (dpy_xmax - dpy_xmin);
rect_min += dpy_xmin;
rect_max = (sbt_br_pos[axis] + sbt_br_size[axis]/2. - dim_min[axis]) /
(dim_max[axis] - dim_min[axis]) * (dpy_xmax - dpy_xmin);
rect_max += dpy_xmin;
/* check lower bound on width */
if(rect_max <= rect_min)
{
if(rect_max == dpy_xmax)
rect_min = dpy_xmax-1;
else
rect_max = rect_min+1;
}
XClearArea(XtDisplay(sbt_canvas_w), XtWindow(sbt_canvas_w),
rect_min, axis*SBT_SLIDER_WIDTH,
rect_max - rect_min, SBT_SLIDER_WIDTH, False);
}
/* if even, erase lower half */
else
{
rect_min = (sbt_br_pos[axis] - sbt_br_size[axis]/2. - dim_min[axis]) /
(dim_max[axis] - dim_min[axis]) * (dpy_ymax - dpy_ymin);
rect_min = dpy_ymax - rect_min;
rect_max = (sbt_br_pos[axis] + sbt_br_size[axis]/2. - dim_min[axis]) /
(dim_max[axis] - dim_min[axis]) * (dpy_ymax - dpy_ymin);
rect_max = dpy_ymax - rect_max;
/* check lower bound on height */
if(rect_max >= rect_min)
{
if(rect_max == dpy_ymin)
rect_min = dpy_ymin+1;
else
rect_max = rect_min-1;
}
XClearArea(XtDisplay(sbt_canvas_w), XtWindow(sbt_canvas_w),
(axis+1)*SBT_SLIDER_WIDTH, rect_max,
SBT_SLIDER_WIDTH, rect_min - rect_max,
False);
}
}
/*
* StackBToolInteractiveResize() - Interactively resize the brush
* using the stack brush tool
*/
void StackBToolInteractiveResize(int mouse_x, int mouse_y, int button)
{
Widget sbt_canvas_w; /* the stack brush tool canvas widget */
static int axis; /* axis for resize */
double new_min, new_max; /* new brush min/max */
double mouse_data; /* mouse in data coords */
static int resize_min, /* resize min/max flags */
resize_max;
int h_axes, v_axes; /* horizontal and vertical axes */
sbt_canvas_w = WcFullNameToWidget(appShell,"*stack_btool_canvas");
if(!sbt_canvas_w)
{
fprintf(stderr, "Error finding *stack_btool_canvas\n");
return;
}
/* if this is a button down, determine axis */
if(button == BUTTON_DOWN) //OVERLOAD CALL: BUTTON_DOWN: glyphtool.c(?), stacktool.c(?), util.c(?)
{
v_axes = dims/2;
h_axes = dims/2 + dims%2;
/* check if on top half or bottom half */
if(mouse_y < sbt_y/2)
{
if(mouse_y < SBT_SLIDER_WIDTH)
{
axis = -1;
XBell(XtDisplay(sbt_canvas_w), 0);
return;
}
axis = (mouse_y - SBT_SLIDER_WIDTH) * (2*v_axes - 1) /
((2*v_axes - 1)*SBT_SLIDER_WIDTH);
if(axis%2)
{
axis = -1;
XBell(XtDisplay(sbt_canvas_w), 0);
return;
}
axis++;
}
else
{
if(mouse_x < SBT_SLIDER_WIDTH)
{
axis = -1;
XBell(XtDisplay(sbt_canvas_w), 0);
return;
}
axis = (mouse_x - SBT_SLIDER_WIDTH) * (2*h_axes - 1) /
((2*h_axes - 1)*SBT_SLIDER_WIDTH);
if(axis%2)
{
axis = -1;
XBell(XtDisplay(sbt_canvas_w), 0);
return;
}
}
/* sanity check */
if(axis < 0 || axis >= dims)
{
XBell(XtDisplay(sbt_canvas_w), 0);
return;
}
/* calculate position in data space and bound it */
if(mouse_y < sbt_y/2)
{
mouse_data = (mouse_x - sbt_left_offset) *
(dim_max[axis] - dim_min[axis]) /
(sbt_x - sbt_left_offset - SBT_SLIDER_WIDTH);
mouse_data += dim_min[axis];
}
else
{
mouse_data = (sbt_y - sbt_bottom_offset - mouse_y) *
(dim_max[axis] - dim_min[axis]) /
(sbt_y/2 - SBT_SLIDER_WIDTH - sbt_bottom_offset);
mouse_data += dim_min[axis];
}
mouse_data = MIN(mouse_data, dim_max[axis]);
mouse_data = MAX(mouse_data, dim_min[axis]);
/* now determine if min or max is being resized */
resize_min = resize_max = FALSE;
if(mouse_data < sbt_br_pos[axis])
resize_min = TRUE;
else
resize_max = TRUE;
/* store old brush position for later retrieval on cancel */
}
else
{
/* sanity check */
if(axis < 0 || axis >= dims)
return;
/* calculate position in data space and bound it */
if(mouse_y < sbt_y/2)
{
mouse_data = (mouse_x - sbt_left_offset) *
(dim_max[axis] - dim_min[axis]) /
(sbt_x - sbt_left_offset - SBT_SLIDER_WIDTH);
mouse_data += dim_min[axis];
}
else
{
mouse_data = (sbt_y - sbt_bottom_offset - mouse_y) *
(dim_max[axis] - dim_min[axis]) /
(sbt_y/2 - SBT_SLIDER_WIDTH - sbt_bottom_offset);
mouse_data += dim_min[axis];
}
mouse_data = MIN(mouse_data, dim_max[axis]);
mouse_data = MAX(mouse_data, dim_min[axis]);
}
/* resize min or max */
if(resize_min)
{
new_min = mouse_data;
new_max = sbt_br_pos[axis]+sbt_br_size[axis]/2.;
}
else
{
new_min = sbt_br_pos[axis]-sbt_br_size[axis]/2.;
new_max = mouse_data;
}
/* check if min>max */
if(resize_min && new_min > new_max)
new_max = new_min;
if(resize_max && new_min > new_max)
new_min = new_max;
/* erase the old axis */
StackBToolEraseAxis(axis);
/* assign the new brush */
sbt_br_pos[axis] = (new_min + new_max)/2.;
sbt_br_size[axis] = new_max - new_min;
/* set the brush color */
if(COLOR==1)
XSetForeground(XtDisplay(sbt_canvas_w), gc, outline_col.pixel);
/* draw the new axis */
StackBToolDrawAxis(axis);
}
C++ to HTML Conversion by ctoohtml