executor/src/dialCreate.c

477 lines
12 KiB
C

/* Copyright 1986-1996 by Abacus Research and
* Development, Inc. All rights reserved.
*/
#if !defined (OMIT_RCSID_STRINGS)
char ROMlib_rcsid_dialCreate[] =
"$Id: dialCreate.c 63 2004-12-24 18:19:43Z ctm $";
#endif
/* Forward declarations in DialogMgr.h (DO NOT DELETE THIS LINE) */
#include "rsys/common.h"
#include "QuickDraw.h"
#include "OSUtil.h"
#include "DialogMgr.h"
#include "ControlMgr.h"
#include "ResourceMgr.h"
#include "FontMgr.h"
#include "MemoryMgr.h"
#include "ToolboxUtil.h"
#include "Iconutil.h"
#include "rsys/cquick.h"
#include "rsys/wind.h"
#include "rsys/itm.h"
#include "rsys/ctl.h"
#include "rsys/glue.h"
#include "rsys/mman.h"
#include "rsys/resource.h"
#include "rsys/host.h"
#define _PtrToHand(ptr, hand, len) \
((void) \
({ \
HIDDEN_Handle __temp_handle; \
\
PtrToHand ((Ptr) (ptr), &__temp_handle, len); \
*(hand) = RM (__temp_handle.p); \
}))
void
dialog_create_item (DialogPeek dp, itmp dst, itmp src,
int item_no, Point base_pt)
{
int16 *data;
int16 res_id;
int gd_bpp;
if (dst != src)
memcpy (dst, src, ITEM_LEN (src));
OffsetRect (&dst->itmr, base_pt.h, base_pt.v);
data = ITEM_DATA (dst);
gd_bpp = PIXMAP_PIXEL_SIZE (GD_PMAP (MR (MainDevice)));
/* many items have a resource id at the beginning of the resource
data */
res_id = CW (*data);
if (CB (dst->itmtype) & ctrlItem)
{
Rect r;
boolean_t visible_p = TRUE;
ControlHandle ctl;
r = dst->itmr;
if (CW (r.left) > 8192)
{
visible_p = FALSE;
r.left = CW (CW (r.left) - 16384);
r.right = CW (CW (r.right) - 16384);
}
if ((CB (dst->itmtype) & resCtrl) == resCtrl)
{
Rect *ctl_rect;
int top, left;
/* ### is visibility correct here? */
ctl = GetNewControl (res_id, (WindowPtr) dp);
if (ctl)
{
ctl_rect = &CTL_RECT (ctl);
top = ctl_rect->top;
left = ctl_rect->left;
if (r.top != top || r.left != left)
MoveControl (ctl, CW (r.left), CW (r.top));
}
}
else
{
ctl = NewControl ((WindowPtr) dp, &r,
(StringPtr) &dst->itmlen,
visible_p, 0, 0, 1,
CB (dst->itmtype) & resCtrl, 0L);
}
dst->itmhand = (Handle) RM (ctl);
ValidRect (&dst->itmr);
{
AuxWinHandle aux_win_h;
aux_win_h = MR (*lookup_aux_win ((WindowPtr) dp));
if (aux_win_h && HxX (aux_win_h, dialogCItem))
{
Handle item_color_info_h;
item_color_info_t *item_color_info;
item_color_info_h = HxP (aux_win_h, dialogCItem);
item_color_info = (item_color_info_t *) STARH (item_color_info_h);
if (item_color_info)
{
item_color_info_t *ctl_color_info;
ctl_color_info = &item_color_info[item_no - 1];
if (ctl_color_info->data || ctl_color_info->offset)
{
int color_table_bytes;
int color_table_offset;
char *color_table_base;
CCTabHandle color_table;
color_table_bytes = CW (ctl_color_info->data);
color_table_offset = CW (ctl_color_info->offset);
color_table_base = ((char *) item_color_info
+ color_table_offset);
color_table = (CCTabHandle) NewHandle (color_table_bytes);
memcpy (STARH (color_table), color_table_base,
color_table_bytes);
SetCtlColor (ctl, color_table);
}
}
}
}
}
else if (CB (dst->itmtype) & (statText | editText))
{
_PtrToHand (data, &dst->itmhand, dst->itmlen);
if ((CB (dst->itmtype) & editText)
&& DIALOG_EDIT_FIELD (dp) == -1)
ROMlib_dpntoteh (dp, item_no);
}
else if (CB (dst->itmtype) & iconItem)
{
Handle h = NULL;
if (/* CGrafPort_p (dp) */
/* since copybits will do the right thing copying a color
image to a old-style grafport on the screen, we check the
screen depth to see if we should check for a color icon */
gd_bpp > 2)
{
h = (Handle) GetCIcon (res_id);
gui_assert (!h || CICON_P (h));
}
if (!h)
{
h = GetIcon (res_id);
if (! h || CICON_P (h))
warning_unexpected ("dubious icon handle");
}
dst->itmhand = RM (h);
}
else if (CB (dst->itmtype) & picItem)
{
dst->itmhand = (Handle) RM (GetPicture (res_id));
}
else
{
/* useritem */
dst->itmhand = CLC_NULL;
}
}
static DialogPtr
ROMlib_new_dialog_common (DialogPtr dp,
boolean_t color_p,
CTabHandle w_ctab,
Handle item_color_table_h,
Rect *bounds, StringPtr title,
boolean_t visible_p,
int16 proc_id, WindowPtr behind,
boolean_t go_away_flag,
int32 ref_con,
Handle items)
{
INTEGER *ip, i;
itmp itp;
if (!dp)
dp = (DialogPtr) NewPtr (sizeof (DialogRecord));
if (color_p)
{
NewCWindow ((Ptr) dp, bounds, title, visible_p,
proc_id, (CWindowPtr) behind, go_away_flag, ref_con);
if (w_ctab && CTAB_SIZE (w_ctab) > -1)
{
THEPORT_SAVE_EXCURSION
(thePort,
{
SetWinColor (DIALOG_WINDOW (dp), w_ctab);
});
}
}
else
NewWindow ((Ptr) dp, bounds, title, visible_p, proc_id,
behind, go_away_flag, ref_con);
if (item_color_table_h)
{
AuxWinHandle aux_win_h;
aux_win_h = MR (*lookup_aux_win (dp));
gui_assert (aux_win_h);
HxX (aux_win_h, dialogCItem) = RM (item_color_table_h);
}
#warning We no longer call TEStylNew, this helps LB password
THEPORT_SAVE_EXCURSION
((GrafPtr) dp,
{
Rect newr;
TextFont (CW (DlgFont));
newr.top = newr.left = CWC (0);
newr.bottom = CW (CW (bounds->bottom) - CW (bounds->top));
newr.right = CW (CW (bounds->right) - CW (bounds->left));
InvalRect (&newr);
WINDOW_KIND_X (dp) = CWC (dialogKind);
{
Rect emptyrect;
TEHandle te;
RECT_ZERO (&emptyrect);
/************************ DO NOT CHECK THIS IN ****************
if (color_p && item_color_table_h)
te = TEStylNew (&emptyrect, &emptyrect);
else
***************************************************************/
te = TENew (&emptyrect, &emptyrect);
DIALOG_TEXTH_X (dp) = RM (te);
TEAutoView (TRUE, te);
DisposHandle (TE_HTEXT (te));
TE_HTEXT_X (te) = CLC_NULL;
}
DIALOG_EDIT_FIELD_X (dp) = CWC (-1);
DIALOG_EDIT_OPEN_X (dp) = CWC (0);
DIALOG_ADEF_ITEM_X (dp) = CWC (1);
DIALOG_ITEMS_X (dp) = RM (items);
if (items)
{
Point zero_pt;
memset (&zero_pt, '\000', sizeof zero_pt);
MoveHHi (items);
LOCK_HANDLE_EXCURSION_1
(items,
{
int item_no;
ip = (INTEGER *) STARH (items);
itp = (itmp) (ip + 1);
i = CW (*ip);
item_no = 1;
while (i-- >= 0)
{
dialog_create_item ((DialogPeek) dp, itp, itp, item_no,
zero_pt);
BUMPIP (itp);
item_no ++;
}
});
}
});
return (DialogPtr) dp;
}
/* IM-MTE calls this `NewColorDialog ()' */
P9 (PUBLIC pascal trap, CDialogPtr, NewCDialog, Ptr, storage, /* IMI-412 */
Rect *, bounds, StringPtr, title, BOOLEAN, visible_p, INTEGER, proc_id,
WindowPtr, behind, BOOLEAN, go_away_flag, LONGINT, ref_con, Handle, items)
{
return (CDialogPtr) ROMlib_new_dialog_common ((DialogPtr) storage,
/* color */ TRUE, NULL, NULL,
bounds, title, visible_p, proc_id,
behind, go_away_flag, ref_con,
items);
}
P9 (PUBLIC pascal trap, DialogPtr, NewDialog, Ptr, storage, /* IMI-412 */
Rect *, bounds, StringPtr, title, BOOLEAN, visible_p, INTEGER, proc_id,
WindowPtr, behind, BOOLEAN, go_away_flag, LONGINT, ref_con, Handle, items)
{
return ROMlib_new_dialog_common ((DialogPtr) storage,
/* not color */ FALSE, NULL, NULL,
bounds, title, visible_p, proc_id,
behind, go_away_flag, ref_con, items);
}
void
dialog_compute_rect (Rect *dialog_rect, Rect *dst_rect,
int position)
{
Rect *screen_rect;
int dialog_width, dialog_height;
int screen_width, screen_height;
dialog_width = RECT_WIDTH (dialog_rect);
dialog_height = RECT_HEIGHT (dialog_rect);
screen_rect = &GD_RECT (MR (MainDevice));
screen_width = RECT_WIDTH (screen_rect);
screen_height = RECT_HEIGHT (screen_rect);
switch (position)
{
/* #### find out what `stagger' position means */
default:
case noAutoCenter:
/* noAutoCenter */
*dst_rect = *dialog_rect;
break;
case alertPositionParentWindow:
case dialogPositionParentWindow:
{
WindowPtr parent;
parent = FrontWindow ();
if (parent)
{
Rect *parent_rect;
int top;
int left;
parent_rect = &PORT_RECT (parent);
top = CW (parent_rect->top) + 16;
left = ( ( CW (parent_rect->left)
+ CW (parent_rect->right)) / 2
+ dialog_width / 2);
SetRect (dst_rect,
left, top,
left + dialog_width, top + dialog_height);
break;
}
/* else fall through */
}
case alertPositionMainScreen:
case dialogPositionMainScreen:
case alertPositionParentWindowScreen:
case dialogPositionParentWindowScreen:
SetRect (dst_rect,
(screen_width - dialog_width) / 2,
(screen_height - dialog_height) / 3,
(screen_width - dialog_width) / 2 + dialog_width,
(screen_height - dialog_height) / 3 + dialog_height);
break;
}
}
P3 (PUBLIC pascal trap, DialogPtr, GetNewDialog, INTEGER, id, /* IMI-413 */
Ptr, dst, WindowPtr, behind)
{
dlogh dialog_res_h;
Handle dialog_item_list_res_h;
Handle item_ctab_res_h;
DialogPtr retval;
Handle dialog_ctab_res_h;
boolean_t color_p;
dialog_res_h = (dlogh) ROMlib_getrestid (TICK ("DLOG"), id);
dialog_item_list_res_h = ROMlib_getrestid (TICK ("DITL"),
Hx (dialog_res_h, dlgditl));
dialog_item_list_res_h = ROMlib_copy_handle (dialog_item_list_res_h);
if (!dialog_res_h || !dialog_item_list_res_h)
return NULL;
dialog_ctab_res_h = ROMlib_getrestid (TICK ("dctb"), id);
item_ctab_res_h = ROMlib_getrestid (TICK ("ictb"), id);
color_p = (dialog_ctab_res_h || item_ctab_res_h);
LOCK_HANDLE_EXCURSION_1
(dialog_res_h,
{
Rect adjusted_rect;
dialog_compute_rect (&HxX (dialog_res_h, dlgr),
&adjusted_rect,
(DIALOG_RES_HAS_POSITION_P (dialog_res_h)
? DIALOG_RES_POSITION (dialog_res_h)
: noAutoCenter));
/* if there is a dialog color table resource make this a color
dialog */
retval
= ROMlib_new_dialog_common ((DialogPtr) dst, color_p,
(CTabHandle) dialog_ctab_res_h,
item_ctab_res_h,
&adjusted_rect,
(StringPtr) (&HxX (dialog_res_h, dlglen)),
Hx (dialog_res_h, dlgvis),
Hx (dialog_res_h, dlgprocid),
behind,
Hx (dialog_res_h, dlggaflag),
Hx (dialog_res_h, dlgrc),
dialog_item_list_res_h);
});
return retval;
}
P1(PUBLIC pascal trap, void, CloseDialog, DialogPtr, dp) /* IMI-413 */
{
Handle items;
INTEGER *ip, i;
itmp itp;
items = DIALOG_ITEMS (dp);
if (items)
{
/* #### should `items' be locked? */
ip = (INTEGER *) STARH (items);
i = CW(*ip);
itp = (itmp)(ip + 1);
while (i-- >= 0)
{
if (CB (itp->itmtype) & (editText | statText))
DisposHandle ((Handle) MR(itp->itmhand));
BUMPIP (itp);
}
}
CloseWindow((WindowPtr) dp);
}
P1 (PUBLIC pascal trap, void, DisposDialog, DialogPtr, dp) /* IMI-415 */
{
TEHandle teh;
CloseDialog (dp);
DisposHandle(MR(((DialogPeek)dp)->items));
teh = DIALOG_TEXTH (dp);
/* accounted for elsewhere */
TE_HTEXT_X (teh) = NULL;
TEDispose (teh);
DisposPtr ((Ptr) dp);
}
/* see dialAlert.c for CouldDialog, FreeDialog */