mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-05-30 00:04:49 -05:00
Add support for list boxes in Mac OS 8. Not entirely solid, but largely
working. [originally from svn r3068]
This commit is contained in:
parent
3faede1ec3
commit
f51cc630c2
267
mac/macctrls.c
267
mac/macctrls.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: macctrls.c,v 1.29 2003/04/05 18:00:46 ben Exp $ */
|
/* $Id: macctrls.c,v 1.30 2003/04/05 22:00:57 ben Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003 Ben Harris
|
* Copyright (c) 2003 Ben Harris
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
@ -61,6 +61,7 @@ union macctrl {
|
|||||||
MACCTRL_RADIO,
|
MACCTRL_RADIO,
|
||||||
MACCTRL_CHECKBOX,
|
MACCTRL_CHECKBOX,
|
||||||
MACCTRL_BUTTON,
|
MACCTRL_BUTTON,
|
||||||
|
MACCTRL_LISTBOX,
|
||||||
MACCTRL_POPUP
|
MACCTRL_POPUP
|
||||||
} type;
|
} type;
|
||||||
/* Template from which this was generated */
|
/* Template from which this was generated */
|
||||||
@ -93,6 +94,12 @@ union macctrl {
|
|||||||
ControlRef tbctrl;
|
ControlRef tbctrl;
|
||||||
ControlRef tbring;
|
ControlRef tbring;
|
||||||
} button;
|
} button;
|
||||||
|
struct {
|
||||||
|
struct macctrl_generic generic;
|
||||||
|
ControlRef tbctrl;
|
||||||
|
unsigned int nids;
|
||||||
|
int *ids;
|
||||||
|
} listbox;
|
||||||
struct {
|
struct {
|
||||||
struct macctrl_generic generic;
|
struct macctrl_generic generic;
|
||||||
ControlRef tbctrl;
|
ControlRef tbctrl;
|
||||||
@ -132,6 +139,8 @@ static void macctrl_checkbox(struct macctrls *, WindowPtr,
|
|||||||
struct mac_layoutstate *, union control *);
|
struct mac_layoutstate *, union control *);
|
||||||
static void macctrl_button(struct macctrls *, WindowPtr,
|
static void macctrl_button(struct macctrls *, WindowPtr,
|
||||||
struct mac_layoutstate *, union control *);
|
struct mac_layoutstate *, union control *);
|
||||||
|
static void macctrl_listbox(struct macctrls *, WindowPtr,
|
||||||
|
struct mac_layoutstate *, union control *);
|
||||||
static void macctrl_popup(struct macctrls *, WindowPtr,
|
static void macctrl_popup(struct macctrls *, WindowPtr,
|
||||||
struct mac_layoutstate *, union control *);
|
struct mac_layoutstate *, union control *);
|
||||||
#if !TARGET_API_MAC_CARBON
|
#if !TARGET_API_MAC_CARBON
|
||||||
@ -239,7 +248,7 @@ void macctrl_layoutbox(struct controlbox *cb, WindowPtr window,
|
|||||||
}
|
}
|
||||||
macctrl_layoutset(&curstate, cb->ctrlsets[i], window, mcs);
|
macctrl_layoutset(&curstate, cb->ctrlsets[i], window, mcs);
|
||||||
}
|
}
|
||||||
macctrl_switchtopanel(mcs, 1);
|
macctrl_switchtopanel(mcs, 19);
|
||||||
/* 14 = proxies, 20 = SSH bugs */
|
/* 14 = proxies, 20 = SSH bugs */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,6 +334,8 @@ static void macctrl_layoutset(struct mac_layoutstate *curstate,
|
|||||||
case CTRL_LISTBOX:
|
case CTRL_LISTBOX:
|
||||||
if (ctrl->listbox.height == 0)
|
if (ctrl->listbox.height == 0)
|
||||||
macctrl_popup(mcs, window, &cols[colstart], ctrl);
|
macctrl_popup(mcs, window, &cols[colstart], ctrl);
|
||||||
|
else
|
||||||
|
macctrl_listbox(mcs, window, &cols[colstart], ctrl);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -337,6 +348,9 @@ static void macctrl_switchtopanel(struct macctrls *mcs, unsigned int which)
|
|||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
union macctrl *mc;
|
union macctrl *mc;
|
||||||
|
ListHandle list;
|
||||||
|
Size olen;
|
||||||
|
|
||||||
|
|
||||||
#define hideshow(c) do { \
|
#define hideshow(c) do { \
|
||||||
if (i == which) ShowControl(c); else HideControl(c); \
|
if (i == which) ShowControl(c); else HideControl(c); \
|
||||||
@ -371,6 +385,24 @@ static void macctrl_switchtopanel(struct macctrls *mcs, unsigned int which)
|
|||||||
case MACCTRL_BUTTON:
|
case MACCTRL_BUTTON:
|
||||||
hideshow(mc->button.tbctrl);
|
hideshow(mc->button.tbctrl);
|
||||||
break;
|
break;
|
||||||
|
case MACCTRL_LISTBOX:
|
||||||
|
hideshow(mc->listbox.tbctrl);
|
||||||
|
/*
|
||||||
|
* At least under Mac OS 8.1, hiding a list box
|
||||||
|
* doesn't hide its scroll bars.
|
||||||
|
*/
|
||||||
|
if (mac_gestalts.apprvers >= 0x100) {
|
||||||
|
if (GetControlData(mc->listbox.tbctrl,
|
||||||
|
kControlEntireControl,
|
||||||
|
kControlListBoxListHandleTag,
|
||||||
|
sizeof(list), &list, &olen) == noErr)
|
||||||
|
#if TARGET_API_MAC_CARBON
|
||||||
|
hideshow(GetListVerticalScrollBar(list));
|
||||||
|
#else
|
||||||
|
hideshow((*list)->vScroll);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
break;
|
||||||
case MACCTRL_POPUP:
|
case MACCTRL_POPUP:
|
||||||
hideshow(mc->popup.tbctrl);
|
hideshow(mc->popup.tbctrl);
|
||||||
break;
|
break;
|
||||||
@ -790,6 +822,59 @@ static pascal SInt32 macctrl_sys7_default_cdef(SInt16 variant,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void macctrl_listbox(struct macctrls *mcs, WindowPtr window,
|
||||||
|
struct mac_layoutstate *curstate,
|
||||||
|
union control *ctrl)
|
||||||
|
{
|
||||||
|
union macctrl *mc = snew(union macctrl);
|
||||||
|
Rect bounds;
|
||||||
|
ListHandle list;
|
||||||
|
Size olen;
|
||||||
|
|
||||||
|
if (mac_gestalts.apprvers < 0x100)
|
||||||
|
return;
|
||||||
|
if (ctrl->listbox.label != NULL)
|
||||||
|
fprintf(stderr, " label = %s\n", ctrl->listbox.label);
|
||||||
|
fprintf(stderr, " height = %d\n", ctrl->listbox.height);
|
||||||
|
if (ctrl->listbox.draglist)
|
||||||
|
fprintf(stderr, " draglist\n");
|
||||||
|
if (ctrl->listbox.multisel)
|
||||||
|
fprintf(stderr, " multisel\n");
|
||||||
|
fprintf(stderr, " ncols = %d\n", ctrl->listbox.ncols);
|
||||||
|
assert(ctrl->listbox.percentwidth == 100);
|
||||||
|
mc->generic.type = MACCTRL_LISTBOX;
|
||||||
|
mc->generic.ctrl = ctrl;
|
||||||
|
mc->generic.privdata = NULL;
|
||||||
|
/* The list starts off empty */
|
||||||
|
mc->listbox.nids = 0;
|
||||||
|
mc->listbox.ids = NULL;
|
||||||
|
bounds.left = curstate->pos.h;
|
||||||
|
bounds.right = bounds.left + curstate->width;
|
||||||
|
bounds.top = curstate->pos.v;
|
||||||
|
bounds.bottom = bounds.top + 20 * ctrl->listbox.height;
|
||||||
|
|
||||||
|
mc->button.tbctrl = NewControl(window, &bounds, NULL, TRUE,
|
||||||
|
ldes_Default, 0, 0,
|
||||||
|
kControlListBoxProc, (long)mc);
|
||||||
|
if (!ctrl->listbox.multisel) {
|
||||||
|
if (GetControlData(mc->listbox.tbctrl, kControlEntireControl,
|
||||||
|
kControlListBoxListHandleTag, sizeof(list), &list,
|
||||||
|
&olen) != noErr)
|
||||||
|
return;
|
||||||
|
#if TARGET_API_MAC_CARBON
|
||||||
|
SetListSelectionFlags(list, lOnlyOne);
|
||||||
|
#else
|
||||||
|
(*list)->selFlags = lOnlyOne;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
add234(mcs->byctrl, mc);
|
||||||
|
curstate->pos.v += 6 + 20 * ctrl->listbox.height;
|
||||||
|
mc->generic.next = mcs->panels[curstate->panelnum];
|
||||||
|
mcs->panels[curstate->panelnum] = mc;
|
||||||
|
ctrlevent(mcs, mc, EVENT_REFRESH);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void macctrl_popup(struct macctrls *mcs, WindowPtr window,
|
static void macctrl_popup(struct macctrls *mcs, WindowPtr window,
|
||||||
struct mac_layoutstate *curstate,
|
struct mac_layoutstate *curstate,
|
||||||
union control *ctrl)
|
union control *ctrl)
|
||||||
@ -892,6 +977,9 @@ void macctrl_activate(WindowPtr window, EventRecord *event)
|
|||||||
if (mc->button.tbring != NULL)
|
if (mc->button.tbring != NULL)
|
||||||
HiliteControl(mc->button.tbring, state);
|
HiliteControl(mc->button.tbring, state);
|
||||||
break;
|
break;
|
||||||
|
case MACCTRL_LISTBOX:
|
||||||
|
HiliteControl(mc->listbox.tbctrl, state);
|
||||||
|
break;
|
||||||
case MACCTRL_POPUP:
|
case MACCTRL_POPUP:
|
||||||
HiliteControl(mc->popup.tbctrl, state);
|
HiliteControl(mc->popup.tbctrl, state);
|
||||||
break;
|
break;
|
||||||
@ -969,6 +1057,10 @@ void macctrl_click(WindowPtr window, EventRecord *event)
|
|||||||
if (trackresult != 0)
|
if (trackresult != 0)
|
||||||
ctrlevent(mcs, mc, EVENT_ACTION);
|
ctrlevent(mcs, mc, EVENT_ACTION);
|
||||||
break;
|
break;
|
||||||
|
case MACCTRL_LISTBOX:
|
||||||
|
/* FIXME spot double-click */
|
||||||
|
ctrlevent(mcs, mc, EVENT_SELCHANGE);
|
||||||
|
break;
|
||||||
case MACCTRL_POPUP:
|
case MACCTRL_POPUP:
|
||||||
ctrlevent(mcs, mc, EVENT_SELCHANGE);
|
ctrlevent(mcs, mc, EVENT_SELCHANGE);
|
||||||
break;
|
break;
|
||||||
@ -1223,7 +1315,7 @@ void dlg_radiobutton_set(union control *ctrl, void *dlg, int whichbutton)
|
|||||||
union macctrl *mc = findbyctrl(mcs, ctrl);
|
union macctrl *mc = findbyctrl(mcs, ctrl);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(mc != NULL);
|
if (mc == NULL) return;
|
||||||
for (i = 0; i < ctrl->radio.nbuttons; i++) {
|
for (i = 0; i < ctrl->radio.nbuttons; i++) {
|
||||||
if (i == whichbutton)
|
if (i == whichbutton)
|
||||||
SetControlValue(mc->radio.tbctrls[i],
|
SetControlValue(mc->radio.tbctrls[i],
|
||||||
@ -1260,7 +1352,7 @@ void dlg_checkbox_set(union control *ctrl, void *dlg, int checked)
|
|||||||
struct macctrls *mcs = dlg;
|
struct macctrls *mcs = dlg;
|
||||||
union macctrl *mc = findbyctrl(mcs, ctrl);
|
union macctrl *mc = findbyctrl(mcs, ctrl);
|
||||||
|
|
||||||
assert(mc != NULL);
|
if (mc == NULL) return;
|
||||||
SetControlValue(mc->checkbox.tbctrl,
|
SetControlValue(mc->checkbox.tbctrl,
|
||||||
checked ? kControlCheckBoxCheckedValue :
|
checked ? kControlCheckBoxCheckedValue :
|
||||||
kControlCheckBoxUncheckedValue);
|
kControlCheckBoxUncheckedValue);
|
||||||
@ -1286,7 +1378,7 @@ void dlg_editbox_set(union control *ctrl, void *dlg, char const *text)
|
|||||||
union macctrl *mc = findbyctrl(mcs, ctrl);
|
union macctrl *mc = findbyctrl(mcs, ctrl);
|
||||||
GrafPtr saveport;
|
GrafPtr saveport;
|
||||||
|
|
||||||
assert(mc != NULL);
|
if (mc == NULL) return;
|
||||||
assert(mc->generic.type == MACCTRL_EDITBOX);
|
assert(mc->generic.type == MACCTRL_EDITBOX);
|
||||||
GetPort(&saveport);
|
GetPort(&saveport);
|
||||||
SetPort((GrafPtr)(GetWindowPort(mcs->window)));
|
SetPort((GrafPtr)(GetWindowPort(mcs->window)));
|
||||||
@ -1349,6 +1441,7 @@ static void dlg_macpopup_clear(union control *ctrl, void *dlg)
|
|||||||
MenuRef menu = mc->popup.menu;
|
MenuRef menu = mc->popup.menu;
|
||||||
unsigned int i, n;
|
unsigned int i, n;
|
||||||
|
|
||||||
|
if (mc == NULL) return;
|
||||||
fprintf(stderr, " popup_clear\n");
|
fprintf(stderr, " popup_clear\n");
|
||||||
n = CountMenuItems(menu);
|
n = CountMenuItems(menu);
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
@ -1359,11 +1452,33 @@ static void dlg_macpopup_clear(union control *ctrl, void *dlg)
|
|||||||
SetControlMaximum(mc->popup.tbctrl, CountMenuItems(menu));
|
SetControlMaximum(mc->popup.tbctrl, CountMenuItems(menu));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dlg_maclist_clear(union control *ctrl, void *dlg)
|
||||||
|
{
|
||||||
|
struct macctrls *mcs = dlg;
|
||||||
|
union macctrl *mc = findbyctrl(mcs, ctrl);
|
||||||
|
ListHandle list;
|
||||||
|
Size olen;
|
||||||
|
|
||||||
|
if (mc == NULL) return;
|
||||||
|
fprintf(stderr, " maclist_clear\n");
|
||||||
|
if (GetControlData(mc->listbox.tbctrl, kControlEntireControl,
|
||||||
|
kControlListBoxListHandleTag, sizeof(list), &list,
|
||||||
|
&olen) != noErr)
|
||||||
|
return;
|
||||||
|
LDelRow(0, 0, list);
|
||||||
|
mc->listbox.nids = 0;
|
||||||
|
sfree(mc->listbox.ids);
|
||||||
|
mc->listbox.ids = NULL;
|
||||||
|
DrawOneControl(mc->listbox.tbctrl);
|
||||||
|
}
|
||||||
|
|
||||||
void dlg_listbox_clear(union control *ctrl, void *dlg)
|
void dlg_listbox_clear(union control *ctrl, void *dlg)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (ctrl->listbox.height == 0)
|
if (ctrl->listbox.height == 0)
|
||||||
dlg_macpopup_clear(ctrl, dlg);
|
dlg_macpopup_clear(ctrl, dlg);
|
||||||
|
else
|
||||||
|
dlg_maclist_clear(ctrl, dlg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dlg_macpopup_del(union control *ctrl, void *dlg, int index)
|
static void dlg_macpopup_del(union control *ctrl, void *dlg, int index)
|
||||||
@ -1372,6 +1487,7 @@ static void dlg_macpopup_del(union control *ctrl, void *dlg, int index)
|
|||||||
union macctrl *mc = findbyctrl(mcs, ctrl);
|
union macctrl *mc = findbyctrl(mcs, ctrl);
|
||||||
MenuRef menu = mc->popup.menu;
|
MenuRef menu = mc->popup.menu;
|
||||||
|
|
||||||
|
if (mc == NULL) return;
|
||||||
fprintf(stderr, " popup_del %d\n", index);
|
fprintf(stderr, " popup_del %d\n", index);
|
||||||
DeleteMenuItem(menu, index + 1);
|
DeleteMenuItem(menu, index + 1);
|
||||||
if (mc->popup.ids != NULL)
|
if (mc->popup.ids != NULL)
|
||||||
@ -1380,11 +1496,33 @@ static void dlg_macpopup_del(union control *ctrl, void *dlg, int index)
|
|||||||
SetControlMaximum(mc->popup.tbctrl, CountMenuItems(menu));
|
SetControlMaximum(mc->popup.tbctrl, CountMenuItems(menu));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dlg_maclist_del(union control *ctrl, void *dlg, int index)
|
||||||
|
{
|
||||||
|
struct macctrls *mcs = dlg;
|
||||||
|
union macctrl *mc = findbyctrl(mcs, ctrl);
|
||||||
|
ListHandle list;
|
||||||
|
Size olen;
|
||||||
|
|
||||||
|
if (mc == NULL) return;
|
||||||
|
fprintf(stderr, " maclist_del %d\n", index);
|
||||||
|
if (GetControlData(mc->listbox.tbctrl, kControlEntireControl,
|
||||||
|
kControlListBoxListHandleTag, sizeof(list), &list,
|
||||||
|
&olen) != noErr)
|
||||||
|
return;
|
||||||
|
LDelRow(1, index, list);
|
||||||
|
if (mc->listbox.ids != NULL)
|
||||||
|
memcpy(mc->listbox.ids + index, mc->listbox.ids + index + 1,
|
||||||
|
(mc->listbox.nids - index - 1) * sizeof(*mc->listbox.ids));
|
||||||
|
DrawOneControl(mc->listbox.tbctrl);
|
||||||
|
}
|
||||||
|
|
||||||
void dlg_listbox_del(union control *ctrl, void *dlg, int index)
|
void dlg_listbox_del(union control *ctrl, void *dlg, int index)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (ctrl->listbox.height == 0)
|
if (ctrl->listbox.height == 0)
|
||||||
dlg_macpopup_del(ctrl, dlg, index);
|
dlg_macpopup_del(ctrl, dlg, index);
|
||||||
|
else
|
||||||
|
dlg_maclist_del(ctrl, dlg, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dlg_macpopup_add(union control *ctrl, void *dlg, char const *text)
|
static void dlg_macpopup_add(union control *ctrl, void *dlg, char const *text)
|
||||||
@ -1394,6 +1532,7 @@ static void dlg_macpopup_add(union control *ctrl, void *dlg, char const *text)
|
|||||||
MenuRef menu = mc->popup.menu;
|
MenuRef menu = mc->popup.menu;
|
||||||
Str255 itemstring;
|
Str255 itemstring;
|
||||||
|
|
||||||
|
if (mc == NULL) return;
|
||||||
fprintf(stderr, " popup_add %s\n", text);
|
fprintf(stderr, " popup_add %s\n", text);
|
||||||
assert(text[0] != '\0');
|
assert(text[0] != '\0');
|
||||||
c2pstrcpy(itemstring, text);
|
c2pstrcpy(itemstring, text);
|
||||||
@ -1402,11 +1541,40 @@ static void dlg_macpopup_add(union control *ctrl, void *dlg, char const *text)
|
|||||||
SetControlMaximum(mc->popup.tbctrl, CountMenuItems(menu));
|
SetControlMaximum(mc->popup.tbctrl, CountMenuItems(menu));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void dlg_maclist_add(union control *ctrl, void *dlg, char const *text)
|
||||||
|
{
|
||||||
|
struct macctrls *mcs = dlg;
|
||||||
|
union macctrl *mc = findbyctrl(mcs, ctrl);
|
||||||
|
ListHandle list;
|
||||||
|
Size olen;
|
||||||
|
ListBounds bounds;
|
||||||
|
Cell cell = { 0, 0 };
|
||||||
|
|
||||||
|
if (mc == NULL) return;
|
||||||
|
fprintf(stderr, " maclist_add %s\n", text);
|
||||||
|
if (GetControlData(mc->listbox.tbctrl, kControlEntireControl,
|
||||||
|
kControlListBoxListHandleTag, sizeof(list), &list,
|
||||||
|
&olen) != noErr)
|
||||||
|
return;
|
||||||
|
#if TARGET_API_MAC_CARBON
|
||||||
|
GetListDataBounds(list, &bounds);
|
||||||
|
#else
|
||||||
|
bounds = (*list)->dataBounds;
|
||||||
|
#endif
|
||||||
|
cell.v = bounds.bottom;
|
||||||
|
LAddRow(1, cell.v, list);
|
||||||
|
LSetCell(text, strlen(text), cell, list);
|
||||||
|
DrawOneControl(mc->listbox.tbctrl);
|
||||||
|
}
|
||||||
|
|
||||||
void dlg_listbox_add(union control *ctrl, void *dlg, char const *text)
|
void dlg_listbox_add(union control *ctrl, void *dlg, char const *text)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (ctrl->listbox.height == 0)
|
if (ctrl->listbox.height == 0)
|
||||||
dlg_macpopup_add(ctrl, dlg, text);
|
dlg_macpopup_add(ctrl, dlg, text);
|
||||||
|
else
|
||||||
|
dlg_maclist_add(ctrl, dlg, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dlg_macpopup_addwithid(union control *ctrl, void *dlg,
|
static void dlg_macpopup_addwithid(union control *ctrl, void *dlg,
|
||||||
@ -1417,7 +1585,8 @@ static void dlg_macpopup_addwithid(union control *ctrl, void *dlg,
|
|||||||
MenuRef menu = mc->popup.menu;
|
MenuRef menu = mc->popup.menu;
|
||||||
unsigned int index;
|
unsigned int index;
|
||||||
|
|
||||||
fprintf(stderr, " popup_addwthindex %s, %d\n", text, id);
|
if (mc == NULL) return;
|
||||||
|
fprintf(stderr, " popup_addwthid %s, %d\n", text, id);
|
||||||
dlg_macpopup_add(ctrl, dlg, text);
|
dlg_macpopup_add(ctrl, dlg, text);
|
||||||
index = CountMenuItems(menu) - 1;
|
index = CountMenuItems(menu) - 1;
|
||||||
if (mc->popup.nids <= index) {
|
if (mc->popup.nids <= index) {
|
||||||
@ -1427,12 +1596,44 @@ static void dlg_macpopup_addwithid(union control *ctrl, void *dlg,
|
|||||||
mc->popup.ids[index] = id;
|
mc->popup.ids[index] = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dlg_maclist_addwithid(union control *ctrl, void *dlg,
|
||||||
|
char const *text, int id)
|
||||||
|
{
|
||||||
|
struct macctrls *mcs = dlg;
|
||||||
|
union macctrl *mc = findbyctrl(mcs, ctrl);
|
||||||
|
ListHandle list;
|
||||||
|
Size olen;
|
||||||
|
ListBounds bounds;
|
||||||
|
int index;
|
||||||
|
|
||||||
|
if (mc == NULL) return;
|
||||||
|
fprintf(stderr, " maclist_addwithid %s %d\n", text, id);
|
||||||
|
dlg_maclist_add(ctrl, dlg, text);
|
||||||
|
if (GetControlData(mc->listbox.tbctrl, kControlEntireControl,
|
||||||
|
kControlListBoxListHandleTag, sizeof(list), &list,
|
||||||
|
&olen) != noErr)
|
||||||
|
return;
|
||||||
|
#if TARGET_API_MAC_CARBON
|
||||||
|
GetListDataBounds(list, &bounds);
|
||||||
|
#else
|
||||||
|
bounds = (*list)->dataBounds;
|
||||||
|
#endif
|
||||||
|
index = bounds.bottom;
|
||||||
|
if (mc->listbox.nids <= index) {
|
||||||
|
mc->listbox.nids = index + 1;
|
||||||
|
mc->listbox.ids = sresize(mc->listbox.ids, mc->listbox.nids, int);
|
||||||
|
}
|
||||||
|
mc->listbox.ids[index] = id;
|
||||||
|
}
|
||||||
|
|
||||||
void dlg_listbox_addwithid(union control *ctrl, void *dlg,
|
void dlg_listbox_addwithid(union control *ctrl, void *dlg,
|
||||||
char const *text, int id)
|
char const *text, int id)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (ctrl->listbox.height == 0)
|
if (ctrl->listbox.height == 0)
|
||||||
dlg_macpopup_addwithid(ctrl, dlg, text, id);
|
dlg_macpopup_addwithid(ctrl, dlg, text, id);
|
||||||
|
else
|
||||||
|
dlg_maclist_addwithid(ctrl, dlg, text, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
int dlg_listbox_getid(union control *ctrl, void *dlg, int index)
|
int dlg_listbox_getid(union control *ctrl, void *dlg, int index)
|
||||||
@ -1440,6 +1641,7 @@ int dlg_listbox_getid(union control *ctrl, void *dlg, int index)
|
|||||||
struct macctrls *mcs = dlg;
|
struct macctrls *mcs = dlg;
|
||||||
union macctrl *mc = findbyctrl(mcs, ctrl);
|
union macctrl *mc = findbyctrl(mcs, ctrl);
|
||||||
|
|
||||||
|
assert(mc != NULL);
|
||||||
if (ctrl->listbox.height == 0) {
|
if (ctrl->listbox.height == 0) {
|
||||||
assert(mc->popup.ids != NULL && mc->popup.nids > index);
|
assert(mc->popup.ids != NULL && mc->popup.nids > index);
|
||||||
return mc->popup.ids[index];
|
return mc->popup.ids[index];
|
||||||
@ -1447,15 +1649,52 @@ int dlg_listbox_getid(union control *ctrl, void *dlg, int index)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dlg_listbox_index(union control *ctrl, void *dlg)
|
static int dlg_maclist_index(union control *ctrl, void *dlg)
|
||||||
{
|
{
|
||||||
struct macctrls *mcs = dlg;
|
struct macctrls *mcs = dlg;
|
||||||
union macctrl *mc = findbyctrl(mcs, ctrl);
|
union macctrl *mc = findbyctrl(mcs, ctrl);
|
||||||
|
ListHandle list;
|
||||||
|
Size olen;
|
||||||
|
Cell cell = { 0, 0 };
|
||||||
|
|
||||||
if (ctrl->listbox.height == 0)
|
if (GetControlData(mc->listbox.tbctrl, kControlEntireControl,
|
||||||
|
kControlListBoxListHandleTag, sizeof(list), &list,
|
||||||
|
&olen) != noErr)
|
||||||
|
return -1;
|
||||||
|
if (LGetSelect(TRUE, &cell, list))
|
||||||
|
return cell.v;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dlg_listbox_index(union control *ctrl, void *dlg)
|
||||||
|
{
|
||||||
|
struct macctrls *mcs = dlg;
|
||||||
|
union macctrl *mc;
|
||||||
|
|
||||||
|
if (ctrl->listbox.height == 0) {
|
||||||
|
mc = findbyctrl(mcs, ctrl);
|
||||||
|
assert(mc != NULL);
|
||||||
return GetControlValue(mc->popup.tbctrl) - 1;
|
return GetControlValue(mc->popup.tbctrl) - 1;
|
||||||
return 0;
|
} else
|
||||||
};
|
return dlg_maclist_index(ctrl, dlg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dlg_maclist_issel(union control *ctrl, void *dlg, int index)
|
||||||
|
{
|
||||||
|
struct macctrls *mcs = dlg;
|
||||||
|
union macctrl *mc = findbyctrl(mcs, ctrl);
|
||||||
|
ListHandle list;
|
||||||
|
Size olen;
|
||||||
|
Cell cell = { 0, 0 };
|
||||||
|
|
||||||
|
if (GetControlData(mc->listbox.tbctrl, kControlEntireControl,
|
||||||
|
kControlListBoxListHandleTag, sizeof(list), &list,
|
||||||
|
&olen) != noErr)
|
||||||
|
return FALSE;
|
||||||
|
cell.v = index;
|
||||||
|
return LGetSelect(FALSE, &cell, list);
|
||||||
|
}
|
||||||
|
|
||||||
int dlg_listbox_issel(union control *ctrl, void *dlg, int index)
|
int dlg_listbox_issel(union control *ctrl, void *dlg, int index)
|
||||||
{
|
{
|
||||||
@ -1464,14 +1703,16 @@ int dlg_listbox_issel(union control *ctrl, void *dlg, int index)
|
|||||||
|
|
||||||
if (ctrl->listbox.height == 0)
|
if (ctrl->listbox.height == 0)
|
||||||
return GetControlValue(mc->popup.tbctrl) - 1 == index;
|
return GetControlValue(mc->popup.tbctrl) - 1 == index;
|
||||||
return 0;
|
else
|
||||||
};
|
return dlg_maclist_issel(ctrl, dlg, index);
|
||||||
|
}
|
||||||
|
|
||||||
void dlg_listbox_select(union control *ctrl, void *dlg, int index)
|
void dlg_listbox_select(union control *ctrl, void *dlg, int index)
|
||||||
{
|
{
|
||||||
struct macctrls *mcs = dlg;
|
struct macctrls *mcs = dlg;
|
||||||
union macctrl *mc = findbyctrl(mcs, ctrl);
|
union macctrl *mc = findbyctrl(mcs, ctrl);
|
||||||
|
|
||||||
|
if (mc == NULL) return;
|
||||||
if (ctrl->listbox.height == 0)
|
if (ctrl->listbox.height == 0)
|
||||||
SetControlValue(mc->popup.tbctrl, index + 1);
|
SetControlValue(mc->popup.tbctrl, index + 1);
|
||||||
};
|
};
|
||||||
@ -1486,7 +1727,7 @@ void dlg_text_set(union control *ctrl, void *dlg, char const *text)
|
|||||||
struct macctrls *mcs = dlg;
|
struct macctrls *mcs = dlg;
|
||||||
union macctrl *mc = findbyctrl(mcs, ctrl);
|
union macctrl *mc = findbyctrl(mcs, ctrl);
|
||||||
|
|
||||||
assert(mc != NULL);
|
if (mc == NULL) return;
|
||||||
if (mac_gestalts.apprvers >= 0x100)
|
if (mac_gestalts.apprvers >= 0x100)
|
||||||
SetControlData(mc->text.tbctrl, kControlEntireControl,
|
SetControlData(mc->text.tbctrl, kControlEntireControl,
|
||||||
kControlStaticTextTextTag, strlen(text), text);
|
kControlStaticTextTextTag, strlen(text), text);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user