2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $TOG: options_util.C /main/8 1999/07/07 13:20:04 mgreess $ */
27 #include <X11/Intrinsic.h>
28 #include <Xm/DialogS.h>
30 #include <Xm/PanedW.h>
31 #include <Xm/RowColumn.h>
32 #include <Xm/Separator.h>
35 #include <Xm/ToggleB.h>
36 #include <Xm/SSpinB.h>
37 #include <Xm/ScrollBar.h>
39 #include <Xm/ScrolledW.h>
43 #include <DtMail/DtVirtArray.hh>
44 #include <DtMail/options_util.h>
48 Boolean props_changed;
50 options_checkbox_init(
55 XtVaSetValues(checkbox, XmNuserData,(XtArgVal)OPTIONS_EDIT , NULL);
56 XtAddCallback(checkbox, XmNvalueChangedCallback,
57 options_setting_chgCB, (XtPointer)dirty_bit);
61 options_checkbox_set_value(
68 /* Set state so dirty-bit is not triggered */
69 XtVaSetValues(checkbox, XmNuserData, (XtArgVal)OPTIONS_LOAD, NULL);
71 XmToggleButtonSetState(checkbox, b_value, set_dirty_bit? TRUE : FALSE);
75 XtVaSetValues(checkbox, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
81 options_checkbox_get_value(Widget checkbox)
84 return((Boolean)XmToggleButtonGetState(checkbox));
89 options_radiobox_init(
99 for (i=0; i < num_items; i++)
101 XtVaSetValues(items[i], XmNuserData, (XtArgVal)item_values[i], NULL);
102 XtAddCallback(items[i], XmNvalueChangedCallback,
103 options_setting_chgCB, (XtPointer)dirty_bit);
104 XtAddCallback(items[i], XmNvalueChangedCallback,
105 options_radiobox_itemCB, (XtPointer) (intptr_t) item_values[i]);
107 /* Ensure Radiobox has a default Value set */
110 XtVaSetValues(items[i], XmNset, True, NULL);
111 XtVaSetValues(radiobox, XmNuserData, (XtArgVal)item_values[i], NULL);
118 options_radiobox_get_value(
124 XtVaGetValues(radiobox, XmNuserData, &value, NULL);
130 options_radiobox_set_value(
133 Boolean set_dirty_bit
136 int num_children = 0;
137 WidgetList children = NULL;
138 XtArgVal childval = 0;
139 Boolean found = FALSE;
142 set_dirty_bit = set_dirty_bit;
143 XtVaGetValues(radiobox,
144 XtNnumChildren, &num_children,
145 XtNchildren, &children,
148 for (i = 0; i < num_children; i++)
150 XtVaGetValues(children[i], XmNuserData, &childval, NULL);
151 XmToggleButtonSetState(children[i], childval == value? TRUE : FALSE, FALSE);
152 if (childval == value)
155 XtVaSetValues(radiobox, XmNuserData, (XtArgVal)value, NULL);
165 * Callback: choice value has changed...turnon dirty bit
168 options_setting_chgCB(
170 XtPointer clientdata,
174 Boolean *dirty_bit = (Boolean *)clientdata;
179 props_changed = TRUE;
183 * Callback: item in exclusive choice has been set...store it's
184 * value in the parent radiobox
187 options_radiobox_itemCB(
189 XtPointer clientdata,
193 XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct*)calldata;
194 int value = (int)((long)clientdata);
199 excl_setting = XtParent(item);
200 XtVaSetValues(excl_setting, XmNuserData, (XtArgVal)value, NULL);
211 XtAddCallback(field, XmNvalueChangedCallback,
212 options_field_chgCB, (XtPointer)dirty_bit);
214 XtVaSetValues(field, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
218 /* NOTE: caller must free memory allocated by XmTextFieldGetString() */
220 options_field_get_value(
226 value = XmTextFieldGetString(field);
232 options_field_set_value(
235 Boolean set_dirty_bit
239 /* Set state so dirty-bit is not triggered */
240 XtVaSetValues(field, XmNuserData, (XtArgVal)OPTIONS_LOAD, NULL);
242 /* Set field value */
243 XmTextFieldSetString(field, value);
247 XtVaSetValues(field, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
256 XtPointer clientdata,
260 Boolean *dirty_bit = (Boolean *)clientdata;
264 XtVaGetValues(widget, XmNuserData, &field_mode, NULL);
265 if (field_mode == OPTIONS_EDIT)
267 props_changed = TRUE;
271 all_digits(char *string) {
274 if (!isdigit(*string++))
282 options_spinbox_modCB(
284 XtPointer clientdata,
288 Widget spinbox = (Widget) clientdata;
290 Display *dpy = XtDisplayOfObject(widget);
291 char *text = XtMalloc(BUFSIZ);
293 XmTextVerifyCallbackStruct *cbs = (XmTextVerifyCallbackStruct*) calldata;
295 if (NULL == cbs->text->ptr) return;
296 if (!all_digits(cbs->text->ptr))
302 textvalue = XmTextGetString(widget);
303 strncpy(text, textvalue, cbs->startPos);
304 text[cbs->startPos] = '\0';
305 strcat(text, cbs->text->ptr);
306 strcat(text, textvalue+cbs->endPos);
308 XtVaGetValues(spinbox, XmNmaximumValue, &mvalue, NULL);
309 value = (int) strtol(text, NULL, 10);
320 options_spinbox_chgCB(
322 XtPointer clientdata,
326 Widget spinbox = (Widget) clientdata;
328 (int) strtol(XmTextGetString(widget), NULL, 10);
329 Display *dpy = XtDisplayOfObject(widget);
332 props_changed = TRUE;
333 if (!all_digits(XmTextGetString(widget))){
334 XtVaSetValues(spinbox, XmNposition, 1, NULL);
338 XtVaGetValues(spinbox, XmNmaximumValue, &mvalue, NULL);
339 if (value > mvalue) {
340 XtVaSetValues(spinbox, XmNposition, mvalue, NULL);
344 // It could never be less than the minimum value because a
345 // '-' is an invalid entry and it would be cleared and reset
346 // if entered. So if we made it here it is a valid entry. We
347 // also have to reset the insertion point! Another spinbox bug
348 // we have to work around.
349 XtVaSetValues(spinbox, XmNposition, value, NULL);
351 while ((value /= 10) > 0)
353 XmTextSetInsertionPosition(widget, shift);
357 options_spinbox_init(
363 dirty_bit = dirty_bit;
365 XtVaGetValues(spinbox, XmNtextField, &textfield, NULL);
366 XtAddCallback(textfield, XmNvalueChangedCallback,
367 options_spinbox_chgCB, spinbox);
368 XtAddCallback(textfield, XmNmodifyVerifyCallback,
369 options_spinbox_modCB, spinbox);
371 XtVaSetValues(spinbox, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
377 options_spinbox_get_value(
383 XtVaGetValues(spinbox,
391 options_spinbox_set_value(
394 Boolean set_dirty_bit
398 /* Set state so dirty-bit is not triggered */
399 XtVaSetValues(spinbox, XmNuserData, (XtArgVal)OPTIONS_LOAD, NULL);
401 /* Set spinbox value */
402 XtVaSetValues(spinbox, XmNposition, value, NULL);
406 XtVaSetValues(spinbox, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
412 options_list_init(Widget list,
413 DtVirtArray<char *> *item_list
419 XmStringTable str_list;
421 if(item_list == NULL)
424 num_items = item_list->length();
425 if (0 == num_items) return;
427 str_list = (XmStringTable)XtMalloc(num_items * sizeof(XmString *));
429 for(i = 0; i < num_items; i++)
430 str_list[i] = XmStringCreateLocalized((*item_list)[i]);
433 XmNitemCount, num_items,
437 for(i = 0; i < num_items; i++)
438 XmStringFree(str_list[i]);
439 XtFree((char *)str_list);
443 void listAddButtonCB(
445 XtPointer clientdata,
449 ListUiItem *list = (ListUiItem *)clientdata;
453 list->handleAddButtonPress();
457 void listDeleteButtonCB(
459 XtPointer clientdata,
463 ListUiItem *list = (ListUiItem *)clientdata;
467 list->handleDeleteButtonPress();
471 void listChangeButtonCB(
473 XtPointer clientdata,
477 ListUiItem *list = (ListUiItem *)clientdata;
481 list->handleChangeButtonPress();
485 void add_cbs_to_list(ListUiItem *list,
490 XtAddCallback(add_butt,
495 XtAddCallback(del_butt,
500 XtAddCallback(chg_butt,
508 options_scale_get_value(
514 XtVaGetValues(scale, XmNvalue, &value, NULL);
520 options_scale_set_value(
523 Boolean set_dirty_bit
529 /* Set state so dirty-bit is not triggered */
530 XtVaSetValues(scale, XmNuserData, (XtArgVal)OPTIONS_LOAD, NULL);
532 val_int = (int) strtol(value, NULL, 10);
533 /* Set scale value */
535 XtVaSetValues(scale, XmNvalue, val_int, NULL);
539 XtVaSetValues(scale, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);