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 librararies 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 $ */
26 #include <X11/Intrinsic.h>
27 #include <Xm/DialogS.h>
29 #include <Xm/PanedW.h>
30 #include <Xm/RowColumn.h>
31 #include <Xm/Separator.h>
34 #include <Xm/ToggleB.h>
35 #include <Xm/SSpinB.h>
36 #include <Xm/ScrollBar.h>
38 #include <Xm/ScrolledW.h>
42 #include <DtMail/DtVirtArray.hh>
43 #include <DtMail/options_util.h>
47 Boolean props_changed;
49 options_checkbox_init(
54 XtVaSetValues(checkbox, XmNuserData,(XtArgVal)OPTIONS_EDIT , NULL);
55 XtAddCallback(checkbox, XmNvalueChangedCallback,
56 options_setting_chgCB, (XtPointer)dirty_bit);
60 options_checkbox_set_value(
67 /* Set state so dirty-bit is not triggered */
68 XtVaSetValues(checkbox, XmNuserData, (XtArgVal)OPTIONS_LOAD, NULL);
70 XmToggleButtonSetState(checkbox, b_value, set_dirty_bit? TRUE : FALSE);
74 XtVaSetValues(checkbox, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
80 options_checkbox_get_value(Widget checkbox)
83 return((Boolean)XmToggleButtonGetState(checkbox));
88 options_radiobox_init(
98 for (i=0; i < num_items; i++)
100 XtVaSetValues(items[i], XmNuserData, (XtArgVal)item_values[i], NULL);
101 XtAddCallback(items[i], XmNvalueChangedCallback,
102 options_setting_chgCB, (XtPointer)dirty_bit);
103 XtAddCallback(items[i], XmNvalueChangedCallback,
104 options_radiobox_itemCB, (XtPointer)item_values[i]);
106 /* Ensure Radiobox has a default Value set */
109 XtVaSetValues(items[i], XmNset, True, NULL);
110 XtVaSetValues(radiobox, XmNuserData, (XtArgVal)item_values[i], NULL);
117 options_radiobox_get_value(
123 XtVaGetValues(radiobox, XmNuserData, &value, NULL);
129 options_radiobox_set_value(
132 Boolean set_dirty_bit
135 int num_children = 0;
136 WidgetList children = NULL;
137 XtArgVal childval = 0;
138 Boolean found = FALSE;
141 set_dirty_bit = set_dirty_bit;
142 XtVaGetValues(radiobox,
143 XtNnumChildren, &num_children,
144 XtNchildren, &children,
147 for (i = 0; i < num_children; i++)
149 XtVaGetValues(children[i], XmNuserData, &childval, NULL);
150 XmToggleButtonSetState(children[i], childval == value? TRUE : FALSE, FALSE);
151 if (childval == value)
154 XtVaSetValues(radiobox, XmNuserData, (XtArgVal)value, NULL);
164 * Callback: choice value has changed...turnon dirty bit
167 options_setting_chgCB(
169 XtPointer clientdata,
173 Boolean *dirty_bit = (Boolean *)clientdata;
178 props_changed = TRUE;
182 * Callback: item in exclusive choice has been set...store it's
183 * value in the parent radiobox
186 options_radiobox_itemCB(
188 XtPointer clientdata,
192 XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct*)calldata;
193 int value = (int)((long)clientdata);
198 excl_setting = XtParent(item);
199 XtVaSetValues(excl_setting, XmNuserData, (XtArgVal)value, NULL);
210 XtAddCallback(field, XmNvalueChangedCallback,
211 options_field_chgCB, (XtPointer)dirty_bit);
213 XtVaSetValues(field, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
217 /* NOTE: caller must free memory allocated by XmTextFieldGetString() */
219 options_field_get_value(
225 value = XmTextFieldGetString(field);
231 options_field_set_value(
234 Boolean set_dirty_bit
238 /* Set state so dirty-bit is not triggered */
239 XtVaSetValues(field, XmNuserData, (XtArgVal)OPTIONS_LOAD, NULL);
241 /* Set field value */
242 XmTextFieldSetString(field, value);
246 XtVaSetValues(field, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
255 XtPointer clientdata,
259 Boolean *dirty_bit = (Boolean *)clientdata;
263 XtVaGetValues(widget, XmNuserData, &field_mode, NULL);
264 if (field_mode == OPTIONS_EDIT)
266 props_changed = TRUE;
270 all_digits(char *string) {
273 if (!isdigit(*string++))
281 options_spinbox_modCB(
283 XtPointer clientdata,
287 Widget spinbox = (Widget) clientdata;
289 Display *dpy = XtDisplayOfObject(widget);
290 char *text = XtMalloc(BUFSIZ);
292 XmTextVerifyCallbackStruct *cbs = (XmTextVerifyCallbackStruct*) calldata;
294 if (NULL == cbs->text->ptr) return;
295 if (!all_digits(cbs->text->ptr))
301 textvalue = XmTextGetString(widget);
302 strncpy(text, textvalue, cbs->startPos);
303 text[cbs->startPos] = '\0';
304 strcat(text, cbs->text->ptr);
305 strcat(text, textvalue+cbs->endPos);
307 XtVaGetValues(spinbox, XmNmaximumValue, &mvalue, NULL);
308 value = (int) strtol(text, NULL, 10);
314 if (NULL != text) XtFree(text);
315 if (NULL != textvalue) XtFree(textvalue);
319 options_spinbox_chgCB(
321 XtPointer clientdata,
325 Widget spinbox = (Widget) clientdata;
327 (int) strtol(XmTextGetString(widget), NULL, 10);
328 Display *dpy = XtDisplayOfObject(widget);
331 props_changed = TRUE;
332 if (!all_digits(XmTextGetString(widget))){
333 XtVaSetValues(spinbox, XmNposition, 1, NULL);
337 XtVaGetValues(spinbox, XmNmaximumValue, &mvalue, NULL);
338 if (value > mvalue) {
339 XtVaSetValues(spinbox, XmNposition, mvalue, NULL);
343 // It could never be less than the minimum value because a
344 // '-' is an invalid entry and it would be cleared and reset
345 // if entered. So if we made it here it is a valid entry. We
346 // also have to reset the insertion point! Another spinbox bug
347 // we have to work around.
348 XtVaSetValues(spinbox, XmNposition, value, NULL);
350 while ((value /= 10) > 0)
352 XmTextSetInsertionPosition(widget, shift);
356 options_spinbox_init(
362 dirty_bit = dirty_bit;
364 XtVaGetValues(spinbox, XmNtextField, &textfield, NULL);
365 XtAddCallback(textfield, XmNvalueChangedCallback,
366 options_spinbox_chgCB, spinbox);
367 XtAddCallback(textfield, XmNmodifyVerifyCallback,
368 options_spinbox_modCB, spinbox);
370 XtVaSetValues(spinbox, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
376 options_spinbox_get_value(
382 XtVaGetValues(spinbox,
390 options_spinbox_set_value(
393 Boolean set_dirty_bit
397 /* Set state so dirty-bit is not triggered */
398 XtVaSetValues(spinbox, XmNuserData, (XtArgVal)OPTIONS_LOAD, NULL);
400 /* Set spinbox value */
401 XtVaSetValues(spinbox, XmNposition, value, NULL);
405 XtVaSetValues(spinbox, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
411 options_list_init(Widget list,
412 DtVirtArray<char *> *item_list
418 XmStringTable str_list;
420 if(item_list == NULL)
423 num_items = item_list->length();
424 if (0 == num_items) return;
426 str_list = (XmStringTable)XtMalloc(num_items * sizeof(XmString *));
428 for(i = 0; i < num_items; i++)
429 str_list[i] = XmStringCreateLocalized((*item_list)[i]);
432 XmNitemCount, num_items,
436 for(i = 0; i < num_items; i++)
437 XmStringFree(str_list[i]);
438 XtFree((char *)str_list);
442 void listAddButtonCB(
444 XtPointer clientdata,
448 ListUiItem *list = (ListUiItem *)clientdata;
452 list->handleAddButtonPress();
456 void listDeleteButtonCB(
458 XtPointer clientdata,
462 ListUiItem *list = (ListUiItem *)clientdata;
466 list->handleDeleteButtonPress();
470 void listChangeButtonCB(
472 XtPointer clientdata,
476 ListUiItem *list = (ListUiItem *)clientdata;
480 list->handleChangeButtonPress();
484 void add_cbs_to_list(ListUiItem *list,
489 XtAddCallback(add_butt,
494 XtAddCallback(del_butt,
499 XtAddCallback(chg_butt,
507 options_scale_get_value(
513 XtVaGetValues(scale, XmNvalue, &value, NULL);
519 options_scale_set_value(
522 Boolean set_dirty_bit
528 /* Set state so dirty-bit is not triggered */
529 XtVaSetValues(scale, XmNuserData, (XtArgVal)OPTIONS_LOAD, NULL);
531 val_int = (int) strtol(value, NULL, 10);
532 /* Set scale value */
534 XtVaSetValues(scale, XmNvalue, val_int, NULL);
538 XtVaSetValues(scale, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);