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 libraries 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"
52 #define POPUP_CHILDREN 7
55 extern void ToggleDefaultControl (ControlData *, SubpanelData *, ControlData *);
56 extern void SwitchRenameLabel (Widget, BoxData *);
57 extern Boolean CheckControlTypeFile (ControlData *);
65 /************************************************************************
69 ************************************************************************/
73 XtPointer client_data,
78 ControlData * control_data;
81 long indx = (long) client_data;
85 XtSetArg (args[0], XmNuserData, &control_data);
86 XtGetValues(w, args, 1);
88 if (CheckControlTypeFile (control_data) == False)
91 control_type = (long) (control_data->element_values[CONTROL_TYPE].parsed_value);
93 if (control_type == CONTROL_FILE && !control_data->is_action)
97 aap = (DtActionArg *) XtCalloc(1,sizeof(DtActionArg));
99 aap->argClass = DtACTION_FILE;
101 aap->u.file.name = (char *)
102 control_data->element_values[CONTROL_FILE_NAME].parsed_value;
104 DtActionInvoke (control_data->icon,
105 control_data->actions[indx]->action_name,
106 aap, 1, NULL, NULL, NULL, 1, NULL, NULL);
108 XtFree ((char *) aap);
112 DtActionInvoke (control_data->icon,
113 control_data->actions[indx]->action_name,
114 control_data->actions[indx]->aap,
115 control_data->actions[indx]->count,
116 NULL, NULL, NULL, 1, NULL, NULL);
121 /************************************************************************
124 * The callback function is called off of a menu pick to delete
125 * a specific workspace. The function identifies the index of the
126 * workspace and calls the workspace manager API to perform the delete.
127 * All frontpanel UI processing is performed through a notification
128 * callback issued by the workspace manager after a successful delete.
130 ************************************************************************/
133 DeleteWorkspaceCB (Widget w,
134 XtPointer client_data,
139 long delete_workspace = (long) client_data;
140 SwitchData * switch_data;
144 /* Look up the switch data to get the atom name of the workspace */
147 for (i = 0; i < panel.box_data_count; i++)
149 if (panel.box_data[i]->switch_data != NULL)
151 switch_data = panel.box_data[i]->switch_data;
156 _DtWsmDeleteWorkspace (panel.shell,
157 switch_data->atom_names[delete_workspace]);
163 /************************************************************************
166 * The callback function is called off of a menu pick to rename
167 * a specific workspace. The function identifies the index of the
168 * workspace and calls SwitchRenameLabel() function to change the switch.
169 * button to a text widget for typing the new workspace name and setting.
170 * up the callback to accept the new name upon activation.
172 ************************************************************************/
175 RenameWorkspaceCB (Widget w,
176 XtPointer client_data,
181 long rename_ws = (long) client_data;
182 SwitchData * switch_data = NULL;
186 /* Look up the switch data to get the atom name of the workspace */
189 for (i = 0; i < panel.box_data_count; i++)
191 if (panel.box_data[i]->switch_data != NULL)
193 switch_data = panel.box_data[i]->switch_data;
199 SwitchRenameLabel (switch_data->buttons[rename_ws], panel.box_data[i]);
207 /************************************************************************
210 * The callback function is called off of a menu pick. It generates
211 * a new workspace name and calls the workspace manager API to
212 * create the new workspace. All frontpanel UI processing is
213 * performed through a notification callback issued by the workspace
214 * manager after a successful add.
216 ************************************************************************/
219 AddWorkspaceCB (Widget w,
220 XtPointer client_data,
225 SwitchData * switch_data = NULL;
233 /* Get the beginning part of the new name */
235 temp_name = FPGETMESSAGE (82, 35, "New");
236 slen = strlen (temp_name) + 5 + 1;
237 switch_name = XtCalloc(1, slen);
238 strcpy (switch_name, temp_name);
241 /* Look up the switch data to get the atom name of the workspace */
244 for (i = 0; i < panel.box_data_count; i++)
246 if (panel.box_data[i]->switch_data != NULL)
248 switch_data = panel.box_data[i]->switch_data;
254 /* Generate a new title for the workspace. It should be unique */
255 /* from the existing title. */
266 for (i = 0; i < switch_data->switch_count; i++)
268 if (strcmp (switch_name, switch_data->switch_names[i]) == 0)
271 snprintf (switch_name, slen - 1, "%s_%d", temp_name, append);
278 _DtWsmCreateWorkspace (panel.shell, switch_name);
287 /************************************************************************
291 ************************************************************************/
296 XtPointer client_data,
297 XtPointer call_data )
299 XtUnmanageChild((Widget)client_data);
300 XmUpdateDisplay((Widget)client_data);
301 XtDestroyWidget((Widget)client_data);
307 /************************************************************************
310 * Called from the Ok button on the confimation dialog when a
311 * control deletion is seleted from the popup menu.
313 ************************************************************************/
317 DeleteControlOkCB (Widget w,
318 XtPointer client_data,
323 ControlData * control_data;
324 SubpanelData * subpanel_data;
328 /* Extract the control data from the user data field of the */
329 /* widget pointed to by client data. */
331 XtSetArg (args[0], XmNuserData, &control_data);
332 XtGetValues((Widget) client_data, args, 1);
335 /* Get the subpanel data for the control. Check to see if the */
336 /* control is a real subpanel control or the main panel copy. */
338 if (control_data->parent_type == SUBPANEL)
339 subpanel_data = (SubpanelData *) control_data->parent_data;
341 subpanel_data = (SubpanelData *) control_data->subpanel_data;
344 /* Get rid of the dialog and call the funtion to delete the control */
346 XtUnmanageChild ((Widget) client_data);
347 XmUpdateDisplay ((Widget) client_data);
349 DeleteSubpanelControl (subpanel_data, control_data);
351 XtDestroyWidget ((Widget) client_data);
357 /************************************************************************
361 ************************************************************************/
366 XtPointer client_data,
367 XtPointer call_data )
369 ControlData * control_data;
372 XtSetArg (args[0], XmNuserData, &control_data);
373 XtGetValues((Widget)client_data, args, 1);
375 XtUnmanageChild((Widget)client_data);
376 XmUpdateDisplay((Widget)client_data);
378 DeleteSubpanel(control_data);
380 XtDestroyWidget((Widget)client_data);
384 /************************************************************************
388 ************************************************************************/
391 DeleteControlCB (Widget w,
392 XtPointer client_data,
397 ControlData * control_data;
399 SubpanelData *subpanel_data;
402 String title, del_ctrl, ctrl_name, ctrl_label, del_msg, message;
403 long indx = (long) client_data;
406 XtSetArg (args[0], XmNuserData, &control_data);
407 XtGetValues (w, args, 1);
409 del_ctrl = FPGETMESSAGE(82, 31, "Delete Control:");
410 del_ctrl = XtNewString (del_ctrl);
412 ctrl_label = (char *)
413 control_data->element_values[CONTROL_LABEL].parsed_value;
415 control_data->element_values[CONTROL_NAME].parsed_value;
417 if (ctrl_label == NULL)
418 ctrl_label = ctrl_name;
420 if (control_data->element_values[CONTROL_LOCKED].parsed_value)
422 title = FPGETMESSAGE(82,1, "Workspace Manager - Delete Locked Control Error");
423 title = XtNewString (title);
425 del_msg = FPGETMESSAGE(82,5, "This control cannot be deleted because it is locked.");
426 del_msg = XtNewString (del_msg);
428 message = XtMalloc (sizeof(char) *
429 (strlen(del_ctrl) + strlen(ctrl_label) +
430 strlen(del_msg) + 4));
432 sprintf(message, "%s %s\n\n%s", del_ctrl, ctrl_label, del_msg);
434 _DtMessage (XtParent(w), title, message, NULL, NULL);
443 title = FPGETMESSAGE(82,2, "Workspace Manager - Delete Control");
444 title = XtNewString (title);
446 if (SessionFileNameLookup (ctrl_name, CONTROL, (char *) control_data->element_values[CONTROL_CONTAINER_NAME].parsed_value, SUBPANEL) == NULL)
447 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?");
449 del_msg = FPGETMESSAGE(82,6, "Are you sure you want to delete this control?");
451 del_msg = XtNewString (del_msg);
453 message = XtMalloc (sizeof(char) *
454 (strlen(del_ctrl) + strlen(ctrl_label) +
455 strlen(del_msg) + 4));
457 sprintf(message, "%s %s\n\n%s", del_ctrl, ctrl_label, del_msg);
460 /* Get the subpanel data for the control. Check to see if the */
461 /* control is a real subpanel control or the main panel copy. */
463 if (control_data->parent_type == SUBPANEL)
464 subpanel_data = (SubpanelData *) control_data->parent_data;
466 subpanel_data = (SubpanelData *) control_data->subpanel_data;
468 dialog = _DtMessageDialog(subpanel_data->shell,title,message,NULL,TRUE,
470 dialog = _DtMessageDialog(panel.shell, title, message, NULL, TRUE,
472 DeleteCancelCB, DeleteControlOkCB, NULL, NULL, False,
475 XtSetArg (args[0], XmNuserData, control_data);
476 XtSetArg (args[1], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
477 XtSetValues (dialog, args, 2);
490 /************************************************************************
493 * This callback initiates a subpanel control being toggled into
496 ************************************************************************/
499 ToggleControlCB (Widget w,
500 XtPointer client_data,
505 SubpanelData * subpanel_data = (SubpanelData *) client_data;
506 ControlData * control_data;
507 long indx = (long) client_data;
510 XtSetArg (args[0], XmNuserData, &control_data);
511 XtGetValues(w, args, 1);
513 ToggleDefaultControl (subpanel_data->parent_control_data,
514 subpanel_data, control_data);
520 /************************************************************************
524 ************************************************************************/
527 AddSubpanelCB (Widget w,
528 XtPointer client_data,
533 ControlData * control_data;
534 long indx = (long) client_data;
537 XtSetArg (args[0], XmNuserData, &control_data);
538 XtGetValues(w, args, 1);
540 AddSubpanel(control_data);
546 /************************************************************************
550 ************************************************************************/
553 DeleteSubpanelCB (Widget w,
554 XtPointer client_data,
559 ControlData * control_data;
560 SubpanelData * subpanel_data;
562 String title, message, del_spanel, spanel_name, del_msg;
565 XtSetArg (args[0], XmNuserData, &control_data);
566 XtGetValues(w, args, 1);
568 subpanel_data = (SubpanelData *) control_data->subpanel_data;
570 subpanel_data = (SubpanelData *) control_data->parent_data;
572 del_spanel = FPGETMESSAGE(82, 33, "Delete Subpanel:");
573 del_spanel = XtNewString (del_spanel);
575 spanel_name = (char *)
576 subpanel_data->element_values[SUBPANEL_NAME].parsed_value;
578 if (subpanel_data->element_values[SUBPANEL_LOCKED].parsed_value)
580 title = FPGETMESSAGE(82,3, "Workspace Manager - Delete Locked Subpanel Error");
581 title = XtNewString (title);
583 del_msg = FPGETMESSAGE(82,7, "This subpanel cannot be deleted because it is locked.");
584 del_msg = XtNewString (del_msg);
586 message = XtMalloc (sizeof(char) *
587 (strlen(del_spanel) + strlen(spanel_name) +
588 strlen(del_msg) + 4));
590 sprintf(message, "%s %s\n\n%s", del_spanel, spanel_name, del_msg);
592 _DtMessage (XtParent(w), title, message, NULL, NULL);
601 title = FPGETMESSAGE(82,4, "Workspace Manager - Delete Subpanel");
602 title = XtNewString (title);
604 if (subpanel_data->control_data_count > 0)
606 if (SessionFileNameLookup (spanel_name, SUBPANEL, (char *)
607 subpanel_data->element_values[SUBPANEL_CONTAINER_NAME].parsed_value,
609 del_msg = FPGETMESSAGE(82,34,
610 "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?");
612 del_msg = FPGETMESSAGE(82,8, "This subpanel contains more than one control.\n\nAre you sure you want to delete this subpanel?");
615 del_msg = FPGETMESSAGE(82,9, "Are you sure you want to delete this subpanel?");
617 del_msg = XtNewString (del_msg);
619 message = XtMalloc (sizeof(char) *
620 (strlen(del_spanel) + strlen(spanel_name) +
621 strlen(del_msg) + 4));
623 sprintf(message, "%s %s\n\n%s", del_spanel, spanel_name, del_msg);
626 dialog = _DtMessageDialog(subpanel_data->shell,title,message,NULL,TRUE,
628 dialog = _DtMessageDialog(panel.shell, title, message, NULL, TRUE,
630 DeleteCancelCB, DeleteSubpanelOkCB, NULL, NULL, False,
633 XtSetArg (args[0], XmNuserData, control_data);
634 XtSetArg (args[1], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
635 XtSetValues(dialog, args, 2);
648 /************************************************************************
650 * PostWorkspacePopupMenu
652 ************************************************************************/
656 PostWorkspacePopupMenu (Widget w,
657 XtPointer client_data,
664 SwitchData * switch_data = NULL;
665 XButtonEvent * b_event = (XButtonEvent *) event;
667 /* only use BMENU press events */
669 if (b_event->button != wmGD.bMenuButton) return;
671 for (i = 0; i < panel.box_data_count; i++)
673 box_data = panel.box_data[i];
675 if (box_data->switch_data != NULL)
676 switch_data = box_data->switch_data;
679 if (switch_data != NULL)
680 XtManageChild(switch_data->popup_data->popup);
686 /************************************************************************
690 ************************************************************************/
693 PostPopupMenu (Widget w,
694 XtPointer client_data,
699 XButtonEvent * b_event = (XButtonEvent *) event;
701 /* only use BMENU press events */
703 if (b_event->button != wmGD.bMenuButton) return;
705 XtManageChild(panel.popup_data->popup);
711 /************************************************************************
715 ************************************************************************/
718 GetBoxDataFromForm (Widget form,
719 BoxData ** box_data_rtn)
726 for (i = 0; i < panel.box_data_count; i++)
728 box_data = panel.box_data[i];
730 if (box_data == *box_data_rtn) continue;
732 if (box_data->left_control_form == form ||
733 box_data->right_control_form == form)
735 *box_data_rtn = box_data;
744 /************************************************************************
746 * GetSubpanelDataFromForm
748 ************************************************************************/
751 GetSubpanelDataFromForm (Widget form,
752 SubpanelData ** subpanel_data_rtn)
757 ControlData * control_data;
758 SubpanelData * subpanel_data;
761 for (i = 0; i < panel.box_data_count; i++)
763 box_data = panel.box_data[i];
765 for (j = 0; j < box_data->control_data_count; j++)
767 control_data = box_data->control_data[j];
769 if (control_data->subpanel_data != NULL)
771 subpanel_data = control_data->subpanel_data;
773 if (subpanel_data == *subpanel_data_rtn) continue;
775 if (subpanel_data->form == form)
777 *subpanel_data_rtn = subpanel_data;
789 /************************************************************************
793 ************************************************************************/
796 KeyMenuPosition (Widget popup, Widget focus_widget)
800 XButtonPressedEvent bevent; /* synthetic button press event */
802 Position root_x, root_y;
807 /* get the gadget's x and y */
809 XtSetArg (args[0], XmNx, &x);
810 XtSetArg (args[1], XmNy, &y);
811 XtGetValues (focus_widget, args, 2);
814 /* get the focus widget's parent since the focus widget is a gadget */
816 parent = XtParent (focus_widget);
819 /* get the root coordinates of the gadget */
821 XtTranslateCoords (parent, x, y, &root_x, &root_y);
824 /* XmMenuPosition() only uses the root_x and root_y */
825 /* of the event for positioning */
827 bevent.x_root = root_x;
828 bevent.y_root = root_y;
831 /* set the menu positioning */
833 XmMenuPosition (popup, &bevent);
840 /************************************************************************
844 ************************************************************************/
847 GetMainControlData (BoxData * box_data,
853 ControlData * control_data;
854 Boolean found = False;
856 for (i = 0; i < box_data->control_data_count; i++)
858 control_data = box_data->control_data[i];
860 if (control_data->icon == focus_widget)
867 if (!found) return NULL;
869 return (control_data);
875 /************************************************************************
877 * GetSubpanelControlData
879 ************************************************************************/
882 GetSubpanelControlData (SubpanelData * subpanel_data,
888 ControlData * control_data;
889 Boolean found = False;
891 if ( subpanel_data->dropzone == focus_widget )
894 if (subpanel_data->main_panel_icon_copy == focus_widget ||
895 subpanel_data->parent_control_data->indicator == focus_widget)
897 return (subpanel_data->parent_control_data);
901 for (i = 0; i < subpanel_data->control_data_count; i++)
903 control_data = subpanel_data->control_data[i];
904 if (control_data->icon == focus_widget ||
905 control_data->indicator == focus_widget)
912 if (!found) return NULL;
914 return (control_data);
920 /************************************************************************
922 * SetupActionMenuItems
923 * Set up the action list for display in the popup menu for a
924 * control. This may require creating additional menu items is
925 * the action list for this control is greater that previously
926 * encountered or it may require umanaging menu item is there are
930 * w: The parent of the menu items.
931 * control_data: The control the menu is being set up for.
932 * action_item: A pointer to the array of menu items for the actions.
933 * action_count: A pointer to the total number of action items.
935 ************************************************************************/
939 SetupActionMenuItems (Widget w,
940 ControlData * control_data,
941 PopupData * popup_data,
942 Widget * action_item,
947 XmString label_string;
949 long num_actions = 0;
950 long action_index = *action_count;
954 /* Count the action list for the control in order to adjust */
955 /* the number of action menu items within the menu. */
957 if (control_data != NULL)
958 while (control_data->actions[num_actions] != NULL)
961 if (num_actions > *action_count )
963 action_item = (Widget *) XtRealloc((char *) action_item,
964 sizeof(Widget) * num_actions);
966 for (i = 0; i < num_actions - *action_count; i++)
968 action_item[action_index] =
969 XmCreatePushButtonGadget (w, "action_button", args, 0);
973 XtManageChild (action_item[action_index]);
974 XtAddCallback (action_item[action_index], XmNactivateCallback,
975 ActionCB, (XtPointer)action_index);
982 for (i = 0; i < *action_count; i++)
983 XtUnmanageChild (action_item[i]);
986 for (i = 0; i < num_actions ; i++)
988 XtSetArg (args[0], XmNuserData, control_data);
989 XtSetValues (action_item[i], args, 1);
992 for (i = 0; i < num_actions; i++)
994 if (control_data->actions[i]->action_label != NULL)
996 XmStringCreateLocalized (control_data->actions[i]->action_label);
999 XmStringCreateLocalized (control_data->actions[i]->action_name);
1001 XtSetArg (args[0], XmNlabelString, label_string);
1002 XtSetArg (args[1], XmNuserData, control_data);
1003 XtSetValues (action_item[i], args, 2);
1004 XmStringFree (label_string);
1007 for (i = 0; i < num_actions; i++)
1009 if (!XtIsManaged (action_item[i]))
1010 XtManageChild (action_item[i]);
1013 if (num_actions > 0)
1014 XtManageChild(popup_data->separator1);
1016 XtUnmanageChild(popup_data->separator1);
1023 /************************************************************************
1025 * UpdateMainControlMenu
1026 * Set up the label and the add/delete subpanel menu item for the
1030 * control_data: The control overwhich the menu is being posted.
1032 ************************************************************************/
1036 UpdateMainControlMenu (ControlData * control_data)
1040 XmString label_string;
1042 char * control_label;
1047 ElementValue * old_element_values;
1049 /* Save element values of control then load values of default control */
1051 if (control_data->subpanel_data != NULL &&
1052 control_data != control_data->subpanel_data->default_control)
1054 old_element_values = control_data->element_values;
1055 control_data->element_values =
1056 control_data->subpanel_data->default_control->element_values;
1059 /* Set the title of the menu */
1062 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1064 if (control_label == NULL)
1066 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1068 label_string = XmStringCreateLocalized (control_label);
1069 XtSetArg (args[0], XmNlabelString, label_string);
1070 XtSetValues (panel.popup_data->popup_title, args, 1);
1071 XmStringFree (label_string);
1074 /* If the control is blank, remove the add/delete subpanel item. */
1075 /* Otherwise, if there is a subpanel, activate the delete subpanel */
1076 /* item. Else activate the add subpanel item. */
1078 control_type = (long)control_data->element_values[CONTROL_TYPE].parsed_value;
1080 if (control_type != CONTROL_BLANK)
1082 XtManageChild (panel.popup_data->modify_subpanel_item);
1084 if (control_data->subpanel_data == NULL)
1086 if (panel.popup_data->subpanel_add_state != True)
1089 XmStringCreateLocalized ((FPGETMESSAGE(82, 10, "Add Subpanel")));
1090 XtSetArg (args[0], XmNlabelString, label_string);
1091 mnemonic = ((char *)FPGETMESSAGE(82, 11, "A"));
1092 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1093 XtSetArg (args[2], XmNuserData, control_data);
1094 XtSetValues (panel.popup_data->modify_subpanel_item, args, 3);
1096 XmStringFree (label_string);
1098 XtRemoveCallback (panel.popup_data->modify_subpanel_item,
1099 XmNactivateCallback, DeleteSubpanelCB, NULL);
1100 XtAddCallback (panel.popup_data->modify_subpanel_item,
1101 XmNactivateCallback, AddSubpanelCB, NULL);
1103 panel.popup_data->subpanel_add_state = True;
1107 XtSetArg (args[0], XmNuserData, control_data);
1108 XtSetValues (panel.popup_data->modify_subpanel_item, args, 1);
1113 if (panel.popup_data->subpanel_add_state == True)
1116 XmStringCreateLocalized ((FPGETMESSAGE(82, 12, "Delete Subpanel")));
1117 XtSetArg (args[0], XmNlabelString, label_string);
1118 mnemonic = ((char *)FPGETMESSAGE(82, 13, "D"));
1119 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1120 XtSetArg (args[2], XmNuserData, control_data);
1121 XtSetValues (panel.popup_data->modify_subpanel_item, args, 3);
1123 XmStringFree (label_string);
1125 XtRemoveCallback (panel.popup_data->modify_subpanel_item,
1126 XmNactivateCallback, AddSubpanelCB, NULL);
1127 XtAddCallback (panel.popup_data->modify_subpanel_item,
1128 XmNactivateCallback, DeleteSubpanelCB, NULL);
1130 panel.popup_data->subpanel_add_state = False;
1134 XtSetArg (args[0], XmNuserData, control_data);
1135 XtSetValues (panel.popup_data->modify_subpanel_item, args, 1);
1141 XtUnmanageChild (panel.popup_data->modify_subpanel_item);
1144 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1146 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1147 ControlTopicHelpCB, (XtPointer)control_data);
1149 XtUnmanageChild (panel.popup_data->deinstall_item);
1150 XtUnmanageChild (panel.popup_data->toggle_item);
1152 /* Restore element values to control. */
1154 if (control_data->subpanel_data != NULL &&
1155 control_data != control_data->subpanel_data->default_control)
1157 control_data->element_values = old_element_values;
1165 /************************************************************************
1167 * UpdateSubpanelControlMenu
1168 * Set the elements of the popup menu for a subpanel control
1169 * item to its proper values before it is made visible.
1172 * subpanel_data: The subpanel in which the menu is to be
1175 * control_data: The control that the menu is being brought up for.
1177 ************************************************************************/
1181 UpdateSubpanelControlMenu (SubpanelData * subpanel_data,
1182 ControlData * control_data)
1186 XmString label_string;
1188 char * control_label = NULL;
1190 /* Set the title of the menu */
1195 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1197 if (control_label == NULL)
1199 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1203 control_label = FPGETMESSAGE(82, 36, "Install Icon");
1206 label_string = XmStringCreateLocalized (control_label);
1207 XtSetArg (args[0], XmNlabelString, label_string);
1208 XtSetValues (panel.popup_data->popup_title, args, 1);
1209 XmStringFree (label_string);
1212 /* Set the sensitivity of the control deinstall and toggle menu item */
1214 if (control_data == NULL)
1216 XtSetSensitive (panel.popup_data->deinstall_item, False);
1217 XtSetSensitive (panel.popup_data->toggle_item, False);
1219 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1221 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1222 GeneralTopicHelpCB, (XtPointer)INSTALL_ZONE);
1226 XtSetSensitive (panel.popup_data->deinstall_item, True);
1227 XtSetArg (args[0], XmNuserData, control_data);
1228 XtSetValues(panel.popup_data->deinstall_item, args, 1);
1230 XtRemoveAllCallbacks (panel.popup_data->deinstall_item,
1231 XmNactivateCallback);
1233 XtAddCallback (panel.popup_data->deinstall_item, XmNactivateCallback,
1234 DeleteControlCB, (XtPointer) NULL);
1236 if ( control_data == subpanel_data->default_control)
1237 XtSetSensitive (panel.popup_data->toggle_item, False);
1239 XtSetSensitive (panel.popup_data->toggle_item, True);
1241 XtSetArg (args[0], XmNuserData, control_data);
1242 XtSetValues(panel.popup_data->toggle_item, args, 1);
1244 XtRemoveAllCallbacks (panel.popup_data->toggle_item,
1245 XmNactivateCallback);
1247 XtAddCallback (panel.popup_data->toggle_item, XmNactivateCallback,
1248 ToggleControlCB, (XtPointer) subpanel_data);
1250 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1252 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1253 ControlTopicHelpCB, (XtPointer)control_data);
1256 XtManageChild (panel.popup_data->deinstall_item);
1258 if (! (subpanel_data->parent_control_data->
1259 element_values[CONTROL_LOCKED].parsed_value))
1260 XtManageChild (panel.popup_data->toggle_item);
1262 XtUnmanageChild (panel.popup_data->toggle_item);
1264 XtUnmanageChild (panel.popup_data->modify_subpanel_item);
1270 /************************************************************************
1273 * Callback function which updates the popup menu for main panel
1274 * and subpanel controls before the menu is posted.
1276 ************************************************************************/
1280 PopupMenu (Widget w,
1281 XtPointer client_data,
1282 XtPointer call_data)
1286 XmAnyCallbackStruct * callback;
1288 Widget form, focus_widget;
1289 XmManagerWidget mgr;
1290 SubpanelData * subpanel_data = NULL;
1291 ControlData * control_data;
1292 BoxData * box_data = NULL;
1293 XmString label_string;
1295 long control_type, action_count = panel.popup_data->action_count;
1297 callback = (XmAnyCallbackStruct *) call_data;
1298 event = (XEvent *) callback->event;
1301 /* Get the form where the menu was posted from. */
1303 form = XmGetPostedFromWidget(w);
1305 XtSetArg (args[0], XmNuserData, &control_type);
1306 XtGetValues (form, args, 1);
1308 if (control_type == CONTROL)
1310 GetBoxDataFromForm (form, &box_data);
1311 subpanel_data = NULL;
1313 else if (control_type == SUBPANEL)
1315 GetSubpanelDataFromForm (form, &subpanel_data);
1319 if (event->type == ButtonPress)
1321 /* Change to use new Xme function when porting to Motif 2.0 */
1322 /* Get gadget at x, y position */
1324 focus_widget = (Widget) XmObjectAtPoint (form, event->xbutton.x,
1326 if (focus_widget == NULL)
1329 /* set the menu positioning */
1331 XmMenuPosition (panel.popup_data->popup, (XButtonPressedEvent *)event);
1335 /* get the widget that has the traversal focus */
1337 focus_widget = XmGetFocusWidget (form);
1340 /* set the menu positioning for non button events */
1342 KeyMenuPosition (panel.popup_data->popup, focus_widget);
1345 if (control_type == CONTROL)
1347 control_data = GetMainControlData (box_data, focus_widget);
1349 /* Find the right subpanel data if main control is not default */
1352 UpdateMainControlMenu (control_data);
1354 if (control_data->subpanel_data != NULL &&
1355 control_data != control_data->subpanel_data->default_control)
1357 subpanel_data = control_data->subpanel_data;
1358 control_data = control_data->subpanel_data->default_control;
1359 control_data->subpanel_data = subpanel_data;
1360 UpdateMainControlMenu (control_data);
1363 SetupActionMenuItems (w, control_data, panel.popup_data,
1364 panel.popup_data->action_item, &action_count);
1367 else if (control_type == SUBPANEL)
1369 control_data = GetSubpanelControlData (subpanel_data, focus_widget);
1371 UpdateSubpanelControlMenu (subpanel_data, control_data);
1373 SetupActionMenuItems (w, control_data, panel.popup_data,
1374 panel.popup_data->action_item, &action_count);
1377 panel.popup_data->action_count = action_count;
1383 /************************************************************************
1387 ************************************************************************/
1391 CreatePopupMenu (Widget w)
1395 Widget children[20];
1398 PopupData * popup_data;
1399 long i, child_num = 0;
1400 XmString label_string;
1402 popup_data = panel.popup_data = (PopupData *) XtMalloc(sizeof(PopupData));
1405 XtSetArg (args[i], XmNwhichButton, wmGD.bMenuButton); i++;
1407 popup_data->popup = XmCreatePopupMenu(w, "FPPopup", args, i);
1409 popup_data->add_ws_item = NULL;
1411 XtAddCallback (popup_data->popup, XmNmapCallback, PopupMenu,
1414 popup_data->popup_title = children[child_num++] =
1415 XmCreateLabelGadget(popup_data->popup, "title", NULL, 0);
1417 children[child_num++] = XmCreateSeparatorGadget(popup_data->popup,
1419 children[child_num++] = XmCreateSeparatorGadget(popup_data->popup,
1422 popup_data->action_item = (Widget *) XtMalloc(sizeof(Widget) * 5);
1423 popup_data->action_count = 0;
1425 for (i = 0; i < 5; i++)
1427 children[child_num] = popup_data->action_item[i] =
1428 XmCreatePushButtonGadget(popup_data->popup, "action_button", args, 0);
1429 popup_data->action_count++;
1431 XtManageChild (popup_data->action_item[i]);
1432 XtAddCallback (children[child_num++], XmNactivateCallback,
1433 ActionCB, (XtPointer) i);
1436 popup_data->separator1 = children[child_num++] =
1437 XmCreateSeparatorGadget (popup_data->popup, "sep3", NULL, 0);
1440 XmStringCreateLocalized((FPGETMESSAGE(82, 14, "Copy To Main Panel")));
1441 XtSetArg (args[0], XmNlabelString, label_string);
1442 mnemonic = ((char *)FPGETMESSAGE(82, 15, "C"));
1443 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1444 popup_data->toggle_item = children[child_num] =
1445 XmCreatePushButtonGadget (popup_data->popup, "Toggle_Control", args, 2);
1446 XmStringFree (label_string);
1448 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 16, "Delete")));
1449 XtSetArg (args[0], XmNlabelString, label_string);
1450 mnemonic = ((char *)FPGETMESSAGE(82, 17, "D"));
1451 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1452 popup_data->deinstall_item = children[child_num] =
1453 XmCreatePushButtonGadget(popup_data->popup, "Delete_Control",
1455 XmStringFree (label_string);
1458 XmStringCreateLocalized ((FPGETMESSAGE(82, 10, "Add Subpanel")));
1459 XtSetArg (args[0], XmNlabelString, label_string);
1460 mnemonic = ((char *)FPGETMESSAGE(82, 11, "A"));
1461 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1462 popup_data->modify_subpanel_item = children[child_num] =
1463 XmCreatePushButtonGadget (popup_data->popup, "Add_Subpanel", args, 2);
1464 XmStringFree (label_string);
1466 XtAddCallback(children[child_num++], XmNactivateCallback, AddSubpanelCB,
1468 popup_data->subpanel_add_state = True;
1470 popup_data->separator2 = children[child_num++] =
1471 XmCreateSeparatorGadget(popup_data->popup, "sep4", NULL, 0);
1473 label_string = XmStringCreateLocalized ((FPGETMESSAGE(82, 18, "Help")));
1474 XtSetArg (args[0], XmNlabelString, label_string);
1475 mnemonic = ((char *)FPGETMESSAGE(82, 19, "H"));
1476 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1477 popup_data->help_item = children[child_num++] =
1478 XmCreatePushButtonGadget (popup_data->popup, "Help", args, 2);
1479 XmStringFree (label_string);
1481 XtManageChildren(children, child_num);
1487 /************************************************************************
1489 * CreateActionButtons
1490 * Show the the action menu items and hide workspace menu items since
1491 * we are over a control.
1494 ************************************************************************/
1498 CreateActionButtons (Widget w,
1499 SwitchData * switch_data,
1500 ControlData * control_data)
1504 PopupData * popup_data = switch_data->popup_data;
1505 long action_count = popup_data->action_count;
1507 XmString label_string;
1508 char * control_label;
1510 /* Set the title of the menu */
1513 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1515 if (control_label == NULL)
1517 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1519 label_string = XmStringCreateLocalized (control_label);
1520 XtSetArg (args[0], XmNlabelString, label_string);
1521 XtSetValues (popup_data->popup_title, args, 1);
1522 XmStringFree (label_string);
1524 /* show actions items */
1525 SetupActionMenuItems(w, control_data, popup_data,
1526 popup_data->action_item, &action_count);
1527 popup_data->action_count = action_count;
1529 /* hide add and delete workspace items */
1530 XtUnmanageChild(popup_data->add_ws_item);
1531 XtUnmanageChild(popup_data->delete_ws_item);
1532 XtUnmanageChild(popup_data->rename_ws_item);
1534 /* reset the help callback to reflect switch control help */
1535 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1536 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1537 ControlTopicHelpCB, control_data);
1544 /************************************************************************
1546 * ShowWorkspaceItems
1547 * Don't show the the action menu items since we are not over a control.
1548 * Reset the activate callbacks with the latest data.
1550 ************************************************************************/
1554 ShowWorkspaceItems (SwitchData * switch_data,
1555 Widget focus_widget)
1559 PopupData * popup_data = switch_data->popup_data;
1562 XmString label_string;
1563 char * control_label;
1569 /* hide actions items */
1571 for (i = 0; i < popup_data->action_count; i++)
1572 XtUnmanageChild (popup_data->action_item[i]);
1575 /* show add and delete workspace items */
1577 XtManageChild (popup_data->add_ws_item);
1578 XtManageChild (popup_data->delete_ws_item);
1579 XtManageChild (popup_data->rename_ws_item);
1582 /* reset the activate callback to reflect current button index */
1584 XtRemoveAllCallbacks (popup_data->delete_ws_item, XmNactivateCallback);
1585 for (i = 0; i < switch_data->switch_count &&
1586 switch_data->buttons[i] != NULL; i++)
1588 if (switch_data->buttons[i] == focus_widget) break;
1592 /* If we didn't find the switch button to post the menu for, it */
1593 /* must be in edit mode so the correct menu is the active switch */
1595 if (i >= switch_data->switch_count)
1596 i = switch_data->active_switch;
1599 /* Set the title of the menu */
1601 format = strdup (FPGETMESSAGE(82, 20, "%1$s %2$s"));
1602 ws = strdup (FPGETMESSAGE(82, 21, "Workspace"));
1603 ws_name = switch_data->switch_names[i];
1605 control_label = XtMalloc (sizeof(char) * (strlen(ws) + strlen(ws_name) + 4));
1607 sprintf (control_label, format, ws, ws_name);
1611 label_string = XmStringCreateLocalized (control_label);
1612 XtSetArg (args[0], XmNlabelString, label_string);
1613 XtSetValues (popup_data->popup_title, args, 1);
1614 XmStringFree (label_string);
1615 XtFree(control_label);
1617 XtAddCallback (popup_data->delete_ws_item, XmNactivateCallback,
1618 DeleteWorkspaceCB, (XtPointer) i);
1620 /* reset the activate callback to reflect current button index */
1621 XtRemoveAllCallbacks (popup_data->rename_ws_item, XmNactivateCallback);
1622 XtAddCallback (popup_data->rename_ws_item, XmNactivateCallback,
1623 RenameWorkspaceCB, (XtPointer) i);
1625 /* reset the help callback to reflect switch button help */
1626 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1627 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1628 GeneralTopicHelpCB, (XtPointer) SWITCH_BUTTON);
1630 XtManageChild(popup_data->separator1);
1636 /************************************************************************
1638 * ShowPartialWorkspaceItems
1639 * Don't show the delete workspace item since we are not over
1640 * a workspace button and don't show the action menu items since we are
1641 * not over a control. Reset the activate callback with the latest data.
1643 ************************************************************************/
1646 ShowPartialWorkspaceItems(SwitchData * switch_data)
1650 PopupData * popup_data = switch_data->popup_data;
1653 XmString label_string;
1655 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 22, "Switch Area")));
1656 XtSetArg (args[0], XmNlabelString, label_string);
1657 XtSetValues (popup_data->popup_title, args, 1);
1658 XmStringFree (label_string);
1660 /* hide actions items */
1661 for (i = 0; i < popup_data->action_count; i++)
1662 XtUnmanageChild (popup_data->action_item[i]);
1664 /* show add workspace item */
1665 XtManageChild (popup_data->add_ws_item);
1667 /* hide delete and rename workspace items */
1668 XtUnmanageChild (popup_data->delete_ws_item);
1669 XtUnmanageChild (popup_data->rename_ws_item);
1671 /* reset the help callback to reflect switch area help */
1672 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1673 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1674 SwitchTopicHelpCB, (XtPointer)switch_data);
1676 XtManageChild(popup_data->separator1);
1683 /************************************************************************
1685 * GetSwitchDataFromForm
1687 ************************************************************************/
1692 GetSwitchDataFromForm (Widget form,
1693 SwitchData ** switch_data_rtn)
1700 for (i = 0; i < panel.box_data_count; i++)
1702 box_data = panel.box_data[i];
1704 if (box_data->switch_form == form)
1706 *switch_data_rtn = box_data->switch_data;
1715 /************************************************************************
1717 * GetSwtichControlData
1719 ************************************************************************/
1722 static ControlData *
1723 GetSwitchControlData (SwitchData * switch_data,
1724 Widget focus_widget)
1729 ControlData * control_data;
1730 Boolean found = False;
1732 for (i = 0; i < switch_data->control_data_count; i++)
1734 control_data = switch_data->control_data[i];
1736 if (control_data->icon == focus_widget)
1743 if (!found) return NULL;
1745 return (control_data);
1752 /************************************************************************
1756 ************************************************************************/
1759 WSPopupMenu (Widget w,
1760 XtPointer client_data,
1761 XtPointer call_data)
1765 XmManagerWidget mgr = (XmManagerWidget) w;
1766 int num_children = mgr->composite.num_children;
1767 XmAnyCallbackStruct * callback;
1769 Widget form, focus_widget;
1770 SwitchData * switch_data;
1771 ControlData * control_data = NULL;
1772 Boolean is_button = False;
1777 callback = (XmAnyCallbackStruct *) call_data;
1778 event = (XEvent *) callback->event;
1781 /* get the form where the menu was posted from */
1783 form = XmGetPostedFromWidget (w);
1785 GetSwitchDataFromForm (form, &switch_data);
1788 if (event->type == ButtonPress)
1791 /* Change to use new Xme function when porting to Motif 2.0 */
1792 /* Get gadget at x, y position */
1794 focus_widget = (Widget) XmObjectAtPoint (form, event->xbutton.x,
1797 if (focus_widget == NULL)
1799 XtSetArg (args[0], XmNx, &x);
1800 XtSetArg (args[1], XmNy, &y);
1801 XtGetValues(switch_data->rc, args, 2);
1803 focus_widget = (Widget) XmObjectAtPoint (switch_data->rc,
1804 event->xbutton.x - x,
1805 event->xbutton.y - y);
1809 control_data = GetSwitchControlData (switch_data, focus_widget);
1812 /* set the menu positioning */
1814 XmMenuPosition (switch_data->popup_data->popup,
1815 (XButtonPressedEvent *) event);
1820 /* get the widget that has the traversal focus */
1822 focus_widget = XmGetFocusWidget (form);
1824 control_data = GetSwitchControlData (switch_data, focus_widget);
1826 if (control_data == NULL)
1829 /* set the menu positioning for non button events */
1831 KeyMenuPosition (switch_data->popup_data->popup, focus_widget);
1834 if (focus_widget != NULL)
1837 /* The mouse is over a button in the switch area */
1838 ShowWorkspaceItems (switch_data, focus_widget);
1841 if (control_data != NULL)
1844 (long) control_data->element_values[CONTROL_TYPE].parsed_value;
1846 if (control_type != CONTROL_BLANK)
1847 /* The mouse is over a control in the switch area */
1848 CreateActionButtons (w, switch_data, control_data);
1850 /* The mouse is over a blank control in the switch area */
1851 ShowPartialWorkspaceItems (switch_data);
1856 * The mouse is over area other than the buttons and control
1857 * in the switch area
1859 ShowPartialWorkspaceItems (switch_data);
1865 * The mouse is over area other than the buttons and control
1866 * in the switch area
1868 ShowPartialWorkspaceItems (switch_data);
1874 /************************************************************************
1876 * CreateWorkspacePopupMenu
1878 ************************************************************************/
1882 CreateWorkspacePopupMenu (Widget w,
1883 SwitchData * switch_data)
1887 Widget children[20];
1888 XmString label_string;
1891 long i, child_num = 0;
1892 PopupData * popup_data;
1894 popup_data = (PopupData *) XtMalloc(sizeof(PopupData));
1897 XtSetArg (args[i], XmNwhichButton, wmGD.bMenuButton); i++;
1899 popup_data->popup = XmCreatePopupMenu(w, "WSPopup", args, i);
1901 popup_data->deinstall_item = NULL;
1902 popup_data->toggle_item = NULL;
1903 popup_data->modify_subpanel_item = NULL;
1904 popup_data->subpanel_add_state = True;
1906 XtAddCallback(popup_data->popup, XmNmapCallback, WSPopupMenu,
1907 (XtPointer) switch_data);
1909 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 22, "Switch Area")));
1910 XtSetArg (args[0], XmNlabelString, label_string);
1911 popup_data->popup_title = children[child_num++] =
1912 XmCreateLabelGadget (popup_data->popup, "title", args, 1);
1913 XmStringFree (label_string);
1915 children[child_num++] = XmCreateSeparatorGadget (popup_data->popup, "sep1",
1917 children[child_num++] = XmCreateSeparatorGadget (popup_data->popup, "sep2",
1920 popup_data->action_item = (Widget *) XtMalloc(sizeof(Widget) * 5);
1921 popup_data->action_count = 0;
1923 for (i = 0; i < 5; i++)
1925 children[child_num] = popup_data->action_item[i] =
1926 XmCreatePushButtonGadget (popup_data->popup, "action_button", args, 0);
1927 popup_data->action_count++;
1929 XtManageChild (popup_data->action_item[i]);
1930 XtAddCallback (children[child_num++], XmNactivateCallback,
1931 ActionCB, (XtPointer) i);
1935 XmStringCreateLocalized ((FPGETMESSAGE(82, 23, "Add Workspace")));
1936 XtSetArg (args[0], XmNlabelString, label_string);
1937 mnemonic = ((char *)FPGETMESSAGE(82, 24, "A"));
1938 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1939 popup_data->add_ws_item = children[child_num] =
1940 XmCreatePushButtonGadget (popup_data->popup, "Add_Workspace", args, 2);
1941 XmStringFree (label_string);
1943 XtAddCallback(children[child_num++], XmNactivateCallback, AddWorkspaceCB,
1946 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 25, "Delete")));
1947 XtSetArg (args[0], XmNlabelString, label_string);
1948 mnemonic = ((char *)FPGETMESSAGE(82, 26, "D"));
1949 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1950 popup_data->delete_ws_item = children[child_num] =
1951 XmCreatePushButtonGadget (popup_data->popup,
1952 "Delete_Workspace", args, 2);
1953 XmStringFree (label_string);
1955 XtAddCallback(children[child_num++], XmNactivateCallback,
1956 DeleteWorkspaceCB, (XtPointer) 0);
1958 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 27, "Rename")));
1959 XtSetArg (args[0], XmNlabelString, label_string);
1960 mnemonic = ((char *)FPGETMESSAGE(82, 28, "R"));
1961 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1962 popup_data->rename_ws_item = children[child_num] =
1963 XmCreatePushButtonGadget (popup_data->popup,
1964 "Rename_Workspace", args, 2);
1965 XmStringFree (label_string);
1967 XtAddCallback(children[child_num++], XmNactivateCallback,
1968 RenameWorkspaceCB, (XtPointer) 0);
1970 popup_data->separator1 = children[child_num++] =
1971 XmCreateSeparatorGadget (popup_data->popup, "sep3", NULL, 0);
1973 popup_data->separator2 = NULL;
1975 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 29, "Help")));
1976 XtSetArg (args[0], XmNlabelString, label_string);
1977 mnemonic = ((char *)FPGETMESSAGE(82, 30, "H"));
1978 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1979 popup_data->help_item = children[child_num++] =
1980 XmCreatePushButtonGadget (popup_data->popup, "Help", args, 2);
1981 XmStringFree (label_string);
1983 XtManageChildren(children, child_num);
1985 switch_data->popup_data = popup_data;