2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: PopupMenu.c /main/5 1995/11/01 11:28:50 rswiston $ */
24 /*****************************************************************************
25 *****************************************************************************
31 ** Description: This file contains the functions for creating and managing
32 ** the main panel and subpanel popup menus.
35 ****************************************************************************
36 *****************************************************************************/
40 #include <Xm/ManagerP.h>
41 #include <Xm/RowColumn.h>
42 #include <Xm/LabelG.h>
43 #include <Xm/PushBG.h>
44 #include <Xm/SeparatoG.h>
46 #include <Dt/SharedProcs.h>
48 #include "DataBaseLoad.h"
51 #define POPUP_CHILDREN 7
54 extern void ToggleDefaultControl (ControlData *, SubpanelData *, ControlData *);
55 extern void SwitchRenameLabel (Widget, BoxData *);
56 extern Boolean CheckControlTypeFile (ControlData *);
64 /************************************************************************
68 ************************************************************************/
72 XtPointer client_data,
77 ControlData * control_data;
80 int indx = (int) client_data;
84 XtSetArg (args[0], XmNuserData, &control_data);
85 XtGetValues(w, args, 1);
87 if (CheckControlTypeFile (control_data) == False)
90 control_type = (int) (control_data->element_values[CONTROL_TYPE].parsed_value);
92 if (control_type == CONTROL_FILE && !control_data->is_action)
96 aap = (DtActionArg *) XtCalloc(1,sizeof(DtActionArg));
98 aap->argClass = DtACTION_FILE;
100 aap->u.file.name = (char *)
101 control_data->element_values[CONTROL_FILE_NAME].parsed_value;
103 DtActionInvoke (control_data->icon,
104 control_data->actions[indx]->action_name,
105 aap, 1, NULL, NULL, NULL, 1, NULL, NULL);
107 XtFree ((char *) aap);
111 DtActionInvoke (control_data->icon,
112 control_data->actions[indx]->action_name,
113 control_data->actions[indx]->aap,
114 control_data->actions[indx]->count,
115 NULL, NULL, NULL, 1, NULL, NULL);
120 /************************************************************************
123 * The callback function is called off of a menu pick to delete
124 * a specific workspace. The function identifies the index of the
125 * workspace and calls the workspace manager API to perform the delete.
126 * All frontpanel UI processing is performed through a notification
127 * callback issued by the workspace manager after a successful delete.
129 ************************************************************************/
132 DeleteWorkspaceCB (Widget w,
133 XtPointer client_data,
138 int delete_workspace = (int) client_data;
139 SwitchData * switch_data;
143 /* Look up the switch data to get the atom name of the workspace */
146 for (i = 0; i < panel.box_data_count; i++)
148 if (panel.box_data[i]->switch_data != NULL)
150 switch_data = panel.box_data[i]->switch_data;
155 _DtWsmDeleteWorkspace (panel.shell,
156 switch_data->atom_names[delete_workspace]);
162 /************************************************************************
165 * The callback function is called off of a menu pick to rename
166 * a specific workspace. The function identifies the index of the
167 * workspace and calls SwitchRenameLabel() function to change the switch.
168 * button to a text widget for typing the new workspace name and setting.
169 * up the callback to accept the new name upon activation.
171 ************************************************************************/
174 RenameWorkspaceCB (Widget w,
175 XtPointer client_data,
180 int rename_ws = (int) client_data;
181 SwitchData * switch_data;
185 /* Look up the switch data to get the atom name of the workspace */
188 for (i = 0; i < panel.box_data_count; i++)
190 if (panel.box_data[i]->switch_data != NULL)
192 switch_data = panel.box_data[i]->switch_data;
197 SwitchRenameLabel (switch_data->buttons[rename_ws], panel.box_data[i]);
204 /************************************************************************
207 * The callback function is called off of a menu pick. It generates
208 * a new workspace name and calls the workspace manager API to
209 * create the new workspace. All frontpanel UI processing is
210 * performed through a notification callback issued by the workspace
211 * manager after a successful add.
213 ************************************************************************/
216 AddWorkspaceCB (Widget w,
217 XtPointer client_data,
222 SwitchData * switch_data;
230 /* Get the beginning part of the new name */
232 temp_name = FPGETMESSAGE (82, 35, "New");
233 switch_name = XtMalloc (strlen (temp_name) + 5);
234 strcpy (switch_name, temp_name);
237 /* Look up the switch data to get the atom name of the workspace */
240 for (i = 0; i < panel.box_data_count; i++)
242 if (panel.box_data[i]->switch_data != NULL)
244 switch_data = panel.box_data[i]->switch_data;
250 /* Generate a new title for the workspace. It should be unique */
251 /* from the existing title. */
262 for (i = 0; i < switch_data->switch_count; i++)
264 if (strcmp (switch_name, switch_data->switch_names[i]) == 0)
267 sprintf (switch_name, "%s_%d", temp_name, append);
274 _DtWsmCreateWorkspace (panel.shell, switch_name);
283 /************************************************************************
287 ************************************************************************/
292 XtPointer client_data,
293 XtPointer call_data )
295 XtUnmanageChild((Widget)client_data);
296 XmUpdateDisplay((Widget)client_data);
297 XtDestroyWidget((Widget)client_data);
303 /************************************************************************
306 * Called from the Ok button on the confimation dialog when a
307 * control deletion is seleted from the popup menu.
309 ************************************************************************/
313 DeleteControlOkCB (Widget w,
314 XtPointer client_data,
319 ControlData * control_data;
320 SubpanelData * subpanel_data;
324 /* Extract the control data from the user data field of the */
325 /* widget pointed to by client data. */
327 XtSetArg (args[0], XmNuserData, &control_data);
328 XtGetValues((Widget) client_data, args, 1);
331 /* Get the subpanel data for the control. Check to see if the */
332 /* control is a real subpanel control or the main panel copy. */
334 if (control_data->parent_type == SUBPANEL)
335 subpanel_data = (SubpanelData *) control_data->parent_data;
337 subpanel_data = (SubpanelData *) control_data->subpanel_data;
340 /* Get rid of the dialog and call the funtion to delete the control */
342 XtUnmanageChild ((Widget) client_data);
343 XmUpdateDisplay ((Widget) client_data);
345 DeleteSubpanelControl (subpanel_data, control_data);
347 XtDestroyWidget ((Widget) client_data);
353 /************************************************************************
357 ************************************************************************/
362 XtPointer client_data,
363 XtPointer call_data )
365 ControlData * control_data;
368 XtSetArg (args[0], XmNuserData, &control_data);
369 XtGetValues((Widget)client_data, args, 1);
371 XtUnmanageChild((Widget)client_data);
372 XmUpdateDisplay((Widget)client_data);
374 DeleteSubpanel(control_data);
376 XtDestroyWidget((Widget)client_data);
380 /************************************************************************
384 ************************************************************************/
387 DeleteControlCB (Widget w,
388 XtPointer client_data,
393 ControlData * control_data;
395 SubpanelData *subpanel_data;
398 String title, del_ctrl, ctrl_name, ctrl_label, del_msg, message;
399 int indx = (int) client_data;
402 XtSetArg (args[0], XmNuserData, &control_data);
403 XtGetValues (w, args, 1);
405 del_ctrl = FPGETMESSAGE(82, 31, "Delete Control:");
406 del_ctrl = XtNewString (del_ctrl);
408 ctrl_label = (char *)
409 control_data->element_values[CONTROL_LABEL].parsed_value;
411 control_data->element_values[CONTROL_NAME].parsed_value;
413 if (ctrl_label == NULL)
414 ctrl_label = ctrl_name;
416 if ((Boolean)control_data->element_values[CONTROL_LOCKED].parsed_value)
418 title = FPGETMESSAGE(82,1, "Workspace Manager - Delete Locked Control Error");
419 title = XtNewString (title);
421 del_msg = FPGETMESSAGE(82,5, "This control cannot be deleted because it is locked.");
422 del_msg = XtNewString (del_msg);
424 message = XtMalloc (sizeof(char) *
425 (strlen(del_ctrl) + strlen(ctrl_label) +
426 strlen(del_msg) + 4));
428 sprintf(message, "%s %s\n\n%s", del_ctrl, ctrl_label, del_msg);
430 _DtMessage (XtParent(w), title, message, NULL, NULL);
439 title = FPGETMESSAGE(82,2, "Workspace Manager - Delete Control");
440 title = XtNewString (title);
442 if (SessionFileNameLookup (ctrl_name, CONTROL, (char *) control_data->element_values[CONTROL_CONTAINER_NAME].parsed_value, SUBPANEL) == NULL)
443 del_msg = FPGETMESSAGE(82,32, "If you delete this control, you cannot restore it using\nthe \"Install Icon\" drop zone.\n\nYou can use \"RestorePanel\" in the Application Manager\nto put back this control at a later time.\n\nAre you sure you want to delete this control?");
445 del_msg = FPGETMESSAGE(82,6, "Are you sure you want to delete this control?");
447 del_msg = XtNewString (del_msg);
449 message = XtMalloc (sizeof(char) *
450 (strlen(del_ctrl) + strlen(ctrl_label) +
451 strlen(del_msg) + 4));
453 sprintf(message, "%s %s\n\n%s", del_ctrl, ctrl_label, del_msg);
456 /* Get the subpanel data for the control. Check to see if the */
457 /* control is a real subpanel control or the main panel copy. */
459 if (control_data->parent_type == SUBPANEL)
460 subpanel_data = (SubpanelData *) control_data->parent_data;
462 subpanel_data = (SubpanelData *) control_data->subpanel_data;
464 dialog = _DtMessageDialog(subpanel_data->shell,title,message,NULL,TRUE,
466 dialog = _DtMessageDialog(panel.shell, title, message, NULL, TRUE,
468 DeleteCancelCB, DeleteControlOkCB, NULL, NULL, False,
471 XtSetArg (args[0], XmNuserData, control_data);
472 XtSetArg (args[1], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
473 XtSetValues (dialog, args, 2);
486 /************************************************************************
489 * This callback initiates a subpanel control being toggled into
492 ************************************************************************/
495 ToggleControlCB (Widget w,
496 XtPointer client_data,
501 SubpanelData * subpanel_data = (SubpanelData *) client_data;
502 ControlData * control_data;
503 int indx = (int) client_data;
506 XtSetArg (args[0], XmNuserData, &control_data);
507 XtGetValues(w, args, 1);
509 ToggleDefaultControl (subpanel_data->parent_control_data,
510 subpanel_data, control_data);
516 /************************************************************************
520 ************************************************************************/
523 AddSubpanelCB (Widget w,
524 XtPointer client_data,
529 ControlData * control_data;
530 int indx = (int) client_data;
533 XtSetArg (args[0], XmNuserData, &control_data);
534 XtGetValues(w, args, 1);
536 AddSubpanel(control_data);
542 /************************************************************************
546 ************************************************************************/
549 DeleteSubpanelCB (Widget w,
550 XtPointer client_data,
555 ControlData * control_data;
556 SubpanelData * subpanel_data;
558 String title, message, del_spanel, spanel_name, del_msg;
561 XtSetArg (args[0], XmNuserData, &control_data);
562 XtGetValues(w, args, 1);
564 subpanel_data = (SubpanelData *) control_data->subpanel_data;
566 subpanel_data = (SubpanelData *) control_data->parent_data;
568 del_spanel = FPGETMESSAGE(82, 33, "Delete Subpanel:");
569 del_spanel = XtNewString (del_spanel);
571 spanel_name = (char *)
572 subpanel_data->element_values[SUBPANEL_NAME].parsed_value;
574 if ((Boolean)subpanel_data->element_values[SUBPANEL_LOCKED].parsed_value)
576 title = FPGETMESSAGE(82,3, "Workspace Manager - Delete Locked Subpanel Error");
577 title = XtNewString (title);
579 del_msg = FPGETMESSAGE(82,7, "This subpanel cannot be deleted because it is locked.");
580 del_msg = XtNewString (del_msg);
582 message = XtMalloc (sizeof(char) *
583 (strlen(del_spanel) + strlen(spanel_name) +
584 strlen(del_msg) + 4));
586 sprintf(message, "%s %s\n\n%s", del_spanel, spanel_name, del_msg);
588 _DtMessage (XtParent(w), title, message, NULL, NULL);
597 title = FPGETMESSAGE(82,4, "Workspace Manager - Delete Subpanel");
598 title = XtNewString (title);
600 if (subpanel_data->control_data_count > 0)
602 if (SessionFileNameLookup (spanel_name, SUBPANEL, (char *)
603 subpanel_data->element_values[SUBPANEL_CONTAINER_NAME].parsed_value,
605 del_msg = FPGETMESSAGE(82,34,
606 "If you delete this subpanel, you cannot restore all\nof the controls contained in the subpanel using the\n\"Install Icon\" drop zone.\n\nYou can use \"RestorePanel\" in the Application Manager\nto put back this subpanel and its controls at a later time.\n\nAre you sure you want to delete this subpanel?");
608 del_msg = FPGETMESSAGE(82,8, "This subpanel contains more than one control.\n\nAre you sure you want to delete this subpanel?");
611 del_msg = FPGETMESSAGE(82,9, "Are you sure you want to delete this subpanel?");
613 del_msg = XtNewString (del_msg);
615 message = XtMalloc (sizeof(char) *
616 (strlen(del_spanel) + strlen(spanel_name) +
617 strlen(del_msg) + 4));
619 sprintf(message, "%s %s\n\n%s", del_spanel, spanel_name, del_msg);
622 dialog = _DtMessageDialog(subpanel_data->shell,title,message,NULL,TRUE,
624 dialog = _DtMessageDialog(panel.shell, title, message, NULL, TRUE,
626 DeleteCancelCB, DeleteSubpanelOkCB, NULL, NULL, False,
629 XtSetArg (args[0], XmNuserData, control_data);
630 XtSetArg (args[1], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
631 XtSetValues(dialog, args, 2);
644 /************************************************************************
646 * PostWorkspacePopupMenu
648 ************************************************************************/
652 PostWorkspacePopupMenu (Widget w,
653 XtPointer client_data,
660 SwitchData * switch_data = NULL;
661 XButtonEvent * b_event = (XButtonEvent *) event;
663 /* only use BMENU press events */
665 if (b_event->button != wmGD.bMenuButton) return;
667 for (i = 0; i < panel.box_data_count; i++)
669 box_data = panel.box_data[i];
671 if (box_data->switch_data != NULL)
672 switch_data = box_data->switch_data;
675 if (switch_data != NULL)
676 XtManageChild(switch_data->popup_data->popup);
682 /************************************************************************
686 ************************************************************************/
689 PostPopupMenu (Widget w,
690 XtPointer client_data,
695 XButtonEvent * b_event = (XButtonEvent *) event;
697 /* only use BMENU press events */
699 if (b_event->button != wmGD.bMenuButton) return;
701 XtManageChild(panel.popup_data->popup);
707 /************************************************************************
711 ************************************************************************/
714 GetBoxDataFromForm (Widget form,
715 BoxData ** box_data_rtn)
722 for (i = 0; i < panel.box_data_count; i++)
724 box_data = panel.box_data[i];
726 if (box_data == *box_data_rtn) continue;
728 if (box_data->left_control_form == form ||
729 box_data->right_control_form == form)
731 *box_data_rtn = box_data;
740 /************************************************************************
742 * GetSubpanelDataFromForm
744 ************************************************************************/
747 GetSubpanelDataFromForm (Widget form,
748 SubpanelData ** subpanel_data_rtn)
753 ControlData * control_data;
754 SubpanelData * subpanel_data;
757 for (i = 0; i < panel.box_data_count; i++)
759 box_data = panel.box_data[i];
761 for (j = 0; j < box_data->control_data_count; j++)
763 control_data = box_data->control_data[j];
765 if (control_data->subpanel_data != NULL)
767 subpanel_data = control_data->subpanel_data;
769 if (subpanel_data == *subpanel_data_rtn) continue;
771 if (subpanel_data->form == form)
773 *subpanel_data_rtn = subpanel_data;
785 /************************************************************************
789 ************************************************************************/
792 KeyMenuPosition (Widget popup, Widget focus_widget)
796 XButtonPressedEvent bevent; /* synthetic button press event */
798 Position root_x, root_y;
803 /* get the gadget's x and y */
805 XtSetArg (args[0], XmNx, &x);
806 XtSetArg (args[1], XmNy, &y);
807 XtGetValues (focus_widget, args, 2);
810 /* get the focus widget's parent since the focus widget is a gadget */
812 parent = XtParent (focus_widget);
815 /* get the root coordinates of the gadget */
817 XtTranslateCoords (parent, x, y, &root_x, &root_y);
820 /* XmMenuPosition() only uses the root_x and root_y */
821 /* of the event for positioning */
823 bevent.x_root = root_x;
824 bevent.y_root = root_y;
827 /* set the menu positioning */
829 XmMenuPosition (popup, &bevent);
836 /************************************************************************
840 ************************************************************************/
843 GetMainControlData (BoxData * box_data,
849 ControlData * control_data;
850 Boolean found = False;
852 for (i = 0; i < box_data->control_data_count; i++)
854 control_data = box_data->control_data[i];
856 if (control_data->icon == focus_widget)
863 if (!found) return NULL;
865 return (control_data);
871 /************************************************************************
873 * GetSubpanelControlData
875 ************************************************************************/
878 GetSubpanelControlData (SubpanelData * subpanel_data,
884 ControlData * control_data;
885 Boolean found = False;
887 if ( subpanel_data->dropzone == focus_widget )
890 if (subpanel_data->main_panel_icon_copy == focus_widget ||
891 subpanel_data->parent_control_data->indicator == focus_widget)
893 return (subpanel_data->parent_control_data);
897 for (i = 0; i < subpanel_data->control_data_count; i++)
899 control_data = subpanel_data->control_data[i];
900 if (control_data->icon == focus_widget ||
901 control_data->indicator == focus_widget)
908 if (!found) return NULL;
910 return (control_data);
916 /************************************************************************
918 * SetupActionMenuItems
919 * Set up the action list for display in the popup menu for a
920 * control. This may require creating additional menu items is
921 * the action list for this control is greater that previously
922 * encountered or it may require umanaging menu item is there are
926 * w: The parent of the menu items.
927 * control_data: The control the menu is being set up for.
928 * action_item: A pointer to the array of menu items for the actions.
929 * action_count: A pointer to the total number of action items.
931 ************************************************************************/
935 SetupActionMenuItems (Widget w,
936 ControlData * control_data,
937 PopupData * popup_data,
938 Widget * action_item,
943 XmString label_string;
946 int action_index = *action_count;
950 /* Count the action list for the control in order to adjust */
951 /* the number of action menu items within the menu. */
953 if (control_data != NULL)
954 while (control_data->actions[num_actions] != NULL)
957 if (num_actions > *action_count )
959 action_item = (Widget *) XtRealloc((char *) action_item,
960 sizeof(Widget) * num_actions);
962 for (i = 0; i < num_actions - *action_count; i++)
964 action_item[action_index] =
965 XmCreatePushButtonGadget (w, "action_button", args, 0);
969 XtManageChild (action_item[action_index]);
970 XtAddCallback (action_item[action_index], XmNactivateCallback,
971 ActionCB, (XtPointer)action_index);
978 for (i = 0; i < *action_count; i++)
979 XtUnmanageChild (action_item[i]);
982 for (i = 0; i < num_actions ; i++)
984 XtSetArg (args[0], XmNuserData, control_data);
985 XtSetValues (action_item[i], args, 1);
988 for (i = 0; i < num_actions; i++)
990 if (control_data->actions[i]->action_label != NULL)
992 XmStringCreateLocalized (control_data->actions[i]->action_label);
995 XmStringCreateLocalized (control_data->actions[i]->action_name);
997 XtSetArg (args[0], XmNlabelString, label_string);
998 XtSetArg (args[1], XmNuserData, control_data);
999 XtSetValues (action_item[i], args, 2);
1000 XmStringFree (label_string);
1003 for (i = 0; i < num_actions; i++)
1005 if (!XtIsManaged (action_item[i]))
1006 XtManageChild (action_item[i]);
1009 if (num_actions > 0)
1010 XtManageChild(popup_data->separator1);
1012 XtUnmanageChild(popup_data->separator1);
1019 /************************************************************************
1021 * UpdateMainControlMenu
1022 * Set up the label and the add/delete subpanel menu item for the
1026 * control_data: The control overwhich the menu is being posted.
1028 ************************************************************************/
1032 UpdateMainControlMenu (ControlData * control_data)
1036 XmString label_string;
1038 char * control_label;
1043 ElementValue * old_element_values;
1045 /* Save element values of control then load values of default control */
1047 if (control_data->subpanel_data != NULL &&
1048 control_data != control_data->subpanel_data->default_control)
1050 old_element_values = control_data->element_values;
1051 control_data->element_values =
1052 control_data->subpanel_data->default_control->element_values;
1055 /* Set the title of the menu */
1058 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1060 if (control_label == NULL)
1062 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1064 label_string = XmStringCreateLocalized (control_label);
1065 XtSetArg (args[0], XmNlabelString, label_string);
1066 XtSetValues (panel.popup_data->popup_title, args, 1);
1067 XmStringFree (label_string);
1070 /* If the control is blank, remove the add/delete subpanel item. */
1071 /* Otherwise, if there is a subpanel, activate the delete subpanel */
1072 /* item. Else activate the add subpanel item. */
1074 control_type = (int) control_data->element_values[CONTROL_TYPE].parsed_value;
1076 if (control_type != CONTROL_BLANK)
1078 XtManageChild (panel.popup_data->modify_subpanel_item);
1080 if (control_data->subpanel_data == NULL)
1082 if (panel.popup_data->subpanel_add_state != True)
1085 XmStringCreateLocalized ((FPGETMESSAGE(82, 10, "Add Subpanel")));
1086 XtSetArg (args[0], XmNlabelString, label_string);
1087 mnemonic = ((char *)FPGETMESSAGE(82, 11, "A"));
1088 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1089 XtSetArg (args[2], XmNuserData, control_data);
1090 XtSetValues (panel.popup_data->modify_subpanel_item, args, 3);
1092 XmStringFree (label_string);
1094 XtRemoveCallback (panel.popup_data->modify_subpanel_item,
1095 XmNactivateCallback, DeleteSubpanelCB, NULL);
1096 XtAddCallback (panel.popup_data->modify_subpanel_item,
1097 XmNactivateCallback, AddSubpanelCB, NULL);
1099 panel.popup_data->subpanel_add_state = True;
1103 XtSetArg (args[0], XmNuserData, control_data);
1104 XtSetValues (panel.popup_data->modify_subpanel_item, args, 1);
1109 if (panel.popup_data->subpanel_add_state == True)
1112 XmStringCreateLocalized ((FPGETMESSAGE(82, 12, "Delete Subpanel")));
1113 XtSetArg (args[0], XmNlabelString, label_string);
1114 mnemonic = ((char *)FPGETMESSAGE(82, 13, "D"));
1115 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1116 XtSetArg (args[2], XmNuserData, control_data);
1117 XtSetValues (panel.popup_data->modify_subpanel_item, args, 3);
1119 XmStringFree (label_string);
1121 XtRemoveCallback (panel.popup_data->modify_subpanel_item,
1122 XmNactivateCallback, AddSubpanelCB, NULL);
1123 XtAddCallback (panel.popup_data->modify_subpanel_item,
1124 XmNactivateCallback, DeleteSubpanelCB, NULL);
1126 panel.popup_data->subpanel_add_state = False;
1130 XtSetArg (args[0], XmNuserData, control_data);
1131 XtSetValues (panel.popup_data->modify_subpanel_item, args, 1);
1137 XtUnmanageChild (panel.popup_data->modify_subpanel_item);
1140 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1142 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1143 ControlTopicHelpCB, (XtPointer)control_data);
1145 XtUnmanageChild (panel.popup_data->deinstall_item);
1146 XtUnmanageChild (panel.popup_data->toggle_item);
1148 /* Restore element values to control. */
1150 if (control_data->subpanel_data != NULL &&
1151 control_data != control_data->subpanel_data->default_control)
1153 control_data->element_values = old_element_values;
1161 /************************************************************************
1163 * UpdateSubpanelControlMenu
1164 * Set the elements of the popup menu for a subpanel control
1165 * item to its proper values before it is made visible.
1168 * subpanel_data: The subpanel in which the menu is to be
1171 * control_data: The control that the menu is being brought up for.
1173 ************************************************************************/
1177 UpdateSubpanelControlMenu (SubpanelData * subpanel_data,
1178 ControlData * control_data)
1182 XmString label_string;
1184 char * control_label = NULL;
1186 /* Set the title of the menu */
1191 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1193 if (control_label == NULL)
1195 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1199 control_label = FPGETMESSAGE(82, 36, "Install Icon");
1202 label_string = XmStringCreateLocalized (control_label);
1203 XtSetArg (args[0], XmNlabelString, label_string);
1204 XtSetValues (panel.popup_data->popup_title, args, 1);
1205 XmStringFree (label_string);
1208 /* Set the sensitivity of the control deinstall and toggle menu item */
1210 if (control_data == NULL)
1212 XtSetSensitive (panel.popup_data->deinstall_item, False);
1213 XtSetSensitive (panel.popup_data->toggle_item, False);
1215 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1217 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1218 GeneralTopicHelpCB, (XtPointer)INSTALL_ZONE);
1222 XtSetSensitive (panel.popup_data->deinstall_item, True);
1223 XtSetArg (args[0], XmNuserData, control_data);
1224 XtSetValues(panel.popup_data->deinstall_item, args, 1);
1226 XtRemoveAllCallbacks (panel.popup_data->deinstall_item,
1227 XmNactivateCallback);
1229 XtAddCallback (panel.popup_data->deinstall_item, XmNactivateCallback,
1230 DeleteControlCB, (XtPointer) NULL);
1232 if ( control_data == subpanel_data->default_control)
1233 XtSetSensitive (panel.popup_data->toggle_item, False);
1235 XtSetSensitive (panel.popup_data->toggle_item, True);
1237 XtSetArg (args[0], XmNuserData, control_data);
1238 XtSetValues(panel.popup_data->toggle_item, args, 1);
1240 XtRemoveAllCallbacks (panel.popup_data->toggle_item,
1241 XmNactivateCallback);
1243 XtAddCallback (panel.popup_data->toggle_item, XmNactivateCallback,
1244 ToggleControlCB, (XtPointer) subpanel_data);
1246 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1248 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1249 ControlTopicHelpCB, (XtPointer)control_data);
1252 XtManageChild (panel.popup_data->deinstall_item);
1254 if ((Boolean) (subpanel_data->parent_control_data->
1255 element_values[CONTROL_LOCKED].parsed_value) != True)
1256 XtManageChild (panel.popup_data->toggle_item);
1258 XtUnmanageChild (panel.popup_data->toggle_item);
1260 XtUnmanageChild (panel.popup_data->modify_subpanel_item);
1266 /************************************************************************
1269 * Callback function which updates the popup menu for main panel
1270 * and subpanel controls before the menu is posted.
1272 ************************************************************************/
1276 PopupMenu (Widget w,
1277 XtPointer client_data,
1278 XtPointer call_data)
1282 XmAnyCallbackStruct * callback;
1284 Widget form, focus_widget;
1285 XmManagerWidget mgr;
1286 SubpanelData * subpanel_data = NULL;
1287 ControlData * control_data;
1288 BoxData * box_data = NULL;
1289 XmString label_string;
1291 int control_type, action_count = panel.popup_data->action_count;
1293 callback = (XmAnyCallbackStruct *) call_data;
1294 event = (XEvent *) callback->event;
1297 /* Get the form where the menu was posted from. */
1299 form = XmGetPostedFromWidget(w);
1301 XtSetArg (args[0], XmNuserData, &control_type);
1302 XtGetValues (form, args, 1);
1304 if (control_type == CONTROL)
1306 GetBoxDataFromForm (form, &box_data);
1307 subpanel_data = NULL;
1309 else if (control_type == SUBPANEL)
1311 GetSubpanelDataFromForm (form, &subpanel_data);
1315 if (event->type == ButtonPress)
1317 /* Change to use new Xme function when porting to Motif 2.0 */
1318 /* Get gadget at x, y position */
1320 focus_widget = (Widget) XmObjectAtPoint (form, event->xbutton.x,
1322 if (focus_widget == NULL)
1325 /* set the menu positioning */
1327 XmMenuPosition (panel.popup_data->popup, (XButtonPressedEvent *)event);
1331 /* get the widget that has the traversal focus */
1333 focus_widget = XmGetFocusWidget (form);
1336 /* set the menu positioning for non button events */
1338 KeyMenuPosition (panel.popup_data->popup, focus_widget);
1341 if (control_type == CONTROL)
1343 control_data = GetMainControlData (box_data, focus_widget);
1345 /* Find the right subpanel data if main control is not default */
1348 UpdateMainControlMenu (control_data);
1350 if (control_data->subpanel_data != NULL &&
1351 control_data != control_data->subpanel_data->default_control)
1353 subpanel_data = control_data->subpanel_data;
1354 control_data = control_data->subpanel_data->default_control;
1355 control_data->subpanel_data = subpanel_data;
1356 UpdateMainControlMenu (control_data);
1359 SetupActionMenuItems (w, control_data, panel.popup_data,
1360 panel.popup_data->action_item, &action_count);
1363 else if (control_type == SUBPANEL)
1365 control_data = GetSubpanelControlData (subpanel_data, focus_widget);
1367 UpdateSubpanelControlMenu (subpanel_data, control_data);
1369 SetupActionMenuItems (w, control_data, panel.popup_data,
1370 panel.popup_data->action_item, &action_count);
1373 panel.popup_data->action_count = action_count;
1379 /************************************************************************
1383 ************************************************************************/
1387 CreatePopupMenu (Widget w)
1391 Widget children[20];
1394 PopupData * popup_data;
1395 int i, child_num = 0;
1396 XmString label_string;
1398 popup_data = panel.popup_data = (PopupData *) XtMalloc(sizeof(PopupData));
1401 XtSetArg (args[i], XmNwhichButton, wmGD.bMenuButton); i++;
1403 popup_data->popup = XmCreatePopupMenu(w, "FPPopup", args, i);
1405 popup_data->add_ws_item = NULL;
1407 XtAddCallback (popup_data->popup, XmNmapCallback, PopupMenu,
1410 popup_data->popup_title = children[child_num++] =
1411 XmCreateLabelGadget(popup_data->popup, "title", NULL, 0);
1413 children[child_num++] = XmCreateSeparatorGadget(popup_data->popup,
1415 children[child_num++] = XmCreateSeparatorGadget(popup_data->popup,
1418 popup_data->action_item = (Widget *) XtMalloc(sizeof(Widget) * 5);
1419 popup_data->action_count = 0;
1421 for (i = 0; i < 5; i++)
1423 children[child_num] = popup_data->action_item[i] =
1424 XmCreatePushButtonGadget(popup_data->popup, "action_button", args, 0);
1425 popup_data->action_count++;
1427 XtManageChild (popup_data->action_item[i]);
1428 XtAddCallback (children[child_num++], XmNactivateCallback,
1429 ActionCB, (XtPointer) i);
1432 popup_data->separator1 = children[child_num++] =
1433 XmCreateSeparatorGadget (popup_data->popup, "sep3", NULL, 0);
1436 XmStringCreateLocalized((FPGETMESSAGE(82, 14, "Copy To Main Panel")));
1437 XtSetArg (args[0], XmNlabelString, label_string);
1438 mnemonic = ((char *)FPGETMESSAGE(82, 15, "C"));
1439 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1440 popup_data->toggle_item = children[child_num] =
1441 XmCreatePushButtonGadget (popup_data->popup, "Toggle_Control", args, 2);
1442 XmStringFree (label_string);
1444 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 16, "Delete")));
1445 XtSetArg (args[0], XmNlabelString, label_string);
1446 mnemonic = ((char *)FPGETMESSAGE(82, 17, "D"));
1447 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1448 popup_data->deinstall_item = children[child_num] =
1449 XmCreatePushButtonGadget(popup_data->popup, "Delete_Control",
1451 XmStringFree (label_string);
1454 XmStringCreateLocalized ((FPGETMESSAGE(82, 10, "Add Subpanel")));
1455 XtSetArg (args[0], XmNlabelString, label_string);
1456 mnemonic = ((char *)FPGETMESSAGE(82, 11, "A"));
1457 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1458 popup_data->modify_subpanel_item = children[child_num] =
1459 XmCreatePushButtonGadget (popup_data->popup, "Add_Subpanel", args, 2);
1460 XmStringFree (label_string);
1462 XtAddCallback(children[child_num++], XmNactivateCallback, AddSubpanelCB,
1464 popup_data->subpanel_add_state = True;
1466 popup_data->separator2 = children[child_num++] =
1467 XmCreateSeparatorGadget(popup_data->popup, "sep4", NULL, 0);
1469 label_string = XmStringCreateLocalized ((FPGETMESSAGE(82, 18, "Help")));
1470 XtSetArg (args[0], XmNlabelString, label_string);
1471 mnemonic = ((char *)FPGETMESSAGE(82, 19, "H"));
1472 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1473 popup_data->help_item = children[child_num++] =
1474 XmCreatePushButtonGadget (popup_data->popup, "Help", args, 2);
1475 XmStringFree (label_string);
1477 XtManageChildren(children, child_num);
1483 /************************************************************************
1485 * CreateActionButtons
1486 * Show the the action menu items and hide workspace menu items since
1487 * we are over a control.
1490 ************************************************************************/
1494 CreateActionButtons (Widget w,
1495 SwitchData * switch_data,
1496 ControlData * control_data)
1500 PopupData * popup_data = switch_data->popup_data;
1501 int action_count = popup_data->action_count;
1503 XmString label_string;
1504 char * control_label;
1506 /* Set the title of the menu */
1509 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1511 if (control_label == NULL)
1513 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1515 label_string = XmStringCreateLocalized (control_label);
1516 XtSetArg (args[0], XmNlabelString, label_string);
1517 XtSetValues (popup_data->popup_title, args, 1);
1518 XmStringFree (label_string);
1520 /* show actions items */
1521 SetupActionMenuItems(w, control_data, popup_data,
1522 popup_data->action_item, &action_count);
1523 popup_data->action_count = action_count;
1525 /* hide add and delete workspace items */
1526 XtUnmanageChild(popup_data->add_ws_item);
1527 XtUnmanageChild(popup_data->delete_ws_item);
1528 XtUnmanageChild(popup_data->rename_ws_item);
1530 /* reset the help callback to reflect switch control help */
1531 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1532 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1533 ControlTopicHelpCB, control_data);
1540 /************************************************************************
1542 * ShowWorkspaceItems
1543 * Don't show the the action menu items since we are not over a control.
1544 * Reset the activate callbacks with the latest data.
1546 ************************************************************************/
1550 ShowWorkspaceItems (SwitchData * switch_data,
1551 Widget focus_widget)
1555 PopupData * popup_data = switch_data->popup_data;
1558 XmString label_string;
1559 char * control_label;
1565 /* hide actions items */
1567 for (i = 0; i < popup_data->action_count; i++)
1568 XtUnmanageChild (popup_data->action_item[i]);
1571 /* show add and delete workspace items */
1573 XtManageChild (popup_data->add_ws_item);
1574 XtManageChild (popup_data->delete_ws_item);
1575 XtManageChild (popup_data->rename_ws_item);
1578 /* reset the activate callback to reflect current button index */
1580 XtRemoveAllCallbacks (popup_data->delete_ws_item, XmNactivateCallback);
1581 for (i = 0; i < switch_data->switch_count &&
1582 switch_data->buttons[i] != NULL; i++)
1584 if (switch_data->buttons[i] == focus_widget) break;
1588 /* If we didn't find the switch button to post the menu for, it */
1589 /* must be in edit mode so the correct menu is the active switch */
1591 if (i >= switch_data->switch_count)
1592 i = switch_data->active_switch;
1595 /* Set the title of the menu */
1597 format = strdup (FPGETMESSAGE(82, 20, "%1$s %2$s"));
1598 ws = strdup (FPGETMESSAGE(82, 21, "Workspace"));
1599 ws_name = switch_data->switch_names[i];
1601 control_label = XtMalloc (sizeof(char) * (strlen(ws) + strlen(ws_name) + 4));
1603 sprintf (control_label, format, ws, ws_name);
1607 label_string = XmStringCreateLocalized (control_label);
1608 XtSetArg (args[0], XmNlabelString, label_string);
1609 XtSetValues (popup_data->popup_title, args, 1);
1610 XmStringFree (label_string);
1611 XtFree(control_label);
1613 XtAddCallback (popup_data->delete_ws_item, XmNactivateCallback,
1614 DeleteWorkspaceCB, (XtPointer) i);
1616 /* reset the activate callback to reflect current button index */
1617 XtRemoveAllCallbacks (popup_data->rename_ws_item, XmNactivateCallback);
1618 XtAddCallback (popup_data->rename_ws_item, XmNactivateCallback,
1619 RenameWorkspaceCB, (XtPointer) i);
1621 /* reset the help callback to reflect switch button help */
1622 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1623 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1624 GeneralTopicHelpCB, (XtPointer) SWITCH_BUTTON);
1626 XtManageChild(popup_data->separator1);
1632 /************************************************************************
1634 * ShowPartialWorkspaceItems
1635 * Don't show the delete workspace item since we are not over
1636 * a workspace button and don't show the action menu items since we are
1637 * not over a control. Reset the activate callback with the latest data.
1639 ************************************************************************/
1642 ShowPartialWorkspaceItems(SwitchData * switch_data)
1646 PopupData * popup_data = switch_data->popup_data;
1649 XmString label_string;
1651 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 22, "Switch Area")));
1652 XtSetArg (args[0], XmNlabelString, label_string);
1653 XtSetValues (popup_data->popup_title, args, 1);
1654 XmStringFree (label_string);
1656 /* hide actions items */
1657 for (i = 0; i < popup_data->action_count; i++)
1658 XtUnmanageChild (popup_data->action_item[i]);
1660 /* show add workspace item */
1661 XtManageChild (popup_data->add_ws_item);
1663 /* hide delete and rename workspace items */
1664 XtUnmanageChild (popup_data->delete_ws_item);
1665 XtUnmanageChild (popup_data->rename_ws_item);
1667 /* reset the help callback to reflect switch area help */
1668 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1669 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1670 SwitchTopicHelpCB, (XtPointer)switch_data);
1672 XtManageChild(popup_data->separator1);
1679 /************************************************************************
1681 * GetSwitchDataFromForm
1683 ************************************************************************/
1688 GetSwitchDataFromForm (Widget form,
1689 SwitchData ** switch_data_rtn)
1696 for (i = 0; i < panel.box_data_count; i++)
1698 box_data = panel.box_data[i];
1700 if (box_data->switch_form == form)
1702 *switch_data_rtn = box_data->switch_data;
1711 /************************************************************************
1713 * GetSwtichControlData
1715 ************************************************************************/
1718 static ControlData *
1719 GetSwitchControlData (SwitchData * switch_data,
1720 Widget focus_widget)
1725 ControlData * control_data;
1726 Boolean found = False;
1728 for (i = 0; i < switch_data->control_data_count; i++)
1730 control_data = switch_data->control_data[i];
1732 if (control_data->icon == focus_widget)
1739 if (!found) return NULL;
1741 return (control_data);
1748 /************************************************************************
1752 ************************************************************************/
1755 WSPopupMenu (Widget w,
1756 XtPointer client_data,
1757 XtPointer call_data)
1761 XmManagerWidget mgr = (XmManagerWidget) w;
1762 int num_children = mgr->composite.num_children;
1763 XmAnyCallbackStruct * callback;
1765 Widget form, focus_widget;
1766 SwitchData * switch_data;
1767 ControlData * control_data = NULL;
1768 Boolean is_button = False;
1773 callback = (XmAnyCallbackStruct *) call_data;
1774 event = (XEvent *) callback->event;
1777 /* get the form where the menu was posted from */
1779 form = XmGetPostedFromWidget (w);
1781 GetSwitchDataFromForm (form, &switch_data);
1784 if (event->type == ButtonPress)
1787 /* Change to use new Xme function when porting to Motif 2.0 */
1788 /* Get gadget at x, y position */
1790 focus_widget = (Widget) XmObjectAtPoint (form, event->xbutton.x,
1793 if (focus_widget == NULL)
1795 XtSetArg (args[0], XmNx, &x);
1796 XtSetArg (args[1], XmNy, &y);
1797 XtGetValues(switch_data->rc, args, 2);
1799 focus_widget = (Widget) XmObjectAtPoint (switch_data->rc,
1800 event->xbutton.x - x,
1801 event->xbutton.y - y);
1805 control_data = GetSwitchControlData (switch_data, focus_widget);
1808 /* set the menu positioning */
1810 XmMenuPosition (switch_data->popup_data->popup,
1811 (XButtonPressedEvent *) event);
1816 /* get the widget that has the traversal focus */
1818 focus_widget = XmGetFocusWidget (form);
1820 control_data = GetSwitchControlData (switch_data, focus_widget);
1822 if (control_data == NULL)
1825 /* set the menu positioning for non button events */
1827 KeyMenuPosition (switch_data->popup_data->popup, focus_widget);
1830 if (focus_widget != NULL)
1833 /* The mouse is over a button in the switch area */
1834 ShowWorkspaceItems (switch_data, focus_widget);
1837 if (control_data != NULL)
1840 (int) control_data->element_values[CONTROL_TYPE].parsed_value;
1842 if (control_type != CONTROL_BLANK)
1843 /* The mouse is over a control in the switch area */
1844 CreateActionButtons (w, switch_data, control_data);
1846 /* The mouse is over a blank control in the switch area */
1847 ShowPartialWorkspaceItems (switch_data);
1852 * The mouse is over area other than the buttons and control
1853 * in the switch area
1855 ShowPartialWorkspaceItems (switch_data);
1861 * The mouse is over area other than the buttons and control
1862 * in the switch area
1864 ShowPartialWorkspaceItems (switch_data);
1870 /************************************************************************
1872 * CreateWorkspacePopupMenu
1874 ************************************************************************/
1878 CreateWorkspacePopupMenu (Widget w,
1879 SwitchData * switch_data)
1883 Widget children[20];
1884 XmString label_string;
1887 int i, child_num = 0;
1888 PopupData * popup_data;
1890 popup_data = (PopupData *) XtMalloc(sizeof(PopupData));
1893 XtSetArg (args[i], XmNwhichButton, wmGD.bMenuButton); i++;
1895 popup_data->popup = XmCreatePopupMenu(w, "WSPopup", args, i);
1897 popup_data->deinstall_item = NULL;
1898 popup_data->toggle_item = NULL;
1899 popup_data->modify_subpanel_item = NULL;
1900 popup_data->subpanel_add_state = True;
1902 XtAddCallback(popup_data->popup, XmNmapCallback, WSPopupMenu,
1903 (XtPointer) switch_data);
1905 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 22, "Switch Area")));
1906 XtSetArg (args[0], XmNlabelString, label_string);
1907 popup_data->popup_title = children[child_num++] =
1908 XmCreateLabelGadget (popup_data->popup, "title", args, 1);
1909 XmStringFree (label_string);
1911 children[child_num++] = XmCreateSeparatorGadget (popup_data->popup, "sep1",
1913 children[child_num++] = XmCreateSeparatorGadget (popup_data->popup, "sep2",
1916 popup_data->action_item = (Widget *) XtMalloc(sizeof(Widget) * 5);
1917 popup_data->action_count = 0;
1919 for (i = 0; i < 5; i++)
1921 children[child_num] = popup_data->action_item[i] =
1922 XmCreatePushButtonGadget (popup_data->popup, "action_button", args, 0);
1923 popup_data->action_count++;
1925 XtManageChild (popup_data->action_item[i]);
1926 XtAddCallback (children[child_num++], XmNactivateCallback,
1927 ActionCB, (XtPointer) i);
1931 XmStringCreateLocalized ((FPGETMESSAGE(82, 23, "Add Workspace")));
1932 XtSetArg (args[0], XmNlabelString, label_string);
1933 mnemonic = ((char *)FPGETMESSAGE(82, 24, "A"));
1934 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1935 popup_data->add_ws_item = children[child_num] =
1936 XmCreatePushButtonGadget (popup_data->popup, "Add_Workspace", args, 2);
1937 XmStringFree (label_string);
1939 XtAddCallback(children[child_num++], XmNactivateCallback, AddWorkspaceCB,
1942 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 25, "Delete")));
1943 XtSetArg (args[0], XmNlabelString, label_string);
1944 mnemonic = ((char *)FPGETMESSAGE(82, 26, "D"));
1945 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1946 popup_data->delete_ws_item = children[child_num] =
1947 XmCreatePushButtonGadget (popup_data->popup,
1948 "Delete_Workspace", args, 2);
1949 XmStringFree (label_string);
1951 XtAddCallback(children[child_num++], XmNactivateCallback,
1952 DeleteWorkspaceCB, (XtPointer) 0);
1954 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 27, "Rename")));
1955 XtSetArg (args[0], XmNlabelString, label_string);
1956 mnemonic = ((char *)FPGETMESSAGE(82, 28, "R"));
1957 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1958 popup_data->rename_ws_item = children[child_num] =
1959 XmCreatePushButtonGadget (popup_data->popup,
1960 "Rename_Workspace", args, 2);
1961 XmStringFree (label_string);
1963 XtAddCallback(children[child_num++], XmNactivateCallback,
1964 RenameWorkspaceCB, (XtPointer) 0);
1966 popup_data->separator1 = children[child_num++] =
1967 XmCreateSeparatorGadget (popup_data->popup, "sep3", NULL, 0);
1969 popup_data->separator2 = NULL;
1971 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 29, "Help")));
1972 XtSetArg (args[0], XmNlabelString, label_string);
1973 mnemonic = ((char *)FPGETMESSAGE(82, 30, "H"));
1974 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1975 popup_data->help_item = children[child_num++] =
1976 XmCreatePushButtonGadget (popup_data->popup, "Help", args, 2);
1977 XmStringFree (label_string);
1979 XtManageChildren(children, child_num);
1981 switch_data->popup_data = popup_data;