summaryrefslogtreecommitdiff
path: root/widgets.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets.c')
-rw-r--r--widgets.c1037
1 files changed, 1037 insertions, 0 deletions
diff --git a/widgets.c b/widgets.c
new file mode 100644
index 0000000..2342e6a
--- /dev/null
+++ b/widgets.c
@@ -0,0 +1,1037 @@
+/*
+ * $Xorg: widgets.c,v 1.4 2001/02/09 02:05:30 xorgcvs Exp $
+ *
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+ */
+
+/*
+ * Code for creating all widgets used by EditRes.
+ */
+
+#include <stdio.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h> /* Get standard string definations. */
+
+#include <X11/Xaw/AsciiText.h>
+#include <X11/Xaw/Box.h>
+#include <X11/Xaw/Cardinals.h>
+#include <X11/Xaw/Label.h>
+#include <X11/Xaw/List.h>
+#include <X11/Xaw/MenuButton.h>
+#include <X11/Xaw/Paned.h>
+#include <X11/Xaw/Panner.h>
+#include <X11/Xaw/Porthole.h>
+#include <X11/Xaw/SmeBSB.h>
+#include <X11/Xaw/SmeLine.h>
+#include <X11/Xaw/SimpleMenu.h>
+#include <X11/Xaw/Toggle.h>
+#include <X11/Xaw/Tree.h>
+#include <X11/Xaw/Viewport.h>
+
+#include "editresP.h"
+
+
+
+/*
+ * functions.
+ */
+
+static void CreateResourceNameForm(), SetToggleGroupLeaders(), CreateLists();
+static void CreateCommandMenu(), CreateTreeCommandMenu(), FreeClientData();
+static void FreeResBox(), CreateValueWidget(), PopupOnNode();
+static Widget CreateTopArea();
+static void MakeBoxLookNice();
+
+extern void GetResourceList(), AnyChosen(), SetResourceString();
+extern void PannerCallback(), PortholeCallback(), DumpTreeToFile();
+extern void Quit(), SendTree(), FlashActiveWidgets();
+extern void TreeSelect(), TreeRelabel(), TreeActivate(), FindWidget();
+extern void ResourceListCallback(), PopdownResBox(), SaveResource();
+extern void GetNamesAndClasses(), ApplyResource(), ActivateResourceWidgets();
+extern void ActivateWidgetsAndSetResourceString(), SetFile();
+
+extern void InitSetValues();
+
+
+
+/* Function Name: RebuildMenusAndLabel
+ * Description: Determins if the user has selected an application
+ * which uses a different toolkit. Xt is the default.
+ * If this is so, destroys and recreates the menus and
+ * information label at the top of the application.
+ * Arguments: toolkit - name of the toolkit.
+ * Returns: none.
+ */
+
+static Widget box = NULL;
+static Widget hPane = NULL;
+
+#define Offset(index) sizeof(String) * index
+
+#define res_entry(index, name, class) \
+ {name, class, XtRString, sizeof(String), \
+ Offset(index), XtRString, (XtPointer)NULL}
+
+static XtResource resources[] = {
+ res_entry(0, "label0", "Label0"),
+ res_entry(1, "label1", "Label1"),
+ res_entry(2, "label2", "Label2"),
+ res_entry(3, "label3", "Label3"),
+ res_entry(4, "label4", "Label4"),
+ res_entry(5, "label5", "Label5"),
+ res_entry(6, "label6", "Label6"),
+ res_entry(7, "label7", "Label7"),
+ res_entry(8, "label8", "Label8"),
+ res_entry(9, "label9", "Label9"),
+ res_entry(11, "label11", "Label11"),
+ res_entry(12, "label12", "Label12"),
+ res_entry(13, "label13", "Label13"),
+ res_entry(14, "label14", "Label14"),
+ res_entry(15, "label15", "Label15"),
+ res_entry(16, "label16", "Label16"),
+ res_entry(17, "label17", "Label17"),
+ res_entry(18, "label18", "Label18"),
+ res_entry(19, "label19", "Label19"),
+ res_entry(20, "label20", "Label20"),
+ res_entry(21, "label21", "Label21"),
+ res_entry(22, "label22", "Label22"),
+ res_entry(23, "label23", "Label23"),
+ res_entry(24, "label24", "Label24"),
+ res_entry(25, "label25", "Label25"),
+ res_entry(26, "label26", "Label26"),
+ res_entry(27, "label27", "Label27"),
+ res_entry(28, "label28", "Label28"),
+ res_entry(29, "label29", "Label29"),
+ res_entry(30, "label30", "Label30"),
+ res_entry(31, "label31", "Label31"),
+ res_entry(32, "label32", "Label32"),
+ res_entry(33, "label33", "Label33"),
+ res_entry(34, "label34", "Label34"),
+ res_entry(35, "label35", "Label35"),
+ res_entry(36, "label36", "Label36")
+};
+
+#undef res_entry
+
+#undef Offset
+
+void
+RebuildMenusAndLabel(toolkit)
+ String toolkit;
+{
+ if (strcmp(global_effective_toolkit, toolkit)) {
+ CreateCommandMenu(box, toolkit);
+ CreateTreeCommandMenu(box, toolkit);
+ XtDestroyWidget(global_screen_data.info_label);
+ global_screen_data.info_label = XtCreateManagedWidget(toolkit,
+ labelWidgetClass,
+ hPane, NULL, ZERO);
+ /* get the new toolkit label application resources for info_label */
+ XtGetApplicationResources(global_screen_data.info_label,
+ res_labels, resources,
+ XtNumber(resources), NULL, 0);
+
+ global_effective_toolkit = toolkit;
+ }
+}
+
+
+
+/* Function Name: BuildWidgetTree
+ * Description: Creates all widgets for Editres.
+ * Arguments: parent - the shell to put them into.
+ * Returns: none.
+ */
+
+void
+BuildWidgetTree(parent)
+Widget parent;
+{
+ Widget paned, porthole, panner;
+
+ paned = XtCreateManagedWidget("paned", panedWidgetClass, parent,
+ NULL, ZERO);
+
+ panner = CreateTopArea(paned);
+
+ porthole = XtCreateManagedWidget("porthole", portholeWidgetClass,
+ paned, NULL, ZERO);
+
+/*
+ * Allow the panner and porthole to talk to each other.
+ */
+
+ XtAddCallback(porthole,
+ XtNreportCallback, PortholeCallback, (XtPointer) panner);
+ XtAddCallback(panner,
+ XtNreportCallback, PannerCallback, (XtPointer) porthole);
+
+ global_tree_parent = porthole;
+}
+
+
+
+
+/* Function Name: CreateTopArea
+ * Description: Creates the top part of the display
+ * Arguments: parent - widget to put this menu bar into.
+ * Returns: none.
+ */
+
+
+static Widget
+CreateTopArea(parent)
+Widget parent;
+{
+ Widget panner;
+
+ box = XtCreateManagedWidget("box", boxWidgetClass, parent, NULL, ZERO);
+
+ CreateCommandMenu(box, "xt");
+ CreateTreeCommandMenu(box, "xt");
+
+ hPane = XtCreateManagedWidget("hPane",panedWidgetClass, parent, NULL,ZERO);
+
+ {
+ panner = XtCreateManagedWidget("panner", pannerWidgetClass,
+ hPane, NULL, ZERO);
+
+ global_screen_data.info_label = XtCreateManagedWidget("xt",
+ labelWidgetClass,
+ hPane, NULL,ZERO);
+
+ /* get the "xt label" application resources for info_label */
+ XtGetApplicationResources(global_screen_data.info_label,
+ res_labels, resources,
+ XtNumber(resources), NULL, 0);
+
+ }
+
+ return(panner);
+}
+
+
+
+/* Function Name: SetEntriesInsensitive
+ * Description: Make menu entries unusable.
+ * Arguments: entries - address of widget array.
+ * num - number of widgets.
+ * sensitive - whether to sensitize or desensitize.
+ * Returns: none.
+ */
+void
+SetEntriesSensitive(entries, num, sensitive)
+Widget *entries;
+int num;
+Boolean sensitive;
+{
+int i; for (i=0; i<num; i++) XtSetSensitive(entries[i], sensitive);
+}
+
+
+
+/* Function Name: CreateCommandMenu
+ * Description: Creates the command menu.
+ * Arguments: parent - widget to put this menu into.
+ * toolkit - name given to the SimpleMenu widget.
+ * Returns: none.
+ */
+
+static Widget cmenu = NULL, cbutton = NULL;
+/* at first most menu entries are insensitive */
+static Boolean CM_set_insensitive = True;
+Widget CM_entries[NUM_CM_ENTRIES];
+
+static void
+CreateCommandMenu(parent, toolkit)
+Widget parent;
+String toolkit;
+{
+ Arg args[1];
+
+ if (cmenu) { XtDestroyWidget(cmenu); CM_set_insensitive = False; }
+ else
+ cbutton = XtCreateManagedWidget("commands", menuButtonWidgetClass,
+ parent, NULL, ZERO);
+
+ /* set the menu name to the toolkit name */
+ XtSetArg(args[0], XtNmenuName, toolkit);
+ XtSetValues(cbutton, args, ONE);
+
+ cmenu = XtCreatePopupShell(toolkit, simpleMenuWidgetClass, cbutton,
+ NULL, ZERO);
+
+ CM_entries[0] = XtCreateManagedWidget("sendTree", smeBSBObjectClass,cmenu,
+ NULL, ZERO);
+ XtAddCallback(CM_entries[0], XtNcallback, SendTree, (XtPointer) TRUE);
+
+ CM_entries[1]=XtCreateManagedWidget("refreshTree",smeBSBObjectClass,cmenu,
+ NULL, ZERO);
+ XtAddCallback(CM_entries[1], XtNcallback, SendTree, (XtPointer) FALSE);
+
+ CM_entries[2] = XtCreateManagedWidget("dumpTreeToFile",
+ smeBSBObjectClass,cmenu,
+ NULL, ZERO);
+ XtAddCallback(CM_entries[2], XtNcallback, DumpTreeToFile, NULL);
+
+ CM_entries[3] = XtCreateManagedWidget("line", smeLineObjectClass, cmenu,
+ NULL, ZERO);
+ CM_entries[4]= XtCreateManagedWidget("getResourceList",
+ smeBSBObjectClass,cmenu,
+ NULL, ZERO);
+ XtAddCallback(CM_entries[4], XtNcallback, GetResourceList, NULL);
+
+ CM_entries[5] = XtCreateManagedWidget("setValues", smeBSBObjectClass,
+ cmenu,
+ NULL, ZERO);
+ XtAddCallback(CM_entries[5], XtNcallback, InitSetValues, NULL);
+
+ CM_entries[6] = XtCreateManagedWidget("line", smeLineObjectClass, cmenu,
+ NULL, ZERO);
+
+ CM_entries[7] = XtCreateManagedWidget("quit", smeBSBObjectClass, cmenu,
+ NULL, ZERO);
+ XtAddCallback(CM_entries[7], XtNcallback, Quit, NULL);
+
+ if (CM_set_insensitive)
+ SetEntriesSensitive(&CM_entries[CM_OFFSET], CM_NUM, False);
+}
+
+
+
+/* Function Name: CreateTreeCommandMenu
+ * Description: Creats the command menu.
+ * Arguments: parent - widget to put this menu into.
+ * Returns: none.
+ */
+
+#define SELECT 0
+#define ACTIVATE 1
+#define LABEL 2
+#define LINE 3
+#define FIND 4
+#define FLASH 5
+
+struct tree_ops_menu {
+ char * name;
+ int type;
+ XtPointer data;
+};
+
+static Widget tmenu = NULL, tbutton = NULL;
+/* at first most menu entries are insensitive */
+static Boolean TM_set_insensitive = True;
+Widget TM_entries[NUM_TM_ENTRIES];
+
+static void
+CreateTreeCommandMenu(parent, toolkit)
+Widget parent;
+String toolkit;
+{
+ int i, number;
+ static struct tree_ops_menu tree_menu[] = {
+ { "showClientWidget", FIND, (XtPointer) NULL },
+ { "selectAll", SELECT, (XtPointer) SelectAll },
+ { "unselectAll", SELECT, (XtPointer) SelectNone },
+ { "invertAll", SELECT, (XtPointer) SelectInvert },
+ { "line", LINE, (XtPointer) NULL },
+ { "selectChildren", SELECT, (XtPointer) SelectChildren },
+ { "selectParent", SELECT, (XtPointer) SelectParent },
+ { "selectDescendants", SELECT, (XtPointer) SelectDescendants },
+ { "selectAncestors", SELECT, (XtPointer) SelectAncestors },
+ { "line", LINE, (XtPointer) NULL },
+ { "showWidgetNames", LABEL, (XtPointer) NameLabel },
+ { "showClassNames", LABEL, (XtPointer) ClassLabel },
+ { "showWidgetIDs", LABEL, (XtPointer) IDLabel},
+ { "showWidgetWindows", LABEL, (XtPointer) WindowLabel },
+ { "line", LINE, (XtPointer) NULL },
+ { "flashActiveWidgets", FLASH, (XtPointer) NULL }
+ };
+ Arg args[1];
+
+ if (tmenu) { XtDestroyWidget(tmenu); TM_set_insensitive = False; }
+ else
+ tbutton = XtCreateManagedWidget("treeCommands", menuButtonWidgetClass,
+ parent, NULL, ZERO);
+
+ XtSetArg(args[0], XtNmenuName, toolkit);
+ XtSetValues(tbutton, args, ONE);
+
+ tmenu = XtCreatePopupShell(toolkit, simpleMenuWidgetClass, tbutton,
+ NULL, ZERO);
+
+ for ( i = 0, number = XtNumber(tree_menu) ; i < number ; i++) {
+ void (*func)();
+ WidgetClass class = smeBSBObjectClass;
+
+ switch (tree_menu[i].type) {
+ case SELECT:
+ func = TreeSelect;
+ break;
+ case LABEL:
+ func = TreeRelabel;
+ break;
+ case LINE:
+ func = NULL;
+ class = smeLineObjectClass;
+ break;
+ case FIND:
+ func = FindWidget;
+ break;
+ case FLASH:
+ func = FlashActiveWidgets;
+ break;
+ default:
+ continue;
+ }
+
+ TM_entries[i] = XtCreateManagedWidget(tree_menu[i].name, class, tmenu,
+ NULL, ZERO);
+ if (func != NULL)
+ XtAddCallback(TM_entries[i], XtNcallback, func,tree_menu[i].data);
+ }
+ if (TM_set_insensitive) SetEntriesSensitive(&TM_entries[TM_OFFSET],
+ TM_NUM, False);
+}
+
+
+
+static Pixmap old_pixmap;
+
+/* Function Name: PrepareToLayoutTree
+ * Description: prepares the Tree widget to be layed out.
+ * Arguments: tree - the Tree widget.
+ * Returns: none
+ */
+
+void
+PrepareToLayoutTree(tree)
+Widget tree;
+{
+ Arg args[1];
+
+ XtSetArg(args[0], XtNbackgroundPixmap, &old_pixmap);
+ XtGetValues(XtParent(tree), args, ONE);
+
+ XtSetArg(args[0], XtNbackgroundPixmap, None);
+ XtSetValues(XtParent(tree), args, ONE);
+
+ XtUnmapWidget(tree);
+}
+
+
+
+/* Function Name: LayoutTree
+ * Description: Laysout the tree widget.
+ * Arguments: tree - the widget tree.
+ * Returns: none.
+ */
+
+void
+LayoutTree(tree)
+Widget tree;
+{
+ Arg args[1];
+
+ XawTreeForceLayout(tree);
+ XtMapWidget(tree);
+
+ XtSetArg(args[0], XtNbackgroundPixmap, old_pixmap);
+ XtSetValues(XtParent(tree), args, ONE);
+}
+
+
+
+/************************************************************
+ *
+ * Functions for creating the Resource Box.
+ *
+ ************************************************************/
+
+/* Function Name: CreateResourceBoxWidgets
+ * Description: Creates the widgets that make up the resource box.
+ * Arguments: node - the widget node.
+ * names - the list of names that make up the normal resources.
+ * cons_names - the list of names that make up
+ * the constraint resources.
+ * Returns: none.
+ */
+
+void
+CreateResourceBoxWidgets(node, names, cons_names)
+WNode * node;
+char **names, **cons_names;
+{
+ Widget pane, box, button;
+ ResourceBoxInfo * res_box;
+
+ res_box = (ResourceBoxInfo *) XtMalloc(sizeof(ResourceBoxInfo));
+ node->resources->res_box = res_box;
+
+ res_box->shell = XtCreatePopupShell(global_effective_toolkit,
+ /*RESOURCE_BOX,*/
+ transientShellWidgetClass,
+ node->widget, NULL, ZERO);
+ XtAddCallback(res_box->shell, XtNdestroyCallback,
+ FreeResBox, (XtPointer) node);
+
+ pane = XtCreateManagedWidget("pane", panedWidgetClass,
+ res_box->shell, NULL, ZERO);
+
+ res_box->res_label = XtCreateManagedWidget("resourceLabel",
+ labelWidgetClass,
+ pane, NULL, ZERO);
+
+ CreateResourceNameForm(pane, node);
+ CreateLists(pane, node, names, cons_names);
+ CreateValueWidget(pane, node);
+
+ XtSetKeyboardFocus(pane, res_box->value_wid); /* send keyboard to value. */
+
+ box = XtCreateManagedWidget("commandBox", boxWidgetClass,
+ pane, NULL, ZERO);
+
+ button = XtCreateManagedWidget("setFile", commandWidgetClass,
+ box, NULL, ZERO);
+ XtAddCallback(button, XtNcallback, SetFile, NULL);
+
+ button = XtCreateManagedWidget("save", commandWidgetClass,
+ box, NULL, ZERO);
+ XtAddCallback(button, XtNcallback, SaveResource,(XtPointer) res_box);
+
+ button = XtCreateManagedWidget("apply", commandWidgetClass,
+ box, NULL, ZERO);
+ XtAddCallback(button, XtNcallback, ApplyResource,(XtPointer) node);
+
+ button = XtCreateManagedWidget("saveAndApply", commandWidgetClass,
+ box, NULL, ZERO);
+ XtAddCallback(button, XtNcallback, SaveResource,(XtPointer) res_box);
+ XtAddCallback(button, XtNcallback, ApplyResource,(XtPointer) node);
+
+ button = XtCreateManagedWidget("cancel", commandWidgetClass,
+ box, NULL, ZERO);
+ XtAddCallback(button,XtNcallback,PopdownResBox,(XtPointer)res_box->shell);
+
+ SetToggleGroupLeaders(node);
+ PopupOnNode(node, res_box->shell);
+}
+
+
+
+/* Function Name: CreateResourceNameForm
+ * Description: Creates the Form widget with children that represent
+ * the full resource name for this object.
+ * Arguments: parent - parent of the form.
+ * node - the node corrosponding to this object.
+ * Returns: none
+ */
+
+static void
+CreateResourceNameForm(parent, node)
+Widget parent;
+WNode * node;
+{
+ ResourceBoxInfo * res_box = node->resources->res_box;
+ AnyInfo *new_info, *old_info;
+ char **names, **classes;
+ Widget form;
+ NameInfo * name_info = NULL;
+ Cardinal num_args;
+ Arg args[10];
+ int i;
+ Widget dot, star, name, class, single, any;
+
+ GetNamesAndClasses(node, &names, &classes);
+
+ form = XtCreateManagedWidget("namesAndClasses", formWidgetClass,
+ parent, NULL, ZERO);
+
+ name = class = any = NULL;
+ i = 0;
+ old_info = NULL;
+ while (TRUE) {
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNfromHoriz, name); num_args++;
+ XtSetArg(args[num_args], XtNradioData, "."); num_args++;
+ dot = XtCreateManagedWidget("dot", toggleWidgetClass,
+ form, args, num_args);
+ XtAddCallback(dot, XtNcallback,
+ ActivateWidgetsAndSetResourceString,(XtPointer) node);
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNfromHoriz, class); num_args++;
+ XtSetArg(args[num_args], XtNfromVert, dot); num_args++;
+ XtSetArg(args[num_args], XtNradioGroup, dot); num_args++;
+ XtSetArg(args[num_args], XtNradioData, "*"); num_args++;
+ star = XtCreateManagedWidget("star", toggleWidgetClass,
+ form, args, num_args);
+ XtAddCallback(star,XtNcallback,
+ ActivateWidgetsAndSetResourceString, (XtPointer) node);
+
+ if (name_info != NULL) {
+ name_info->next = (NameInfo *) XtMalloc(sizeof(NameInfo));
+ name_info = name_info->next;
+ }
+ else
+ res_box->name_info =
+ name_info = (NameInfo *) XtMalloc(sizeof(NameInfo));
+
+ name_info->sep_leader = dot;
+ name_info->name_leader = NULL;
+
+ if (names[i] != NULL) {
+ new_info = (AnyInfo *) XtMalloc(sizeof(AnyInfo));
+ new_info->node = node;
+ new_info->left_dot = dot;
+ new_info->left_star = star;
+ new_info->left_count = 0;
+ if (old_info != NULL)
+ old_info->right_count = &(new_info->left_count);
+ }
+ else if (old_info != NULL)
+ old_info->right_count = NULL;
+
+ if (old_info != NULL) {
+ old_info->right_dot = dot;
+ old_info->right_star = star;
+
+ XtAddCallback(any, XtNcallback, AnyChosen, (XtPointer) old_info);
+ XtAddCallback(any, XtNdestroyCallback,
+ FreeClientData, (XtPointer) old_info);
+ }
+
+ if ( names[i] == NULL) /* no more name and class boxes. */
+ break;
+
+ old_info = new_info;
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNfromHoriz, dot); num_args++;
+ XtSetArg(args[num_args], XtNlabel, names[i]); num_args++;
+ XtSetArg(args[num_args], XtNradioData, names[i]); num_args++;
+ name = XtCreateManagedWidget("name", toggleWidgetClass,
+ form, args, num_args);
+ XtAddCallback(name,XtNcallback,
+ ActivateWidgetsAndSetResourceString,(XtPointer) node);
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNfromHoriz, star); num_args++;
+ XtSetArg(args[num_args], XtNfromVert, name); num_args++;
+ XtSetArg(args[num_args], XtNlabel, classes[i]); num_args++;
+ XtSetArg(args[num_args], XtNradioGroup, name); num_args++;
+ XtSetArg(args[num_args], XtNradioData, classes[i]); num_args++;
+ class = XtCreateManagedWidget("class", toggleWidgetClass,
+ form,args,num_args);
+ XtAddCallback(class, XtNcallback,
+ ActivateWidgetsAndSetResourceString,(XtPointer) node);
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNfromHoriz, star); num_args++;
+ XtSetArg(args[num_args], XtNfromVert, class); num_args++;
+ XtSetArg(args[num_args], XtNradioData, "?"); num_args++;
+ XtSetArg(args[num_args], XtNradioGroup, name); num_args++;
+ single = XtCreateManagedWidget("single", toggleWidgetClass,
+ form, args, num_args);
+ XtAddCallback(single,XtNcallback,
+ ActivateWidgetsAndSetResourceString,(XtPointer) node);
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNfromHoriz, any); num_args++;
+ XtSetArg(args[num_args], XtNfromVert, single); num_args++;
+ XtSetArg(args[num_args], XtNradioGroup, name); num_args++;
+ XtSetArg(args[num_args], XtNradioData, ANY_RADIO_DATA); num_args++;
+ any = XtCreateManagedWidget("any", toggleWidgetClass,
+ form, args, num_args);
+
+ name_info->name_leader = name;
+
+ MakeBoxLookNice(dot, star, any, single, name, class,
+ (i == 0 ? -1 : (names[i + 1] ? 0 : 1)));
+
+ i++;
+ }
+
+ name_info->next = NULL;
+ XtFree((char *)names); /* Free what you allocate... */
+ XtFree((char *)classes);
+}
+
+
+
+/* Function Name: SetToggleGroupLeaders
+ * Description: Sets the leaders of each toggle group.
+ * node - The widget node containing this res box.
+ * Returns: none
+ */
+
+static void
+SetToggleGroupLeaders(node)
+WNode * node;
+{
+ NameInfo *name;
+ ResourceBoxInfo * res_box = node->resources->res_box;
+ static Arg args[] = {
+ {XtNstate, (XtArgVal) TRUE}
+ };
+
+ for (name = res_box->name_info; name != NULL; name = name->next) {
+ XtSetValues(name->sep_leader, args, XtNumber(args));
+ if (name->name_leader != NULL)
+ XtSetValues(name->name_leader, args, XtNumber(args));
+ }
+ SetResourceString(NULL, (XtPointer) node, NULL);
+}
+
+
+
+/* Function Name: MakeBoxLookNice
+ * Description: Resizes the box that contains the resource names
+ * to look a bit nicer.
+ * Arguments: dot, star - the widgets containing the separator types.
+ * any, single, name, class - the widgets that contain the
+ * name and class of this object.
+ * Returns: none.
+ */
+
+static void
+MakeBoxLookNice(dot, star, any, single, name, class, endbox)
+Widget dot, star, any, single, name, class;
+int endbox;
+{
+
+#define MAX_HDIST 3
+
+ Arg args[10];
+ Cardinal num_args;
+ Dimension any_width, name_class_width, dot_star_width;
+ Dimension width_1, width_2;
+ int h_dist[MAX_HDIST];
+ int i;
+
+ /*
+ * Make sure that the dot and star widgets are the same size.
+ */
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNhorizDistance, &(h_dist[0])); num_args++;
+ XtSetArg(args[num_args], XtNwidth, &width_1); num_args++;
+ XtGetValues(dot, args, num_args);
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNhorizDistance, &(h_dist[1])); num_args++;
+ XtSetArg(args[num_args], XtNwidth, &width_2); num_args++;
+ XtGetValues(star, args, num_args);
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNhorizDistance, &(h_dist[2])); num_args++;
+ XtSetArg(args[num_args], XtNwidth, &any_width); num_args++;
+ XtGetValues(any, args, num_args);
+
+ dot_star_width = (width_1 > width_2) ? width_1 : width_2;
+ for (i = 1 ; i < MAX_HDIST; i++) {
+ if (h_dist[i] > h_dist[0]) h_dist[0] = h_dist[i];
+ }
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNhorizDistance, h_dist[0]); num_args++;
+ XtSetValues(any, args, num_args);
+
+ /*
+ * Add a new arg, and continue...
+ */
+ XtSetArg(args[num_args], XtNwidth, dot_star_width); num_args++;
+ XtSetValues(star, args, num_args);
+ XtSetValues(dot, args, num_args);
+
+
+ /*
+ * Now make sure that the Any Widget is as wide as the longest
+ * of the name and class widgets, plus space for the dot and star widgets.
+ * Don't forget the Form widget's internal space.
+ */
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNwidth, &width_1); num_args++;
+ XtSetArg(args[num_args], XtNhorizDistance, &(h_dist[0])); num_args++;
+ XtGetValues(name, args, num_args);
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNwidth, &width_2); num_args++;
+ XtSetArg(args[num_args], XtNhorizDistance, &(h_dist[1])); num_args++;
+ XtGetValues(class, args, num_args);
+
+ if (width_2 > width_1) width_1 = width_2;
+ if (h_dist[1] > h_dist[0]) h_dist[0] = h_dist[1];
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNwidth, &width_2); num_args++;
+ XtSetArg(args[num_args], XtNhorizDistance, &(h_dist[1])); num_args++;
+ XtGetValues(single, args, num_args);
+
+ name_class_width = (width_1 > width_2) ? width_1 : width_2;
+ if (h_dist[1] > h_dist[0]) h_dist[0] = h_dist[1];
+ if (any_width > name_class_width)
+ name_class_width = any_width;
+ any_width = dot_star_width + h_dist[0] + name_class_width;
+ if (endbox < 0)
+ any_width += dot_star_width / 2;
+ else if (endbox > 0)
+ any_width += (dot_star_width - dot_star_width / 2);
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNwidth, any_width); num_args++;
+ XtSetValues(any, args, num_args);
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNwidth, name_class_width); num_args++;
+ XtSetArg(args[num_args], XtNhorizDistance, h_dist[0]); num_args++;
+ XtSetValues(name, args, num_args);
+ XtSetValues(class, args, num_args);
+ XtSetValues(single, args, num_args);
+}
+
+
+
+/* Function Name: CreateLists
+ * Description: Creates the list widgets for the normal and constraint
+ * resources
+ * Arguments: parent - parent of the lists.
+ * node - The widget node containing this res box.
+ * names, cons_names - lists for norm and cons resource boxes.
+ * Returns: none
+ */
+
+static char* noneList[] = {"None"};
+
+static void
+CreateLists(parent, node, names, cons_names)
+Widget parent;
+WNode * node;
+char **names, **cons_names;
+{
+ Cardinal num_args;
+ ResourceBoxInfo * res_box = node->resources->res_box;
+ Arg args[3];
+
+ (void) XtCreateManagedWidget("namesLabel", labelWidgetClass,
+ parent, NULL, ZERO);
+
+ num_args = 0;
+ /* if the first list item is the widget name we want an empty
+ * list.
+ */
+ if (!names) {
+ XtSetArg(args[num_args], XtNlist, noneList); num_args++;
+ XtSetArg(args[num_args], XtNnumberStrings, 1); num_args++;
+ XtSetArg(args[num_args], XtNsensitive, False); num_args++;
+ }
+ else { XtSetArg(args[num_args], XtNlist, names); num_args++; }
+ res_box->norm_list = XtCreateManagedWidget("namesList", listWidgetClass,
+ parent, args, num_args);
+ XtAddCallback(res_box->norm_list, XtNcallback,
+ ResourceListCallback, (XtPointer) node);
+ XtAddCallback(res_box->norm_list, XtNdestroyCallback,
+ FreeClientData, (XtPointer) names);
+
+ if (cons_names != NULL) {
+ (void) XtCreateManagedWidget("constraintLabel", labelWidgetClass,
+ parent, NULL, ZERO);
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNlist, cons_names); num_args++;
+ res_box->cons_list = XtCreateManagedWidget("constraintList",
+ listWidgetClass,
+ parent, args, num_args);
+ XtAddCallback(res_box->cons_list, XtNcallback,
+ ResourceListCallback, (XtPointer) node);
+ XtAddCallback(res_box->cons_list, XtNdestroyCallback,
+ FreeClientData, (XtPointer) cons_names);
+ }
+ else
+ res_box->cons_list = NULL;
+}
+
+/* Function Name: CreateValueWidget
+ * Description: Creates the value widget for entering the resources value.
+ * Arguments: parent - parent of this widget.
+ * res_box - the resource box info.
+ * Returns: none.
+ */
+
+static void
+CreateValueWidget(parent, node)
+Widget parent;
+WNode * node;
+{
+ Widget form, label;
+ Cardinal num_args;
+ Arg args[10];
+ ResourceBoxInfo * res_box = node->resources->res_box;
+
+ form = XtCreateManagedWidget("valueForm", formWidgetClass,
+ parent, NULL, ZERO);
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNleft, XawChainLeft); num_args++;
+ XtSetArg(args[num_args], XtNright, XawChainLeft); num_args++;
+ XtSetArg(args[num_args], XtNtop, XawChainTop); num_args++;
+ XtSetArg(args[num_args], XtNbottom, XawChainBottom); num_args++;
+ label = XtCreateManagedWidget("valueLabel", labelWidgetClass,
+ form, args, num_args);
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNfromHoriz, label); num_args++;
+ XtSetArg(args[num_args], XtNleft, XawChainLeft); num_args++;
+ XtSetArg(args[num_args], XtNright, XawChainRight); num_args++;
+ XtSetArg(args[num_args], XtNtop, XawChainTop); num_args++;
+ XtSetArg(args[num_args], XtNbottom, XawChainBottom); num_args++;
+ res_box->value_wid = XtCreateManagedWidget("valueText",
+ asciiTextWidgetClass,
+ form, args, num_args);
+#ifdef notdef
+ XtAddCallback(XawTextGetSource(res_box->value_wid), XtNcallback,
+ SetResourceString, (XtPointer) node);
+#endif
+}
+
+
+
+/* Function Name: PopupOnNode
+ * Description: Pops a shell widget up centered on the node specified.
+ * Arguments: node - the node.
+ * shell - the shell to popup.
+ * Returns: none.
+ */
+
+extern Atom wm_delete_window;
+
+static void
+PopupOnNode(node, shell)
+WNode * node;
+Widget shell;
+{
+ Arg args[3];
+ Cardinal num_args;
+ Position x, y;
+ Dimension width, height, bw;
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNwidth, &width); num_args++;
+ XtSetArg(args[num_args], XtNheight, &height); num_args++;
+ XtSetArg(args[num_args], XtNborderWidth, &bw); num_args++;
+ XtGetValues(node->widget, args, num_args);
+ XtTranslateCoords(node->widget,
+ (Position) (width/2 + bw), (Position) (height/2 + bw),
+ &x, &y);
+
+ XtOverrideTranslations
+ (shell, XtParseTranslationTable ("<Message>WM_PROTOCOLS: quit()"));
+ XtRealizeWidget(shell);
+ wm_delete_window = XInternAtom(XtDisplay(shell), "WM_DELETE_WINDOW",
+ False);
+ (void) XSetWMProtocols (XtDisplay(shell), XtWindow(shell),
+ &wm_delete_window, 1);
+ XtGetValues(shell, args, num_args); /* use same arg_list. */
+
+ x -= (Position) (width/2 + bw);
+ y -= (Position) (height/2 + bw);
+
+ if (x < 0)
+ x = 0;
+ else {
+ Position max_loc = WidthOfScreen(XtScreen(shell)) -
+ (Position) (width + 2 * bw);
+ if (x > max_loc)
+ x = max_loc;
+ }
+
+ if (y < 0)
+ y = 0;
+ else {
+ Position max_loc = HeightOfScreen(XtScreen(shell)) -
+ (Position) (height + 2 * bw);
+ if (y > max_loc)
+ y = max_loc;
+ }
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNx, x); num_args++;
+ XtSetArg(args[num_args], XtNy, y); num_args++;
+ XtSetValues(shell, args, num_args);
+
+ XtPopup(shell, XtGrabNone);
+}
+
+
+
+/* Function Name: FreeClientData
+ * Description: Frees the client data passed to this function.
+ * Arguments: w - UNUSED.
+ * list_ptr - pointer to the list to check.
+ * junk - UNUSED.
+ * Returns: none
+ */
+
+/* ARGSUSED */
+static void
+FreeClientData(w, ptr, junk)
+Widget w;
+XtPointer ptr, junk;
+{
+ XtFree(ptr);
+}
+
+
+
+/* Function Name: FreeResBox.
+ * Description: Frees resource box allocated memory.
+ * Arguments: w - UNUSED.
+ * ptr - pointer to the node that has this resources box.
+ * junk - UNUSED.
+ * Returns: none
+ */
+
+/* ARGSUSED */
+static void
+FreeResBox(w, ptr, junk)
+Widget w;
+XtPointer ptr, junk;
+{
+ WNode * node = (WNode *) ptr;
+ NameInfo *old_name, *name = node->resources->res_box->name_info;
+
+ global_resource_box_up = FALSE;
+
+ XtFree((XtPointer) node->resources->res_box);
+ node->resources->res_box = NULL;
+
+ while (name != NULL) {
+ old_name = name;
+ name = name->next;
+ XtFree((XtPointer) old_name);
+ }
+}
+
+
+