actions.c revision 38d718bd
1/*
2 *
3Copyright 1989, 1998  The Open Group
4
5Permission to use, copy, modify, distribute, and sell this software and its
6documentation for any purpose is hereby granted without fee, provided that
7the above copyright notice appear in all copies and that both that
8copyright notice and this permission notice appear in supporting
9documentation.
10
11The above copyright notice and this permission notice shall be included in
12all copies or substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
21Except as contained in this notice, the name of The Open Group shall not be
22used in advertising or otherwise to promote the sale, use or other dealings
23in this Software without prior written authorization from The Open Group.
24 */
25
26#ifdef HAVE_CONFIG_H
27# include "config.h"
28#endif
29
30#include <stdio.h>
31#include <stdlib.h>
32#include <X11/Intrinsic.h>
33#include <X11/Xutil.h>
34
35#include <X11/Xaw/Cardinals.h>
36#include <X11/Xmu/CharSet.h>
37
38#include "editresP.h"
39
40/*
41 * Private data.
42 */
43
44//struct ActionValues {
45//    String name;
46//    int type;
47//};
48
49struct ActionValues {
50	const char * name;
51        int  type;
52};
53
54
55static struct ActionValues select_values[] = {
56    { "widget", (int) SelectWidget },
57    { "all", (int) SelectAll },
58    { "nothing", (int) SelectNone },
59    { "invert", (int) SelectInvert },
60    { "children", (int) SelectChildren },
61    { "descendants", (int) SelectDescendants },
62    { "parent", (int) SelectParent },
63    { "ancestors", (int) SelectAncestors }
64};
65
66static struct  ActionValues label_values[] = {
67    { "name", (int) NameLabel },
68    { "class", (int) ClassLabel },
69    { "id", (int) IDLabel },
70    { "window", (int) WindowLabel },
71    { "toggle", (int) ToggleLabel }
72};
73
74static void EnableGetVal ( Widget w, XEvent *event,
75			   String *params, Cardinal * num_params );
76static void SelectAction ( Widget w, XEvent *event,
77			   String *params, Cardinal *num_params );
78static void RelabelAction ( Widget w, XEvent *event,
79			    String *params, Cardinal *num_params );
80static void PopdownFileDialogAction ( Widget w, XEvent *event,
81				      String *params, Cardinal *num_params );
82static void ActionQuit ( Widget w, XEvent *event,
83			 String *params, Cardinal *num_params );
84static WNode * FindTreeNodeFromWidget ( Widget w );
85static Boolean CheckAndFindEntry (  const char *action_name,
86				   String * params, Cardinal num_params,
87				   struct ActionValues * table,
88				   Cardinal num_table, int * type );
89
90/*	Function Name: EnableGetVal
91 *	Description: sets a global variable to notify the Notify action
92 *                   for the resource list widet to do GetValues.
93 *      Arguments: w - any widget in the widget tree.
94 *                 event - NOT USED.
95 *                 params, num_params - the parameters paseed to the action
96 *                                      routine.
97 *
98 */
99
100Boolean do_get_values = False;
101
102/* ARGSUSED */
103static void
104EnableGetVal(Widget w, XEvent *event, String *params, Cardinal *num_params)
105{
106  do_get_values = True;
107}
108
109/*	Function Name: SelectAction
110 *	Description:
111 *      Arguments: w - any widget in the widget tree.
112 *                 event - NOT USED.
113 *                 params, num_params - the parameters paseed to the action
114 *                                      routine.
115 *
116 * params[0] - One of "nothing", "parent", "children", "ancestors",
117 *                    "descendants", "invert", "all"
118 * num_params - must be one.
119 */
120
121/* ARGSUSED */
122static void
123SelectAction(Widget w, XEvent *event, String *params, Cardinal *num_params)
124{
125    WNode * node;
126    int type;
127
128    if (!CheckAndFindEntry("Select", params, *num_params,
129			   select_values, XtNumber(select_values), &type))
130	return;
131
132    switch(type) {
133    case SelectAll:
134    case SelectNone:
135    case SelectInvert:
136	_TreeSelect(global_tree_info, (SelectTypes)type);
137	break;
138    case SelectWidget:
139	_FindWidget(XtParent(w));
140	break;
141    default:
142	node = FindTreeNodeFromWidget(w);
143	if (node)
144	    _TreeActivateNode(node, (SelectTypes)type);
145	else
146	    _TreeSelect(global_tree_info, (SelectTypes)type);
147	break;
148    }
149}
150
151/*	Function Name: RelabelAction
152 *	Description:
153 *      Arguments: w - any widget in the widget tree.
154 *                 event - NOT USED.
155 *                 params, num_params - the parameters paseed to the action
156 *                                      routine.
157 *
158 * params[0] - One of "name", "class", "id"
159 * num_params - must be one.
160 */
161
162/* ARGSUSED */
163static void
164RelabelAction(Widget w, XEvent *event, String *params, Cardinal *num_params)
165{
166    WNode * node;
167    int type;
168
169    if (!CheckAndFindEntry("Relabel", params, *num_params,
170			   label_values, XtNumber(label_values), &type))
171	return;
172
173    if ((node = FindTreeNodeFromWidget(w)) == NULL)
174	_TreeRelabel(global_tree_info, (LabelTypes)type);
175    else {
176	PrepareToLayoutTree(global_tree_info->tree_widget);
177	_TreeRelabelNode(node, (LabelTypes)type, FALSE);
178	LayoutTree(global_tree_info->tree_widget);
179    }
180}
181
182/*	Function Name: PopdownFileDialogAction
183 *	Description: Pops down the file dialog widget.
184 *                   and calls the approipriate handler.
185 *	Arguments: w - any child of the dialog widget.
186 *                 event - the event that caused this action.
187 *                 params, num_params - params passed to the action routine.
188 * RETURNED        none.
189 */
190
191/* ARGSUSED */
192
193static void
194PopdownFileDialogAction(Widget w, XEvent *event,
195			String *params, Cardinal *num_params)
196{
197    char buf[BUFSIZ];
198    Boolean val;
199
200    if (*num_params != 1) {
201	snprintf(buf, sizeof(buf), res_labels[2], "PopdownFileDialog");
202
203	SetMessage(global_screen_data.info_label, buf);
204	return;
205    }
206
207    XmuCopyISOLatin1Lowered(buf, params[0]);
208
209    if (streq(buf, "cancel"))
210	val = FALSE;
211    else if (streq(buf, "okay"))
212	val = TRUE;
213    else {
214	snprintf(buf, sizeof(buf), res_labels[1], "PopdownFileDialog");
215
216	SetMessage(global_screen_data.info_label, buf);
217	return;
218    }
219
220    _PopdownFileDialog(w, (XtPointer)(long) val, NULL);
221}
222
223/*	Function Name: ActionQuit
224 *	Description: This function prints a message to stdout.
225 *	Arguments: w - ** UNUSED **
226 *                 call_data - ** UNUSED **
227 *                 client_data - ** UNUSED **
228 *	Returns: none
229 */
230
231/* ARGSUSED */
232static void
233ActionQuit(Widget w, XEvent *event, String *params, Cardinal *num_params)
234{
235  if (w==global_toplevel) {
236    XtDestroyApplicationContext(XtWidgetToApplicationContext(w));
237    exit(0);
238  }
239  else  {
240    if (streq(XtName(w), RESOURCE_BOX))
241      global_resource_box_up = FALSE;
242    XtPopdown(w);
243    XtDestroyWidget(w);
244  }
245}
246
247/*	Function Name: SetApplicationActions
248 *	Description: Sets my application actions.
249 *	Arguments: app_con - the application context.
250 *	Returns: none.
251 */
252
253static XtActionsRec actions[] = {
254  {(String)"EnableGetVal",      EnableGetVal},
255  {(String)"Select",            SelectAction},
256  {(String)"SVActiveEntry",     ModifySVEntry},
257  {(String)"Relabel",      	RelabelAction},
258  {(String)"PopdownFileDialog", PopdownFileDialogAction},
259  {(String)"quit",              ActionQuit}
260};
261
262void
263SetApplicationActions(XtAppContext app_con)
264{
265    XtAppAddActions(app_con, actions, XtNumber(actions));
266
267}
268
269
270/************************************************************
271 *
272 * Private functions
273 *
274 ************************************************************/
275
276/*	Function Name: CheckAndFindEntry
277 *	Description: Checks the args to make sure they are valid,
278 *                   then parses the arg list to find the correct action
279 *                   to take.
280 *	Arguments: action_name - name of the action (for error messages).
281 *                 params, num_params - params passed to the action routine.
282 *                 table, num_table - table to check the parameters against.
283 * RETURNED        type - info about the action to take.
284 *	Returns: TRUE if the arguments are okay.
285 */
286
287static Boolean
288CheckAndFindEntry(const char *action_name, String *params, Cardinal num_params,
289		  struct ActionValues *table, Cardinal num_table, int *type)
290{
291    char buf[BUFSIZ];
292    Cardinal i;
293
294    if (num_params != 1) {
295	snprintf(buf, sizeof(buf), res_labels[2], action_name);
296	SetMessage(global_screen_data.info_label, buf);
297	return(FALSE);
298    }
299
300    XmuCopyISOLatin1Lowered(buf, params[0]);
301    for ( i = 0 ; i < num_table; i++ )
302	if (streq(buf, table[i].name)) {
303	    *type = table[i].type;
304	    return(TRUE);
305	}
306
307    snprintf(buf, sizeof(buf), res_labels[3], action_name);
308
309    for (i = 0; i < num_table; ) {
310	strcat(buf, table[i++].name);
311
312	if (i == (num_table - 1))
313	    strcat(buf, ", or ");
314	else if (i < num_table)
315	    strcat(buf, ", ");
316    }
317
318    SetMessage(global_screen_data.info_label, buf);
319    return(FALSE);
320}
321
322/*	Function Name: FindTreeNodeFromWidget
323 *	Description: finds the tree node associated with a widget.
324 *	Arguments: w - widget to check.
325 *	Returns: the node associated with this widget, or NULL.
326 */
327
328static WNode *
329FindTreeNodeFromWidget(Widget w)
330{
331    int ret_val;
332    XPointer data_return;
333
334    /*
335     * Yes, I really am casting a widget to a window  ** TRUST ME ***
336     */
337
338    ret_val = XFindContext(XtDisplay(w), (Window) w, NODE_INFO, &data_return);
339
340    if (ret_val == 0)
341	return((WNode *) data_return);
342    return(NULL);
343}
344
345