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 = NULL;
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;
158 _DtWsmDeleteWorkspace (panel.shell,
159 switch_data->atom_names[delete_workspace]);
166 /************************************************************************
169 * The callback function is called off of a menu pick to rename
170 * a specific workspace. The function identifies the index of the
171 * workspace and calls SwitchRenameLabel() function to change the switch.
172 * button to a text widget for typing the new workspace name and setting.
173 * up the callback to accept the new name upon activation.
175 ************************************************************************/
178 RenameWorkspaceCB (Widget w,
179 XtPointer client_data,
184 long rename_ws = (long) client_data;
185 SwitchData * switch_data = NULL;
189 /* Look up the switch data to get the atom name of the workspace */
192 for (i = 0; i < panel.box_data_count; i++)
194 if (panel.box_data[i]->switch_data != NULL)
196 switch_data = panel.box_data[i]->switch_data;
202 SwitchRenameLabel (switch_data->buttons[rename_ws], panel.box_data[i]);
210 /************************************************************************
213 * The callback function is called off of a menu pick. It generates
214 * a new workspace name and calls the workspace manager API to
215 * create the new workspace. All frontpanel UI processing is
216 * performed through a notification callback issued by the workspace
217 * manager after a successful add.
219 ************************************************************************/
222 AddWorkspaceCB (Widget w,
223 XtPointer client_data,
228 SwitchData * switch_data = NULL;
236 /* Get the beginning part of the new name */
238 temp_name = FPGETMESSAGE (82, 35, "New");
239 slen = strlen (temp_name) + 5 + 1;
240 switch_name = XtCalloc(1, slen);
241 strcpy (switch_name, temp_name);
244 /* Look up the switch data to get the atom name of the workspace */
247 for (i = 0; i < panel.box_data_count; i++)
249 if (panel.box_data[i]->switch_data != NULL)
251 switch_data = panel.box_data[i]->switch_data;
257 /* Generate a new title for the workspace. It should be unique */
258 /* from the existing title. */
269 for (i = 0; i < switch_data->switch_count; i++)
271 if (strcmp (switch_name, switch_data->switch_names[i]) == 0)
274 snprintf (switch_name, slen - 1, "%s_%d", temp_name, append);
281 _DtWsmCreateWorkspace (panel.shell, switch_name);
290 /************************************************************************
294 ************************************************************************/
299 XtPointer client_data,
300 XtPointer call_data )
302 XtUnmanageChild((Widget)client_data);
303 XmUpdateDisplay((Widget)client_data);
304 XtDestroyWidget((Widget)client_data);
310 /************************************************************************
313 * Called from the Ok button on the confimation dialog when a
314 * control deletion is seleted from the popup menu.
316 ************************************************************************/
320 DeleteControlOkCB (Widget w,
321 XtPointer client_data,
326 ControlData * control_data;
327 SubpanelData * subpanel_data;
331 /* Extract the control data from the user data field of the */
332 /* widget pointed to by client data. */
334 XtSetArg (args[0], XmNuserData, &control_data);
335 XtGetValues((Widget) client_data, args, 1);
338 /* Get the subpanel data for the control. Check to see if the */
339 /* control is a real subpanel control or the main panel copy. */
341 if (control_data->parent_type == SUBPANEL)
342 subpanel_data = (SubpanelData *) control_data->parent_data;
344 subpanel_data = (SubpanelData *) control_data->subpanel_data;
347 /* Get rid of the dialog and call the funtion to delete the control */
349 XtUnmanageChild ((Widget) client_data);
350 XmUpdateDisplay ((Widget) client_data);
352 DeleteSubpanelControl (subpanel_data, control_data);
354 XtDestroyWidget ((Widget) client_data);
360 /************************************************************************
364 ************************************************************************/
369 XtPointer client_data,
370 XtPointer call_data )
372 ControlData * control_data;
375 XtSetArg (args[0], XmNuserData, &control_data);
376 XtGetValues((Widget)client_data, args, 1);
378 XtUnmanageChild((Widget)client_data);
379 XmUpdateDisplay((Widget)client_data);
381 DeleteSubpanel(control_data);
383 XtDestroyWidget((Widget)client_data);
387 /************************************************************************
391 ************************************************************************/
394 DeleteControlCB (Widget w,
395 XtPointer client_data,
400 ControlData * control_data;
402 SubpanelData *subpanel_data;
405 String title, del_ctrl, ctrl_name, ctrl_label, del_msg, message;
406 long indx = (long) client_data;
409 XtSetArg (args[0], XmNuserData, &control_data);
410 XtGetValues (w, args, 1);
412 del_ctrl = FPGETMESSAGE(82, 31, "Delete Control:");
413 del_ctrl = XtNewString (del_ctrl);
415 ctrl_label = (char *)
416 control_data->element_values[CONTROL_LABEL].parsed_value;
418 control_data->element_values[CONTROL_NAME].parsed_value;
420 if (ctrl_label == NULL)
421 ctrl_label = ctrl_name;
423 if (control_data->element_values[CONTROL_LOCKED].parsed_value)
425 title = FPGETMESSAGE(82,1, "Workspace Manager - Delete Locked Control Error");
426 title = XtNewString (title);
428 del_msg = FPGETMESSAGE(82,5, "This control cannot be deleted because it is locked.");
429 del_msg = XtNewString (del_msg);
431 message = XtMalloc (sizeof(char) *
432 (strlen(del_ctrl) + strlen(ctrl_label) +
433 strlen(del_msg) + 4));
435 sprintf(message, "%s %s\n\n%s", del_ctrl, ctrl_label, del_msg);
437 _DtMessage (XtParent(w), title, message, NULL, NULL);
446 title = FPGETMESSAGE(82,2, "Workspace Manager - Delete Control");
447 title = XtNewString (title);
449 if (SessionFileNameLookup (ctrl_name, CONTROL, (char *) control_data->element_values[CONTROL_CONTAINER_NAME].parsed_value, SUBPANEL) == NULL)
450 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?");
452 del_msg = FPGETMESSAGE(82,6, "Are you sure you want to delete this control?");
454 del_msg = XtNewString (del_msg);
456 message = XtMalloc (sizeof(char) *
457 (strlen(del_ctrl) + strlen(ctrl_label) +
458 strlen(del_msg) + 4));
460 sprintf(message, "%s %s\n\n%s", del_ctrl, ctrl_label, del_msg);
463 /* Get the subpanel data for the control. Check to see if the */
464 /* control is a real subpanel control or the main panel copy. */
466 if (control_data->parent_type == SUBPANEL)
467 subpanel_data = (SubpanelData *) control_data->parent_data;
469 subpanel_data = (SubpanelData *) control_data->subpanel_data;
471 dialog = _DtMessageDialog(subpanel_data->shell,title,message,NULL,TRUE,
473 dialog = _DtMessageDialog(panel.shell, title, message, NULL, TRUE,
475 DeleteCancelCB, DeleteControlOkCB, NULL, NULL, False,
478 XtSetArg (args[0], XmNuserData, control_data);
479 XtSetArg (args[1], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
480 XtSetValues (dialog, args, 2);
493 /************************************************************************
496 * This callback initiates a subpanel control being toggled into
499 ************************************************************************/
502 ToggleControlCB (Widget w,
503 XtPointer client_data,
508 SubpanelData * subpanel_data = (SubpanelData *) client_data;
509 ControlData * control_data;
510 long indx = (long) client_data;
513 XtSetArg (args[0], XmNuserData, &control_data);
514 XtGetValues(w, args, 1);
516 ToggleDefaultControl (subpanel_data->parent_control_data,
517 subpanel_data, control_data);
523 /************************************************************************
527 ************************************************************************/
530 AddSubpanelCB (Widget w,
531 XtPointer client_data,
536 ControlData * control_data;
537 long indx = (long) client_data;
540 XtSetArg (args[0], XmNuserData, &control_data);
541 XtGetValues(w, args, 1);
543 AddSubpanel(control_data);
549 /************************************************************************
553 ************************************************************************/
556 DeleteSubpanelCB (Widget w,
557 XtPointer client_data,
562 ControlData * control_data;
563 SubpanelData * subpanel_data;
565 String title, message, del_spanel, spanel_name, del_msg;
568 XtSetArg (args[0], XmNuserData, &control_data);
569 XtGetValues(w, args, 1);
571 subpanel_data = (SubpanelData *) control_data->subpanel_data;
573 subpanel_data = (SubpanelData *) control_data->parent_data;
575 del_spanel = FPGETMESSAGE(82, 33, "Delete Subpanel:");
576 del_spanel = XtNewString (del_spanel);
578 spanel_name = (char *)
579 subpanel_data->element_values[SUBPANEL_NAME].parsed_value;
581 if (subpanel_data->element_values[SUBPANEL_LOCKED].parsed_value)
583 title = FPGETMESSAGE(82,3, "Workspace Manager - Delete Locked Subpanel Error");
584 title = XtNewString (title);
586 del_msg = FPGETMESSAGE(82,7, "This subpanel cannot be deleted because it is locked.");
587 del_msg = XtNewString (del_msg);
589 message = XtMalloc (sizeof(char) *
590 (strlen(del_spanel) + strlen(spanel_name) +
591 strlen(del_msg) + 4));
593 sprintf(message, "%s %s\n\n%s", del_spanel, spanel_name, del_msg);
595 _DtMessage (XtParent(w), title, message, NULL, NULL);
604 title = FPGETMESSAGE(82,4, "Workspace Manager - Delete Subpanel");
605 title = XtNewString (title);
607 if (subpanel_data->control_data_count > 0)
609 if (SessionFileNameLookup (spanel_name, SUBPANEL, (char *)
610 subpanel_data->element_values[SUBPANEL_CONTAINER_NAME].parsed_value,
612 del_msg = FPGETMESSAGE(82,34,
613 "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?");
615 del_msg = FPGETMESSAGE(82,8, "This subpanel contains more than one control.\n\nAre you sure you want to delete this subpanel?");
618 del_msg = FPGETMESSAGE(82,9, "Are you sure you want to delete this subpanel?");
620 del_msg = XtNewString (del_msg);
622 message = XtMalloc (sizeof(char) *
623 (strlen(del_spanel) + strlen(spanel_name) +
624 strlen(del_msg) + 4));
626 sprintf(message, "%s %s\n\n%s", del_spanel, spanel_name, del_msg);
629 dialog = _DtMessageDialog(subpanel_data->shell,title,message,NULL,TRUE,
631 dialog = _DtMessageDialog(panel.shell, title, message, NULL, TRUE,
633 DeleteCancelCB, DeleteSubpanelOkCB, NULL, NULL, False,
636 XtSetArg (args[0], XmNuserData, control_data);
637 XtSetArg (args[1], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
638 XtSetValues(dialog, args, 2);
651 /************************************************************************
653 * PostWorkspacePopupMenu
655 ************************************************************************/
659 PostWorkspacePopupMenu (Widget w,
660 XtPointer client_data,
667 SwitchData * switch_data = NULL;
668 XButtonEvent * b_event = (XButtonEvent *) event;
670 /* only use BMENU press events */
672 if (b_event->button != wmGD.bMenuButton) return;
674 for (i = 0; i < panel.box_data_count; i++)
676 box_data = panel.box_data[i];
678 if (box_data->switch_data != NULL)
679 switch_data = box_data->switch_data;
682 if (switch_data != NULL)
683 XtManageChild(switch_data->popup_data->popup);
689 /************************************************************************
693 ************************************************************************/
696 PostPopupMenu (Widget w,
697 XtPointer client_data,
702 XButtonEvent * b_event = (XButtonEvent *) event;
704 /* only use BMENU press events */
706 if (b_event->button != wmGD.bMenuButton) return;
708 XtManageChild(panel.popup_data->popup);
714 /************************************************************************
718 ************************************************************************/
721 GetBoxDataFromForm (Widget form,
722 BoxData ** box_data_rtn)
729 for (i = 0; i < panel.box_data_count; i++)
731 box_data = panel.box_data[i];
733 if (box_data == *box_data_rtn) continue;
735 if (box_data->left_control_form == form ||
736 box_data->right_control_form == form)
738 *box_data_rtn = box_data;
747 /************************************************************************
749 * GetSubpanelDataFromForm
751 ************************************************************************/
754 GetSubpanelDataFromForm (Widget form,
755 SubpanelData ** subpanel_data_rtn)
760 ControlData * control_data;
761 SubpanelData * subpanel_data;
764 for (i = 0; i < panel.box_data_count; i++)
766 box_data = panel.box_data[i];
768 for (j = 0; j < box_data->control_data_count; j++)
770 control_data = box_data->control_data[j];
772 if (control_data->subpanel_data != NULL)
774 subpanel_data = control_data->subpanel_data;
776 if (subpanel_data == *subpanel_data_rtn) continue;
778 if (subpanel_data->form == form)
780 *subpanel_data_rtn = subpanel_data;
792 /************************************************************************
796 ************************************************************************/
799 KeyMenuPosition (Widget popup, Widget focus_widget)
803 XButtonPressedEvent bevent; /* synthetic button press event */
805 Position root_x, root_y;
810 /* get the gadget's x and y */
812 XtSetArg (args[0], XmNx, &x);
813 XtSetArg (args[1], XmNy, &y);
814 XtGetValues (focus_widget, args, 2);
817 /* get the focus widget's parent since the focus widget is a gadget */
819 parent = XtParent (focus_widget);
822 /* get the root coordinates of the gadget */
824 XtTranslateCoords (parent, x, y, &root_x, &root_y);
827 /* XmMenuPosition() only uses the root_x and root_y */
828 /* of the event for positioning */
830 bevent.x_root = root_x;
831 bevent.y_root = root_y;
834 /* set the menu positioning */
836 XmMenuPosition (popup, &bevent);
843 /************************************************************************
847 ************************************************************************/
850 GetMainControlData (BoxData * box_data,
856 ControlData * control_data;
857 Boolean found = False;
859 for (i = 0; i < box_data->control_data_count; i++)
861 control_data = box_data->control_data[i];
863 if (control_data->icon == focus_widget)
870 if (!found) return NULL;
872 return (control_data);
878 /************************************************************************
880 * GetSubpanelControlData
882 ************************************************************************/
885 GetSubpanelControlData (SubpanelData * subpanel_data,
891 ControlData * control_data;
892 Boolean found = False;
894 if ( subpanel_data->dropzone == focus_widget )
897 if (subpanel_data->main_panel_icon_copy == focus_widget ||
898 subpanel_data->parent_control_data->indicator == focus_widget)
900 return (subpanel_data->parent_control_data);
904 for (i = 0; i < subpanel_data->control_data_count; i++)
906 control_data = subpanel_data->control_data[i];
907 if (control_data->icon == focus_widget ||
908 control_data->indicator == focus_widget)
915 if (!found) return NULL;
917 return (control_data);
923 /************************************************************************
925 * SetupActionMenuItems
926 * Set up the action list for display in the popup menu for a
927 * control. This may require creating additional menu items is
928 * the action list for this control is greater that previously
929 * encountered or it may require umanaging menu item is there are
933 * w: The parent of the menu items.
934 * control_data: The control the menu is being set up for.
935 * action_item: A pointer to the array of menu items for the actions.
936 * action_count: A pointer to the total number of action items.
938 ************************************************************************/
942 SetupActionMenuItems (Widget w,
943 ControlData * control_data,
944 PopupData * popup_data,
945 Widget * action_item,
950 XmString label_string;
952 long num_actions = 0;
953 long action_index = *action_count;
957 /* Count the action list for the control in order to adjust */
958 /* the number of action menu items within the menu. */
960 if (control_data != NULL)
961 while (control_data->actions[num_actions] != NULL)
964 if (num_actions > *action_count )
966 action_item = (Widget *) XtRealloc((char *) action_item,
967 sizeof(Widget) * num_actions);
969 for (i = 0; i < num_actions - *action_count; i++)
971 action_item[action_index] =
972 XmCreatePushButtonGadget (w, "action_button", args, 0);
976 XtManageChild (action_item[action_index]);
977 XtAddCallback (action_item[action_index], XmNactivateCallback,
978 ActionCB, (XtPointer)action_index);
985 for (i = 0; i < *action_count; i++)
986 XtUnmanageChild (action_item[i]);
989 for (i = 0; i < num_actions ; i++)
991 XtSetArg (args[0], XmNuserData, control_data);
992 XtSetValues (action_item[i], args, 1);
995 for (i = 0; i < num_actions; i++)
997 if (control_data->actions[i]->action_label != NULL)
999 XmStringCreateLocalized (control_data->actions[i]->action_label);
1002 XmStringCreateLocalized (control_data->actions[i]->action_name);
1004 XtSetArg (args[0], XmNlabelString, label_string);
1005 XtSetArg (args[1], XmNuserData, control_data);
1006 XtSetValues (action_item[i], args, 2);
1007 XmStringFree (label_string);
1010 for (i = 0; i < num_actions; i++)
1012 if (!XtIsManaged (action_item[i]))
1013 XtManageChild (action_item[i]);
1016 if (num_actions > 0)
1017 XtManageChild(popup_data->separator1);
1019 XtUnmanageChild(popup_data->separator1);
1026 /************************************************************************
1028 * UpdateMainControlMenu
1029 * Set up the label and the add/delete subpanel menu item for the
1033 * control_data: The control overwhich the menu is being posted.
1035 ************************************************************************/
1039 UpdateMainControlMenu (ControlData * control_data)
1043 XmString label_string;
1045 char * control_label;
1050 ElementValue * old_element_values;
1052 /* Save element values of control then load values of default control */
1054 if (control_data->subpanel_data != NULL &&
1055 control_data != control_data->subpanel_data->default_control)
1057 old_element_values = control_data->element_values;
1058 control_data->element_values =
1059 control_data->subpanel_data->default_control->element_values;
1062 /* Set the title of the menu */
1065 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1067 if (control_label == NULL)
1069 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1071 label_string = XmStringCreateLocalized (control_label);
1072 XtSetArg (args[0], XmNlabelString, label_string);
1073 XtSetValues (panel.popup_data->popup_title, args, 1);
1074 XmStringFree (label_string);
1077 /* If the control is blank, remove the add/delete subpanel item. */
1078 /* Otherwise, if there is a subpanel, activate the delete subpanel */
1079 /* item. Else activate the add subpanel item. */
1081 control_type = (long)control_data->element_values[CONTROL_TYPE].parsed_value;
1083 if (control_type != CONTROL_BLANK)
1085 XtManageChild (panel.popup_data->modify_subpanel_item);
1087 if (control_data->subpanel_data == NULL)
1089 if (panel.popup_data->subpanel_add_state != True)
1092 XmStringCreateLocalized ((FPGETMESSAGE(82, 10, "Add Subpanel")));
1093 XtSetArg (args[0], XmNlabelString, label_string);
1094 mnemonic = ((char *)FPGETMESSAGE(82, 11, "A"));
1095 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1096 XtSetArg (args[2], XmNuserData, control_data);
1097 XtSetValues (panel.popup_data->modify_subpanel_item, args, 3);
1099 XmStringFree (label_string);
1101 XtRemoveCallback (panel.popup_data->modify_subpanel_item,
1102 XmNactivateCallback, DeleteSubpanelCB, NULL);
1103 XtAddCallback (panel.popup_data->modify_subpanel_item,
1104 XmNactivateCallback, AddSubpanelCB, NULL);
1106 panel.popup_data->subpanel_add_state = True;
1110 XtSetArg (args[0], XmNuserData, control_data);
1111 XtSetValues (panel.popup_data->modify_subpanel_item, args, 1);
1116 if (panel.popup_data->subpanel_add_state == True)
1119 XmStringCreateLocalized ((FPGETMESSAGE(82, 12, "Delete Subpanel")));
1120 XtSetArg (args[0], XmNlabelString, label_string);
1121 mnemonic = ((char *)FPGETMESSAGE(82, 13, "D"));
1122 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1123 XtSetArg (args[2], XmNuserData, control_data);
1124 XtSetValues (panel.popup_data->modify_subpanel_item, args, 3);
1126 XmStringFree (label_string);
1128 XtRemoveCallback (panel.popup_data->modify_subpanel_item,
1129 XmNactivateCallback, AddSubpanelCB, NULL);
1130 XtAddCallback (panel.popup_data->modify_subpanel_item,
1131 XmNactivateCallback, DeleteSubpanelCB, NULL);
1133 panel.popup_data->subpanel_add_state = False;
1137 XtSetArg (args[0], XmNuserData, control_data);
1138 XtSetValues (panel.popup_data->modify_subpanel_item, args, 1);
1144 XtUnmanageChild (panel.popup_data->modify_subpanel_item);
1147 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1149 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1150 ControlTopicHelpCB, (XtPointer)control_data);
1152 XtUnmanageChild (panel.popup_data->deinstall_item);
1153 XtUnmanageChild (panel.popup_data->toggle_item);
1155 /* Restore element values to control. */
1157 if (control_data->subpanel_data != NULL &&
1158 control_data != control_data->subpanel_data->default_control)
1160 control_data->element_values = old_element_values;
1168 /************************************************************************
1170 * UpdateSubpanelControlMenu
1171 * Set the elements of the popup menu for a subpanel control
1172 * item to its proper values before it is made visible.
1175 * subpanel_data: The subpanel in which the menu is to be
1178 * control_data: The control that the menu is being brought up for.
1180 ************************************************************************/
1184 UpdateSubpanelControlMenu (SubpanelData * subpanel_data,
1185 ControlData * control_data)
1189 XmString label_string;
1191 char * control_label = NULL;
1193 /* Set the title of the menu */
1198 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1200 if (control_label == NULL)
1202 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1206 control_label = FPGETMESSAGE(82, 36, "Install Icon");
1209 label_string = XmStringCreateLocalized (control_label);
1210 XtSetArg (args[0], XmNlabelString, label_string);
1211 XtSetValues (panel.popup_data->popup_title, args, 1);
1212 XmStringFree (label_string);
1215 /* Set the sensitivity of the control deinstall and toggle menu item */
1217 if (control_data == NULL)
1219 XtSetSensitive (panel.popup_data->deinstall_item, False);
1220 XtSetSensitive (panel.popup_data->toggle_item, False);
1222 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1224 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1225 GeneralTopicHelpCB, (XtPointer)INSTALL_ZONE);
1229 XtSetSensitive (panel.popup_data->deinstall_item, True);
1230 XtSetArg (args[0], XmNuserData, control_data);
1231 XtSetValues(panel.popup_data->deinstall_item, args, 1);
1233 XtRemoveAllCallbacks (panel.popup_data->deinstall_item,
1234 XmNactivateCallback);
1236 XtAddCallback (panel.popup_data->deinstall_item, XmNactivateCallback,
1237 DeleteControlCB, (XtPointer) NULL);
1239 if ( control_data == subpanel_data->default_control)
1240 XtSetSensitive (panel.popup_data->toggle_item, False);
1242 XtSetSensitive (panel.popup_data->toggle_item, True);
1244 XtSetArg (args[0], XmNuserData, control_data);
1245 XtSetValues(panel.popup_data->toggle_item, args, 1);
1247 XtRemoveAllCallbacks (panel.popup_data->toggle_item,
1248 XmNactivateCallback);
1250 XtAddCallback (panel.popup_data->toggle_item, XmNactivateCallback,
1251 ToggleControlCB, (XtPointer) subpanel_data);
1253 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1255 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1256 ControlTopicHelpCB, (XtPointer)control_data);
1259 XtManageChild (panel.popup_data->deinstall_item);
1261 if (! (subpanel_data->parent_control_data->
1262 element_values[CONTROL_LOCKED].parsed_value))
1263 XtManageChild (panel.popup_data->toggle_item);
1265 XtUnmanageChild (panel.popup_data->toggle_item);
1267 XtUnmanageChild (panel.popup_data->modify_subpanel_item);
1273 /************************************************************************
1276 * Callback function which updates the popup menu for main panel
1277 * and subpanel controls before the menu is posted.
1279 ************************************************************************/
1283 PopupMenu (Widget w,
1284 XtPointer client_data,
1285 XtPointer call_data)
1289 XmAnyCallbackStruct * callback;
1291 Widget form, focus_widget;
1292 XmManagerWidget mgr;
1293 SubpanelData * subpanel_data = NULL;
1294 ControlData * control_data;
1295 BoxData * box_data = NULL;
1296 XmString label_string;
1298 long control_type, action_count = panel.popup_data->action_count;
1300 callback = (XmAnyCallbackStruct *) call_data;
1301 event = (XEvent *) callback->event;
1304 /* Get the form where the menu was posted from. */
1306 form = XmGetPostedFromWidget(w);
1308 XtSetArg (args[0], XmNuserData, &control_type);
1309 XtGetValues (form, args, 1);
1311 if (control_type == CONTROL)
1313 GetBoxDataFromForm (form, &box_data);
1314 subpanel_data = NULL;
1316 else if (control_type == SUBPANEL)
1318 GetSubpanelDataFromForm (form, &subpanel_data);
1322 if (event->type == ButtonPress)
1324 /* Change to use new Xme function when porting to Motif 2.0 */
1325 /* Get gadget at x, y position */
1327 focus_widget = (Widget) XmObjectAtPoint (form, event->xbutton.x,
1329 if (focus_widget == NULL)
1332 /* set the menu positioning */
1334 XmMenuPosition (panel.popup_data->popup, (XButtonPressedEvent *)event);
1338 /* get the widget that has the traversal focus */
1340 focus_widget = XmGetFocusWidget (form);
1343 /* set the menu positioning for non button events */
1345 KeyMenuPosition (panel.popup_data->popup, focus_widget);
1348 if (control_type == CONTROL)
1350 control_data = GetMainControlData (box_data, focus_widget);
1352 /* Find the right subpanel data if main control is not default */
1355 UpdateMainControlMenu (control_data);
1357 if (control_data->subpanel_data != NULL &&
1358 control_data != control_data->subpanel_data->default_control)
1360 subpanel_data = control_data->subpanel_data;
1361 control_data = control_data->subpanel_data->default_control;
1362 control_data->subpanel_data = subpanel_data;
1363 UpdateMainControlMenu (control_data);
1366 SetupActionMenuItems (w, control_data, panel.popup_data,
1367 panel.popup_data->action_item, &action_count);
1370 else if (control_type == SUBPANEL)
1372 control_data = GetSubpanelControlData (subpanel_data, focus_widget);
1374 UpdateSubpanelControlMenu (subpanel_data, control_data);
1376 SetupActionMenuItems (w, control_data, panel.popup_data,
1377 panel.popup_data->action_item, &action_count);
1380 panel.popup_data->action_count = action_count;
1386 /************************************************************************
1390 ************************************************************************/
1394 CreatePopupMenu (Widget w)
1398 Widget children[20];
1401 PopupData * popup_data;
1402 long i, child_num = 0;
1403 XmString label_string;
1405 popup_data = panel.popup_data = (PopupData *) XtMalloc(sizeof(PopupData));
1408 XtSetArg (args[i], XmNwhichButton, wmGD.bMenuButton); i++;
1410 popup_data->popup = XmCreatePopupMenu(w, "FPPopup", args, i);
1412 popup_data->add_ws_item = NULL;
1414 XtAddCallback (popup_data->popup, XmNmapCallback, PopupMenu,
1417 popup_data->popup_title = children[child_num++] =
1418 XmCreateLabelGadget(popup_data->popup, "title", NULL, 0);
1420 children[child_num++] = XmCreateSeparatorGadget(popup_data->popup,
1422 children[child_num++] = XmCreateSeparatorGadget(popup_data->popup,
1425 popup_data->action_item = (Widget *) XtMalloc(sizeof(Widget) * 5);
1426 popup_data->action_count = 0;
1428 for (i = 0; i < 5; i++)
1430 children[child_num] = popup_data->action_item[i] =
1431 XmCreatePushButtonGadget(popup_data->popup, "action_button", args, 0);
1432 popup_data->action_count++;
1434 XtManageChild (popup_data->action_item[i]);
1435 XtAddCallback (children[child_num++], XmNactivateCallback,
1436 ActionCB, (XtPointer) i);
1439 popup_data->separator1 = children[child_num++] =
1440 XmCreateSeparatorGadget (popup_data->popup, "sep3", NULL, 0);
1443 XmStringCreateLocalized((FPGETMESSAGE(82, 14, "Copy To Main Panel")));
1444 XtSetArg (args[0], XmNlabelString, label_string);
1445 mnemonic = ((char *)FPGETMESSAGE(82, 15, "C"));
1446 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1447 popup_data->toggle_item = children[child_num] =
1448 XmCreatePushButtonGadget (popup_data->popup, "Toggle_Control", args, 2);
1449 XmStringFree (label_string);
1451 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 16, "Delete")));
1452 XtSetArg (args[0], XmNlabelString, label_string);
1453 mnemonic = ((char *)FPGETMESSAGE(82, 17, "D"));
1454 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1455 popup_data->deinstall_item = children[child_num] =
1456 XmCreatePushButtonGadget(popup_data->popup, "Delete_Control",
1458 XmStringFree (label_string);
1461 XmStringCreateLocalized ((FPGETMESSAGE(82, 10, "Add Subpanel")));
1462 XtSetArg (args[0], XmNlabelString, label_string);
1463 mnemonic = ((char *)FPGETMESSAGE(82, 11, "A"));
1464 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1465 popup_data->modify_subpanel_item = children[child_num] =
1466 XmCreatePushButtonGadget (popup_data->popup, "Add_Subpanel", args, 2);
1467 XmStringFree (label_string);
1469 XtAddCallback(children[child_num++], XmNactivateCallback, AddSubpanelCB,
1471 popup_data->subpanel_add_state = True;
1473 popup_data->separator2 = children[child_num++] =
1474 XmCreateSeparatorGadget(popup_data->popup, "sep4", NULL, 0);
1476 label_string = XmStringCreateLocalized ((FPGETMESSAGE(82, 18, "Help")));
1477 XtSetArg (args[0], XmNlabelString, label_string);
1478 mnemonic = ((char *)FPGETMESSAGE(82, 19, "H"));
1479 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1480 popup_data->help_item = children[child_num++] =
1481 XmCreatePushButtonGadget (popup_data->popup, "Help", args, 2);
1482 XmStringFree (label_string);
1484 XtManageChildren(children, child_num);
1490 /************************************************************************
1492 * CreateActionButtons
1493 * Show the the action menu items and hide workspace menu items since
1494 * we are over a control.
1497 ************************************************************************/
1501 CreateActionButtons (Widget w,
1502 SwitchData * switch_data,
1503 ControlData * control_data)
1507 PopupData * popup_data = switch_data->popup_data;
1508 long action_count = popup_data->action_count;
1510 XmString label_string;
1511 char * control_label;
1513 /* Set the title of the menu */
1516 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1518 if (control_label == NULL)
1520 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1522 label_string = XmStringCreateLocalized (control_label);
1523 XtSetArg (args[0], XmNlabelString, label_string);
1524 XtSetValues (popup_data->popup_title, args, 1);
1525 XmStringFree (label_string);
1527 /* show actions items */
1528 SetupActionMenuItems(w, control_data, popup_data,
1529 popup_data->action_item, &action_count);
1530 popup_data->action_count = action_count;
1532 /* hide add and delete workspace items */
1533 XtUnmanageChild(popup_data->add_ws_item);
1534 XtUnmanageChild(popup_data->delete_ws_item);
1535 XtUnmanageChild(popup_data->rename_ws_item);
1537 /* reset the help callback to reflect switch control help */
1538 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1539 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1540 ControlTopicHelpCB, control_data);
1547 /************************************************************************
1549 * ShowWorkspaceItems
1550 * Don't show the the action menu items since we are not over a control.
1551 * Reset the activate callbacks with the latest data.
1553 ************************************************************************/
1557 ShowWorkspaceItems (SwitchData * switch_data,
1558 Widget focus_widget)
1562 PopupData * popup_data = switch_data->popup_data;
1565 XmString label_string;
1566 char * control_label;
1572 /* hide actions items */
1574 for (i = 0; i < popup_data->action_count; i++)
1575 XtUnmanageChild (popup_data->action_item[i]);
1578 /* show add and delete workspace items */
1580 XtManageChild (popup_data->add_ws_item);
1581 XtManageChild (popup_data->delete_ws_item);
1582 XtManageChild (popup_data->rename_ws_item);
1585 /* reset the activate callback to reflect current button index */
1587 XtRemoveAllCallbacks (popup_data->delete_ws_item, XmNactivateCallback);
1588 for (i = 0; i < switch_data->switch_count &&
1589 switch_data->buttons[i] != NULL; i++)
1591 if (switch_data->buttons[i] == focus_widget) break;
1595 /* If we didn't find the switch button to post the menu for, it */
1596 /* must be in edit mode so the correct menu is the active switch */
1598 if (i >= switch_data->switch_count)
1599 i = switch_data->active_switch;
1602 /* Set the title of the menu */
1604 format = strdup (FPGETMESSAGE(82, 20, "%1$s %2$s"));
1605 ws = strdup (FPGETMESSAGE(82, 21, "Workspace"));
1606 ws_name = switch_data->switch_names[i];
1608 control_label = XtMalloc (sizeof(char) * (strlen(ws) + strlen(ws_name) + 4));
1610 sprintf (control_label, format, ws, ws_name);
1614 label_string = XmStringCreateLocalized (control_label);
1615 XtSetArg (args[0], XmNlabelString, label_string);
1616 XtSetValues (popup_data->popup_title, args, 1);
1617 XmStringFree (label_string);
1618 XtFree(control_label);
1620 XtAddCallback (popup_data->delete_ws_item, XmNactivateCallback,
1621 DeleteWorkspaceCB, (XtPointer) i);
1623 /* reset the activate callback to reflect current button index */
1624 XtRemoveAllCallbacks (popup_data->rename_ws_item, XmNactivateCallback);
1625 XtAddCallback (popup_data->rename_ws_item, XmNactivateCallback,
1626 RenameWorkspaceCB, (XtPointer) i);
1628 /* reset the help callback to reflect switch button help */
1629 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1630 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1631 GeneralTopicHelpCB, (XtPointer) SWITCH_BUTTON);
1633 XtManageChild(popup_data->separator1);
1639 /************************************************************************
1641 * ShowPartialWorkspaceItems
1642 * Don't show the delete workspace item since we are not over
1643 * a workspace button and don't show the action menu items since we are
1644 * not over a control. Reset the activate callback with the latest data.
1646 ************************************************************************/
1649 ShowPartialWorkspaceItems(SwitchData * switch_data)
1653 PopupData * popup_data = switch_data->popup_data;
1656 XmString label_string;
1658 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 22, "Switch Area")));
1659 XtSetArg (args[0], XmNlabelString, label_string);
1660 XtSetValues (popup_data->popup_title, args, 1);
1661 XmStringFree (label_string);
1663 /* hide actions items */
1664 for (i = 0; i < popup_data->action_count; i++)
1665 XtUnmanageChild (popup_data->action_item[i]);
1667 /* show add workspace item */
1668 XtManageChild (popup_data->add_ws_item);
1670 /* hide delete and rename workspace items */
1671 XtUnmanageChild (popup_data->delete_ws_item);
1672 XtUnmanageChild (popup_data->rename_ws_item);
1674 /* reset the help callback to reflect switch area help */
1675 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1676 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1677 SwitchTopicHelpCB, (XtPointer)switch_data);
1679 XtManageChild(popup_data->separator1);
1686 /************************************************************************
1688 * GetSwitchDataFromForm
1690 ************************************************************************/
1695 GetSwitchDataFromForm (Widget form,
1696 SwitchData ** switch_data_rtn)
1703 for (i = 0; i < panel.box_data_count; i++)
1705 box_data = panel.box_data[i];
1707 if (box_data->switch_form == form)
1709 *switch_data_rtn = box_data->switch_data;
1718 /************************************************************************
1720 * GetSwtichControlData
1722 ************************************************************************/
1725 static ControlData *
1726 GetSwitchControlData (SwitchData * switch_data,
1727 Widget focus_widget)
1732 ControlData * control_data;
1733 Boolean found = False;
1735 for (i = 0; i < switch_data->control_data_count; i++)
1737 control_data = switch_data->control_data[i];
1739 if (control_data->icon == focus_widget)
1746 if (!found) return NULL;
1748 return (control_data);
1755 /************************************************************************
1759 ************************************************************************/
1762 WSPopupMenu (Widget w,
1763 XtPointer client_data,
1764 XtPointer call_data)
1768 XmManagerWidget mgr = (XmManagerWidget) w;
1769 int num_children = mgr->composite.num_children;
1770 XmAnyCallbackStruct * callback;
1772 Widget form, focus_widget;
1773 SwitchData * switch_data;
1774 ControlData * control_data = NULL;
1775 Boolean is_button = False;
1780 callback = (XmAnyCallbackStruct *) call_data;
1781 event = (XEvent *) callback->event;
1784 /* get the form where the menu was posted from */
1786 form = XmGetPostedFromWidget (w);
1788 GetSwitchDataFromForm (form, &switch_data);
1791 if (event->type == ButtonPress)
1794 /* Change to use new Xme function when porting to Motif 2.0 */
1795 /* Get gadget at x, y position */
1797 focus_widget = (Widget) XmObjectAtPoint (form, event->xbutton.x,
1800 if (focus_widget == NULL)
1802 XtSetArg (args[0], XmNx, &x);
1803 XtSetArg (args[1], XmNy, &y);
1804 XtGetValues(switch_data->rc, args, 2);
1806 focus_widget = (Widget) XmObjectAtPoint (switch_data->rc,
1807 event->xbutton.x - x,
1808 event->xbutton.y - y);
1812 control_data = GetSwitchControlData (switch_data, focus_widget);
1815 /* set the menu positioning */
1817 XmMenuPosition (switch_data->popup_data->popup,
1818 (XButtonPressedEvent *) event);
1823 /* get the widget that has the traversal focus */
1825 focus_widget = XmGetFocusWidget (form);
1827 control_data = GetSwitchControlData (switch_data, focus_widget);
1829 if (control_data == NULL)
1832 /* set the menu positioning for non button events */
1834 KeyMenuPosition (switch_data->popup_data->popup, focus_widget);
1837 if (focus_widget != NULL)
1840 /* The mouse is over a button in the switch area */
1841 ShowWorkspaceItems (switch_data, focus_widget);
1844 if (control_data != NULL)
1847 (long) control_data->element_values[CONTROL_TYPE].parsed_value;
1849 if (control_type != CONTROL_BLANK)
1850 /* The mouse is over a control in the switch area */
1851 CreateActionButtons (w, switch_data, control_data);
1853 /* The mouse is over a blank control in the switch area */
1854 ShowPartialWorkspaceItems (switch_data);
1859 * The mouse is over area other than the buttons and control
1860 * in the switch area
1862 ShowPartialWorkspaceItems (switch_data);
1868 * The mouse is over area other than the buttons and control
1869 * in the switch area
1871 ShowPartialWorkspaceItems (switch_data);
1877 /************************************************************************
1879 * CreateWorkspacePopupMenu
1881 ************************************************************************/
1885 CreateWorkspacePopupMenu (Widget w,
1886 SwitchData * switch_data)
1890 Widget children[20];
1891 XmString label_string;
1894 long i, child_num = 0;
1895 PopupData * popup_data;
1897 popup_data = (PopupData *) XtMalloc(sizeof(PopupData));
1900 XtSetArg (args[i], XmNwhichButton, wmGD.bMenuButton); i++;
1902 popup_data->popup = XmCreatePopupMenu(w, "WSPopup", args, i);
1904 popup_data->deinstall_item = NULL;
1905 popup_data->toggle_item = NULL;
1906 popup_data->modify_subpanel_item = NULL;
1907 popup_data->subpanel_add_state = True;
1909 XtAddCallback(popup_data->popup, XmNmapCallback, WSPopupMenu,
1910 (XtPointer) switch_data);
1912 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 22, "Switch Area")));
1913 XtSetArg (args[0], XmNlabelString, label_string);
1914 popup_data->popup_title = children[child_num++] =
1915 XmCreateLabelGadget (popup_data->popup, "title", args, 1);
1916 XmStringFree (label_string);
1918 children[child_num++] = XmCreateSeparatorGadget (popup_data->popup, "sep1",
1920 children[child_num++] = XmCreateSeparatorGadget (popup_data->popup, "sep2",
1923 popup_data->action_item = (Widget *) XtMalloc(sizeof(Widget) * 5);
1924 popup_data->action_count = 0;
1926 for (i = 0; i < 5; i++)
1928 children[child_num] = popup_data->action_item[i] =
1929 XmCreatePushButtonGadget (popup_data->popup, "action_button", args, 0);
1930 popup_data->action_count++;
1932 XtManageChild (popup_data->action_item[i]);
1933 XtAddCallback (children[child_num++], XmNactivateCallback,
1934 ActionCB, (XtPointer) i);
1938 XmStringCreateLocalized ((FPGETMESSAGE(82, 23, "Add Workspace")));
1939 XtSetArg (args[0], XmNlabelString, label_string);
1940 mnemonic = ((char *)FPGETMESSAGE(82, 24, "A"));
1941 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1942 popup_data->add_ws_item = children[child_num] =
1943 XmCreatePushButtonGadget (popup_data->popup, "Add_Workspace", args, 2);
1944 XmStringFree (label_string);
1946 XtAddCallback(children[child_num++], XmNactivateCallback, AddWorkspaceCB,
1949 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 25, "Delete")));
1950 XtSetArg (args[0], XmNlabelString, label_string);
1951 mnemonic = ((char *)FPGETMESSAGE(82, 26, "D"));
1952 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1953 popup_data->delete_ws_item = children[child_num] =
1954 XmCreatePushButtonGadget (popup_data->popup,
1955 "Delete_Workspace", args, 2);
1956 XmStringFree (label_string);
1958 XtAddCallback(children[child_num++], XmNactivateCallback,
1959 DeleteWorkspaceCB, (XtPointer) 0);
1961 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 27, "Rename")));
1962 XtSetArg (args[0], XmNlabelString, label_string);
1963 mnemonic = ((char *)FPGETMESSAGE(82, 28, "R"));
1964 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1965 popup_data->rename_ws_item = children[child_num] =
1966 XmCreatePushButtonGadget (popup_data->popup,
1967 "Rename_Workspace", args, 2);
1968 XmStringFree (label_string);
1970 XtAddCallback(children[child_num++], XmNactivateCallback,
1971 RenameWorkspaceCB, (XtPointer) 0);
1973 popup_data->separator1 = children[child_num++] =
1974 XmCreateSeparatorGadget (popup_data->popup, "sep3", NULL, 0);
1976 popup_data->separator2 = NULL;
1978 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 29, "Help")));
1979 XtSetArg (args[0], XmNlabelString, label_string);
1980 mnemonic = ((char *)FPGETMESSAGE(82, 30, "H"));
1981 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1982 popup_data->help_item = children[child_num++] =
1983 XmCreatePushButtonGadget (popup_data->popup, "Help", args, 2);
1984 XmStringFree (label_string);
1986 XtManageChildren(children, child_num);
1988 switch_data->popup_data = popup_data;