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 /*****************************************************************************
24 *****************************************************************************
30 ** Description: This file contains the functions for creating and managing
31 ** the main panel and subpanel popup menus.
34 ****************************************************************************
35 *****************************************************************************/
39 #include <Xm/ManagerP.h>
40 #include <Xm/RowColumn.h>
41 #include <Xm/LabelG.h>
42 #include <Xm/PushBG.h>
43 #include <Xm/SeparatoG.h>
45 #include <Dt/SharedProcs.h>
47 #include "DataBaseLoad.h"
51 #define POPUP_CHILDREN 7
54 extern void ToggleDefaultControl (ControlData *, SubpanelData *, ControlData *);
55 extern void SwitchRenameLabel (Widget, BoxData *);
56 extern Boolean CheckControlTypeFile (ControlData *);
64 /************************************************************************
68 ************************************************************************/
72 XtPointer client_data,
77 ControlData * control_data;
80 long indx = (long) client_data;
84 XtSetArg (args[0], XmNuserData, &control_data);
85 XtGetValues(w, args, 1);
87 if (CheckControlTypeFile (control_data) == False)
90 control_type = (long) (control_data->element_values[CONTROL_TYPE].parsed_value);
92 if (control_type == CONTROL_FILE && !control_data->is_action)
96 aap = (DtActionArg *) XtCalloc(1,sizeof(DtActionArg));
98 aap->argClass = DtACTION_FILE;
100 aap->u.file.name = (char *)
101 control_data->element_values[CONTROL_FILE_NAME].parsed_value;
103 DtActionInvoke (control_data->icon,
104 control_data->actions[indx]->action_name,
105 aap, 1, NULL, NULL, NULL, 1, NULL, NULL);
107 XtFree ((char *) aap);
111 DtActionInvoke (control_data->icon,
112 control_data->actions[indx]->action_name,
113 control_data->actions[indx]->aap,
114 control_data->actions[indx]->count,
115 NULL, NULL, NULL, 1, NULL, NULL);
120 /************************************************************************
123 * The callback function is called off of a menu pick to delete
124 * a specific workspace. The function identifies the index of the
125 * workspace and calls the workspace manager API to perform the delete.
126 * All frontpanel UI processing is performed through a notification
127 * callback issued by the workspace manager after a successful delete.
129 ************************************************************************/
132 DeleteWorkspaceCB (Widget w,
133 XtPointer client_data,
138 long delete_workspace = (long) client_data;
139 SwitchData * switch_data = NULL;
143 /* Look up the switch data to get the atom name of the workspace */
146 for (i = 0; i < panel.box_data_count; i++)
148 if (panel.box_data[i]->switch_data != NULL)
150 switch_data = panel.box_data[i]->switch_data;
157 _DtWsmDeleteWorkspace (panel.shell,
158 switch_data->atom_names[delete_workspace]);
165 /************************************************************************
168 * The callback function is called off of a menu pick to rename
169 * a specific workspace. The function identifies the index of the
170 * workspace and calls SwitchRenameLabel() function to change the switch.
171 * button to a text widget for typing the new workspace name and setting.
172 * up the callback to accept the new name upon activation.
174 ************************************************************************/
177 RenameWorkspaceCB (Widget w,
178 XtPointer client_data,
183 long rename_ws = (long) client_data;
184 SwitchData * switch_data = NULL;
188 /* Look up the switch data to get the atom name of the workspace */
191 for (i = 0; i < panel.box_data_count; i++)
193 if (panel.box_data[i]->switch_data != NULL)
195 switch_data = panel.box_data[i]->switch_data;
201 SwitchRenameLabel (switch_data->buttons[rename_ws], panel.box_data[i]);
209 /************************************************************************
212 * The callback function is called off of a menu pick. It generates
213 * a new workspace name and calls the workspace manager API to
214 * create the new workspace. All frontpanel UI processing is
215 * performed through a notification callback issued by the workspace
216 * manager after a successful add.
218 ************************************************************************/
221 AddWorkspaceCB (Widget w,
222 XtPointer client_data,
227 SwitchData * switch_data = NULL;
235 /* Get the beginning part of the new name */
237 temp_name = FPGETMESSAGE (82, 35, "New");
238 slen = strlen (temp_name) + 5 + 1;
239 switch_name = XtCalloc(1, slen);
240 strcpy (switch_name, temp_name);
243 /* Look up the switch data to get the atom name of the workspace */
246 for (i = 0; i < panel.box_data_count; i++)
248 if (panel.box_data[i]->switch_data != NULL)
250 switch_data = panel.box_data[i]->switch_data;
256 /* Generate a new title for the workspace. It should be unique */
257 /* from the existing title. */
268 for (i = 0; i < switch_data->switch_count; i++)
270 if (strcmp (switch_name, switch_data->switch_names[i]) == 0)
273 snprintf (switch_name, slen - 1, "%s_%d", temp_name, append);
280 _DtWsmCreateWorkspace (panel.shell, switch_name);
289 /************************************************************************
293 ************************************************************************/
298 XtPointer client_data,
299 XtPointer call_data )
301 XtUnmanageChild((Widget)client_data);
302 XmUpdateDisplay((Widget)client_data);
303 XtDestroyWidget((Widget)client_data);
309 /************************************************************************
312 * Called from the Ok button on the confimation dialog when a
313 * control deletion is seleted from the popup menu.
315 ************************************************************************/
319 DeleteControlOkCB (Widget w,
320 XtPointer client_data,
325 ControlData * control_data;
326 SubpanelData * subpanel_data;
330 /* Extract the control data from the user data field of the */
331 /* widget pointed to by client data. */
333 XtSetArg (args[0], XmNuserData, &control_data);
334 XtGetValues((Widget) client_data, args, 1);
337 /* Get the subpanel data for the control. Check to see if the */
338 /* control is a real subpanel control or the main panel copy. */
340 if (control_data->parent_type == SUBPANEL)
341 subpanel_data = (SubpanelData *) control_data->parent_data;
343 subpanel_data = (SubpanelData *) control_data->subpanel_data;
346 /* Get rid of the dialog and call the funtion to delete the control */
348 XtUnmanageChild ((Widget) client_data);
349 XmUpdateDisplay ((Widget) client_data);
351 DeleteSubpanelControl (subpanel_data, control_data);
353 XtDestroyWidget ((Widget) client_data);
359 /************************************************************************
363 ************************************************************************/
368 XtPointer client_data,
369 XtPointer call_data )
371 ControlData * control_data;
374 XtSetArg (args[0], XmNuserData, &control_data);
375 XtGetValues((Widget)client_data, args, 1);
377 XtUnmanageChild((Widget)client_data);
378 XmUpdateDisplay((Widget)client_data);
380 DeleteSubpanel(control_data);
382 XtDestroyWidget((Widget)client_data);
386 /************************************************************************
390 ************************************************************************/
393 DeleteControlCB (Widget w,
394 XtPointer client_data,
399 ControlData * control_data;
401 SubpanelData *subpanel_data;
404 String title, del_ctrl, ctrl_name, ctrl_label, del_msg, message;
405 long indx = (long) client_data;
408 XtSetArg (args[0], XmNuserData, &control_data);
409 XtGetValues (w, args, 1);
411 del_ctrl = FPGETMESSAGE(82, 31, "Delete Control:");
412 del_ctrl = XtNewString (del_ctrl);
414 ctrl_label = (char *)
415 control_data->element_values[CONTROL_LABEL].parsed_value;
417 control_data->element_values[CONTROL_NAME].parsed_value;
419 if (ctrl_label == NULL)
420 ctrl_label = ctrl_name;
422 if (control_data->element_values[CONTROL_LOCKED].parsed_value)
424 title = FPGETMESSAGE(82,1, "Workspace Manager - Delete Locked Control Error");
425 title = XtNewString (title);
427 del_msg = FPGETMESSAGE(82,5, "This control cannot be deleted because it is locked.");
428 del_msg = XtNewString (del_msg);
430 message = XtMalloc (sizeof(char) *
431 (strlen(del_ctrl) + strlen(ctrl_label) +
432 strlen(del_msg) + 4));
434 sprintf(message, "%s %s\n\n%s", del_ctrl, ctrl_label, del_msg);
436 _DtMessage (XtParent(w), title, message, NULL, NULL);
445 title = FPGETMESSAGE(82,2, "Workspace Manager - Delete Control");
446 title = XtNewString (title);
448 if (SessionFileNameLookup (ctrl_name, CONTROL, (char *) control_data->element_values[CONTROL_CONTAINER_NAME].parsed_value, SUBPANEL) == NULL)
449 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?");
451 del_msg = FPGETMESSAGE(82,6, "Are you sure you want to delete this control?");
453 del_msg = XtNewString (del_msg);
455 message = XtMalloc (sizeof(char) *
456 (strlen(del_ctrl) + strlen(ctrl_label) +
457 strlen(del_msg) + 4));
459 sprintf(message, "%s %s\n\n%s", del_ctrl, ctrl_label, del_msg);
462 /* Get the subpanel data for the control. Check to see if the */
463 /* control is a real subpanel control or the main panel copy. */
465 if (control_data->parent_type == SUBPANEL)
466 subpanel_data = (SubpanelData *) control_data->parent_data;
468 subpanel_data = (SubpanelData *) control_data->subpanel_data;
470 dialog = _DtMessageDialog(subpanel_data->shell,title,message,NULL,TRUE,
472 dialog = _DtMessageDialog(panel.shell, title, message, NULL, TRUE,
474 DeleteCancelCB, DeleteControlOkCB, NULL, NULL, False,
477 XtSetArg (args[0], XmNuserData, control_data);
478 XtSetArg (args[1], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
479 XtSetValues (dialog, args, 2);
492 /************************************************************************
495 * This callback initiates a subpanel control being toggled into
498 ************************************************************************/
501 ToggleControlCB (Widget w,
502 XtPointer client_data,
507 SubpanelData * subpanel_data = (SubpanelData *) client_data;
508 ControlData * control_data;
509 long indx = (long) client_data;
512 XtSetArg (args[0], XmNuserData, &control_data);
513 XtGetValues(w, args, 1);
515 ToggleDefaultControl (subpanel_data->parent_control_data,
516 subpanel_data, control_data);
522 /************************************************************************
526 ************************************************************************/
529 AddSubpanelCB (Widget w,
530 XtPointer client_data,
535 ControlData * control_data;
536 long indx = (long) client_data;
539 XtSetArg (args[0], XmNuserData, &control_data);
540 XtGetValues(w, args, 1);
542 AddSubpanel(control_data);
548 /************************************************************************
552 ************************************************************************/
555 DeleteSubpanelCB (Widget w,
556 XtPointer client_data,
561 ControlData * control_data;
562 SubpanelData * subpanel_data;
564 String title, message, del_spanel, spanel_name, del_msg;
567 XtSetArg (args[0], XmNuserData, &control_data);
568 XtGetValues(w, args, 1);
570 subpanel_data = (SubpanelData *) control_data->subpanel_data;
572 subpanel_data = (SubpanelData *) control_data->parent_data;
574 del_spanel = FPGETMESSAGE(82, 33, "Delete Subpanel:");
575 del_spanel = XtNewString (del_spanel);
577 spanel_name = (char *)
578 subpanel_data->element_values[SUBPANEL_NAME].parsed_value;
580 if (subpanel_data->element_values[SUBPANEL_LOCKED].parsed_value)
582 title = FPGETMESSAGE(82,3, "Workspace Manager - Delete Locked Subpanel Error");
583 title = XtNewString (title);
585 del_msg = FPGETMESSAGE(82,7, "This subpanel cannot be deleted because it is locked.");
586 del_msg = XtNewString (del_msg);
588 message = XtMalloc (sizeof(char) *
589 (strlen(del_spanel) + strlen(spanel_name) +
590 strlen(del_msg) + 4));
592 sprintf(message, "%s %s\n\n%s", del_spanel, spanel_name, del_msg);
594 _DtMessage (XtParent(w), title, message, NULL, NULL);
603 title = FPGETMESSAGE(82,4, "Workspace Manager - Delete Subpanel");
604 title = XtNewString (title);
606 if (subpanel_data->control_data_count > 0)
608 if (SessionFileNameLookup (spanel_name, SUBPANEL, (char *)
609 subpanel_data->element_values[SUBPANEL_CONTAINER_NAME].parsed_value,
611 del_msg = FPGETMESSAGE(82,34,
612 "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?");
614 del_msg = FPGETMESSAGE(82,8, "This subpanel contains more than one control.\n\nAre you sure you want to delete this subpanel?");
617 del_msg = FPGETMESSAGE(82,9, "Are you sure you want to delete this subpanel?");
619 del_msg = XtNewString (del_msg);
621 message = XtMalloc (sizeof(char) *
622 (strlen(del_spanel) + strlen(spanel_name) +
623 strlen(del_msg) + 4));
625 sprintf(message, "%s %s\n\n%s", del_spanel, spanel_name, del_msg);
628 dialog = _DtMessageDialog(subpanel_data->shell,title,message,NULL,TRUE,
630 dialog = _DtMessageDialog(panel.shell, title, message, NULL, TRUE,
632 DeleteCancelCB, DeleteSubpanelOkCB, NULL, NULL, False,
635 XtSetArg (args[0], XmNuserData, control_data);
636 XtSetArg (args[1], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
637 XtSetValues(dialog, args, 2);
650 /************************************************************************
652 * PostWorkspacePopupMenu
654 ************************************************************************/
658 PostWorkspacePopupMenu (Widget w,
659 XtPointer client_data,
666 SwitchData * switch_data = NULL;
667 XButtonEvent * b_event = (XButtonEvent *) event;
669 /* only use BMENU press events */
671 if (b_event->button != wmGD.bMenuButton) return;
673 for (i = 0; i < panel.box_data_count; i++)
675 box_data = panel.box_data[i];
677 if (box_data->switch_data != NULL)
678 switch_data = box_data->switch_data;
681 if (switch_data != NULL)
682 XtManageChild(switch_data->popup_data->popup);
688 /************************************************************************
692 ************************************************************************/
695 PostPopupMenu (Widget w,
696 XtPointer client_data,
701 XButtonEvent * b_event = (XButtonEvent *) event;
703 /* only use BMENU press events */
705 if (b_event->button != wmGD.bMenuButton) return;
707 XtManageChild(panel.popup_data->popup);
713 /************************************************************************
717 ************************************************************************/
720 GetBoxDataFromForm (Widget form,
721 BoxData ** box_data_rtn)
728 for (i = 0; i < panel.box_data_count; i++)
730 box_data = panel.box_data[i];
732 if (box_data == *box_data_rtn) continue;
734 if (box_data->left_control_form == form ||
735 box_data->right_control_form == form)
737 *box_data_rtn = box_data;
746 /************************************************************************
748 * GetSubpanelDataFromForm
750 ************************************************************************/
753 GetSubpanelDataFromForm (Widget form,
754 SubpanelData ** subpanel_data_rtn)
759 ControlData * control_data;
760 SubpanelData * subpanel_data;
763 for (i = 0; i < panel.box_data_count; i++)
765 box_data = panel.box_data[i];
767 for (j = 0; j < box_data->control_data_count; j++)
769 control_data = box_data->control_data[j];
771 if (control_data->subpanel_data != NULL)
773 subpanel_data = control_data->subpanel_data;
775 if (subpanel_data == *subpanel_data_rtn) continue;
777 if (subpanel_data->form == form)
779 *subpanel_data_rtn = subpanel_data;
791 /************************************************************************
795 ************************************************************************/
798 KeyMenuPosition (Widget popup, Widget focus_widget)
802 XButtonPressedEvent bevent; /* synthetic button press event */
804 Position root_x, root_y;
809 /* get the gadget's x and y */
811 XtSetArg (args[0], XmNx, &x);
812 XtSetArg (args[1], XmNy, &y);
813 XtGetValues (focus_widget, args, 2);
816 /* get the focus widget's parent since the focus widget is a gadget */
818 parent = XtParent (focus_widget);
821 /* get the root coordinates of the gadget */
823 XtTranslateCoords (parent, x, y, &root_x, &root_y);
826 /* XmMenuPosition() only uses the root_x and root_y */
827 /* of the event for positioning */
829 bevent.x_root = root_x;
830 bevent.y_root = root_y;
833 /* set the menu positioning */
835 XmMenuPosition (popup, &bevent);
842 /************************************************************************
846 ************************************************************************/
849 GetMainControlData (BoxData * box_data,
855 ControlData * control_data;
856 Boolean found = False;
858 for (i = 0; i < box_data->control_data_count; i++)
860 control_data = box_data->control_data[i];
862 if (control_data->icon == focus_widget)
869 if (!found) return NULL;
871 return (control_data);
877 /************************************************************************
879 * GetSubpanelControlData
881 ************************************************************************/
884 GetSubpanelControlData (SubpanelData * subpanel_data,
890 ControlData * control_data;
891 Boolean found = False;
893 if ( subpanel_data->dropzone == focus_widget )
896 if (subpanel_data->main_panel_icon_copy == focus_widget ||
897 subpanel_data->parent_control_data->indicator == focus_widget)
899 return (subpanel_data->parent_control_data);
903 for (i = 0; i < subpanel_data->control_data_count; i++)
905 control_data = subpanel_data->control_data[i];
906 if (control_data->icon == focus_widget ||
907 control_data->indicator == focus_widget)
914 if (!found) return NULL;
916 return (control_data);
922 /************************************************************************
924 * SetupActionMenuItems
925 * Set up the action list for display in the popup menu for a
926 * control. This may require creating additional menu items is
927 * the action list for this control is greater that previously
928 * encountered or it may require umanaging menu item is there are
932 * w: The parent of the menu items.
933 * control_data: The control the menu is being set up for.
934 * action_item: A pointer to the array of menu items for the actions.
935 * action_count: A pointer to the total number of action items.
937 ************************************************************************/
941 SetupActionMenuItems (Widget w,
942 ControlData * control_data,
943 PopupData * popup_data,
944 Widget * action_item,
949 XmString label_string;
951 long num_actions = 0;
952 long action_index = *action_count;
956 /* Count the action list for the control in order to adjust */
957 /* the number of action menu items within the menu. */
959 if (control_data != NULL)
960 while (control_data->actions[num_actions] != NULL)
963 if (num_actions > *action_count )
965 action_item = (Widget *) XtRealloc((char *) action_item,
966 sizeof(Widget) * num_actions);
968 for (i = 0; i < num_actions - *action_count; i++)
970 action_item[action_index] =
971 XmCreatePushButtonGadget (w, "action_button", args, 0);
975 XtManageChild (action_item[action_index]);
976 XtAddCallback (action_item[action_index], XmNactivateCallback,
977 ActionCB, (XtPointer)action_index);
984 for (i = 0; i < *action_count; i++)
985 XtUnmanageChild (action_item[i]);
988 for (i = 0; i < num_actions ; i++)
990 XtSetArg (args[0], XmNuserData, control_data);
991 XtSetValues (action_item[i], args, 1);
994 for (i = 0; i < num_actions; i++)
996 if (control_data->actions[i]->action_label != NULL)
998 XmStringCreateLocalized (control_data->actions[i]->action_label);
1001 XmStringCreateLocalized (control_data->actions[i]->action_name);
1003 XtSetArg (args[0], XmNlabelString, label_string);
1004 XtSetArg (args[1], XmNuserData, control_data);
1005 XtSetValues (action_item[i], args, 2);
1006 XmStringFree (label_string);
1009 for (i = 0; i < num_actions; i++)
1011 if (!XtIsManaged (action_item[i]))
1012 XtManageChild (action_item[i]);
1015 if (num_actions > 0)
1016 XtManageChild(popup_data->separator1);
1018 XtUnmanageChild(popup_data->separator1);
1025 /************************************************************************
1027 * UpdateMainControlMenu
1028 * Set up the label and the add/delete subpanel menu item for the
1032 * control_data: The control overwhich the menu is being posted.
1034 ************************************************************************/
1038 UpdateMainControlMenu (ControlData * control_data)
1042 XmString label_string;
1044 char * control_label;
1049 ElementValue * old_element_values;
1051 /* Save element values of control then load values of default control */
1053 if (control_data->subpanel_data != NULL &&
1054 control_data != control_data->subpanel_data->default_control)
1056 old_element_values = control_data->element_values;
1057 control_data->element_values =
1058 control_data->subpanel_data->default_control->element_values;
1061 /* Set the title of the menu */
1064 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1066 if (control_label == NULL)
1068 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1070 label_string = XmStringCreateLocalized (control_label);
1071 XtSetArg (args[0], XmNlabelString, label_string);
1072 XtSetValues (panel.popup_data->popup_title, args, 1);
1073 XmStringFree (label_string);
1076 /* If the control is blank, remove the add/delete subpanel item. */
1077 /* Otherwise, if there is a subpanel, activate the delete subpanel */
1078 /* item. Else activate the add subpanel item. */
1080 control_type = (long)control_data->element_values[CONTROL_TYPE].parsed_value;
1082 if (control_type != CONTROL_BLANK)
1084 XtManageChild (panel.popup_data->modify_subpanel_item);
1086 if (control_data->subpanel_data == NULL)
1088 if (panel.popup_data->subpanel_add_state != True)
1091 XmStringCreateLocalized ((FPGETMESSAGE(82, 10, "Add Subpanel")));
1092 XtSetArg (args[0], XmNlabelString, label_string);
1093 mnemonic = ((char *)FPGETMESSAGE(82, 11, "A"));
1094 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1095 XtSetArg (args[2], XmNuserData, control_data);
1096 XtSetValues (panel.popup_data->modify_subpanel_item, args, 3);
1098 XmStringFree (label_string);
1100 XtRemoveCallback (panel.popup_data->modify_subpanel_item,
1101 XmNactivateCallback, DeleteSubpanelCB, NULL);
1102 XtAddCallback (panel.popup_data->modify_subpanel_item,
1103 XmNactivateCallback, AddSubpanelCB, NULL);
1105 panel.popup_data->subpanel_add_state = True;
1109 XtSetArg (args[0], XmNuserData, control_data);
1110 XtSetValues (panel.popup_data->modify_subpanel_item, args, 1);
1115 if (panel.popup_data->subpanel_add_state == True)
1118 XmStringCreateLocalized ((FPGETMESSAGE(82, 12, "Delete Subpanel")));
1119 XtSetArg (args[0], XmNlabelString, label_string);
1120 mnemonic = ((char *)FPGETMESSAGE(82, 13, "D"));
1121 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1122 XtSetArg (args[2], XmNuserData, control_data);
1123 XtSetValues (panel.popup_data->modify_subpanel_item, args, 3);
1125 XmStringFree (label_string);
1127 XtRemoveCallback (panel.popup_data->modify_subpanel_item,
1128 XmNactivateCallback, AddSubpanelCB, NULL);
1129 XtAddCallback (panel.popup_data->modify_subpanel_item,
1130 XmNactivateCallback, DeleteSubpanelCB, NULL);
1132 panel.popup_data->subpanel_add_state = False;
1136 XtSetArg (args[0], XmNuserData, control_data);
1137 XtSetValues (panel.popup_data->modify_subpanel_item, args, 1);
1143 XtUnmanageChild (panel.popup_data->modify_subpanel_item);
1146 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1148 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1149 ControlTopicHelpCB, (XtPointer)control_data);
1151 XtUnmanageChild (panel.popup_data->deinstall_item);
1152 XtUnmanageChild (panel.popup_data->toggle_item);
1154 /* Restore element values to control. */
1156 if (control_data->subpanel_data != NULL &&
1157 control_data != control_data->subpanel_data->default_control)
1159 control_data->element_values = old_element_values;
1167 /************************************************************************
1169 * UpdateSubpanelControlMenu
1170 * Set the elements of the popup menu for a subpanel control
1171 * item to its proper values before it is made visible.
1174 * subpanel_data: The subpanel in which the menu is to be
1177 * control_data: The control that the menu is being brought up for.
1179 ************************************************************************/
1183 UpdateSubpanelControlMenu (SubpanelData * subpanel_data,
1184 ControlData * control_data)
1188 XmString label_string;
1190 char * control_label = NULL;
1192 /* Set the title of the menu */
1197 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1199 if (control_label == NULL)
1201 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1205 control_label = FPGETMESSAGE(82, 36, "Install Icon");
1208 label_string = XmStringCreateLocalized (control_label);
1209 XtSetArg (args[0], XmNlabelString, label_string);
1210 XtSetValues (panel.popup_data->popup_title, args, 1);
1211 XmStringFree (label_string);
1214 /* Set the sensitivity of the control deinstall and toggle menu item */
1216 if (control_data == NULL)
1218 XtSetSensitive (panel.popup_data->deinstall_item, False);
1219 XtSetSensitive (panel.popup_data->toggle_item, False);
1221 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1223 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1224 GeneralTopicHelpCB, (XtPointer)INSTALL_ZONE);
1228 XtSetSensitive (panel.popup_data->deinstall_item, True);
1229 XtSetArg (args[0], XmNuserData, control_data);
1230 XtSetValues(panel.popup_data->deinstall_item, args, 1);
1232 XtRemoveAllCallbacks (panel.popup_data->deinstall_item,
1233 XmNactivateCallback);
1235 XtAddCallback (panel.popup_data->deinstall_item, XmNactivateCallback,
1236 DeleteControlCB, (XtPointer) NULL);
1238 if ( control_data == subpanel_data->default_control)
1239 XtSetSensitive (panel.popup_data->toggle_item, False);
1241 XtSetSensitive (panel.popup_data->toggle_item, True);
1243 XtSetArg (args[0], XmNuserData, control_data);
1244 XtSetValues(panel.popup_data->toggle_item, args, 1);
1246 XtRemoveAllCallbacks (panel.popup_data->toggle_item,
1247 XmNactivateCallback);
1249 XtAddCallback (panel.popup_data->toggle_item, XmNactivateCallback,
1250 ToggleControlCB, (XtPointer) subpanel_data);
1252 XtRemoveAllCallbacks (panel.popup_data->help_item, XmNactivateCallback);
1254 XtAddCallback(panel.popup_data->help_item, XmNactivateCallback,
1255 ControlTopicHelpCB, (XtPointer)control_data);
1258 XtManageChild (panel.popup_data->deinstall_item);
1260 if (! (subpanel_data->parent_control_data->
1261 element_values[CONTROL_LOCKED].parsed_value))
1262 XtManageChild (panel.popup_data->toggle_item);
1264 XtUnmanageChild (panel.popup_data->toggle_item);
1266 XtUnmanageChild (panel.popup_data->modify_subpanel_item);
1272 /************************************************************************
1275 * Callback function which updates the popup menu for main panel
1276 * and subpanel controls before the menu is posted.
1278 ************************************************************************/
1282 PopupMenu (Widget w,
1283 XtPointer client_data,
1284 XtPointer call_data)
1288 XmAnyCallbackStruct * callback;
1290 Widget form, focus_widget;
1291 XmManagerWidget mgr;
1292 SubpanelData * subpanel_data = NULL;
1293 ControlData * control_data;
1294 BoxData * box_data = NULL;
1295 XmString label_string;
1297 long control_type, action_count = panel.popup_data->action_count;
1299 callback = (XmAnyCallbackStruct *) call_data;
1300 event = (XEvent *) callback->event;
1303 /* Get the form where the menu was posted from. */
1305 form = XmGetPostedFromWidget(w);
1307 XtSetArg (args[0], XmNuserData, &control_type);
1308 XtGetValues (form, args, 1);
1310 if (control_type == CONTROL)
1312 GetBoxDataFromForm (form, &box_data);
1313 subpanel_data = NULL;
1315 else if (control_type == SUBPANEL)
1317 GetSubpanelDataFromForm (form, &subpanel_data);
1321 if (event->type == ButtonPress)
1323 /* Change to use new Xme function when porting to Motif 2.0 */
1324 /* Get gadget at x, y position */
1326 focus_widget = (Widget) XmObjectAtPoint (form, event->xbutton.x,
1328 if (focus_widget == NULL)
1331 /* set the menu positioning */
1333 XmMenuPosition (panel.popup_data->popup, (XButtonPressedEvent *)event);
1337 /* get the widget that has the traversal focus */
1339 focus_widget = XmGetFocusWidget (form);
1342 /* set the menu positioning for non button events */
1344 KeyMenuPosition (panel.popup_data->popup, focus_widget);
1347 if (control_type == CONTROL)
1349 control_data = GetMainControlData (box_data, focus_widget);
1351 /* Find the right subpanel data if main control is not default */
1354 UpdateMainControlMenu (control_data);
1356 if (control_data->subpanel_data != NULL &&
1357 control_data != control_data->subpanel_data->default_control)
1359 subpanel_data = control_data->subpanel_data;
1360 control_data = control_data->subpanel_data->default_control;
1361 control_data->subpanel_data = subpanel_data;
1362 UpdateMainControlMenu (control_data);
1365 SetupActionMenuItems (w, control_data, panel.popup_data,
1366 panel.popup_data->action_item, &action_count);
1369 else if (control_type == SUBPANEL)
1371 control_data = GetSubpanelControlData (subpanel_data, focus_widget);
1373 UpdateSubpanelControlMenu (subpanel_data, control_data);
1375 SetupActionMenuItems (w, control_data, panel.popup_data,
1376 panel.popup_data->action_item, &action_count);
1379 panel.popup_data->action_count = action_count;
1385 /************************************************************************
1389 ************************************************************************/
1393 CreatePopupMenu (Widget w)
1397 Widget children[20];
1400 PopupData * popup_data;
1401 long i, child_num = 0;
1402 XmString label_string;
1404 popup_data = panel.popup_data = (PopupData *) XtMalloc(sizeof(PopupData));
1407 XtSetArg (args[i], XmNwhichButton, wmGD.bMenuButton); i++;
1409 popup_data->popup = XmCreatePopupMenu(w, "FPPopup", args, i);
1411 popup_data->add_ws_item = NULL;
1413 XtAddCallback (popup_data->popup, XmNmapCallback, PopupMenu,
1416 popup_data->popup_title = children[child_num++] =
1417 XmCreateLabelGadget(popup_data->popup, "title", NULL, 0);
1419 children[child_num++] = XmCreateSeparatorGadget(popup_data->popup,
1421 children[child_num++] = XmCreateSeparatorGadget(popup_data->popup,
1424 popup_data->action_item = (Widget *) XtMalloc(sizeof(Widget) * 5);
1425 popup_data->action_count = 0;
1427 for (i = 0; i < 5; i++)
1429 children[child_num] = popup_data->action_item[i] =
1430 XmCreatePushButtonGadget(popup_data->popup, "action_button", args, 0);
1431 popup_data->action_count++;
1433 XtManageChild (popup_data->action_item[i]);
1434 XtAddCallback (children[child_num++], XmNactivateCallback,
1435 ActionCB, (XtPointer) i);
1438 popup_data->separator1 = children[child_num++] =
1439 XmCreateSeparatorGadget (popup_data->popup, "sep3", NULL, 0);
1442 XmStringCreateLocalized((FPGETMESSAGE(82, 14, "Copy To Main Panel")));
1443 XtSetArg (args[0], XmNlabelString, label_string);
1444 mnemonic = ((char *)FPGETMESSAGE(82, 15, "C"));
1445 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1446 popup_data->toggle_item = children[child_num] =
1447 XmCreatePushButtonGadget (popup_data->popup, "Toggle_Control", args, 2);
1448 XmStringFree (label_string);
1450 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 16, "Delete")));
1451 XtSetArg (args[0], XmNlabelString, label_string);
1452 mnemonic = ((char *)FPGETMESSAGE(82, 17, "D"));
1453 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1454 popup_data->deinstall_item = children[child_num] =
1455 XmCreatePushButtonGadget(popup_data->popup, "Delete_Control",
1457 XmStringFree (label_string);
1460 XmStringCreateLocalized ((FPGETMESSAGE(82, 10, "Add Subpanel")));
1461 XtSetArg (args[0], XmNlabelString, label_string);
1462 mnemonic = ((char *)FPGETMESSAGE(82, 11, "A"));
1463 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1464 popup_data->modify_subpanel_item = children[child_num] =
1465 XmCreatePushButtonGadget (popup_data->popup, "Add_Subpanel", args, 2);
1466 XmStringFree (label_string);
1468 XtAddCallback(children[child_num++], XmNactivateCallback, AddSubpanelCB,
1470 popup_data->subpanel_add_state = True;
1472 popup_data->separator2 = children[child_num++] =
1473 XmCreateSeparatorGadget(popup_data->popup, "sep4", NULL, 0);
1475 label_string = XmStringCreateLocalized ((FPGETMESSAGE(82, 18, "Help")));
1476 XtSetArg (args[0], XmNlabelString, label_string);
1477 mnemonic = ((char *)FPGETMESSAGE(82, 19, "H"));
1478 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1479 popup_data->help_item = children[child_num++] =
1480 XmCreatePushButtonGadget (popup_data->popup, "Help", args, 2);
1481 XmStringFree (label_string);
1483 XtManageChildren(children, child_num);
1489 /************************************************************************
1491 * CreateActionButtons
1492 * Show the the action menu items and hide workspace menu items since
1493 * we are over a control.
1496 ************************************************************************/
1500 CreateActionButtons (Widget w,
1501 SwitchData * switch_data,
1502 ControlData * control_data)
1506 PopupData * popup_data = switch_data->popup_data;
1507 long action_count = popup_data->action_count;
1509 XmString label_string;
1510 char * control_label;
1512 /* Set the title of the menu */
1515 (char *) control_data->element_values[CONTROL_LABEL].parsed_value;
1517 if (control_label == NULL)
1519 (char *) control_data->element_values[CONTROL_NAME].parsed_value;
1521 label_string = XmStringCreateLocalized (control_label);
1522 XtSetArg (args[0], XmNlabelString, label_string);
1523 XtSetValues (popup_data->popup_title, args, 1);
1524 XmStringFree (label_string);
1526 /* show actions items */
1527 SetupActionMenuItems(w, control_data, popup_data,
1528 popup_data->action_item, &action_count);
1529 popup_data->action_count = action_count;
1531 /* hide add and delete workspace items */
1532 XtUnmanageChild(popup_data->add_ws_item);
1533 XtUnmanageChild(popup_data->delete_ws_item);
1534 XtUnmanageChild(popup_data->rename_ws_item);
1536 /* reset the help callback to reflect switch control help */
1537 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1538 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1539 ControlTopicHelpCB, control_data);
1546 /************************************************************************
1548 * ShowWorkspaceItems
1549 * Don't show the the action menu items since we are not over a control.
1550 * Reset the activate callbacks with the latest data.
1552 ************************************************************************/
1556 ShowWorkspaceItems (SwitchData * switch_data,
1557 Widget focus_widget)
1561 PopupData * popup_data = switch_data->popup_data;
1564 XmString label_string;
1565 char * control_label;
1571 /* hide actions items */
1573 for (i = 0; i < popup_data->action_count; i++)
1574 XtUnmanageChild (popup_data->action_item[i]);
1577 /* show add and delete workspace items */
1579 XtManageChild (popup_data->add_ws_item);
1580 XtManageChild (popup_data->delete_ws_item);
1581 XtManageChild (popup_data->rename_ws_item);
1584 /* reset the activate callback to reflect current button index */
1586 XtRemoveAllCallbacks (popup_data->delete_ws_item, XmNactivateCallback);
1587 for (i = 0; i < switch_data->switch_count &&
1588 switch_data->buttons[i] != NULL; i++)
1590 if (switch_data->buttons[i] == focus_widget) break;
1594 /* If we didn't find the switch button to post the menu for, it */
1595 /* must be in edit mode so the correct menu is the active switch */
1597 if (i >= switch_data->switch_count)
1598 i = switch_data->active_switch;
1601 /* Set the title of the menu */
1603 format = strdup (FPGETMESSAGE(82, 20, "%1$s %2$s"));
1604 ws = strdup (FPGETMESSAGE(82, 21, "Workspace"));
1605 ws_name = switch_data->switch_names[i];
1607 control_label = XtMalloc (sizeof(char) * (strlen(ws) + strlen(ws_name) + 4));
1609 sprintf (control_label, format, ws, ws_name);
1613 label_string = XmStringCreateLocalized (control_label);
1614 XtSetArg (args[0], XmNlabelString, label_string);
1615 XtSetValues (popup_data->popup_title, args, 1);
1616 XmStringFree (label_string);
1617 XtFree(control_label);
1619 XtAddCallback (popup_data->delete_ws_item, XmNactivateCallback,
1620 DeleteWorkspaceCB, (XtPointer) i);
1622 /* reset the activate callback to reflect current button index */
1623 XtRemoveAllCallbacks (popup_data->rename_ws_item, XmNactivateCallback);
1624 XtAddCallback (popup_data->rename_ws_item, XmNactivateCallback,
1625 RenameWorkspaceCB, (XtPointer) i);
1627 /* reset the help callback to reflect switch button help */
1628 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1629 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1630 GeneralTopicHelpCB, (XtPointer) SWITCH_BUTTON);
1632 XtManageChild(popup_data->separator1);
1638 /************************************************************************
1640 * ShowPartialWorkspaceItems
1641 * Don't show the delete workspace item since we are not over
1642 * a workspace button and don't show the action menu items since we are
1643 * not over a control. Reset the activate callback with the latest data.
1645 ************************************************************************/
1648 ShowPartialWorkspaceItems(SwitchData * switch_data)
1652 PopupData * popup_data = switch_data->popup_data;
1655 XmString label_string;
1657 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 22, "Switch Area")));
1658 XtSetArg (args[0], XmNlabelString, label_string);
1659 XtSetValues (popup_data->popup_title, args, 1);
1660 XmStringFree (label_string);
1662 /* hide actions items */
1663 for (i = 0; i < popup_data->action_count; i++)
1664 XtUnmanageChild (popup_data->action_item[i]);
1666 /* show add workspace item */
1667 XtManageChild (popup_data->add_ws_item);
1669 /* hide delete and rename workspace items */
1670 XtUnmanageChild (popup_data->delete_ws_item);
1671 XtUnmanageChild (popup_data->rename_ws_item);
1673 /* reset the help callback to reflect switch area help */
1674 XtRemoveAllCallbacks (popup_data->help_item, XmNactivateCallback);
1675 XtAddCallback(popup_data->help_item, XmNactivateCallback,
1676 SwitchTopicHelpCB, (XtPointer)switch_data);
1678 XtManageChild(popup_data->separator1);
1685 /************************************************************************
1687 * GetSwitchDataFromForm
1689 ************************************************************************/
1694 GetSwitchDataFromForm (Widget form,
1695 SwitchData ** switch_data_rtn)
1702 for (i = 0; i < panel.box_data_count; i++)
1704 box_data = panel.box_data[i];
1706 if (box_data->switch_form == form)
1708 *switch_data_rtn = box_data->switch_data;
1717 /************************************************************************
1719 * GetSwtichControlData
1721 ************************************************************************/
1724 static ControlData *
1725 GetSwitchControlData (SwitchData * switch_data,
1726 Widget focus_widget)
1731 ControlData * control_data;
1732 Boolean found = False;
1734 for (i = 0; i < switch_data->control_data_count; i++)
1736 control_data = switch_data->control_data[i];
1738 if (control_data->icon == focus_widget)
1745 if (!found) return NULL;
1747 return (control_data);
1754 /************************************************************************
1758 ************************************************************************/
1761 WSPopupMenu (Widget w,
1762 XtPointer client_data,
1763 XtPointer call_data)
1767 XmManagerWidget mgr = (XmManagerWidget) w;
1768 int num_children = mgr->composite.num_children;
1769 XmAnyCallbackStruct * callback;
1771 Widget form, focus_widget;
1772 SwitchData * switch_data;
1773 ControlData * control_data = NULL;
1774 Boolean is_button = False;
1779 callback = (XmAnyCallbackStruct *) call_data;
1780 event = (XEvent *) callback->event;
1783 /* get the form where the menu was posted from */
1785 form = XmGetPostedFromWidget (w);
1787 GetSwitchDataFromForm (form, &switch_data);
1790 if (event->type == ButtonPress)
1793 /* Change to use new Xme function when porting to Motif 2.0 */
1794 /* Get gadget at x, y position */
1796 focus_widget = (Widget) XmObjectAtPoint (form, event->xbutton.x,
1799 if (focus_widget == NULL)
1801 XtSetArg (args[0], XmNx, &x);
1802 XtSetArg (args[1], XmNy, &y);
1803 XtGetValues(switch_data->rc, args, 2);
1805 focus_widget = (Widget) XmObjectAtPoint (switch_data->rc,
1806 event->xbutton.x - x,
1807 event->xbutton.y - y);
1811 control_data = GetSwitchControlData (switch_data, focus_widget);
1814 /* set the menu positioning */
1816 XmMenuPosition (switch_data->popup_data->popup,
1817 (XButtonPressedEvent *) event);
1822 /* get the widget that has the traversal focus */
1824 focus_widget = XmGetFocusWidget (form);
1826 control_data = GetSwitchControlData (switch_data, focus_widget);
1828 if (control_data == NULL)
1831 /* set the menu positioning for non button events */
1833 KeyMenuPosition (switch_data->popup_data->popup, focus_widget);
1836 if (focus_widget != NULL)
1839 /* The mouse is over a button in the switch area */
1840 ShowWorkspaceItems (switch_data, focus_widget);
1843 if (control_data != NULL)
1846 (long) control_data->element_values[CONTROL_TYPE].parsed_value;
1848 if (control_type != CONTROL_BLANK)
1849 /* The mouse is over a control in the switch area */
1850 CreateActionButtons (w, switch_data, control_data);
1852 /* The mouse is over a blank control in the switch area */
1853 ShowPartialWorkspaceItems (switch_data);
1858 * The mouse is over area other than the buttons and control
1859 * in the switch area
1861 ShowPartialWorkspaceItems (switch_data);
1867 * The mouse is over area other than the buttons and control
1868 * in the switch area
1870 ShowPartialWorkspaceItems (switch_data);
1876 /************************************************************************
1878 * CreateWorkspacePopupMenu
1880 ************************************************************************/
1884 CreateWorkspacePopupMenu (Widget w,
1885 SwitchData * switch_data)
1889 Widget children[20];
1890 XmString label_string;
1893 long i, child_num = 0;
1894 PopupData * popup_data;
1896 popup_data = (PopupData *) XtMalloc(sizeof(PopupData));
1899 XtSetArg (args[i], XmNwhichButton, wmGD.bMenuButton); i++;
1901 popup_data->popup = XmCreatePopupMenu(w, "WSPopup", args, i);
1903 popup_data->deinstall_item = NULL;
1904 popup_data->toggle_item = NULL;
1905 popup_data->modify_subpanel_item = NULL;
1906 popup_data->subpanel_add_state = True;
1908 XtAddCallback(popup_data->popup, XmNmapCallback, WSPopupMenu,
1909 (XtPointer) switch_data);
1911 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 22, "Switch Area")));
1912 XtSetArg (args[0], XmNlabelString, label_string);
1913 popup_data->popup_title = children[child_num++] =
1914 XmCreateLabelGadget (popup_data->popup, "title", args, 1);
1915 XmStringFree (label_string);
1917 children[child_num++] = XmCreateSeparatorGadget (popup_data->popup, "sep1",
1919 children[child_num++] = XmCreateSeparatorGadget (popup_data->popup, "sep2",
1922 popup_data->action_item = (Widget *) XtMalloc(sizeof(Widget) * 5);
1923 popup_data->action_count = 0;
1925 for (i = 0; i < 5; i++)
1927 children[child_num] = popup_data->action_item[i] =
1928 XmCreatePushButtonGadget (popup_data->popup, "action_button", args, 0);
1929 popup_data->action_count++;
1931 XtManageChild (popup_data->action_item[i]);
1932 XtAddCallback (children[child_num++], XmNactivateCallback,
1933 ActionCB, (XtPointer) i);
1937 XmStringCreateLocalized ((FPGETMESSAGE(82, 23, "Add Workspace")));
1938 XtSetArg (args[0], XmNlabelString, label_string);
1939 mnemonic = ((char *)FPGETMESSAGE(82, 24, "A"));
1940 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1941 popup_data->add_ws_item = children[child_num] =
1942 XmCreatePushButtonGadget (popup_data->popup, "Add_Workspace", args, 2);
1943 XmStringFree (label_string);
1945 XtAddCallback(children[child_num++], XmNactivateCallback, AddWorkspaceCB,
1948 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 25, "Delete")));
1949 XtSetArg (args[0], XmNlabelString, label_string);
1950 mnemonic = ((char *)FPGETMESSAGE(82, 26, "D"));
1951 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1952 popup_data->delete_ws_item = children[child_num] =
1953 XmCreatePushButtonGadget (popup_data->popup,
1954 "Delete_Workspace", args, 2);
1955 XmStringFree (label_string);
1957 XtAddCallback(children[child_num++], XmNactivateCallback,
1958 DeleteWorkspaceCB, (XtPointer) 0);
1960 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 27, "Rename")));
1961 XtSetArg (args[0], XmNlabelString, label_string);
1962 mnemonic = ((char *)FPGETMESSAGE(82, 28, "R"));
1963 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1964 popup_data->rename_ws_item = children[child_num] =
1965 XmCreatePushButtonGadget (popup_data->popup,
1966 "Rename_Workspace", args, 2);
1967 XmStringFree (label_string);
1969 XtAddCallback(children[child_num++], XmNactivateCallback,
1970 RenameWorkspaceCB, (XtPointer) 0);
1972 popup_data->separator1 = children[child_num++] =
1973 XmCreateSeparatorGadget (popup_data->popup, "sep3", NULL, 0);
1975 popup_data->separator2 = NULL;
1977 label_string = XmStringCreateLocalized((FPGETMESSAGE(82, 29, "Help")));
1978 XtSetArg (args[0], XmNlabelString, label_string);
1979 mnemonic = ((char *)FPGETMESSAGE(82, 30, "H"));
1980 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
1981 popup_data->help_item = children[child_num++] =
1982 XmCreatePushButtonGadget (popup_data->popup, "Help", args, 2);
1983 XmStringFree (label_string);
1985 XtManageChildren(children, child_num);
1987 switch_data->popup_data = popup_data;