Files
cdesktop/cde/programs/dtmail/dtmail/options_util.C
2018-04-28 12:30:20 -06:00

544 lines
12 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $TOG: options_util.C /main/8 1999/07/07 13:20:04 mgreess $ */
#include <ctype.h>
#include <stdlib.h>
#include <stdint.h>
#include <X11/Intrinsic.h>
#include <Xm/DialogS.h>
#include <Xm/Form.h>
#include <Xm/PanedW.h>
#include <Xm/RowColumn.h>
#include <Xm/Separator.h>
#include <Xm/Label.h>
#include <Xm/PushB.h>
#include <Xm/ToggleB.h>
#include <Xm/SSpinB.h>
#include <Xm/ScrollBar.h>
#include <Xm/TextF.h>
#include <Xm/ScrolledW.h>
#include <Xm/List.h>
#include <Xm/Text.h>
#include <Xm/Scale.h>
#include <DtMail/DtVirtArray.hh>
#include <DtMail/options_util.h>
#define OK 0
#define ERROR -1
Boolean props_changed;
void
options_checkbox_init(
Widget checkbox,
Boolean *dirty_bit
)
{
XtVaSetValues(checkbox, XmNuserData,(XtArgVal)OPTIONS_EDIT , NULL);
XtAddCallback(checkbox, XmNvalueChangedCallback,
options_setting_chgCB, (XtPointer)dirty_bit);
}
int
options_checkbox_set_value(
Widget checkbox,
Boolean b_value,
Boolean set_dirty_bit
)
{
if (!set_dirty_bit)
/* Set state so dirty-bit is not triggered */
XtVaSetValues(checkbox, XmNuserData, (XtArgVal)OPTIONS_LOAD, NULL);
XmToggleButtonSetState(checkbox, b_value, set_dirty_bit? TRUE : FALSE);
if (!set_dirty_bit)
/* Reset state */
XtVaSetValues(checkbox, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
return OK;
}
Boolean
options_checkbox_get_value(Widget checkbox)
{
return((Boolean)XmToggleButtonGetState(checkbox));
}
void
options_radiobox_init(
Widget radiobox,
int num_items,
WidgetList items,
int *item_values,
Boolean *dirty_bit
)
{
int i;
for (i=0; i < num_items; i++)
{
XtVaSetValues(items[i], XmNuserData, (XtArgVal)item_values[i], NULL);
XtAddCallback(items[i], XmNvalueChangedCallback,
options_setting_chgCB, (XtPointer)dirty_bit);
XtAddCallback(items[i], XmNvalueChangedCallback,
options_radiobox_itemCB, (XtPointer) (intptr_t) item_values[i]);
/* Ensure Radiobox has a default Value set */
if (i == 0)
{
XtVaSetValues(items[i], XmNset, True, NULL);
XtVaSetValues(radiobox, XmNuserData, (XtArgVal)item_values[i], NULL);
}
}
}
int
options_radiobox_get_value(
Widget radiobox
)
{
XtArgVal value;
XtVaGetValues(radiobox, XmNuserData, &value, NULL);
return((int)value);
}
int
options_radiobox_set_value(
Widget radiobox,
int value,
Boolean set_dirty_bit
)
{
int num_children = 0;
WidgetList children = NULL;
XtArgVal childval = 0;
Boolean found = FALSE;
int i = 0;
set_dirty_bit = set_dirty_bit;
XtVaGetValues(radiobox,
XtNnumChildren, &num_children,
XtNchildren, &children,
NULL);
for (i = 0; i < num_children; i++)
{
XtVaGetValues(children[i], XmNuserData, &childval, NULL);
XmToggleButtonSetState(children[i], childval == value? TRUE : FALSE, FALSE);
if (childval == value)
{
found = TRUE;
XtVaSetValues(radiobox, XmNuserData, (XtArgVal)value, NULL);
}
}
if (!found)
return ERROR;
return OK;
}
/*
* Callback: choice value has changed...turnon dirty bit
*/
void
options_setting_chgCB(
Widget widget,
XtPointer clientdata,
XtPointer calldata
)
{
Boolean *dirty_bit = (Boolean *)clientdata;
calldata = calldata;
widget = widget;
*dirty_bit = TRUE;
props_changed = TRUE;
}
/*
* Callback: item in exclusive choice has been set...store it's
* value in the parent radiobox
*/
void
options_radiobox_itemCB(
Widget item,
XtPointer clientdata,
XtPointer calldata
)
{
XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct*)calldata;
int value = (int)((long)clientdata);
Widget excl_setting;
if (state->set)
{
excl_setting = XtParent(item);
XtVaSetValues(excl_setting, XmNuserData, (XtArgVal)value, NULL);
}
}
void
options_field_init(
Widget field,
Boolean *dirty_bit)
{
XtAddCallback(field, XmNvalueChangedCallback,
options_field_chgCB, (XtPointer)dirty_bit);
XtVaSetValues(field, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
}
/* NOTE: caller must free memory allocated by XmTextFieldGetString() */
String
options_field_get_value(
Widget field
)
{
String value;
value = XmTextFieldGetString(field);
return value;
}
int
options_field_set_value(
Widget field,
String value,
Boolean set_dirty_bit
)
{
if (!set_dirty_bit)
/* Set state so dirty-bit is not triggered */
XtVaSetValues(field, XmNuserData, (XtArgVal)OPTIONS_LOAD, NULL);
/* Set field value */
XmTextFieldSetString(field, value);
if (!set_dirty_bit)
/* Reset state */
XtVaSetValues(field, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
return OK;
}
void
options_field_chgCB(
Widget widget,
XtPointer clientdata,
XtPointer calldata
)
{
Boolean *dirty_bit = (Boolean *)clientdata;
XtArgVal field_mode;
calldata = calldata;
XtVaGetValues(widget, XmNuserData, &field_mode, NULL);
if (field_mode == OPTIONS_EDIT)
*dirty_bit = TRUE;
props_changed = TRUE;
}
static Boolean
all_digits(char *string) {
while (*string) {
if (!isdigit(*string++))
return(False);
}
return(True);
}
void
options_spinbox_modCB(
Widget widget,
XtPointer clientdata,
XtPointer calldata
)
{
Widget spinbox = (Widget) clientdata;
int mvalue, value;
Display *dpy = XtDisplayOfObject(widget);
char *text = XtMalloc(BUFSIZ);
char *textvalue;
XmTextVerifyCallbackStruct *cbs = (XmTextVerifyCallbackStruct*) calldata;
if (NULL == cbs->text->ptr) return;
if (!all_digits(cbs->text->ptr))
{
cbs->doit = FALSE;
XBell(dpy, 50);
}
textvalue = XmTextGetString(widget);
strncpy(text, textvalue, cbs->startPos);
text[cbs->startPos] = '\0';
strcat(text, cbs->text->ptr);
strcat(text, textvalue+cbs->endPos);
XtVaGetValues(spinbox, XmNmaximumValue, &mvalue, NULL);
value = (int) strtol(text, NULL, 10);
if (value > mvalue)
{
cbs->doit = FALSE;
XBell(dpy, 50);
}
XtFree(text);
XtFree(textvalue);
}
void
options_spinbox_chgCB(
Widget widget,
XtPointer clientdata,
XtPointer calldata
)
{
Widget spinbox = (Widget) clientdata;
int mvalue, value =
(int) strtol(XmTextGetString(widget), NULL, 10);
Display *dpy = XtDisplayOfObject(widget);
calldata = calldata;
props_changed = TRUE;
if (!all_digits(XmTextGetString(widget))){
XtVaSetValues(spinbox, XmNposition, 1, NULL);
XBell(dpy, 50);
return;
}
XtVaGetValues(spinbox, XmNmaximumValue, &mvalue, NULL);
if (value > mvalue) {
XtVaSetValues(spinbox, XmNposition, mvalue, NULL);
XBell(dpy, 50);
return;
}
// It could never be less than the minimum value because a
// '-' is an invalid entry and it would be cleared and reset
// if entered. So if we made it here it is a valid entry. We
// also have to reset the insertion point! Another spinbox bug
// we have to work around.
XtVaSetValues(spinbox, XmNposition, value, NULL);
int shift = 1;
while ((value /= 10) > 0)
shift++;
XmTextSetInsertionPosition(widget, shift);
}
void
options_spinbox_init(
Widget spinbox,
Boolean *dirty_bit
)
{
Widget textfield;
dirty_bit = dirty_bit;
XtVaGetValues(spinbox, XmNtextField, &textfield, NULL);
XtAddCallback(textfield, XmNvalueChangedCallback,
options_spinbox_chgCB, spinbox);
XtAddCallback(textfield, XmNmodifyVerifyCallback,
options_spinbox_modCB, spinbox);
XtVaSetValues(spinbox, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
}
int
options_spinbox_get_value(
Widget spinbox
)
{
int value;
XtVaGetValues(spinbox,
XmNposition, &value,
NULL);
return value;
}
int
options_spinbox_set_value(
Widget spinbox,
int value,
Boolean set_dirty_bit
)
{
if (!set_dirty_bit)
/* Set state so dirty-bit is not triggered */
XtVaSetValues(spinbox, XmNuserData, (XtArgVal)OPTIONS_LOAD, NULL);
/* Set spinbox value */
XtVaSetValues(spinbox, XmNposition, value, NULL);
if (!set_dirty_bit)
/* Reset state */
XtVaSetValues(spinbox, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
return OK;
}
void
options_list_init(Widget list,
DtVirtArray<char *> *item_list
)
{
int num_items;
int i;
XmStringTable str_list;
if(item_list == NULL)
return;
num_items = item_list->length();
if (0 == num_items) return;
str_list = (XmStringTable)XtMalloc(num_items * sizeof(XmString *));
for(i = 0; i < num_items; i++)
str_list[i] = XmStringCreateLocalized((*item_list)[i]);
XtVaSetValues(list,
XmNitemCount, num_items,
XmNitems, str_list,
NULL);
for(i = 0; i < num_items; i++)
XmStringFree(str_list[i]);
XtFree((char *)str_list);
}
void listAddButtonCB(
Widget widget,
XtPointer clientdata,
XtPointer calldata
)
{
ListUiItem *list = (ListUiItem *)clientdata;
calldata = calldata;
widget = widget;
list->handleAddButtonPress();
}
void listDeleteButtonCB(
Widget widget,
XtPointer clientdata,
XtPointer calldata
)
{
ListUiItem *list = (ListUiItem *)clientdata;
calldata = calldata;
widget = widget;
list->handleDeleteButtonPress();
}
void listChangeButtonCB(
Widget widget,
XtPointer clientdata,
XtPointer calldata
)
{
ListUiItem *list = (ListUiItem *)clientdata;
calldata = calldata;
widget = widget;
list->handleChangeButtonPress();
}
void add_cbs_to_list(ListUiItem *list,
Widget add_butt,
Widget del_butt,
Widget chg_butt)
{
XtAddCallback(add_butt,
XmNactivateCallback,
listAddButtonCB,
list);
XtAddCallback(del_butt,
XmNactivateCallback,
listDeleteButtonCB,
list);
XtAddCallback(chg_butt,
XmNactivateCallback,
listChangeButtonCB,
list);
}
int
options_scale_get_value(
Widget scale
)
{
int value;
XtVaGetValues(scale, XmNvalue, &value, NULL);
return value;
}
int
options_scale_set_value(
Widget scale,
char *value,
Boolean set_dirty_bit
)
{
int val_int;
if (!set_dirty_bit)
/* Set state so dirty-bit is not triggered */
XtVaSetValues(scale, XmNuserData, (XtArgVal)OPTIONS_LOAD, NULL);
val_int = (int) strtol(value, NULL, 10);
/* Set scale value */
XtVaSetValues(scale, XmNvalue, val_int, NULL);
if (!set_dirty_bit)
/* Reset state */
XtVaSetValues(scale, XmNuserData, (XtArgVal)OPTIONS_EDIT, NULL);
return OK;
}