/* * Motif * * Copyright (c) 1987-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 librararies and programs; if not, write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301 USA */ /* * HISTORY */ #ifdef REV_INFO #ifndef lint static char rcsid[] = "$XConsortium: Simple.c /main/11 1995/09/19 23:08:54 cde-sun $" #endif #endif /* * (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include "XmI.h" /******** Static Function Declarations ********/ static void EvaluateConvenienceStructure( Widget wid, XmSimpleMenu sm) ; /******** End Static Function Declarations ********/ static XtResource SimpleMenuResources[] = { { XmNbuttonCount, XmCButtonCount, XmRInt, sizeof(int), XtOffsetOf( struct _XmSimpleMenuRec, count), XmRImmediate, (XtPointer) 0 }, { XmNpostFromButton, XmCPostFromButton, XmRInt, sizeof(int), XtOffsetOf( struct _XmSimpleMenuRec, post_from_button), XmRImmediate, (XtPointer) -1 }, { XmNsimpleCallback, XmCCallback, XmRCallbackProc, sizeof(XtCallbackProc), XtOffsetOf( struct _XmSimpleMenuRec, callback), XmRImmediate, (XtPointer) NULL }, { XmNbuttons, XmCButtons, XmRXmStringTable, sizeof(XmStringTable), XtOffsetOf( struct _XmSimpleMenuRec, label_string), XmRImmediate, (XtPointer) NULL }, { XmNbuttonAccelerators, XmCButtonAccelerators, XmRStringTable, sizeof(String *), XtOffsetOf( struct _XmSimpleMenuRec, accelerator), XmRImmediate, (XtPointer) NULL }, { XmNbuttonAcceleratorText, XmCButtonAcceleratorText, XmRXmStringTable, sizeof(XmStringTable), XtOffsetOf( struct _XmSimpleMenuRec, accelerator_text), XmRImmediate, (XtPointer) NULL }, { XmNbuttonMnemonics, XmCButtonMnemonics, XmRKeySymTable, sizeof(XmKeySymTable), XtOffsetOf( struct _XmSimpleMenuRec, mnemonic), XmRImmediate, (XtPointer) NULL }, { XmNbuttonMnemonicCharSets, XmCButtonMnemonicCharSets, XmRCharSetTable, sizeof(XmStringCharSetTable), XtOffsetOf( struct _XmSimpleMenuRec, mnemonic_charset), XmRImmediate, (XtPointer) NULL }, { XmNbuttonType, XmCButtonType, XmRButtonType, sizeof(XmButtonTypeTable), XtOffsetOf( struct _XmSimpleMenuRec, button_type), XmRImmediate, (XtPointer) NULL }, { XmNbuttonSet, XmCButtonSet, XmRInt, sizeof(int), XtOffsetOf( struct _XmSimpleMenuRec, button_set), XmRImmediate, (XtPointer) -1 }, { XmNoptionLabel, XmCOptionLabel, XmRXmString, sizeof(XmString), XtOffsetOf( struct _XmSimpleMenuRec, option_label), XmRImmediate, (XtPointer) NULL }, { XmNoptionMnemonic, XmCOptionMnemonic, XmRKeySym, sizeof (KeySym), XtOffsetOf( struct _XmSimpleMenuRec, option_mnemonic), XmRImmediate, (XtPointer) NULL }, }; static void EvaluateConvenienceStructure( Widget wid, XmSimpleMenu sm ) { XmRowColumnWidget rc = (XmRowColumnWidget) wid ; int i, n; char name_buf[20]; int button_count = 0; int separator_count = 0; int label_count = 0; Arg args[6]; Widget child; XmButtonType btype; for (i = 0; i < sm->count; i++) { n = 0; if (sm->label_string && sm->label_string[i]) { XtSetArg(args[n], XmNlabelString, sm->label_string[i]); n++; } if (sm->accelerator && sm->accelerator[i]) { XtSetArg(args[n], XmNaccelerator, sm->accelerator[i]); n++; } if (sm->accelerator_text && sm->accelerator_text[i]) { XtSetArg(args[n], XmNacceleratorText, sm->accelerator_text[i]); n++; } if (sm->mnemonic && sm->mnemonic[i]) { XtSetArg(args[n], XmNmnemonic, sm->mnemonic[i]); n++; } if (sm->mnemonic_charset && sm->mnemonic_charset[i]) { XtSetArg(args[n], XmNmnemonicCharSet, sm->mnemonic_charset[i]); n++; } /* Dynamic Defaulting of button type */ if (sm->button_type && sm->button_type[i]) btype = sm->button_type[i]; else btype = XmNONE; if (btype == XmNONE) { if (rc->row_column.type == XmMENU_BAR) btype = XmCASCADEBUTTON; else btype = XmPUSHBUTTON; } switch (btype) { case XmTITLE: sprintf(name_buf,"label_%d", label_count++); child = XtCreateManagedWidget( name_buf, xmLabelGadgetClass, (Widget) rc, args, n); break; case XmDOUBLE_SEPARATOR: XtSetArg(args[n], XmNseparatorType, XmDOUBLE_LINE); n++; case XmSEPARATOR: sprintf(name_buf,"separator_%d", separator_count++); child = XtCreateManagedWidget(name_buf, xmSeparatorGadgetClass, (Widget) rc, args, n); break; case XmPUSHBUTTON: sprintf(name_buf,"button_%d", button_count++); child = XtCreateManagedWidget(name_buf, xmPushButtonGadgetClass, (Widget) rc, args, n); if (sm->callback) XtAddCallback(child, XmNactivateCallback, sm->callback, (XtPointer)(unsigned long)(button_count - 1)); break; case XmRADIOBUTTON: XtSetArg(args[n], XmNindicatorType, XmONE_OF_MANY); n++; case XmCHECKBUTTON: sprintf(name_buf,"button_%d", button_count++); XtSetArg(args[n], XmNindicatorOn, TRUE); n++; child = XtCreateManagedWidget(name_buf, xmToggleButtonGadgetClass, (Widget) rc, args, n); if (sm->callback) XtAddCallback(child, XmNvalueChangedCallback, sm->callback, (XtPointer)(unsigned long)(button_count - 1)); break; case XmCASCADEBUTTON: sprintf(name_buf,"button_%d", button_count++); child = XtCreateManagedWidget(name_buf, xmCascadeButtonGadgetClass, (Widget) rc, args, n); if (sm->callback) XtAddCallback(child, XmNactivateCallback, sm->callback, (XtPointer)(unsigned long)(button_count - 1)); break; default: /* this is an error condition */ ; break; } } } Widget XmCreateSimpleMenuBar( Widget parent, String name, ArgList args, Cardinal arg_count ) { Widget rc; XmSimpleMenuRec mr; _XmWidgetToAppContext(parent); _XmAppLock(app); XtGetSubresources(parent, &mr, name, XmCSimpleMenuBar, SimpleMenuResources, XtNumber(SimpleMenuResources), args, arg_count); rc = XmCreateMenuBar(parent, name, args, arg_count); EvaluateConvenienceStructure( rc, &mr); _XmAppUnlock(app); return(rc); } Widget XmCreateSimplePopupMenu( Widget parent, String name, ArgList args, Cardinal arg_count ) { Widget rc; XmSimpleMenuRec mr; _XmWidgetToAppContext(parent); _XmAppLock(app); XtGetSubresources(parent, &mr, name, XmCSimplePopupMenu, SimpleMenuResources, XtNumber(SimpleMenuResources), args, arg_count); rc = XmCreatePopupMenu(parent, name, args, arg_count); EvaluateConvenienceStructure( rc, &mr); _XmAppUnlock(app); return(rc); } Widget XmCreateSimplePulldownMenu( Widget parent, String name, ArgList args, Cardinal arg_count ) { Widget rc; XmSimpleMenuRec mr; int n, i; Arg local_args[3]; WidgetList buttons; Cardinal num_buttons; _XmWidgetToAppContext(parent); _XmAppLock(app); XtGetSubresources(parent, &mr, name, XmCSimplePulldownMenu, SimpleMenuResources, XtNumber(SimpleMenuResources), args, arg_count); rc = XmCreatePulldownMenu(parent, name, args, arg_count); EvaluateConvenienceStructure(rc, &mr); if (mr.post_from_button >= 0) { n = 0; XtSetArg(local_args[n], XtNchildren, &buttons); n++; XtSetArg(local_args[n], XtNnumChildren, &num_buttons); n++; XtGetValues(parent, local_args, n); if (!num_buttons) { /* error condition */ _XmAppUnlock(app); return(rc); } else { for (i = 0; i < num_buttons; i++) { if (((XmIsCascadeButtonGadget(buttons[i])) || (XmIsCascadeButton(buttons[i]))) && (i == mr.post_from_button)) break; } if ( i < num_buttons) { n = 0; XtSetArg(local_args[n], XmNsubMenuId, rc); n++; XtSetValues(buttons[i], local_args, n); } } } _XmAppUnlock(app); return(rc); } Widget XmCreateSimpleOptionMenu( Widget parent, String name, ArgList args, Cardinal arg_count ) { Widget rc, sub_rc; XmSimpleMenuRec mr; int n, i, button_count; Arg local_args[5]; WidgetList buttons; Cardinal num_buttons; _XmWidgetToAppContext(parent); _XmAppLock(app); XtGetSubresources(parent, &mr, name, XmCSimpleOptionMenu, SimpleMenuResources, XtNumber(SimpleMenuResources), args, arg_count); rc = XmCreateOptionMenu(parent, name, args, arg_count); sub_rc = XmCreatePulldownMenu(parent, name, args, arg_count); EvaluateConvenienceStructure(sub_rc, &mr); n = 0; if (mr.option_label) { XtSetArg(local_args[n], XmNlabelString, mr.option_label); n++; } if (mr.option_mnemonic) { XtSetArg(local_args[n], XmNmnemonic, mr.option_mnemonic); n++; } XtSetArg(local_args[n], XmNsubMenuId, sub_rc); n++; XtSetValues(rc, local_args, n); if (mr.button_set >= 0) { n = 0; XtSetArg(local_args[n], XtNchildren, &buttons); n++; XtSetArg(local_args[n], XtNnumChildren, &num_buttons); n++; XtGetValues(sub_rc, local_args, n); if (!num_buttons) { /* error condition */ _XmAppUnlock(app); return(rc); } else { button_count = 0; for (i = 0; i < num_buttons; i++) { /* count only PushB */ if ((XmIsPushButtonGadget(buttons[i])) || (XmIsPushButton(buttons[i]))) { if (button_count == mr.button_set) break; button_count++; } } if ( i < num_buttons) { n = 0; XtSetArg(local_args[n], XmNmenuHistory, buttons[i]); n++; XtSetValues(rc, local_args, n); } } } _XmAppUnlock(app); return(rc); } Widget XmCreateSimpleRadioBox( Widget parent, String name, ArgList args, Cardinal arg_count ) { Arg local_args[5]; Widget rc, child; int i, n; XmSimpleMenuRec mr; char name_buf[20]; rc = XmCreateRadioBox(parent, name, args, arg_count); XtGetSubresources(parent, &mr, name, XmCSimpleRadioBox, SimpleMenuResources, XtNumber(SimpleMenuResources), args, arg_count); for(i=0; i < mr.count; i++) { sprintf(name_buf,"button_%d", i); n = 0; if (mr.label_string && mr.label_string[i]) { XtSetArg(local_args[n], XmNlabelString, mr.label_string[i]); n++; } if (mr.button_set == i) { XtSetArg(local_args[n], XmNset, TRUE); n++; } child = XtCreateManagedWidget(name_buf, xmToggleButtonGadgetClass, (Widget) rc, local_args, n); if (mr.callback) XtAddCallback(child, XmNvalueChangedCallback, mr.callback, (XtPointer)(unsigned long)i); } return(rc); } Widget XmCreateSimpleCheckBox( Widget parent, String name, ArgList args, Cardinal arg_count ) { Arg local_args[5]; Widget rc, child; int i, n; XmSimpleMenuRec mr; char name_buf[20]; rc = XmCreateRadioBox(parent, name, args, arg_count); n = 0; XtSetArg(local_args[n], XmNradioBehavior, FALSE); n++; XtSetValues(rc, local_args, n); XtGetSubresources(parent, &mr, name, XmCSimpleCheckBox, SimpleMenuResources, XtNumber(SimpleMenuResources), args, arg_count); for(i=0; i < mr.count; i++) { sprintf(name_buf,"button_%d", i); n = 0; if (mr.label_string && mr.label_string[i]) { XtSetArg(local_args[n], XmNlabelString, mr.label_string[i]); n++; } child = XtCreateManagedWidget(name_buf, xmToggleButtonGadgetClass, (Widget) rc, local_args, n); if (mr.callback) XtAddCallback(child, XmNvalueChangedCallback, mr.callback, (XtPointer)(unsigned long)i); } return(rc); }