mirror of
https://github.com/ctm/executor.git
synced 2024-06-04 17:29:30 +00:00
279 lines
6.3 KiB
C
279 lines
6.3 KiB
C
/* Copyright 1995, 1996 by Abacus Research and
|
|
* Development, Inc. All rights reserved.
|
|
*/
|
|
|
|
#if !defined (OMIT_RCSID_STRINGS)
|
|
char ROMlib_rcsid_dialItem[] =
|
|
"$Id: dialItem.c 63 2004-12-24 18:19:43Z ctm $";
|
|
#endif
|
|
|
|
#include "rsys/common.h"
|
|
|
|
#include "QuickDraw.h"
|
|
#include "DialogMgr.h"
|
|
#include "Iconutil.h"
|
|
|
|
#include "rsys/itm.h"
|
|
#include "rsys/cquick.h"
|
|
#include "rsys/mman.h"
|
|
|
|
#define _GetDItem(dp, item_no, item_type, item_h, item_rect) \
|
|
({ \
|
|
HIDDEN_Handle __item_handle; \
|
|
\
|
|
GetDItem (dp, item_no, item_type, &__item_handle, item_rect); \
|
|
*(item_h) = MR (__item_handle.p); \
|
|
})
|
|
|
|
|
|
void
|
|
AppendDITL (DialogPtr dp, Handle new_items_h, DITLMethod method)
|
|
{
|
|
Handle items_h;
|
|
int items_h_size, new_items_h_size;
|
|
Rect *dp_port_rect;
|
|
int width, height;
|
|
boolean_t resize_p;
|
|
Point base_pt;
|
|
|
|
dp_port_rect = &PORT_RECT (dp);
|
|
width = RECT_WIDTH (dp_port_rect);
|
|
height = RECT_HEIGHT (dp_port_rect);
|
|
|
|
if (method < 0)
|
|
{
|
|
int16 item_type;
|
|
Handle item_h;
|
|
Rect item_rect;
|
|
|
|
method = -method;
|
|
|
|
_GetDItem (dp, method, &item_type, &item_h, &item_rect);
|
|
|
|
resize_p = FALSE;
|
|
base_pt.v = CW (item_rect.top);
|
|
base_pt.h = CW (item_rect.left);
|
|
}
|
|
else
|
|
{
|
|
switch (method)
|
|
{
|
|
default:
|
|
case overlayDITL:
|
|
resize_p = FALSE;
|
|
base_pt.h = base_pt.v = 0;
|
|
break;
|
|
|
|
case appendDITLRight:
|
|
resize_p = TRUE;
|
|
base_pt.v = 0;
|
|
base_pt.h = CW (dp_port_rect->right);
|
|
break;
|
|
|
|
case appendDITLBottom:
|
|
resize_p = TRUE;
|
|
base_pt.v = CW (dp_port_rect->bottom);
|
|
base_pt.h = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
items_h = DIALOG_ITEMS (dp);
|
|
|
|
{
|
|
/* compute the size of the current item list (and where the new
|
|
items will go */
|
|
|
|
char *base_itemp;
|
|
int item_count;
|
|
itmp itemp;
|
|
int i;
|
|
|
|
base_itemp = (char *) STARH (items_h);
|
|
item_count = CW (*(int16 *) base_itemp) + 1;
|
|
itemp = (itmp) ((int16 *) STARH (items_h) + 1);
|
|
|
|
for (i = 0; i < item_count; i ++)
|
|
itemp = (itmp) ((char *) itemp + ITEM_LEN (itemp));
|
|
|
|
items_h_size = (char *) itemp - base_itemp;
|
|
}
|
|
|
|
{
|
|
Size items_h_handle_size;
|
|
|
|
items_h_handle_size = GetHandleSize (items_h);
|
|
if (items_h_size != items_h_handle_size)
|
|
warning_unexpected ("items_h_size = %d, items_h_handle_size = %d",
|
|
items_h_size, items_h_handle_size);
|
|
}
|
|
|
|
new_items_h_size = GetHandleSize (new_items_h);
|
|
|
|
SetHandleSize (items_h, items_h_size + new_items_h_size);
|
|
|
|
LOCK_HANDLE_EXCURSION_2
|
|
(items_h, new_items_h,
|
|
{
|
|
itmp new_itemp;
|
|
char *base_itemp;
|
|
char *base_new_itemp;
|
|
int item_count;
|
|
int new_item_count;
|
|
int i;
|
|
|
|
base_itemp = (char *) STARH (items_h);
|
|
item_count = CW (*(int16 *) base_itemp) + 1;
|
|
|
|
base_new_itemp = (char *) STARH (new_items_h);
|
|
new_itemp = (itmp) ((int16 *) STARH (new_items_h) + 1);
|
|
new_item_count = CW (*(int16 *) base_new_itemp) + 1;
|
|
|
|
/* update the count for the new items */
|
|
*(int16 *) base_itemp = CW (item_count + new_item_count - 1);
|
|
|
|
THEPORT_SAVE_EXCURSION
|
|
(dp,
|
|
{
|
|
|
|
for (i = 0; i < new_item_count; i ++)
|
|
{
|
|
itmp itemp;
|
|
|
|
itemp = (itmp) (base_itemp + items_h_size
|
|
+ ( (char *) new_itemp
|
|
- (base_new_itemp + sizeof (int16))));
|
|
|
|
dialog_create_item ((DialogPeek) dp, itemp, new_itemp,
|
|
(i + 1) + item_count, base_pt);
|
|
|
|
InvalRect (&itemp->itmr);
|
|
|
|
width = MAX (width, CW (itemp->itmr.left));
|
|
height = MAX (height, CW (itemp->itmr.bottom));
|
|
|
|
BUMPIP (new_itemp);
|
|
}
|
|
});
|
|
});
|
|
|
|
if (resize_p)
|
|
SizeWindow ((WindowPtr) dp, width, height,
|
|
/* cause the window to be redraw */
|
|
TRUE);
|
|
}
|
|
|
|
void
|
|
ShortenDITL (DialogPtr dp, int16 n_items)
|
|
{
|
|
Handle item_h;
|
|
char *base_itemp;
|
|
itmp itemp;
|
|
int count, i;
|
|
int item_h_size;
|
|
int first_item_to_dispose;
|
|
|
|
item_h = DIALOG_ITEMS (dp);
|
|
if (item_h == NULL)
|
|
return;
|
|
|
|
item_h_size = GetHandleSize (item_h);
|
|
|
|
LOCK_HANDLE_EXCURSION_1
|
|
(item_h,
|
|
{
|
|
base_itemp = (char *) STARH (item_h);
|
|
itemp = (itmp) ((int16 *) STARH (item_h) + 1);
|
|
count = CW (*(int16 *) base_itemp) + 1;
|
|
|
|
if (count < n_items)
|
|
n_items = count;
|
|
first_item_to_dispose = count - n_items;
|
|
|
|
for (i = 0; i < count; i ++, BUMPIP (itemp))
|
|
{
|
|
if (i == first_item_to_dispose)
|
|
item_h_size = (char *) itemp - (char *) base_itemp;
|
|
|
|
if (i >= first_item_to_dispose)
|
|
{
|
|
boolean_t erase_p = FALSE;
|
|
Rect erase_rect;
|
|
|
|
erase_rect = itemp->itmr;
|
|
|
|
if (itemp->itmtype & (editText | statText))
|
|
{
|
|
if (DIALOG_EDIT_FIELD (dp) == i)
|
|
{
|
|
TEHandle te;
|
|
|
|
te = DIALOG_TEXTH (dp);
|
|
|
|
/* this te currently points to some bogus
|
|
fields, but before it is used again, those
|
|
fields will be set up with sane values */
|
|
TEDeactivate (te);
|
|
|
|
DIALOG_EDIT_FIELD_X (dp) = CWC (-1);
|
|
DIALOG_EDIT_OPEN_X (dp) = CWC (0);
|
|
}
|
|
|
|
DisposHandle ((Handle) MR (itemp->itmhand));
|
|
/* when editText items are drawn, the box around
|
|
them is inset `-3', so we also need to do that
|
|
when erasing */
|
|
InsetRect (&erase_rect, -3, -3);
|
|
erase_p = TRUE;
|
|
}
|
|
else if (itemp->itmtype & ctrlItem)
|
|
{
|
|
DisposeControl ((ControlHandle) MR (itemp->itmhand));
|
|
}
|
|
else if (itemp->itmtype & iconItem)
|
|
{
|
|
Handle icon;
|
|
|
|
icon = itemp->itmhand;
|
|
if (CICON_P (icon))
|
|
DisposeCIcon ((CIconHandle) icon);
|
|
erase_p = TRUE;
|
|
}
|
|
else if (itemp->itmtype & picItem)
|
|
{
|
|
erase_p = TRUE;
|
|
}
|
|
else
|
|
{
|
|
/* user item */
|
|
erase_p = TRUE;
|
|
}
|
|
|
|
if (erase_p)
|
|
{
|
|
/* #### do we erase with `EraseRect ()' or the
|
|
window background color defined by the window
|
|
color table? */
|
|
THEPORT_SAVE_EXCURSION
|
|
(dp, { EraseRect (&erase_rect); });
|
|
}
|
|
}
|
|
}
|
|
*(int16 *) base_itemp = CW (first_item_to_dispose - 1);
|
|
});
|
|
|
|
SetHandleSize ((Handle) item_h, item_h_size);
|
|
}
|
|
|
|
int16
|
|
CountDITL (DialogPtr dp)
|
|
{
|
|
Handle items;
|
|
int16 count;
|
|
|
|
items = DIALOG_ITEMS (dp);
|
|
count = CW (*(int16 *) STARH (items)) + 1;
|
|
|
|
return count;
|
|
}
|