executor/src/listDisplay.c

266 lines
6.6 KiB
C

/* Copyright 1989, 1990 by Abacus Research and
* Development, Inc. All rights reserved.
*/
#if !defined (OMIT_RCSID_STRINGS)
char ROMlib_rcsid_listDisplay[] =
"$Id: listDisplay.c 63 2004-12-24 18:19:43Z ctm $";
#endif
/* Forward declarations in ListMgr.h (DO NOT DELETE THIS LINE) */
#include "rsys/common.h"
#include "ListMgr.h"
#include "rsys/cquick.h"
#include "rsys/list.h"
#include "rsys/hook.h"
P2(PUBLIC pascal trap, void, LDraw, Cell, cell, /* IMIV-275 */
ListHandle, list)
{
GrafPtr saveport;
RgnHandle saveclip;
Rect r;
INTEGER *ip, off0, off1;
BOOLEAN setit;
LISTDECL();
if ((ip = ROMlib_getoffp(cell, list))) {
off0 = CW(ip[0]) & 0x7FFF;
off1 = CW(ip[1]) & 0x7FFF;
setit = (CW(ip[0]) & 0x8000) && Hx(list, lActive);
saveport = thePort;
SetPort(HxP(list, port));
saveclip = PORT_CLIP_REGION_X (thePort);
PORT_CLIP_REGION_X (thePort) = RM (NewRgn ());
C_LRect(&r, cell, list);
ClipRect(&r);
LISTBEGIN(list);
LISTCALL(lDrawMsg, setit, &r, cell, off0, off1 - off0, list);
LISTEND(list);
DisposeRgn (PORT_CLIP_REGION (thePort));
PORT_CLIP_REGION_X (thePort) = saveclip;
SetPort (saveport);
}
}
P2(PUBLIC pascal trap, void, LDoDraw, BOOLEAN, draw, /* IMIV-275 */
ListHandle, list)
{
if (draw) {
HxX(list, listFlags) |= DODRAW;
if (Hx(list, lActive)) {
if (HxP(list, vScroll))
ShowControl(HxP(list, vScroll));
if (HxP(list, hScroll))
ShowControl(HxP(list, hScroll));
}
} else
HxX(list, listFlags) &= ~DODRAW;
}
P3(PUBLIC pascal trap, void, LScroll, INTEGER, ncol, /* IMIV-275 */
INTEGER, nrow, ListHandle, list)
{
RgnHandle rh;
Rect r;
ControlHandle ch;
INTEGER tmpi;
Point p;
TRAPBEGIN();
r = HxX(list, rView);
/*
* TODO: if either the horizontal or vertical component of a view rectangle
* isn't a multiple of the appropriate component of the cell size then
* you need to allow an extra (blank) cell when scrolled totally to
* the bottom or to the right.
*/
if (nrow < 0) {
tmpi = Hx(list, dataBounds.top) - Hx(list, visible.top);
if (tmpi > nrow)
nrow = tmpi;
} else if (nrow > 0) {
tmpi = Hx(list, dataBounds.bottom) - Hx(list, visible.bottom) + 1;
if (tmpi < nrow)
nrow = tmpi;
}
if (ncol < 0) {
tmpi = Hx(list, dataBounds.left) - Hx(list, visible.left);
if (tmpi > ncol)
ncol = tmpi;
} else if (ncol > 0) {
tmpi = Hx(list, dataBounds.right) - Hx(list, visible.right) + 1;
if (tmpi < ncol)
ncol = tmpi;
}
HxX(list, visible.top) = CW(Hx(list, visible.top) + nrow);
HxX(list, visible.left) = CW(Hx(list, visible.left) + ncol);
p.h = Hx(list, cellSize.h);
p.v = Hx(list, cellSize.v);
C_LCellSize(p, list); /* recalculates visible */
if (ncol && (ch = HxP(list, hScroll)))
SetCtlValue(ch, Hx(list, visible.left));
if (nrow && (ch = HxP(list, vScroll)))
SetCtlValue(ch, Hx(list, visible.top));
if (Hx(list, listFlags) & DODRAW) {
rh = NewRgn();
ScrollRect(&r, -ncol * Hx(list, cellSize.h),
-nrow * Hx(list, cellSize.v), rh);
C_LUpdate(rh, list);
DisposeRgn(rh);
}
TRAPEND();
}
P1(PUBLIC pascal trap, void, LAutoScroll, ListHandle, list) /* IMIV-275 */
{
Cell cell;
cell.h = HxX(list, dataBounds.left);
cell.v = HxX(list, dataBounds.top);
if (C_LGetSelect(TRUE, &cell, list)) {
cell.h = CW(cell.h);
cell.v = CW(cell.v);
if (!PtInRect(cell, &HxX(list, visible))) {
C_LScroll(cell.h - Hx(list, visible.left),
cell.v - Hx(list, visible.top), list);
}
}
}
P2(PUBLIC pascal trap, void, LUpdate, RgnHandle, rgn, /* IMIV-275 */
ListHandle, list)
{
Rect r;
Cell c, csize;
INTEGER cleft;
INTEGER top, left, bottom, right;
ControlHandle ch;
TRAPBEGIN();
cleft = c.h = Hx(list, visible.left);
c.v = Hx(list, visible.top);
csize.h = Hx(list, cellSize.h);
csize.v = Hx(list, cellSize.v);
C_LRect(&r, c, list);
top = CW(r.top);
left = CW(r.left);
bottom = top + (Hx(list, visible.bottom) - Hx(list, visible.top)) * csize.v;
right = left + (Hx(list, visible.right) - Hx(list, visible.left)) * csize.h;
while (CW(r.top) < bottom) {
while (CW(r.left) < right) {
if (RectInRgn(&r, rgn))
C_LDraw(c, list);
r.left = CW(CW(r.left ) + (csize.h));
r.right = CW(CW(r.right) + (csize.h));
c.h++;
}
c.h = cleft;
c.v++;
r.top = CW(CW(r.top) + (csize.v));
r.bottom = CW(CW(r.bottom) + (csize.v));
r.left = CW(left);
r.right = CW(left + csize.h);
}
if ((ch = HxP(list, hScroll))) {
if (RectInRgn(&HxX(ch, contrlRect), rgn))
Draw1Control(ch);
}
if ((ch = HxP(list, vScroll))) {
if (RectInRgn(&HxX(ch, contrlRect), rgn))
Draw1Control(ch);
}
TRAPEND();
}
P2(PUBLIC pascal trap, void, LActivate, BOOLEAN, act, /* IMIV-276 */
ListHandle, list)
{
Cell c;
Rect r;
ControlHandle ch;
BOOLEAN sel;
INTEGER *ip, off0, off1;
RgnHandle saveclip;
LISTDECL();
if (!act ^ !Hx(list, lActive)) {
TRAPBEGIN();
if (act) {
sel = TRUE;
if ((ch = HxP(list, hScroll)))
ShowControl(ch);
if ((ch = HxP(list, vScroll)))
ShowControl(ch);
} else {
sel = FALSE;
if ((ch = HxP(list, hScroll)))
HideControl(ch);
if ((ch = HxP(list, vScroll)))
HideControl(ch);
}
LISTBEGIN(list);
for (c.v = Hx(list, visible.top); c.v < Hx(list, visible.bottom);
c.v++) {
for (c.h = Hx(list, visible.left); c.h < Hx(list, visible.right);
c.h++) {
if ((ip = ROMlib_getoffp(c, list)) && (CW(*ip) & 0x8000)) {
off0 = CW(ip[0]) & 0x7FFF;
off1 = CW(ip[1]) & 0x7FFF;
saveclip = PORT_CLIP_REGION_X (thePort);
PORT_CLIP_REGION_X (thePort) = RM (NewRgn ());
C_LRect(&r, c, list);
ClipRect(&r);
LISTCALL(lHiliteMsg, sel, &r, c, off0, off1 - off0, list);
DisposeRgn (PORT_CLIP_REGION (thePort));
PORT_CLIP_REGION_X (thePort) = saveclip;
}
}
}
LISTEND(list);
HxX(list, lActive) = !!act;
TRAPEND();
}
}
#if defined (BINCOMPAT)
void
ROMlib_listcall (INTEGER mess, BOOLEAN sel, Rect *rp, Cell cell, INTEGER off,
INTEGER len, ListHandle lhand)
{
Handle listdefhand;
listdefhand = HxP(lhand, listDefProc);
if (listdefhand)
{
listprocp lp;
lp = MR( *(listprocp *)listdefhand);
if (!(long) lp) {
LoadResource(HxP(lhand, listDefProc));
lp =MR( *(listprocp *)HxP(lhand, listDefProc));
}
if (lp == P_ldef0)
C_ldef0(mess, sel, rp, cell, off, len, lhand);
else {
ROMlib_hook(list_ldefnumber);
HOOKSAVEREGS();
CToPascalCall(lp, CTOP_ldef0, mess, sel, rp, cell, off, len, lhand);
HOOKRESTOREREGS();
}
}
}
#endif /* BINCOMPAT */