2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: Menu.c /main/4 1995/11/02 14:41:53 rswiston $ */
24 /************************************<+>*************************************
25 ****************************************************************************
29 * COMPONENT_NAME: Desktop File Manager (dtfile)
31 * Description: Contains the menu creation code for the file manager
32 * main window, and the simpler callback functions.
34 * FUNCTIONS: ActivateMultipleSelect
36 * ActivateSingleSelect
44 * RestoreMenuSensitivity
50 * UnmanageAllActionItems
53 * (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
54 * (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
55 * (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
56 * (c) Copyright 1993, 1994, 1995 Novell, Inc.
58 ****************************************************************************
59 ************************************<+>*************************************/
67 #include <Xm/CascadeBG.h>
69 #include <Xm/PushBG.h>
70 #include <Xm/RowColumn.h>
71 #include <Xm/SeparatoG.h>
72 #include <Xm/ToggleBG.h>
73 #include <Xm/MessageB.h>
74 #include <Xm/MenuShellP.h>
76 #include <Xm/XmPrivate.h> /* _XmGetActiveTopLevelMenu */
78 #include <X11/ShellP.h>
81 #include <Dt/DtNlUtils.h>
82 #include <Dt/Action.h>
83 #include <Dt/ActionP.h>
84 #include <Dt/Connect.h>
85 #include <Dt/Indicator.h>
87 #include <Dt/SharedProcs.h>
90 #include "SharedProcs.h"
91 #include "MultiView.h"
97 #include "SharedMsgs.h"
100 #define INDICATOR_TIME 12
102 #if defined(ADD_SHOW_TRASH)
103 static int menuItemCount = 52;
105 static int menuItemCount = 51;
107 static MenuDesc * mainMenu = NULL;
108 static Widget * actionsPaneId = NULL;
109 static char * homeDir = NULL;
111 /******** Static Function Declarations ********/
112 static void GetMainMenuData (
114 XtPointer * mainRecordPtr,
115 MenuDesc ** menuDescPtr,
116 int * menuItemCountPtr,
117 unsigned int ** globalMenuStatesPtr,
118 unsigned int ** viewMenuStatesPtr) ;
119 static void RereadDirectoryMenu(
121 XtPointer client_data,
122 XtPointer call_data) ;
123 static void ShowTrash(
125 XtPointer client_data,
126 XtPointer call_data) ;
129 XtPointer client_data,
130 XtPointer call_data) ;
131 static void SetMenuSensitivity(
133 XtPointer client_data,
134 XtPointer call_data) ;
135 static void RestoreMenuSensitivity(
137 XtPointer client_data,
138 XtPointer call_data) ;
139 static void TerminalCWD (
141 XtPointer client_data,
142 XtPointer call_data) ;
144 /******** End Static Function Declarations ********/
147 /************************************************************************
150 * Create the pull down menuing system for the program.
152 ************************************************************************/
157 FileMgrRec *file_mgr_rec )
159 static Boolean createSharedComponents = True;
160 static Widget * actionsId;
161 static Widget * directoryBarBtn;
166 if (createSharedComponents)
168 mainMenu = (MenuDesc *)XtCalloc(sizeof(MenuDesc) * menuItemCount, 1);
171 for (i = 0; i < menuItemCount; i++)
173 mainMenu[i].helpCallback = HelpRequestCB;
174 mainMenu[i].helpData = NULL;
175 mainMenu[i].activateCallback = NULL;
176 mainMenu[i].activateData = NULL;
177 mainMenu[i].maskBit = 0;
178 mainMenu[i].isHelpBtn = False;
179 mainMenu[i].label = NULL;
180 mainMenu[i].mnemonic = NULL;
184 /*************************************/
185 /* Create the 'File' menu components */
186 /*************************************/
188 mainMenu[j].type = MENU_PULLDOWN_BUTTON;
189 mainMenu[j].label = GETMESSAGE(20, 1, "File");
190 mainMenu[j].label = XtNewString(mainMenu[j].label);
191 mainMenu[j].mnemonic = GETMESSAGE(20, 2, "F");
192 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
193 mainMenu[j].name = "file";
194 mainMenu[j++].helpData = HELP_FILE_MENU_STR;
196 mainMenu[j].type = SHARED_MENU_PANE;
197 mainMenu[j].name = "fileMenu";
198 mainMenu[j++].helpData = HELP_FILE_MENU_STR;
200 create_directoryBtn = &(mainMenu[j].widget);
201 mainMenu[j].type = MENU_BUTTON;
202 mainMenu[j].maskBit = CREATE_DIR;
203 mainMenu[j].label = GETMESSAGE(20, 130, "New Folder...");
204 mainMenu[j].label = XtNewString(mainMenu[j].label);
205 mainMenu[j].mnemonic = GETMESSAGE(20, 131, "N");
206 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
207 mainMenu[j].helpData = HELP_FILE_MENU_STR;
208 mainMenu[j].name = "newFolder";
209 mainMenu[j++].activateCallback = ShowMakeFileDialog;
211 create_dataBtn = &(mainMenu[j].widget);
212 mainMenu[j].maskBit = CREATE_FILE;
213 mainMenu[j].type = MENU_BUTTON;
214 mainMenu[j].label = GETMESSAGE(20, 132, "New File...");
215 mainMenu[j].label = XtNewString(mainMenu[j].label);
216 mainMenu[j].mnemonic = GETMESSAGE(20, 133, "w");
217 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
218 mainMenu[j].helpData = HELP_FILE_MENU_STR;
219 mainMenu[j].name = "newFile";
220 mainMenu[j++].activateCallback = ShowMakeFileDialog;
222 mainMenu[j].type = MENU_SEPARATOR;
223 mainMenu[j].name = "separator";
224 mainMenu[j++].helpCallback = NULL;
226 homeBarBtn = &(mainMenu[j].widget);
227 mainMenu[j].type = MENU_BUTTON;
228 mainMenu[j].label = GETMESSAGE(20, 38, "Go Home");
229 mainMenu[j].label = XtNewString(mainMenu[j].label);
230 mainMenu[j].mnemonic = GETMESSAGE(20, 41, "H");
231 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
232 mainMenu[j].helpData = HELP_FILE_MENU_STR;
233 mainMenu[j].name = "goHome";
234 mainMenu[j++].activateCallback = ChangeToHome;
236 upBarBtn = &(mainMenu[j].widget);
237 mainMenu[j].type = MENU_BUTTON;
238 mainMenu[j].maskBit = MOVE_UP;
239 mainMenu[j].label = GETMESSAGE(20, 155, "Go Up");
240 mainMenu[j].label = XtNewString(mainMenu[j].label);
241 mainMenu[j].mnemonic = GETMESSAGE(20,94, "U");
242 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
243 mainMenu[j].helpData = HELP_FILE_MENU_STR;
244 mainMenu[j].name = "goUp";
245 mainMenu[j++].activateCallback = ChangeToParent;
247 change_directoryBtn = &(mainMenu[j].widget);
248 mainMenu[j].maskBit = CHANGEDIR;
249 mainMenu[j].type = MENU_BUTTON;
250 mainMenu[j].label = GETMESSAGE(20, 134, "Go To...");
251 mainMenu[j].label = XtNewString(mainMenu[j].label);
252 mainMenu[j].mnemonic = GETMESSAGE(20, 135, "G");
253 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
254 mainMenu[j].helpData = HELP_FILE_MENU_STR;
255 mainMenu[j].name = "changeTo";
256 mainMenu[j++].activateCallback = ShowChangeDirDialog;
258 findBtn = &(mainMenu[j].widget);
259 mainMenu[j].type = MENU_BUTTON;
260 mainMenu[j].maskBit = FIND;
261 mainMenu[j].label = GETMESSAGE(20, 18, "Find...");
262 mainMenu[j].label = XtNewString(mainMenu[j].label);
263 mainMenu[j].mnemonic = GETMESSAGE(20, 19, "F");
264 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
265 mainMenu[j].helpData = HELP_FILE_MENU_STR;
266 mainMenu[j].name = "find";
267 mainMenu[j++].activateCallback = ShowFindDialog;
269 mainMenu[j].type = MENU_SEPARATOR;
270 mainMenu[j].name = "separator";
271 mainMenu[j++].helpCallback = NULL;
273 #if defined(ADD_SHOW_TRASH)
274 mainMenu[j].type = MENU_BUTTON;
275 mainMenu[j].label = GETMESSAGE(20, 136, "Open Trash");
276 mainMenu[j].label = XtNewString(mainMenu[j].label);
277 mainMenu[j].mnemonic = GETMESSAGE(20, 112, "O");
278 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
279 mainMenu[j].helpData = HELP_FILE_MENU_STR;
280 mainMenu[j].name = "openTrash";
281 mainMenu[j++].activateCallback = ShowTrash;
285 terminalBtn = &(mainMenu[j].widget);
286 mainMenu[j].type = MENU_BUTTON;
287 mainMenu[j].label = GETMESSAGE(20,146, "Open Terminal");
288 mainMenu[j].label = XtNewString(mainMenu[j].label);
289 mainMenu[j].mnemonic = GETMESSAGE(20,147, "O");
290 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
291 mainMenu[j].helpData = HELP_FILE_MENU_STR;
292 mainMenu[j].name = "openTerminal";
293 mainMenu[j++].activateCallback = TerminalCWD;
298 mainMenu[j].type = MENU_SEPARATOR;
299 mainMenu[j].name = "separator";
300 mainMenu[j++].helpCallback = NULL;
302 mainMenu[j].type = MENU_BUTTON;
303 mainMenu[j].label = GETMESSAGE(20, 117, "Close");
304 mainMenu[j].label = XtNewString(mainMenu[j].label);
305 mainMenu[j].mnemonic = GETMESSAGE(20, 118, "C");
306 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
307 mainMenu[j].helpData = HELP_FILE_MENU_STR;
308 mainMenu[j].name = "close";
309 mainMenu[j++].activateCallback = Close;
311 /***************************************/
312 /* Create the 'Action' menu components */
313 /***************************************/
315 actionsId = &(mainMenu[j].widget);
316 mainMenu[j].type = MENU_PULLDOWN_BUTTON;
317 mainMenu[j].label = GETMESSAGE(20, 7, "Selected");
318 mainMenu[j].label = XtNewString(mainMenu[j].label);
319 mainMenu[j].mnemonic = GETMESSAGE(20, 8, "S");
320 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
321 mainMenu[j].name = "actions";
322 mainMenu[j++].helpData = HELP_SELECTED_MENU_STR;
324 actionsPaneId = &(mainMenu[j].widget);
325 mainMenu[j].type = SHARED_MENU_PANE;
326 mainMenu[j].name = "actionMenu";
327 mainMenu[j++].helpData = HELP_SELECTED_MENU_STR;
329 moveBtn = &(mainMenu[j].widget);
330 mainMenu[j].type = MENU_BUTTON;
331 mainMenu[j].maskBit = MOVE;
332 mainMenu[j].label = GETMESSAGE(20, 152, "Move to...");
333 mainMenu[j].label = XtNewString(mainMenu[j].label);
334 mainMenu[j].mnemonic = GETMESSAGE(20, 125, "M");
335 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
336 mainMenu[j].helpData = HELP_MOVE_AS_COMMAND_STR;
337 mainMenu[j].name = "move";
338 mainMenu[j++].activateCallback = ShowMoveFileDialog;
340 duplicateBtn = &(mainMenu[j].widget);
341 mainMenu[j].type = MENU_BUTTON;
342 mainMenu[j].maskBit = DUPLICATE;
343 mainMenu[j].label = GETMESSAGE(20, 153, "Copy to...");
344 mainMenu[j].label = XtNewString(mainMenu[j].label);
345 mainMenu[j].mnemonic = GETMESSAGE(20, 145, "C");
346 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
347 mainMenu[j].helpData = HELP_COPY_AS_COMMAND_STR;
348 mainMenu[j].name = "copy";
349 mainMenu[j++].activateCallback = ShowCopyFileDialog;
351 linkBtn = &(mainMenu[j].widget);
352 mainMenu[j].type = MENU_BUTTON;
353 mainMenu[j].maskBit = LINK;
354 mainMenu[j].label = GETMESSAGE(20, 154, "Copy As Link...");
355 mainMenu[j].label = XtNewString(mainMenu[j].label);
356 mainMenu[j].mnemonic = GETMESSAGE(20, 127, "L");
357 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
358 mainMenu[j].helpData = HELP_LINK_AS_COMMAND_STR;
359 mainMenu[j].name = "link";
360 mainMenu[j++].activateCallback = ShowLinkFileDialog;
362 mainMenu[j].type = MENU_SEPARATOR;
363 mainMenu[j].name = "separator";
364 mainMenu[j++].helpCallback = NULL;
366 mainMenu[j].maskBit = PUT_ON_DESKTOP;
367 mainMenu[j].type = MENU_BUTTON;
368 mainMenu[j].label = GETMESSAGE(20,84, "Put in Workspace");
369 mainMenu[j].label = XtNewString(mainMenu[j].label);
370 mainMenu[j].mnemonic = GETMESSAGE(20,85, "W");
371 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
372 mainMenu[j].helpData = HELP_PUT_ON_DT_COMMAND_STR;
373 mainMenu[j].name = "putInWorkspace";
374 mainMenu[j++].activateCallback = PutOnDTCB;
376 mainMenu[j].type = MENU_BUTTON;
377 mainMenu[j].maskBit = TRASH;
378 mainMenu[j].label = GETMESSAGE(20,151, "Put in Trash");
379 mainMenu[j].label = XtNewString(mainMenu[j].label);
380 mainMenu[j].mnemonic = GETMESSAGE(20, 91, "T");
381 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
382 mainMenu[j].helpData = HELP_TRASH_FILES_COMMAND_STR;
383 mainMenu[j].name = "putInTrash";
384 mainMenu[j++].activateCallback = TrashFiles;
386 renameBtn = &(mainMenu[j].widget);
387 mainMenu[j].type = MENU_BUTTON;
388 mainMenu[j].maskBit = RENAME;
389 mainMenu[j].label = GETMESSAGE(20, 137, "Rename...");
390 mainMenu[j].label = XtNewString(mainMenu[j].label);
391 mainMenu[j].mnemonic = GETMESSAGE(20, 110, "R");
392 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
393 mainMenu[j].helpData = HELP_RENAME_COMMAND_STR;
394 mainMenu[j].name = "rename";
395 mainMenu[j++].activateCallback = ShowRenameFileDialog;
397 mainMenu[j].type = MENU_BUTTON;
398 mainMenu[j].maskBit = MODIFY;
399 mainMenu[j].label = GETMESSAGE(20, 150, "Change Permissions...");
400 mainMenu[j].label = XtNewString(mainMenu[j].label);
401 mainMenu[j].mnemonic = GETMESSAGE(20, 17, "P");
402 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
403 mainMenu[j].helpData = HELP_PROPERTIES_COMMAND_STR;
404 mainMenu[j].name = "permissions";
405 mainMenu[j++].activateCallback = ShowModAttrDialog;
407 mainMenu[j].type = MENU_SEPARATOR;
408 mainMenu[j].name = "separator";
409 mainMenu[j++].helpCallback = NULL;
411 mainMenu[j].type = MENU_BUTTON;
412 mainMenu[j].label = GETMESSAGE(20, 48, "Select All");
413 mainMenu[j].label = XtNewString(mainMenu[j].label);
414 mainMenu[j].mnemonic = GETMESSAGE(20, 51, "S");
415 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
416 mainMenu[j].helpData = HELP_SELECT_ALL_COMMAND_STR;
417 mainMenu[j].name = "selectAll";
418 mainMenu[j++].activateCallback = SelectAll;
420 mainMenu[j].type = MENU_BUTTON;
421 mainMenu[j].label = GETMESSAGE(20, 52, "Deselect All");
422 mainMenu[j].label = XtNewString(mainMenu[j].label);
423 mainMenu[j].mnemonic = GETMESSAGE(20, 55, "D");
424 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
425 mainMenu[j].helpData = HELP_UNSELECT_ALL_COMMAND_STR;
426 mainMenu[j].name = "deselectAll";
427 mainMenu[j++].activateCallback = UnselectAll;
429 mainMenu[j].type = MENU_SEPARATOR;
430 mainMenu[j].name = "separator";
431 mainMenu[j++].helpCallback = NULL;
433 /*************************************/
434 /* Create the 'View' menu components */
435 /*************************************/
437 directoryBarBtn = &(mainMenu[j].widget);
438 mainMenu[j].type = MENU_PULLDOWN_BUTTON;
439 mainMenu[j].label = GETMESSAGE(20, 5, "View");
440 mainMenu[j].label = XtNewString(mainMenu[j].label);
441 mainMenu[j].mnemonic = GETMESSAGE(20, 6, "V");
442 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
443 mainMenu[j].name = "view";
444 mainMenu[j++].helpData = HELP_VIEW_MENU_STR;
446 mainMenu[j].type = SHARED_MENU_PANE;
447 mainMenu[j].name = "viewMenu";
448 mainMenu[j++].helpData = HELP_VIEW_MENU_STR;
450 if(openDirType == CURRENT)
452 newViewBtn = &(mainMenu[j].widget);
453 mainMenu[j].type = MENU_BUTTON;
454 mainMenu[j].label = GETMESSAGE(20, 138, "Open New View");
455 mainMenu[j].label = XtNewString(mainMenu[j].label);
456 mainMenu[j].mnemonic = GETMESSAGE(20, 139, "O");
457 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
458 mainMenu[j].helpData = HELP_NEW_VIEW_COMMAND_STR;
459 mainMenu[j].name = "new";
460 mainMenu[j++].activateCallback = NewView;
465 mainMenu[j].type = MENU_SEPARATOR;
466 mainMenu[j].name = "separator";
467 mainMenu[j++].helpCallback = NULL;
469 preferencesBtn = &(mainMenu[j].widget);
470 mainMenu[j].type = MENU_BUTTON;
471 mainMenu[j].maskBit = PREFERENCES;
472 mainMenu[j].label = GETMESSAGE(20, 141, "Set View Options...");
473 mainMenu[j].label = XtNewString(mainMenu[j].label);
474 mainMenu[j].mnemonic = GETMESSAGE(20, 6, "V");
475 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
476 mainMenu[j].helpData = HELP_PREFERENCES_COMMAND_STR;
477 mainMenu[j].name = "setViewOptions";
478 mainMenu[j++].activateCallback = ShowPreferencesDialog;
480 defaultEnvBtn = &(mainMenu[j].widget);
481 mainMenu[j].type = MENU_BUTTON;
482 mainMenu[j].maskBit = SETTINGS;
483 mainMenu[j].label = GETMESSAGE(20, 142, "Save As Default Options...");
484 mainMenu[j].label = XtNewString(mainMenu[j].label);
485 mainMenu[j].mnemonic = GETMESSAGE(20, 143, "S");
486 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
487 mainMenu[j].helpData = HELP_SAVE_SETTINGS_COMMAND_STR;
488 mainMenu[j].name = "saveViewOptions";
489 mainMenu[j++].activateCallback = SaveSettingsCB;
491 showHiddenMenu = &(mainMenu[j].widget);
492 mainMenu[j].type = MENU_TOGGLE_BUTTON;
493 mainMenu[j].label = GETMESSAGE(20,156, "Show Hidden Objects");
494 mainMenu[j].label = XtNewString(mainMenu[j].label);
495 mainMenu[j].mnemonic = GETMESSAGE(20,102, "H");
496 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
497 mainMenu[j].helpData = HELP_SHOW_HIDDEN_COMMAND_STR;
498 mainMenu[j].name = "showHiddenObjects";
499 mainMenu[j++].activateCallback = ShowHiddenFiles;
501 filterBtn = &(mainMenu[j].widget);
502 mainMenu[j].type = MENU_BUTTON;
503 mainMenu[j].maskBit = FILTER;
504 mainMenu[j].label = GETMESSAGE(20,144, "Set Filter Options...");
505 mainMenu[j].label = XtNewString(mainMenu[j].label);
506 mainMenu[j].mnemonic = GETMESSAGE(20, 104, "F");
507 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
508 mainMenu[j].helpData = HELP_FILTER_COMMAND_STR;
509 mainMenu[j].name = "setFilterOptions";
510 mainMenu[j++].activateCallback = ShowFilterDialog;
512 mainMenu[j].type = MENU_SEPARATOR;
513 mainMenu[j].name = "separator";
514 mainMenu[j++].helpCallback = NULL;
516 cleanUpBtn = &(mainMenu[j].widget);
517 mainMenu[j].type = MENU_BUTTON;
518 mainMenu[j].maskBit = CLEAN_UP;
519 mainMenu[j].label = GETMESSAGE(20,99, "Clean Up");
520 mainMenu[j].label = XtNewString(mainMenu[j].label);
521 mainMenu[j].mnemonic = GETMESSAGE(20,100, "C");
522 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
523 mainMenu[j].helpData = HELP_CLEAN_UP_COMMAND_STR;
524 mainMenu[j].name = "cleanUp";
525 mainMenu[j++].activateCallback = CleanUp;
527 mainMenu[j].type = MENU_BUTTON;
528 mainMenu[j].label = GETMESSAGE(20, 30, "Update");
529 mainMenu[j].label = XtNewString(mainMenu[j].label);
530 mainMenu[j].mnemonic = GETMESSAGE(20, 33, "U");
531 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
532 mainMenu[j].helpData = HELP_REREAD_COMMAND_STR;
533 mainMenu[j].name = "refresh";
534 mainMenu[j++].activateCallback = RereadDirectoryMenu;
536 /*************************************/
537 /* Create the 'Help' menu components */
538 /*************************************/
540 mainMenu[j].type = MENU_PULLDOWN_BUTTON;
541 mainMenu[j].isHelpBtn = True;
542 mainMenu[j].label = GETMESSAGE(20, 123, "Help");
543 mainMenu[j].label = XtNewString(mainMenu[j].label);
544 mainMenu[j].mnemonic = GETMESSAGE(20, 9, "H");
545 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
546 mainMenu[j].name = "help";
547 mainMenu[j++].helpData = HELP_HELP_MENU_STR;
549 mainMenu[j].type = SHARED_MENU_PANE;
550 mainMenu[j].name = "helpMenu";
551 mainMenu[j++].helpData = HELP_HELP_MENU_STR;
553 mainMenu[j].type = MENU_BUTTON;
554 mainMenu[j].label = GETMESSAGE(20, 105, "Overview");
555 mainMenu[j].label = XtNewString(mainMenu[j].label);
556 mainMenu[j].mnemonic = GETMESSAGE(20, 106, "v");
557 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
558 mainMenu[j].helpData = HELP_HELP_MENU_STR;
559 mainMenu[j].activateCallback = HelpRequestCB;
560 mainMenu[j].name = "introduction";
561 mainMenu[j++].activateData = HELP_HOME_TOPIC;
563 mainMenu[j].type = MENU_SEPARATOR;
564 mainMenu[j].name = "separator";
565 mainMenu[j++].helpCallback = NULL;
567 mainMenu[j].type = MENU_BUTTON;
568 mainMenu[j].label = GETMESSAGE(20, 148, "Table Of Contents");
569 mainMenu[j].label = XtNewString(mainMenu[j].label);
570 mainMenu[j].mnemonic = GETMESSAGE(20, 149, "C");
571 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
572 mainMenu[j].helpData = HELP_HELP_MENU_STR;
573 mainMenu[j].activateCallback = HelpRequestCB;
574 mainMenu[j].name = "toc";
575 mainMenu[j++].activateData = HELP_TOC_STR;
577 mainMenu[j].type = MENU_BUTTON;
578 mainMenu[j].label = GETMESSAGE(20, 107, "Tasks");
579 mainMenu[j].label = XtNewString(mainMenu[j].label);
580 mainMenu[j].mnemonic = GETMESSAGE(20, 108, "T");
581 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
582 mainMenu[j].helpData = HELP_HELP_MENU_STR;
583 mainMenu[j].activateCallback = HelpRequestCB;
584 mainMenu[j].name = "tasks";
585 mainMenu[j++].activateData = HELP_TASKS_STR;
587 mainMenu[j].type = MENU_BUTTON;
588 mainMenu[j].label = GETMESSAGE(20,109, "Reference");
589 mainMenu[j].label = XtNewString(mainMenu[j].label);
590 mainMenu[j].mnemonic = GETMESSAGE(20,110, "R");
591 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
592 mainMenu[j].helpData = HELP_HELP_MENU_STR;
593 mainMenu[j].activateCallback = HelpRequestCB;
594 mainMenu[j].name = "reference";
595 mainMenu[j++].activateData = HELP_REFERENCE_STR;
597 mainMenu[j].type = MENU_BUTTON;
598 mainMenu[j].label = GETMESSAGE(20,111, "On Item");
599 mainMenu[j].label = XtNewString(mainMenu[j].label);
600 mainMenu[j].mnemonic = GETMESSAGE(20,112, "O");
601 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
602 mainMenu[j].helpData = HELP_HELP_MENU_STR;
603 mainMenu[j].activateCallback = HelpRequestCB;
604 mainMenu[j].name = "onItem";
605 mainMenu[j++].activateData = HELP_HELP_MODE_STR;
607 mainMenu[j].type = MENU_SEPARATOR;
608 mainMenu[j].name = "separator";
609 mainMenu[j++].helpCallback = NULL;
611 usingHelp = &(mainMenu[j].widget);
612 mainMenu[j].type = MENU_BUTTON;
613 mainMenu[j].label = GETMESSAGE(20,113, "Using Help");
614 mainMenu[j].label = XtNewString(mainMenu[j].label);
615 mainMenu[j].mnemonic = GETMESSAGE(20,114, "U");
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 = "usingHelp";
620 mainMenu[j++].activateData = HELP_HOME_TOPIC;
622 mainMenu[j].type = MENU_SEPARATOR;
623 mainMenu[j].name = "separator";
624 mainMenu[j++].helpCallback = NULL;
626 fileManagerHelp = &(mainMenu[j].widget);
627 mainMenu[j].type = MENU_BUTTON;
628 mainMenu[j].label = GETMESSAGE(20,115, "About File Manager");
629 mainMenu[j].label = XtNewString(mainMenu[j].label);
630 mainMenu[j].mnemonic = GETMESSAGE(20,116, "A");
631 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
632 mainMenu[j].helpData = HELP_HELP_MENU_STR;
633 mainMenu[j].activateCallback = HelpRequestCB;
634 mainMenu[j].name = "version";
635 mainMenu[j++].activateData = HELP_ABOUT_STR;
637 applicationManagerHelp = &(mainMenu[j].widget);
638 mainMenu[j].type = MENU_BUTTON;
639 mainMenu[j].label = GETMESSAGE(20,157, "About Application Manager");
640 mainMenu[j].label = XtNewString(mainMenu[j].label);
641 mainMenu[j].mnemonic = GETMESSAGE(20,116, "A");
642 mainMenu[j].mnemonic = XtNewString(mainMenu[j].mnemonic);
643 mainMenu[j].helpData = HELP_HELP_MENU_STR;
644 mainMenu[j].activateCallback = HelpRequestCB;
645 mainMenu[j].name = "version";
646 mainMenu[j++].activateData = HELP_ABOUT_STR;
649 menu_bar = _DtCreateMenuSystem(main, "mainMenu", HelpRequestCB,
650 HELP_HELP_MENU_STR, createSharedComponents,
651 mainMenu, menuItemCount, GetMainMenuData,
652 SetMenuSensitivity, RestoreMenuSensitivity);
654 /* Fine tune the menubar */
655 XtSetArg(args[0], XmNmarginWidth, 2);
656 XtSetArg(args[1], XmNmarginHeight, 2);
657 XtSetValues(menu_bar, args, 2);
659 file_mgr_rec->actions = *actionsId;
660 file_mgr_rec->action_pane = *actionsPaneId;
661 file_mgr_rec->directoryBarBtn = *directoryBarBtn;
663 file_mgr_rec->create_directoryBtn_child= NULL;
664 file_mgr_rec->create_dataBtn_child= NULL;
666 ActivateNoSelect (file_mgr_rec);
668 createSharedComponents = False;
677 XtPointer * mainRecordPtr,
678 MenuDesc ** menuDescPtr,
679 int * menuItemCountPtr,
680 unsigned int ** globalMenuStatesPtr,
681 unsigned int ** viewMenuStatesPtr )
685 FileMgrRec * fileMgrRec;
687 XtSetArg(args[0], XmNuserData, &fileMgrRec);
688 XtGetValues(mbar, args, 1);
689 *mainRecordPtr = (XtPointer) fileMgrRec;
690 *menuDescPtr = mainMenu;
691 *menuItemCountPtr = menuItemCount;
692 *globalMenuStatesPtr = ¤tMenuStates;
693 *viewMenuStatesPtr = &fileMgrRec->menuStates;
694 *actionsPaneId = fileMgrRec->action_pane;
701 struct passwd * pwInfo;
703 if( homeDir == NULL )
705 if ((homeDir = getenv("HOME_CLIENT")) == NULL)
707 if ((homeDir = getenv("HOME")) == NULL)
709 pwInfo = getpwuid (getuid());
710 homeDir = pwInfo->pw_dir;
717 /************************************************************************
719 * ActivateSingleSelect
720 * Activate the menu items that are to be active upon a
723 ************************************************************************/
726 ActivateSingleSelect(
727 FileMgrRec *file_mgr_rec,
730 DialogData * dialog_data;
731 FileMgrData * file_mgr_data;
733 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
735 file_mgr_data = (FileMgrData *) dialog_data->data;
737 if ((strcmp(file_mgr_data->selection_list[0]->file_data->file_name, ".." ) == 0 )
738 || (strcmp(file_mgr_data->selection_list[0]->file_data->file_name, "." ) == 0 ) )
740 file_mgr_rec->menuStates |= TRASH | MODIFY | PUT_ON_DESKTOP;
741 file_mgr_rec->menuStates &= (~RENAME);
744 file_mgr_rec->menuStates |= RENAME | TRASH | MODIFY | PUT_ON_DESKTOP;
746 if ((strcmp(file_type, LT_BROKEN_LINK) != 0)
747 && (strcmp(file_type, LT_RECURSIVE_LINK) != 0)
749 && (file_mgr_data->selection_list[0]->file_data->physical_type !=
754 file_mgr_rec->menuStates |= MOVE | DUPLICATE | LINK;
757 file_mgr_rec->menuStates &= ~(MOVE | DUPLICATE | LINK);
759 /* Update the action menu pane defined for the file type */
760 /* of the selected file. */
762 UpdateActionMenuPane ((XtPointer)file_mgr_data, file_mgr_rec, file_type,
763 NOT_DESKTOP, 0, (Widget)NULL,
764 file_mgr_data->selection_list[0]->file_data->physical_type);
770 UnmanageAllActionItems(
771 FileMgrRec *file_mgr_rec )
774 XmManagerWidget action_pane;
776 action_pane = (XmManagerWidget) file_mgr_rec->action_pane;
778 for (i = SELECTED_MENU_MAX; i < action_pane->composite.num_children; ++i)
780 XtUnmanageChild (action_pane->composite.children[i]);
784 /************************************************************************
786 * ActivateMultipleSelect
787 * Activate (deactivate) the appropriate menu items when multiple
788 * files are selected.
791 ************************************************************************/
794 ActivateMultipleSelect(
795 FileMgrRec *file_mgr_rec )
797 file_mgr_rec->menuStates |= TRASH | PUT_ON_DESKTOP;
798 file_mgr_rec->menuStates &= ~(RENAME | MOVE | DUPLICATE | LINK |
801 UnmanageAllActionItems (file_mgr_rec);
807 /************************************************************************
810 * Activate (deactivate) the appropriate menu items when no
811 * files are selected.
813 ************************************************************************/
817 FileMgrRec *file_mgr_rec )
819 file_mgr_rec->menuStates &= ~(RENAME | MOVE | DUPLICATE | LINK | TRASH |
820 MODIFY | PUT_ON_DESKTOP);
822 UnmanageAllActionItems (file_mgr_rec);
827 /************************************************************************
830 * Unselect all of the selected files.
832 ************************************************************************/
837 XtPointer client_data,
838 XtPointer call_data )
840 FileMgrRec * file_mgr_rec;
841 DialogData * dialog_data;
842 FileMgrData * file_mgr_data;
846 if ((int)(XtArgVal) client_data == FM_POPUP)
849 mbar = XmGetPostedFromWidget(XtParent(w));
852 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
853 XtGetValues(mbar, args, 1);
855 /* Ignore accelerators received after we're unposted */
856 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
858 file_mgr_data = (FileMgrData *) dialog_data->data;
860 DeselectAllFiles (file_mgr_data);
861 ActivateNoSelect (file_mgr_rec);
863 if( file_mgr_data == trashFileMgrData )
864 SensitizeTrashBtns();
870 /************************************************************************
873 * Select all of file displayed.
875 ************************************************************************/
880 XtPointer client_data,
881 XtPointer call_data )
883 FileMgrRec * file_mgr_rec;
884 DialogData * dialog_data;
885 FileMgrData * file_mgr_data;
889 if ((int)(XtArgVal)client_data == FM_POPUP)
892 mbar = XmGetPostedFromWidget(XtParent(w));
895 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
896 XtGetValues(mbar, args, 1);
898 /* Ignore accelerators received after we're unposted */
899 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
901 file_mgr_data = (FileMgrData *) dialog_data->data;
903 SelectAllFiles (file_mgr_data);
905 if( file_mgr_data == trashFileMgrData )
906 SensitizeTrashBtns();
912 /************************************************************************
914 * RereadDirectoryMenu
915 * Callback function invoked from the Reread Directory
916 * menu item. This function calls the file manager functions
917 * which rereads and processes the directory.
919 ************************************************************************/
924 XtPointer client_data,
925 XtPointer call_data )
928 Widget mbar = XmGetPostedFromWidget(XtParent(w));
929 FileMgrRec * file_mgr_rec;
930 DialogData * dialog_data;
934 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
935 XtGetValues(mbar, args, 1);
937 /* Ignore accelerators received after we're unposted */
938 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
941 UnpostTextPath( (FileMgrData *) dialog_data->data );
943 /* force this directory to be updated */
944 FileMgrReread (file_mgr_rec);
948 /************************************************************************
951 * Display the Trash can.
953 ************************************************************************/
954 #if defined(ADD_SHOW_TRASH)
959 XtPointer client_data,
960 XtPointer call_data )
964 TrashDisplayHandler (NULL, NULL, NULL, NULL, 0);
969 /************************************************************************
972 * Send the selected set of files to the trash.
974 ************************************************************************/
979 XtPointer client_data,
980 XtPointer call_data )
982 FileMgrRec * file_mgr_rec;
983 DialogData * dialog_data;
984 FileMgrData * file_mgr_data;
985 FileViewData * file_view_data;
988 DtActionArg * action_args;
992 if (!TrashIsInitialized())
996 title = XtNewString(GetSharedMessage(TRASH_ERROR_TITLE));
998 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.") )
999 + strlen( trash_dir )
1002 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 );
1004 _DtMessage(toplevel, title, msg, NULL, HelpRequestCB);
1010 XmUpdateDisplay (w);
1012 if((int)(XtArgVal)client_data == 0)
1013 mbar = XmGetPostedFromWidget(XtParent(w));
1017 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1018 XtGetValues(mbar, args, 1);
1020 /* Ignore accelerators when we're insensitive */
1021 if(client_data == NULL)
1022 if ((file_mgr_rec->menuStates & TRASH) == 0)
1025 /* Ignore accelerators received after we're unposted */
1026 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
1028 file_mgr_data = (FileMgrData *) dialog_data->data;
1030 /* 'widget_dragged' is set in InitiateIconDrag() and
1031 is never set to NULL. Because of this, after doing a desktop drag
1032 if you do a 'PutInTrash' on the File Manager window object, in
1033 TrashRemoveHandler() in Trash.c, it displays an incorrect message,
1034 So set it to NULL here. */
1036 widget_dragged = NULL;
1038 /* get the file_view_data object from which the menu was invoked */
1039 if (client_data == NULL)
1040 file_view_data = NULL;
1043 file_view_data = file_mgr_data->popup_menu_icon;
1044 /* The following test makes sure that the it is not the case of
1045 multiple selected files */
1046 if (!file_mgr_data->selected_file_count && file_view_data == NULL)
1047 /* the object has gone away (probably deleted) */
1050 file_mgr_data->popup_menu_icon = NULL;
1054 for(i = 0; i < file_mgr_data->selected_file_count; i++)
1056 if(file_mgr_data->selection_list[i] == file_view_data)
1058 file_view_data = NULL;
1066 _DtBuildActionArgsWithSelectedFiles(&file_view_data, 1,
1067 &action_args, &arg_count);
1069 _DtBuildActionArgsWithSelectedFiles(file_mgr_data->selection_list,
1070 file_mgr_data->selected_file_count,
1071 &action_args, &arg_count);
1073 DtActionInvoke(file_mgr_rec->shell, TRASH_ACTION,
1074 action_args, arg_count, NULL, NULL,
1075 trash_dir, True, NULL, NULL);
1077 _DtFreeActionArgs(action_args, arg_count);
1083 /************************************************************************
1086 * Create a new view of the currently display directory
1088 ************************************************************************/
1093 XtPointer client_data,
1094 XtPointer call_data )
1096 FileMgrRec * file_mgr_rec;
1097 DialogData * dialog_data;
1098 FileMgrData * file_mgr_data;
1100 Widget mbar = XmGetPostedFromWidget(XtParent(w));
1103 XmUpdateDisplay (w);
1104 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1105 XtGetValues(mbar, args, 1);
1107 /* Ignore accelerators received after we're unposted */
1108 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
1110 file_mgr_data = (FileMgrData *) dialog_data->data;
1112 initiating_view = (XtPointer) file_mgr_data;
1113 if(file_mgr_data->restricted_directory != NULL)
1115 special_view = True;
1116 special_treeType = file_mgr_data->show_type;
1117 special_viewType = file_mgr_data->view;
1118 special_orderType = file_mgr_data->order;
1119 special_directionType = file_mgr_data->direction;
1120 special_randomType = file_mgr_data->positionEnabled;
1121 special_restricted = XtNewString(file_mgr_data->restricted_directory);
1122 if(file_mgr_data->title == NULL)
1123 special_title = NULL;
1125 special_title = XtNewString(file_mgr_data->title);
1126 special_helpVol = XtNewString(file_mgr_data->helpVol);
1128 if(file_mgr_data->toolbox)
1129 GetNewView (file_mgr_data->host, file_mgr_data->current_directory,
1130 file_mgr_data->restricted_directory, NULL, 0);
1132 GetNewView (file_mgr_data->host, file_mgr_data->current_directory,
1136 GetNewView (file_mgr_data->host, file_mgr_data->current_directory, NULL,
1138 initiating_view = (XtPointer) NULL;
1144 /************************************************************************
1147 * Update the current view to show the home directory.
1149 ************************************************************************/
1154 XtPointer client_data,
1155 XtPointer call_data )
1157 FileMgrRec * file_mgr_rec;
1158 DialogData * dialog_data;
1159 FileMgrData * file_mgr_data;
1163 Widget mbar = XmGetPostedFromWidget(XtParent(w));
1166 XmUpdateDisplay (w);
1167 if((int)(XtArgVal)client_data == FM_POPUP)
1170 mbar = XmGetPostedFromWidget(XtParent(w));
1172 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1173 XtGetValues(mbar, args, 1);
1175 /* Ignore accelerators when we're insensitive */
1176 if ((file_mgr_rec->menuStates & HOME) == 0)
1179 /* Ignore accelerators received after we're unposted */
1180 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
1182 file_mgr_data = (FileMgrData *) dialog_data->data;
1186 if( homeDir == NULL )
1189 if((ptr = DtStrchr(homeDir, ':')) != NULL)
1191 ptr1 = DtStrchr(homeDir, '/');
1192 if(strlen(ptr) > strlen(ptr1))
1195 host = XtNewString(homeDir);
1203 host = home_host_name;
1206 host = home_host_name;
1208 if (file_mgr_data->cd_select != NULL)
1210 XtFree (file_mgr_data->cd_select);
1211 file_mgr_data->cd_select = NULL;
1214 ShowNewDirectory( file_mgr_data, host, homeDir );
1223 /************************************************************************
1226 * Update the current view to show the parent directory.
1228 ************************************************************************/
1233 XtPointer client_data,
1234 XtPointer call_data )
1236 FileMgrRec * file_mgr_rec;
1237 DialogData * dialog_data;
1238 FileMgrData * file_mgr_data;
1240 Widget mbar = XmGetPostedFromWidget(XtParent(w));
1241 char host_name[MAX_PATH];
1242 Widget focus_widget;
1244 XmUpdateDisplay (w);
1245 if((int)(XtArgVal)client_data == FM_POPUP)
1248 mbar = XmGetPostedFromWidget(XtParent(w));
1250 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1251 XtGetValues(mbar, args, 1);
1253 /* Ignore accelerators when we're insensitive */
1254 if ((file_mgr_rec->menuStates & MOVE_UP) == 0)
1257 /* Ignore accelerators received after we're unposted */
1258 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
1261 focus_widget = XmGetFocusWidget(file_mgr_rec->file_window);
1264 if (focus_widget == file_mgr_rec->current_directory_text)
1266 XmTextFieldReplace(focus_widget,
1268 XmTextFieldGetInsertionPosition(focus_widget),
1272 else if (strcmp(focus_widget->core.name, "nameChangeT") == 0)
1274 XmTextReplace(focus_widget,
1276 XmTextFieldGetInsertionPosition(focus_widget),
1282 file_mgr_data = (FileMgrData *) dialog_data->data;
1284 if (strcmp (file_mgr_data->current_directory, "/") == 0)
1287 strcpy(host_name, file_mgr_data->host);
1289 if (file_mgr_data->cd_select != NULL)
1291 XtFree (file_mgr_data->cd_select);
1292 file_mgr_data->cd_select = NULL;
1295 ShowNewDirectory (file_mgr_data, host_name,
1296 _DtPName (file_mgr_data->current_directory));
1298 if(strcmp(file_mgr_data->current_directory,
1299 file_mgr_data->restricted_directory) == 0)
1301 _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, False, ¤tMenuStates);
1302 file_mgr_rec->menuStates &= ~(MOVE_UP);
1306 file_mgr_rec->menuStates |= MOVE_UP;
1307 _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, True, ¤tMenuStates);
1314 /************************************************************************
1316 * SetMenuSensitivity
1317 * Called before each menupane is posted; it will correctly set
1318 * the menu button sensitivity for the view from which the menu
1319 * is being posted; this is necessary because the menupanes are
1320 * shared. Only those buttons whose state is different than that
1321 * of the current menu will be changed.
1323 ************************************************************************/
1328 XtPointer client_data,
1329 XtPointer call_data )
1333 FileMgrRec * file_mgr_rec;
1334 XmMenuShellWidget mshell = (XmMenuShellWidget) w;
1335 DialogData * dialog_data;
1336 FileMgrData * file_mgr_data = NULL;
1338 _XmGetActiveTopLevelMenu(mshell->composite.children[0], &mbar);
1339 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1340 XtGetValues(mbar, args, 1);
1342 /* Enable the appropriate menu widgets based on the view type */
1343 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) != NULL)
1345 struct stat file_info;
1347 file_mgr_data = (FileMgrData *) dialog_data->data;
1349 if( stat( file_mgr_data->current_directory, &file_info ) == 0 )
1351 if( ! (file_info.st_mode & S_IXUSR)
1352 || ! (file_info.st_mode & S_IWUSR) )
1354 file_mgr_rec->menuStates &= ~(CREATE_DIR) & ~(CREATE_FILE);
1355 _DtGlobalUpdateMenuItemState(*create_dataBtn, CREATE_FILE, False, ¤tMenuStates);
1356 _DtGlobalUpdateMenuItemState(*create_directoryBtn, CREATE_DIR, False, ¤tMenuStates);
1358 else if( ! ( file_mgr_data->toolbox ) ||
1359 ( file_mgr_data->toolbox && geteuid() == root_user ) )
1361 file_mgr_rec->menuStates |= CREATE_DIR | CREATE_FILE;
1362 _DtGlobalUpdateMenuItemState(*create_dataBtn, CREATE_FILE, True, ¤tMenuStates);
1363 _DtGlobalUpdateMenuItemState(*create_directoryBtn, CREATE_DIR, True, ¤tMenuStates);
1367 if (!PositioningEnabledInView(file_mgr_data))
1368 file_mgr_rec->menuStates &= ~(CLEAN_UP);
1370 file_mgr_rec->menuStates |= CLEAN_UP;
1372 XtManageChild(*defaultEnvBtn);
1373 if(file_mgr_data->restricted_directory == NULL)
1375 if(strcmp(file_mgr_data->current_directory, "/") == 0)
1377 file_mgr_rec->menuStates &= ~(MOVE_UP);
1378 _DtGlobalUpdateMenuItemState( *upBarBtn, MOVE_UP,
1379 False,¤tMenuStates);
1383 file_mgr_rec->menuStates |= MOVE_UP;
1384 _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, True,¤tMenuStates);
1387 if( homeDir == NULL )
1391 && strcmp( homeDir, file_mgr_data->current_directory ) != 0 )
1393 file_mgr_rec->menuStates |= HOME;
1394 _DtGlobalUpdateMenuItemState(*homeBarBtn, HOME, True,
1395 ¤tMenuStates);
1399 file_mgr_rec->menuStates &= ~(HOME);
1400 _DtGlobalUpdateMenuItemState(*homeBarBtn, HOME, False,
1401 ¤tMenuStates);
1404 file_mgr_rec->menuStates |= CHANGE_DIR;
1405 _DtGlobalUpdateMenuItemState(*change_directoryBtn, CHANGE_DIR, True,
1406 ¤tMenuStates);
1407 XtManageChild(*change_directoryBtn);
1411 if(strcmp(file_mgr_data->current_directory,
1412 file_mgr_data->restricted_directory) == 0)
1414 _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, False,
1415 ¤tMenuStates);
1416 file_mgr_rec->menuStates &= ~(MOVE_UP);
1420 file_mgr_rec->menuStates |= MOVE_UP;
1421 _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, True,
1422 ¤tMenuStates);
1424 _DtGlobalUpdateMenuItemState(*homeBarBtn, HOME, False,¤tMenuStates);
1425 file_mgr_rec->menuStates &= ~(HOME);
1426 _DtGlobalUpdateMenuItemState(*change_directoryBtn, CHANGE_DIR, False,
1427 ¤tMenuStates);
1428 file_mgr_rec->menuStates &= ~(CHANGE_DIR);
1434 if(file_mgr_data->restricted_directory == NULL)
1437 _DtGlobalUpdateMenuItemState(*terminalBtn, TERMINAL, True,
1438 ¤tMenuStates);
1439 file_mgr_rec->menuStates |= TERMINAL;
1444 _DtGlobalUpdateMenuItemState(*terminalBtn, TERMINAL, False,
1445 ¤tMenuStates);
1446 file_mgr_rec->menuStates &= ~(TERMINAL);
1449 XtManageChild(*terminalBtn);
1452 XtManageChild(*preferencesBtn);
1453 XtManageChild(*filterBtn);
1454 if(openDirType == CURRENT)
1455 XtManageChild(*newViewBtn);
1456 XtManageChild(*showHiddenMenu);
1463 ptr = strrchr(users_home_dir, '/');
1465 if(strcmp(file_mgr_data->current_directory, users_home_dir) == 0)
1466 file_mgr_rec->menuStates &= ~(MOVE_UP);
1468 file_mgr_rec->menuStates |= MOVE_UP;
1473 XtManageChild(*findBtn);
1475 /* The problem is when users have 2 views
1476 and selected one file on one view and popup the
1477 'Selected' menu on the other view.
1478 The 'Selected' menu still show the other view action items.
1480 if( file_mgr_data->selected_file_count == 0 )
1481 ActivateNoSelect( file_mgr_rec );
1482 else if( file_mgr_data->selected_file_count == 1 )
1483 ActivateSingleSelect( file_mgr_rec,
1484 file_mgr_data->selection_list[0]->file_data->logical_type );
1486 ActivateMultipleSelect( file_mgr_rec );
1488 if( file_mgr_data->toolbox )
1490 if( geteuid() == root_user || access(file_mgr_data->current_directory,
1493 file_mgr_rec->menuStates |= CREATE_DIR
1495 _DtGlobalUpdateMenuItemState(*create_dataBtn, CREATE_FILE, True,
1496 ¤tMenuStates);
1497 _DtGlobalUpdateMenuItemState(*create_directoryBtn, CREATE_DIR, True,
1498 ¤tMenuStates);
1502 file_mgr_rec->menuStates &= ~(CREATE_DIR
1508 _DtGlobalUpdateMenuItemState(*create_dataBtn, CREATE_FILE, False,
1509 ¤tMenuStates);
1510 _DtGlobalUpdateMenuItemState(*create_directoryBtn, CREATE_DIR, False,
1511 ¤tMenuStates);
1512 _DtGlobalUpdateMenuItemState(*moveBtn, MOVE, False,
1513 ¤tMenuStates);
1514 _DtGlobalUpdateMenuItemState(*linkBtn, LINK, False,
1515 ¤tMenuStates);
1516 _DtGlobalUpdateMenuItemState(*renameBtn, RENAME, False,
1517 ¤tMenuStates);
1527 if (file_mgr_data->show_hid_enabled)
1528 XmToggleButtonGadgetSetState(*showHiddenMenu, True, False);
1530 XmToggleButtonGadgetSetState(*showHiddenMenu, False, False);
1533 if( file_mgr_data->toolbox )
1535 if( ! XtIsManaged( *applicationManagerHelp ) )
1536 XtManageChild( *applicationManagerHelp );
1537 if( XtIsManaged( *fileManagerHelp ) )
1538 XtUnmanageChild( *fileManagerHelp );
1542 if( ! XtIsManaged( *fileManagerHelp ) )
1543 XtManageChild( *fileManagerHelp );
1544 if( XtIsManaged( *applicationManagerHelp ) )
1545 XtUnmanageChild( *applicationManagerHelp );
1548 _DtGlobalSetMenuSensitivity(w, client_data, call_data);
1554 /************************************************************************
1556 * RestoreMenuSensitivity
1557 * Called after each menupane is unposted; it will restore the
1558 * sensitivity state of each menubutton to 'TRUE'; this is so that
1559 * accelerators will work correctly.
1561 ************************************************************************/
1564 RestoreMenuSensitivity(
1566 XtPointer client_data,
1567 XtPointer call_data )
1571 FileMgrRec * file_mgr_rec;
1572 XmMenuShellWidget mshell = (XmMenuShellWidget) w;
1573 DialogData * dialog_data;
1574 FileMgrData * file_mgr_data;
1577 _XmGetActiveTopLevelMenu(mshell->composite.children[0], &mbar);
1578 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1579 XtGetValues(mbar, args, 1);
1581 /* Enable the appropriate menu widgets based on the view type */
1582 dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec);
1583 file_mgr_data = (FileMgrData *) dialog_data->data;
1585 _DtGlobalRestoreMenuSensitivity(w, client_data, call_data);
1591 ptr = strrchr(users_home_dir, '/');
1593 if(strcmp(file_mgr_data->current_directory, users_home_dir) == 0)
1595 _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, False,
1596 ¤tMenuStates);
1600 _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, True,
1601 ¤tMenuStates);
1606 if ((currentMenuStates & MOVE_UP) == 0)
1607 _DtGlobalUpdateMenuItemState(*upBarBtn, MOVE_UP, True,¤tMenuStates);
1609 if ((currentMenuStates & CLEAN_UP) == 0)
1610 _DtGlobalUpdateMenuItemState(*cleanUpBtn, CLEAN_UP, True,¤tMenuStates);
1616 /************************************************************************
1619 * Bring up a terminal with the current working directory the directory
1620 * of the dtfile view.
1622 ************************************************************************/
1627 XtPointer client_data,
1628 XtPointer call_data)
1630 FileMgrRec * file_mgr_rec;
1631 DialogData * dialog_data;
1632 FileMgrData * file_mgr_data;
1634 Widget mbar = XmGetPostedFromWidget(XtParent(w));
1635 char * pwd_host = NULL;
1636 char * pwd_dir = NULL;
1638 XmUpdateDisplay (w);
1639 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1640 XtGetValues(mbar, args, 1);
1642 /* Ignore accelerators received after we're unposted */
1643 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
1645 file_mgr_data = (FileMgrData *) dialog_data->data;
1647 pwd_host = XtNewString(file_mgr_data->host);
1648 pwd_dir = XtNewString(file_mgr_data->current_directory);
1650 DtActionInvoke(file_mgr_rec->shell, "Terminal", NULL, 0, NULL,
1651 NULL, pwd_dir, True, NULL, NULL);