/* Written by Dan Heller and Paula Ferguson. * Copyright 1994, O'Reilly & Associates, Inc. * Permission to use, copy, and modify this program without * restriction is hereby granted, as long as this copyright * notice appears in each copy of the program source code. * This program is freely distributable without licensing fees and * is provided without guarantee or warrantee expressed or implied. * This program is -not- in the public domain. */ /* select_dlg.c -- display two pushbuttons: days and months. * When the user selections one of them, post a selection * dialog that displays the actual days or months accordingly. * When the user selects or types a selection, post a dialog * the identifies which item was selected and whether or not * the item is in the list. * * This program demonstrates how to use selection boxes, * methods for creating generic callbacks for action area * selections, abstraction of data structures, and a generic * MessageDialog posting routine. */ #include <Xm/SelectioB.h> #include <Xm/RowColumn.h> #include <Xm/MessageB.h> #include <Xm/PushB.h> Widget PostDialog(); char *days[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; char *months[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; typedef struct { char *label; char **strings; int size; } ListItem; ListItem month_items = { "Months", months, XtNumber (months) }; ListItem days_items = { "Days", days, XtNumber (days) }; void DestroyWidget(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { XtDestroyWidget(w); } /* main() --create two pushbuttons whose callbacks pop up a dialog */ main(argc, argv) int argc; char *argv[]; { Widget toplevel, button, rc; XtAppContext app; void pushed(); XtSetLanguageProc (NULL, NULL, NULL); toplevel = XtVaAppInitialize (&app, "Demos", NULL, 0, &argc, argv, NULL, NULL); rc = XtVaCreateWidget ("rowcolumn", xmRowColumnWidgetClass, toplevel, NULL); button = XtVaCreateManagedWidget (month_items.label, xmPushButtonWidgetClass, rc, NULL); XtAddCallback (button, XmNactivateCallback, pushed, &month_items); button = XtVaCreateManagedWidget (days_items.label, xmPushButtonWidgetClass, rc, NULL); XtAddCallback (button, XmNactivateCallback, pushed, &days_items); XtManageChild (rc); XtRealizeWidget (toplevel); XtAppMainLoop (app); } /* pushed() --the callback routine for the main app's pushbutton. * Create a dialog containing the list in the items parameter. */ void pushed(widget, client_data, call_data) Widget widget; XtPointer client_data; XtPointer call_data; { Widget dialog; XmString t, *str; int i; extern void dialog_callback(); ListItem *items = (ListItem *) client_data; str = (XmString *) XtMalloc (items->size * sizeof (XmString)); t = XmStringCreateLocalized (items->label); for (i = 0; i < items->size; i++) str[i] = XmStringCreateLocalized (items->strings[i]); dialog = XmCreateSelectionDialog (widget, "selection", NULL, 0); XtVaSetValues (dialog, XmNlistLabelString, t, XmNlistItems, str, XmNlistItemCount, items->size, XmNmustMatch, True, NULL); XtSetSensitive ( XmSelectionBoxGetChild (dialog, XmDIALOG_HELP_BUTTON), False); XtAddCallback (dialog, XmNokCallback, dialog_callback, NULL); XtAddCallback (dialog, XmNnoMatchCallback, dialog_callback, NULL); XmStringFree (t); while (--i >= 0) XmStringFree (str[i]); /* free elements of array */ XtFree (str); /* now free array pointer */ XtManageChild (dialog); XtPopup (XtParent (dialog), XtGrabNone); } /* dialog_callback() --The OK button was selected or the user * input a name by himself. Determine whether the result is * a valid name by looking at the "reason" field. */ void dialog_callback(widget, client_data, call_data) Widget widget; XtPointer client_data; XtPointer call_data; { char msg[256], *prompt, *value; int dialog_type; XmSelectionBoxCallbackStruct *cbs = (XmSelectionBoxCallbackStruct *) call_data; switch (cbs->reason) { case XmCR_OK: prompt = "Selection: "; dialog_type = XmDIALOG_MESSAGE; break; case XmCR_NO_MATCH: prompt = "Not a valid selection: "; dialog_type = XmDIALOG_ERROR; break; default: prompt = "Unknown selection: "; dialog_type = XmDIALOG_ERROR; break; } XmStringGetLtoR (cbs->value, XmFONTLIST_DEFAULT_TAG, &value); sprintf (msg, "%s%s", prompt, value); XtFree (value); (void) PostDialog (XtParent (XtParent (widget)), dialog_type, msg); if (cbs->reason != XmCR_NO_MATCH) { XtPopdown (XtParent (widget)); XtDestroyWidget (widget); } } /* * PostDialog() -- a generalized routine that allows the programmer * to specify a dialog type (message, information, error, help, * etc..), and the message to show. */ Widget PostDialog(parent, dialog_type, msg) Widget parent; int dialog_type; char *msg; { Widget dialog; XmString text; dialog = XmCreateMessageDialog (parent, "dialog", NULL, 0); text = XmStringCreateLocalized (msg); XtVaSetValues (dialog, XmNdialogType, dialog_type, XmNmessageString, text, NULL); XmStringFree (text); XtUnmanageChild ( XmMessageBoxGetChild (dialog, XmDIALOG_CANCEL_BUTTON)); XtSetSensitive ( XmMessageBoxGetChild (dialog, XmDIALOG_HELP_BUTTON), False); /*XtAddCallback (dialog, XmNokCallback, XtDestroyWidget, NULL);*/ XtAddCallback (dialog, XmNokCallback, DestroyWidget, NULL); XtManageChild (dialog); return dialog; }