executor/src/ctlDisplay.c

162 lines
3.7 KiB
C

/* Copyright 1986, 1988, 1989, 1990, 1995 by Abacus Research and
* Development, Inc. All rights reserved.
*/
#if !defined (OMIT_RCSID_STRINGS)
char ROMlib_rcsid_ctlDisplay[] =
"$Id: ctlDisplay.c 85 2005-05-24 22:06:13Z ctm $";
#endif
/* Forward declarations in ControlMgr.h (DO NOT DELETE THIS LINE) */
#include "rsys/common.h"
#include "WindowMgr.h"
#include "ControlMgr.h"
#include "rsys/ctl.h"
#include "rsys/wind.h"
P2(PUBLIC pascal trap, void, SetCTitle, ControlHandle, c, /* IMI-321 */
StringPtr, t)
{
if (c)
{
CTL_CALL_EXCURSION
(c,
{
RgnHandle rh;
rh = NewRgn();
CTLCALL(c, calcCntlRgn, (LONGINT) (long) rh);
EraseRgn(rh);
str255assign(HxX(c, contrlTitle), t);
CTLCALL(c, drawCntl, ENTIRECONTROL);
DisposeRgn(rh);
});
}
}
P2(PUBLIC pascal trap, void, GetCTitle, ControlHandle, c, /* IMI-321 */
StringPtr, t)
{
if (c)
str255assign(t, HxX(c, contrlTitle));
}
P1(PUBLIC pascal trap, void, HideControl, ControlHandle, c) /* IMI-322 */
{
if (c)
{
CTL_CALL_EXCURSION
(c,
{
RgnHandle rh;
if (c && CTL_VIS (c))
{
rh = NewRgn();
/* #### warning; should this be called with the control
owner as the current port, or no? */
CTLCALL(c, calcCntlRgn, (LONGINT) (long) rh);
/* The following code is a hack that works around a problem
due to the different meanings of the fgColor and bgColor
fields of a grafport vs. a cgrafport. In a grafport, those
fields contain magic numbers, but in a cgrafport they
contain colortable indices. This means that if a grafport
is turned into a cgrafport, the old values may cause
trouble. This makes me wonder whether or not our use of
them as indices is really correct. W/o the following fix,
LogDig will erase magenta when you open a file and then
use Cmd-= to create a check-box, if you check and un-check
the check-box. */
if (CGrafPort_p (thePort))
{
RGBForeColor (&CPORT_RGB_FG_COLOR (thePort));
RGBBackColor (&CPORT_RGB_BK_COLOR (thePort));
}
EraseRgn(rh);
InvalRgn(rh);
DisposeRgn(rh);
CTL_VIS (c) = FALSE;
}
});
}
}
/* It appears that ShowControl does not erase anything before calling
drawCntl. This is based on Loser running on the Mac, vs. running
under Executor. The EraseRgn used to be an EraseRect that was put
into ctlDisplay a long time ago, and with no fanfare. Perhaps
there is more going on here; I don't know. */
P1(PUBLIC pascal trap, void, ShowControl, ControlHandle, c) /* IMI-322 */
{
if (c)
{
CTL_CALL_EXCURSION
(c,
{
/* #if SHOWCONTROL_ERASES
RgnHandle rh; */
if (c && !CTL_VIS (c))
{
/* #if SHOWCONTROL_ERASES
rh = NewRgn(); */
HxX(c, contrlVis) = 255;
/* #if SHOWCONTROL_ERASES
CTLCALL(c, calcCntlRgn, (LONGINT) (long) rh);
EraseRgn(rh);
DisposeRgn(rh); */
CTLCALL(c, drawCntl, 0);
}
});
}
}
P2 (PUBLIC pascal trap, void, HiliteControl, ControlHandle, c, /* IMI-322 */
INTEGER, state)
{
if (c && c->p)
{
if (CTL_VIS (c))
{
int16 oldh;
oldh = CTL_HILITE (c);
if (oldh != state)
{
CTL_CALL_EXCURSION
(c,
{
HxX (c, contrlHilite) = state;
if (oldh == INACTIVE || state == INACTIVE)
CTLCALL(c, drawCntl, 0);
else
CTLCALL(c, drawCntl, state);
});
}
}
else
CTL_HILITE_X (c) = state;
}
}
P1(PUBLIC pascal trap, void, DrawControls, WindowPtr, w) /* IMI-322 */
{
ControlHandle c;
if (! ROMlib_emptyvis)
{
for (c = WINDOW_CONTROL_LIST (w); c ; c = CTL_NEXT_CONTROL (c))
Draw1Control(c);
}
}