home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
300-399
/
ff386.lzh
/
XLispStat
/
src1.lzh
/
IView
/
iviewintrn.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-10-04
|
29KB
|
1,030 lines
/* XLISP-STAT 2.1 Copyright (c) 1990, by Luke Tierney */
/* Additions to Xlisp 2.1, Copyright (c) 1989 by David Michael Betz */
/* You may give out copies of this software; for conditions see the */
/* file COPYING included with this distribution. */
#include "xlisp.h"
#include "osdef.h"
#ifdef ANSI
#include "iviewproto.h"
#include "Stproto.h"
#else
#include "iviewfun.h"
#include "Stfun.h"
#endif ANSI
typedef IView StGrInfo;
/* forward declarations */
#ifdef ANSI
StGrInfo StGrGetGrInfo(StGWWinInfo *);
void set_axis(IVIEW_WINDOW,int,int,int,int),
draw_tick(IVIEW_WINDOW,int,int,double,int),drag(IVIEW_WINDOW,int,int),
dragbrush(IVIEW_WINDOW,int,int),IViewSetIsLinked(IVIEW_WINDOW,int);
#else
StGrInfo StGrGetGrInfo();
void set_axis(),
draw_tick(),drag(),
dragbrush(),IViewSetIsLinked();
#endif
#define BRUSH_WIDTH 20
#define BRUSH_HEIGHT 40
#define AXIS_LABEL_GAP 4
#define AXIS_TICK_LENGTH 3
#define AXIS_LABEL_TEMPLATE "12345"
#define CLICK_WIDTH 4
#define CLICK_HEIGHT 4
#ifndef TRUE
#define TRUE 1
#endif TRUE
#ifndef FALSE
#define FALSE 0
#endif FALSE
/* in iviewdef.h JKL
typedef struct brush {
int left, top, width, height, showing;
} Brush;
typedef struct clickrange {
int width, height;
} ClickRange;
typedef struct content {
int left, top, width, height, origin_x, origin_y, x_variable, y_variable;
} Content;
typedef struct {
int left, top, right, bottom;
} Margin;
typedef struct {
int showing, labeled, ticks, height, edge;
} Axis;
typedef struct iview {
char *data;
Content content;
Margin margin;
Axis x_axis, y_axis;
Brush brush;
ClickRange clickrange;
MouseMode mouseMode;
int showingLabels, fixed_aspect, dirty;
long links;
double *scale, *shift;
} *IView;
typedef IView StGrInfo;
*/
#define IViewGetIView(w) ((IView) StGWGetRefCon(IViewWindowWinInfo(w)))
/**************************************************************************/
/** **/
/** IView Creation Functions **/
/** **/
/**************************************************************************/
void IViewFreeMem(w)
IVIEW_WINDOW w;
{
IView iview = IViewGetIView(w);
if (iview != nil) {
if (IViewData(w) != nil) {
IViewDataFree(IViewData(w));
IViewSetData(w, nil);
}
StFree(iview->scale);
StFree(iview->shift);
StFree(iview);
StGWSetRefCon(IViewWindowWinInfo(w), nil);
}
}
IVIEW_WINDOW IViewNew(object)
/* char * */ LVAL object; /* changed JKL */
{
IVIEW_WINDOW w = (IVIEW_WINDOW) IViewWindowNew(object, FALSE);
IView iview;
/*char*/ StGWWinInfo *gwinfo; /* changed JKL */
int vars, i;
gwinfo = StGWObWinInfo(object);
get_iview_ivars(object, &vars);
iview = (IView) StCalloc(sizeof(struct iview), 1);
StGWSetRefCon(gwinfo, iview);
IViewSetData(w, IViewDataNew(vars));
if(vars>0){ /* test added JKL */
iview->scale = (double *) StCalloc(vars, sizeof(double));
iview->shift = (double *) StCalloc(vars, sizeof(double));}
StGWSetFreeMem(gwinfo, IViewFreeMem);
StGrSetContentVariables(gwinfo, 0, 1);
IViewSetBrush(w, 0, 0, BRUSH_WIDTH, BRUSH_HEIGHT);
StGrSetClickRange(gwinfo, CLICK_WIDTH, CLICK_HEIGHT);
IViewSetShowingLabels(w, FALSE);
IViewSetMouseMode(w, selecting);
IViewSetIsLinked(w, FALSE);
StGrSetMargin(gwinfo, 0, 0, 0, 0);
IViewSetFixedAspect(w, TRUE);
iview->brush.showing = FALSE;
for (i = 0; i < vars; i++) {
IViewSetScaledRange(w, i, 0.0, 1.0);
IViewSetScale(w, i, 1.0);
IViewSetShift(w, i, 0.0);
}
return(w);
}
/**************************************************************************/
/** **/
/** IView State Accessors and Mutators **/
/** **/
/**************************************************************************/
int StGrDirty(gwinfo)
/* char*/ StGWWinInfo *gwinfo; /* changed JKL */
{
StGrInfo gr = (StGrInfo) StGWGetRefCon(gwinfo);
if (gr == nil) StPerror("no graph installed in this window");
return(gr->dirty);
}
void StGrSetDirty(gwinfo, dirty)
/*char*/ StGWWinInfo *gwinfo; /* changed JKL */
int dirty;
{
StGrInfo gr = (StGrInfo) StGWGetRefCon(gwinfo);
if (gr == nil) StPerror("no graph installed in this window");
gr->dirty = dirty;
}
static StGrInfo StGrGetGrInfo(gwinfo)
/*char*/ StGWWinInfo *gwinfo; /* changed JKL */
{
StGrInfo gr = (StGrInfo) StGWGetRefCon(gwinfo);
if (gr == nil) StPerror("no graph installed in this window");
return(gr);
}
void StGrSetContentRect(gwinfo, left, top, width, height)
/*char*/ StGWWinInfo *gwinfo; /* changed JKL */
int left, top, width, height;
{
StGrInfo gr = StGrGetGrInfo(gwinfo);
gr->content.left = left; gr->content.top = top;
gr->content.width = width; gr->content.height = height;
}
void StGrGetContentRect(gwinfo, left, top, width, height)
/*char*/ StGWWinInfo *gwinfo; /* changed JKL */
int *left, *top, *width, *height;
{
StGrInfo gr = StGrGetGrInfo(gwinfo);
if (left != nil) *left = gr->content.left;
if (top != nil) *top = gr->content.top;
if (width != nil) *width = gr->content.width;
if (height != nil) *height = gr->content.height;
}
void StGrSetContentOrigin(gwinfo, x, y)
/*char*/ StGWWinInfo *gwinfo; /* changed JKL */
int x, y;
{
StGrInfo gr = StGrGetGrInfo(gwinfo);
gr->content.origin_x = x;
gr->content.origin_y = y;
}
void StGrGetContentOrigin(gwinfo, x, y)
/*char*/ StGWWinInfo *gwinfo; /* changed JKL */
int *x, *y;
{
StGrInfo gr = StGrGetGrInfo(gwinfo);
if (x != nil) *x = gr->content.origin_x;
if (y != nil) *y = gr->content.origin_y;
}
void StGrSetContentVariables(gwinfo, x, y)
/*char*/ StGWWinInfo *gwinfo; /* changed JKL */
int x, y;
{
StGrInfo gr = StGrGetGrInfo(gwinfo);
int vars = StGrNumVariables(gwinfo);
gr->content.x_variable = (vars > x && x >= 0) ? x : 0;
gr->content.y_variable = (vars > y && y >= 0) ? y : 1;
}
void StGrGetContentVariables(gwinfo, x, y)
/*char*/ StGWWinInfo *gwinfo; /* changed JKL */
int *x, *y;
{
StGrInfo gr = StGrGetGrInfo(gwinfo);
if (x != nil) *x = gr->content.x_variable;
if (y != nil) *y = gr->content.y_variable;
}
void StGrSetClickRange(gwinfo, width, height)
/*char*/ StGWWinInfo *gwinfo; /* changed JKL */
int width, height;
{
StGrInfo gr = StGrGetGrInfo(gwinfo);
gr->clickrange.width = width;
gr->clickrange.height = height;
}
void StGrGetClickRange(gwinfo, width, height)
/*char*/ StGWWinInfo *gwinfo; /* changed JKL */
int *width, *height;
{
StGrInfo gr = StGrGetGrInfo(gwinfo);
if (width != nil) *width = gr->clickrange.width;
if (height != nil) *height = gr->clickrange.height;
}
void IViewSetMouseMode(w, mode)
IVIEW_WINDOW w;
MouseMode mode;
{
/*char*/ StGWWinInfo *gwinfo = IViewWindowWinInfo(w);/* changed JKL */
IView iview = IViewGetIView(w);
if (iview == nil) return;
if (iview->mouseMode == brushing) IViewEraseBrush(w);
iview->mouseMode = mode;
if (iview->mouseMode == brushing) IViewDrawBrush(w);
switch (mode) {
case brushing: StGWSetCursor(gwinfo, BRUSH_CURSOR); break;
case usermode: StGWSetCursor(gwinfo, HAND_CURSOR); break;
case selecting:
default: StGWSetCursor(gwinfo, ARROW_CURSOR);
}
}
MouseMode IViewMouseMode(w)
IVIEW_WINDOW w;
{
IView iview = IViewGetIView(w);
if (iview == nil) return((MouseMode) 0);
return(iview->mouseMode);
}
void IViewSetShowingLabels(w, show)
IVIEW_WINDOW w;
int show;
{
IView iview = IViewGetIView(w);
if (iview == nil) return;
IViewUnselectAllPoints(w);
iview->showingLabels = show;
}
int IViewShowingLabels(w)
IVIEW_WINDOW w;
{
IView iview = IViewGetIView(w);
return(iview != nil && iview->showingLabels);
}
void IViewSetData(w, data)
IVIEW_WINDOW w;
/*char * */ IViewDATA data; /* changed JKL */
{
IView iview = IViewGetIView(w);
if (iview != nil) iview->data = data;
}
/* char * */ IViewDATA StGrData(gwinfo)
/*char*/ StGWWinInfo *gwinfo;/* changed JKL */
{
StGrInfo gr = StGrGetGrInfo(gwinfo);
if (gr->data == nil) StPerror("No data in this IView");
return(gr->data);
}
/* char * */ IViewDATA IViewData(w) /* changed JKL */
IVIEW_WINDOW w;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
if (iview->data == nil) StPerror("No data in this IView");
return(iview->data);
}
void StGrSetMargin(gwinfo, left, top, right, bottom)
/*char*/ StGWWinInfo *gwinfo;/* changed JKL */
int left, top, right, bottom;
{
StGrInfo gr = StGrGetGrInfo(gwinfo);
gr->margin.left = left;
gr->margin.top = top;
gr->margin.right = right;
gr->margin.bottom = bottom;
}
void StGrGetMargin(gwinfo, left, top, right, bottom)
/*char*/ StGWWinInfo *gwinfo; /* changed JKL */
int *left, *top, *right, *bottom;
{
StGrInfo gr = StGrGetGrInfo(gwinfo);
if (left != nil) *left = gr->margin.left;
if (top != nil) *top = gr->margin.top;
if (right != nil) *right = gr->margin.right;
if (bottom != nil) *bottom = gr->margin.bottom;
}
void IViewSetFixedAspect(w, fixed)
IVIEW_WINDOW w;
int fixed;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
iview->fixed_aspect = fixed;
}
int IViewFixedAspect(w)
IVIEW_WINDOW w;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
return(iview->fixed_aspect);
}
void IViewSetScale(w, var, scale)
IVIEW_WINDOW w;
unsigned var;
double scale;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
if (var >= IViewNumVariables(w) || scale <= 0.0) return;
else iview->scale[var] = scale;
}
double IViewScale(w, var)
IVIEW_WINDOW w;
unsigned var;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
if (var >= IViewNumVariables(w)) return(0.0);
else return(iview->scale[var]);
}
void IViewSetShift(w, var, shift)
IVIEW_WINDOW w;
unsigned var;
double shift;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
if (var >= IViewNumVariables(w)) return;
else iview->shift[var] = shift;
}
double IViewShift(w, var)
IVIEW_WINDOW w;
unsigned var;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
if (var >= IViewNumVariables(w)) return(0.0);
else return(iview->shift[var]);
}
/**************************************************************************/
/** **/
/** Axis Functions **/
/** **/
/**************************************************************************/
static void set_axis(w, which, showing, labeled, ticks)
IVIEW_WINDOW w;
int which, showing, labeled, ticks;
{
/*char*/ StGWWinInfo *gwinfo = IViewWindowWinInfo(w); /* changed JKL */
IView iview = IViewGetIView(w);
Axis *axis;
if (iview == nil) StPerror("No IView installed in this window");
switch (which) {
case 'X': axis = &iview->x_axis; break;
case 'Y': axis = &iview->y_axis; break;
}
axis->showing = showing;
axis->labeled = labeled;
axis->ticks = ticks;
if (axis->showing) {
axis->height = StGWTextAscent(gwinfo)
+ StGWTextWidth(gwinfo, AXIS_LABEL_TEMPLATE) / 2
+ AXIS_LABEL_GAP + AXIS_TICK_LENGTH;
if (axis->labeled)
axis->height += StGWTextAscent(gwinfo) + AXIS_LABEL_GAP;
axis->edge = StGWTextWidth(gwinfo, AXIS_LABEL_TEMPLATE);
}
else {
axis->height = 0;
axis->edge = 0;
}
}
void IViewGetAxisMargin(w, left, top, right, bottom)
IVIEW_WINDOW w;
int *left, *top, *right, *bottom;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
if (left != nil)
*left = (iview->x_axis.edge > iview->y_axis.height)
? iview->x_axis.edge : iview->y_axis.height;
if (bottom != nil)
*bottom = (iview->y_axis.edge > iview->x_axis.height)
? iview->y_axis.edge : iview->x_axis.height;
if (top != nil) *top = iview->y_axis.edge;
if (right != nil) *right = iview->x_axis.edge;
}
void IViewSetXaxis(w, showing, labeled, ticks)
IVIEW_WINDOW w;
int showing, labeled, ticks;
{
set_axis(w, 'X', showing, labeled, ticks);
}
void IViewGetXaxis(w, showing, labeled, ticks)
IVIEW_WINDOW w;
int *showing, *labeled, *ticks;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
if (showing != nil) *showing = iview->x_axis.showing;
if (labeled != nil) *labeled = iview->x_axis.labeled;
if (ticks != nil) *ticks = iview->x_axis.ticks;
}
void IViewSetYaxis(w, showing, labeled, ticks)
IVIEW_WINDOW w;
int showing, labeled, ticks;
{
set_axis(w, 'Y', showing, labeled, ticks);
}
void IViewGetYaxis(w, showing, labeled, ticks)
IVIEW_WINDOW w;
int *showing, *labeled, *ticks;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
if (showing != nil) *showing = iview->y_axis.showing;
if (labeled != nil) *labeled = iview->y_axis.labeled;
if (ticks != nil) *ticks = iview->y_axis.ticks;
}
static void draw_tick(w, x, y, value, axis)
IVIEW_WINDOW w;
int x, y, axis;
double value;
{
char s[100];
int offset;
/*char*/ StGWWinInfo *gwinfo = IViewWindowWinInfo(w); /* changed JKL */
offset = StGWTextWidth(gwinfo, AXIS_LABEL_TEMPLATE) / 3;
switch (axis) {
case 'X':
offset += AXIS_TICK_LENGTH + StGWTextAscent(gwinfo);
StGWDrawLine(gwinfo, x, y, x, y + AXIS_TICK_LENGTH);
sprintf(s, "%.3g", value);
StGWDrawText(gwinfo, s, x, y + offset, 1, 0);
break;
case 'Y':
offset += AXIS_TICK_LENGTH + AXIS_LABEL_GAP;
StGWDrawLine(gwinfo, x, y, x - AXIS_TICK_LENGTH, y);
sprintf(s, "%.3g", value);
StGWDrawTextUp(gwinfo, s, x - offset, y, 1, 0);
break;
}
}
void IViewDrawAxes(w)
IVIEW_WINDOW w;
{
IView iview = IViewGetIView(w);
int left, top, width, height, right, bottom, x, y;
double low, high, value;
int offset, tick, i;
/*char*/ StGWWinInfo *gwinfo = IViewWindowWinInfo(w);/* changed JKL */
if (iview == nil) StPerror("No IView installed in this window");
StGrGetContentVariables(gwinfo, &x, &y);
StGrGetContentRect(gwinfo, &left, &top, &width, &height);
right = left + width;
bottom = top + height;
offset = StGWTextWidth(gwinfo, AXIS_LABEL_TEMPLATE) / 3;
if (iview->x_axis.showing) {
StGWDrawLine(gwinfo, left, bottom + 1, right, bottom + 1);
IViewGetRange(w, x, &low, &high);
if (iview->x_axis.ticks >= 2) {
draw_tick(w, left, bottom + 1, low, 'X');
draw_tick(w, right, bottom + 1, high, 'X');
for (i = 1; i < iview->x_axis.ticks - 1; i++) {
tick = left + (((double) i) * width) / (iview->x_axis.ticks - 1);
value = low + i * (high - low) / (iview->x_axis.ticks - 1);
draw_tick(w, tick, bottom + 1, value, 'X');
}
}
if (iview->x_axis.labeled) {
offset += AXIS_TICK_LENGTH + AXIS_LABEL_GAP + 2 * StGWTextAscent(gwinfo);
StGWDrawText(gwinfo, IViewVariableLabel(w, x),
(left + right) / 2, bottom + offset, 1, 0);
}
}
offset = StGWTextWidth(gwinfo, AXIS_LABEL_TEMPLATE) / 3;
if (iview->y_axis.showing) {
StGWDrawLine(gwinfo, left - 1, bottom, left - 1, top);
IViewGetRange(w, y, &low, &high);
if (iview->y_axis.ticks >= 2) {
draw_tick(w, left - 1, bottom, low, 'Y');
draw_tick(w, left - 1, top, high, 'Y');
for (i = 1; i < iview->y_axis.ticks - 1; i++) {
tick = bottom - (((double) i) * height) / (iview->y_axis.ticks - 1);
value = low + i * (high - low) / (iview->y_axis.ticks - 1);
draw_tick(w, left - 1, tick, value, 'Y');
}
}
if (iview->y_axis.labeled) {
offset += AXIS_TICK_LENGTH + 2 * AXIS_LABEL_GAP + StGWTextAscent(gwinfo);
StGWDrawTextUp(gwinfo, IViewVariableLabel(w, y),
left - offset, (top + bottom) / 2, 1, 0);
}
}
}
/**************************************************************************/
/** **/
/** Brush Functions **/
/** **/
/**************************************************************************/
void IViewSetBrush(w, x, y, width, height)
IVIEW_WINDOW w;
int x, y, width, height;
{
IView iview = IViewGetIView(w);
int showing = iview->brush.showing;
if (iview == nil) return;
if (showing) IViewEraseBrush(w);
iview->brush.left = x - width;
iview->brush.top = y - height;
iview->brush.width = width;
iview->brush.height = height;
if (showing) IViewDrawBrush(w);
}
void IViewGetBrush(w, x, y, width, height)
IVIEW_WINDOW w;
int *x, *y, *width, *height;
{
IView iview = IViewGetIView(w);
if (iview == nil) return;
if (x != nil) *x = iview->brush.left + iview->brush.width;
if (y != nil) *y = iview->brush.top + iview->brush.height;
if (width != nil) *width = iview->brush.width;
if (height != nil) *height = iview->brush.height;
}
void IViewEraseBrush(w)
IVIEW_WINDOW w;
{
/*char*/ StGWWinInfo *gwinfo = IViewWindowWinInfo(w);/* changed JKL */
IView iview = IViewGetIView(w);
int mode, type;
if (iview != nil && iview->brush.showing) {
mode = StGWDrawMode(gwinfo); StGWSetDrawMode(gwinfo, 1);
type = StGWLineType(gwinfo); StGWSetLineType(gwinfo, 1);
StGWFrameRect(gwinfo, iview->brush.left, iview->brush.top,
iview->brush.width, iview->brush.height);
iview->brush.showing = FALSE;
StGWSetDrawMode(gwinfo, mode);
StGWSetLineType(gwinfo, type);
}
}
void IViewDrawBrush(w)
IVIEW_WINDOW w;
{
/*char*/ StGWWinInfo *gwinfo = IViewWindowWinInfo(w);/* changed JKL */
IView iview = IViewGetIView(w);
int mode, type;
if (iview != nil && ! iview->brush.showing) {
mode = StGWDrawMode(gwinfo); StGWSetDrawMode(gwinfo, 1);
type = StGWLineType(gwinfo); StGWSetLineType(gwinfo, 1);
StGWFrameRect(gwinfo, iview->brush.left, iview->brush.top,
iview->brush.width, iview->brush.height);
iview->brush.showing = TRUE;
StGWSetDrawMode(gwinfo, mode);
StGWSetLineType(gwinfo, type);
}
}
void IViewMoveBrush(w, x, y)
IVIEW_WINDOW w;
{
IView iview = IViewGetIView(w);
if (iview == nil) return;
IViewEraseBrush(w);
iview->brush.left = x - iview->brush.width;
iview->brush.top = y - iview->brush.height;
IViewDrawBrush(w);
}
/**************************************************************************/
/** **/
/** Mouse Action Functions **/
/** **/
/**************************************************************************/
static struct {
int x, y, left, top, width, height;
} dragRect;
static void drag(w, x, y)
IVIEW_WINDOW w;
int x, y;
{
/*char*/ StGWWinInfo *gwinfo = IViewWindowWinInfo(w);/* changed JKL */
if (dragRect.width != 0 && dragRect.height != 0)
StGWFrameRect(gwinfo, dragRect.left, dragRect.top,
dragRect.width, dragRect.height);
dragRect.width = abs(dragRect.x - x);
dragRect.height = abs(dragRect.y - y);
dragRect.left = (x < dragRect.x) ? x : dragRect.x;
dragRect.top = (y < dragRect.y) ? y : dragRect.y;
if (dragRect.width != 0 && dragRect.height != 0)
StGWFrameRect(gwinfo, dragRect.left, dragRect.top,
dragRect.width, dragRect.height);
}
void IViewStdSelectingMouseAction(w, x, y, type, mods)
IVIEW_WINDOW w;
int x, y;
MouseEventType type;
MouseClickModifier mods;
{
int mode, line_type;
int clickwidth, clickheight;
/*char*/ StGWWinInfo *gwinfo = IViewWindowWinInfo(w);/* changed JKL */
if (type == MouseClick) {
if (mods != ExtendModifier) IViewUnselectAllPoints(w);
StGrGetClickRange(gwinfo, &clickwidth, &clickheight);
IViewAdjustPointsInRect(w, x - clickwidth / 2, y - clickheight / 2,
clickwidth, clickheight, pointSelected);
mode = StGWDrawMode(gwinfo); StGWSetDrawMode(gwinfo, 1);
line_type = StGWLineType(gwinfo); StGWSetLineType(gwinfo, 1);
dragRect.x = x; dragRect.y = y;
dragRect.left = x, dragRect.top = y;
dragRect.width = 0; dragRect.height = 0;
StGWWhileButtonDown(gwinfo, drag, TRUE);
if (dragRect.width != 0 && dragRect.height != 0)
StGWFrameRect(gwinfo, dragRect.left, dragRect.top,
dragRect.width, dragRect.height);
StGWSetDrawMode(gwinfo, mode);
StGWSetLineType(gwinfo, line_type);
IViewAdjustPointsInRect(w, dragRect.left, dragRect.top,
dragRect.width, dragRect.height, pointSelected);
}
}
static void dragbrush(w, x, y)
IVIEW_WINDOW w;
int x, y;
{
IView iview = IViewGetIView(w);
IViewMoveBrush(w, x, y);
IViewAdjustPointsInRect(w, iview->brush.left, iview->brush.top,
iview->brush.width, iview->brush.height,
pointSelected);
}
void IViewStdBrushingMouseAction(w, x, y, type, mods)
IVIEW_WINDOW w;
int x, y;
MouseEventType type;
MouseClickModifier mods;
{
IView iview = IViewGetIView(w);
/*char*/ StGWWinInfo *gwinfo = IViewWindowWinInfo(w);/* changed JKL */
IViewMoveBrush(w, x, y);
if (type == MouseClick) {
if (mods != ExtendModifier) IViewUnselectAllPoints(w);
StGWWhileButtonDown(gwinfo, dragbrush, TRUE);
}
else if (type == MouseMove) {
IViewMoveBrush(w, x, y);
IViewAdjustPointsInRect(w, iview->brush.left, iview->brush.top,
iview->brush.width, iview->brush.height, pointHilited);
}
}
void IViewStdMouseAction(w, x, y, type, mods)
IVIEW_WINDOW w;
int x, y;
MouseEventType type;
MouseClickModifier mods;
{
switch (IViewMouseMode(w)) {
case selecting: IViewStdSelectingMouseAction(w, x, y, type, mods); break;
case brushing: IViewStdBrushingMouseAction(w, x, y, type, mods); break;
}
}
void IViewStdUnselectAllPoints(w)
IVIEW_WINDOW w;
{
int i, n = IViewNumPoints(w);
IViewCheckLinks(w);
IViewClearPointMarks(w);
for (i = 0; i < n; i++)
if ((int) IViewPointState(w, i) > (int) pointNormal
&& ! IViewPointMasked(w, i))
IViewSetPointState(w, i, pointNormal);
IViewAdjustScreens(w);
}
void IViewEraseSelection(w)
IVIEW_WINDOW w;
{
int n = IViewNumPoints(w), i;
IViewCheckLinks(w);
IViewClearPointMarks(w);
for (i = 0; i < n; i++)
if (IViewPointState(w, i) == pointSelected)
IViewSetPointState(w, i, pointInvisible);
IViewAdjustScreens(w);
}
void IViewMaskSelection(w)
IVIEW_WINDOW w;
{
int n = IViewNumPoints(w), i;
IViewClearPointMarks(w);
for (i = 0; i < n; i++)
if (IViewPointState(w, i) == pointSelected)
IViewSetPointMask(w, i, TRUE);
IViewRedrawContent(w);
}
void IViewUnmaskAllPoints(w)
IVIEW_WINDOW w;
{
int n = IViewNumPoints(w), i;
IViewClearPointMarks(w);
for (i = 0; i < n; i++) IViewSetPointMask(w, i, FALSE);
IViewRedrawContent(w);
}
void IViewShowAllPoints(w)
IVIEW_WINDOW w;
{
int n = IViewNumPoints(w), i;
IViewCheckLinks(w);
IViewClearPointMarks(w);
for (i = 0; i < n; i++) IViewSetPointState(w, i, pointNormal);
IViewAdjustScreens(w);
}
int IViewAllPointsShowing(w)
IVIEW_WINDOW w;
{
int result = TRUE, n = IViewNumPoints(w), i;
for (i = 0; i < n && result; i++)
if (IViewPointState(w, i) == pointInvisible) result = FALSE;
return(result);
}
int IViewAllPointsUnmasked(w)
IVIEW_WINDOW w;
{
int result = TRUE, n = IViewNumPoints(w), i;
for (i = 0; i < n && result; i++)
if (IViewPointMasked(w, i)) result = FALSE;
return(result);
}
int IViewAnyPointsSelected(w)
IVIEW_WINDOW w;
{
int result = FALSE, n = IViewNumPoints(w), i;
for (i = 0; i < n && ! result; i++)
if (IViewPointState(w, i) == pointSelected) result = TRUE;
return(result);
}
/*************************************************************************/
/** **/
/** IView Linking Functions **/
/** **/
/*************************************************************************/
#ifdef OLDLINKS
typedef struct IViewEntry{
IVIEW_WINDOW w;
struct IViewEntry *next;
} IViewEntry;
static IViewEntry *LinkedList = nil;
int IViewInternalIsLinked(w)
IVIEW_WINDOW w;
{
register IViewEntry *entry;
for (entry = LinkedList; entry != nil; entry = entry->next) {
if (entry->w == w)
return (TRUE);
}
return (FALSE);
}
void IViewLinkWindow(w)
IVIEW_WINDOW w;
{
IViewEntry *entry;
int i, n = IViewNumPoints(w);
#ifdef CHECK_ACTIVE_IVIEW
if (w == nil || ! IViewWindowIsActive(w) || IViewInternalIsLinked(w)) return;
#else
if (w == nil || IViewInternalIsLinked(w)) return;
#endif CHECK_ACTIVE_IVIEW
entry = (IViewEntry *) StCalloc(1, sizeof(IViewEntry));
entry->w = w;
entry->next = LinkedList;
LinkedList = entry;
IViewSetIsLinked(w, TRUE);
for (i = 0; i < n; i++) IViewMatchPointState(w, i);
IViewAdjustScreens(w);
}
void IViewUnlinkWindow(w)
IVIEW_WINDOW w;
{
register IViewEntry *entry, *entry2;
IViewSetIsLinked(w, FALSE);
if (LinkedList != nil) { /* if list empty, ignore */
if ((*LinkedList).w == w) { /* is it the first element? */
entry2 = LinkedList;
LinkedList = LinkedList->next;
}
else {
for (entry = LinkedList; entry != nil; entry = entry2) {
entry2 = entry->next;
if (entry2 == nil)
return; /* w not in list! */
if (entry2->w == w) { /* found it */
entry->next = entry2->next;
break;
}
}
}
StFree(entry2); /* get rid of entry record */
}
}
void IViewUnlinkAllWindows(void)
{
IViewEntry *view_list;
IVIEW_WINDOW w;
for (view_list = LinkedList; view_list != nil;) {
w = view_list->w;
view_list = view_list->next;
IViewUnlinkWindow(w);
}
}
void IViewMatchPointState(w, p)
IVIEW_WINDOW w;
unsigned p;
{
IViewEntry *list;
for (list = LinkedList; list != nil; list = list->next) {
if (w != list->w && IViewPointState(w, p) != IViewPointState(list->w, p)) {
IViewSetPointScreenState(list->w, p, IViewPointState(list->w, p));
IViewDataSetPointState(IViewData(list->w), p, IViewPointState(w, p));
IViewAdjustOwnScreenPoint(list->w, p);
IViewSetPointScreenState(list->w, p, IViewPointState(list->w, p));
}
}
}
void IViewAdjustScreens(w)
IVIEW_WINDOW w;
{
IViewEntry *list;
IViewAdjustOwnScreen(w);
if (IViewIsLinked(w)) {
for (list = LinkedList; list != nil; list = list->next)
if (w != list->w) IViewAdjustOwnScreen(list->w);
}
}
static void IViewSetIsLinked(w, linked)
IVIEW_WINDOW w;
int linked;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
iview->links = linked;
}
int IViewIsLinked(w)
IVIEW_WINDOW w;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
return(iview->links != nil);
}
IViewCheckLinks(w) IVIEW_WINDOW w; {}
#else
void IViewSetLinks(w, links)
IVIEW_WINDOW w;
long links;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
iview->links = links;
}
long IViewGetLinks(w)
IVIEW_WINDOW w;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
return(iview->links);
}
int IViewIsLinked(w)
IVIEW_WINDOW w;
{
IView iview = IViewGetIView(w);
if (iview == nil) return(FALSE);
else return(iview->links != nil);
}
static void IViewSetIsLinked(w, linked)
IVIEW_WINDOW w;
int linked;
{
IView iview = IViewGetIView(w);
if (iview == nil) StPerror("No IView installed in this window");
iview->links = linked;
}
#endif OLDLINKS