1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-05-28 15:24: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:
Ben Harris 2003-04-05 22:00:57 +00:00
parent 3faede1ec3
commit f51cc630c2

View File

@ -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
* All rights reserved.
@ -61,6 +61,7 @@ union macctrl {
MACCTRL_RADIO,
MACCTRL_CHECKBOX,
MACCTRL_BUTTON,
MACCTRL_LISTBOX,
MACCTRL_POPUP
} type;
/* Template from which this was generated */
@ -93,6 +94,12 @@ union macctrl {
ControlRef tbctrl;
ControlRef tbring;
} button;
struct {
struct macctrl_generic generic;
ControlRef tbctrl;
unsigned int nids;
int *ids;
} listbox;
struct {
struct macctrl_generic generic;
ControlRef tbctrl;
@ -132,6 +139,8 @@ static void macctrl_checkbox(struct macctrls *, WindowPtr,
struct mac_layoutstate *, union control *);
static void macctrl_button(struct macctrls *, WindowPtr,
struct mac_layoutstate *, union control *);
static void macctrl_listbox(struct macctrls *, WindowPtr,
struct mac_layoutstate *, union control *);
static void macctrl_popup(struct macctrls *, WindowPtr,
struct mac_layoutstate *, union control *);
#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_switchtopanel(mcs, 1);
macctrl_switchtopanel(mcs, 19);
/* 14 = proxies, 20 = SSH bugs */
}
@ -325,6 +334,8 @@ static void macctrl_layoutset(struct mac_layoutstate *curstate,
case CTRL_LISTBOX:
if (ctrl->listbox.height == 0)
macctrl_popup(mcs, window, &cols[colstart], ctrl);
else
macctrl_listbox(mcs, window, &cols[colstart], ctrl);
break;
}
}
@ -337,6 +348,9 @@ static void macctrl_switchtopanel(struct macctrls *mcs, unsigned int which)
{
unsigned int i, j;
union macctrl *mc;
ListHandle list;
Size olen;
#define hideshow(c) do { \
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:
hideshow(mc->button.tbctrl);
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:
hideshow(mc->popup.tbctrl);
break;
@ -790,6 +822,59 @@ static pascal SInt32 macctrl_sys7_default_cdef(SInt16 variant,
}
#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,
struct mac_layoutstate *curstate,
union control *ctrl)
@ -892,6 +977,9 @@ void macctrl_activate(WindowPtr window, EventRecord *event)
if (mc->button.tbring != NULL)
HiliteControl(mc->button.tbring, state);
break;
case MACCTRL_LISTBOX:
HiliteControl(mc->listbox.tbctrl, state);
break;
case MACCTRL_POPUP:
HiliteControl(mc->popup.tbctrl, state);
break;
@ -969,6 +1057,10 @@ void macctrl_click(WindowPtr window, EventRecord *event)
if (trackresult != 0)
ctrlevent(mcs, mc, EVENT_ACTION);
break;
case MACCTRL_LISTBOX:
/* FIXME spot double-click */
ctrlevent(mcs, mc, EVENT_SELCHANGE);
break;
case MACCTRL_POPUP:
ctrlevent(mcs, mc, EVENT_SELCHANGE);
break;
@ -1223,7 +1315,7 @@ void dlg_radiobutton_set(union control *ctrl, void *dlg, int whichbutton)
union macctrl *mc = findbyctrl(mcs, ctrl);
int i;
assert(mc != NULL);
if (mc == NULL) return;
for (i = 0; i < ctrl->radio.nbuttons; i++) {
if (i == whichbutton)
SetControlValue(mc->radio.tbctrls[i],
@ -1260,7 +1352,7 @@ void dlg_checkbox_set(union control *ctrl, void *dlg, int checked)
struct macctrls *mcs = dlg;
union macctrl *mc = findbyctrl(mcs, ctrl);
assert(mc != NULL);
if (mc == NULL) return;
SetControlValue(mc->checkbox.tbctrl,
checked ? kControlCheckBoxCheckedValue :
kControlCheckBoxUncheckedValue);
@ -1286,7 +1378,7 @@ void dlg_editbox_set(union control *ctrl, void *dlg, char const *text)
union macctrl *mc = findbyctrl(mcs, ctrl);
GrafPtr saveport;
assert(mc != NULL);
if (mc == NULL) return;
assert(mc->generic.type == MACCTRL_EDITBOX);
GetPort(&saveport);
SetPort((GrafPtr)(GetWindowPort(mcs->window)));
@ -1349,6 +1441,7 @@ static void dlg_macpopup_clear(union control *ctrl, void *dlg)
MenuRef menu = mc->popup.menu;
unsigned int i, n;
if (mc == NULL) return;
fprintf(stderr, " popup_clear\n");
n = CountMenuItems(menu);
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));
}
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)
{
if (ctrl->listbox.height == 0)
dlg_macpopup_clear(ctrl, dlg);
else
dlg_maclist_clear(ctrl, dlg);
}
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);
MenuRef menu = mc->popup.menu;
if (mc == NULL) return;
fprintf(stderr, " popup_del %d\n", index);
DeleteMenuItem(menu, index + 1);
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));
}
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)
{
if (ctrl->listbox.height == 0)
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)
@ -1394,6 +1532,7 @@ static void dlg_macpopup_add(union control *ctrl, void *dlg, char const *text)
MenuRef menu = mc->popup.menu;
Str255 itemstring;
if (mc == NULL) return;
fprintf(stderr, " popup_add %s\n", text);
assert(text[0] != '\0');
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));
}
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)
{
if (ctrl->listbox.height == 0)
dlg_macpopup_add(ctrl, dlg, text);
else
dlg_maclist_add(ctrl, dlg, text);
}
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;
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);
index = CountMenuItems(menu) - 1;
if (mc->popup.nids <= index) {
@ -1427,12 +1596,44 @@ static void dlg_macpopup_addwithid(union control *ctrl, void *dlg,
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,
char const *text, int id)
{
if (ctrl->listbox.height == 0)
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)
@ -1440,6 +1641,7 @@ int dlg_listbox_getid(union control *ctrl, void *dlg, int index)
struct macctrls *mcs = dlg;
union macctrl *mc = findbyctrl(mcs, ctrl);
assert(mc != NULL);
if (ctrl->listbox.height == 0) {
assert(mc->popup.ids != NULL && mc->popup.nids > index);
return mc->popup.ids[index];
@ -1447,15 +1649,52 @@ int dlg_listbox_getid(union control *ctrl, void *dlg, int index)
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;
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 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)
{
@ -1464,14 +1703,16 @@ int dlg_listbox_issel(union control *ctrl, void *dlg, int index)
if (ctrl->listbox.height == 0)
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)
{
struct macctrls *mcs = dlg;
union macctrl *mc = findbyctrl(mcs, ctrl);
if (mc == NULL) return;
if (ctrl->listbox.height == 0)
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;
union macctrl *mc = findbyctrl(mcs, ctrl);
assert(mc != NULL);
if (mc == NULL) return;
if (mac_gestalts.apprvers >= 0x100)
SetControlData(mc->text.tbctrl, kControlEntireControl,
kControlStaticTextTextTag, strlen(text), text);