1 static char *rcsid = "$Id: UiSelectionBox.c,v 1.3 1992/03/26 18:13:50 kny Exp $";
3 #include "UiIncludes.h"
6 static Widget uicreatesbformdialog();
8 uicreatesbfsbox(Widget formwdg,
9 void (*callback) (char *nodename));
10 static Widget uicreatesbseparator(Widget formwdg, Widget fsboxwdg);
11 static Widget uicreatesbadd(Widget formwdg, Widget fsboxwdg,
13 static Widget uicreatesbdelete(Widget formwdg, Widget fsboxwdg);
14 static Widget uicreatesblist(Widget formwdg, Widget deletewdg,
16 static char *uifixselection(char *selection);
18 static void uiselectionboxokcb(Widget wdg, caddr_t callback,
19 XmPushButtonCallbackStruct * calldata);
20 static void uiselectionboxcancelcb(Widget wdg, caddr_t ignored,
21 XmPushButtonCallbackStruct * calldata);
22 static void uiselectionboxaddcb(Widget wdg, caddr_t ignored,
23 XmPushButtonCallbackStruct * calldata);
24 static void uiselectionboxdeletecb(Widget wdg, caddr_t ignored,
25 XmPushButtonCallbackStruct * calldata);
26 static void uiselectionboxclickcb(Widget wdg, caddr_t ignored,
27 XmListCallbackStruct * calldata);
28 static void uiselectionboxupdateconfig(void);
31 uiTopLevel_t uiTopLevel;
32 char **uiSelectionArray;
38 int UiDisplaySelectionBox(callback)
39 void (*callback) (char *nodename);
41 uiSelectionBoxGfx_t *sbgfx = &uiTopLevel.SBGfx;
46 XtMapWidget(XtParent(sbgfx->FormWdg));
50 sbgfx->FormWdg = uicreatesbformdialog();
51 sbgfx->FSBoxWdg = uicreatesbfsbox(sbgfx->FormWdg, callback);
52 sbgfx->SeparatorWdg = uicreatesbseparator(sbgfx->FormWdg, sbgfx->FSBoxWdg);
53 sbgfx->AddWdg = uicreatesbadd(sbgfx->FormWdg, sbgfx->FSBoxWdg,
55 sbgfx->DeleteWdg = uicreatesbdelete(sbgfx->FormWdg, sbgfx->FSBoxWdg);
56 sbgfx->ListWdg = uicreatesblist(sbgfx->FormWdg, sbgfx->DeleteWdg,
59 XtManageChild(sbgfx->FormWdg);
60 XtRealizeWidget(XtParent(sbgfx->FormWdg));
62 if (!uiSelectionArray) {
63 dummystr = XmStringCreateSimple(" ");
64 XmListAddItem(uiTopLevel.SBGfx.ListWdg, dummystr, 0);
65 XtSetSensitive(uiTopLevel.SBGfx.ListWdg, FALSE);
66 XmStringFree(dummystr);
69 while (uiSelectionArray[i]) {
70 dummystr = XmStringCreateSimple(uiSelectionArray[i++]);
71 XmListAddItem(uiTopLevel.SBGfx.ListWdg, dummystr, 0);
72 XmStringFree(dummystr);
82 uicreatesbformdialog()
89 topwdg = XtCreateApplicationShell("SelectionBox",
90 topLevelShellWidgetClass,
93 args = uiVaSetArgs(&nargs,
94 XmNresizePolicy, XmRESIZE_NONE,
95 XmNautoUnmanage, FALSE, NULL);
96 formwdg = XmCreateForm(topwdg, "SelectionBox",
104 uicreatesbfsbox(formwdg, callback)
106 void (*callback) (char *nodename);
110 Widget fsboxwdg, textwdg, okwdg, cancelwdg;
112 args = uiVaSetArgs(&nargs,
113 XmNtopAttachment, XmATTACH_FORM,
115 XmNleftAttachment, XmATTACH_FORM,
118 XmNbottomAttachment, XmATTACH_FORM, NULL);
119 fsboxwdg = XmCreateFileSelectionBox(formwdg, "FSBox",
121 XtUnmanageChild(XmFileSelectionBoxGetChild(fsboxwdg,
122 XmDIALOG_HELP_BUTTON));
124 textwdg = XmFileSelectionBoxGetChild(fsboxwdg, XmDIALOG_TEXT);
125 XmTextSetString(textwdg, "");
127 okwdg = XmFileSelectionBoxGetChild(fsboxwdg, XmDIALOG_OK_BUTTON);
128 XtAddCallback(okwdg, XmNactivateCallback, uiselectionboxokcb,
131 cancelwdg = XmFileSelectionBoxGetChild(fsboxwdg, XmDIALOG_CANCEL_BUTTON);
132 XtAddCallback(cancelwdg, XmNactivateCallback, uiselectionboxcancelcb,
134 XtManageChild(fsboxwdg);
141 uicreatesbseparator(formwdg, fsboxwdg)
149 args = uiVaSetArgs(&nargs,
150 XmNorientation, XmVERTICAL,
151 XmNleftAttachment, XmATTACH_WIDGET,
152 XmNleftWidget, fsboxwdg,
154 XmNtopAttachment, XmATTACH_FORM,
155 XmNbottomAttachment, XmATTACH_FORM, NULL);
156 separatorwdg = XmCreateSeparatorGadget(formwdg, "Separator",
158 XtManageChild(separatorwdg);
165 uicreatesbadd(formwdg, fsboxwdg, separatorwdg)
174 args = uiVaSetArgs(&nargs,
177 XmNleftAttachment, XmATTACH_WIDGET,
178 XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
179 XmNbottomWidget, fsboxwdg,
181 XmNleftWidget, separatorwdg, NULL);
182 addwdg = XmCreatePushButtonGadget(formwdg, "Add",
184 XtManageChild(addwdg);
185 XtAddCallback(addwdg, XmNactivateCallback, uiselectionboxaddcb,
193 uicreatesbdelete(formwdg, fsboxwdg)
201 args = uiVaSetArgs(&nargs,
203 XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
204 XmNbottomWidget, fsboxwdg,
207 XmNrightAttachment, XmATTACH_FORM, NULL);
208 deletewdg = XmCreatePushButtonGadget(formwdg, "Delete",
210 XtManageChild(deletewdg);
211 XtAddCallback(deletewdg, XmNactivateCallback, uiselectionboxdeletecb,
219 uicreatesblist(formwdg, deletewdg, separatorwdg)
228 args = uiVaSetArgs(&nargs,
229 XmNvisibleItemCount, 15,
231 XmNselectionPolicy, XmSINGLE_SELECT,
232 XmNlistSizePolicy, XmCONSTANT,
233 XmNscrollBarDisplayPolicy, XmSTATIC,
234 XmNtopAttachment, XmATTACH_FORM,
236 XmNbottomAttachment, XmATTACH_WIDGET,
237 XmNbottomWidget, deletewdg,
239 XmNrightAttachment, XmATTACH_FORM,
242 XmNleftAttachment, XmATTACH_WIDGET,
243 XmNleftWidget, separatorwdg, NULL);
244 listwdg = XmCreateScrolledList(formwdg, "List",
246 XtManageChild(listwdg);
247 XtAddCallback(listwdg, XmNdefaultActionCallback, uiselectionboxclickcb,
255 uifixselection(selection)
263 if (index(selection, ':'))
264 return strdup(selection);
266 newselection = uiMalloc(strlen(selection) + strlen("file:") + 1);
267 strcpy(newselection, "file:");
268 strcat(newselection, selection);
274 static void uiselectionboxokcb(wdg, callback, calldata)
277 XmPushButtonCallbackStruct *calldata;
280 char *selection, *fixedselection;
282 textwdg = XmFileSelectionBoxGetChild(uiTopLevel.SBGfx.FSBoxWdg,
284 selection = XmTextGetString(textwdg);
285 fixedselection = uifixselection(selection);
286 XtUnmapWidget(XtParent(uiTopLevel.SBGfx.FormWdg));
287 (*(void (*) (char *nodename)) callback) (fixedselection);
290 XtFree(fixedselection);
294 static void uiselectionboxcancelcb(wdg, ignored, calldata)
297 XmPushButtonCallbackStruct *calldata;
299 XtUnmapWidget(XtParent(uiTopLevel.SBGfx.FormWdg));
303 static void uiselectionboxaddcb(wdg, ignored, calldata)
306 XmPushButtonCallbackStruct *calldata;
309 char *selection, *fixedselection;
310 XmString selectionstr;
314 textwdg = XmFileSelectionBoxGetChild(uiTopLevel.SBGfx.FSBoxWdg,
316 selection = XmTextGetString(textwdg);
317 fixedselection = uifixselection(selection);
319 if (fixedselection && fixedselection[0]) {
320 selectionstr = XmStringCreateSimple(fixedselection);
322 XmListDeletePos(uiTopLevel.SBGfx.ListWdg, 1);
323 XtSetSensitive(uiTopLevel.SBGfx.ListWdg, TRUE);
326 if (XmListGetSelectedPos(uiTopLevel.SBGfx.ListWdg, &poslist,
328 XmListDeselectPos(uiTopLevel.SBGfx.ListWdg, poslist[0]);
329 XmListAddItem(uiTopLevel.SBGfx.ListWdg, selectionstr, poslist[0]);
330 XmListSelectPos(uiTopLevel.SBGfx.ListWdg, poslist[0] + 1, FALSE);
333 XmListAddItem(uiTopLevel.SBGfx.ListWdg, selectionstr, 0);
334 XmStringFree(selectionstr);
337 XtFree(fixedselection);
339 uiselectionboxupdateconfig();
343 static void uiselectionboxdeletecb(wdg, ignored, calldata)
346 XmPushButtonCallbackStruct *calldata;
352 /* We should have only one selected item */
353 if (XmListGetSelectedPos(uiTopLevel.SBGfx.ListWdg, &poslist, &poscount)) {
354 XmListDeletePos(uiTopLevel.SBGfx.ListWdg, poslist[0]);
355 XmListSelectPos(uiTopLevel.SBGfx.ListWdg, poslist[0], FALSE);
358 if (!uiGetArg(uiTopLevel.SBGfx.ListWdg, XmNitemCount)) {
359 dummystr = XmStringCreateSimple(" ");
360 XmListAddItem(uiTopLevel.SBGfx.ListWdg, dummystr, 0);
361 XmStringFree(dummystr);
362 XtSetSensitive(uiTopLevel.SBGfx.ListWdg, FALSE);
365 uiselectionboxupdateconfig();
369 static void uiselectionboxclickcb(wdg, ignored, calldata)
372 XmListCallbackStruct *calldata;
377 XmStringGetLtoR(calldata->item, XmSTRING_DEFAULT_CHARSET, &selection);
378 textwdg = XmFileSelectionBoxGetChild(uiTopLevel.SBGfx.FSBoxWdg,
380 XmTextSetString(textwdg, selection);
385 static void uiselectionboxupdateconfig()
387 Widget listwdg = uiTopLevel.SBGfx.ListWdg;
390 XmStringTable stringtable;
393 nitems = uiGetArg(listwdg, XmNitemCount);
394 items = (char **) uiMalloc((nitems + 1) * sizeof(*items));
396 stringtable = (XmStringTable) uiGetArg(listwdg, XmNitems);
397 for (i = 0; i < nitems; i++)
398 XmStringGetLtoR(stringtable[i], XmSTRING_DEFAULT_CHARSET, &items[i]);
399 items[nitems] = (char *) NULL;
401 table = uiConfigPF((void *) NULL, C_DEFAULTS);
402 (void) uiConfigSetPF(table, C_DEFAULTSTABLE, (void *) items);