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
/
src3.lzh
/
Mac
/
maciviewwindow2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-07-30
|
18KB
|
722 lines
#ifdef MPWC
#include <Windows.h>
#include <Menus.h>
#include <ToolUtils.h>
#include <Events.h>
#include <Controls.h>
#include <Fonts.h>
#include <Script.h>
#else
#include <WindowMgr.h>
#include <MenuMgr.h>
#include <ToolboxUtil.h>
#include <EventMgr.h>
#include <ControlMgr.h>
#include <FontMgr.h>
#include <Color.h>
#endif MPWC
#include "StGWWindow.h"
#include "macgraphwindow.h"
/**************************************************************************/
/** **/
/** Action Installation Functions **/
/** **/
/**************************************************************************/
StGWSetFreeMem(gwinfo, FreeMem)
StGWWinInfo *gwinfo;
int (*FreeMem)();
{
if (gwinfo == nil) return;
else gwinfo->FreeMem = FreeMem;
}
StGWIdleOn(gwinfo)
StGWWinInfo *gwinfo;
{
if (gwinfo == nil) return(FALSE);
else return(gwinfo->idleOn);
}
StGWSetIdleOn(gwinfo, on)
StGWWinInfo *gwinfo;
int on;
{
if (gwinfo != nil) gwinfo->idleOn = on;
}
/**************************************************************************/
/** **/
/** Window Management Functions **/
/** **/
/**************************************************************************/
StGWShowWindow(gwinfo)
StGWWinInfo *gwinfo;
{
WindowPtr w;
if (gwinfo == nil || (w = gwinfo->window) == nil) return;
else {
MyShowWindow(w);
if (! gwinfo->initialized) StGWInitialDraw(gwinfo);
}
}
StGWRemove(gwinfo)
StGWWinInfo *gwinfo;
{
WindowPtr w;
if (gwinfo == nil || (w = gwinfo->window) == nil) return;
else SkelRmveWind(w);
}
StGWWhileButtonDown(gwinfo, action, motionOnly)
StGWWinInfo *gwinfo;
int (*action)(), motionOnly;
{
Point pt;
GrafPtr savePort;
WindowPtr w;
if (gwinfo == nil || (w = gwinfo->window) == nil) return;
GetPort(&savePort);
SetPort(w);
while (StillDown()) {
SetPort(w);
mac_do_cursor(gwinfo);
GetMouse(&pt);
if (gwinfo->mouse_x != pt.h || gwinfo->mouse_y != pt.v || ! motionOnly) {
gwinfo->mouse_x = pt.h; gwinfo->mouse_y = pt.v;
if (action != nil) (*action)(w, pt.h, pt.v);
}
}
SetPort(savePort);
}
static TitleBarHeight(w)
WindowPtr w;
{
Rect r;
Point pt;
WindowPeek wind = (WindowPeek) w;
GrafPtr savePort;
GetPort(&savePort);
SetPort(w);
SetPt(&pt, 0, 0);
LocalToGlobal(&pt);
r = (*(wind->strucRgn))->rgnBBox;
SetPort(savePort);
return(pt.v - r.top);
}
StWSetLocation(w, left, top, frame)
WindowPtr w;
int left, top, frame;
{
int adjust;
if (w == nil) return;
adjust = (frame) ? MBarHeight + TitleBarHeight(w) : MBarHeight;
MoveWindow(w, left, top + adjust, FALSE);
}
StWGetLocation(w, left, top, frame)
WindowPtr w;
int *left, *top, frame;
{
GrafPtr savePort;
Point pt;
int adjust;
if (w == nil) return;
else {
adjust = (frame) ? MBarHeight + TitleBarHeight(w) : MBarHeight;
GetPort(&savePort);
SetPort(w);
pt.h = w->portRect.left;
pt.v = w->portRect.top;
LocalToGlobal(&pt);
if (left != nil) *left = pt.h;
if (top != nil) *top = pt.v - adjust;
SetPort(savePort);
}
}
StGWSetSize(gwinfo, width, height, frame)
StGWWinInfo *gwinfo;
int width, height;
{
WindowPtr w;
if (gwinfo == nil || (w = gwinfo->window) == nil) return;
else StWSetSize(w, width, height, frame);
}
StWSetSize(w, width, height, frame)
WindowPtr w;
int width, height;
{
GrafPtr savePort;
if (w == nil) return;
GetPort(&savePort);
SetPort(w);
SizeWindow(w, width, height - ((frame) ? TitleBarHeight(w) : 0), TRUE);
InvalRect(&w->portRect);
mac_update_action(TRUE);
SetPort(savePort);
}
StWGetSize(w, width, height, frame)
WindowPtr w;
int *width, *height;
{
if (w == nil) return;
else {
if (width != nil) *width = w->portRect.right - w->portRect.left;
if (height != nil) *height = w->portRect.bottom - w->portRect.top
+ ((frame) ? TitleBarHeight(w) : 0);
}
}
/**************************************************************************/
/** **/
/** Window State Access and Mutation Functions **/
/** **/
/**************************************************************************/
SetHardwareState(gwinfo)
StGWWinInfo *gwinfo;
{
GrafPtr savePort;
WindowPtr w;
if (gwinfo == nil || (w = gwinfo->window) == nil) return;
GetPort(&savePort);
SetPort(w);
set_fore_color(gwinfo);
set_back_color(gwinfo);
if (gwinfo->drawMode == 0) w->pnMode = patCopy;
else w->pnMode = patXor;
if (gwinfo->drawMode == 0) {
w->txMode = srcOr;
gwinfo->symbolMode = srcCopy;
}
else {
w->txMode = srcXor;
gwinfo->symbolMode = srcXor;
}
/* set line type */
if (gwinfo->lineType != 0 && gwinfo->drawColor != gwinfo->backColor)
PenPat(gray);
else PenPat(black);
/* set pen size */
PenSize(gwinfo->lineWidth, gwinfo->lineWidth);
adjust_graph_workport(gwinfo);
SetPort(savePort);
}
static get_state(gwinfo, which)
StGWWinInfo *gwinfo;
int which;
{
if (gwinfo == nil) return(0);
switch (which) {
case 'W': return(gwinfo->canvasWidth);
case 'H': return(gwinfo->canvasHeight);
case 'L': return(gwinfo->lineType);
case 'M': return(gwinfo->drawMode);
case 'D': return(gwinfo->drawColor);
case 'B': return(gwinfo->backColor);
case 'C': return(gwinfo->use_color);
}
}
StGWCanvasWidth(gwinfo) StGWWinInfo *gwinfo; { return (get_state(gwinfo, 'W')); }
StGWCanvasHeight(gwinfo) StGWWinInfo *gwinfo;{ return (get_state(gwinfo, 'H')); }
StGWLineType(gwinfo) StGWWinInfo *gwinfo; { return (get_state(gwinfo, 'L')); }
StGWDrawMode(gwinfo) StGWWinInfo *gwinfo; { return (get_state(gwinfo, 'M')); }
ColorCode StGWDrawColor(gwinfo)
StGWWinInfo *gwinfo;
{
return ((ColorCode) get_state(gwinfo, 'D'));
}
ColorCode StGWBackColor(gwinfo)
StGWWinInfo *gwinfo;
{
return ((ColorCode) get_state(gwinfo, 'B'));
}
StGWUseColor(gwinfo) StGWWinInfo *gwinfo; { return (get_state(gwinfo, 'C')); }
StGWGetLineWidth(gwinfo, width)
StGWWinInfo *gwinfo;
int *width;
{
if (gwinfo == nil) return;
if (width != nil) *width = gwinfo->lineWidth;
}
static set_state(gwinfo, which, value)
StGWWinInfo *gwinfo;
int which, value;
{
int changed;
if (gwinfo == nil) return;
switch (which) {
case 'L': if ((changed = (value != gwinfo->lineType))) gwinfo->lineType = value; break;
case 'M': if ((changed = (value != gwinfo->drawMode))) gwinfo->drawMode = value; break;
case 'D': if ((changed = (value != gwinfo->drawColor))) gwinfo->drawColor = value; break;
case 'B': if ((changed = (value != gwinfo->backColor))) gwinfo->backColor = value; break;
case 'C': if ((changed = (value != gwinfo->use_color)))
gwinfo->use_color = (StScreenHasColor()) ? value : FALSE;
break;
}
if (changed) SetHardwareState(gwinfo);
if (changed && which == 'B') DrawGWGrowBox(gwinfo);
}
StGWSetLineType(gwinfo, type)
StGWWinInfo *gwinfo;
int type;
{
set_state(gwinfo, 'L', type);
}
StGWSetDrawMode(gwinfo, mode)
StGWWinInfo *gwinfo;
int mode;
{
set_state(gwinfo, 'M', mode);
}
StGWSetDrawColor(gwinfo, color)
StGWWinInfo *gwinfo;
ColorCode color;
{
set_state(gwinfo, 'D', (ColorCode) color);
}
StGWSetBackColor(gwinfo, color)
StGWWinInfo *gwinfo;
ColorCode color;
{
set_state(gwinfo, 'B', (ColorCode) color);
}
StGWSetUseColor(gwinfo, use)
StGWWinInfo *gwinfo;
int use;
{
set_state(gwinfo, 'C', use);
}
StGWSetLineWidth(gwinfo, width)
StGWWinInfo *gwinfo;
int width;
{
int changed;
if (gwinfo == nil) return;
changed = (width != gwinfo->lineWidth);
if (changed) {
gwinfo->lineWidth = width;
SetHardwareState(gwinfo);
}
}
StGWReverseColors(gwinfo)
StGWWinInfo *gwinfo;
{
ColorCode backColor, drawColor;
char *object;
object = (char *) StGWGetObject(gwinfo);
backColor = StGWBackColor(gwinfo);
drawColor = StGWDrawColor(gwinfo);
if (backColor != drawColor) {
StGWSetBackColor(gwinfo, drawColor);
StGWSetDrawColor(gwinfo, backColor);
StGWObRedraw(object);
}
}
StGWGetViewRect(gwinfo, left, top, width, height)
StGWWinInfo *gwinfo;
int *left, *top, *width, *height;
{
WindowPtr w;
if (gwinfo != nil && (w = gwinfo->window) != nil) {
if (left != nil) *left = w->portRect.left;
if (top != nil) *top = w->portRect.top;
if (width != nil) *width = w->portRect.right - w->portRect.left - 15;
if (height != nil) *height = w->portRect.bottom - w->portRect.top;
if (height != nil && StGWHasHscroll(gwinfo)) *height -= 15;
}
else {
if (left != nil) *left = 0;
if (top != nil) *top = 0;
if (width != nil) *width = 1;
if (height != nil) *height = 1;
}
}
/**************************************************************************/
/** **/
/** Window Scrolling Functions **/
/** **/
/**************************************************************************/
static set_has_scroll(gwinfo, which, has, size)
StGWWinInfo *gwinfo;
int which, has, size;
{
WindowPtr w;
GrafPtr savePort;
int view_size, value, old_has;
ControlHandle ctl;
char *object;
if (gwinfo == nil || (w = gwinfo->window) == nil) return;
GetPort(&savePort);
SetPort(w);
if (has && size <= 0) StPerror("size must be positive");
object = (char *) StGWGetObject(gwinfo);
ClipRect(&w->portRect);
ctl = (which == 'H') ? gwinfo->hscroll : gwinfo->vscroll;
old_has = (which == 'H') ? gwinfo->hasHscroll : gwinfo->hasVscroll;
if (which == 'H') gwinfo->hasHscroll = has;
else gwinfo->hasVscroll = has;
if (has) {
if (w == FrontWindow()) HiliteControl(ctl, 0);
else HiliteControl(ctl, 255);
if (which == 'H') {
if (! old_has) gwinfo->canvasHeight -= 15;
if (gwinfo->hasVscroll) {
StGWGetViewRect(gwinfo, nil, nil, nil, &view_size);
value = (gwinfo->canvasHeight - view_size > 0)
? gwinfo->canvasHeight - view_size : 0;
SetCtlMax(gwinfo->vscroll, value);
}
gwinfo->canvasWidth = size;
StGWGetViewRect(gwinfo, nil, nil, &view_size, nil);
}
else {
gwinfo->canvasHeight = size;
StGWGetViewRect(gwinfo, nil, nil, nil, &view_size);
}
value = (size - view_size > 0) ? size - view_size : 0;
SetCtlMax(ctl, value);
ShowControl(ctl);
}
else {
if (which == 'H') {
StGWGetViewRect(gwinfo, nil, nil, &gwinfo->canvasWidth, nil);
if (old_has) gwinfo->canvasHeight += 15;
StGWSetScroll(gwinfo, 0, gwinfo->view_v, TRUE);
}
else {
StGWGetViewRect(gwinfo, nil, nil, nil, &gwinfo->canvasHeight);
StGWSetScroll(gwinfo, gwinfo->view_h, 0, TRUE);
}
HideControl(ctl);
SetCtlMax(ctl, 0);
}
InvalRect(&w->portRect);
reset_clip_rect(gwinfo);
SetPort(savePort);
StGWObResize(object);
}
StGWSetHasHscroll(gwinfo, has, size)
StGWWinInfo *gwinfo;
int has, size;
{
set_has_scroll(gwinfo, 'H', has, size);
}
StGWSetHasVscroll(gwinfo, has, size)
StGWWinInfo *gwinfo;
int has, size;
{
set_has_scroll(gwinfo, 'V', has, size);
}
StGWHasHscroll(gwinfo)
StGWWinInfo *gwinfo;
{
if (gwinfo == nil) return(FALSE);
else return(gwinfo->hasHscroll);
}
StGWHasVscroll(gwinfo)
StGWWinInfo *gwinfo;
{
if (gwinfo == nil) return(FALSE);
else return(gwinfo->hasVscroll);
}
StGWSetScroll(gwinfo, h, v, move)
StGWWinInfo *gwinfo;
int h, v, move;
{
WindowPtr w;
GrafPtr savePort;
Rect r;
if (gwinfo == nil || (w = gwinfo->window) == nil) return;
gwinfo->view_h = (gwinfo->hasHscroll) ? h : 0;
gwinfo->view_v = (gwinfo->hasVscroll) ? v : 0;
GetPort(&savePort);
SetPort(w);
ClipRect(&w->portRect);
SetCtlValue(gwinfo->hscroll, h);
SetCtlValue(gwinfo->vscroll, v);
gwinfo->view_h = GetCtlValue(gwinfo->hscroll);
gwinfo->view_v = GetCtlValue(gwinfo->vscroll);
SetOrigin(gwinfo->view_h, gwinfo->view_v);
reset_clip_rect(gwinfo);
if (move) {
r = scroll_bar_bounds(w, 'H');
MoveControl(gwinfo->hscroll, r.left, r.top);
r = scroll_bar_bounds(w, 'V');
MoveControl(gwinfo->vscroll, r.left, r.top);
}
SetPort(savePort);
}
StGWGetScroll(gwinfo, h, v)
StGWWinInfo *gwinfo;
int *h, *v;
{
if (gwinfo != nil) {
if (h != nil) *h = gwinfo->view_h;
if (v != nil) *v = gwinfo->view_v;
}
}
StGWSetHscrollIncs(gwinfo, inc, pageInc)
StGWWinInfo *gwinfo;
int inc, pageInc;
{
if (gwinfo == nil) return;
gwinfo->h_scroll_inc[0] = inc;
gwinfo->h_scroll_inc[1] = pageInc;
}
StGWGetHscrollIncs(gwinfo, inc, pageInc)
StGWWinInfo *gwinfo;
int *inc, *pageInc;
{
if (gwinfo == nil) return;
if (inc != 0) *inc = gwinfo->h_scroll_inc[0];
if (pageInc != 0) *pageInc = gwinfo->h_scroll_inc[1];
}
StGWSetVscrollIncs(gwinfo, inc, pageInc)
StGWWinInfo *gwinfo;
int inc, pageInc;
{
if (gwinfo == nil) return;
gwinfo->v_scroll_inc[0] = inc;
gwinfo->v_scroll_inc[1] = pageInc;
}
StGWGetVscrollIncs(gwinfo, inc, pageInc)
StGWWinInfo *gwinfo;
int *inc, *pageInc;
{
if (gwinfo == nil) return;
if (inc != 0) *inc = gwinfo->v_scroll_inc[0];
if (pageInc != 0) *pageInc = gwinfo->v_scroll_inc[1];
}
/**************************************************************************/
/** **/
/** Graph Window RefCon Functions **/
/** **/
/**************************************************************************/
StGWSetRefCon(gwinfo, x)
StGWWinInfo *gwinfo;
long x;
{
if (gwinfo == nil) return;
else gwinfo->RefCon = x;
}
long StGWGetRefCon(gwinfo)
StGWWinInfo *gwinfo;
{
if (gwinfo == nil) return(nil);
else return(gwinfo->RefCon);
}
StGWSetObject(gwinfo, x)
StGWWinInfo *gwinfo;
long x;
{
if (gwinfo == nil) return;
else gwinfo->Object = x;
}
long IViewWindowGetObject(w)
WindowPtr w;
{
StGWWinInfo *gwinfo = (StGWWinInfo *) GetWRefCon(w);
if (gwinfo == nil) return(nil);
else return(gwinfo->Object);
}
long StGWGetObject(gwinfo)
StGWWinInfo *gwinfo;
{
return((gwinfo != nil) ? gwinfo->Object : nil);
}
StGWInitialDraw(gwinfo)
StGWWinInfo *gwinfo;
{
WindowPtr w;
if (gwinfo != nil && (w = gwinfo->window) != nil) {
graph_update_action(gwinfo, TRUE);
/*ValidRect(&w->portRect);*//* causes problems with new initial draw */
}
}
/**************************************************************************/
/** **/
/** Graph Window Color Functions **/
/** **/
/**************************************************************************/
#define NumBasicColors 8
#define NumRGBColors 100
# define MULTIPLIER 62535
static int NumColors;
typedef struct {
union {
long old;
RGBColor rgb;
} value;
long refcon;
} ctab_entry;
static ctab_entry *ctable;
init_mac_colors()
{
NumColors = NumBasicColors;
if (StScreenHasColor()) NumColors += NumRGBColors;
ctable = (ctab_entry *) StCalloc(NumColors, sizeof(ctab_entry));
ctable[0].value.old = whiteColor;
ctable[1].value.old = blackColor;
ctable[2].value.old = redColor;
ctable[3].value.old = greenColor;
ctable[4].value.old = blueColor;
ctable[5].value.old = cyanColor;
ctable[6].value.old = magentaColor;
ctable[7].value.old = yellowColor;
}
StGWMakeColor(red, green, blue, refcon)
double red, green, blue;
long refcon;
{
int index;
for (index = NumBasicColors;
index < NumColors && StGWGetColRefCon(index) != nil;
index++);
if (index >= NumColors) return(-1);
else {
StGWSetColRefCon(index, refcon);
ctable[index].value.rgb.red = MULTIPLIER * red;
ctable[index].value.rgb.green = MULTIPLIER * green;
ctable[index].value.rgb.blue = MULTIPLIER * blue;
return(index);
}
}
StGWFreeColor(index)
unsigned int index;
{
if (index < NumColors && index >= NumBasicColors)
StGWSetColRefCon(index, nil);
else StPerror("can't free standard color");
}
StGWSetColRefCon(index, rc)
unsigned int index;
long rc;
{
if (index < NumColors) ctable[index].refcon = rc;
}
long StGWGetColRefCon(index)
unsigned int index;
{
if (index < NumColors) return(ctable[index].refcon);
else return(nil);
}
static long get_color(index)
unsigned int index;
{
if (index < NumBasicColors) return(ctable[index].value.old);
else return(ctable[1].value.old);
}
static RGBColor *get_rgb_color(index)
unsigned int index;
{
if (index < NumColors) return(&ctable[index].value.rgb);
else StPerror("bad rgb color");
}
set_fore_color(gwinfo)
StGWWinInfo *gwinfo;
{
if (gwinfo->drawColor < NumBasicColors)
ForeColor(get_color(gwinfo->drawColor));
else RGBForeColor(get_rgb_color(gwinfo->drawColor));
}
set_back_color(gwinfo)
StGWWinInfo *gwinfo;
{
if (gwinfo->backColor < NumBasicColors)
BackColor(get_color(gwinfo->backColor));
else RGBForeColor(get_rgb_color(gwinfo->backColor));
}