Initial import of the CDE 2.1.30 sources from the Open Group.
[oweals/cde.git] / cde / programs / dtfile / Menu.c
1 /* $XConsortium: Menu.c /main/4 1995/11/02 14:41:53 rswiston $ */
2 /************************************<+>*************************************
3  ****************************************************************************
4  *
5  *   FILE:           Menu.c
6  *
7  *   COMPONENT_NAME: Desktop File Manager (dtfile)
8  *
9  *   Description:    Contains the menu creation code for the file manager
10  *                   main window, and the simpler callback functions.
11  *
12  *   FUNCTIONS: ActivateMultipleSelect
13  *              ActivateNoSelect
14  *              ActivateSingleSelect
15  *              ChangeToHome
16  *              ChangeToParent
17  *              CreateMenu
18  *              GetHomeDir
19  *              GetMainMenuData
20  *              NewView
21  *              RereadDirectoryMenu
22  *              RestoreMenuSensitivity
23  *              SelectAll
24  *              SetMenuSensitivity
25  *              ShowTrash
26  *              TerminalCWD
27  *              TrashFiles
28  *              UnmanageAllActionItems
29  *              UnselectAll
30  *
31  *   (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
32  *   (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
33  *   (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
34  *   (c) Copyright 1993, 1994, 1995 Novell, Inc.
35  *
36  ****************************************************************************
37  ************************************<+>*************************************/
38
39 #include <stdio.h>
40 #include <signal.h>
41 #include <pwd.h>
42 #include <sys/stat.h>
43
44 #include <Xm/XmP.h>
45 #include <Xm/CascadeBG.h>
46 #include <Xm/PushBG.h>
47 #include <Xm/RowColumn.h>
48 #include <Xm/SeparatoG.h>
49 #include <Xm/ToggleBG.h>
50 #include <Xm/MessageB.h>
51 #include <Xm/MenuShellP.h>
52
53 #include <X11/ShellP.h>
54
55 #include <Dt/DtP.h>
56 #include <Dt/DtNlUtils.h>
57 #include <Dt/Action.h>
58 #include <Dt/ActionP.h>
59 #include <Dt/Connect.h>
60 #include <Dt/Indicator.h>
61 #include <Dt/FileM.h>
62
63 #include "Encaps.h"
64 #include "SharedProcs.h"
65 #include "MultiView.h"
66
67 #include "FileMgr.h"
68 #include "Desktop.h"
69 #include "Main.h"
70 #include "Help.h"
71 #include "SharedMsgs.h"
72
73
74 #define INDICATOR_TIME 12
75
76 #if defined(ADD_SHOW_TRASH)
77 static int menuItemCount = 52;
78 #else
79 static int menuItemCount = 51;
80 #endif
81 static MenuDesc * mainMenu = NULL;
82 static Widget * actionsPaneId = NULL;
83 static char * homeDir = NULL;
84
85 /********    Static Function Declarations    ********/
86 static void GetMainMenuData (
87                         Widget mbar,
88                         XtPointer * mainRecordPtr,
89                         MenuDesc ** menuDescPtr,
90                         int * menuItemCountPtr,
91                         unsigned int ** globalMenuStatesPtr,
92                         unsigned int ** viewMenuStatesPtr) ;
93 static void RereadDirectoryMenu(
94                         Widget w,
95                         XtPointer client_data,
96                         XtPointer call_data) ;
97 static void ShowTrash(
98                         Widget w,
99                         XtPointer client_data,
100                         XtPointer call_data) ;
101 static void NewView(
102                         Widget w,
103                         XtPointer client_data,
104                         XtPointer call_data) ;
105 static void SetMenuSensitivity(
106                         Widget w,
107                         XtPointer client_data,
108                         XtPointer call_data) ;
109 static void RestoreMenuSensitivity(
110                         Widget w,
111                         XtPointer client_data,
112                         XtPointer call_data) ;
113 static void TerminalCWD (
114                         Widget w,
115                         XtPointer client_data,
116                         XtPointer call_data) ;
117
118 /********    End Static Function Declarations    ********/
119
120
121 /************************************************************************
122  *
123  *  CreateMenu
124  *      Create the pull down menuing system for the program.
125  *
126  ************************************************************************/ 
127
128 Widget
129 CreateMenu(
130         Widget main,
131         FileMgrRec *file_mgr_rec )
132 {
133    static Boolean createSharedComponents = True;
134    static Widget * actionsId;
135    static Widget * directoryBarBtn;
136    int i, j;
137    Widget menu_bar;
138    Arg args[5];
139
140    if (createSharedComponents)
141    {
142       mainMenu = (MenuDesc *)XtCalloc(sizeof(MenuDesc) * menuItemCount, 1);
143       j = 0;
144
145       for (i = 0; i < menuItemCount; i++)
146       {
147          mainMenu[i].helpCallback = HelpRequestCB;
148          mainMenu[i].helpData = NULL;
149          mainMenu[i].activateCallback = NULL;
150          mainMenu[i].activateData = NULL;
151          mainMenu[i].maskBit = NULL;
152          mainMenu[i].isHelpBtn = False;
153          mainMenu[i].label = NULL;
154          mainMenu[i].mnemonic = NULL;
155       }
156
157
158       /*************************************/
159       /* Create the 'File' menu components */
160       /*************************************/
161
162       mainMenu[j].type = MENU_PULLDOWN_BUTTON;
163       mainMenu[j].label = GETMESSAGE(20, 1, "File");
164       mainMenu[j].label = XtNewString(mainMenu[j].label);
165       mainMenu[j].mnemonic = GETMESSAGE(20, 2, "F");
166       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
167       mainMenu[j].name = "file";
168       mainMenu[j++].helpData = HELP_FILE_MENU_STR;
169
170       mainMenu[j].type = SHARED_MENU_PANE;
171       mainMenu[j].name = "fileMenu";
172       mainMenu[j++].helpData = HELP_FILE_MENU_STR;
173
174       create_directoryBtn = &(mainMenu[j].widget);
175       mainMenu[j].type = MENU_BUTTON;
176       mainMenu[j].maskBit = CREATE_DIR;
177       mainMenu[j].label = GETMESSAGE(20, 130, "New Folder...");
178       mainMenu[j].label = XtNewString(mainMenu[j].label);
179       mainMenu[j].mnemonic = GETMESSAGE(20, 131, "N");
180       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
181       mainMenu[j].helpData = HELP_FILE_MENU_STR;
182       mainMenu[j].name = "newFolder";
183       mainMenu[j++].activateCallback = ShowMakeFileDialog;
184
185       create_dataBtn = &(mainMenu[j].widget);
186       mainMenu[j].maskBit = CREATE_FILE;
187       mainMenu[j].type = MENU_BUTTON;
188       mainMenu[j].label = GETMESSAGE(20, 132, "New File...");
189       mainMenu[j].label = XtNewString(mainMenu[j].label);
190       mainMenu[j].mnemonic = GETMESSAGE(20, 133, "w");
191       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
192       mainMenu[j].helpData = HELP_FILE_MENU_STR;
193       mainMenu[j].name = "newFile";
194       mainMenu[j++].activateCallback = ShowMakeFileDialog;
195
196       mainMenu[j].type = MENU_SEPARATOR;
197       mainMenu[j].name = "separator";
198       mainMenu[j++].helpCallback = NULL;
199
200       homeBarBtn = &(mainMenu[j].widget);
201       mainMenu[j].type = MENU_BUTTON;
202       mainMenu[j].label = GETMESSAGE(20, 38, "Go Home");
203       mainMenu[j].label = XtNewString(mainMenu[j].label);
204       mainMenu[j].mnemonic = GETMESSAGE(20, 41, "H");
205       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
206       mainMenu[j].helpData = HELP_FILE_MENU_STR;
207       mainMenu[j].name = "goHome";
208       mainMenu[j++].activateCallback = ChangeToHome;
209
210       upBarBtn = &(mainMenu[j].widget);
211       mainMenu[j].type = MENU_BUTTON;
212       mainMenu[j].maskBit = MOVE_UP;
213       mainMenu[j].label = GETMESSAGE(20, 155, "Go Up");
214       mainMenu[j].label = XtNewString(mainMenu[j].label);
215       mainMenu[j].mnemonic = GETMESSAGE(20,94, "U");
216       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
217       mainMenu[j].helpData = HELP_FILE_MENU_STR;
218       mainMenu[j].name = "goUp";
219       mainMenu[j++].activateCallback = ChangeToParent;
220
221       change_directoryBtn = &(mainMenu[j].widget);
222       mainMenu[j].maskBit = CHANGEDIR;
223       mainMenu[j].type = MENU_BUTTON;
224       mainMenu[j].label = GETMESSAGE(20, 134, "Go To...");
225       mainMenu[j].label = XtNewString(mainMenu[j].label);
226       mainMenu[j].mnemonic = GETMESSAGE(20, 135, "G");
227       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
228       mainMenu[j].helpData = HELP_FILE_MENU_STR;
229       mainMenu[j].name = "changeTo";
230       mainMenu[j++].activateCallback = ShowChangeDirDialog;
231
232       findBtn = &(mainMenu[j].widget);
233       mainMenu[j].type = MENU_BUTTON;
234       mainMenu[j].maskBit = FIND;
235       mainMenu[j].label = GETMESSAGE(20, 18, "Find...");
236       mainMenu[j].label = XtNewString(mainMenu[j].label);
237       mainMenu[j].mnemonic = GETMESSAGE(20, 19, "F");
238       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
239       mainMenu[j].helpData = HELP_FILE_MENU_STR;
240       mainMenu[j].name = "find";
241       mainMenu[j++].activateCallback = ShowFindDialog;
242
243       mainMenu[j].type = MENU_SEPARATOR;
244       mainMenu[j].name = "separator";
245       mainMenu[j++].helpCallback = NULL;
246
247 #if defined(ADD_SHOW_TRASH)
248       mainMenu[j].type = MENU_BUTTON;
249       mainMenu[j].label = GETMESSAGE(20, 136, "Open Trash");
250       mainMenu[j].label = XtNewString(mainMenu[j].label);
251       mainMenu[j].mnemonic = GETMESSAGE(20, 112, "O");
252       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
253       mainMenu[j].helpData = HELP_FILE_MENU_STR;
254       mainMenu[j].name = "openTrash";
255       mainMenu[j++].activateCallback = ShowTrash;
256 #endif
257       if (!restrictMode)
258       {
259          terminalBtn = &(mainMenu[j].widget);
260          mainMenu[j].type = MENU_BUTTON;
261          mainMenu[j].label = GETMESSAGE(20,146, "Open Terminal");
262          mainMenu[j].label = XtNewString(mainMenu[j].label);
263          mainMenu[j].mnemonic = GETMESSAGE(20,147, "O");
264          mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
265          mainMenu[j].helpData = HELP_FILE_MENU_STR;
266          mainMenu[j].name = "openTerminal";
267          mainMenu[j++].activateCallback = TerminalCWD;
268       }
269       else 
270          --menuItemCount;
271
272       mainMenu[j].type = MENU_SEPARATOR;
273       mainMenu[j].name = "separator";
274       mainMenu[j++].helpCallback = NULL;
275
276       mainMenu[j].type = MENU_BUTTON;
277       mainMenu[j].label = GETMESSAGE(20, 117, "Close");
278       mainMenu[j].label = XtNewString(mainMenu[j].label);
279       mainMenu[j].mnemonic = GETMESSAGE(20, 118, "C");
280       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
281       mainMenu[j].helpData = HELP_FILE_MENU_STR;
282       mainMenu[j].name = "close";
283       mainMenu[j++].activateCallback = Close;
284
285       /***************************************/
286       /* Create the 'Action' menu components */
287       /***************************************/
288
289       actionsId = &(mainMenu[j].widget);
290       mainMenu[j].type = MENU_PULLDOWN_BUTTON;
291       mainMenu[j].label = GETMESSAGE(20, 7, "Selected");
292       mainMenu[j].label = XtNewString(mainMenu[j].label);
293       mainMenu[j].mnemonic = GETMESSAGE(20, 8, "S");
294       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
295       mainMenu[j].name = "actions";
296       mainMenu[j++].helpData = HELP_SELECTED_MENU_STR;
297
298       actionsPaneId = &(mainMenu[j].widget);
299       mainMenu[j].type = SHARED_MENU_PANE;
300       mainMenu[j].name = "actionMenu";
301       mainMenu[j++].helpData = HELP_SELECTED_MENU_STR;
302
303       moveBtn = &(mainMenu[j].widget);
304       mainMenu[j].type = MENU_BUTTON;
305       mainMenu[j].maskBit = MOVE;
306       mainMenu[j].label = GETMESSAGE(20, 152, "Move to...");
307       mainMenu[j].label = XtNewString(mainMenu[j].label);
308       mainMenu[j].mnemonic = GETMESSAGE(20, 125, "M");
309       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
310       mainMenu[j].helpData = HELP_MOVE_AS_COMMAND_STR;
311       mainMenu[j].name = "move";
312       mainMenu[j++].activateCallback = ShowMoveFileDialog;
313
314       duplicateBtn = &(mainMenu[j].widget);
315       mainMenu[j].type = MENU_BUTTON;
316       mainMenu[j].maskBit = DUPLICATE;
317       mainMenu[j].label = GETMESSAGE(20, 153, "Copy to...");
318       mainMenu[j].label = XtNewString(mainMenu[j].label);
319       mainMenu[j].mnemonic = GETMESSAGE(20, 145, "C");
320       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
321       mainMenu[j].helpData = HELP_COPY_AS_COMMAND_STR;
322       mainMenu[j].name = "copy";
323       mainMenu[j++].activateCallback = ShowCopyFileDialog;
324
325       linkBtn = &(mainMenu[j].widget);
326       mainMenu[j].type = MENU_BUTTON;
327       mainMenu[j].maskBit = LINK;
328       mainMenu[j].label = GETMESSAGE(20, 154, "Copy As Link...");
329       mainMenu[j].label = XtNewString(mainMenu[j].label);
330       mainMenu[j].mnemonic = GETMESSAGE(20, 127, "L");
331       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
332       mainMenu[j].helpData = HELP_LINK_AS_COMMAND_STR;
333       mainMenu[j].name = "link";
334       mainMenu[j++].activateCallback = ShowLinkFileDialog;
335
336       mainMenu[j].type = MENU_SEPARATOR;
337       mainMenu[j].name = "separator";
338       mainMenu[j++].helpCallback = NULL;
339
340       mainMenu[j].maskBit = PUT_ON_DESKTOP;
341       mainMenu[j].type = MENU_BUTTON;
342       mainMenu[j].label = GETMESSAGE(20,84, "Put in Workspace");
343       mainMenu[j].label = XtNewString(mainMenu[j].label);
344       mainMenu[j].mnemonic = GETMESSAGE(20,85, "W");
345       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
346       mainMenu[j].helpData = HELP_PUT_ON_DT_COMMAND_STR;
347       mainMenu[j].name = "putInWorkspace";
348       mainMenu[j++].activateCallback = PutOnDTCB;
349
350       mainMenu[j].type = MENU_BUTTON;
351       mainMenu[j].maskBit = TRASH;
352       mainMenu[j].label = GETMESSAGE(20,151, "Put in Trash");
353       mainMenu[j].label = XtNewString(mainMenu[j].label);
354       mainMenu[j].mnemonic = GETMESSAGE(20, 91, "T");
355       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
356       mainMenu[j].helpData = HELP_TRASH_FILES_COMMAND_STR;
357       mainMenu[j].name = "putInTrash";
358       mainMenu[j++].activateCallback = TrashFiles;
359
360       renameBtn = &(mainMenu[j].widget);
361       mainMenu[j].type = MENU_BUTTON;
362       mainMenu[j].maskBit = RENAME;
363       mainMenu[j].label = GETMESSAGE(20, 137, "Rename...");
364       mainMenu[j].label = XtNewString(mainMenu[j].label);
365       mainMenu[j].mnemonic = GETMESSAGE(20, 110, "R");
366       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
367       mainMenu[j].helpData = HELP_RENAME_COMMAND_STR;
368       mainMenu[j].name = "rename";
369       mainMenu[j++].activateCallback = ShowRenameFileDialog;
370
371       mainMenu[j].type = MENU_BUTTON;
372       mainMenu[j].maskBit = MODIFY;
373       mainMenu[j].label = GETMESSAGE(20, 150, "Change Permissions...");
374       mainMenu[j].label = XtNewString(mainMenu[j].label);
375       mainMenu[j].mnemonic = GETMESSAGE(20, 17, "P");
376       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
377       mainMenu[j].helpData = HELP_PROPERTIES_COMMAND_STR;
378       mainMenu[j].name = "permissions";
379       mainMenu[j++].activateCallback = ShowModAttrDialog;
380
381       mainMenu[j].type = MENU_SEPARATOR;
382       mainMenu[j].name = "separator";
383       mainMenu[j++].helpCallback = NULL;
384
385       mainMenu[j].type = MENU_BUTTON;
386       mainMenu[j].label = GETMESSAGE(20, 48, "Select All");
387       mainMenu[j].label = XtNewString(mainMenu[j].label);
388       mainMenu[j].mnemonic = GETMESSAGE(20, 51, "S");
389       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
390       mainMenu[j].helpData = HELP_SELECT_ALL_COMMAND_STR;
391       mainMenu[j].name = "selectAll";
392       mainMenu[j++].activateCallback = SelectAll;
393
394       mainMenu[j].type = MENU_BUTTON;
395       mainMenu[j].label = GETMESSAGE(20, 52, "Deselect All");
396       mainMenu[j].label = XtNewString(mainMenu[j].label);
397       mainMenu[j].mnemonic = GETMESSAGE(20, 55, "D");
398       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
399       mainMenu[j].helpData = HELP_UNSELECT_ALL_COMMAND_STR;
400       mainMenu[j].name = "deselectAll";
401       mainMenu[j++].activateCallback = UnselectAll;
402
403       mainMenu[j].type = MENU_SEPARATOR;
404       mainMenu[j].name = "separator";
405       mainMenu[j++].helpCallback = NULL;
406
407       /*************************************/
408       /* Create the 'View' menu components */
409       /*************************************/
410
411       directoryBarBtn = &(mainMenu[j].widget);
412       mainMenu[j].type = MENU_PULLDOWN_BUTTON;
413       mainMenu[j].label = GETMESSAGE(20, 5, "View");
414       mainMenu[j].label = XtNewString(mainMenu[j].label);
415       mainMenu[j].mnemonic = GETMESSAGE(20, 6, "V");
416       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
417       mainMenu[j].name = "view";
418       mainMenu[j++].helpData = HELP_VIEW_MENU_STR;
419
420       mainMenu[j].type = SHARED_MENU_PANE;
421       mainMenu[j].name = "viewMenu";
422       mainMenu[j++].helpData = HELP_VIEW_MENU_STR;
423
424       if(openDirType == CURRENT)
425       {
426          newViewBtn = &(mainMenu[j].widget);
427          mainMenu[j].type = MENU_BUTTON;
428          mainMenu[j].label = GETMESSAGE(20, 138, "Open New View");
429          mainMenu[j].label = XtNewString(mainMenu[j].label);
430          mainMenu[j].mnemonic = GETMESSAGE(20, 139, "O");
431          mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
432          mainMenu[j].helpData = HELP_NEW_VIEW_COMMAND_STR;
433          mainMenu[j].name = "new";
434          mainMenu[j++].activateCallback = NewView;
435       }
436       else 
437          menuItemCount--;
438
439       mainMenu[j].type = MENU_SEPARATOR;
440       mainMenu[j].name = "separator";
441       mainMenu[j++].helpCallback = NULL;
442
443       preferencesBtn = &(mainMenu[j].widget);
444       mainMenu[j].type = MENU_BUTTON;
445       mainMenu[j].maskBit = PREFERENCES;
446       mainMenu[j].label = GETMESSAGE(20, 141, "Set View Options...");
447       mainMenu[j].label = XtNewString(mainMenu[j].label);
448       mainMenu[j].mnemonic = GETMESSAGE(20, 6, "V");
449       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
450       mainMenu[j].helpData = HELP_PREFERENCES_COMMAND_STR;
451       mainMenu[j].name = "setViewOptions";
452       mainMenu[j++].activateCallback = ShowPreferencesDialog;
453
454       defaultEnvBtn = &(mainMenu[j].widget);
455       mainMenu[j].type = MENU_BUTTON;
456       mainMenu[j].maskBit = SETTINGS;
457       mainMenu[j].label = GETMESSAGE(20, 142, "Save As Default Options...");
458       mainMenu[j].label = XtNewString(mainMenu[j].label);
459       mainMenu[j].mnemonic = GETMESSAGE(20, 143, "S");
460       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
461       mainMenu[j].helpData = HELP_SAVE_SETTINGS_COMMAND_STR;
462       mainMenu[j].name = "saveViewOptions";
463       mainMenu[j++].activateCallback = SaveSettingsCB;
464
465       showHiddenMenu = &(mainMenu[j].widget);
466       mainMenu[j].type = MENU_TOGGLE_BUTTON;
467       mainMenu[j].label = GETMESSAGE(20,156, "Show Hidden Objects");
468       mainMenu[j].label = XtNewString(mainMenu[j].label);
469       mainMenu[j].mnemonic = GETMESSAGE(20,102, "H");
470       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
471       mainMenu[j].helpData = HELP_SHOW_HIDDEN_COMMAND_STR;
472       mainMenu[j].name = "showHiddenObjects";
473       mainMenu[j++].activateCallback = ShowHiddenFiles;
474
475       filterBtn = &(mainMenu[j].widget);
476       mainMenu[j].type = MENU_BUTTON;
477       mainMenu[j].maskBit = FILTER;
478       mainMenu[j].label = GETMESSAGE(20,144, "Set Filter Options...");
479       mainMenu[j].label = XtNewString(mainMenu[j].label);
480       mainMenu[j].mnemonic = GETMESSAGE(20, 104, "F");
481       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
482       mainMenu[j].helpData = HELP_FILTER_COMMAND_STR;
483       mainMenu[j].name = "setFilterOptions";
484       mainMenu[j++].activateCallback = ShowFilterDialog;
485
486       mainMenu[j].type = MENU_SEPARATOR;
487       mainMenu[j].name = "separator";
488       mainMenu[j++].helpCallback = NULL;
489
490       cleanUpBtn = &(mainMenu[j].widget);
491       mainMenu[j].type = MENU_BUTTON;
492       mainMenu[j].maskBit = CLEAN_UP;
493       mainMenu[j].label = GETMESSAGE(20,99, "Clean Up");
494       mainMenu[j].label = XtNewString(mainMenu[j].label);
495       mainMenu[j].mnemonic = GETMESSAGE(20,100, "C");
496       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
497       mainMenu[j].helpData = HELP_CLEAN_UP_COMMAND_STR;
498       mainMenu[j].name = "cleanUp";
499       mainMenu[j++].activateCallback = CleanUp;
500
501       mainMenu[j].type = MENU_BUTTON;
502       mainMenu[j].label = GETMESSAGE(20, 30, "Update");
503       mainMenu[j].label = XtNewString(mainMenu[j].label);
504       mainMenu[j].mnemonic = GETMESSAGE(20, 33, "U");
505       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
506       mainMenu[j].helpData = HELP_REREAD_COMMAND_STR;
507       mainMenu[j].name = "refresh";
508       mainMenu[j++].activateCallback = RereadDirectoryMenu;
509
510       /*************************************/
511       /* Create the 'Help' menu components */
512       /*************************************/
513
514       mainMenu[j].type = MENU_PULLDOWN_BUTTON;
515       mainMenu[j].isHelpBtn = True;
516       mainMenu[j].label = GETMESSAGE(20, 123, "Help");
517       mainMenu[j].label = XtNewString(mainMenu[j].label);
518       mainMenu[j].mnemonic = GETMESSAGE(20, 9, "H");
519       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
520       mainMenu[j].name = "help";
521       mainMenu[j++].helpData = HELP_HELP_MENU_STR;
522
523       mainMenu[j].type = SHARED_MENU_PANE;
524       mainMenu[j].name = "helpMenu";
525       mainMenu[j++].helpData = HELP_HELP_MENU_STR;
526
527       mainMenu[j].type = MENU_BUTTON;
528       mainMenu[j].label = GETMESSAGE(20, 105, "Overview");
529       mainMenu[j].label = XtNewString(mainMenu[j].label);
530       mainMenu[j].mnemonic = GETMESSAGE(20, 106, "v");
531       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
532       mainMenu[j].helpData = HELP_HELP_MENU_STR;
533       mainMenu[j].activateCallback = HelpRequestCB;
534       mainMenu[j].name = "introduction";
535       mainMenu[j++].activateData = HELP_HOME_TOPIC;
536
537       mainMenu[j].type = MENU_SEPARATOR;
538       mainMenu[j].name = "separator";
539       mainMenu[j++].helpCallback = NULL;
540
541       mainMenu[j].type = MENU_BUTTON;
542       mainMenu[j].label = GETMESSAGE(20, 148, "Table Of Contents");
543       mainMenu[j].label = XtNewString(mainMenu[j].label);
544       mainMenu[j].mnemonic = GETMESSAGE(20, 149, "C");
545       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
546       mainMenu[j].helpData = HELP_HELP_MENU_STR;
547       mainMenu[j].activateCallback = HelpRequestCB;
548       mainMenu[j].name = "toc";
549       mainMenu[j++].activateData = HELP_TOC_STR;
550
551       mainMenu[j].type = MENU_BUTTON;
552       mainMenu[j].label = GETMESSAGE(20, 107, "Tasks");
553       mainMenu[j].label = XtNewString(mainMenu[j].label);
554       mainMenu[j].mnemonic = GETMESSAGE(20, 108, "T");
555       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
556       mainMenu[j].helpData = HELP_HELP_MENU_STR;
557       mainMenu[j].activateCallback = HelpRequestCB;
558       mainMenu[j].name = "tasks";
559       mainMenu[j++].activateData = HELP_TASKS_STR;
560
561       mainMenu[j].type = MENU_BUTTON;
562       mainMenu[j].label = GETMESSAGE(20,109, "Reference");
563       mainMenu[j].label = XtNewString(mainMenu[j].label);
564       mainMenu[j].mnemonic = GETMESSAGE(20,110, "R");
565       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
566       mainMenu[j].helpData = HELP_HELP_MENU_STR;
567       mainMenu[j].activateCallback = HelpRequestCB;
568       mainMenu[j].name = "reference";
569       mainMenu[j++].activateData = HELP_REFERENCE_STR;
570
571       mainMenu[j].type = MENU_BUTTON;
572       mainMenu[j].label = GETMESSAGE(20,111, "On Item");
573       mainMenu[j].label = XtNewString(mainMenu[j].label);
574       mainMenu[j].mnemonic = GETMESSAGE(20,112, "O");
575       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
576       mainMenu[j].helpData = HELP_HELP_MENU_STR;
577       mainMenu[j].activateCallback = HelpRequestCB;
578       mainMenu[j].name = "onItem";
579       mainMenu[j++].activateData = HELP_HELP_MODE_STR;
580
581       mainMenu[j].type = MENU_SEPARATOR;
582       mainMenu[j].name = "separator";
583       mainMenu[j++].helpCallback = NULL;
584
585       usingHelp = &(mainMenu[j].widget);
586       mainMenu[j].type = MENU_BUTTON;
587       mainMenu[j].label = GETMESSAGE(20,113, "Using Help");
588       mainMenu[j].label = XtNewString(mainMenu[j].label);
589       mainMenu[j].mnemonic = GETMESSAGE(20,114, "U");
590       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
591       mainMenu[j].helpData = HELP_HELP_MENU_STR;
592       mainMenu[j].activateCallback = HelpRequestCB;
593       mainMenu[j].name = "usingHelp";
594       mainMenu[j++].activateData = HELP_HOME_TOPIC;
595    
596       mainMenu[j].type = MENU_SEPARATOR;
597       mainMenu[j].name = "separator";
598       mainMenu[j++].helpCallback = NULL;
599
600       fileManagerHelp = &(mainMenu[j].widget);
601       mainMenu[j].type = MENU_BUTTON;
602       mainMenu[j].label = GETMESSAGE(20,115, "About File Manager");
603       mainMenu[j].label = XtNewString(mainMenu[j].label);
604       mainMenu[j].mnemonic = GETMESSAGE(20,116, "A");
605       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
606       mainMenu[j].helpData = HELP_HELP_MENU_STR;
607       mainMenu[j].activateCallback = HelpRequestCB;
608       mainMenu[j].name = "version";
609       mainMenu[j++].activateData = HELP_ABOUT_STR;
610
611       applicationManagerHelp = &(mainMenu[j].widget);
612       mainMenu[j].type = MENU_BUTTON;
613       mainMenu[j].label = GETMESSAGE(20,157, "About Application Manager");
614       mainMenu[j].label = XtNewString(mainMenu[j].label);
615       mainMenu[j].mnemonic = GETMESSAGE(20,116, "A");
616       mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
617       mainMenu[j].helpData = HELP_HELP_MENU_STR;
618       mainMenu[j].activateCallback = HelpRequestCB;
619       mainMenu[j].name = "version";
620       mainMenu[j++].activateData = HELP_ABOUT_STR;
621    }
622
623    menu_bar = _DtCreateMenuSystem(main, "mainMenu", HelpRequestCB, 
624                                HELP_HELP_MENU_STR, createSharedComponents, 
625                                mainMenu, menuItemCount, GetMainMenuData,
626                                SetMenuSensitivity, RestoreMenuSensitivity);
627
628    /* Fine tune the menubar */
629    XtSetArg(args[0], XmNmarginWidth, 2);
630    XtSetArg(args[1], XmNmarginHeight, 2);
631    XtSetValues(menu_bar, args, 2);
632
633    file_mgr_rec->actions = *actionsId;
634    file_mgr_rec->action_pane = *actionsPaneId;
635    file_mgr_rec->directoryBarBtn = *directoryBarBtn;
636
637    file_mgr_rec->create_directoryBtn_child= NULL;
638    file_mgr_rec->create_dataBtn_child= NULL;
639
640    ActivateNoSelect (file_mgr_rec);
641
642    createSharedComponents = False;
643
644    return (menu_bar);
645 }
646
647
648 static void 
649 GetMainMenuData (
650    Widget mbar,
651    XtPointer * mainRecordPtr,
652    MenuDesc ** menuDescPtr,
653    int * menuItemCountPtr,
654    unsigned int ** globalMenuStatesPtr,
655    unsigned int ** viewMenuStatesPtr )
656
657 {
658    Arg args[1];
659    FileMgrRec * fileMgrRec;
660
661    XtSetArg(args[0], XmNuserData, &fileMgrRec);
662    XtGetValues(mbar, args, 1);
663    *mainRecordPtr = (XtPointer) fileMgrRec;
664    *menuDescPtr = mainMenu;
665    *menuItemCountPtr = menuItemCount;
666    *globalMenuStatesPtr = &currentMenuStates;
667    *viewMenuStatesPtr = &fileMgrRec->menuStates;
668    *actionsPaneId = fileMgrRec->action_pane;
669 }
670
671
672 void
673 GetHomeDir( )
674 {
675   struct passwd * pwInfo;
676
677   if( homeDir == NULL )
678   {
679     if ((homeDir = getenv("HOME_CLIENT")) == NULL)
680     {
681       if ((homeDir = getenv("HOME")) == NULL)
682       {
683         pwInfo = getpwuid (getuid());
684         homeDir = pwInfo->pw_dir;
685       }
686     }
687   }
688 }
689
690
691 /************************************************************************
692  *
693  *  ActivateSingleSelect
694  *      Activate the menu items that are to be active upon a
695  *      single selection.
696  *
697  ************************************************************************/
698
699 void
700 ActivateSingleSelect(
701         FileMgrRec *file_mgr_rec,
702         char *file_type )
703 {
704    DialogData * dialog_data;
705    FileMgrData * file_mgr_data;
706
707    if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
708       return;
709    file_mgr_data = (FileMgrData *) dialog_data->data;
710
711    if ((strcmp(file_mgr_data->selection_list[0]->file_data->file_name, ".." ) == 0 )
712        || (strcmp(file_mgr_data->selection_list[0]->file_data->file_name, "." ) == 0 ) )
713    {
714      file_mgr_rec->menuStates |= TRASH | MODIFY | PUT_ON_DESKTOP;
715      file_mgr_rec->menuStates &= (~RENAME);
716    }
717    else
718      file_mgr_rec->menuStates |= RENAME | TRASH | MODIFY | PUT_ON_DESKTOP;
719
720    if ((strcmp(file_type, LT_BROKEN_LINK) != 0)
721        && (strcmp(file_type, LT_RECURSIVE_LINK) != 0)
722 /*
723        && (file_mgr_data->selection_list[0]->file_data->physical_type !=
724         DtDIRECTORY)
725 */
726        )
727    {
728       file_mgr_rec->menuStates |= MOVE | DUPLICATE | LINK;
729    }
730    else
731       file_mgr_rec->menuStates &= ~(MOVE | DUPLICATE | LINK);
732
733    /*  Update the action menu pane defined for the file type  */
734    /*  of the selected file.                                  */
735
736    UpdateActionMenuPane ((XtPointer)file_mgr_data, file_mgr_rec, file_type, 
737                    NOT_DESKTOP, 0, (Widget)NULL, 
738                    file_mgr_data->selection_list[0]->file_data->physical_type);
739 }
740
741
742
743 static void
744 UnmanageAllActionItems(
745         FileMgrRec *file_mgr_rec )
746 {
747   register int i, children;
748   XmManagerWidget action_pane;
749
750   action_pane = (XmManagerWidget) file_mgr_rec->action_pane;
751
752   for (i = SELECTED_MENU_MAX; i < action_pane->composite.num_children; ++i)
753   {
754     XtUnmanageChild (action_pane->composite.children[i]);
755   }
756 }
757
758 /************************************************************************
759  *
760  *  ActivateMultipleSelect
761  *      Activate (deactivate) the appropriate menu items when multiple
762  *      files are selected.
763  *
764  *
765  ************************************************************************/
766
767 void
768 ActivateMultipleSelect(
769         FileMgrRec *file_mgr_rec )
770 {
771    file_mgr_rec->menuStates |= TRASH | PUT_ON_DESKTOP;
772    file_mgr_rec->menuStates &= ~(RENAME | MOVE | DUPLICATE | LINK |
773                                  MODIFY);
774
775    UnmanageAllActionItems (file_mgr_rec);
776 }
777
778
779
780
781 /************************************************************************
782  *
783  *  ActivateNoSelect
784  *      Activate (deactivate) the appropriate menu items when no
785  *      files are selected.
786  *
787  ************************************************************************/
788
789 void
790 ActivateNoSelect(
791         FileMgrRec *file_mgr_rec )
792 {
793    file_mgr_rec->menuStates &= ~(RENAME | MOVE | DUPLICATE | LINK | TRASH |
794                                  MODIFY | PUT_ON_DESKTOP);
795
796    UnmanageAllActionItems (file_mgr_rec);
797 }
798
799
800
801 /************************************************************************
802  *
803  *  UnselectAll
804  *      Unselect all of the selected files.
805  *
806  ************************************************************************/
807
808 void
809 UnselectAll(
810         Widget w,
811         XtPointer client_data,
812         XtPointer call_data )
813 {
814    FileMgrRec * file_mgr_rec;
815    DialogData * dialog_data;
816    FileMgrData * file_mgr_data;
817    Arg args[1];
818    Widget mbar;
819
820    if ((int)client_data == FM_POPUP)
821      mbar = XtParent(w);
822    else
823      mbar = XmGetPostedFromWidget(XtParent(w));
824
825    XmUpdateDisplay (w);
826    XtSetArg(args[0], XmNuserData, &file_mgr_rec);
827    XtGetValues(mbar, args, 1);
828
829    /* Ignore accelerators received after we're unposted */
830    if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
831       return;
832    file_mgr_data = (FileMgrData *) dialog_data->data;
833
834    DeselectAllFiles (file_mgr_data);
835    ActivateNoSelect (file_mgr_rec);
836
837    if( file_mgr_data == trashFileMgrData )
838      SensitizeTrashBtns();
839 }
840
841
842
843
844 /************************************************************************
845  *
846  *  SelectAll
847  *      Select all of file displayed.
848  *
849  ************************************************************************/
850
851 void
852 SelectAll(
853         Widget w,
854         XtPointer client_data,
855         XtPointer call_data )
856 {
857    FileMgrRec * file_mgr_rec;
858    DialogData * dialog_data;
859    FileMgrData * file_mgr_data;
860    Arg args[1];
861    Widget mbar;
862
863    if ((int)client_data == FM_POPUP)
864      mbar = XtParent(w);
865    else
866      mbar = XmGetPostedFromWidget(XtParent(w));
867
868    XmUpdateDisplay (w);
869    XtSetArg(args[0], XmNuserData, &file_mgr_rec);
870    XtGetValues(mbar, args, 1);
871
872    /* Ignore accelerators received after we're unposted */
873    if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
874       return;
875    file_mgr_data = (FileMgrData *) dialog_data->data;
876
877    SelectAllFiles (file_mgr_data);
878
879    if( file_mgr_data == trashFileMgrData )
880      SensitizeTrashBtns();
881 }
882
883
884
885
886 /************************************************************************
887  *
888  *  RereadDirectoryMenu
889  *      Callback function invoked from the Reread Directory
890  *      menu item.  This function calls the file manager functions
891  *      which rereads and processes the directory.
892  *
893  ************************************************************************/
894
895 static void
896 RereadDirectoryMenu(
897         Widget w,
898         XtPointer client_data,
899         XtPointer call_data )
900 {
901    Arg args[1];
902    Widget mbar = XmGetPostedFromWidget(XtParent(w));
903    FileMgrRec * file_mgr_rec;
904    DialogData * dialog_data;
905
906    XmUpdateDisplay (w);
907
908    XtSetArg(args[0], XmNuserData, &file_mgr_rec);
909    XtGetValues(mbar, args, 1);
910
911    /* Ignore accelerators received after we're unposted */
912    if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
913       return;
914
915    UnpostTextPath( (FileMgrData *) dialog_data->data );
916
917    /* force this directory to be updated */
918    FileMgrReread (file_mgr_rec);
919 }
920
921
922 /************************************************************************
923  *
924  *  ShowTrash
925  *      Display the Trash can.
926  *
927  ************************************************************************/ 
928 #if defined(ADD_SHOW_TRASH)
929
930 static void
931 ShowTrash(
932         Widget w,
933         XtPointer client_data,
934         XtPointer call_data )
935 {
936    XmUpdateDisplay (w);
937
938    TrashDisplayHandler (NULL, NULL, NULL, NULL, 0);
939 }
940 #endif
941
942
943 /************************************************************************
944  *
945  *  TrashFiles
946  *      Send the selected set of files to the trash.
947  *
948  ************************************************************************/ 
949
950 void
951 TrashFiles(
952         Widget w,
953         XtPointer client_data,
954         XtPointer call_data )
955 {
956    FileMgrRec * file_mgr_rec;
957    DialogData * dialog_data;
958    FileMgrData * file_mgr_data;
959    FileViewData * file_view_data;
960    Arg args[1];
961    Widget mbar;
962    DtActionArg * action_args;
963    int arg_count;
964    register int i;
965
966    if (!TrashIsInitialized())
967    {
968      char *title, *msg;
969
970      title = XtNewString(GetSharedMessage(TRASH_ERROR_TITLE));
971
972      msg = XtMalloc( strlen( GETMESSAGE(27,95, "Unable to access the Trash directory:\n   %s\n   All trash operations will not be performed.\n   The most common causes are:\n     - Network authentication.\n     - Insufficient disk space.\n     - Wrong permissions.") )
973                      + strlen( trash_dir )
974                      + 1 );
975
976      sprintf( msg, GETMESSAGE(27, 95, "Unable to access the Trash directory:\n   %s\n   All trash operations will not be performed.\n   The most common causes are:\n     - Network authentication.\n     - Insufficient disk space.\n     - Wrong permissions."), trash_dir );
977
978      _DtMessage(toplevel, title, msg, NULL, HelpRequestCB);
979      XtFree(title);
980      XtFree(msg);
981      return;
982    }
983
984    XmUpdateDisplay (w);
985
986    if((int)client_data == NULL)
987       mbar = XmGetPostedFromWidget(XtParent(w));
988    else
989       mbar =  XtParent(w);
990
991    XtSetArg(args[0], XmNuserData, &file_mgr_rec);
992    XtGetValues(mbar, args, 1);
993
994    /* Ignore accelerators when we're insensitive */
995    if(client_data == NULL)
996       if ((file_mgr_rec->menuStates & TRASH) == 0)
997          return;
998
999    /* Ignore accelerators received after we're unposted */
1000    if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
1001       return;
1002    file_mgr_data = (FileMgrData *) dialog_data->data;
1003
1004    /* 'widget_dragged' is set in InitiateIconDrag() and
1005       is never set to NULL.  Because of this, after doing a desktop drag
1006       if you do a 'PutInTrash' on the File Manager window object, in
1007       TrashRemoveHandler() in Trash.c, it displays an incorrect message,
1008       So set it to NULL here. */
1009
1010    widget_dragged = NULL;
1011
1012    /* get the file_view_data object from which the menu was invoked */
1013    if (client_data == NULL)
1014      file_view_data = NULL;
1015    else
1016    {
1017      file_view_data = file_mgr_data->popup_menu_icon;
1018      /* The following test makes sure that the it is not the case of 
1019         multiple selected files */
1020      if (!file_mgr_data->selected_file_count && file_view_data == NULL)
1021        /* the object has gone away (probably deleted) */
1022        return;
1023
1024      file_mgr_data->popup_menu_icon = NULL;
1025
1026      if(file_view_data)
1027      {
1028        for(i = 0; i < file_mgr_data->selected_file_count; i++)
1029        {
1030           if(file_mgr_data->selection_list[i] == file_view_data)
1031           {
1032              file_view_data = NULL;
1033              break;
1034           }
1035        }
1036      }
1037    }
1038
1039    if(file_view_data)
1040       _DtBuildActionArgsWithSelectedFiles(&file_view_data, 1,
1041                                           &action_args, &arg_count);
1042    else
1043       _DtBuildActionArgsWithSelectedFiles(file_mgr_data->selection_list,
1044                                           file_mgr_data->selected_file_count,
1045                                           &action_args, &arg_count);
1046
1047    DtActionInvoke(file_mgr_rec->shell, TRASH_ACTION,
1048                   action_args, arg_count, NULL, NULL,
1049                   trash_dir, True, NULL, NULL);
1050
1051    _DtFreeActionArgs(action_args, arg_count);
1052 }
1053
1054
1055
1056
1057 /************************************************************************
1058  *
1059  *  NewView
1060  *      Create a new view of the currently display directory
1061  *
1062  ************************************************************************/ 
1063
1064 static void
1065 NewView(
1066         Widget w,
1067         XtPointer client_data,
1068         XtPointer call_data )
1069 {
1070    FileMgrRec * file_mgr_rec;
1071    DialogData * dialog_data;
1072    FileMgrData * file_mgr_data;
1073    Arg args[1];
1074    Widget mbar = XmGetPostedFromWidget(XtParent(w));
1075
1076
1077    XmUpdateDisplay (w);
1078    XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1079    XtGetValues(mbar, args, 1);
1080
1081    /* Ignore accelerators received after we're unposted */
1082    if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
1083       return;
1084    file_mgr_data = (FileMgrData *) dialog_data->data;
1085
1086    initiating_view = (XtPointer) file_mgr_data;
1087    if(file_mgr_data->restricted_directory != NULL)
1088    {
1089       special_view = True;
1090       special_treeType = file_mgr_data->show_type;
1091       special_viewType = file_mgr_data->view;
1092       special_orderType = file_mgr_data->order;
1093       special_directionType = file_mgr_data->direction;
1094       special_randomType = file_mgr_data->positionEnabled;
1095       special_restricted = XtNewString(file_mgr_data->restricted_directory);
1096       if(file_mgr_data->title == NULL)
1097          special_title = NULL;
1098       else
1099          special_title = XtNewString(file_mgr_data->title);
1100       special_helpVol = XtNewString(file_mgr_data->helpVol);
1101
1102       if(file_mgr_data->toolbox)
1103          GetNewView (file_mgr_data->host, file_mgr_data->current_directory,
1104                      file_mgr_data->restricted_directory, NULL, 0);
1105       else
1106          GetNewView (file_mgr_data->host, file_mgr_data->current_directory,
1107                      NULL, NULL, 0);
1108    }
1109    else
1110       GetNewView (file_mgr_data->host, file_mgr_data->current_directory, NULL,
1111                   NULL, 0);
1112    initiating_view = (XtPointer) NULL;
1113 }
1114
1115
1116
1117
1118 /************************************************************************
1119  *
1120  *  ChangeToHome
1121  *      Update the current view to show the home directory.
1122  *
1123  ************************************************************************/ 
1124
1125 void
1126 ChangeToHome(
1127         Widget w,
1128         XtPointer client_data,
1129         XtPointer call_data )
1130 {
1131    FileMgrRec * file_mgr_rec;
1132    DialogData * dialog_data;
1133    FileMgrData * file_mgr_data;
1134    char *host;
1135    char *ptr, *ptr1;
1136    Arg args[1];
1137    Widget mbar = XmGetPostedFromWidget(XtParent(w));
1138    Boolean found;
1139
1140    XmUpdateDisplay (w);
1141    if((int)client_data == FM_POPUP)
1142       mbar = XtParent(w);
1143    else
1144       mbar = XmGetPostedFromWidget(XtParent(w));
1145
1146    XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1147    XtGetValues(mbar, args, 1);
1148
1149   /* Ignore accelerators when we're insensitive */
1150    if ((file_mgr_rec->menuStates & HOME) == 0)
1151       return;
1152
1153    /* Ignore accelerators received after we're unposted */
1154    if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
1155       return;
1156    file_mgr_data = (FileMgrData *) dialog_data->data;
1157
1158    found = False;
1159
1160    if( homeDir == NULL )
1161      GetHomeDir( );
1162
1163    if((ptr = DtStrchr(homeDir, ':')) != NULL)
1164    {
1165       ptr1 = DtStrchr(homeDir, '/');
1166       if(strlen(ptr) > strlen(ptr1))
1167       {
1168          *ptr = '\0';
1169          host = XtNewString(homeDir);
1170          ptr1 = ptr;
1171          ptr++;
1172          homeDir = ptr;
1173          *ptr1 = ':';
1174          found = True;
1175       }
1176       else
1177          host = home_host_name;
1178    }
1179    else
1180       host = home_host_name;
1181
1182    if (file_mgr_data->cd_select != NULL)
1183    {
1184       XtFree (file_mgr_data->cd_select);
1185       file_mgr_data->cd_select = NULL;
1186    }
1187
1188    ShowNewDirectory( file_mgr_data, host, homeDir );
1189
1190    if( found )
1191       XtFree(host);
1192 }
1193
1194
1195
1196
1197 /************************************************************************
1198  *
1199  *  ChangeToParent
1200  *      Update the current view to show the parent directory.
1201  *
1202  ************************************************************************/ 
1203
1204 void
1205 ChangeToParent(
1206         Widget w,
1207         XtPointer client_data,
1208         XtPointer call_data )
1209 {
1210    FileMgrRec * file_mgr_rec;
1211    DialogData * dialog_data;
1212    FileMgrData * file_mgr_data;
1213    Arg args[1];
1214    Widget mbar = XmGetPostedFromWidget(XtParent(w));
1215    char host_name[MAX_PATH];
1216    Widget focus_widget;
1217
1218    XmUpdateDisplay (w);
1219    if((int)client_data == FM_POPUP)
1220       mbar = XtParent(w);
1221    else
1222       mbar = XmGetPostedFromWidget(XtParent(w));
1223
1224    XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1225    XtGetValues(mbar, args, 1);
1226
1227   /* Ignore accelerators when we're insensitive */
1228    if ((file_mgr_rec->menuStates & MOVE_UP) == 0)
1229       return;
1230
1231    /* Ignore accelerators received after we're unposted */
1232    if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
1233       return;
1234
1235    focus_widget = XmGetFocusWidget(file_mgr_rec->file_window);
1236    if (focus_widget)
1237    {
1238       if (focus_widget == file_mgr_rec->current_directory_text)
1239       {
1240          XmTextFieldReplace(focus_widget,
1241                             (XmTextPosition) 0,
1242                             XmTextFieldGetInsertionPosition(focus_widget),
1243                             "");
1244          return;
1245       }
1246       else if (strcmp(focus_widget->core.name, "nameChangeT") == 0)
1247       {
1248          XmTextReplace(focus_widget,
1249                        (XmTextPosition) 0,
1250                        XmTextFieldGetInsertionPosition(focus_widget),
1251                        "");
1252          return;
1253       }
1254    }
1255
1256    file_mgr_data = (FileMgrData *) dialog_data->data;
1257
1258    if (strcmp (file_mgr_data->current_directory, "/") == 0)
1259       return;
1260
1261    strcpy(host_name, file_mgr_data->host);
1262
1263    if (file_mgr_data->cd_select != NULL)
1264    {
1265       XtFree (file_mgr_data->cd_select);
1266       file_mgr_data->cd_select = NULL;
1267    }
1268
1269    ShowNewDirectory (file_mgr_data, host_name,
1270                      _DtPName (file_mgr_data->current_directory));
1271
1272    if(strcmp(file_mgr_data->current_directory,
1273                    file_mgr_data->restricted_directory) == 0)
1274    {
1275       _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, False, &currentMenuStates);
1276       file_mgr_rec->menuStates &= ~(MOVE_UP);
1277    }
1278    else
1279    {
1280       file_mgr_rec->menuStates |= MOVE_UP;
1281       _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, True, &currentMenuStates);
1282    }
1283 }
1284
1285
1286
1287
1288 /************************************************************************
1289  *
1290  *  SetMenuSensitivity
1291  *      Called before each menupane is posted; it will correctly set
1292  *      the menu button sensitivity for the view from which the menu
1293  *      is being posted; this is necessary because the menupanes are
1294  *      shared.  Only those buttons whose state is different than that
1295  *      of the current menu will be changed.
1296  *
1297  ************************************************************************/ 
1298
1299 static void
1300 SetMenuSensitivity(
1301         Widget w,
1302         XtPointer client_data,
1303         XtPointer call_data )
1304 {
1305    Arg args[1];
1306    Widget mbar;
1307    FileMgrRec * file_mgr_rec;
1308    XmMenuShellWidget mshell = (XmMenuShellWidget) w;
1309    DialogData * dialog_data;
1310    FileMgrData * file_mgr_data;
1311
1312    _XmGetActiveTopLevelMenu(mshell->composite.children[0], &mbar);
1313    XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1314    XtGetValues(mbar, args, 1);
1315
1316    /* Enable the appropriate menu widgets based on the view type */
1317    if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) != NULL)
1318    {
1319       struct stat file_info;
1320
1321       file_mgr_data = (FileMgrData *) dialog_data->data;
1322
1323       if( stat( file_mgr_data->current_directory, &file_info ) == 0 )
1324       {
1325         if( ! (file_info.st_mode & S_IXUSR)
1326             || ! (file_info.st_mode & S_IWUSR) )
1327         {
1328           file_mgr_rec->menuStates &= ~(CREATE_DIR) & ~(CREATE_FILE);
1329           _DtGlobalUpdateMenuItemState(*create_dataBtn, CREATE_FILE, False, &currentMenuStates);
1330           _DtGlobalUpdateMenuItemState(*create_directoryBtn, CREATE_DIR, False, &currentMenuStates);
1331         }
1332         else if( ! ( file_mgr_data->toolbox ) ||
1333                    ( file_mgr_data->toolbox && geteuid() == root_user ) )
1334         {
1335           file_mgr_rec->menuStates |= CREATE_DIR | CREATE_FILE;
1336           _DtGlobalUpdateMenuItemState(*create_dataBtn, CREATE_FILE, True, &currentMenuStates);
1337           _DtGlobalUpdateMenuItemState(*create_directoryBtn, CREATE_DIR, True, &currentMenuStates);
1338         }
1339       }
1340
1341       if (!PositioningEnabledInView(file_mgr_data))
1342          file_mgr_rec->menuStates &= ~(CLEAN_UP);
1343       else
1344          file_mgr_rec->menuStates |= CLEAN_UP;
1345
1346       XtManageChild(*defaultEnvBtn);
1347       if(file_mgr_data->restricted_directory == NULL)
1348       {
1349         if(strcmp(file_mgr_data->current_directory, "/") == 0)
1350         {
1351           file_mgr_rec->menuStates &= ~(MOVE_UP);
1352           _DtGlobalUpdateMenuItemState( *upBarBtn, MOVE_UP,
1353                                         False,&currentMenuStates);
1354         }
1355         else
1356         {
1357           file_mgr_rec->menuStates |= MOVE_UP;
1358           _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, True,&currentMenuStates);
1359         }
1360
1361         if( homeDir == NULL )
1362           GetHomeDir( );
1363
1364         if( homeDir != NULL
1365             && strcmp( homeDir, file_mgr_data->current_directory ) != 0 )
1366         {
1367           file_mgr_rec->menuStates |= HOME;
1368           _DtGlobalUpdateMenuItemState(*homeBarBtn, HOME, True,
1369                                        &currentMenuStates);
1370         }
1371         else
1372         {
1373           file_mgr_rec->menuStates &= ~(HOME);
1374           _DtGlobalUpdateMenuItemState(*homeBarBtn, HOME, False,
1375                                        &currentMenuStates);
1376         }
1377
1378         file_mgr_rec->menuStates |= CHANGE_DIR;
1379         _DtGlobalUpdateMenuItemState(*change_directoryBtn, CHANGE_DIR, True, 
1380                                      &currentMenuStates);
1381         XtManageChild(*change_directoryBtn);
1382       }
1383       else
1384       {
1385          if(strcmp(file_mgr_data->current_directory, 
1386                          file_mgr_data->restricted_directory) == 0)
1387          {
1388             _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, False, 
1389                                       &currentMenuStates);
1390             file_mgr_rec->menuStates &= ~(MOVE_UP);
1391          }
1392          else
1393          {
1394             file_mgr_rec->menuStates |= MOVE_UP;
1395             _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, True,
1396                                       &currentMenuStates);
1397          }
1398          _DtGlobalUpdateMenuItemState(*homeBarBtn, HOME, False,&currentMenuStates);
1399          file_mgr_rec->menuStates &= ~(HOME);
1400          _DtGlobalUpdateMenuItemState(*change_directoryBtn, CHANGE_DIR, False, 
1401                                    &currentMenuStates);
1402          file_mgr_rec->menuStates &= ~(CHANGE_DIR);
1403       }
1404
1405       if(!restrictMode)
1406       {
1407 /*
1408          if(file_mgr_data->restricted_directory == NULL)
1409          {
1410 */
1411             _DtGlobalUpdateMenuItemState(*terminalBtn, TERMINAL, True,
1412                                       &currentMenuStates);
1413             file_mgr_rec->menuStates |= TERMINAL;
1414 /*
1415          }
1416          else
1417          {
1418             _DtGlobalUpdateMenuItemState(*terminalBtn, TERMINAL, False,
1419                                       &currentMenuStates);
1420             file_mgr_rec->menuStates &= ~(TERMINAL);
1421          }
1422 */
1423          XtManageChild(*terminalBtn);
1424       }
1425
1426       XtManageChild(*preferencesBtn);
1427       XtManageChild(*filterBtn);
1428       if(openDirType == CURRENT)
1429          XtManageChild(*newViewBtn);
1430       XtManageChild(*showHiddenMenu);
1431
1432 /*    Obsolete code.
1433       if(restrictMode)
1434       {
1435          char *ptr;
1436
1437          ptr = strrchr(users_home_dir, '/');
1438          *ptr = '\0';
1439          if(strcmp(file_mgr_data->current_directory, users_home_dir) == 0)
1440             file_mgr_rec->menuStates &= ~(MOVE_UP);
1441          else
1442             file_mgr_rec->menuStates |= MOVE_UP;
1443          *ptr = '/';
1444       }
1445 */
1446
1447       XtManageChild(*findBtn);
1448
1449       /* The problem is when users have 2 views
1450          and selected one file on one view and popup the
1451          'Selected' menu on the other view.
1452          The 'Selected' menu still show the other view action items.
1453       */
1454       if( file_mgr_data->selected_file_count == 0 )
1455         ActivateNoSelect( file_mgr_rec );
1456       else if( file_mgr_data->selected_file_count == 1 )
1457         ActivateSingleSelect( file_mgr_rec,
1458           file_mgr_data->selection_list[0]->file_data->logical_type );
1459       else
1460         ActivateMultipleSelect( file_mgr_rec );
1461
1462       if( file_mgr_data->toolbox )
1463       {
1464         if( geteuid() == root_user || access(file_mgr_data->current_directory,
1465                                         W_OK|X_OK) == 0)
1466         {
1467           file_mgr_rec->menuStates |= CREATE_DIR
1468                                       | CREATE_FILE;
1469           _DtGlobalUpdateMenuItemState(*create_dataBtn, CREATE_FILE, True,
1470                                        &currentMenuStates);
1471           _DtGlobalUpdateMenuItemState(*create_directoryBtn, CREATE_DIR, True,
1472                                        &currentMenuStates);
1473         }
1474         else
1475         {
1476           file_mgr_rec->menuStates &= ~(CREATE_DIR
1477                                         | CREATE_FILE
1478                                         | MOVE
1479                                         | LINK
1480                                         | RENAME
1481                                         | TRASH);
1482           _DtGlobalUpdateMenuItemState(*create_dataBtn, CREATE_FILE, False,
1483                                        &currentMenuStates);
1484           _DtGlobalUpdateMenuItemState(*create_directoryBtn, CREATE_DIR, False,
1485                                        &currentMenuStates);
1486           _DtGlobalUpdateMenuItemState(*moveBtn, MOVE, False,
1487                                        &currentMenuStates);
1488           _DtGlobalUpdateMenuItemState(*linkBtn, LINK, False,
1489                                        &currentMenuStates);
1490           _DtGlobalUpdateMenuItemState(*renameBtn, RENAME, False,
1491                                        &currentMenuStates);
1492         }
1493       }
1494    }
1495
1496    if(showFilesystem )
1497    {
1498       if (file_mgr_data->show_hid_enabled)
1499          XmToggleButtonGadgetSetState(*showHiddenMenu, True, False);
1500       else
1501          XmToggleButtonGadgetSetState(*showHiddenMenu, False, False);
1502    }
1503
1504    if( file_mgr_data->toolbox )
1505    {
1506      if( ! XtIsManaged( *applicationManagerHelp ) )
1507        XtManageChild( *applicationManagerHelp );
1508      if( XtIsManaged( *fileManagerHelp ) )
1509        XtUnmanageChild( *fileManagerHelp );
1510    }
1511    else
1512    {
1513      if( ! XtIsManaged( *fileManagerHelp ) )
1514        XtManageChild( *fileManagerHelp );
1515      if( XtIsManaged( *applicationManagerHelp ) )
1516        XtUnmanageChild( *applicationManagerHelp );
1517    }
1518
1519    _DtGlobalSetMenuSensitivity(w, client_data, call_data);
1520 }
1521
1522
1523
1524
1525 /************************************************************************
1526  *
1527  *  RestoreMenuSensitivity
1528  *      Called after each menupane is unposted; it will restore the
1529  *      sensitivity state of each menubutton to 'TRUE'; this is so that
1530  *      accelerators will work correctly.
1531  *
1532  ************************************************************************/ 
1533
1534 static void
1535 RestoreMenuSensitivity(
1536         Widget w,
1537         XtPointer client_data,
1538         XtPointer call_data )
1539 {
1540    Arg args[1];
1541    Widget mbar;
1542    FileMgrRec * file_mgr_rec;
1543    XmMenuShellWidget mshell = (XmMenuShellWidget) w;
1544    DialogData * dialog_data;
1545    FileMgrData * file_mgr_data;
1546
1547
1548    _XmGetActiveTopLevelMenu(mshell->composite.children[0], &mbar);
1549    XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1550    XtGetValues(mbar, args, 1);
1551
1552    /* Enable the appropriate menu widgets based on the view type */
1553    dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec);
1554    file_mgr_data = (FileMgrData *) dialog_data->data;
1555
1556    _DtGlobalRestoreMenuSensitivity(w, client_data, call_data);
1557
1558    if(restrictMode) 
1559    {
1560       char *ptr;
1561
1562       ptr = strrchr(users_home_dir, '/');
1563       *ptr = '\0';
1564       if(strcmp(file_mgr_data->current_directory, users_home_dir) == 0)
1565       {
1566          _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, False,
1567                                       &currentMenuStates);
1568       }
1569       else
1570       {
1571          _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, True,
1572                                       &currentMenuStates);
1573       }
1574       *ptr = '/';
1575    }
1576    else
1577      if ((currentMenuStates & MOVE_UP) == 0)
1578          _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, True,&currentMenuStates);
1579
1580    if ((currentMenuStates & CLEAN_UP) == 0)
1581       _DtGlobalUpdateMenuItemState(*cleanUpBtn, CLEAN_UP, True,&currentMenuStates);
1582
1583 }
1584
1585
1586
1587 /************************************************************************
1588  *
1589  *  TerminalCWD
1590  *      Bring up a terminal with the current working directory the directory
1591  *      of the dtfile view.
1592  *
1593  ************************************************************************/ 
1594
1595 static void 
1596 TerminalCWD (
1597      Widget w,
1598      XtPointer client_data,
1599      XtPointer call_data)
1600 {
1601    FileMgrRec * file_mgr_rec;
1602    DialogData * dialog_data;
1603    FileMgrData * file_mgr_data;
1604    Arg args[1];
1605    Widget mbar = XmGetPostedFromWidget(XtParent(w));
1606    char * pwd_host = NULL;
1607    char * pwd_dir = NULL;
1608
1609    XmUpdateDisplay (w);
1610    XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1611    XtGetValues(mbar, args, 1);
1612
1613    /* Ignore accelerators received after we're unposted */
1614    if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
1615       return;
1616    file_mgr_data = (FileMgrData *) dialog_data->data;
1617
1618    pwd_host = XtNewString(file_mgr_data->host);
1619    pwd_dir = XtNewString(file_mgr_data->current_directory);
1620
1621    DtActionInvoke(file_mgr_rec->shell, "Terminal", NULL, 0, NULL,
1622                   NULL, pwd_dir, True, NULL, NULL);
1623
1624    XtFree(pwd_host);
1625    XtFree(pwd_dir);
1626
1627 }