mirror of
https://github.com/ctm/executor.git
synced 2024-10-01 00:57:10 +00:00
488 lines
12 KiB
C
488 lines
12 KiB
C
|
/* Copyright 1986-1996 by Abacus Research and
|
||
|
* Development, Inc. All rights reserved.
|
||
|
*/
|
||
|
|
||
|
#if !defined (OMIT_RCSID_STRINGS)
|
||
|
char ROMlib_rcsid_dialManip[] =
|
||
|
"$Id: dialManip.c 86 2005-05-25 00:47:12Z ctm $";
|
||
|
#endif
|
||
|
|
||
|
/* Forward declarations in DialogMgr.h (DO NOT DELETE THIS LINE) */
|
||
|
|
||
|
#include "rsys/common.h"
|
||
|
|
||
|
#include "ControlMgr.h"
|
||
|
#include "DialogMgr.h"
|
||
|
#include "OSUtil.h"
|
||
|
#include "MemoryMgr.h"
|
||
|
|
||
|
#include "rsys/itm.h"
|
||
|
#include "rsys/wind.h"
|
||
|
#include "rsys/ctl.h"
|
||
|
#include "rsys/cquick.h"
|
||
|
#include "rsys/mman.h"
|
||
|
|
||
|
P4(PUBLIC pascal trap, void, ParamText, StringPtr, p0, /* IMI-421 */
|
||
|
StringPtr, p1, StringPtr, p2, StringPtr, p3)
|
||
|
{
|
||
|
if (p0)
|
||
|
PtrToXHand((Ptr) p0, MR(DAStrings_H[0].p), (LONGINT)U(p0[0])+1);
|
||
|
if (p1)
|
||
|
PtrToXHand((Ptr) p1, MR(DAStrings_H[1].p), (LONGINT)U(p1[0])+1);
|
||
|
if (p2)
|
||
|
PtrToXHand((Ptr) p2, MR(DAStrings_H[2].p), (LONGINT)U(p2[0])+1);
|
||
|
if (p3)
|
||
|
PtrToXHand((Ptr) p3, MR(DAStrings_H[3].p), (LONGINT)U(p3[0])+1);
|
||
|
}
|
||
|
|
||
|
A3 (PUBLIC, itmp, ROMlib_dpnotoip, DialogPeek, dp, /* INTERNAL */
|
||
|
INTEGER, itemno, SignedByte *, flags)
|
||
|
{
|
||
|
Handle items;
|
||
|
INTEGER *intp;
|
||
|
itmp retval;
|
||
|
|
||
|
items = DIALOG_ITEMS (dp);
|
||
|
*flags = hlock_return_orig_state (items);
|
||
|
intp = (INTEGER *) STARH (items);
|
||
|
if (itemno <= 0 || itemno > CW (*intp) + 1)
|
||
|
retval = 0;
|
||
|
else
|
||
|
{
|
||
|
retval = (itmp) (intp + 1);
|
||
|
while (--itemno)
|
||
|
BUMPIP (retval);
|
||
|
}
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
A4 (PRIVATE, itmp, htoip, Handle, h,
|
||
|
WindowPeek *, wp_return, int16 *, nop_return,
|
||
|
SignedByte *, flags_return)
|
||
|
{
|
||
|
WindowPeek wp;
|
||
|
int16 *ip, i, nop;
|
||
|
itmp retval;
|
||
|
|
||
|
for (wp = MR (WindowList); wp; wp = WINDOW_NEXT_WINDOW (wp))
|
||
|
{
|
||
|
if (WINDOW_KIND_X (wp) == CWC (dialogKind)
|
||
|
|| WINDOW_KIND (wp) < 0)
|
||
|
{
|
||
|
Handle items;
|
||
|
SignedByte flags;
|
||
|
|
||
|
items = DIALOG_ITEMS (wp);
|
||
|
flags = hlock_return_orig_state (items);
|
||
|
|
||
|
ip = (int16 *) STARH (items);
|
||
|
retval = (itmp) (ip + 1);
|
||
|
for (i = CW (*ip) + 1, nop = 1; i --; BUMPIP (retval))
|
||
|
{
|
||
|
if (MR (retval->itmhand) == h)
|
||
|
{
|
||
|
*wp_return = wp;
|
||
|
*nop_return = nop;
|
||
|
*flags_return = flags;
|
||
|
return retval;
|
||
|
}
|
||
|
nop ++;
|
||
|
}
|
||
|
HSetState (items, flags);
|
||
|
}
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
P5(PUBLIC pascal trap, void, GetDItem, DialogPtr, dp, /* IMI-421 */
|
||
|
INTEGER, itemno, INTEGER *, itype, HIDDEN_Handle *, item, Rect *, r)
|
||
|
{
|
||
|
SignedByte flags;
|
||
|
itmp ip = ROMlib_dpnotoip((DialogPeek) dp, itemno, &flags);
|
||
|
|
||
|
if (ip)
|
||
|
{
|
||
|
if (itype)
|
||
|
*itype = CW((INTEGER) ip->itmtype);
|
||
|
else
|
||
|
{
|
||
|
/* test on Mac shows unconditional write of *itype */
|
||
|
/* of course this is very rude, but that's what the Mac did
|
||
|
when we tested it. Perhaps they've fixed that now and we
|
||
|
too should fix it. ARGH! */
|
||
|
*(INTEGER *) (US_TO_SYN68K(itype)) = CW((INTEGER) ip->itmtype);
|
||
|
}
|
||
|
if (item) /* We didn't test what happens when item is 0 on Mac */
|
||
|
(*item).p = ip->itmhand;
|
||
|
if (r) /* test on Mac shows r will not be written if 0 */
|
||
|
*r = ip->itmr;
|
||
|
}
|
||
|
HSetState(MR(((DialogPeek) dp)->items), flags);
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
settexth (DialogPeek dp, itmp ip, int item_no)
|
||
|
{
|
||
|
GrafPtr current_port;
|
||
|
Handle item_text_h;
|
||
|
TEHandle te;
|
||
|
TEPtr tep;
|
||
|
int16 length;
|
||
|
|
||
|
current_port = thePort;
|
||
|
|
||
|
te = DIALOG_TEXTH (dp);
|
||
|
tep = STARH (te);
|
||
|
|
||
|
TEP_DEST_RECT (tep) = TEP_VIEW_RECT (tep) = ITEM_RECT (ip);
|
||
|
|
||
|
#if 0
|
||
|
/* #### this was commented out, otherwise it's origin is unknown */
|
||
|
InsetRect (TEP_VIEW_RECT (tep), -3, -3);
|
||
|
#endif
|
||
|
|
||
|
item_text_h = ITEM_H (ip);
|
||
|
length = GetHandleSize (item_text_h);
|
||
|
TEP_LENGTH_X (tep) = CW (length);
|
||
|
/* this is not a leak, always a duplicate */
|
||
|
TEP_HTEXT_X (tep) = RM (item_text_h);
|
||
|
|
||
|
/* set up the text styles */
|
||
|
{
|
||
|
int16 te_style_size, te_style_font;
|
||
|
Style te_style_face;
|
||
|
RGBColor te_style_color;
|
||
|
uint16 flags;
|
||
|
item_style_info_t style_info;
|
||
|
|
||
|
te_style_font = PORT_TX_FONT (dp);
|
||
|
te_style_face = PORT_TX_FACE (dp);
|
||
|
te_style_size = PORT_TX_SIZE (dp);
|
||
|
|
||
|
THEPORT_SAVE_EXCURSION
|
||
|
((GrafPtr) dp, { GetForeColor (&te_style_color); });
|
||
|
|
||
|
if (get_item_style_info ((DialogPtr) dp, item_no, &flags, &style_info))
|
||
|
{
|
||
|
if (flags & TEdoFont)
|
||
|
te_style_font = CW (style_info.font);
|
||
|
if (flags & TEdoFace)
|
||
|
te_style_face = CB (style_info.face);
|
||
|
if (flags & TEdoSize)
|
||
|
te_style_size = CW (style_info.size);
|
||
|
|
||
|
if (flags & TEdoColor)
|
||
|
te_style_color = style_info.foreground;
|
||
|
#if 0
|
||
|
/* ##### */
|
||
|
if (flags & doBColor)
|
||
|
... = style_info.background;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
/* #### this code should be somehow unified with `TESetText ()',
|
||
|
although that cannot be called directly */
|
||
|
|
||
|
if (TEP_STYLIZED_P (tep))
|
||
|
{
|
||
|
TEStyleHandle te_style;
|
||
|
STHandle style_table;
|
||
|
FontInfo finfo;
|
||
|
int16 tx_font_save_x, tx_size_save_x;
|
||
|
Style tx_face_save;
|
||
|
|
||
|
te_style = TE_GET_STYLE (te);
|
||
|
HASSIGN_2
|
||
|
(te_style,
|
||
|
nRuns, CWC (1),
|
||
|
nStyles, CWC (1));
|
||
|
|
||
|
SetHandleSize ((Handle) te_style,
|
||
|
TE_STYLE_SIZE_FOR_N_RUNS (1));
|
||
|
HxX (te_style, runs[0].startChar) = CWC (0);
|
||
|
HxX (te_style, runs[0].styleIndex) = CWC (0);
|
||
|
HxX (te_style, runs[1].startChar) = CW (length + 1);
|
||
|
HxX (te_style, runs[1].styleIndex) = CWC (-1);
|
||
|
style_table = TE_STYLE_STYLE_TABLE (te_style);
|
||
|
SetHandleSize ((Handle) style_table,
|
||
|
STYLE_TABLE_SIZE_FOR_N_STYLES (1));
|
||
|
|
||
|
tx_font_save_x = PORT_TX_FONT_X (current_port);
|
||
|
tx_size_save_x = PORT_TX_SIZE_X (current_port);
|
||
|
tx_face_save = PORT_TX_FACE (current_port);
|
||
|
|
||
|
PORT_TX_FONT_X (current_port) = CW (te_style_font);
|
||
|
PORT_TX_SIZE_X (current_port) = CW (te_style_size);
|
||
|
PORT_TX_FACE (current_port) = CB (te_style_face);
|
||
|
|
||
|
GetFontInfo (&finfo);
|
||
|
|
||
|
PORT_TX_FONT_X (current_port) = tx_font_save_x;
|
||
|
PORT_TX_SIZE_X (current_port) = tx_size_save_x;
|
||
|
PORT_TX_FACE (current_port) = tx_face_save;
|
||
|
|
||
|
HASSIGN_7
|
||
|
(style_table,
|
||
|
stCount, CWC (1),
|
||
|
stFont, CW (te_style_font),
|
||
|
stFace, te_style_face,
|
||
|
stSize, CW (te_style_size),
|
||
|
stColor, te_style_color,
|
||
|
stHeight, CW (CW (finfo.ascent)
|
||
|
+ CW (finfo.descent)
|
||
|
+ CW (finfo.leading)),
|
||
|
stAscent, finfo.ascent);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
TEP_TX_FONT_X (tep) = CW (te_style_font);
|
||
|
TEP_TX_SIZE_X (tep) = CW (te_style_size);
|
||
|
TEP_TX_FACE (tep) = CB (te_style_face);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TEP_SEL_START_X (tep) = TEP_SEL_END_X (tep) = CWC (0);
|
||
|
|
||
|
TECalText (te);
|
||
|
if (WINDOW_VISIBLE_X (dp))
|
||
|
TEActivate (te);
|
||
|
|
||
|
DIALOG_EDIT_FIELD_X (dp) = CW (item_no - 1);
|
||
|
DIALOG_EDIT_OPEN_X (dp) = CW (! (ITEM_TYPE (ip) & itemDisable));
|
||
|
}
|
||
|
|
||
|
P5(PUBLIC pascal trap, void, SetDItem, DialogPtr, dp, /* IMI-421 */
|
||
|
INTEGER, itemno, INTEGER, itype, Handle, item, Rect *, r)
|
||
|
{
|
||
|
|
||
|
SignedByte flags;
|
||
|
itmp ip = ROMlib_dpnotoip((DialogPeek) dp, itemno, &flags);
|
||
|
|
||
|
if (ip)
|
||
|
{
|
||
|
ip->itmtype = CB(itype);
|
||
|
ip->itmhand = RM(item);
|
||
|
ip->itmr = *r;
|
||
|
if (itemno - 1 == DIALOG_EDIT_FIELD (dp)
|
||
|
&& (itype & editText)
|
||
|
&& !(itype & itemDisable))
|
||
|
{
|
||
|
TEDeactivate (DIALOG_TEXTH (dp));
|
||
|
if (item)
|
||
|
settexth ((DialogPeek) dp, ip, itemno);
|
||
|
else
|
||
|
warning_unexpected (NULL_STRING);
|
||
|
}
|
||
|
}
|
||
|
HSetState(MR(((DialogPeek) dp)->items), flags);
|
||
|
}
|
||
|
|
||
|
P2(PUBLIC pascal trap, void, GetIText, Handle, item, /* IMI-422 */
|
||
|
StringPtr, text)
|
||
|
{
|
||
|
Size hs;
|
||
|
|
||
|
if (text)
|
||
|
{
|
||
|
if (!item)
|
||
|
text[0] = 0;
|
||
|
else
|
||
|
{
|
||
|
hs = GetHandleSize(item);
|
||
|
if (hs > 255) /* can't strassign with no leading count */
|
||
|
hs = 255;
|
||
|
text[0] = hs;
|
||
|
BlockMove(STARH(item), (Ptr) text+1, hs);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
P2(PUBLIC pascal trap, void, SetIText, Handle, item, /* IMI-422 */
|
||
|
StringPtr, text)
|
||
|
{
|
||
|
if (item) /* put this test in for Golf 6.0's sake */
|
||
|
{
|
||
|
WindowPeek wp;
|
||
|
SignedByte flags;
|
||
|
int16 no;
|
||
|
itmp ip;
|
||
|
Size hs;
|
||
|
|
||
|
hs = text[0];
|
||
|
/* test on Mac suggests not reallochandle */
|
||
|
SetHandleSize (item, hs);
|
||
|
|
||
|
/* test on Mac shows that if the size can't be set, the copy
|
||
|
isn't done, but the rest is */
|
||
|
if (MemErr == CWC (noErr))
|
||
|
BlockMove((Ptr) &text[1], STARH (item), hs);
|
||
|
ip = htoip (item, &wp, &no, &flags);
|
||
|
if (ip)
|
||
|
{
|
||
|
THEPORT_SAVE_EXCURSION
|
||
|
((WindowPtr) wp,
|
||
|
{
|
||
|
ROMlib_drawiptext ((DialogPtr) wp, ip, no);
|
||
|
if (no == DIALOG_EDIT_FIELD (wp) + 1)
|
||
|
{
|
||
|
TEHandle text_h;
|
||
|
|
||
|
text_h = DIALOG_TEXTH (wp);
|
||
|
|
||
|
TE_CARET_STATE_X (text_h) = CWC (255);
|
||
|
TESetText ((Ptr) &text[1], text[0],
|
||
|
text_h);
|
||
|
}
|
||
|
ValidRect (&ip->itmr);
|
||
|
});
|
||
|
HSetState (DIALOG_ITEMS (wp), flags);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* fields of TERec that need to be updated:
|
||
|
* destRect, viewRect, selStart, selEnd, caretState, teLength, hText, nLines,
|
||
|
* lineStarts
|
||
|
*/
|
||
|
|
||
|
A2(PUBLIC, void, ROMlib_dpntoteh, DialogPeek, dp, INTEGER, no) /* INTERNAL */
|
||
|
{
|
||
|
SignedByte flags;
|
||
|
itmp ip;
|
||
|
INTEGER *intp, num;
|
||
|
|
||
|
if (no == 0)
|
||
|
{
|
||
|
/* special case ... find next */
|
||
|
intp = (INTEGER *) STARH (MR(dp->items));
|
||
|
num =Cx (*intp) + 1;
|
||
|
ip = ROMlib_dpnotoip (dp, no = Cx (dp->editField) + 1, &flags);
|
||
|
do
|
||
|
{
|
||
|
if (ip)
|
||
|
BUMPIP(ip);
|
||
|
else
|
||
|
warning_unexpected ("no (inherited from editField) = %d", no);
|
||
|
if (!ip || ++no > num)
|
||
|
{
|
||
|
ip = (itmp)(intp + 1);
|
||
|
no = 1;
|
||
|
}
|
||
|
} while (!(CB(ip->itmtype) & editText));
|
||
|
}
|
||
|
else
|
||
|
ip = ROMlib_dpnotoip(dp, no, &flags);
|
||
|
if (ip && (Cx (dp->editField) != no - 1))
|
||
|
{
|
||
|
if (Cx (dp->editField) != -1)
|
||
|
TEDeactivate (MR(dp->textH));
|
||
|
settexth(dp, ip, no);
|
||
|
}
|
||
|
HSetState (MR(((DialogPeek) dp)->items), flags);
|
||
|
}
|
||
|
|
||
|
P4(PUBLIC pascal trap, void, SelIText, DialogPtr, dp, /* IMI-422 */
|
||
|
INTEGER, itemno, INTEGER, start, INTEGER, stop)
|
||
|
{
|
||
|
ROMlib_dpntoteh ((DialogPeek) dp, itemno);
|
||
|
TESetSelect (start, stop, DIALOG_TEXTH (dp));
|
||
|
}
|
||
|
|
||
|
A0(PUBLIC, INTEGER, GetAlrtStage) /* IMI-422 */
|
||
|
{
|
||
|
return Cx(ACount);
|
||
|
}
|
||
|
|
||
|
A0(PUBLIC, void, ResetAlrtStage) /* IMI-423 */
|
||
|
{
|
||
|
ACount = 0;
|
||
|
}
|
||
|
|
||
|
P2 (PUBLIC pascal trap, void, HideDItem, DialogPtr, dp, /* IMIV-59 */
|
||
|
INTEGER, item)
|
||
|
{
|
||
|
itmp ip;
|
||
|
Rect r;
|
||
|
SignedByte flags;
|
||
|
|
||
|
ip = ROMlib_dpnotoip((DialogPeek) dp, item, &flags);
|
||
|
if (ip && CW (ip->itmr.left) < 8192)
|
||
|
{
|
||
|
r = ip->itmr;
|
||
|
ip->itmr.left = CW (CW (ip->itmr.left) + 16384);
|
||
|
ip->itmr.right = CW (CW (ip->itmr.right) + 16384);
|
||
|
if (CB (ip->itmtype) & editText)
|
||
|
{
|
||
|
InsetRect (&r, -3, -3);
|
||
|
if (item - 1 == DIALOG_EDIT_FIELD (dp))
|
||
|
{
|
||
|
TEDeactivate (DIALOG_TEXTH (dp));
|
||
|
DIALOG_EDIT_FIELD_X (dp) = CWC (-1);
|
||
|
}
|
||
|
}
|
||
|
else if (CB (ip->itmtype) & ctrlItem)
|
||
|
{
|
||
|
ControlHandle ctl;
|
||
|
|
||
|
ctl = (ControlHandle) MR (ip->itmhand);
|
||
|
CTL_VIS (ctl) = 0;
|
||
|
|
||
|
if (item == DIALOG_ADEF_ITEM (dp))
|
||
|
InsetRect (&r, -4, -4);
|
||
|
}
|
||
|
THEPORT_SAVE_EXCURSION
|
||
|
(dp,
|
||
|
{
|
||
|
EraseRect (&r);
|
||
|
InvalRect (&r);
|
||
|
});
|
||
|
}
|
||
|
HSetState (DIALOG_ITEMS (dp), flags);
|
||
|
}
|
||
|
|
||
|
P2 (PUBLIC pascal trap, void, ShowDItem, DialogPtr, dp, /* IMIV-59 */
|
||
|
INTEGER, item)
|
||
|
{
|
||
|
itmp ip;
|
||
|
Rect r;
|
||
|
SignedByte flags;
|
||
|
|
||
|
ip = ROMlib_dpnotoip ((DialogPeek) dp, item, &flags);
|
||
|
if (ip && CW (ip->itmr.left) > 8192)
|
||
|
{
|
||
|
ip->itmr.left = CW (CW (ip->itmr.left) - 16384);
|
||
|
ip->itmr.right = CW (CW (ip->itmr.right) - 16384);
|
||
|
r = ip->itmr;
|
||
|
if (CB (ip->itmtype) & editText)
|
||
|
{
|
||
|
InsetRect (&r, -3, -3);
|
||
|
if (item - 1 == DIALOG_EDIT_FIELD (dp))
|
||
|
TEActivate (DIALOG_TEXTH (dp));
|
||
|
}
|
||
|
else if (CB(ip->itmtype) & ctrlItem)
|
||
|
{
|
||
|
ControlHandle ctl;
|
||
|
|
||
|
ctl = (ControlHandle) MR (ip->itmhand);
|
||
|
CTL_VIS (ctl) = 255;
|
||
|
|
||
|
if (item == DIALOG_ADEF_ITEM (dp))
|
||
|
InsetRect (&r, -4, -4);
|
||
|
}
|
||
|
THEPORT_SAVE_EXCURSION
|
||
|
(dp,
|
||
|
{
|
||
|
InvalRect(&r);
|
||
|
});
|
||
|
}
|
||
|
if (CB (ip->itmtype) & ctrlItem)
|
||
|
{
|
||
|
ControlHandle ctl;
|
||
|
|
||
|
ctl = (ControlHandle) MR (ip->itmhand);
|
||
|
ShowControl (ctl);
|
||
|
}
|
||
|
HSetState (DIALOG_ITEMS (dp), flags);
|
||
|
}
|