/* * $XConsortium: bbox.c,v 2.35 91/07/10 19:34:59 converse Exp $ * * * COPYRIGHT 1987, 1989 * DIGITAL EQUIPMENT CORPORATION * MAYNARD, MASSACHUSETTS * ALL RIGHTS RESERVED. * * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR * ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. * * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN * ADDITION TO THAT SET FORTH ABOVE. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Digital Equipment Corporation not be * used in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. */ /* bbox.c -- management of buttons and buttonboxes. * * This module implements a simple interface to buttonboxes, allowing a client * to create new buttonboxes and manage their contents. */ #include "xmh.h" #include "bboxint.h" static XtTranslations RadioButtonTranslations = NULL; void BBoxInit() { RadioButtonTranslations = XtParseTranslationTable(",:set()\n"); } /* * Create a new button box. The widget for it will be a child of the given * scrn's widget, and it will be added to the scrn's pane. */ ButtonBox BBoxCreate(scrn, name) Scrn scrn; char *name; /* name of the buttonbox widgets */ { Cardinal n; ButtonBox buttonbox = XtNew(ButtonBoxRec); Arg args[5]; n = 0; XtSetArg(args[n], XtNallowVert, True); n++; XtSetArg(args[n], XtNskipAdjust, True); n++; buttonbox->outer = XtCreateManagedWidget(name, viewportWidgetClass, scrn->widget, args, n); buttonbox->inner = XtCreateManagedWidget(name, boxWidgetClass, buttonbox->outer, args, (Cardinal) 0); buttonbox->numbuttons = 0; buttonbox->button = (Button *) NULL; buttonbox->scrn = scrn; return buttonbox; } ButtonBox RadioBBoxCreate(scrn, name) Scrn scrn; char *name; /* name of the buttonbox widgets */ { return BBoxCreate(scrn, name); } /* Create a new button, and add it to a buttonbox. */ static void bboxAddButton(buttonbox, name, kind, enabled, radio) ButtonBox buttonbox; char *name; WidgetClass kind; Boolean enabled; Boolean radio; { Button button; Cardinal i; Widget radio_group; Arg args[5]; buttonbox->numbuttons++; buttonbox->button = (Button *) XtRealloc((char *) buttonbox->button, (unsigned) buttonbox->numbuttons * sizeof(Button)); button = buttonbox->button[buttonbox->numbuttons - 1] = XtNew(ButtonRec); button->buttonbox = buttonbox; button->name = XtNewString(name); button->menu = (Widget) NULL; i = 0; if (!enabled) { XtSetArg(args[i], XtNsensitive, False); i++; } if (radio && kind == toggleWidgetClass) { if (buttonbox->numbuttons > 1) radio_group = (button == buttonbox->button[0]) ? (buttonbox->button[1]->widget) : (buttonbox->button[0]->widget); else radio_group = NULL; XtSetArg(args[i], XtNradioGroup, radio_group); i++; XtSetArg(args[i], XtNradioData, button->name); i++; } /* Prevent the folder buttons from picking up labels from resources */ if (buttonbox == buttonbox->scrn->folderbuttons) { XtSetArg(args[i], XtNlabel, button->name); i++; } button->widget = XtCreateManagedWidget(name, kind, buttonbox->inner, args, i); if (radio) XtOverrideTranslations(button->widget, RadioButtonTranslations); } void BBoxAddButton(buttonbox, name, kind, enabled) ButtonBox buttonbox; char *name; WidgetClass kind; Boolean enabled; { bboxAddButton(buttonbox, name, kind, enabled, False); } void RadioBBoxAddButton(buttonbox, name, enabled) ButtonBox buttonbox; char *name; Boolean enabled; { bboxAddButton(buttonbox, name, toggleWidgetClass, enabled, True); } /* Set the current button in a radio buttonbox. */ void RadioBBoxSet(button) Button button; { XawToggleSetCurrent(button->widget, button->name); } /* Get the name of the current button in a radio buttonbox. */ char *RadioBBoxGetCurrent(buttonbox) ButtonBox buttonbox; { return ((char *) XawToggleGetCurrent(buttonbox->button[0]->widget)); } /* Remove the given button from its buttonbox, and free all resources * used in association with the button. If the button was the current * button in a radio buttonbox, the current button becomes the first * button in the box. */ void BBoxDeleteButton(button) Button button; { ButtonBox buttonbox; int i, found; if (button == NULL) return; buttonbox = button->buttonbox; found = False; for (i=0 ; inumbuttons; i++) { if (found) buttonbox->button[i-1] = buttonbox->button[i]; else if (buttonbox->button[i] == button) { found = True; /* Free the resources used by the given button. */ if (button->menu != NULL && button->menu != NoMenuForButton) XtDestroyWidget(button->menu); XtDestroyWidget(button->widget); XtFree(button->name); XtFree((char *) button); } } if (found) buttonbox->numbuttons--; } void RadioBBoxDeleteButton(button) Button button; { ButtonBox buttonbox; Boolean reradio = False; char * current; if (button == NULL) return; buttonbox = button->buttonbox; current = RadioBBoxGetCurrent(buttonbox); if (current) reradio = ! strcmp(current, button->name); BBoxDeleteButton(button); if (reradio && BBoxNumButtons(buttonbox)) RadioBBoxSet(buttonbox->button[0]); } /* Enable or disable the given button widget. */ static void SendEnableMsg(widget, value) Widget widget; int value; /* TRUE for enable, FALSE for disable. */ { static Arg arglist[] = {XtNsensitive, (XtArgVal)False}; arglist[0].value = (XtArgVal) value; XtSetValues(widget, arglist, XtNumber(arglist)); } /* Enable the given button (if it's not already). */ void BBoxEnable(button) Button button; { SendEnableMsg(button->widget, True); } /* Disable the given button (if it's not already). */ void BBoxDisable(button) Button button; { SendEnableMsg(button->widget, False); } /* Given a buttonbox and a button name, find the button in the box with that name. */ Button BBoxFindButtonNamed(buttonbox, name) ButtonBox buttonbox; char *name; { register int i; for (i=0 ; inumbuttons; i++) if (strcmp(name, buttonbox->button[i]->name) == 0) return buttonbox->button[i]; return (Button) NULL; } /* Given a buttonbox and a widget, find the button which is that widget. */ Button BBoxFindButton(buttonbox, w) ButtonBox buttonbox; Widget w; { register int i; for (i=0; i < buttonbox->numbuttons; i++) if (buttonbox->button[i]->widget == w) return buttonbox->button[i]; return (Button) NULL; } /* Return the nth button in the given buttonbox. */ Button BBoxButtonNumber(buttonbox, n) ButtonBox buttonbox; int n; { return buttonbox->button[n]; } /* Return how many buttons are in a buttonbox. */ int BBoxNumButtons(buttonbox) ButtonBox buttonbox; { return buttonbox->numbuttons; } /* Given a button, return its name. */ char *BBoxNameOfButton(button) Button button; { return button->name; } /* Given a button, return its menu. */ Widget BBoxMenuOfButton(button) Button button; { return button->menu; } /* Set maximum size for a bbox so that it cannot be resized any taller * than the space needed to stack all the buttons on top of each other. * Allow the user to set the minimum size. */ void BBoxLockSize(buttonbox) ButtonBox buttonbox; { Dimension maxheight; Arg args[1]; if (buttonbox == NULL) return; maxheight = (Dimension) GetHeight(buttonbox->inner); XtSetArg(args[0], XtNmax, maxheight); /* for Paned widget */ XtSetValues(buttonbox->outer, args, (Cardinal) 1); } Boolean BBoxIsGrandparent(buttonbox, widget) ButtonBox buttonbox; Widget widget; { return (XtParent(XtParent(widget)) == buttonbox->inner); } void BBoxMailFlag(buttonbox, name, up) ButtonBox buttonbox; char* name; int up; { Arg args[1]; Pixel flag; Button button = BBoxFindButtonNamed(buttonbox, name); if (button) { /* avoid unnecessary exposures */ XtSetArg(args[0], XtNleftBitmap, &flag); XtGetValues(button->widget, args, (Cardinal)1); if (up && flag != app_resources.flag_up) { XtSetArg(args[0], XtNleftBitmap, app_resources.flag_up); XtSetValues(button->widget, args, (Cardinal)1); } else if (!up && flag != app_resources.flag_down) { XtSetArg(args[0], XtNleftBitmap, app_resources.flag_down); XtSetValues(button->widget, args, (Cardinal)1); } } }