2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: PopupMenu.c /main/5 1995/11/01 11:28:50 rswiston $ */
24 /*****************************************************************************
25 *****************************************************************************
31 ** Description: This file contains the functions for creating and managing
32 ** the main panel and subpanel popup menus.
35 ****************************************************************************
36 *****************************************************************************/
40 #include <Xm/ManagerP.h>
41 #include <Xm/RowColumn.h>
42 #include <Xm/LabelG.h>
43 #include <Xm/PushBG.h>
44 #include <Xm/SeparatoG.h>
46 #include <Dt/SharedProcs.h>
48 #include "DataBaseLoad.h"
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;
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;
198 SwitchRenameLabel (switch_data->buttons[rename_ws], panel.box_data[i]);
205 /************************************************************************
208 * The callback function is called off of a menu pick. It generates
209 * a new workspace name and calls the workspace manager API to
210 * create the new workspace. All frontpanel UI processing is
211 * performed through a notification callback issued by the workspace
212 * manager after a successful add.
214 ************************************************************************/
217 AddWorkspaceCB (Widget w,
218 XtPointer client_data,
223 SwitchData * switch_data;
231 /* Get the beginning part of the new name */
233 temp_name = FPGETMESSAGE (82, 35, "New");
234 switch_name = XtMalloc (strlen (temp_name) + 5);
235 strcpy (switch_name, temp_name);
238 /* Look up the switch data to get the atom name of the workspace */
241 for (i = 0; i < panel.box_data_count; i++)
243 if (panel.box_data[i]->switch_data != NULL)
245 switch_data = panel.box_data[i]->switch_data;
251 /* Generate a new title for the workspace. It should be unique */
252 /* from the existing title. */
263 for (i = 0; i < switch_data->switch_count; i++)
265 if (strcmp (switch_name, switch_data->switch_names[i]) == 0)
268 sprintf (switch_name, "%s_%d", temp_name, append);
275 _DtWsmCreateWorkspace (panel.shell, switch_name);
284 /************************************************************************
288 ************************************************************************/
293 XtPointer client_data,
294 XtPointer call_data )
296 XtUnmanageChild((Widget)client_data);
297 XmUpdateDisplay((Widget)client_data);
298 XtDestroyWidget((Widget)client_data);
304 /************************************************************************
307 * Called from the Ok button on the confimation dialog when a
308 * control deletion is seleted from the popup menu.
310 ************************************************************************/
314 DeleteControlOkCB (Widget w,
315 XtPointer client_data,
320 ControlData * control_data;
321 SubpanelData * subpanel_data;
325 /* Extract the control data from the user data field of the */
326 /* widget pointed to by client data. */
328 XtSetArg (args[0], XmNuserData, &control_data);
329 XtGetValues((Widget) client_data, args, 1);
332 /* Get the subpanel data for the control. Check to see if the */
333 /* control is a real subpanel control or the main panel copy. */
335 if (control_data->parent_type == SUBPANEL)
336 subpanel_data = (SubpanelData *) control_data->parent_data;
338 subpanel_data = (SubpanelData *) control_data->subpanel_data;
341 /* Get rid of the dialog and call the funtion to delete the control */
343 XtUnmanageChild ((Widget) client_data);
344 XmUpdateDisplay ((Widget) client_data);
346 DeleteSubpanelControl (subpanel_data, control_data);
348 XtDestroyWidget ((Widget) client_data);
354 /************************************************************************
358 ************************************************************************/
363 XtPointer client_data,
364 XtPointer call_data )
366 ControlData * control_data;
369 XtSetArg (args[0], XmNuserData, &control_data);
370 XtGetValues((Widget)client_data, args, 1);
372 XtUnmanageChild((Widget)client_data);
373 XmUpdateDisplay((Widget)client_data);
375 DeleteSubpanel(control_data);
377 XtDestroyWidget((Widget)client_data);
381 /************************************************************************
385 ************************************************************************/
388 DeleteControlCB (Widget w,
389 XtPointer client_data,
394 ControlData * control_data;
396 SubpanelData *subpanel_data;
399 String title, del_ctrl, ctrl_name, ctrl_label, del_msg, message;
400 long indx = (long) client_data;
403 XtSetArg (args[0], XmNuserData, &control_data);
404 XtGetValues (w, args, 1);
406 del_ctrl = FPGETMESSAGE(82, 31, "Delete Control:");
407 del_ctrl = XtNewString (del_ctrl);
409 ctrl_label = (char *)
410 control_data->element_values[CONTROL_LABEL].parsed_value;
412 control_data->element_values[CONTROL_NAME].parsed_value;
414 if (ctrl_label == NULL)
415 ctrl_label = ctrl_name;
417 if (control_data->element_values[CONTROL_LOCKED].parsed_value)
419 title = FPGETMESSAGE(82,1, "Workspace Manager - Delete Locked Control Error");
420 title = XtNewString (title);
422 del_msg = FPGETMESSAGE(82,5, "This control cannot be deleted because it is locked.");
423 del_msg = XtNewString (del_msg);
425 message = XtMalloc (sizeof(char) *
426 (strlen(del_ctrl) + strlen(ctrl_label) +
427 strlen(del_msg) + 4));
429 sprintf(message, "%s %s\n\n%s", del_ctrl, ctrl_label, del_msg);
431 _DtMessage (XtParent(w), title, message, NULL, NULL);
440 title = FPGETMESSAGE(82,2, "Workspace Manager - Delete Control");
441 title = XtNewString (title);
443 if (SessionFileNameLookup (ctrl_name, CONTROL, (char *) control_data->element_values[CONTROL_CONTAINER_NAME].parsed_value, SUBPANEL) == NULL)
444 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?");
446 del_msg = FPGETMESSAGE(82,6, "Are you sure you want to delete this control?");
448 del_msg = XtNewString (del_msg);
450 message = XtMalloc (sizeof(char) *
451 (strlen(del_ctrl) + strlen(ctrl_label) +
452 strlen(del_msg) + 4));
454 sprintf(message, "%s %s\n\n%s", del_ctrl, ctrl_label, del_msg);
457 /* Get the subpanel data for the control. Check to see if the */
458 /* control is a real subpanel control or the main panel copy. */
460 if (control_data->parent_type == SUBPANEL)
461 subpanel_data = (SubpanelData *) control_data->parent_data;
463 subpanel_data = (SubpanelData *) control_data->subpanel_data;
465 dialog = _DtMessageDialog(subpanel_data->shell,title,message,NULL,TRUE,
467 dialog = _DtMessageDialog(panel.shell, title, message, NULL, TRUE,
469 DeleteCancelCB, DeleteControlOkCB, NULL, NULL, False,
472 XtSetArg (args[0], XmNuserData, control_data);
473 XtSetArg (args[1], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
474 XtSetValues (dialog, args, 2);
487 /************************************************************************
490 * This callback initiates a subpanel control being toggled into
493 ************************************************************************/
496 ToggleControlCB (Widget w,
497 XtPointer client_data,
502 SubpanelData * subpanel_data = (SubpanelData *) client_data;
503 ControlData * control_data;
504 long indx = (long) client_data;
507 XtSetArg (args[0], XmNuserData, &control_data);
508 XtGetValues(w, args, 1);
510 ToggleDefaultControl (subpanel_data->parent_control_data,
511 subpanel_data, control_data);
517 /************************************************************************
521 ************************************************************************/
524 AddSubpanelCB (Widget w,
525 XtPointer client_data,
530 ControlData * control_data;
531 long indx = (long) client_data;
534 XtSetArg (args[0], XmNuserData, &control_data);
535 XtGetValues(w, args, 1);
537 AddSubpanel(control_data);
543 /************************************************************************
547 ************************************************************************/
550 DeleteSubpanelCB (Widget w,
551 XtPointer client_data,
556 ControlData * control_data;
557 SubpanelData * subpanel_data;
559 String title, message, del_spanel, spanel_name, del_msg;
562 XtSetArg (args[0], XmNuserData, &control_data);
563 XtGetValues(w, args, 1);
565 subpanel_data = (SubpanelData *) control_data->subpanel_data;
567 subpanel_data = (SubpanelData *) control_data->parent_data;
569 del_spanel = FPGETMESSAGE(82, 33, "Delete Subpanel:");
570 del_spanel = XtNewString (del_spanel);
572 spanel_name = (char *)
573 subpanel_data->element_values[SUBPANEL_NAME].parsed_value;
575 if (subpanel_data->element_values[SUBPANEL_LOCKED].parsed_value)
577 title = FPGETMESSAGE(82,3, "Workspace Manager - Delete Locked Subpanel Error");
578 title = XtNewString (title);
580 del_msg = FPGETMESSAGE(82,7, "This subpanel cannot be deleted because it is locked.");
581 del_msg = XtNewString (del_msg);
583 message = XtMalloc (sizeof(char) *
584 (strlen(del_spanel) + strlen(spanel_name) +
585 strlen(del_msg) + 4));
587 sprintf(message, "%s %s\n\n%s", del_spanel, spanel_name, del_msg);
589 _DtMessage (XtParent(w), title, message, NULL, NULL);
598 title = FPGETMESSAGE(82,4, "Workspace Manager - Delete Subpanel");
599 title = XtNewString (title);
601 if (subpanel_data->control_data_count > 0)
603 if (SessionFileNameLookup (spanel_name, SUBPANEL, (char *)
604 subpanel_data->element_values[SUBPANEL_CONTAINER_NAME].parsed_value,
606 del_msg = FPGETMESSAGE(82,34,
607 "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?");
609 del_msg = FPGETMESSAGE(82,8, "This subpanel contains more than one control.\n\nAre you sure you want to delete this subpanel?");
612 del_msg = FPGETMESSAGE(82,9, "Are you sure you want to delete this subpanel?");
614 del_msg = XtNewString (del_msg);
616 message = XtMalloc (sizeof(char) *
617 (strlen(del_spanel) + strlen(spanel_name) +
618 strlen(del_msg) + 4));
620 sprintf(message, "%s %s\n\n%s", del_spanel, spanel_name, del_msg);
623 dialog = _DtMessageDialog(subpanel_data->shell,title,message,NULL,TRUE,
625 dialog = _DtMessageDialog(panel.shell, title, message, NULL, TRUE,
627 DeleteCancelCB, DeleteSubpanelOkCB, NULL, NULL, False,
630 XtSetArg (args[0], XmNuserData, control_data);
631 XtSetArg (args[1], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
632 XtSetValues(dialog, args, 2);
645 /************************************************************************
647 * PostWorkspacePopupMenu
649 ************************************************************************/
653 PostWorkspacePopupMenu (Widget w,
654 XtPointer client_data,
661 SwitchData * switch_data = NULL;
662 XButtonEvent * b_event = (XButtonEvent *) event;
664 /* only use BMENU press events */
666 if (b_event->button != wmGD.bMenuButton) return;
668 for (i = 0; i < panel.box_data_count; i++)
670 box_data = panel.box_data[i];
672 if (box_data->switch_data != NULL)
673 switch_data = box_data->switch_data;
676 if (switch_data != NULL)
677 XtManageChild(switch_data->popup_data->popup);
683 /************************************************************************
687 ************************************************************************/
690 PostPopupMenu (Widget w,
691 XtPointer client_data,
696 XButtonEvent * b_event = (XButtonEvent *) event;
698 /* only use BMENU press events */
700 if (b_event->button != wmGD.bMenuButton) return;
702 XtManageChild(panel.popup_data->popup);
708 /************************************************************************
712 ************************************************************************/
715 GetBoxDataFromForm (Widget form,
716 BoxData ** box_data_rtn)
723 for (i = 0; i < panel.box_data_count; i++)
725 box_data = panel.box_data[i];
727 if (box_data == *box_data_rtn) continue;
729 if (box_data->left_control_form == form ||
730 box_data->right_control_form == form)
732 *box_data_rtn = box_data;
741 /************************************************************************
743 * GetSubpanelDataFromForm
745 ************************************************************************/
748 GetSubpanelDataFromForm (Widget form,
749 SubpanelData ** subpanel_data_rtn)
754 ControlData * control_data;
755 SubpanelData * subpanel_data;
758 for (i = 0; i < panel.box_data_count; i++)
760 box_data = panel.box_data[i];
762 for (j = 0; j < box_data->control_data_count; j++)
764 control_data = box_data->control_data[j];
766 if (control_data->subpanel_data != NULL)
768 subpanel_data = control_data->subpanel_data;
770 if (subpanel_data == *subpanel_data_rtn) continue;
772 if (subpanel_data->form == form)
774 *subpanel_data_rtn = subpanel_data;
786 /************************************************************************
790 ************************************************************************/
793 KeyMenuPosition (Widget popup, Widget focus_widget)
797 XButtonPressedEvent bevent; /* synthetic button press event */
799 Position root_x, root_y;
804 /* get the gadget's x and y */
806 XtSetArg (args[0], XmNx, &x);
807 XtSetArg (args[1], XmNy, &y);
808 XtGetValues (focus_widget, args, 2);
811 /* get the focus widget's parent since the focus widget is a gadget */
813 parent = XtParent (focus_widget);
816 /* get the root coordinates of the gadget */
818 XtTranslateCoords (parent, x, y, &root_x, &root_y);
821 /* XmMenuPosition() only uses the root_x and root_y */
822 /* of the event for positioning */
824 bevent.x_root = root_x;
825 bevent.y_root = root_y;
828 /* set the menu positioning */
830 XmMenuPosition (popup, &bevent);
837 /************************************************************************
841 ************************************************************************/
844 GetMainControlData (BoxData * box_data,
850 ControlData * control_data;
851 Boolean found = False;
853 for (i = 0; i < box_data->control_data_count; i++)
855 control_data = box_data->control_data[i];
857 if (control_data->icon == focus_widget)
864 if (!found) return NULL;
866 return (control_data);
872 /************************************************************************
874 * GetSubpanelControlData
876 ************************************************************************/
879 GetSubpanelControlData (SubpanelData * subpanel_data,
885 ControlData * control_data;
886 Boolean found = False;
888 if ( subpanel_data->dropzone == focus_widget )
891 if (subpanel_data->main_panel_icon_copy == focus_widget ||
892 subpanel_data->parent_control_data->indicator == focus_widget)
894 return (subpanel_data->parent_control_data);
898 for (i = 0; i < subpanel_data->control_data_count; i++)
900 control_data = subpanel_data->control_data[i];
901 if (control_data->icon == focus_widget ||
902 control_data->indicator == focus_widget)
909 if (!found) return NULL;
911 return (control_data);
917 /************************************************************************
919 * SetupActionMenuItems
920 * Set up the action list for display in the popup menu for a
921 * control. This may require creating additional menu items is
922 * the action list for this control is greater that previously
923 * encountered or it may require umanaging menu item is there are
927 * w: The parent of the menu items.
928 * control_data: The control the menu is being set up for.
929 * action_item: A pointer to the array of menu items for the actions.
930 * action_count: A pointer to the total number of action items.
932 ************************************************************************/
936 SetupActionMenuItems (Widget w,
937 ControlData * control_data,
938 PopupData * popup_data,
939 Widget * action_item,
944 XmString label_string;
946 long num_actions = 0;
947 long action_index = *action_count;
951 /* Count the action list for the control in order to adjust */
952 /* the number of action menu items within the menu. */
954 if (control_data != NULL)
955 while (control_data->actions[num_actions] != NULL)
958 if (num_actions > *action_count )
960 action_item = (Widget *) XtRealloc((char *) action_item,
961 sizeof(Widget) * num_actions);
963 for (i = 0; i < num_actions - *action_count; i++)
965 action_item[action_index] =
966 XmCreatePushButtonGadget (w, "action_button", args, 0);
970 XtManageChild (action_item[action_index]);
971 XtAddCallback (action_item[action_index], XmNactivateCallback,
972 ActionCB, (XtPointer)action_index);
979 for (i = 0; i < *action_count; i++)
980 XtUnmanageChild (action_item[i]);
983 for (i = 0; i < num_actions ; i++)
985 XtSetArg (args[0], XmNuserData, control_data);
986 XtSetValues (action_item[i], args, 1);
989 for (i = 0; i < num_actions; i++)
991 if (control_data->actions[i]->action_label != NULL)
993 XmStringCreateLocalized (control_data->actions[i]->action_label);
996 XmStringCreateLocalized (control_data->actions[i]->action_name);
998 XtSetArg (args[0], XmNlabelString, label_string);
999 XtSetArg (args[1], XmNuserData, control_data);
1000 XtSetValues (action_item[i], args, 2);
1001 XmStringFree (label_string);
1004 for (i = 0; i < num_actions; i++)
1006 if (!XtIsManaged (action_item[i]))
1007 XtManageChild (action_item[i]);
1010 if (num_actions > 0)
1011 XtManageChild(popup_data->separator1);
1013 XtUnmanageChild(popup_data->separator1);
1020 /************************************************************************
1022 * UpdateMainControlMenu
1023 * Set up the label and the add/delete subpanel menu item for the
1027 * control_data: The control overwhich the menu is being posted.
1029 ************************************************************************/
1033 UpdateMainControlMenu (ControlData * control_data)
1037 XmString label_string;
1039 char * control_label;
1044 ElementValue * old_element_values;
1046 /* Save element values of control then load values of default control */
1048 if (control_data->subpanel_data != NULL &&
1049 control_data != control_data->subpanel_data->default_control)
1051 old_element_values = control_data->element_values;
1052 control_data->element_values =
1053 control_data->subpanel_data->default_control->element_values;
1056 /* Set the title of the menu */
1059 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1061 if (control_label == NULL)
1063 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1065 label_string = XmStringCreateLocalized (control_label);
1066 XtSetArg (args[0], XmNlabelString, label_string);
1067 XtSetValues (panel.popup_data->popup_title, args, 1);
1068 XmStringFree (label_string);
1071 /* If the control is blank, remove the add/delete subpanel item. */
1072 /* Otherwise, if there is a subpanel, activate the delete subpanel */
1073 /* item. Else activate the add subpanel item. */
1075 control_type = (long)control_data->element_values[CONTROL_TYPE].parsed_value;
1077 if (control_type != CONTROL_BLANK)
1079 XtManageChild (panel.popup_data->modify_subpanel_item);
1081 if (control_data->subpanel_data == NULL)
1083 if (panel.popup_data->subpanel_add_state != True)
1086 XmStringCreateLocalized ((FPGETMESSAGE(82, 10, "Add Subpanel")));
1087 XtSetArg (args[0], XmNlabelString, label_string);
1088 mnemonic = ((char *)FPGETMESSAGE(82, 11, "A"));
1089 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1090 XtSetArg (args[2], XmNuserData, control_data);
1091 XtSetValues (panel.popup_data->modify_subpanel_item, args, 3);
1093 XmStringFree (label_string);
1095 XtRemoveCallback (panel.popup_data->modify_subpanel_item,
1096 XmNactivateCallback, DeleteSubpanelCB, NULL);
1097 XtAddCallback (panel.popup_data->modify_subpanel_item,
1098 XmNactivateCallback, AddSubpanelCB, NULL);
1100 panel.popup_data->subpanel_add_state = True;
1104 XtSetArg (args[0], XmNuserData, control_data);
1105 XtSetValues (panel.popup_data->modify_subpanel_item, args, 1);
1110 if (panel.popup_data->subpanel_add_state == True)
1113 XmStringCreateLocalized ((FPGETMESSAGE(82, 12, "Delete Subpanel")));
1114 XtSetArg (args[0], XmNlabelString, label_string);
1115 mnemonic = ((char *)FPGETMESSAGE(82, 13, "D"));
1116 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1117 XtSetArg (args[2], XmNuserData, control_data);
1118 XtSetValues (panel.popup_data->modify_subpanel_item, args, 3);
1120 XmStringFree (label_string);
1122 XtRemoveCallback (panel.popup_data->modify_subpanel_item,
1123 XmNactivateCallback, AddSubpanelCB, NULL);
1124 XtAddCallback (panel.popup_data->modify_subpanel_item,
1125 XmNactivateCallback, DeleteSubpanelCB, NULL);
1127 panel.popup_data->subpanel_add_state = False;
1131 XtSetArg (args[0], XmNuserData, control_data);
1132 XtSetValues (panel.popup_data->modify_subpanel_item, args, 1);
1138 XtUnmanageChild (panel.popup_data->modify_subpanel_item);
1141 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1143 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1144 ControlTopicHelpCB, (XtPointer)control_data);
1146 XtUnmanageChild (panel.popup_data->deinstall_item);
1147 XtUnmanageChild (panel.popup_data->toggle_item);
1149 /* Restore element values to control. */
1151 if (control_data->subpanel_data != NULL &&
1152 control_data != control_data->subpanel_data->default_control)
1154 control_data->element_values = old_element_values;
1162 /************************************************************************
1164 * UpdateSubpanelControlMenu
1165 * Set the elements of the popup menu for a subpanel control
1166 * item to its proper values before it is made visible.
1169 * subpanel_data: The subpanel in which the menu is to be
1172 * control_data: The control that the menu is being brought up for.
1174 ************************************************************************/
1178 UpdateSubpanelControlMenu (SubpanelData * subpanel_data,
1179 ControlData * control_data)
1183 XmString label_string;
1185 char * control_label = NULL;
1187 /* Set the title of the menu */
1192 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1194 if (control_label == NULL)
1196 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1200 control_label = FPGETMESSAGE(82, 36, "Install Icon");
1203 label_string = XmStringCreateLocalized (control_label);
1204 XtSetArg (args[0], XmNlabelString, label_string);
1205 XtSetValues (panel.popup_data->popup_title, args, 1);
1206 XmStringFree (label_string);
1209 /* Set the sensitivity of the control deinstall and toggle menu item */
1211 if (control_data == NULL)
1213 XtSetSensitive (panel.popup_data->deinstall_item, False);
1214 XtSetSensitive (panel.popup_data->toggle_item, False);
1216 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1218 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1219 GeneralTopicHelpCB, (XtPointer)INSTALL_ZONE);
1223 XtSetSensitive (panel.popup_data->deinstall_item, True);
1224 XtSetArg (args[0], XmNuserData, control_data);
1225 XtSetValues(panel.popup_data->deinstall_item, args, 1);
1227 XtRemoveAllCallbacks (panel.popup_data->deinstall_item,
1228 XmNactivateCallback);
1230 XtAddCallback (panel.popup_data->deinstall_item, XmNactivateCallback,
1231 DeleteControlCB, (XtPointer) NULL);
1233 if ( control_data == subpanel_data->default_control)
1234 XtSetSensitive (panel.popup_data->toggle_item, False);
1236 XtSetSensitive (panel.popup_data->toggle_item, True);
1238 XtSetArg (args[0], XmNuserData, control_data);
1239 XtSetValues(panel.popup_data->toggle_item, args, 1);
1241 XtRemoveAllCallbacks (panel.popup_data->toggle_item,
1242 XmNactivateCallback);
1244 XtAddCallback (panel.popup_data->toggle_item, XmNactivateCallback,
1245 ToggleControlCB, (XtPointer) subpanel_data);
1247 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1249 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1250 ControlTopicHelpCB, (XtPointer)control_data);
1253 XtManageChild (panel.popup_data->deinstall_item);
1255 if (! (subpanel_data->parent_control_data->
1256 element_values[CONTROL_LOCKED].parsed_value))
1257 XtManageChild (panel.popup_data->toggle_item);
1259 XtUnmanageChild (panel.popup_data->toggle_item);
1261 XtUnmanageChild (panel.popup_data->modify_subpanel_item);
1267 /************************************************************************
1270 * Callback function which updates the popup menu for main panel
1271 * and subpanel controls before the menu is posted.
1273 ************************************************************************/
1277 PopupMenu (Widget w,
1278 XtPointer client_data,
1279 XtPointer call_data)
1283 XmAnyCallbackStruct * callback;
1285 Widget form, focus_widget;
1286 XmManagerWidget mgr;
1287 SubpanelData * subpanel_data = NULL;
1288 ControlData * control_data;
1289 BoxData * box_data = NULL;
1290 XmString label_string;
1292 long control_type, action_count = panel.popup_data->action_count;
1294 callback = (XmAnyCallbackStruct *) call_data;
1295 event = (XEvent *) callback->event;
1298 /* Get the form where the menu was posted from. */
1300 form = XmGetPostedFromWidget(w);
1302 XtSetArg (args[0], XmNuserData, &control_type);
1303 XtGetValues (form, args, 1);
1305 if (control_type == CONTROL)
1307 GetBoxDataFromForm (form, &box_data);
1308 subpanel_data = NULL;
1310 else if (control_type == SUBPANEL)
1312 GetSubpanelDataFromForm (form, &subpanel_data);
1316 if (event->type == ButtonPress)
1318 /* Change to use new Xme function when porting to Motif 2.0 */
1319 /* Get gadget at x, y position */
1321 focus_widget = (Widget) XmObjectAtPoint (form, event->xbutton.x,
1323 if (focus_widget == NULL)
1326 /* set the menu positioning */
1328 XmMenuPosition (panel.popup_data->popup, (XButtonPressedEvent *)event);
1332 /* get the widget that has the traversal focus */
1334 focus_widget = XmGetFocusWidget (form);
1337 /* set the menu positioning for non button events */
1339 KeyMenuPosition (panel.popup_data->popup, focus_widget);
1342 if (control_type == CONTROL)
1344 control_data = GetMainControlData (box_data, focus_widget);
1346 /* Find the right subpanel data if main control is not default */
1349 UpdateMainControlMenu (control_data);
1351 if (control_data->subpanel_data != NULL &&
1352 control_data != control_data->subpanel_data->default_control)
1354 subpanel_data = control_data->subpanel_data;
1355 control_data = control_data->subpanel_data->default_control;
1356 control_data->subpanel_data = subpanel_data;
1357 UpdateMainControlMenu (control_data);
1360 SetupActionMenuItems (w, control_data, panel.popup_data,
1361 panel.popup_data->action_item, &action_count);
1364 else if (control_type == SUBPANEL)
1366 control_data = GetSubpanelControlData (subpanel_data, focus_widget);
1368 UpdateSubpanelControlMenu (subpanel_data, control_data);
1370 SetupActionMenuItems (w, control_data, panel.popup_data,
1371 panel.popup_data->action_item, &action_count);
1374 panel.popup_data->action_count = action_count;
1380 /************************************************************************
1384 ************************************************************************/
1388 CreatePopupMenu (Widget w)
1392 Widget children[20];
1395 PopupData * popup_data;
1396 long i, child_num = 0;
1397 XmString label_string;
1399 popup_data = panel.popup_data = (PopupData *) XtMalloc(sizeof(PopupData));
1402 XtSetArg (args[i], XmNwhichButton, wmGD.bMenuButton); i++;
1404 popup_data->popup = XmCreatePopupMenu(w, "FPPopup", args, i);
1406 popup_data->add_ws_item = NULL;
1408 XtAddCallback (popup_data->popup, XmNmapCallback, PopupMenu,
1411 popup_data->popup_title = children[child_num++] =
1412 XmCreateLabelGadget(popup_data->popup, "title", NULL, 0);
1414 children[child_num++] = XmCreateSeparatorGadget(popup_data->popup,
1416 children[child_num++] = XmCreateSeparatorGadget(popup_data->popup,
1419 popup_data->action_item = (Widget *) XtMalloc(sizeof(Widget) * 5);
1420 popup_data->action_count = 0;
1422 for (i = 0; i < 5; i++)
1424 children[child_num] = popup_data->action_item[i] =
1425 XmCreatePushButtonGadget(popup_data->popup, "action_button", args, 0);
1426 popup_data->action_count++;
1428 XtManageChild (popup_data->action_item[i]);
1429 XtAddCallback (children[child_num++], XmNactivateCallback,
1430 ActionCB, (XtPointer) i);
1433 popup_data->separator1 = children[child_num++] =
1434 XmCreateSeparatorGadget (popup_data->popup, "sep3", NULL, 0);
1437 XmStringCreateLocalized((FPGETMESSAGE(82, 14, "Copy To Main Panel")));
1438 XtSetArg (args[0], XmNlabelString, label_string);
1439 mnemonic = ((char *)FPGETMESSAGE(82, 15, "C"));
1440 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1441 popup_data->toggle_item = children[child_num] =
1442 XmCreatePushButtonGadget (popup_data->popup, "Toggle_Control", args, 2);
1443 XmStringFree (label_string);
1445 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 16, "Delete")));
1446 XtSetArg (args[0], XmNlabelString, label_string);
1447 mnemonic = ((char *)FPGETMESSAGE(82, 17, "D"));
1448 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1449 popup_data->deinstall_item = children[child_num] =
1450 XmCreatePushButtonGadget(popup_data->popup, "Delete_Control",
1452 XmStringFree (label_string);
1455 XmStringCreateLocalized ((FPGETMESSAGE(82, 10, "Add Subpanel")));
1456 XtSetArg (args[0], XmNlabelString, label_string);
1457 mnemonic = ((char *)FPGETMESSAGE(82, 11, "A"));
1458 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1459 popup_data->modify_subpanel_item = children[child_num] =
1460 XmCreatePushButtonGadget (popup_data->popup, "Add_Subpanel", args, 2);
1461 XmStringFree (label_string);
1463 XtAddCallback(children[child_num++], XmNactivateCallback, AddSubpanelCB,
1465 popup_data->subpanel_add_state = True;
1467 popup_data->separator2 = children[child_num++] =
1468 XmCreateSeparatorGadget(popup_data->popup, "sep4", NULL, 0);
1470 label_string = XmStringCreateLocalized ((FPGETMESSAGE(82, 18, "Help")));
1471 XtSetArg (args[0], XmNlabelString, label_string);
1472 mnemonic = ((char *)FPGETMESSAGE(82, 19, "H"));
1473 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1474 popup_data->help_item = children[child_num++] =
1475 XmCreatePushButtonGadget (popup_data->popup, "Help", args, 2);
1476 XmStringFree (label_string);
1478 XtManageChildren(children, child_num);
1484 /************************************************************************
1486 * CreateActionButtons
1487 * Show the the action menu items and hide workspace menu items since
1488 * we are over a control.
1491 ************************************************************************/
1495 CreateActionButtons (Widget w,
1496 SwitchData * switch_data,
1497 ControlData * control_data)
1501 PopupData * popup_data = switch_data->popup_data;
1502 long action_count = popup_data->action_count;
1504 XmString label_string;
1505 char * control_label;
1507 /* Set the title of the menu */
1510 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1512 if (control_label == NULL)
1514 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1516 label_string = XmStringCreateLocalized (control_label);
1517 XtSetArg (args[0], XmNlabelString, label_string);
1518 XtSetValues (popup_data->popup_title, args, 1);
1519 XmStringFree (label_string);
1521 /* show actions items */
1522 SetupActionMenuItems(w, control_data, popup_data,
1523 popup_data->action_item, &action_count);
1524 popup_data->action_count = action_count;
1526 /* hide add and delete workspace items */
1527 XtUnmanageChild(popup_data->add_ws_item);
1528 XtUnmanageChild(popup_data->delete_ws_item);
1529 XtUnmanageChild(popup_data->rename_ws_item);
1531 /* reset the help callback to reflect switch control help */
1532 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1533 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1534 ControlTopicHelpCB, control_data);
1541 /************************************************************************
1543 * ShowWorkspaceItems
1544 * Don't show the the action menu items since we are not over a control.
1545 * Reset the activate callbacks with the latest data.
1547 ************************************************************************/
1551 ShowWorkspaceItems (SwitchData * switch_data,
1552 Widget focus_widget)
1556 PopupData * popup_data = switch_data->popup_data;
1559 XmString label_string;
1560 char * control_label;
1566 /* hide actions items */
1568 for (i = 0; i < popup_data->action_count; i++)
1569 XtUnmanageChild (popup_data->action_item[i]);
1572 /* show add and delete workspace items */
1574 XtManageChild (popup_data->add_ws_item);
1575 XtManageChild (popup_data->delete_ws_item);
1576 XtManageChild (popup_data->rename_ws_item);
1579 /* reset the activate callback to reflect current button index */
1581 XtRemoveAllCallbacks (popup_data->delete_ws_item, XmNactivateCallback);
1582 for (i = 0; i < switch_data->switch_count &&
1583 switch_data->buttons[i] != NULL; i++)
1585 if (switch_data->buttons[i] == focus_widget) break;
1589 /* If we didn't find the switch button to post the menu for, it */
1590 /* must be in edit mode so the correct menu is the active switch */
1592 if (i >= switch_data->switch_count)
1593 i = switch_data->active_switch;
1596 /* Set the title of the menu */
1598 format = strdup (FPGETMESSAGE(82, 20, "%1$s %2$s"));
1599 ws = strdup (FPGETMESSAGE(82, 21, "Workspace"));
1600 ws_name = switch_data->switch_names[i];
1602 control_label = XtMalloc (sizeof(char) * (strlen(ws) + strlen(ws_name) + 4));
1604 sprintf (control_label, format, ws, ws_name);
1608 label_string = XmStringCreateLocalized (control_label);
1609 XtSetArg (args[0], XmNlabelString, label_string);
1610 XtSetValues (popup_data->popup_title, args, 1);
1611 XmStringFree (label_string);
1612 XtFree(control_label);
1614 XtAddCallback (popup_data->delete_ws_item, XmNactivateCallback,
1615 DeleteWorkspaceCB, (XtPointer) i);
1617 /* reset the activate callback to reflect current button index */
1618 XtRemoveAllCallbacks (popup_data->rename_ws_item, XmNactivateCallback);
1619 XtAddCallback (popup_data->rename_ws_item, XmNactivateCallback,
1620 RenameWorkspaceCB, (XtPointer) i);
1622 /* reset the help callback to reflect switch button help */
1623 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1624 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1625 GeneralTopicHelpCB, (XtPointer) SWITCH_BUTTON);
1627 XtManageChild(popup_data->separator1);
1633 /************************************************************************
1635 * ShowPartialWorkspaceItems
1636 * Don't show the delete workspace item since we are not over
1637 * a workspace button and don't show the action menu items since we are
1638 * not over a control. Reset the activate callback with the latest data.
1640 ************************************************************************/
1643 ShowPartialWorkspaceItems(SwitchData * switch_data)
1647 PopupData * popup_data = switch_data->popup_data;
1650 XmString label_string;
1652 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 22, "Switch Area")));
1653 XtSetArg (args[0], XmNlabelString, label_string);
1654 XtSetValues (popup_data->popup_title, args, 1);
1655 XmStringFree (label_string);
1657 /* hide actions items */
1658 for (i = 0; i < popup_data->action_count; i++)
1659 XtUnmanageChild (popup_data->action_item[i]);
1661 /* show add workspace item */
1662 XtManageChild (popup_data->add_ws_item);
1664 /* hide delete and rename workspace items */
1665 XtUnmanageChild (popup_data->delete_ws_item);
1666 XtUnmanageChild (popup_data->rename_ws_item);
1668 /* reset the help callback to reflect switch area help */
1669 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1670 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1671 SwitchTopicHelpCB, (XtPointer)switch_data);
1673 XtManageChild(popup_data->separator1);
1680 /************************************************************************
1682 * GetSwitchDataFromForm
1684 ************************************************************************/
1689 GetSwitchDataFromForm (Widget form,
1690 SwitchData ** switch_data_rtn)
1697 for (i = 0; i < panel.box_data_count; i++)
1699 box_data = panel.box_data[i];
1701 if (box_data->switch_form == form)
1703 *switch_data_rtn = box_data->switch_data;
1712 /************************************************************************
1714 * GetSwtichControlData
1716 ************************************************************************/
1719 static ControlData *
1720 GetSwitchControlData (SwitchData * switch_data,
1721 Widget focus_widget)
1726 ControlData * control_data;
1727 Boolean found = False;
1729 for (i = 0; i < switch_data->control_data_count; i++)
1731 control_data = switch_data->control_data[i];
1733 if (control_data->icon == focus_widget)
1740 if (!found) return NULL;
1742 return (control_data);
1749 /************************************************************************
1753 ************************************************************************/
1756 WSPopupMenu (Widget w,
1757 XtPointer client_data,
1758 XtPointer call_data)
1762 XmManagerWidget mgr = (XmManagerWidget) w;
1763 int num_children = mgr->composite.num_children;
1764 XmAnyCallbackStruct * callback;
1766 Widget form, focus_widget;
1767 SwitchData * switch_data;
1768 ControlData * control_data = NULL;
1769 Boolean is_button = False;
1774 callback = (XmAnyCallbackStruct *) call_data;
1775 event = (XEvent *) callback->event;
1778 /* get the form where the menu was posted from */
1780 form = XmGetPostedFromWidget (w);
1782 GetSwitchDataFromForm (form, &switch_data);
1785 if (event->type == ButtonPress)
1788 /* Change to use new Xme function when porting to Motif 2.0 */
1789 /* Get gadget at x, y position */
1791 focus_widget = (Widget) XmObjectAtPoint (form, event->xbutton.x,
1794 if (focus_widget == NULL)
1796 XtSetArg (args[0], XmNx, &x);
1797 XtSetArg (args[1], XmNy, &y);
1798 XtGetValues(switch_data->rc, args, 2);
1800 focus_widget = (Widget) XmObjectAtPoint (switch_data->rc,
1801 event->xbutton.x - x,
1802 event->xbutton.y - y);
1806 control_data = GetSwitchControlData (switch_data, focus_widget);
1809 /* set the menu positioning */
1811 XmMenuPosition (switch_data->popup_data->popup,
1812 (XButtonPressedEvent *) event);
1817 /* get the widget that has the traversal focus */
1819 focus_widget = XmGetFocusWidget (form);
1821 control_data = GetSwitchControlData (switch_data, focus_widget);
1823 if (control_data == NULL)
1826 /* set the menu positioning for non button events */
1828 KeyMenuPosition (switch_data->popup_data->popup, focus_widget);
1831 if (focus_widget != NULL)
1834 /* The mouse is over a button in the switch area */
1835 ShowWorkspaceItems (switch_data, focus_widget);
1838 if (control_data != NULL)
1841 (long) control_data->element_values[CONTROL_TYPE].parsed_value;
1843 if (control_type != CONTROL_BLANK)
1844 /* The mouse is over a control in the switch area */
1845 CreateActionButtons (w, switch_data, control_data);
1847 /* The mouse is over a blank control in the switch area */
1848 ShowPartialWorkspaceItems (switch_data);
1853 * The mouse is over area other than the buttons and control
1854 * in the switch area
1856 ShowPartialWorkspaceItems (switch_data);
1862 * The mouse is over area other than the buttons and control
1863 * in the switch area
1865 ShowPartialWorkspaceItems (switch_data);
1871 /************************************************************************
1873 * CreateWorkspacePopupMenu
1875 ************************************************************************/
1879 CreateWorkspacePopupMenu (Widget w,
1880 SwitchData * switch_data)
1884 Widget children[20];
1885 XmString label_string;
1888 long i, child_num = 0;
1889 PopupData * popup_data;
1891 popup_data = (PopupData *) XtMalloc(sizeof(PopupData));
1894 XtSetArg (args[i], XmNwhichButton, wmGD.bMenuButton); i++;
1896 popup_data->popup = XmCreatePopupMenu(w, "WSPopup", args, i);
1898 popup_data->deinstall_item = NULL;
1899 popup_data->toggle_item = NULL;
1900 popup_data->modify_subpanel_item = NULL;
1901 popup_data->subpanel_add_state = True;
1903 XtAddCallback(popup_data->popup, XmNmapCallback, WSPopupMenu,
1904 (XtPointer) switch_data);
1906 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 22, "Switch Area")));
1907 XtSetArg (args[0], XmNlabelString, label_string);
1908 popup_data->popup_title = children[child_num++] =
1909 XmCreateLabelGadget (popup_data->popup, "title", args, 1);
1910 XmStringFree (label_string);
1912 children[child_num++] = XmCreateSeparatorGadget (popup_data->popup, "sep1",
1914 children[child_num++] = XmCreateSeparatorGadget (popup_data->popup, "sep2",
1917 popup_data->action_item = (Widget *) XtMalloc(sizeof(Widget) * 5);
1918 popup_data->action_count = 0;
1920 for (i = 0; i < 5; i++)
1922 children[child_num] = popup_data->action_item[i] =
1923 XmCreatePushButtonGadget (popup_data->popup, "action_button", args, 0);
1924 popup_data->action_count++;
1926 XtManageChild (popup_data->action_item[i]);
1927 XtAddCallback (children[child_num++], XmNactivateCallback,
1928 ActionCB, (XtPointer) i);
1932 XmStringCreateLocalized ((FPGETMESSAGE(82, 23, "Add Workspace")));
1933 XtSetArg (args[0], XmNlabelString, label_string);
1934 mnemonic = ((char *)FPGETMESSAGE(82, 24, "A"));
1935 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1936 popup_data->add_ws_item = children[child_num] =
1937 XmCreatePushButtonGadget (popup_data->popup, "Add_Workspace", args, 2);
1938 XmStringFree (label_string);
1940 XtAddCallback(children[child_num++], XmNactivateCallback, AddWorkspaceCB,
1943 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 25, "Delete")));
1944 XtSetArg (args[0], XmNlabelString, label_string);
1945 mnemonic = ((char *)FPGETMESSAGE(82, 26, "D"));
1946 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1947 popup_data->delete_ws_item = children[child_num] =
1948 XmCreatePushButtonGadget (popup_data->popup,
1949 "Delete_Workspace", args, 2);
1950 XmStringFree (label_string);
1952 XtAddCallback(children[child_num++], XmNactivateCallback,
1953 DeleteWorkspaceCB, (XtPointer) 0);
1955 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 27, "Rename")));
1956 XtSetArg (args[0], XmNlabelString, label_string);
1957 mnemonic = ((char *)FPGETMESSAGE(82, 28, "R"));
1958 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1959 popup_data->rename_ws_item = children[child_num] =
1960 XmCreatePushButtonGadget (popup_data->popup,
1961 "Rename_Workspace", args, 2);
1962 XmStringFree (label_string);
1964 XtAddCallback(children[child_num++], XmNactivateCallback,
1965 RenameWorkspaceCB, (XtPointer) 0);
1967 popup_data->separator1 = children[child_num++] =
1968 XmCreateSeparatorGadget (popup_data->popup, "sep3", NULL, 0);
1970 popup_data->separator2 = NULL;
1972 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 29, "Help")));
1973 XtSetArg (args[0], XmNlabelString, label_string);
1974 mnemonic = ((char *)FPGETMESSAGE(82, 30, "H"));
1975 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1976 popup_data->help_item = children[child_num++] =
1977 XmCreatePushButtonGadget (popup_data->popup, "Help", args, 2);
1978 XmStringFree (label_string);
1980 XtManageChildren(children, child_num);
1982 switch_data->popup_data = popup_data;