2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $TOG: FileMgr.c /main/19 1998/01/27 12:19:54 mgreess $ */
24 /************************************<+>*************************************
25 ****************************************************************************
29 * COMPONENT_NAME: Desktop File Manager (dtfile)
31 * Description: Source file for the File Manager dialog.
33 * FUNCTIONS: BranchListToString
45 * DropOnPrimaryHotspot
48 * FileMgrBuildDirectories
49 * FileMgrPropagateSettings
50 * FileMgrRedisplayFiles
71 * PositioningEnabledInView
72 * ProcessDropOnFileWindow
78 * SelectionListToString
88 * StringToSelectionList
96 * (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
97 * (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
98 * (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
99 * (c) Copyright 1993, 1994, 1995 Novell, Inc.
101 ****************************************************************************
102 ************************************<+>*************************************/
105 #include <sys/types.h>
108 #include <sys/stat.h>
111 #include <Xm/CascadeB.h>
112 #include <Xm/DrawingA.h>
113 #include <Xm/DrawingAP.h>
114 #include <Xm/DrawnB.h>
115 #include <Xm/Frame.h>
117 #include <Xm/LabelG.h>
118 #include <Xm/MainW.h>
119 #include <Xm/PushBG.h>
120 #include <Xm/RowColumn.h>
121 #include <Xm/ScrolledW.h>
122 #include <Xm/SeparatoG.h>
124 #include <Xm/TextF.h>
125 #include <Xm/ToggleBG.h>
126 #include <Xm/VendorSEP.h>
128 #include <Dt/IconP.h>
129 #include <Dt/IconFile.h>
131 #include <X11/ShellP.h>
132 #include <X11/Shell.h>
133 #include <X11/Xatom.h>
134 #include <X11/keysymdef.h>
136 #include <Xm/Protocols.h>
138 #include <Dt/Action.h>
139 #include <Dt/DtP.h> /* required for DtDirPaths type */
140 #include <Dt/Connect.h> /* required for DtMakeConnect... */
141 #include <Dt/FileM.h>
142 #include <Dt/HourGlass.h>
143 #include <Dt/DtNlUtils.h>
146 #include <Xm/DragIcon.h>
147 #include <Xm/DragC.h>
153 #include "SharedProcs.h"
161 #include "ChangeDir.h"
164 #include "SharedMsgs.h"
165 #include "IconicPath.h"
168 /* Dialog classes installed by Main.c */
170 extern int file_mgr_dialog;
171 extern int change_dir_dialog;
172 extern int preferences_dialog;
173 extern int filter_dialog;
174 extern int find_dialog;
175 extern int mod_attr_dialog;
177 extern int ReadInFiletypes(
178 FilterData *filter_data) ;
180 /* global varibles used within this function when we have to
181 * put up a _DtMessage dialog
183 static int global_file_count;
184 static char **global_file_set;
185 static char **global_host_set;
186 static FileMgrData *fm;
187 static int view_type;
188 static FileViewData *fv;
189 static DesktopRec *dtWindow;
190 static unsigned int mod;
191 static DirectorySet *dd;
192 static Pixmap change_view_pixmap = XmUNSPECIFIED_PIXMAP;
194 /* Global variables used in Command.c, FileMgr.c and FileOp.c */
195 int G_dropx, G_dropy;
197 /******** Static Function Declarations ********/
199 static XmFontListEntry FontListDefaultEntry(
200 XmFontList font_list) ;
204 Widget *return_widget,
206 static XtPointer GetDefaultValues( void ) ;
207 static XtPointer GetResourceValues(
208 XrmDatabase data_base,
210 static void SetValues(
211 FileMgrRec *file_mgr_rec,
212 FileMgrData *file_mgr_data) ;
213 static void WriteResourceValues(
217 static void FreeValues(
218 FileMgrData *file_mgr_data) ;
220 XtPointer recordPtr) ;
221 static void GetSessionDir(
222 FileMgrData *file_mgr_data) ;
223 static void BranchListToString(
227 static void SelectionListToString(
229 FileViewData ***value,
231 static Boolean StringToBranchList(
237 XtPointer *converter_data );
238 static void StringToSelectionList(
243 static void GetFileData(
244 FileMgrData *file_mgr_data,
246 char ** branch_list) ;
247 static FileViewData * GetTopInfo(
248 FileMgrData *file_mgr_data,
250 char *directory_name,
251 char **branch_list) ;
252 static void CountDirectories(
255 static DirectorySet * NewDirectorySet(
258 FileMgrData *file_mgr_data) ;
259 static void MakeDirectorySets(
260 FileMgrData *file_mgr_data,
262 DirectorySet **directory_set,
264 static void ReadTreeDirectory(
267 char *directory_name,
268 FileMgrData *file_mgr_data,
270 DirectorySet ***directory_set,
271 int *directory_count) ;
272 static Bool IsShown( FileMgrData *fmd,
274 static void SetDisplayedRecur(
278 static void SelectVisible (
279 FileMgrData *file_mgr_data) ;
280 static void FreeDirectorySet(
281 DirectorySet ** directory_set,
282 int directory_count) ;
283 static void FreeDirectoryData(
284 FileMgrData *file_mgr_data) ;
285 static void SystemClose(
288 static void SetIconAttributes(
289 FileMgrRec *file_mgr_rec,
290 FileMgrData *file_mgr_data,
291 char *directory_name) ;
292 static void SetFocus (
293 FileMgrRec * file_mgr_rec,
294 FileMgrData * file_mgr_data) ;
295 static void MoveOkCB(
297 XtPointer client_data,
298 XtPointer call_data ) ;
299 static void MoveCancelCB(
301 XtPointer client_data,
302 XtPointer call_data ) ;
303 static void CreateFmPopup (
305 static void DoTheMove(
311 Cardinal *num_params );
312 static void ActivateClist(
316 Cardinal *num_params );
318 /******** End Static Function Declarations ********/
321 #define TREE_DASH_WIDTH 1
323 /* Resource read and write function */
325 static char * FILEMGR = "FileMgr";
328 /* Action for osfMenu */
329 static XtActionsRec FMAction[] =
330 { { "FMInput", FMInput},
331 { "ActivateClist", ActivateClist}
335 /* The resources set for the FileMgr dialog */
337 static DialogResource resources[] =
339 { "show_type", SHOW_TYPE, sizeof(unsigned char),
340 XtOffset(FileMgrDataPtr, show_type),
341 (XtPointer) SINGLE_DIRECTORY, ShowTypeToString },
343 { "tree_files", TREE_FILES, sizeof(unsigned char),
344 XtOffset(FileMgrDataPtr, tree_files),
345 (XtPointer) TREE_FILES_NEVER, TreeFilesToString },
347 { "view_single", VIEW, sizeof(unsigned char),
348 XtOffset(FileMgrDataPtr, view_single),
349 (XtPointer) BY_NAME_AND_ICON, ViewToString },
351 { "view_tree", VIEW, sizeof(unsigned char),
352 XtOffset(FileMgrDataPtr, view_tree),
353 (XtPointer) BY_NAME_AND_SMALL_ICON, ViewToString },
355 { "order", ORDER, sizeof(unsigned char),
356 XtOffset(FileMgrDataPtr, order),
357 (XtPointer) ORDER_BY_ALPHABETICAL, OrderToString },
359 { "direction", DIRECTION_RESRC, sizeof(unsigned char),
360 XtOffset(FileMgrDataPtr, direction),
361 (XtPointer) DIRECTION_ASCENDING, DirectionToString },
363 { "positionEnabled", RANDOM, sizeof(unsigned char),
364 XtOffset(FileMgrDataPtr, positionEnabled),
365 (XtPointer) RANDOM_OFF, RandomToString },
367 { "host", XmRString, sizeof(String),
368 XtOffset(FileMgrDataPtr, host), (XtPointer) NULL, _DtStringToString },
370 { "current_directory", XmRString, sizeof(String),
371 XtOffset(FileMgrDataPtr, current_directory),
372 (XtPointer) "~", _DtStringToString },
374 { "branch_list", BRANCH_LIST, sizeof(XtPointer),
375 XtOffset(FileMgrDataPtr, branch_list),
376 (XtPointer) NULL, BranchListToString },
378 { "restricted_directory", XmRString, sizeof(String),
379 XtOffset(FileMgrDataPtr, restricted_directory),
380 (XtPointer) NULL, _DtStringToString },
382 { "title", XmRString, sizeof(String),
383 XtOffset(FileMgrDataPtr, title),
384 (XtPointer) NULL, _DtStringToString },
386 { "helpVol", XmRString, sizeof(String),
387 XtOffset(FileMgrDataPtr, helpVol),
388 (XtPointer) NULL, _DtStringToString },
390 { "selection_list", SELECTION_LIST, sizeof(XtPointer),
391 XtOffset(FileMgrDataPtr, selection_list),
392 (XtPointer) NULL, SelectionListToString },
394 { "show_iconic_path", XmRBoolean, sizeof(Boolean),
395 XtOffset(FileMgrDataPtr, show_iconic_path),
396 (XtPointer) True, _DtBooleanToString },
398 { "show_current_directory", XmRBoolean, sizeof(Boolean),
399 XtOffset(FileMgrDataPtr, show_current_dir),
400 (XtPointer) False, _DtBooleanToString },
402 { "show_status_line", XmRBoolean, sizeof(Boolean),
403 XtOffset(FileMgrDataPtr, show_status_line),
404 (XtPointer) True, _DtBooleanToString },
406 { "fast_cd_enabled", XmRBoolean, sizeof(Boolean),
407 XtOffset(FileMgrDataPtr, fast_cd_enabled),
408 (XtPointer) False, _DtBooleanToString },
410 { "toolbox", XmRBoolean, sizeof(Boolean),
411 XtOffset(FileMgrDataPtr, toolbox),
412 (XtPointer) False, _DtBooleanToString },
414 { "show_hid_enabled", XmRBoolean, sizeof(Boolean),
415 XtOffset(FileMgrDataPtr, show_hid_enabled),
416 (XtPointer) False, _DtBooleanToString },
418 { "secondaryHelpDialogCount", XmRInt, sizeof(int),
419 XtOffset(FileMgrDataPtr, secondaryHelpDialogCount),
420 (XtPointer) 0, _DtIntToString },
422 { "attr_dialog_count", XmRInt, sizeof(int),
423 XtOffset(FileMgrDataPtr, attr_dialog_count),
424 (XtPointer) 0, _DtIntToString },
426 { "trashcan", XmRBoolean, sizeof(Boolean),
427 XtOffset(FileMgrDataPtr, IsTrashCan),
428 (XtPointer) False, _DtBooleanToString },
433 * The Dialog Class structure.
436 static DialogClass fileMgrClassRec =
441 (DialogInstallChangeProc) NULL,
442 (DialogInstallCloseProc) NULL,
444 (DialogGetValuesProc) NULL,
447 (DialogSetValuesProc) SetValues,
449 (DialogFreeValuesProc) FreeValues,
451 (DialogSetFocusProc) SetFocus,
454 DialogClass * fileMgrClass = (DialogClass *) &fileMgrClassRec;
456 #ifdef _CHECK_FOR_SPACES
457 char translations_sp_esc[] = "<Key>space:Space()\n\
458 <Key>osfCancel:EscapeFM()";
459 char translations_space[] = "<Key>space:Space()";
461 char translations_sp_esc[] = "Ctrl<Key>space:Space()\n\
462 <Key>osfCancel:EscapeFM()";
463 char translations_space[] = "Ctrl<Key>space:Space()";
465 char translations_escape[] = "<Key>osfCancel:EscapeFM()";
467 #define DOUBLE_CLICK_DRAG
468 #ifndef DOUBLE_CLICK_DRAG
469 char translations_da[] = "\
470 <Key>osfCancel:DrawingAreaInput() ManagerGadgetSelect()\n\
471 <Key>plus:DrawingAreaInput() ManagerGadgetSelect()\n\
472 <Key>minus:DrawingAreaInput() ManagerGadgetSelect()\n\
473 <Btn2Down>:DrawingAreaInput() ManagerGadgetArm()\n\
474 <Btn2Down>,<Btn2Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
475 <Btn2Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
476 <Btn2Down>(2+):DrawingAreaInput() ManagerGadgetMultiArm()\n\
477 <Btn2Up>(2+):DrawingAreaInput() ManagerGadgetMultiActivate()";
481 extern _XmConst char _XmDrawingA_traversalTranslations[];
483 char translations_da[] = "\
484 <BtnMotion>:ManagerGadgetButtonMotion()\n\
485 <Btn1Down>:DrawingAreaInput() ManagerGadgetArm()\n\
486 <Btn1Down>,<Btn1Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
487 <Btn1Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
488 <Btn1Down>(2+):DrawingAreaInput() ManagerGadgetMultiArm() \
489 ManagerGadgetMultiActivate()\n\
490 <Btn2Down>:DrawingAreaInput() ManagerGadgetArm()\n\
491 <Btn2Down>,<Btn2Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
492 <Btn2Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
493 <BtnDown>:DrawingAreaInput()\n\
494 <BtnUp>:DrawingAreaInput()\n\
495 :<Key>osfActivate:DrawingAreaInput() ManagerParentActivate()\n\
496 :<Key>osfCancel:DrawingAreaInput() ManagerGadgetSelect()\n\
497 :<Key>osfHelp:DrawingAreaInput() ManagerGadgetHelp()\n\
498 :<Key>osfSelect:DrawingAreaInput() ManagerGadgetSelect()\n\
499 :<Key>osfDelete:DrawingAreaInput() ManagerGadgetSelect()\n\
500 :<Key>osfMenu:FMInput(@)\n\
501 :<Key>osfEndLine:FMInput(@)\n\
502 <Key>osfBeginLine:FMInput(@)\n\
503 :<Key>osfPageDown:FMInput(@)\n\
504 :<Key>osfPageUp:FMInput(@)\n\
505 :<Key>F1:DrawingAreaInput() ManagerGadgetHelp()\n\
506 s c a <Key>c: ActivateClist(@)\n\
507 ~s ~m ~a <Key>Return:DrawingAreaInput() ManagerParentActivate()\n\
508 <Key>Return:DrawingAreaInput() ManagerGadgetSelect()\n\
509 <Key>space:DrawingAreaInput() ManagerGadgetSelect()\n\
510 :<Key>plus:DrawingAreaInput() ManagerGadgetSelect()\n\
511 :<Key>minus:DrawingAreaInput() ManagerGadgetSelect()\n\
512 <KeyDown>:DrawingAreaInput() ManagerGadgetKeyInput()\n\
513 <KeyUp>:DrawingAreaInput()";
514 #endif /* DOUBLE_CLICK_DRAG */
516 /************************************************************************
518 * FontListDefaultEntry
520 * Return the first entry in the font list with the tag
521 * XmFONTLIST_DEFAULT_TAG. If there isn't one, just return the
522 * first entry in the font list.
524 ************************************************************************/
526 static XmFontListEntry
527 FontListDefaultEntry(XmFontList font_list)
529 XmFontContext context;
530 XmFontListEntry first_entry, entry;
533 if (!XmFontListInitFontContext(&context, font_list))
536 entry = first_entry = XmFontListNextEntry(context);
538 tag = XmFontListEntryGetTag(entry);
539 if (!strcmp(XmFONTLIST_DEFAULT_TAG, tag)) {
545 entry = XmFontListNextEntry(context);
548 XmFontListFreeFontContext(context);
550 return entry ? entry : first_entry;
553 /************************************************************************
557 ************************************************************************/
563 Widget *return_widget,
566 static Boolean first = True;
567 FileMgrRec * file_mgr_rec;
572 Widget header_separator;
573 Widget iconic_path_da;
574 Widget current_directory_frame;
575 Widget current_directory_drop;
576 Widget current_directory_icon;
577 Widget directory_list_form;
580 Widget status_separator;
590 XmFontList font_list;
591 XtPointer entry_font;
593 XFontSetExtents *extents;
600 int icon_offset, cur_dir_offset;
601 Dimension shadow_thickness;
602 Dimension highlight_thickness;
603 XtTranslations trans_table, trans_table1;
606 /* Allocate the change directory dialog instance record. */
608 file_mgr_rec = (FileMgrRec *) XtMalloc (sizeof (FileMgrRec));
609 file_mgr_rec->action_pane_file_type = NULL;
611 /* set up translations in main edit widget */
612 trans_table = XtParseTranslationTable(translations_sp_esc);
614 char * resolvedTranslationString;
616 resolvedTranslationString = ResolveTranslationString( translations_da,
617 (char *)file_mgr_rec );
618 trans_table1 = XtParseTranslationTable( resolvedTranslationString );
619 XtFree( resolvedTranslationString );
620 resolvedTranslationString = NULL;
623 /* Create the shell and main window used for the view. */
625 XtSetArg (args[0], XmNallowShellResize, True);
626 if(!first && (special_view == True && special_title != NULL && !TrashView))
628 file_mgr_rec->shell = shell =
629 XtAppCreateShell (special_title, DTFILE_CLASS_NAME,
630 applicationShellWidgetClass, display, args, 1);
631 XtFree(special_title);
632 special_title = NULL;
635 file_mgr_rec->shell = shell =
636 XtAppCreateShell (application_name, DTFILE_CLASS_NAME,
637 applicationShellWidgetClass, display, args, 1);
639 special_view = False;
642 XtSetArg (args[n], XmNdeleteResponse, XmUNMAP); n++;
644 if (first == False || TrashView)
646 XtSetArg (args[n], XmNgeometry, NULL); n++;
651 /* Set the useAsyncGeo on the shell */
652 XtSetArg (args[n], XmNuseAsyncGeometry, True); n++;
653 XtSetValues (shell, args, n);
655 delete_window = XmInternAtom (XtDisplay (shell), "WM_DELETE_WINDOW", False);
656 XmAddWMProtocolCallback (shell, delete_window, (XtCallbackProc)SystemClose,
657 (XtPointer)file_mgr_rec);
659 file_mgr_rec->main = main = XmCreateMainWindow (shell, "main", args, 1);
660 XtManageChild (main);
661 XtAddCallback(main, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
662 HELP_FILE_MANAGER_VIEW_STR);
665 /* Get the select color */
667 XtSetArg (args[0], XmNbackground, &background);
668 XtSetArg (args[1], XmNcolormap, &colormap);
669 XtGetValues (main, args, 2);
671 XmGetColors (XtScreen (main), colormap, background,
672 &foreground, &top_shadow, &bottom_shadow, &select);
674 /* Create the menu. */
679 file_mgr_rec->menuStates = NULL;
680 file_mgr_rec->menu = menu = CreateTrashMenu (main, file_mgr_rec);
684 file_mgr_rec->menuStates = (RENAME | MOVE | DUPLICATE | LINK | TRASH |
685 MODIFY | CHANGEDIR | PREFERENCES | FILTER |
686 FIND | CREATE_DIR | CREATE_FILE | SETTINGS |
688 HOME | CHANGE_DIR | TERMINAL);
690 file_mgr_rec->menu = menu = CreateMenu (main, file_mgr_rec);
693 /* Create the work area frame. */
695 XtSetArg (args[0], XmNshadowThickness, 1);
696 XtSetArg (args[1], XmNshadowType, XmSHADOW_OUT);
697 XtSetArg (args[2], XmNmarginWidth, 5);
698 XtSetArg (args[3], XmNmarginHeight, 5);
699 work_frame = XmCreateFrame (main, "work_frame", args, 4);
700 XtManageChild (work_frame);
703 /* Create the current directory frame. */
706 XtSetArg (args[n], XmNshadowThickness, 1); n++;
707 XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
708 XtSetArg (args[n], XmNmarginWidth, 1); n++;
709 XtSetArg (args[n], XmNmarginHeight, 1); n++;
710 XtSetArg (args[n], XmNtextTranslations, trans_table); n++;
711 file_mgr_rec->header_frame = header_frame =
712 XmCreateForm (main, "header_frame", args, n);
714 XtAddCallback(header_frame, XmNhelpCallback,
715 (XtCallbackProc)HelpRequestCB,
716 HELP_FILE_MANAGER_VIEW_STR);
718 /* Create the current directory line only if not in showFilesystem. */
719 if (showFilesystem && !TrashView)
721 /* Create the iconic path */
723 XtSetArg (args[n], DtNfileMgrRec, file_mgr_rec); n++;
724 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
725 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
726 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
727 file_mgr_rec->iconic_path_da = iconic_path_da =
728 _DtCreateIconicPath(header_frame, "iconic_path", args, n);
729 XtManageChild (iconic_path_da);
730 file_mgr_rec->iconic_path_width = 0;
732 /* Create the separator between iconic path and current directory */
734 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
735 XtSetArg (args[n], XmNtopWidget, iconic_path_da); n++;
736 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
737 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
738 file_mgr_rec->header_separator = header_separator =
739 XmCreateSeparatorGadget(header_frame, "header_separator", args, n);
740 XtManageChild (header_separator);
742 /* Create a form for the current directory */
744 XtSetArg (args[n], XmNtextTranslations, trans_table); n++;
745 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
746 XtSetArg (args[n], XmNtopWidget, header_separator); n++;
747 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
748 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
749 file_mgr_rec->current_directory_frame = current_directory_frame =
750 XmCreateForm (header_frame, "current_directory_frame", args, n);
751 XtManageChild (file_mgr_rec->current_directory_frame);
753 /* Event handler for detecting drag threshold surpassed */
754 XtAddEventHandler(current_directory_frame,
755 Button1MotionMask|Button2MotionMask,
756 False, (XtEventHandler)CurrentDirectoryIconMotion,
759 /* Create the change directory drop zone. */
762 if (change_view_pixmap == XmUNSPECIFIED_PIXMAP)
765 _DtGetPixmap(XtScreen(current_directory_frame),
766 CHANGE_VIEW_ICON_S, foreground, background);
769 XtSetArg (args[n], XmNstring, NULL); n++;
770 XtSetArg (args[n], XmNshadowThickness, 2); n++;
771 XtSetArg (args[n], XmNfillOnArm, False); n++;
772 XtSetArg (args[n], XmNhighlightThickness, 0); n++;
773 XtSetArg (args[n], XmNpixmap, change_view_pixmap); n++;
774 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
775 XtSetArg (args[n], XmNtopOffset, 2); n++;
776 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
777 XtSetArg (args[n], XmNleftOffset, 5); n++;
778 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
779 XtSetArg (args[n], XmNbottomOffset, 2); n++;
780 XtSetArg (args[n], XmNtraversalOn, False); n++;
781 XtSetArg (args[n], XmNdropSiteOperations,
782 XmDROP_MOVE | XmDROP_COPY | XmDROP_LINK); n++;
783 file_mgr_rec->current_directory_drop = current_directory_drop =
784 _DtCreateIcon (current_directory_frame, "drop_cd", args, n);
786 XtAddCallback (current_directory_drop, XmNdropCallback,
787 DropOnChangeView, (XtPointer) file_mgr_rec);
790 file_mgr_rec->current_directory_drop = current_directory_drop = NULL;
792 /* Create the current directory icon. */
794 XtSetArg (args[n], XmNstring, NULL); n++;
795 XtSetArg (args[n], XmNimageName, SMALL_DIRECTORY_ICON); n++;
796 XtSetArg (args[n], XmNshadowThickness, 0); n++;
797 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
800 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
801 XtSetArg (args[n], XmNleftWidget, current_directory_drop); n++;
802 XtSetArg (args[n], XmNleftOffset, 0); n++;
806 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
807 XtSetArg (args[n], XmNleftOffset, 5); n++;
809 XtSetArg (args[n], XmNtraversalOn, False); n++;
810 file_mgr_rec->current_directory_icon = current_directory_icon =
811 _DtCreateIcon (current_directory_frame, "current_directory_icon",
814 /* Create the current directory line */
816 XtSetArg (args[n], XmNshadowThickness, 0); n++;
817 XtSetArg (args[n], XmNmarginWidth, 0); n++;
818 XtSetArg (args[n], XmNmarginHeight, 0); n++;
819 XtSetArg (args[n], XmNpushButtonEnabled, False); n++;
820 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
821 XtSetArg (args[n], XmNtopOffset, 1); n++;
822 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
823 XtSetArg (args[n], XmNleftOffset, 5); n++;
824 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
825 XtSetArg (args[n], XmNrightOffset, 1); n++;
826 XtSetArg (args[n], XmNtraversalOn, True); n++;
827 file_mgr_rec->current_directory =
828 XmCreateDrawnButton(current_directory_frame, "current_directory",
830 XtManageChild (file_mgr_rec->current_directory);
833 /* Create overlay text field, for typing in a new directory */
835 XtSetArg (args[n], XmNmarginHeight, 0); n++;
836 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
837 XtSetArg (args[n], XmNtopOffset, 1); n++;
838 XtSetArg (args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET);n++;
839 XtSetArg (args[n], XmNleftWidget,
840 file_mgr_rec->current_directory); n++;
841 XtSetArg (args[n], XmNleftOffset, 0); n++;
842 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET);n++;
843 XtSetArg (args[n], XmNbottomWidget,
844 file_mgr_rec->current_directory); n++;
845 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
846 XtSetArg (args[n], XmNrightOffset, 1); n++;
847 XtSetArg (args[n], XmNtraversalOn, True); n++;
848 file_mgr_rec->current_directory_text = XmCreateTextField(
849 current_directory_frame, FAST_RENAME, args, n);
852 * Make sure the font & highlight thickness of the text field is the
853 * same as the corresponding values for the current directory line.
855 XtSetArg (args[0], XmNhighlightThickness, &highlight_thickness);
856 XtSetArg (args[1], XmNfontList, &font_list);
857 XtGetValues (file_mgr_rec->current_directory, args, 2);
859 XtSetArg (args[0], XmNhighlightThickness, highlight_thickness);
860 XtSetArg (args[1], XmNfontList, font_list);
861 XtSetValues (file_mgr_rec->current_directory_text, args, 2);
864 * Calculate how high to make the current directory line by adding
865 * up the font height and the highlight and shadow thickness
867 XtSetArg (args[0], XmNshadowThickness, &shadow_thickness);
868 XtGetValues (file_mgr_rec->current_directory_text, args, 1);
870 entry_font = XmFontListEntryGetFont(FontListDefaultEntry(font_list), &type);
871 if(type == XmFONT_IS_FONTSET) {
872 extents = XExtentsOfFontSet((XFontSet)entry_font);
873 font_height = extents->max_logical_extent.height;
876 font_height = ((XFontStruct *)entry_font)->ascent +
877 ((XFontStruct *)entry_font)->descent;
879 curdir_height = font_height + 2*(highlight_thickness + shadow_thickness);
881 XtSetArg (args[0], XmNtopOffset, &cur_dir_offset);
882 XtGetValues (file_mgr_rec->current_directory, args, 1);
884 XtSetArg (args[0], XmNheight, curdir_height);
885 XtSetValues (file_mgr_rec->current_directory, args, 1);
887 XtSetArg (args[0], XmNheight, curdir_height + 2*cur_dir_offset);
888 XtSetValues (file_mgr_rec->current_directory_frame, args, 1);
890 XtAddCallback(file_mgr_rec->current_directory_text, XmNactivateCallback,
891 (XtCallbackProc)ChangeToNewDir, file_mgr_rec);
892 XtAddCallback(file_mgr_rec->current_directory_text, XmNhelpCallback,
893 (XtCallbackProc)HelpRequestCB,
894 HELP_FILE_MANAGER_VIEW_STR);
896 /* This code is here so the Text Path (used to be Fast Change Dir
897 text) will be checked if user is ever try to type on the portion
898 before his restricted path.
899 It's no longer needed because, there won't be anything since
900 I'm tryting to treat restrictMode the same way I treat restricted
901 directory (i.e. dtfile -restricted).
902 Why I want to treat them the same way? Because they are the
903 same sort of things and it, also, solves the iconic path problem.
904 Note that user can double click on one of the icon and to a directory
905 above the restricted directory.
909 /* add the callbacks to make sure the user isn't able to
910 go anywhere above their restricted directory */
911 XtAddCallback (file_mgr_rec->current_directory_text,
912 XmNmodifyVerifyCallback, (XtCallbackProc)TextChange,
914 XtAddCallback (file_mgr_rec->current_directory_text,
915 XmNmotionVerifyCallback, (XtCallbackProc)TextChange,
921 /* create the status line */
923 XtSetArg (args[n], XmNshadowThickness, 1); n++;
924 XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
925 XtSetArg (args[n], XmNmarginWidth, 5); n++;
926 XtSetArg (args[n], XmNmarginHeight, 1); n++;
927 status_form = XmCreateForm (main, "status_form", args, n);
928 XtManageChild (status_form);
931 XtSetArg (args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
932 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
933 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
934 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
935 file_mgr_rec->status_line =
936 XmCreateLabelGadget (status_form, "status_line", args, n);
937 XtManageChild (file_mgr_rec->status_line);
939 /* Associate the menu and frames with the appropriate */
940 /* areas of the main windows. */
942 XmMainWindowSetAreas (main, menu, file_mgr_rec->header_frame,
943 NULL, NULL, work_frame);
944 XtSetArg (args[0], XmNmessageWindow, status_form);
945 XtSetValues(main, args, 1);
947 /* Create the Scrolled Window for the file display area and */
948 /* set the scrollbars colors correctly. */
951 XtSetArg (args[n], XmNspacing, 2); n++;
952 XtSetArg (args[n], XmNscrollingPolicy, XmAUTOMATIC); n++;
953 XtSetArg (args[n], XmNscrollBarDisplayPolicy, XmAS_NEEDED); n++;
954 file_mgr_rec->scroll_window =
955 XmCreateScrolledWindow (work_frame, "scroll_window", args, n);
956 XtManageChild (file_mgr_rec->scroll_window);
958 XtAddCallback(file_mgr_rec->scroll_window, XmNhelpCallback,
959 (XtCallbackProc)HelpRequestCB,
960 HELP_TRASH_OVERVIEW_TOPIC_STR);
962 XtAddCallback(file_mgr_rec->scroll_window, XmNhelpCallback,
963 (XtCallbackProc)HelpRequestCB,
964 HELP_FILE_MANAGER_VIEW_STR);
966 /* Get the 2 scrollbars and reset their foreground to the proper color */
967 /* Also turn their traversal off and set the highlight thickness to 0. */
969 XtSetArg (args[0], XmNhorizontalScrollBar, &(file_mgr_rec->horizontal_scroll_bar));
970 XtSetArg (args[1], XmNverticalScrollBar, &(file_mgr_rec->vertical_scroll_bar));
971 XtGetValues (file_mgr_rec->scroll_window, args, 2);
973 XtSetArg (args[0], XmNforeground, background);
974 XtSetArg (args[1], XmNtraversalOn, True);
975 XtSetValues (file_mgr_rec->horizontal_scroll_bar, args, 2);
976 XtSetValues (file_mgr_rec->vertical_scroll_bar, args, 2);
979 /* Add an event handler to catch resizes occuring on the scrolled */
980 /* window, in order to force a relayout of the icons. */
982 XtAddEventHandler (file_mgr_rec->scroll_window, StructureNotifyMask,
983 False, (XtEventHandler)FileWindowResizeCallback,
985 XtAddEventHandler (shell, StructureNotifyMask,
986 False, (XtEventHandler)FileWindowMapCallback,
990 /* Create a drawing area as a child of the scrolled window */
993 XtSetArg (args[n], XmNmarginWidth, 0); n++;
994 XtSetArg (args[n], XmNmarginHeight, 0); n++;
995 XtSetArg (args[n], XmNresizePolicy, XmRESIZE_GROW); n++;
996 file_mgr_rec->file_window =
997 XmCreateDrawingArea (file_mgr_rec->scroll_window, "file_window", args, n);
998 XtAppAddActions( XtWidgetToApplicationContext(file_mgr_rec->file_window),
1000 XtNumber(FMAction));
1001 XtManageChild (file_mgr_rec->file_window);
1003 XtManageChild (file_mgr_rec->header_frame);
1005 XtSetArg (args[0], XmNbackground, select);
1006 XtSetValues (file_mgr_rec->file_window, args, 1);
1008 XtSetArg (args[0], XmNbackground, select);
1009 XtSetValues (XtParent (file_mgr_rec->file_window), args, 1);
1011 if(fileMgrPopup.menu == NULL)
1012 CreateFmPopup(file_mgr_rec->file_window);
1014 XmAddToPostFromList(fileMgrPopup.menu, file_mgr_rec->file_window);
1016 /* set up translations in main edit widget */
1017 #ifdef DOUBLE_CLICK_DRAG
1018 XtUninstallTranslations(file_mgr_rec->file_window);
1019 XtOverrideTranslations(file_mgr_rec->file_window,
1021 ((XmManagerClassRec *)XtClass(file_mgr_rec->file_window))
1022 ->manager_class.translations);
1023 XtOverrideTranslations(file_mgr_rec->file_window, trans_table1);
1024 XtOverrideTranslations(file_mgr_rec->file_window,
1025 XtParseTranslationTable(_XmDrawingA_traversalTranslations));
1027 XtOverrideTranslations(file_mgr_rec->file_window, trans_table1);
1030 /* Add the callbacks for processing selections, exposures, */
1031 /* and geometry changes of the drawing area. */
1033 XtAddCallback (file_mgr_rec->file_window, XmNexposeCallback,
1034 FileWindowExposeCallback, file_mgr_rec);
1036 XtAddCallback (file_mgr_rec->file_window, XmNinputCallback,
1037 FileWindowInputCallback, file_mgr_rec);
1039 /* Event handler for detecting drag threshold surpassed */
1040 XtAddEventHandler(file_mgr_rec->file_window,
1041 Button1MotionMask|Button2MotionMask,
1042 False, (XtEventHandler)FileIconMotion,
1045 /* Arrange for initial focus to be inside the file window */
1046 file_mgr_rec->focus_widget = file_mgr_rec->file_window;
1048 /* Set the return values for the dialog widget and dialog instance. */
1050 *return_widget = (Widget) main;
1051 *dialog = (XtPointer) file_mgr_rec;
1055 /************************************************************************
1059 ************************************************************************/
1062 GetDefaultValues( void )
1064 FileMgrData * file_mgr_data;
1065 PreferencesData *preferences_data;
1066 unsigned char *viewP;
1069 /* Allocate and initialize the default change dir dialog data. */
1071 file_mgr_data = (FileMgrData *) XtMalloc (sizeof (FileMgrData));
1073 file_mgr_data->displayed = False;
1074 file_mgr_data->mapped = False;
1075 file_mgr_data->x = 0;
1076 file_mgr_data->y = 0;
1078 file_mgr_data->busy_status = not_busy;
1079 file_mgr_data->busy_detail = 0;
1081 file_mgr_data->num_objects = 0;
1082 file_mgr_data->object_positions = NULL;
1083 file_mgr_data->grid_height = 0;
1084 file_mgr_data->grid_width = 0;
1085 file_mgr_data->layout_data = NULL;
1087 file_mgr_data->special_msg = NULL;
1088 file_mgr_data->msg_timer_id = 0;
1090 file_mgr_data->show_type = SINGLE_DIRECTORY;
1091 file_mgr_data->tree_files = TREE_FILES_NEVER;
1092 file_mgr_data->view_single = BY_NAME_AND_ICON;
1093 file_mgr_data->view_tree = BY_NAME_AND_SMALL_ICON;
1094 file_mgr_data->tree_preread_level = 1;
1095 file_mgr_data->tree_show_level = 1;
1096 file_mgr_data->show_iconic_path = True;
1097 file_mgr_data->show_current_dir = True;
1098 file_mgr_data->show_status_line = True;
1100 file_mgr_data->scrollToThisFile = NULL;
1101 file_mgr_data->scrollToThisDirectory = NULL;
1103 file_mgr_data->renaming = NULL;
1105 if(special_view && !TrashView)
1107 if(special_title != NULL)
1109 file_mgr_data->title = XtNewString(special_title);
1112 file_mgr_data->title = NULL;
1114 if(special_helpVol != NULL)
1116 file_mgr_data->helpVol = XtNewString(special_helpVol);
1117 XtFree(special_helpVol);
1118 special_helpVol = NULL;
1121 file_mgr_data->helpVol = XtNewString(fileMgrHelpVol);
1123 if(special_restricted != NULL)
1124 file_mgr_data->restricted_directory = special_restricted;
1126 file_mgr_data->restricted_directory = NULL;
1128 if(special_treeType == UNSET_VALUE)
1129 file_mgr_data->show_type = SINGLE_DIRECTORY;
1131 file_mgr_data->show_type = special_treeType;
1133 if(special_treeFiles == UNSET_VALUE)
1134 file_mgr_data->tree_files = TREE_FILES_NEVER;
1136 file_mgr_data->tree_files = special_treeFiles;
1138 if(file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1139 viewP = &file_mgr_data->view_tree;
1141 viewP = &file_mgr_data->view_single;
1142 if(special_viewType == UNSET_VALUE)
1143 file_mgr_data->view = *viewP;
1145 file_mgr_data->view = *viewP = special_viewType;
1147 if(special_orderType == UNSET_VALUE)
1148 file_mgr_data->order = ORDER_BY_ALPHABETICAL;
1150 file_mgr_data->order = special_orderType;
1152 if(special_directionType == UNSET_VALUE)
1153 file_mgr_data->direction = DIRECTION_ASCENDING;
1155 file_mgr_data->direction = special_directionType;
1157 if(special_randomType == UNSET_VALUE)
1158 file_mgr_data->positionEnabled = RANDOM_OFF;
1160 file_mgr_data->positionEnabled = special_randomType;
1165 if(fileMgrTitle == NULL)
1166 file_mgr_data->title = NULL;
1168 file_mgr_data->title = XtNewString(fileMgrTitle);
1170 file_mgr_data->helpVol = XtNewString(fileMgrHelpVol);
1172 if(treeType == UNSET_VALUE || TrashView)
1173 file_mgr_data->show_type = SINGLE_DIRECTORY;
1175 file_mgr_data->show_type = treeType;
1177 if(treeFiles == UNSET_VALUE)
1178 file_mgr_data->tree_files = TREE_FILES_NEVER;
1180 file_mgr_data->tree_files = treeFiles;
1182 if(file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1183 viewP = &file_mgr_data->view_tree;
1185 viewP = &file_mgr_data->view_single;
1186 if(viewType == UNSET_VALUE)
1187 file_mgr_data->view = *viewP;
1189 file_mgr_data->view = *viewP = viewType;
1191 if(orderType == UNSET_VALUE)
1192 file_mgr_data->order = ORDER_BY_ALPHABETICAL;
1194 file_mgr_data->order = orderType;
1196 if(directionType == UNSET_VALUE)
1197 file_mgr_data->direction = DIRECTION_ASCENDING;
1199 file_mgr_data->direction = directionType;
1201 if(randomType == UNSET_VALUE)
1202 file_mgr_data->positionEnabled = RANDOM_OFF;
1204 file_mgr_data->positionEnabled = randomType;
1206 file_mgr_data->restricted_directory = NULL;
1209 file_mgr_data->restoreKind = NORMAL_RESTORE;
1211 file_mgr_data->host = NULL;
1212 file_mgr_data->current_directory = NULL;
1213 file_mgr_data->branch_list = NULL;
1215 file_mgr_data->toolbox = False;
1216 file_mgr_data->dropSite = False;
1218 file_mgr_data->newSize = True;
1220 file_mgr_data->directory_count = 0;
1221 file_mgr_data->directory_set = NULL;
1222 file_mgr_data->tree_root = NULL;
1224 file_mgr_data->selection_list =
1225 (FileViewData **) XtMalloc (sizeof (FileViewData *));
1226 file_mgr_data->selection_list[0] = NULL;
1228 file_mgr_data->selection_table = NULL;
1229 file_mgr_data->selected_file_count = 0;
1231 file_mgr_data->fast_cd_enabled = False;
1232 file_mgr_data->show_hid_enabled = False;
1234 file_mgr_data->cd_inited = False;
1235 file_mgr_data->cd_font = NULL;
1236 file_mgr_data->cd_fontset = NULL;
1237 file_mgr_data->cd_normal_gc = 0;
1238 file_mgr_data->cd_select_gc = 0;
1239 file_mgr_data->cd_select = NULL;
1241 file_mgr_data->tree_solid_thin_gc = 0;
1242 file_mgr_data->tree_solid_thick_gc = 0;
1243 file_mgr_data->tree_dash_thin_gc = 0;
1244 file_mgr_data->tree_dash_thick_gc = 0;
1246 file_mgr_data->file_mgr_rec = NULL;
1247 file_mgr_data->popup_menu_icon = NULL;
1248 file_mgr_data->drag_file_view_data = NULL;
1250 file_mgr_data->change_dir = _DtGetDefaultDialogData (change_dir_dialog);
1251 file_mgr_data->preferences = _DtGetDefaultDialogData (preferences_dialog);
1253 /* now set up the preferences the way they really are */
1254 preferences_data = (PreferencesData *)file_mgr_data->preferences->data;
1255 preferences_data->show_type = file_mgr_data->show_type;
1256 preferences_data->tree_files = file_mgr_data->tree_files;
1257 preferences_data->view_single = file_mgr_data->view_single;
1258 preferences_data->view_tree = file_mgr_data->view_tree;
1259 preferences_data->order = file_mgr_data->order;
1260 preferences_data->direction = file_mgr_data->direction;
1261 preferences_data->positionEnabled = file_mgr_data->positionEnabled;
1262 preferences_data->show_iconic_path = file_mgr_data->show_iconic_path;
1263 preferences_data->show_current_dir = file_mgr_data->show_current_dir;
1264 preferences_data->show_status_line = file_mgr_data->show_status_line;
1266 file_mgr_data->filter_edit = _DtGetDefaultDialogData (filter_dialog);
1267 file_mgr_data->filter_active = _DtGetDefaultDialogData (filter_dialog);
1268 file_mgr_data->find = _DtGetDefaultDialogData (find_dialog);
1269 file_mgr_data->attr_dialog_list = NULL;
1270 file_mgr_data->attr_dialog_count = 0;
1271 file_mgr_data->secondaryHelpDialogList = NULL;
1272 file_mgr_data->secondaryHelpDialogCount = 0;
1273 file_mgr_data->primaryHelpDialog = NULL;
1275 return ((XtPointer) file_mgr_data);
1279 /************************************************************************
1283 ************************************************************************/
1287 XrmDatabase data_base,
1290 static Boolean first = True;
1291 FileMgrData * file_mgr_data;
1292 PreferencesData *preferences_data;
1294 char * directory_name;
1295 char * new_name_list[20];
1296 int name_list_count;
1297 struct passwd * pwInfo;
1307 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1308 SHOW_TYPE, StringToShowType, NULL, 0);
1309 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1310 TREE_FILES, StringToTreeFiles, NULL, 0);
1311 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1312 VIEW, StringToView, NULL, 0);
1313 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1314 ORDER, StringToOrder, NULL, 0);
1315 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1316 DIRECTION_RESRC, StringToDirection, NULL, 0);
1317 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1318 RANDOM, StringToRandom, NULL, 0);
1319 XtAppSetTypeConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1320 BRANCH_LIST, (XtTypeConverter)StringToBranchList,
1321 NULL, 0, XtCacheNone, NULL);
1322 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1323 SELECTION_LIST, (XtConverter)StringToSelectionList,
1328 /* Allocate and get the resources for change dir dialog data. */
1330 file_mgr_data = (FileMgrData *) XtMalloc (sizeof (FileMgrData));
1332 file_mgr_data->busy_status = not_busy;
1333 file_mgr_data->busy_detail = 0;
1334 file_mgr_data->num_objects = 0;
1335 file_mgr_data->object_positions = NULL;
1336 file_mgr_data->grid_height = 0;
1337 file_mgr_data->grid_width = 0;
1338 file_mgr_data->layout_data = NULL;
1339 file_mgr_data->secondaryHelpDialogList = NULL;
1340 file_mgr_data->secondaryHelpDialogCount = 0;
1341 file_mgr_data->attr_dialog_count = 0;
1342 file_mgr_data->attr_dialog_list = NULL;
1343 file_mgr_data->primaryHelpDialog = NULL;
1344 file_mgr_data->popup_menu_icon = NULL;
1345 file_mgr_data->title = NULL;
1346 file_mgr_data->helpVol = NULL;
1347 file_mgr_data->restricted_directory = NULL;
1348 file_mgr_data->toolbox = False;
1349 file_mgr_data->dropSite = False;
1350 file_mgr_data->tree_preread_level = 1; /* @@@ make these resources? */
1351 file_mgr_data->tree_show_level = 1;
1352 file_mgr_data->tree_files = TREE_FILES_NEVER;
1353 file_mgr_data->special_msg = NULL;
1354 file_mgr_data->msg_timer_id = 0;
1355 file_mgr_data->show_iconic_path = True;
1356 file_mgr_data->show_current_dir = True;
1357 file_mgr_data->show_status_line = True;
1358 file_mgr_data->scrollToThisFile = NULL;
1359 file_mgr_data->scrollToThisDirectory = NULL;
1360 file_mgr_data->renaming = NULL;
1362 _DtDialogGetResources (data_base, name_list, FILEMGR, (char *)file_mgr_data,
1363 resources, fileMgrClass->resource_count);
1364 if (file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1365 file_mgr_data->view = file_mgr_data->view_tree;
1367 file_mgr_data->view = file_mgr_data->view_single;
1369 /* Bases on the type of restore session we are doing we must
1370 * adjust the host, current_directory, and selections to the
1371 * proper values (e.g. restore session or restore settings)
1373 if (restoreType != NORMAL_RESTORE)
1375 GetSessionDir(file_mgr_data);
1377 /* Adjust the selected files to null */
1378 file_mgr_data->selection_list = NULL;
1380 /* Set the Displayed to false so we do not use the x and y
1381 values when we place the window in showDialog
1383 file_mgr_data->displayed = False;
1385 if(special_view && !TrashView)
1387 if(special_title != NULL)
1388 file_mgr_data->title = XtNewString(special_title);
1390 file_mgr_data->title = XtNewString(file_mgr_data->title);
1392 if(special_helpVol != NULL)
1393 file_mgr_data->helpVol = XtNewString(special_helpVol);
1395 file_mgr_data->helpVol = XtNewString(file_mgr_data->helpVol);
1397 if(special_treeType != UNSET_VALUE)
1398 file_mgr_data->show_type = special_treeType;
1400 if(special_treeFiles != UNSET_VALUE)
1401 file_mgr_data->tree_files = special_treeFiles;
1403 if(special_viewType != UNSET_VALUE)
1405 file_mgr_data->view = special_viewType;
1406 if(file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1407 file_mgr_data->view_tree = special_viewType;
1409 file_mgr_data->view_single = special_viewType;
1412 if(special_orderType != UNSET_VALUE)
1413 file_mgr_data->order = special_orderType;
1415 if(special_directionType != UNSET_VALUE)
1416 file_mgr_data->direction = special_directionType;
1418 if(special_randomType != UNSET_VALUE)
1419 file_mgr_data->positionEnabled = special_randomType;
1423 file_mgr_data->title = XtNewString(file_mgr_data->title);
1424 file_mgr_data->helpVol = XtNewString(file_mgr_data->helpVol);
1429 GetSessionDir(file_mgr_data);
1431 file_mgr_data->title = XtNewString(file_mgr_data->title);
1432 file_mgr_data->helpVol = XtNewString(file_mgr_data->helpVol);
1435 /* The GetSessionDir() function depends on the hostname being set. */
1436 /* So, we'll do it earlier */
1437 if(file_mgr_data->host != NULL)
1438 file_mgr_data->host = XtNewString(file_mgr_data->host);
1440 file_mgr_data->host = XtNewString(home_host_name);
1442 file_mgr_data->restoreKind = NORMAL_RESTORE;
1444 file_mgr_data->directory_count = 0;
1445 file_mgr_data->directory_set = NULL;
1446 file_mgr_data->tree_root = NULL;
1448 file_mgr_data->selected_file_count = 0;
1449 file_mgr_data->selection_table = (char **) file_mgr_data->selection_list;
1450 file_mgr_data->selection_list =
1451 (FileViewData **) XtMalloc (sizeof (FileViewData *));
1452 file_mgr_data->selection_list[0] = NULL;
1454 file_mgr_data->cd_inited = False;
1455 file_mgr_data->cd_font = NULL;
1456 file_mgr_data->cd_fontset = NULL;
1457 file_mgr_data->cd_normal_gc = 0;
1458 file_mgr_data->cd_select_gc = 0;
1459 file_mgr_data->cd_select = NULL;
1461 file_mgr_data->popup_menu_icon = NULL;
1462 file_mgr_data->drag_file_view_data = NULL;
1464 file_mgr_data->tree_solid_thin_gc = 0;
1465 file_mgr_data->tree_solid_thick_gc = 0;
1466 file_mgr_data->tree_dash_thin_gc = 0;
1467 file_mgr_data->tree_dash_thick_gc = 0;
1469 host_name = XtNewString (file_mgr_data->host);
1470 directory_name = XtNewString (file_mgr_data->current_directory);
1472 FileMgrBuildDirectories (file_mgr_data, host_name, directory_name);
1474 XtFree ((char *) host_name);
1476 XtFree ((char *) directory_name);
1478 if (restoreType == NORMAL_RESTORE &&
1479 file_mgr_data->positionEnabled == RANDOM_ON)
1481 /* Restore the optional positional data */
1482 RestorePositionalData(data_base, name_list, file_mgr_data, FILEMGR);
1486 /* Get a copy of the name list to be used to build new name lists. */
1488 _DtDuplicateDialogNameList(name_list, new_name_list, 20, &name_list_count);
1490 /* Load sub-dialogs */
1492 /* Get secondary help dialogs */
1493 if(restoreType == NORMAL_RESTORE &&
1494 file_mgr_data->secondaryHelpDialogCount > 0)
1496 _DtLoadSubdialogArray(new_name_list, name_list_count,
1497 &(file_mgr_data->secondaryHelpDialogList),
1498 file_mgr_data->secondaryHelpDialogCount,
1499 help_dialog, data_base, 1);
1503 file_mgr_data->secondaryHelpDialogList = NULL;
1504 file_mgr_data->secondaryHelpDialogCount = 0;
1507 /* Get primary help dialog */
1508 new_name_list[name_list_count] = number;
1509 new_name_list[name_list_count + 1] = NULL;
1510 sprintf(number, "%d", 0);
1511 if (restoreType == NORMAL_RESTORE)
1513 file_mgr_data->primaryHelpDialog =
1514 _DtGetResourceDialogData(help_dialog, data_base, new_name_list);
1515 if(((DialogInstanceData *)
1516 (file_mgr_data->primaryHelpDialog->data))->displayed == False)
1518 _DtFreeDialogData( file_mgr_data->primaryHelpDialog );
1519 file_mgr_data->primaryHelpDialog = NULL;
1523 file_mgr_data->primaryHelpDialog = NULL;
1525 if (restoreType == NORMAL_RESTORE &&
1526 file_mgr_data->attr_dialog_count > 0)
1528 /* Get properties dialogs */
1529 _DtLoadSubdialogArray(new_name_list, name_list_count,
1530 &(file_mgr_data->attr_dialog_list),
1531 file_mgr_data->attr_dialog_count,
1532 mod_attr_dialog, data_base, 1);
1536 file_mgr_data->attr_dialog_list = NULL;
1537 file_mgr_data->attr_dialog_count = 0;
1539 new_name_list[name_list_count] = NULL;
1541 file_mgr_data->change_dir =
1542 _DtGetResourceDialogData (change_dir_dialog, data_base, name_list);
1544 file_mgr_data->preferences =
1545 _DtGetResourceDialogData (preferences_dialog, data_base, name_list);
1547 /* Set all dialogs displayed flag for change_dir, and preferences
1548 * to false if not NORMAL_RESTORE
1550 if (restoreType != NORMAL_RESTORE)
1552 ((DialogInstanceData *)
1553 (file_mgr_data->change_dir->data))->displayed = False;
1555 ((DialogInstanceData *)
1556 (file_mgr_data->preferences->data))->displayed = False;
1559 /* now set up the preferences the way they really are */
1560 preferences_data = (PreferencesData *)file_mgr_data->preferences->data;
1561 preferences_data->show_type = file_mgr_data->show_type;
1562 preferences_data->tree_files = file_mgr_data->tree_files;
1563 preferences_data->view_single = file_mgr_data->view_single;
1564 preferences_data->view_tree = file_mgr_data->view_tree;
1565 preferences_data->order = file_mgr_data->order;
1566 preferences_data->direction = file_mgr_data->direction;
1567 preferences_data->positionEnabled = file_mgr_data->positionEnabled;
1568 preferences_data->show_iconic_path = file_mgr_data->show_iconic_path;
1569 preferences_data->show_current_dir = file_mgr_data->show_current_dir;
1570 preferences_data->show_status_line = file_mgr_data->show_status_line;
1572 /* Build the name list for the file dialog that is displayed, */
1573 /* get resource data and perform and other initialization. */
1575 tmpStr = GetSharedMessage(FILTER_EDIT_ID_STRING);
1576 new_name_list[name_list_count] = XtNewString (tmpStr);
1577 new_name_list[name_list_count + 1] = NULL;
1579 file_mgr_data->filter_edit =
1580 _DtGetResourceDialogData (filter_dialog, data_base, new_name_list);
1582 XtFree ((char *) new_name_list[name_list_count]);
1583 new_name_list[name_list_count] = NULL;
1586 /* Build the name list for the filter dialog that is used for the */
1587 /* current processing values. Get the resource data and perform */
1588 /* and other initialization. */
1590 tmpStr = GetSharedMessage(FILTER_ACTIVE_ID_STRING);
1591 new_name_list[name_list_count] = XtNewString (tmpStr);
1592 new_name_list[name_list_count + 1] = NULL;
1594 file_mgr_data->filter_active =
1595 _DtGetResourceDialogData (filter_dialog, data_base, new_name_list);
1597 XtFree ((char *) new_name_list[name_list_count]);
1598 new_name_list[name_list_count] = NULL;
1600 /* Get the resource data for the find dialog and perform */
1601 /* additional initialization. */
1603 file_mgr_data->find =
1604 _DtGetResourceDialogData (find_dialog, data_base, name_list);
1607 /* Set the FilterDialog and Find dialog displayed flag to false if
1608 * not NORMAL_RESTORE
1611 if (restoreType != NORMAL_RESTORE)
1613 ((DialogInstanceData *)
1614 (file_mgr_data->filter_edit->data))->displayed = False;
1616 ((DialogInstanceData *)
1617 (file_mgr_data->find->data))->displayed = False;
1621 return ((XtPointer) file_mgr_data);
1624 /************************************************************************
1628 ************************************************************************/
1632 FileMgrRec *file_mgr_rec,
1633 FileMgrData *file_mgr_data )
1635 Widget cd = file_mgr_rec->current_directory;
1636 Widget cdi = file_mgr_rec->current_directory_icon;
1637 Widget cdd = file_mgr_rec->current_directory_drop;
1639 XmFontList font_list;
1640 XtPointer entry_font;
1644 XGCValues gc_values;
1646 ChangeDirData * change_dir_data;
1647 ModAttrRec *modAttr_rec;
1648 DialogData *attr_dialog;
1649 ModAttrData *attr_data;
1655 DirectorySet ** directory_set;
1656 FileViewData ** order_list;
1657 int directory_count;
1661 char *tmpStr, *tempStr;
1663 PixmapData *pixmapData;
1665 file_mgr_data->file_mgr_rec = (XtPointer) file_mgr_rec;
1667 /* this is what we did for the ultrix port to get the name of the
1668 Application dir right, BUT it has some bugs */
1669 if(file_mgr_data->title != NULL)
1671 XtSetArg (args[0], XmNtitle, file_mgr_data->title);
1672 XtSetValues(file_mgr_rec->shell, args, 1);
1675 /* Set up the callbacks for the current directory line only if
1676 not in showFilesystem. */
1678 if(showFilesystem && !TrashView)
1680 XtRemoveAllCallbacks (cd, XmNarmCallback);
1681 XtAddCallback (cd, XmNarmCallback, CurrentDirSelected, file_mgr_rec);
1683 XtRemoveAllCallbacks (cd, XmNexposeCallback);
1684 XtAddCallback (cd, XmNexposeCallback, CurrentDirExposed, file_mgr_rec);
1686 XtRemoveAllCallbacks (cdi, XmNcallback);
1687 XtAddCallback (cdi, XmNcallback, CurrentDirIconCallback, file_mgr_rec);
1691 XtRemoveAllCallbacks (cdd, XmNcallback);
1692 XtAddCallback (cdd, XmNcallback, CurrentDirDropCallback, file_mgr_rec);
1695 DtUpdateIconicPath(file_mgr_rec, file_mgr_data, False);
1699 * To help our menu callbacks get the file_mgr_rec when they are
1700 * activated, we will register the file_mgr_rec pointer as the
1701 * user_data for the menubar. That way, since the callbacks can
1702 * find out which menubar they were invoked from, they can easily
1703 * map this into the file_mgr_rec.
1705 XtSetArg(args[0], XmNuserData, file_mgr_rec);
1706 XtSetValues(file_mgr_rec->menu, args, 1);
1707 if(fileMgrPopup.menu != NULL)
1708 XtSetValues(fileMgrPopup.menu, args, 1);
1712 * Adjust some widgets, in case this is a recycled dialog, which
1713 * previously had been used as a desktop view, or vice-versa.
1716 XtManageChild(file_mgr_rec->header_frame);
1717 XtManageChild(file_mgr_rec->directoryBarBtn);
1720 if(showFilesystem && !TrashView)
1723 XtSetArg (args[0], XmNallowShellResize, False);
1724 XtSetValues(file_mgr_rec->shell, args, 1);
1727 widg = file_mgr_rec->directoryBarBtn;
1730 XtSetArg (args[0], XmNforeground, &foreground);
1731 XtSetArg (args[1], XmNbackground, &background);
1732 XtSetArg (args[2], XmNfontList, &font_list);
1733 XtGetValues (widg, args, 3);
1735 /* If the current_directory data has not been initialized */
1736 /* for this data record, do it now. */
1738 if (file_mgr_data->cd_inited == False)
1740 file_mgr_data->cd_inited = True;
1742 entry_font = XmFontListEntryGetFont(FontListDefaultEntry(font_list), &type);
1743 if(type == XmFONT_IS_FONTSET) {
1744 file_mgr_data->cd_fontset = (XFontSet)entry_font;
1745 file_mgr_data->cd_fonttype = XmFONT_IS_FONTSET;
1746 gc_mask = GCForeground | GCBackground;
1749 file_mgr_data->cd_font = (XFontStruct *)entry_font;
1750 file_mgr_data->cd_fonttype = XmFONT_IS_FONT;
1751 gc_values.font = ((XFontStruct *)entry_font)->fid;
1752 gc_mask = GCForeground | GCBackground | GCFont;
1755 gc_values.foreground = foreground;
1756 gc_values.background = background;
1757 file_mgr_data->cd_normal_gc = XtGetGC (widg, gc_mask, &gc_values);
1759 gc_values.foreground = background;
1760 gc_values.background = foreground;
1761 file_mgr_data->cd_select_gc = XtGetGC (widg, gc_mask, &gc_values);
1763 /* graphics contexts for drawing tree lines */
1764 gc_values.foreground = foreground;
1765 XtSetArg (args[0], XmNbackground, &gc_values.background);
1766 XtGetValues (file_mgr_rec->file_window, args, 1);
1767 gc_values.line_width = 2;
1768 gc_values.line_style = LineOnOffDash;
1769 gc_values.cap_style = CapNotLast;
1770 gc_values.dashes = TREE_DASH_WIDTH;
1772 gc_mask |= GCCapStyle;
1774 file_mgr_data->tree_solid_thin_gc =
1775 XtGetGC (widg, gc_mask, &gc_values);
1776 file_mgr_data->tree_solid_thick_gc =
1777 XtGetGC (widg, gc_mask | GCLineWidth, &gc_values);
1778 file_mgr_data->tree_dash_thin_gc =
1779 XtGetGC (widg, gc_mask | GCLineStyle | GCDashList, &gc_values);
1780 file_mgr_data->tree_dash_thick_gc =
1781 XtGetGC (widg, gc_mask | GCLineWidth |
1782 GCLineStyle | GCDashList, &gc_values);
1786 if(showFilesystem && !TrashView)
1788 /* Set the current directory icon to normal colors */
1789 SetToNormalColors (file_mgr_rec->current_directory_icon,
1790 file_mgr_rec->file_window, file_mgr_rec->main, NULL);
1793 /* Update the Change Directory host name */
1794 change_dir_data = (ChangeDirData *) file_mgr_data->change_dir->data;
1795 if (change_dir_data->host_name != NULL)
1796 XtFree ((char *) change_dir_data->host_name);
1797 change_dir_data->host_name = XtNewString (file_mgr_data->host);
1799 /* Display the correct small directory icon */
1800 pixmapData = GetPixmapData(file_mgr_rec,
1802 file_mgr_data->current_directory,
1805 XtSetArg (args[0], XmNimageName, pixmapData->iconFileName);
1807 XtSetArg (args[0], XmNimageName, NULL);
1808 XtSetValues(cdi, args, 1);
1810 _DtCheckAndFreePixmapData(
1811 GetDirectoryLogicalType(file_mgr_data,
1812 file_mgr_data->current_directory),
1813 file_mgr_rec->shell,
1817 if(file_mgr_data->restricted_directory == NULL)
1818 textString = XtNewString(file_mgr_data->current_directory);
1823 ptr = file_mgr_data->current_directory +
1824 strlen(file_mgr_data->restricted_directory);
1825 if(strcmp(ptr, "") == 0)
1826 textString = XtNewString( "/" );
1828 textString = XtNewString( ptr );
1830 XmTextFieldSetString(file_mgr_rec->current_directory_text, textString);
1832 /* Clear the change dir text field */
1833 if (file_mgr_data->fast_cd_enabled)
1834 XtManageChild(file_mgr_rec->current_directory_text);
1836 XtUnmanageChild(file_mgr_rec->current_directory_text);
1837 XtSetArg (args[0], XmNallowShellResize, True);
1838 XtSetValues(file_mgr_rec->shell, args, 1);
1843 /* Get the file set displayed */
1844 FileMgrRedisplayFiles (file_mgr_rec, file_mgr_data, True);
1847 /* Set the icon name for this view to the directory name. */
1848 SetIconAttributes ((FileMgrRec *)file_mgr_data->file_mgr_rec, file_mgr_data,
1849 file_mgr_data->current_directory);
1852 /* Process the selection table into a selection list */
1854 if (file_mgr_data->selection_table != NULL)
1856 DeselectAllFiles (file_mgr_data);
1858 directory_set = file_mgr_data->directory_set;
1860 if (file_mgr_data->show_type == SINGLE_DIRECTORY)
1861 directory_count = 1;
1863 directory_count = file_mgr_data->directory_count;
1866 while (file_mgr_data->selection_table[i] != NULL)
1868 for (j = 0; j < directory_count; j++)
1870 if (strncmp (directory_set[j]->name,
1871 file_mgr_data->selection_table[i],
1872 strlen (directory_set[j]->name)) == 0)
1874 file_name = strrchr(file_mgr_data->selection_table[i], '/') +1;
1875 order_list = directory_set[j]->order_list;
1877 for (k = 0; k < directory_set[j]->file_count; k++)
1879 if (strcmp (file_name,
1880 order_list[k]->file_data->file_name) == 0)
1882 if (order_list[k]->filtered == False)
1883 SelectFile (file_mgr_data, order_list[k]);
1893 file_mgr_data->selection_table = NULL;
1896 /* Initially, all menubuttons are sensitive */
1898 file_mgr_rec->menuStates = (RENAME | MOVE | DUPLICATE | LINK | TRASH |
1899 MODIFY | CHANGEDIR | PREFERENCES | FILTER |
1900 FIND | CREATE_DIR | CREATE_FILE | SETTINGS |
1901 CLEAN_UP | MOVE_UP |
1902 HOME | CHANGE_DIR | TERMINAL);
1904 if(file_mgr_data != trashFileMgrData
1905 && file_mgr_data != NULL )
1907 if (file_mgr_data->selected_file_count == 0)
1908 ActivateNoSelect (file_mgr_rec);
1909 else if (file_mgr_data->selected_file_count == 1)
1910 ActivateSingleSelect (file_mgr_rec,
1911 file_mgr_data->selection_list[0]->file_data->logical_type);
1913 ActivateMultipleSelect (file_mgr_rec);
1916 SensitizeTrashBtns();
1918 /* Display any dialogs that need to be displayed */
1919 if (((DialogInstanceData *)
1920 (file_mgr_data->change_dir->data))->displayed == True)
1922 ShowChangeDirDialog ((Widget)NULL, (XtPointer)file_mgr_rec,
1926 file_mgr_rec->menuStates |= CHANGEDIR;
1929 if (((DialogInstanceData *)
1930 (file_mgr_data->preferences->data))->displayed == True)
1932 ShowPreferencesDialog ((Widget)NULL, (XtPointer)file_mgr_rec,
1936 file_mgr_rec->menuStates |= PREFERENCES;
1938 if (((DialogInstanceData *)
1939 (file_mgr_data->find->data))->displayed == True)
1941 ShowFindDialog ((Widget)NULL, (XtPointer)file_mgr_rec, (XtPointer)NULL);
1944 file_mgr_rec->menuStates |= FIND;
1947 if (((DialogInstanceData *)
1948 (file_mgr_data->filter_edit->data))->displayed == True)
1950 ShowFilterDialog ((Widget)NULL, (XtPointer)file_mgr_rec, (XtPointer)NULL);
1953 file_mgr_rec->menuStates |= FILTER;
1955 /* Display any properties dialogs */
1956 for (i = 0; i < file_mgr_data->attr_dialog_count; i++)
1958 if (((DialogInstanceData *)
1959 (file_mgr_data->attr_dialog_list[i]->data))->displayed == False)
1965 attr_dialog = (DialogData *)file_mgr_data->attr_dialog_list[i];
1966 attr_data = (ModAttrData *) attr_dialog->data;
1968 loadOk = LoadFileAttributes(attr_data->host, attr_data->directory,
1969 attr_data->name, attr_data);
1974 /* We need the file_mgr_rec inside the create routine so
1975 * we attach it here for use later.
1977 ((ModAttrData *) (file_mgr_data->attr_dialog_list[i]->data))->
1978 main_widget = file_mgr_rec->main;
1980 _DtShowDialog (file_mgr_rec->shell, NULL, (XtPointer)file_mgr_rec,
1981 file_mgr_data->attr_dialog_list[i],
1982 ModAttrChange, (XtPointer)file_mgr_rec, ModAttrClose,
1983 (XtPointer)file_mgr_rec, NULL, False, False, NULL, NULL);
1985 modAttr_rec = (ModAttrRec *)_DtGetDialogInstance(
1986 file_mgr_data->attr_dialog_list[i]);
1988 if(file_mgr_data->title != NULL &&
1989 strcmp(file_mgr_data->helpVol, DTFILE_HELP_NAME) != 0)
1991 tmpStr = GETMESSAGE(21, 1, "File Permissions");
1992 tempStr = (char *)XtMalloc(strlen(tmpStr) +
1993 strlen(file_mgr_data->title) + 5);
1994 sprintf(tempStr, "%s - %s", file_mgr_data->title, tmpStr);
1998 tmpStr = (GETMESSAGE(21,34, "File Manager - Permissions"));
1999 tempStr = XtNewString(tmpStr);
2001 XtSetArg (args[0], XmNtitle, tempStr);
2002 XtSetValues (modAttr_rec->shell, args, 1);
2007 /* The object would have got deleted and hence we are not able to
2010 ModAttrFreeValues(attr_data);
2011 XtFree((char *)attr_dialog);
2012 file_mgr_data->attr_dialog_count--;
2013 if(file_mgr_data->attr_dialog_count >0)
2014 file_mgr_data->attr_dialog_list = (DialogData **) XtRealloc(
2015 (char *) file_mgr_data->attr_dialog_list,
2016 sizeof(DialogData *) * file_mgr_data->attr_dialog_count);
2019 XtFree((char *)file_mgr_data->attr_dialog_list);
2020 file_mgr_data->attr_dialog_list = NULL;
2025 /* Display any secondary help dialogs */
2026 for (i = 0; i < file_mgr_data->secondaryHelpDialogCount; i++)
2028 ShowHelpDialog(file_mgr_rec->shell, (XtPointer)file_mgr_rec,
2030 file_mgr_data->secondaryHelpDialogList[i], NULL, NULL,
2034 /* Display the primary help dialog, if active */
2035 if (file_mgr_data->primaryHelpDialog && ((DialogInstanceData *)
2036 (file_mgr_data->primaryHelpDialog->data))->displayed == True)
2038 ShowHelpDialog(file_mgr_rec->shell, (XtPointer)file_mgr_rec,
2040 file_mgr_data->primaryHelpDialog, NULL, NULL, NULL,
2049 /************************************************************************
2051 * WriteResourceValues
2053 ************************************************************************/
2056 WriteResourceValues(
2061 FileMgrData * file_mgr_data = (FileMgrData *) values->data;
2062 FileMgrRec * file_mgr_rec;
2063 char * new_name_list[20];
2064 int name_list_count;
2070 /* If the dialog is currently displayed, update the geometry */
2071 /* fields to their current values. */
2073 if (file_mgr_data->displayed == True)
2075 _DtGenericUpdateWindowPosition(values);
2076 file_mgr_rec = (FileMgrRec *) _DtGetDialogInstance (values);
2080 /* save FILEMGR resources */
2081 /* store netfile version of current directory name */
2083 if ( file_mgr_data->current_directory && file_mgr_data->toolbox )
2086 char *user_session_str = NULL;
2089 current_host = file_mgr_data->host;
2090 user_session_str = getenv("DTUSERSESSION");
2091 ptr = strstr(file_mgr_data->current_directory, user_session_str);
2095 file_mgr_data->host = XtNewString(file_mgr_data->current_directory);
2096 *ptr = user_session_str[0];
2100 file_mgr_data->host = XtNewString(file_mgr_data->current_directory);
2103 _DtDialogPutResources (fd, name_list, FILEMGR, values->data,
2104 resources, fileMgrClass->resource_count);
2106 XtFree(file_mgr_data->host);
2107 file_mgr_data->host = current_host;
2111 _DtDialogPutResources (fd, name_list, FILEMGR, values->data,
2112 resources, fileMgrClass->resource_count);
2116 /* Save the optional positional data if needed, if file_mgr_data->host
2117 is set to NULL, this is from a save settings, don't save the position
2120 SavePositionalData(fd, file_mgr_data, name_list, FILEMGR);
2123 /* Get a copy of the name list to be used to build new name lists */
2124 _DtDuplicateDialogNameList(name_list, new_name_list, 20, &name_list_count);
2126 /* Write out all of the dialogs */
2128 _DtWriteDialogData (file_mgr_data->change_dir, fd, name_list);
2129 _DtWriteDialogData (file_mgr_data->preferences, fd, name_list);
2132 /* Save any properties dialogs */
2133 _DtSaveSubdialogArray(new_name_list, name_list_count,
2134 file_mgr_data->attr_dialog_list,
2135 file_mgr_data->attr_dialog_count, fd, 1);
2137 /* Save any secondary help dialogs */
2138 _DtSaveSubdialogArray(new_name_list, name_list_count,
2139 file_mgr_data->secondaryHelpDialogList,
2140 file_mgr_data->secondaryHelpDialogCount, fd, 1);
2142 /* Save the primary help dialog, if active */
2143 if (file_mgr_data->primaryHelpDialog)
2145 new_name_list[name_list_count] = number;
2146 new_name_list[name_list_count + 1] = NULL;
2147 sprintf(number, "%d", 0);
2148 _DtWriteDialogData(file_mgr_data->primaryHelpDialog, fd, new_name_list);
2151 tmpStr = GetSharedMessage(FILTER_EDIT_ID_STRING);
2152 new_name_list[name_list_count] = XtNewString (tmpStr);
2153 new_name_list[name_list_count + 1] = NULL;
2154 _DtWriteDialogData (file_mgr_data->filter_edit, fd, new_name_list);
2155 XtFree ((char *) new_name_list[name_list_count]);
2156 new_name_list[name_list_count] = NULL;
2158 tmpStr = GetSharedMessage(FILTER_ACTIVE_ID_STRING);
2159 new_name_list[name_list_count] = XtNewString (tmpStr);
2160 new_name_list[name_list_count + 1] = NULL;
2161 _DtWriteDialogData (file_mgr_data->filter_active, fd, new_name_list);
2162 XtFree ((char *) new_name_list[name_list_count]);
2163 new_name_list[name_list_count] = NULL;
2165 _DtWriteDialogData (file_mgr_data->find, fd, name_list);
2171 /************************************************************************
2174 * Free up space allocated by the FileMgr dialog. This
2175 * includes sub directory information, and attached dialog data.
2177 * Note: this routine frees the FileMgrData, not the FileMgrRec
2178 * (the FileMgrRec data structure will be reused by the dialog
2179 * caching code for the next dtfile window the user might open)
2181 ************************************************************************/
2185 FileMgrData *file_mgr_data )
2189 FileMgrRec *file_mgr_rec;
2191 if (file_mgr_data == NULL)
2194 file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
2196 FreeDirectoryData (file_mgr_data);
2198 if (file_mgr_data->branch_list != NULL)
2200 for (i = 0; file_mgr_data->branch_list[i]; i++)
2201 XtFree (file_mgr_data->branch_list[i]);
2202 XtFree ((char *) file_mgr_data->branch_list);
2203 file_mgr_data->branch_list = NULL;
2206 if (file_mgr_data->selection_list != NULL)
2208 XtFree ((char *) file_mgr_data->selection_list);
2209 file_mgr_data->selection_list = NULL;
2212 if (file_mgr_data->cd_select != NULL)
2214 XtFree ((char *) file_mgr_data->cd_select);
2215 file_mgr_data->cd_select = NULL;
2218 if (file_mgr_data->desktop_file != NULL)
2220 XtFree ((char *) file_mgr_data->desktop_file);
2221 file_mgr_data->desktop_file = NULL;
2225 XtFree(file_mgr_data->special_msg);
2226 file_mgr_data->special_msg = NULL;
2227 if (file_mgr_data->msg_timer_id)
2228 XtRemoveTimeOut(file_mgr_data->msg_timer_id);
2230 _DtDestroySubdialog(file_mgr_data->change_dir);
2231 _DtDestroySubdialog(file_mgr_data->preferences);
2232 _DtDestroySubdialog(file_mgr_data->filter_edit);
2233 _DtDestroySubdialog(file_mgr_data->filter_active);
2234 _DtDestroySubdialog(file_mgr_data->find);
2235 _DtDestroySubdialogArray(file_mgr_data->attr_dialog_list,
2236 file_mgr_data->attr_dialog_count);
2237 _DtDestroySubdialogArray(file_mgr_data->secondaryHelpDialogList,
2238 file_mgr_data->secondaryHelpDialogCount);
2239 _DtDestroySubdialog(file_mgr_data->primaryHelpDialog);
2242 && file_mgr_data != trashFileMgrData
2243 && file_mgr_data != NULL )
2245 /* Free up the GC's we got in SetValues */
2246 if(file_mgr_data->cd_normal_gc != NULL)
2247 XtReleaseGC(file_mgr_rec->current_directory,
2248 file_mgr_data->cd_normal_gc);
2249 if(file_mgr_data->cd_select_gc != NULL)
2250 XtReleaseGC(file_mgr_rec->current_directory_icon,
2251 file_mgr_data->cd_select_gc);
2253 if(file_mgr_data->tree_solid_thin_gc != NULL)
2254 XtReleaseGC(file_mgr_rec->current_directory_icon,
2255 file_mgr_data->tree_solid_thin_gc);
2256 if(file_mgr_data->tree_solid_thick_gc != NULL)
2257 XtReleaseGC(file_mgr_rec->current_directory_icon,
2258 file_mgr_data->tree_solid_thick_gc);
2259 if(file_mgr_data->tree_dash_thin_gc != NULL)
2260 XtReleaseGC(file_mgr_rec->current_directory_icon,
2261 file_mgr_data->tree_dash_thin_gc);
2262 if(file_mgr_data->tree_dash_thick_gc != NULL)
2263 XtReleaseGC(file_mgr_rec->current_directory_icon,
2264 file_mgr_data->tree_dash_thick_gc);
2267 FreeLayoutData(file_mgr_data->layout_data);
2269 { /* This block is added for rectifying memory leakages */
2270 XtFree(file_mgr_data->scrollToThisFile);
2271 XtFree(file_mgr_data->scrollToThisDirectory);
2274 XtFree ((char *) file_mgr_data);
2278 /************************************************************************
2281 * Destroy widgets and free up space allocated by the FileMgr dialog.
2282 * Called when the dialog is destroyed.
2284 ************************************************************************/
2288 XtPointer recordPtr )
2290 FileMgrRec *file_mgr_rec = (FileMgrRec *) recordPtr;
2292 XtDestroyWidget(file_mgr_rec->shell);
2294 XtFree(file_mgr_rec->action_pane_file_type);
2295 XtFree((char *)file_mgr_rec);
2304 Cardinal *num_params )
2306 XmDrawingAreaCallbackStruct cb ;
2307 FileMgrRec * fileMgrRec;
2309 Widget input_on_gadget ;
2311 if ((event->type == KeyPress)
2312 ||(event->type == KeyRelease))
2320 cb.reason = XmCR_INPUT;
2323 if( *(params[0]) != '@' )
2325 char * title = XtNewString( GETMESSAGE(12, 7, "File Manager") );
2326 char * tmp = "Gjmf Nbobhfs ufbn:\n\nTboez Bnjo\nEbo Ebp\nSbhiv Lspwwjej\nUfe Sbotpn\nMjoeb Sjfl\nGsbol Tdinvdl\nNvsbmj Tpnbspvuiv\n";
2328 int i, len = strlen( tmp );
2330 message = (char *)XtCalloc( 1, len + 1 );
2332 /* Not fancy, but serve the purpose */
2333 for( i = 0; i < len; ++i ){
2334 (( isalpha( tmp[i] ) ) ? (message[i] = (int)(tmp[i]) - 1) : (message[i] = tmp[i]));
2338 sscanf( params[0], "%lx", &fileMgrRec );
2340 sscanf( params[0], "%p", &fileMgrRec );
2342 _DtMessage(toplevel, title, message, NULL, HelpRequestCB);
2350 /************************************************************************
2351 ************************************************************************
2353 * Resource converters
2355 ************************************************************************
2356 ************************************************************************/
2359 /************************************************************************
2363 ************************************************************************/
2367 FileMgrData *file_mgr_data )
2369 if (restoreType == HOME_RESTORE) /* home settings restore */
2371 struct passwd * pwInfo;
2374 /* Set current_directory to the home dir */
2375 if ((homeDir = (char *)getenv("HOME")) == NULL)
2377 pwInfo = getpwuid (getuid());
2378 homeDir = pwInfo->pw_dir;
2381 file_mgr_data->current_directory = XtNewString(homeDir);
2383 file_mgr_data->current_directory =
2384 XtNewString(file_mgr_data->current_directory);
2386 if (file_mgr_data->restricted_directory)
2387 file_mgr_data->restricted_directory =
2388 XtNewString(file_mgr_data->restricted_directory);
2390 file_mgr_data->restricted_directory = NULL;
2392 else if (restoreType == TOOL_RESTORE) /* tool settings restore */
2394 file_mgr_data->current_directory =
2395 XtNewString(file_mgr_data->restricted_directory);
2397 if (file_mgr_data->restricted_directory)
2398 file_mgr_data->restricted_directory =
2399 XtNewString(file_mgr_data->restricted_directory);
2401 file_mgr_data->restricted_directory = NULL;
2403 else /* session restore */
2405 if ((file_mgr_data->current_directory) &&
2406 (file_mgr_data->toolbox) &&
2407 (file_mgr_data->host) &&
2408 (strcmp(file_mgr_data->host, file_mgr_data->current_directory) != 0))
2411 char *user_session_str;
2415 root_toolbox = (file_mgr_data->host);
2417 user_session_str = getenv("DTUSERSESSION");
2418 /* the restricted directory for any object is a parent of that *
2419 * object; the restricted directory for toolboxes is the root *
2420 * toolbox; the current toolbox dir is identified by the path *
2421 * information past the restricted dir/root toolbox */
2422 toolbox_dir = file_mgr_data->current_directory;
2423 toolbox_dir += strlen(file_mgr_data->restricted_directory);
2425 current_dir = XtMalloc(strlen(root_toolbox) +
2426 strlen(user_session_str) +
2427 strlen(toolbox_dir) + 1);
2428 sprintf(current_dir, "%s%s%s", root_toolbox,
2431 file_mgr_data->current_directory = current_dir;
2433 file_mgr_data->restricted_directory = XtMalloc(strlen(root_toolbox) +
2434 strlen(user_session_str) +
2436 sprintf(file_mgr_data->restricted_directory, "%s%s", root_toolbox,
2441 file_mgr_data->current_directory =
2442 XtNewString(file_mgr_data->current_directory);
2444 if (file_mgr_data->restricted_directory)
2445 file_mgr_data->restricted_directory =
2446 XtNewString(file_mgr_data->restricted_directory);
2448 file_mgr_data->restricted_directory = NULL;
2451 file_mgr_data->host = NULL;
2455 /************************************************************************
2458 * Given a file name get the right icon name for it.
2460 ************************************************************************/
2464 FileMgrRec *file_mgr_rec,
2465 FileMgrData *file_mgr_data,
2473 PixmapData * pixmapData;
2474 Tt_status tt_status;
2476 /* Display the correct small directory icon */
2477 ftype = GetDirectoryLogicalType(file_mgr_data, path);
2481 full_name = ResolveLocalPathName(file_mgr_data->host,
2486 if( TT_OK != tt_status )
2489 short_name = strrchr(full_name, '/');
2490 if (strcmp(short_name, "/.") == 0)
2492 if (short_name == full_name)
2495 short_name = strrchr(full_name, '/');
2497 if (strcmp(full_name, "/") == 0)
2498 short_name = full_name;
2500 *short_name++ = '\0';
2503 pixmapData = _DtRetrievePixmapData(ftype,
2506 file_mgr_rec->shell,
2509 pixmapData = _DtRetrievePixmapData(ftype,
2512 file_mgr_rec->shell,
2520 /************************************************************************
2522 * BranchListToString
2523 * Write out the array of strings to the file fd.
2525 ************************************************************************/
2534 Boolean first = True;
2539 (void) write (fd, out_buf, strlen (out_buf));
2542 branch_name = (*value)[i];
2544 while (branch_name != NULL)
2547 (void) write (fd, ", ", strlen (", "));
2551 (void) write (fd, branch_name, strlen (branch_name));
2554 branch_name = (*value)[i];
2557 (void) write (fd, "\n", strlen ("\n"));
2563 /************************************************************************
2565 * SelectionListToString
2566 * Write out the array of strings to the file fd.
2568 ************************************************************************/
2571 SelectionListToString(
2573 FileViewData ***value,
2577 Boolean first = True;
2578 FileViewData * file_view_data;
2579 DirectorySet * directory_set;
2583 (void) write (fd, out_buf, strlen (out_buf));
2586 file_view_data = (*value)[i];
2589 while (file_view_data != NULL)
2591 directory_set = (DirectorySet *) file_view_data->directory_set;
2594 (void) write (fd, ", ", strlen (", "));
2599 (void) write (fd, directory_set->name, strlen (directory_set->name));
2601 if (strcmp (directory_set->name, "/") != 0)
2602 (void) write (fd, "/", strlen ("/"));
2604 (void) write (fd, file_view_data->file_data->file_name,
2605 strlen (file_view_data->file_data->file_name));
2608 file_view_data = (*value)[i];
2611 (void) write (fd, "\n", strlen ("\n"));
2618 /************************************************************************
2620 * StringToBranchList
2621 * Convert a string to a string array.
2623 ************************************************************************/
2632 XtPointer *converter_data)
2634 static char ** table_ptr;
2637 char ** table = NULL;
2642 to_val->size = sizeof (char **);
2643 to_val->addr = (XtPointer) &table_ptr;
2645 if (from_val->addr == NULL)
2649 /* Loop through the string extracting branch names */
2650 /* and placing them into an array of strings. */
2652 current = start = (char *) from_val->addr;
2654 while (start != NULL)
2656 current = DtStrchr (start, ',');
2657 if (current != NULL)
2664 table = (char **) XtRealloc ((char *)table,
2665 sizeof (char *) * (table_size + 1));
2666 table[table_size] = NULL;
2668 table[table_size - 1] = XtNewString (start);
2674 to_val->addr = (XtPointer ) &table_ptr;
2675 to_val->size = sizeof(XtPointer);
2680 /************************************************************************
2682 * StringToSelectionList
2683 * Convert a string to a string array.
2685 ************************************************************************/
2688 StringToSelectionList(
2694 static char ** table_ptr;
2697 char ** table = NULL;
2702 to_val->size = sizeof (char **);
2703 to_val->addr = (XtPointer) &table_ptr;
2705 if (from_val->addr == NULL)
2709 /* Loop through the string extracting file specifications */
2710 /* and placing them into an array of strings. */
2712 current = start = (char *) from_val->addr;
2714 while (start != NULL)
2716 current = DtStrchr (start, ',');
2717 if (current != NULL)
2724 table = (char **) XtRealloc ((char *)table,
2725 sizeof (char *) * (table_size + 1));
2726 table[table_size] = NULL;
2728 table[table_size - 1] = XtNewString (start);
2734 to_val->addr = (XtPointer ) &table_ptr;
2735 to_val->size = sizeof(XtPointer);
2741 /************************************************************************
2742 ************************************************************************
2744 File Mgr file and directory processing functions.
2746 ************************************************************************
2747 ************************************************************************/
2750 /************************************************************************
2753 * Update the iconic path and current directory line.
2755 ************************************************************************/
2759 * Update the status line label widget to show the right text.
2763 FileMgrRec *file_mgr_rec,
2764 FileMgrData *file_mgr_data)
2766 char buf[21+MAX_PATH];
2767 XmString label_string;
2770 if (file_mgr_data->special_msg &&
2771 (file_mgr_data->busy_status == initiating_readdir ||
2772 file_mgr_data->busy_status == busy_readdir))
2774 SetSpecialMsg( file_mgr_rec, file_mgr_data, NULL );
2777 if (file_mgr_data->special_msg)
2779 label_string = XmStringCreateLocalized(file_mgr_data->special_msg);
2783 GetStatusMsg(file_mgr_data, buf);
2784 label_string = XmStringCreateLocalized(buf);
2786 XtSetArg (args[0], XmNlabelString, label_string);
2787 XtSetValues(file_mgr_rec->status_line, args, 1);
2788 XmStringFree (label_string);
2794 * Timeout routine that resets the status line after a
2795 * special message was shown (see also SetSpecialMsg).
2799 FileMgrData *file_mgr_data,
2802 FileMgrRec *file_mgr_rec;
2804 if (*id != file_mgr_data->msg_timer_id)
2807 file_mgr_data->msg_timer_id = 0;
2809 if (file_mgr_data->special_msg)
2811 XtFree(file_mgr_data->special_msg);
2812 file_mgr_data->special_msg = NULL;
2813 if (file_mgr_data->show_status_line)
2815 file_mgr_rec = (FileMgrRec *)file_mgr_data->file_mgr_rec;
2816 UpdateStatusLine(file_mgr_rec, file_mgr_data);
2824 * Arrange for a special message to be shown in the status line.
2825 * After 4 seconds the status line will revert back to the usual
2826 * "x Files, y Hidden" message.
2830 FileMgrRec *file_mgr_rec,
2831 FileMgrData *file_mgr_data,
2834 if (file_mgr_data->special_msg)
2836 XtFree(file_mgr_data->special_msg);
2837 file_mgr_data->special_msg = NULL;
2839 if (file_mgr_data->msg_timer_id)
2840 XtRemoveTimeOut(file_mgr_data->msg_timer_id);
2844 file_mgr_data->special_msg = XtNewString(msg);
2845 file_mgr_data->msg_timer_id =
2846 XtAppAddTimeOut (XtWidgetToApplicationContext (file_mgr_rec->shell),
2847 4000, (XtTimerCallbackProc) MsgTimerEvent,
2848 (XtPointer) file_mgr_data);
2852 file_mgr_data->special_msg = NULL;
2853 file_mgr_data->msg_timer_id = 0;
2860 * Update the iconic path, current directory, and status lines.
2864 FileMgrRec *file_mgr_rec,
2865 FileMgrData *file_mgr_data,
2866 Boolean icons_changed)
2870 Widget cur_dir_manage[4];
2871 int cur_dir_nmanage;
2874 PixmapData *pixmapData;
2877 * No headers on the trash can.
2879 if (!showFilesystem)
2881 if(file_mgr_data->show_status_line)
2882 UpdateStatusLine(file_mgr_rec, file_mgr_data);
2885 else if(file_mgr_data == trashFileMgrData
2888 UpdateStatusLine(file_mgr_rec, file_mgr_data);
2893 * Make sure the iconic path & current directory widgets are
2894 * correctly managed & attached.
2896 if ((file_mgr_data->show_iconic_path == 0) !=
2897 (XtIsManaged(file_mgr_rec->iconic_path_da) == 0) ||
2898 (file_mgr_data->show_current_dir == 0) !=
2899 (XtIsManaged(file_mgr_rec->current_directory_frame) == 0))
2901 icons_changed = True;
2904 "UpdateHeaders: iconic_path %d, current_dir %d, status_line %d\n",
2905 file_mgr_data->show_iconic_path,
2906 file_mgr_data->show_current_dir,
2907 file_mgr_data->show_status_line));
2909 if (!file_mgr_data->show_iconic_path && !file_mgr_data->show_current_dir)
2910 XtUnmanageChild(file_mgr_rec->header_frame);
2913 ((XmManagerWidget)file_mgr_rec->header_frame)->composite.children,
2914 ((XmManagerWidget)file_mgr_rec->header_frame)->composite.num_children);
2916 ((XmManagerWidget)file_mgr_rec->current_directory_frame)->
2918 ((XmManagerWidget)file_mgr_rec->current_directory_frame)->
2919 composite.num_children);
2922 /* attach the iconic path */
2923 if (file_mgr_data->show_iconic_path)
2926 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
2927 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2928 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
2929 if (file_mgr_data->show_current_dir)
2931 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_NONE); n++;
2935 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
2937 XtSetValues(file_mgr_rec->iconic_path_da, args, n);
2938 manage[nmanage++] = file_mgr_rec->iconic_path_da;
2941 /* attach the separator */
2942 if (file_mgr_data->show_iconic_path && file_mgr_data->show_current_dir)
2945 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
2946 XtSetArg (args[n], XmNtopWidget,
2947 file_mgr_rec->iconic_path_da); n++;
2948 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2949 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
2950 XtSetValues(file_mgr_rec->header_separator, args, n);
2951 manage[nmanage++] = file_mgr_rec->header_separator;
2954 /* attach the current directory line */
2955 if (file_mgr_data->show_current_dir)
2958 if (file_mgr_data->show_iconic_path)
2960 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
2961 XtSetArg (args[n], XmNtopWidget,
2962 file_mgr_rec->header_separator); n++;
2966 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
2968 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2969 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
2971 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
2973 XtSetValues(file_mgr_rec->current_directory_frame, args, n);
2974 manage[nmanage++] = file_mgr_rec->current_directory_frame;
2977 * If the iconic path is shown, show only the current directory on
2978 * the current directory line;
2979 * if the iconic path is not shown, also show the drop target and
2980 * the icon representing the current directory.
2982 cur_dir_nmanage = 1;
2983 cur_dir_manage[0] = file_mgr_rec->current_directory;
2985 if (file_mgr_data->show_iconic_path)
2988 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2989 XtSetArg (args[n], XmNleftOffset, 5); n++;
2990 XtSetValues(file_mgr_rec->current_directory, args, n);
2997 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2998 XtSetArg (args[n], XmNleftOffset, 5); n++;
2999 XtSetValues(file_mgr_rec->current_directory_drop, args, n);
3000 cur_dir_manage[cur_dir_nmanage++] =
3001 file_mgr_rec->current_directory_drop;
3004 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
3005 XtSetArg (args[n], XmNleftWidget,
3006 file_mgr_rec->current_directory_drop); n++;
3007 XtSetArg (args[n], XmNleftOffset, 0); n++;
3012 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
3013 XtSetArg (args[n], XmNleftOffset, 10); n++;
3015 XtSetValues(file_mgr_rec->current_directory_icon, args, n);
3016 cur_dir_manage[cur_dir_nmanage++] =
3017 file_mgr_rec->current_directory_icon;
3020 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
3021 XtSetArg (args[n], XmNleftWidget,
3022 file_mgr_rec->current_directory_icon);n++;
3023 XtSetArg (args[n], XmNleftOffset, 0); n++;
3024 XtSetValues(file_mgr_rec->current_directory, args, n);
3029 if (file_mgr_data->show_iconic_path || file_mgr_data->show_current_dir)
3031 if (file_mgr_data->show_current_dir)
3032 XtManageChildren(cur_dir_manage, cur_dir_nmanage);
3033 XtManageChildren(manage, nmanage);
3034 if (!XtIsManaged(file_mgr_rec->header_frame))
3035 XtManageChild(file_mgr_rec->header_frame);
3038 XtSetArg (args[0], XmNallowShellResize, True);
3039 XtSetValues(file_mgr_rec->shell, args, 1);
3043 * Make sure the status line is correctly managed.
3045 if (file_mgr_data->show_status_line &&
3046 !XtIsManaged(XtParent(file_mgr_rec->status_line)))
3048 XtManageChild(XtParent(file_mgr_rec->status_line));
3050 else if (!file_mgr_data->show_status_line &&
3051 XtIsManaged(XtParent(file_mgr_rec->status_line)))
3053 XtUnmanageChild(XtParent(file_mgr_rec->status_line));
3056 if (file_mgr_data->show_iconic_path)
3057 DtUpdateIconicPath(file_mgr_rec, file_mgr_data, icons_changed);
3059 if (file_mgr_data->show_current_dir)
3063 /* Display the correct small directory icon */
3064 pixmapData = GetPixmapData(file_mgr_rec,
3066 file_mgr_data->current_directory,
3068 XtSetArg (args[0], XmNallowShellResize, False);
3069 XtSetValues(file_mgr_rec->shell, args, 1);
3072 XtSetArg (args[0], XmNimageName, pixmapData->iconFileName);
3074 XtSetArg (args[0], XmNimageName, NULL);
3075 XtSetValues(file_mgr_rec->current_directory_icon, args, 1);
3076 _DtCheckAndFreePixmapData(
3077 GetDirectoryLogicalType(file_mgr_data,
3078 file_mgr_data->current_directory),
3079 file_mgr_rec->shell,
3080 (DtIconGadget) file_mgr_rec->current_directory_icon,
3083 XtSetArg (args[0], XmNallowShellResize, True);
3084 XtSetValues(file_mgr_rec->shell, args, 1);
3086 if(XtIsRealized(file_mgr_rec->main))
3087 DrawCurrentDirectory (file_mgr_rec->current_directory,
3088 file_mgr_rec, file_mgr_data);
3091 if (file_mgr_data->show_status_line)
3092 UpdateStatusLine(file_mgr_rec, file_mgr_data);
3096 /************************************************************************
3098 * FileMgrRedisplayFiles
3099 * Reprocess and redisplay the files of a view.
3101 ************************************************************************/
3104 FileMgrRedisplayFiles(
3105 FileMgrRec *file_mgr_rec,
3106 FileMgrData *file_mgr_data,
3107 Boolean new_directory)
3109 _DtTurnOnHourGlass (file_mgr_rec->shell);
3110 GetFileData (file_mgr_data, True, file_mgr_data->branch_list);
3111 XmDropSiteStartUpdate(file_mgr_rec->file_window);
3112 UpdateFileIcons(file_mgr_rec, file_mgr_data, new_directory);
3113 UpdateHeaders (file_mgr_rec, file_mgr_data, False);
3114 LayoutFileIcons(file_mgr_rec, file_mgr_data, False, False);
3115 XmDropSiteEndUpdate(file_mgr_rec->file_window);
3116 _DtTurnOffHourGlass (file_mgr_rec->shell);
3122 /************************************************************************
3125 * Update the view to the new directory.
3127 ************************************************************************/
3131 FileMgrData *file_mgr_data,
3133 char *directory_name )
3135 FileMgrRec * file_mgr_rec;
3137 char tmp_directory_name[MAX_PATH];
3143 tmp_type = DtDtsDataToDataType(directory_name, NULL, 0, NULL, NULL,
3145 if (( (strcmp(tmp_type, LT_AGROUP) == 0) ||
3146 (strstr(tmp_type, LT_AGROUP_SUBDIR)) )
3148 ( !(file_mgr_data->toolbox) ))
3150 DtActionArg *action_args;
3153 action_args = (DtActionArg *) XtCalloc(1, sizeof(DtActionArg));
3156 action_args[0].argClass = DtACTION_FILE;
3157 action_args[0].u.file.name = directory_name;
3160 pwd_dir = XtNewString(file_mgr_data->current_directory);
3161 DtActionInvoke(((FileMgrRec *) file_mgr_data->file_mgr_rec)->shell,
3162 "OpenAppGroup", action_args, 1,
3163 NULL, NULL, pwd_dir, True, NULL, NULL);
3164 DtDtsFreeDataType(tmp_type);
3168 else if (strcmp(tmp_type, LT_TRASH) == 0)
3170 DtActionArg *action_args;
3173 pwd_dir = XtNewString(file_mgr_data->current_directory);
3174 DtActionInvoke(((FileMgrRec *) file_mgr_data->file_mgr_rec)->shell,
3176 NULL, NULL, pwd_dir, True, NULL, NULL);
3177 DtDtsFreeDataType(tmp_type);
3181 DtDtsFreeDataType(tmp_type);
3183 if (openDirType == NEW)
3185 DialogData *dialog_data;
3186 FileMgrData *fileMgrData;
3188 fileMgrData = CheckOpenDir(directory_name, host_name);
3189 if(fileMgrData != NULL)
3191 dialog_data = _DtGetInstanceData(fileMgrData->file_mgr_rec);
3192 CloseView(dialog_data);
3194 ForceMyIconClosed(file_mgr_data->host, file_mgr_data->current_directory);
3197 file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
3199 /* Set the icon name for this view to the directory name. */
3201 SetIconAttributes ((FileMgrRec *)file_mgr_data->file_mgr_rec, file_mgr_data,
3204 _DtTurnOnHourGlass (file_mgr_rec->shell);
3206 DeselectAllFiles (file_mgr_data);
3207 ActivateNoSelect (file_mgr_rec);
3209 /* When leaving a directory, save any positional information */
3210 if(file_mgr_data->object_positions)
3212 SavePositionInfo(file_mgr_data);
3213 FreePositionInfo(file_mgr_data);
3216 /* save the current branch list */
3217 branch_list = file_mgr_data->branch_list;
3218 file_mgr_data->branch_list = NULL;
3220 FileMgrBuildDirectories (file_mgr_data, host_name, directory_name);
3222 GetFileData (file_mgr_data, True, branch_list);
3224 if (branch_list != NULL)
3226 for (i = 0; branch_list[i]; i++)
3227 XtFree (branch_list[i]);
3228 XtFree ((char *) branch_list);
3231 UpdateCachedDirectories (view_set, view_count);
3233 /* Inherit, or load positional data for this directory */
3234 XmDropSiteStartUpdate(file_mgr_rec->file_window);
3235 LoadPositionInfo(file_mgr_data);
3236 UpdateFileIcons(file_mgr_rec, file_mgr_data, True);
3238 if (showFilesystem && file_mgr_data != trashFileMgrData)
3239 UpdateHeaders (file_mgr_rec, file_mgr_data, True);
3240 else if(file_mgr_data == trashFileMgrData
3241 && file_mgr_data != NULL )
3242 UpdateStatusLine(file_mgr_rec, file_mgr_data);
3244 /* change the title */
3245 title = _DtBuildFMTitle(file_mgr_data);
3246 XtSetArg (args[0], XmNtitle, title);
3247 XtSetValues (file_mgr_rec->shell, args, 1);
3250 if (file_mgr_data->show_type == SINGLE_DIRECTORY)
3251 LayoutFileIcons(file_mgr_rec, file_mgr_data, True, True);
3253 LayoutFileIcons(file_mgr_rec, file_mgr_data, False, True);
3255 if (openDirType == NEW)
3256 ForceMyIconOpen (file_mgr_data->host, NULL);
3257 XmDropSiteEndUpdate(file_mgr_rec->file_window);
3263 /************************************************************************
3266 * This function causes a rescan of the directory for the view
3267 * and a full redisplay of the file icons.
3269 ************************************************************************/
3273 FileMgrRec *file_mgr_rec )
3275 DialogData * dialog_data;
3276 FileMgrData * file_mgr_data;
3277 DirectorySet ** directory_set;
3281 dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec);
3282 file_mgr_data = (FileMgrData *) dialog_data->data;
3284 _DtTurnOnHourGlass (file_mgr_rec->shell);
3286 directory_set = file_mgr_data->directory_set;
3288 for (i = 0; i < file_mgr_data->directory_count; i++)
3289 RereadDirectory (file_mgr_rec->shell, file_mgr_data->host,
3290 directory_set[i]->name);
3292 GetFileData (file_mgr_data, False, file_mgr_data->branch_list);
3293 XmDropSiteStartUpdate(file_mgr_rec->file_window);
3294 UpdateFileIcons(file_mgr_rec, file_mgr_data, False);
3295 UpdateHeaders (file_mgr_rec, file_mgr_data, False);
3296 LayoutFileIcons(file_mgr_rec, file_mgr_data, False, True);
3297 XmDropSiteEndUpdate(file_mgr_rec->file_window);
3298 /* _DtTurnOffHourGlass (file_mgr_rec->shell); */
3303 /************************************************************************
3305 * FileMgrBuildDirectories
3306 * Given a directory name, setup the directory set structure
3307 * contained in the file mgr data stucture.
3309 ************************************************************************/
3312 FileMgrBuildDirectories(
3313 FileMgrData *file_mgr_data,
3315 char *directory_name )
3317 char current_directory[MAX_PATH];
3318 DirectorySet ** directory_set;
3320 /* Inform Main that the directory is being changed and */
3321 /* free up the data contained in the current directory set. */
3323 if (file_mgr_data->current_directory != NULL)
3325 DirectoryChanged ((XtPointer)file_mgr_data, file_mgr_data->host, host_name,
3326 file_mgr_data->current_directory, directory_name);
3327 FreeDirectoryData (file_mgr_data);
3330 file_mgr_data->current_directory = (char *) XtNewString(directory_name);
3331 (void) strcpy (current_directory, file_mgr_data->current_directory);
3333 /* This code will solve the path problem if user has
3334 Dtfile*restrictMode resource set to True and
3335 also invoke dtfile with -restricted option
3338 && file_mgr_data->toolbox == False
3339 && file_mgr_data->restricted_directory
3340 && strncmp( file_mgr_data->restricted_directory, directory_name,
3341 strlen( file_mgr_data->restricted_directory ) ) != 0
3344 XtFree( file_mgr_data->restricted_directory );
3345 file_mgr_data->restricted_directory = XtNewString( directory_name );
3348 if (file_mgr_data->host != NULL)
3349 XtFree ((char *) file_mgr_data->host);
3351 file_mgr_data->host = (char *) XtNewString (host_name);
3354 /* Allocate the data for one initial directory set */
3356 file_mgr_data->directory_set = directory_set =
3357 ((DirectorySet **) XtMalloc (2 * sizeof(DirectorySet *))) + 1;
3358 file_mgr_data->directory_count = 1;
3360 directory_set[-1] = NULL;
3362 directory_set[0] = (DirectorySet *) XtMalloc (sizeof (DirectorySet));
3363 directory_set[0]->name = (char *) XtNewString (current_directory);
3364 directory_set[0]->sub_root = NULL;
3365 directory_set[0]->file_count = 0;
3366 directory_set[0]->file_view_data = NULL;
3367 directory_set[0]->order_list = NULL;
3368 directory_set[0]->filtered_file_count = 0;
3369 directory_set[0]->invisible_file_count = 0;
3370 directory_set[0]->file_mgr_data = (XtPointer) file_mgr_data;
3376 FileMgrData * file_mgr_data,
3381 static Region r = NULL;
3382 unsigned char flags;
3383 XRectangle pRect, lRect;
3385 if ((file_mgr_data->show_type != SINGLE_DIRECTORY) ||
3386 (file_mgr_data->view == BY_ATTRIBUTES))
3390 && x < (Position)(w->core.x + w->core.width)
3391 && y < (Position)(w->core.y + w->core.height)
3400 r = XCreateRegion();
3402 XSubtractRegion(r, r, r);
3404 _DtIconGetIconRects((DtIconGadget)w, &flags, &pRect, &lRect);
3406 if (flags & XmPIXMAP_RECT)
3407 XUnionRectWithRegion(&pRect, r, r);
3409 if (flags & XmLABEL_RECT)
3410 XUnionRectWithRegion(&lRect, r, r);
3412 if (XPointInRegion(r, x, y))
3421 * Check to see if the drop occurred within one of the primary hotspots.
3422 * If this is the desktop, then we need to check the hotspots according
3423 * to their stacking order; all other views have their hotspots checked
3424 * according to the order the files were loaded, since overlapping hotspots
3429 DropOnPrimaryHotspot (
3430 FileMgrData * file_mgr_data,
3433 DirectorySet ** directory_data)
3435 int directory_count;
3437 FileViewData * file_view_data;
3438 DirectorySet * dir_data;
3441 if (PositioningEnabledInView(file_mgr_data))
3443 top = GetTopOfStack(file_mgr_data);
3447 file_view_data = top->file_view_data;
3449 if(file_view_data == NULL)
3455 if (file_view_data->displayed &&
3456 DropOnGadget(file_mgr_data, file_view_data->widget, drop_x, drop_y))
3458 *directory_data = file_mgr_data->directory_set[0];
3459 return(file_view_data);
3467 if (file_mgr_data->show_type == MULTIPLE_DIRECTORY) {
3469 directory_count = file_mgr_data->directory_count;
3473 directory_count = 1;
3476 for (; i < directory_count; i++)
3478 dir_data = file_mgr_data->directory_set[i];
3480 for (j = 0; j < dir_data->file_count; j++)
3482 file_view_data = dir_data->file_view_data[j];
3484 if (!file_view_data->displayed)
3487 if (DropOnGadget(file_mgr_data, file_view_data->widget, drop_x,
3490 *directory_data = dir_data;
3491 return(file_view_data);
3497 *directory_data = NULL;
3503 /************************************************************************
3505 * ProcessDropOnFileWindow
3507 ************************************************************************/
3509 ProcessDropOnFileWindow (
3511 DtDndDropCallbackStruct *dropInfo,
3512 FileMgrData *file_mgr_data)
3514 char *command = NULL;
3517 /******************/
3518 /* transfer phase */
3519 /******************/
3520 if(dropInfo->reason != DtCR_DND_DROP_ANIMATE)
3524 XmDragContext drag_context;
3526 /* Initiating view not valid when another client initiates drag */
3528 initiating_view = NULL;
3530 /* reject the drop if the Protocol is buffer and it was
3531 dropped on the Trash Can
3533 if (dropInfo->dropData->protocol == DtDND_BUFFER_TRANSFER)
3535 if (file_mgr_data == trashFileMgrData
3536 && file_mgr_data != NULL )
3538 dropInfo->status = DtDND_FAILURE;
3539 DPRINTF (("ProcessDropOnFileWindow: Rejecting buffer drop on Trash Can\n"));
3545 /* if placement is 'As Placed', set blend model to BLEND_NONE */
3546 /* @@@...Need to check if this will work correctly for BUFFERS */
3547 if (PositioningEnabledInView(file_mgr_data))
3549 drag_context = (XmDragContext)dropInfo->dragContext;
3553 XtSetArg(args[0], XmNblendModel, XmBLEND_NONE);
3554 XtSetValues((Widget)drag_context, args, 1);
3557 /* if placement is 'Grid' */
3560 /* if initiating view is current view, set status
3563 if (initiating_view)
3565 if ((((FileMgrData *)initiating_view)->current_directory ==
3566 file_mgr_data->current_directory) &&
3567 (dropInfo->dropData->protocol == DtDND_FILENAME_TRANSFER))
3569 /* we actually want to allow a copy or a link to the same directory
3570 * but not a move. If it's a copy or link, we want the initiating
3571 * view to be NULL so that later we don't error out when it checks
3572 * to see if they are from the same view. We will fail out if the
3573 * operation is a MOVE (causing the zoom back).
3575 fileType = GetDirectoryLogicalType(file_mgr_data,
3576 file_mgr_data->current_directory);
3578 command = TypeToAction(dropInfo->operation, fileType);
3581 if (strcmp(command, "FILESYSTEM_MOVE") == 0)
3582 dropInfo->status = DtDND_FAILURE;
3584 initiating_view = NULL;
3590 /* set the complete move flag to False since the animate
3591 callback handles the deletion of the original file on the move
3594 DPRINTF(("DropOnFileWindow: Transfer Callback - Setting Complete move flag to False\n"));
3596 if(dropInfo->dropData->protocol == DtDND_BUFFER_TRANSFER)
3597 dropInfo->completeMove = True;
3599 /* set the complete move flag to False since we will be handling */
3600 /* the deletion of the original file */
3602 dropInfo->completeMove = False;
3605 /*****************************/
3606 /* animate phase, run action */
3607 /*****************************/
3610 char *command = NULL;
3613 DPRINTF(("DropOnFileWindow - Animate Callback."));
3615 fileType = GetDirectoryLogicalType(file_mgr_data,
3616 file_mgr_data->current_directory);
3618 command = TypeToAction(dropInfo->operation, fileType);
3622 DirectorySet *directory_set;
3625 /* retrieve the fileViewData for the current directory */
3626 directory_set = file_mgr_data->directory_set[0];
3627 for( i = 0; i < directory_set->file_count; ++i )
3629 if( strcmp(directory_set->order_list[i]->file_data->file_name, "." )
3632 RunCommand( command,
3634 directory_set->order_list[i],
3641 DtDtsFreeAttributeValue( command );
3647 /************************************************************************
3651 ************************************************************************/
3656 XtPointer client_data,
3657 XtPointer call_data)
3659 FileMgrData * file_mgr_data = (FileMgrData *)client_data;
3660 DtDndDropCallbackStruct *dropInfo = (DtDndDropCallbackStruct *)call_data;
3662 switch (dropInfo->dropData->protocol)
3664 case DtDND_FILENAME_TRANSFER:
3666 DPRINTF(("DropOnFileWindow: Number of Files dropped are %d\n",
3667 dropInfo->dropData->numItems));
3668 ProcessDropOnFileWindow (w, dropInfo, file_mgr_data);
3670 case DtDND_BUFFER_TRANSFER:
3671 DPRINTF (("DropOnFileWindow: Number of Buffers dropped are %d\n",
3672 dropInfo->dropData->numItems));
3673 ProcessDropOnFileWindow (w, dropInfo, file_mgr_data);
3676 dropInfo->status = DtDND_FAILURE;
3681 /************************************************************************
3683 * ProcessDropOnObject
3685 ************************************************************************/
3687 ProcessDropOnObject(
3689 DtDndDropCallbackStruct *dropInfo,
3690 FileViewData *file_view_data)
3694 DirectorySet *directory_data =
3695 (DirectorySet *) file_view_data->directory_set;
3696 FileMgrData *file_mgr_data = (FileMgrData *) directory_data->file_mgr_data;
3697 char *command = NULL;
3699 /******************/
3700 /* transfer phase */
3701 /******************/
3702 if (dropInfo->reason != DtCR_DND_DROP_ANIMATE)
3704 DPRINTF(("DropOnObject: Transfer Callback\n"));
3706 /* Initiating view not valid when another client initiates drag */
3708 initiating_view = NULL;
3710 /* check for invalid trash drop */
3711 if (FileFromTrash(dropInfo->dropData->data.files[0]))
3713 if (InvalidTrashDragDrop(dropInfo->operation,
3715 ((FileMgrRec *)file_mgr_data->file_mgr_rec)->file_window))
3717 dropInfo->status = DtDND_FAILURE;
3721 command = TypeToAction(dropInfo->operation,
3722 file_view_data->file_data->logical_type);
3724 (strncmp("FILESYSTEM_", command, strlen("FILESYSTEM_")) != 0) &&
3725 dropInfo->dropData->protocol == DtDND_BUFFER_TRANSFER)
3726 dropInfo->completeMove = True;
3728 /* set the complete move flag to False since we will be handling */
3729 /* the deletion of the original file */
3730 dropInfo->completeMove = False;
3733 /******************************************/
3734 /* animate phase, retrieve action and run */
3735 /******************************************/
3738 command = TypeToAction(dropInfo->operation,
3739 file_view_data->file_data->logical_type);
3742 RunCommand (command,
3749 DtDtsFreeAttributeValue(command);
3755 /************************************************************************
3759 ************************************************************************/
3764 XtPointer client_data,
3765 XtPointer call_data)
3767 DtDndDropCallbackStruct *dropInfo = (DtDndDropCallbackStruct *)call_data;
3769 switch (dropInfo->dropData->protocol)
3771 case DtDND_FILENAME_TRANSFER:
3772 case DtDND_BUFFER_TRANSFER:
3773 ProcessDropOnObject(w, dropInfo, (FileViewData *) client_data);
3776 dropInfo->status = DtDND_FAILURE;
3781 /************************************************************************
3783 * FileMgrPropagateSettings
3784 * Set a new (dst_data) file manager view settings to an
3785 * old (src_data) settings.
3787 ************************************************************************/
3790 FileMgrPropagateSettings(
3791 FileMgrData *src_data,
3792 FileMgrData *dst_data )
3795 PreferencesData * src_preferences_data;
3796 PreferencesData * dst_preferences_data;
3798 FilterData * src_filter_active_data;
3799 FilterData * dst_filter_active_data;
3800 FilterData * src_filter_edit_data;
3801 FilterData * dst_filter_edit_data;
3804 Dimension src_width;
3805 Dimension src_height;
3807 /* Copy the preferences data from src to dst data */
3809 src_preferences_data = (PreferencesData *) src_data->preferences->data;
3810 dst_preferences_data = (PreferencesData *) dst_data->preferences->data;
3812 dst_data->show_type = dst_preferences_data->show_type = src_data->show_type;
3813 dst_data->tree_files = dst_preferences_data->tree_files =
3814 src_data->tree_files;
3815 dst_data->view = src_data->view;
3816 dst_data->view_single = dst_preferences_data->view_single =
3817 src_data->view_single;
3818 dst_data->view_tree = dst_preferences_data->view_tree =
3819 src_data->view_tree;
3820 dst_data->order = dst_preferences_data->order = src_data->order;
3821 dst_data->direction = dst_preferences_data->direction = src_data->direction;
3822 dst_data->positionEnabled = dst_preferences_data->positionEnabled =
3823 src_data->positionEnabled;
3824 dst_data->show_iconic_path = dst_preferences_data->show_iconic_path =
3825 src_data->show_iconic_path;
3826 dst_data->show_current_dir = dst_preferences_data->show_current_dir =
3827 src_data->show_current_dir;
3828 dst_data->show_status_line = dst_preferences_data->show_status_line =
3829 src_data->show_status_line;
3832 /* Copy the Filter active info from src to dest data */
3833 src_filter_active_data = (FilterData *) src_data->filter_active->data;
3834 dst_filter_active_data = (FilterData *) dst_data->filter_active->data;
3836 dst_filter_active_data->match_flag = src_filter_active_data->match_flag;
3837 dst_filter_active_data->filter = XtNewString(src_filter_active_data->filter);
3838 dst_filter_active_data->show_hidden = src_filter_active_data->show_hidden;
3839 dst_filter_active_data->filetypesFilteredCount =
3840 src_filter_active_data->filetypesFilteredCount;
3841 XtFree(dst_filter_active_data->filetypesFiltered);
3842 dst_filter_active_data->filetypesFiltered =
3843 XtNewString(src_filter_active_data->filetypesFiltered);
3844 dst_filter_active_data->count = ReadInFiletypes(dst_filter_active_data);
3846 /* Copy the Filter edit info from src to dest data */
3847 src_filter_edit_data = (FilterData *) src_data->filter_edit->data;
3848 dst_filter_edit_data = (FilterData *) dst_data->filter_edit->data;
3850 dst_filter_edit_data->match_flag = src_filter_edit_data->match_flag;
3851 dst_filter_edit_data->filter = XtNewString(src_filter_edit_data->filter);
3852 dst_filter_edit_data->show_hidden = src_filter_edit_data->show_hidden;
3853 dst_filter_edit_data->filetypesFilteredCount =
3854 src_filter_edit_data->filetypesFilteredCount;
3855 XtFree(dst_filter_edit_data->filetypesFiltered);
3856 dst_filter_edit_data->filetypesFiltered =
3857 XtNewString(src_filter_edit_data->filetypesFiltered);
3858 dst_filter_edit_data->count = ReadInFiletypes(dst_filter_edit_data);
3860 /* Get the size info (e.g. X, Y) form src to dest data */
3861 XtSetArg (args[0], XmNwidth, &src_width);
3862 XtSetArg (args[1], XmNheight, &src_height);
3863 XtGetValues (((FileMgrRec *) src_data->file_mgr_rec)->shell, args, 2);
3865 dst_data->height = src_height;
3866 dst_data->width = src_width;
3868 /* need to propagate whether its a toolbox or not */
3869 dst_data->toolbox = src_data->toolbox;
3873 /************************************************************************
3876 * Update the list of open tree branches
3878 ************************************************************************/
3882 FileMgrData *file_mgr_data,
3883 DirectorySet *directory_set)
3886 char ** table = NULL;
3891 /* check if the given directory set is already in the table */
3892 if (directory_set && file_mgr_data->branch_list) {
3893 for (i = 0; file_mgr_data->branch_list[i]; i++)
3894 if (strcmp(file_mgr_data->branch_list[i] + 2, directory_set->name) == 0)
3896 /* just update the TreeShow value for this branch and return */
3897 file_mgr_data->branch_list[i][0] = '0' + directory_set->sub_root->ts;
3902 /* free old branch_list, if any */
3903 if (file_mgr_data->branch_list) {
3904 for (i = 0; file_mgr_data->branch_list[i]; i++)
3905 XtFree (file_mgr_data->branch_list[i]);
3906 XtFree((char *)file_mgr_data->branch_list);
3907 file_mgr_data->branch_list = NULL;
3910 /* create new brach list */
3911 for (i = 0; i < file_mgr_data->directory_count; i++) {
3913 if (file_mgr_data->directory_set[i]->sub_root->ts < tsNotRead)
3916 /* get the name of the tree branch */
3917 branch_name = file_mgr_data->directory_set[i]->name;
3919 /* generate table entry */
3920 branch_entry = (char *)XtMalloc(2 + strlen(branch_name) + 1);
3921 branch_entry[0] = '0' + file_mgr_data->directory_set[i]->sub_root->ts;
3922 branch_entry[1] = ':';
3923 strcpy(branch_entry + 2, branch_name);
3925 /* add entry to the table */
3927 table = (char **)XtRealloc((char *)table,
3928 sizeof(char *) * (table_size + 1));
3929 table[table_size - 1] = branch_entry;
3930 table[table_size] = NULL;
3933 file_mgr_data->branch_list = table;
3937 /************************************************************************
3940 * Read the directory contained in host: current_directory and
3941 * build the file data list and reset any related information
3943 ************************************************************************/
3947 FileMgrData *file_mgr_data,
3951 FileMgrRec *file_mgr_rec;
3952 int directory_count;
3953 DirectorySet ** directory_set;
3954 DirectorySet ** new_dir_set;
3955 FileViewData ** new_view_data;
3956 FileViewData *new_renaming,*new_popup_menu_icon=NULL;
3957 FileViewData *file_view_data,*new_drag_file_view_data=NULL;
3960 ObjectPtr position_info;
3967 file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
3968 directory_count = file_mgr_data->directory_count;
3969 directory_set = file_mgr_data->directory_set;
3972 * Read the directory and subdirectories given by branch_list.
3973 * Note: if any directory we need isn't yet in the cache,
3974 * ReadTreeDirectory will just kick off a background process
3975 * to read the directory and return with
3976 * file_mgr_data->busy_status set to busy_readdir.
3978 ReadTreeDirectory (file_mgr_rec->shell, file_mgr_data->host,
3979 file_mgr_data->current_directory,
3980 file_mgr_data, branch_list,
3981 &new_dir_set, &new_dir_count);
3983 /* if directories not ready yet, don't do anything */
3984 if (file_mgr_data->busy_status != not_busy)
3990 * Try to preserve the 'widget' and 'position_info' fields in the
3991 * file_view_data structure, for each file. This will allow us to
3992 * re-use the same Icon widget, to reduce flashing.
3993 * Also preserve ndir & nfile counts (used in FilterFiles to decide
3994 * whether to expand or collapse a tree branch if ndir or nfile
3998 /* loop through the old directory set */
3999 new_renaming = NULL;
4000 for (i = 0; i < directory_count; i++)
4002 /* find a directory with same name in the new directory set */
4003 for (j = 0; j < new_dir_count; j++)
4004 if (strcmp(directory_set[i]->name, new_dir_set[j]->name) == 0)
4007 /* if we couldn't find this directory, continue to the next one */
4008 if (j == new_dir_count)
4011 new_view_data = new_dir_set[j]->file_view_data;
4012 new_file_count = new_dir_set[j]->file_count;
4014 /* loop throught the old file list */
4015 for (j = 0; j < directory_set[i]->file_count; j++)
4017 file_view_data = directory_set[i]->file_view_data[j];
4018 position_info = file_view_data->position_info;
4021 * Find a file by the same name in the new file list.
4023 for (k = 0; k < new_file_count; k++)
4025 if (new_view_data[k]->file_data == file_view_data->file_data)
4027 /* Fix for defect 5029 */
4028 if(file_mgr_data->popup_menu_icon && file_view_data->file_data==
4029 file_mgr_data->popup_menu_icon->file_data)
4030 new_popup_menu_icon = new_view_data[k];
4032 /* Fix for defect 5703 */
4033 if ( file_mgr_data->drag_file_view_data &&
4034 file_mgr_data->drag_file_view_data->file_data ==
4035 file_view_data->file_data)
4036 new_drag_file_view_data = new_view_data[k];
4038 if (file_view_data == file_mgr_data->renaming)
4039 new_renaming = new_view_data[k];
4041 /* re-use the old widgets */
4042 new_view_data[k]->widget = file_view_data->widget;
4043 new_view_data[k]->treebtn = file_view_data->treebtn;
4044 new_view_data[k]->registered = file_view_data->registered;
4046 /* preserve ndir, nfile counts */
4047 new_view_data[k]->ndir = file_view_data->ndir;
4048 new_view_data[k]->nfile = file_view_data->nfile;
4050 /* preserve the position info */
4053 new_view_data[k]->position_info = position_info;
4054 position_info->file_view_data = new_view_data[k];
4057 /* preserve icon_mtime */
4058 new_view_data[k]->icon_mtime = file_view_data->icon_mtime;
4064 /* if no file by the same name was found in the new file list,
4065 the file must have gone away ... lets eliminate the
4066 position infomation */
4067 if (position_info && k == new_file_count)
4069 for (k = 0; k < file_mgr_data->num_objects; k++)
4071 if (file_mgr_data->object_positions[k] == position_info)
4073 /* @@@ what does this do? */
4074 position_info->late_bind = True;
4075 position_info->y += (file_view_data->widget->core.height / 2);
4082 /* replace the old directory set */
4083 file_mgr_data->directory_set = new_dir_set;
4084 file_mgr_data->directory_count = new_dir_count;
4085 file_mgr_data->renaming = new_renaming;
4086 file_mgr_data->popup_menu_icon = new_popup_menu_icon;
4087 file_mgr_data->drag_file_view_data = new_drag_file_view_data;
4089 /* Get the file types and the files sorted and filtered */
4090 for (i = 0; i < new_dir_count; i++)
4092 OrderFiles (file_mgr_data, new_dir_set[i]);
4093 FilterFiles (file_mgr_data, new_dir_set[i]);
4094 file_mgr_data->tree_root->filtered =
4095 file_mgr_data->show_type != MULTIPLE_DIRECTORY;
4097 SelectVisible(file_mgr_data);
4099 /* update the branch_list */
4100 UpdateBranchList(file_mgr_data, NULL);
4102 /* Update the selection list */
4104 while (j < file_mgr_data->selected_file_count)
4106 file_view_data = file_mgr_data->selection_list[j];
4108 /* See if the selected file is still around */
4110 for (i = 0; !match && i < new_dir_count; i++)
4112 for (k = 0; k < new_dir_set[i]->file_count; k++)
4114 if (file_view_data->file_data ==
4115 new_dir_set[i]->file_view_data[k]->file_data)
4119 file_mgr_data->selection_list[j] =
4120 new_dir_set[i]->file_view_data[k];
4125 /* Keep the file selected only if it was found in the new
4126 * directory set and if it is not filtered */
4127 if (match && !file_view_data->filtered)
4130 DeselectFile (file_mgr_data, file_view_data, False);
4133 /* free the old directory set */
4134 FreeLayoutData(file_mgr_data->layout_data);
4135 file_mgr_data->layout_data = NULL;
4136 FreeDirectorySet(directory_set, directory_count);
4138 /* Set the menu activation to reflect and changes in the selection. */
4140 if(file_mgr_data != trashFileMgrData
4141 && file_mgr_data != NULL )
4143 if (file_mgr_data->selected_file_count == 0)
4144 ActivateNoSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec);
4145 else if (file_mgr_data->selected_file_count == 1)
4146 ActivateSingleSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec,
4147 file_mgr_data->selection_list[0]->file_data->logical_type);
4149 ActivateMultipleSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec);
4152 SensitizeTrashBtns();
4154 /* load positional data for this directory */
4155 if ( (file_mgr_data->positionEnabled == RANDOM_ON)
4156 && ( (file_mgr_rec->menuStates & CLEAN_UP_OP) == 0)
4158 LoadPositionInfo(file_mgr_data);
4163 /************************************************************************
4166 * Search for a directory in branch list.
4168 ************************************************************************/
4172 FileMgrData *file_mgr_data,
4174 char *directory_name,
4180 if (branch_list == NULL)
4183 for (i = 0; branch_list[i]; i++)
4184 if (strcmp(branch_list[i] + 2, directory_name) == 0) {
4185 ts = branch_list[i][0] - '0';
4186 if (ts == tsNotRead)
4189 if (ts == tsAll && file_mgr_data->tree_files == TREE_FILES_NEVER)
4191 else if (ts == tsDirs && file_mgr_data->tree_files == TREE_FILES_ALWAYS)
4203 /************************************************************************
4206 * Read a directory and sub directories.
4208 ************************************************************************/
4210 static FileViewData *
4212 FileMgrData *file_mgr_data,
4214 char *directory_name,
4222 /* allocate new FileData */
4223 fp = (FileData *) XtMalloc(sizeof(FileData));
4224 memset(fp, 0, sizeof(FileData));
4227 if (strcmp(directory_name, "/") == 0)
4228 fp->file_name = XtNewString("/");
4231 p = strrchr(directory_name, '/');
4233 fp->file_name = XtNewString(p + 1);
4235 fp->file_name = XtNewString(directory_name);
4238 /* assume it's a directory for now ... */
4239 fp->is_subdir = True;
4241 /* @@@ do a readlink here ... */
4243 /* allocate FileViewData */
4244 ip = (FileViewData *)XtMalloc(sizeof(FileViewData));
4245 memset(ip, 0, sizeof(FileViewData));
4248 if (QueryBranchList(file_mgr_data, branch_list, directory_name, &ts) &&
4253 else if (file_mgr_data->tree_files == TREE_FILES_ALWAYS)
4267 * Recursively count the number of subdirectores we have read.
4272 if (ip->file_data->is_subdir && ip->ts != tsNotRead)
4275 for (dp = ip->desc; dp; dp = dp->next)
4276 CountDirectories(dp, np);
4280 static DirectorySet *
4284 FileMgrData *file_mgr_data)
4290 /* allocate a new directory set entry */
4291 ds = (DirectorySet *)XtMalloc(sizeof(DirectorySet));
4293 /* initialize the directory set entry */
4294 ds->name = XtNewString(name);
4297 for (dp = ip->desc; dp; dp = dp->next)
4299 if (ds->file_count != 0)
4300 ds->file_view_data =
4301 (FileViewData **)XtMalloc(ds->file_count*sizeof(FileViewData *));
4303 ds->file_view_data = NULL;
4305 for (dp = ip->desc, i = 0; dp; dp = dp->next, i++) {
4306 ds->file_view_data[i] = dp;
4307 dp->directory_set = (XtPointer)ds;
4309 ds->order_list = NULL;
4310 ds->filtered_file_count = 0;
4311 ds->invisible_file_count = 0;
4312 ds->file_mgr_data = (XtPointer)file_mgr_data;
4320 FileMgrData *file_mgr_data,
4322 DirectorySet **directory_set,
4325 * Recursively add directores to the directory set array.
4328 char fullname[MAX_PATH];
4331 if (ip->file_data->is_subdir && ip->ts != tsNotRead)
4333 /* add a new entry to the directory set array */
4334 GetFullName(file_mgr_data, ip, fullname);
4335 directory_set[*index] = NewDirectorySet(fullname, ip, file_mgr_data);
4339 for (dp = ip->desc; dp; dp = dp->next)
4340 MakeDirectorySets(file_mgr_data, dp, directory_set, index);
4348 char *directory_name,
4349 FileMgrData *file_mgr_data,
4351 DirectorySet ***directory_set,
4352 int *directory_count)
4354 FileViewData *ip, *dp;
4357 /* eliminate "/." */
4358 if (strcmp(directory_name, "/.") == 0)
4359 directory_name = "/";
4361 /* if not in tree mode, clear branch_list (@@@ really?) */
4362 if (file_mgr_data->show_type != MULTIPLE_DIRECTORY)
4365 /* get a FileViewData for the tree root */
4366 file_mgr_data->tree_root = ip =
4367 GetTopInfo(file_mgr_data, host_name, directory_name, branch_list);
4369 /* read the directory tree */
4370 rc = ReadDir(w, file_mgr_data, host_name, directory_name, ip,
4371 0, file_mgr_data->tree_preread_level, branch_list);
4372 if (file_mgr_data->busy_status != not_busy)
4374 /* No point in continuing any further, free up all 'ip' and return */
4375 XtFree(ip->file_data->file_name);
4376 XtFree((char *)ip->file_data);
4378 file_mgr_data->tree_root = NULL;
4384 /* update root FileData from "." */
4385 for (dp = ip->desc; dp; dp = dp->next)
4386 if (strcmp(dp->file_data->file_name, ".") == 0) {
4387 ip->file_data->physical_type = dp->file_data->physical_type;
4388 ip->file_data->logical_type =
4389 GetDirectoryLogicalType(file_mgr_data, directory_name);
4390 ip->file_data->errnum = dp->file_data->errnum;
4391 ip->file_data->stat = dp->file_data->stat;
4392 ip->file_data->is_broken = dp->file_data->is_broken;
4396 *directory_count = 0;
4397 CountDirectories(ip, directory_count);
4399 /* allocate array of directory set pointers */
4401 (DirectorySet **) XtMalloc ((*directory_count + 1)*sizeof(DirectorySet *));
4403 /* make a fake directory set for the tree root */
4405 char fullname[MAX_PATH];
4409 ds = (DirectorySet *)XtMalloc(sizeof(DirectorySet));
4410 ip->directory_set = (XtPointer)ds;
4412 strcpy(fullname, directory_name);
4413 p = strrchr(fullname, '/');
4416 ds->name = XtNewString(fullname);
4417 ds->sub_root = NULL;
4419 ds->file_view_data =
4420 (FileViewData **)XtMalloc(sizeof(FileViewData *));
4421 ds->file_view_data[0] = ip;
4423 (FileViewData **)XtMalloc(sizeof(FileViewData *));
4424 ds->order_list[0] = ip;
4425 ds->filtered_file_count = 1;
4426 ds->file_mgr_data = (XtPointer)file_mgr_data;
4428 (*directory_set)[0] = ds;
4432 /* make directory sets for the current dir and subdirs */
4434 MakeDirectorySets(file_mgr_data, ip, *directory_set, &i);
4438 /*--------------------------------------------------------------------
4440 *------------------------------------------------------------------*/
4447 * Decide if entry is currently displayed.
4452 /* filtered files are not shown */
4456 /* in flat mode all un-filtered files are shown */
4457 if (fmd->show_type == SINGLE_DIRECTORY)
4460 /* in tree mode an entry is shown only if user chooses to */
4461 ts = ip->parent? ip->parent->ts: tsDirs;
4464 else if (ts == tsDirs)
4465 return ip->file_data->is_subdir;
4474 FileViewData *dp, /* directory entry being searched */
4475 int level) /* tree depth level of this entry */
4477 * Recursively determine the display position of a given entry
4478 * Return false if the entry not currently displayed
4483 /* skip entries that are not displayed */
4484 if (level > 0 && !IsShown(fmd, dp))
4487 /* this entry is displayed */
4488 dp->displayed = True;
4490 /* traverse subtree */
4493 for (ip = dp->desc; ip; ip = ip->next)
4494 SetDisplayedRecur(fmd, ip, level);
4501 SelectVisible (FileMgrData *file_mgr_data)
4505 /* assume nothing displayed */
4506 for (i = 0; i < file_mgr_data->directory_count; i++)
4507 for (j = 0; j < file_mgr_data->directory_set[i]->file_count; j++)
4508 file_mgr_data->directory_set[i]->file_view_data[j]->displayed = False;
4510 /* set the displayed flag for all entries that are actually shown */
4511 SetDisplayedRecur(file_mgr_data, file_mgr_data->tree_root, 0);
4512 if (file_mgr_data->show_type == SINGLE_DIRECTORY)
4513 file_mgr_data->tree_root->displayed = False;
4517 /*--------------------------------------------------------------------
4518 * expand tree branches
4519 *------------------------------------------------------------------*/
4522 * UpdateBranchState:
4523 * Determine new tree brach expansion state after a subdirectory has
4524 * been re-read (op == BRANCH_UPDATE), or after the user has requested
4525 * to expand (op == BRANCH_EXPAND) or collapse (op == BRANCH_COLLAPSE)
4530 FileMgrData *file_mgr_data,
4535 TreeShow old_ts = ip->ts;
4537 if (ip->ts == tsReading && op == BRANCH_UPDATE)
4545 /* this is a new branch that's currently being read */
4549 else if (ip->ts == tsError)
4551 /* can't expand or collaps this branch */
4555 else if (op == BRANCH_UPDATE) /* update */
4559 else if (op == BRANCH_EXPAND) /* show more */
4561 if (file_mgr_data->tree_files == TREE_FILES_NEVER)
4563 if (ip->ts == tsNone || !showEmptySet && ip->ndir == 0)
4571 if (ip->ndir == 0 && ip->nfile == 0)
4573 /* the subdir is empty */
4576 else if (ip->ts == tsNone)
4581 else if (ip->ts == tsAll)
4583 else if (ip->ts == tsNone &&
4584 ip->ndir > 0 && ip->nfile > 0 &&
4585 file_mgr_data->tree_files == TREE_FILES_CHOOSE)
4593 (ip->nfile == 0 || file_mgr_data->tree_files == TREE_FILES_NEVER) &&
4596 DirectorySet *directory_set = (DirectorySet *)ip->directory_set;
4597 FileMgrData *file_mgr_data = (FileMgrData *)directory_set->file_mgr_data;
4598 FileMgrRec *file_mgr_rec = (FileMgrRec *)file_mgr_data->file_mgr_rec;
4603 msg = GETMESSAGE(12,18, "The folder %s is empty.");
4605 msg = GETMESSAGE(12,19, "The folder %s contains no subdirectories.");
4607 sprintf(buf, msg, ip->file_data->file_name);
4608 SetSpecialMsg( file_mgr_rec, file_mgr_data, buf );
4612 else if (op == BRANCH_COLLAPSE) /* show less */
4616 if (file_mgr_data->tree_files == TREE_FILES_NEVER)
4618 if (ip->ts == tsNone || !showEmptySet && ip->ndir == 0)
4625 if (ip->ndir == 0 && ip->nfile == 0)
4627 /* the subdir is empty */
4630 else if (ip->ts == tsNone)
4635 else if (ip->ts == tsNone)
4637 else if (ip->ts == tsAll &&
4638 ip->ndir > 0 && ip->nfile > 0 &&
4639 file_mgr_data->tree_files == TREE_FILES_CHOOSE)
4650 * Expand (expand == True) or collpase (expand == False) a tree branch.
4654 FileMgrData *file_mgr_data,
4658 FileMgrRec *file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
4659 DirectorySet *directory_set;
4660 int level, i, n, old_count, rc;
4666 GetAncestorInfo(file_mgr_data, ip, &level, path, NULL);
4667 SetSpecialMsg( file_mgr_rec, file_mgr_data, NULL );
4672 new_branch = (ip->ts == tsNotRead || ip->ts == tsError);
4675 /* we need to read the sub directory */
4676 _DtTurnOnHourGlass (file_mgr_rec->shell);
4677 if (ip->ts == tsError)
4679 if (file_mgr_data->busy_status == not_busy)
4681 file_mgr_data->busy_detail = 0;
4682 file_mgr_data->busy_status = initiating_readdir;
4684 RereadDirectory (file_mgr_rec->shell, file_mgr_data->host, path);
4685 if (file_mgr_data->busy_status == initiating_readdir)
4686 file_mgr_data->busy_status = not_busy;
4688 rc = ReadDir(file_mgr_rec->shell, file_mgr_data,
4689 file_mgr_data->host, path, ip,
4690 level, level, NULL);
4692 /* create new directory set entry */
4693 directory_set = NewDirectorySet(path, ip, file_mgr_data);
4695 /* if this is a new entry, add it to the directory set */
4696 if (ip->ts == tsNotRead)
4698 file_mgr_data->directory_set =
4700 XtRealloc((char *)(file_mgr_data->directory_set - 1),
4701 (file_mgr_data->directory_count + 2)*sizeof(DirectorySet *))) + 1;
4702 file_mgr_data->directory_set[file_mgr_data->directory_count] =
4704 file_mgr_data->directory_count++;
4708 /* otherwise, replace the existing entry */
4709 for (i = 0; i < file_mgr_data->directory_count; i++)
4710 if (strcmp(file_mgr_data->directory_set[i]->name, path) == 0)
4712 XtFree(file_mgr_data->directory_set[i]->name);
4713 file_mgr_data->directory_set[i]->name = NULL;
4714 if (file_mgr_data->directory_set[i]->file_view_data != NULL)
4715 XtFree((char *)file_mgr_data->directory_set[i]->file_view_data);
4716 file_mgr_data->directory_set[i]->file_view_data = NULL;
4717 XtFree((char *)file_mgr_data->directory_set[i]);
4718 file_mgr_data->directory_set[i] = directory_set;
4722 ip->ts == tsError && file_mgr_data->busy_status == busy_readdir)
4727 if (file_mgr_data->busy_status != busy_readdir)
4729 OrderFiles (file_mgr_data, directory_set);
4730 FilterFiles (file_mgr_data, directory_set);
4731 file_mgr_data->newSize = True;
4732 AddFileIcons(file_mgr_rec, file_mgr_data, directory_set);
4736 /* expand the branch */
4737 UpdateBranchState(file_mgr_data, ip, BRANCH_EXPAND,
4738 new_branch && file_mgr_data->busy_status == busy_readdir);
4742 /* collaps the branch */
4743 UpdateBranchState(file_mgr_data, ip, BRANCH_COLLAPSE, False);
4746 /* change tree button */
4747 if (file_mgr_data->busy_status != busy_readdir)
4749 px = GetTreebtnPixmap(file_mgr_data, ip);
4750 XtSetArg(args[0], XmNlabelPixmap, px);
4751 XtSetValues (ip->treebtn, args, 1);
4754 for (i = 0; i < file_mgr_data->directory_count; i++)
4755 if (strcmp(file_mgr_data->directory_set[i]->name, path) == 0)
4758 SelectVisible(file_mgr_data);
4759 UpdateBranchList(file_mgr_data, file_mgr_data->directory_set[i]);
4761 UnmanageFileIcons(file_mgr_rec, file_mgr_data, ip);
4762 EraseTreeLines(file_mgr_rec, file_mgr_data, ip);
4764 /* update the "Hidden" count */
4765 UpdateHeaders(file_mgr_rec, file_mgr_data, False);
4769 /************************************************************************
4772 * Free up the directory set data.
4774 ************************************************************************/
4778 DirectorySet ** directory_set,
4779 int directory_count)
4786 for (i = -1; i < directory_count; i++)
4788 if (directory_set[i] == NULL)
4791 XtFree ((char *) directory_set[i]->name);
4792 for (j = 0; j < directory_set[i]->file_count; j++)
4794 if( (char *) directory_set[i]->file_view_data[j]->label)
4796 XtFree ((char *) directory_set[i]->file_view_data[j]->label);
4797 directory_set[i]->file_view_data[j]->label = NULL;
4799 XtFree ((char *) directory_set[i]->file_view_data[j]);
4800 directory_set[i]->file_view_data[j] = NULL;
4802 if (directory_set[i]->file_view_data != NULL)
4803 XtFree ((char *) directory_set[i]->file_view_data);
4804 XtFree ((char *) directory_set[i]->order_list);
4805 XtFree ((char *) directory_set[i]);
4808 XtFree ((char *) (directory_set - 1));
4812 /************************************************************************
4815 * Free up the current directory and the directory set data.
4817 ************************************************************************/
4821 FileMgrData *file_mgr_data )
4823 if(file_mgr_data->object_positions)
4824 FreePositionInfo(file_mgr_data);
4826 if (file_mgr_data->current_directory != NULL)
4827 XtFree ((char *) file_mgr_data->current_directory);
4828 file_mgr_data->current_directory = NULL;
4830 if (file_mgr_data->host != NULL)
4831 XtFree ((char *) file_mgr_data->host);
4832 file_mgr_data->host = NULL;
4834 FreeLayoutData(file_mgr_data->layout_data);
4835 file_mgr_data->layout_data = NULL;
4836 FreeDirectorySet(file_mgr_data->directory_set,
4837 file_mgr_data->directory_count);
4838 file_mgr_data->directory_set = NULL;
4844 /************************************************************************
4847 * Close (destroy) the file browser view. This callback is issued
4848 * from both the Close menu item and the Close system menu.
4850 ************************************************************************/
4855 XtPointer client_data,
4856 XtPointer call_data )
4858 FileMgrRec * file_mgr_rec;
4859 DialogData * dialog_data;
4861 Widget mbar = XmGetPostedFromWidget(XtParent(w));
4864 XmUpdateDisplay (w);
4866 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
4867 XtGetValues(mbar, args, 1);
4868 /* Ignore accelerator received after we're unposted */
4869 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
4872 CloseView (dialog_data);
4878 /************************************************************************
4881 * Function called from a close on the system menu.
4883 ************************************************************************/
4890 FileMgrRec * file_mgr_rec;
4891 DialogData * dialog_data;
4894 file_mgr_rec = (FileMgrRec *) data;
4895 dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec);
4897 CloseView (dialog_data);
4902 /************************************************************************
4905 * Set the icon name and icon to be used for a file manager view.
4907 ************************************************************************/
4911 FileMgrRec *file_mgr_rec,
4912 FileMgrData *file_mgr_data,
4913 char *directory_name )
4915 static Pixmap tool_icon = XmUNSPECIFIED_PIXMAP;
4916 static Pixmap dir_icon = XmUNSPECIFIED_PIXMAP;
4917 static Pixmap tool_mask = XmUNSPECIFIED_PIXMAP;
4918 static Pixmap dir_mask = XmUNSPECIFIED_PIXMAP;
4919 char * new_directory_name;
4920 Pixel background, foreground, top_shadow, bottom_shadow, select;
4923 unsigned int height;
4926 Boolean havePixmap = False;
4927 Boolean haveMask = False;
4928 Boolean root = False;
4930 char *ptr, *fileLabel, *fileName;
4932 if (tool_icon == XmUNSPECIFIED_PIXMAP)
4934 XtSetArg (args[0], XmNbackground, &background);
4935 XtSetArg (args[1], XmNcolormap, &colormap);
4936 XtGetValues (file_mgr_rec->main, args, 2);
4938 XmGetColors (XtScreen (file_mgr_rec->main), colormap, background,
4939 &foreground, &top_shadow, &bottom_shadow, &select);
4941 /* first get the File Manager's Icon */
4942 pixmap = XmGetPixmap (XtScreen (file_mgr_rec->main), fileMgrIcon,
4943 foreground, background);
4944 if( pixmap != XmUNSPECIFIED_PIXMAP)
4947 /* now let's get the mask for the File Manager */
4948 pixmap = _DtGetMask (XtScreen (file_mgr_rec->main), fileMgrIcon);
4949 if( pixmap != XmUNSPECIFIED_PIXMAP)
4952 /* Let's get the Application Manager's Icon */
4953 pixmap = XmGetPixmap (XtScreen (file_mgr_rec->main), appMgrIcon,
4954 foreground, background);
4955 if( pixmap != XmUNSPECIFIED_PIXMAP)
4958 /* now let's get the mask for the Application Manager */
4959 pixmap = _DtGetMask (XtScreen (file_mgr_rec->main), appMgrIcon);
4960 if( pixmap != XmUNSPECIFIED_PIXMAP)
4966 if (fileLabel = DtDtsFileToAttributeValue(directory_name, DtDTS_DA_LABEL))
4968 else if (fileName = strrchr(directory_name, '/'))
4973 if(file_mgr_data->title)
4975 if(file_mgr_data->toolbox)
4977 if(strcmp(directory_name, file_mgr_data->restricted_directory) == 0)
4979 new_directory_name =
4980 (char *)XtMalloc(strlen(file_mgr_data->title) + 1);
4981 strcpy( new_directory_name, file_mgr_data->title );
4985 new_directory_name = (char *)XtMalloc( strlen(ptr) + 1 );
4986 sprintf(new_directory_name, "%s", ptr);
4991 new_directory_name = (char *)XtMalloc( strlen(ptr) + 1);
4992 sprintf(new_directory_name, "%s", ptr);
4998 if (strcmp (directory_name, "/") == 0 && !fileLabel)
5000 new_directory_name = (char *)XtMalloc(strlen(file_mgr_data->host) +
5001 strlen(root_title) + 3);
5002 sprintf( new_directory_name, "%s:%s", file_mgr_data->host, root_title );
5006 new_directory_name = ptr;
5009 XtSetArg (args[0], XmNiconName, new_directory_name);
5011 if(file_mgr_data->toolbox && tool_icon != XmUNSPECIFIED_PIXMAP)
5014 XtSetArg (args[1], XmNiconPixmap, tool_icon);
5015 if( tool_mask != XmUNSPECIFIED_PIXMAP)
5018 XtSetArg (args[2], XmNiconMask, tool_mask);
5021 else if (dir_icon != XmUNSPECIFIED_PIXMAP)
5024 XtSetArg (args[1], XmNiconPixmap, dir_icon);
5025 if( dir_mask != XmUNSPECIFIED_PIXMAP)
5028 XtSetArg (args[2], XmNiconMask, dir_mask);
5035 XtSetValues (file_mgr_rec->shell, args, 3);
5037 XtSetValues (file_mgr_rec->shell, args, 2);
5040 XtSetValues (file_mgr_rec->shell, args, 1);
5043 DtDtsFreeAttributeValue(fileLabel);
5045 XtFree(new_directory_name);
5051 * Menu callback for the fast change directory toggle. Toggles the text
5052 * field up and down.
5055 ShowChangeDirField (
5057 XtPointer client_data,
5060 FileMgrRec * file_mgr_rec;
5061 DialogData * dialog_data;
5062 FileMgrData * file_mgr_data;
5068 /* Set the menu item to insensitive to prevent multiple */
5069 /* dialogs from being posted and get the area under the */
5070 /* menu pane redrawn. */
5074 if((int)client_data == FM_POPUP)
5077 mbar = XmGetPostedFromWidget(XtParent(w));
5078 XmUpdateDisplay (w);
5079 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
5080 XtGetValues(mbar, args, 1);
5084 /* Done only during a restore session */
5085 file_mgr_rec = (FileMgrRec *)client_data;
5088 /* Got an accelerator after we were unposted */
5089 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
5091 file_mgr_data = (FileMgrData *) dialog_data->data;
5093 /* Toggle the state of the text field */
5094 if (XtIsManaged(file_mgr_rec->current_directory_text))
5096 XtSetArg (args[0], XmNallowShellResize, False);
5097 XtSetValues(file_mgr_rec->shell, args, 1);
5098 XtUnmanageChild(file_mgr_rec->current_directory_text);
5099 XtSetArg (args[0], XmNallowShellResize, True);
5100 XtSetValues(file_mgr_rec->shell, args, 1);
5101 file_mgr_data->fast_cd_enabled = False;
5104 ShowFastChangeDir(file_mgr_rec, file_mgr_data);
5110 * Class function for forcing the focus to the text field, if visible, each
5111 * time the FileMgr dialog is posted.
5116 FileMgrRec * file_mgr_rec,
5117 FileMgrData * file_mgr_data)
5119 /* Force the focus to the text field */
5120 if (file_mgr_data->fast_cd_enabled)
5122 XRaiseWindow(XtDisplay(file_mgr_rec->current_directory_text),
5123 XtWindow(file_mgr_rec->current_directory_text));
5124 XmProcessTraversal(file_mgr_rec->current_directory_text,
5125 XmTRAVERSE_CURRENT);
5131 * This function free up any position information associated with the
5132 * dtfile view, and nulls out the associated data fields.
5137 FileMgrData * file_mgr_data)
5140 FileViewData **file_view_data;
5142 /* free object positions */
5143 for (i = 0; i < file_mgr_data->num_objects; i++)
5145 XtFree(file_mgr_data->object_positions[i]->name);
5146 XtFree((char *)file_mgr_data->object_positions[i]);
5147 file_mgr_data->object_positions[i] = NULL;
5150 XtFree((char *)file_mgr_data->object_positions);
5152 file_mgr_data->object_positions = NULL;
5153 file_mgr_data->num_objects = 0;
5155 /* clear references to object positions in file_view_data */
5156 for (i = 0; i < file_mgr_data->directory_count; i++)
5158 file_view_data = file_mgr_data->directory_set[i]->file_view_data;
5159 for (j = 0; j < file_mgr_data->directory_set[i]->file_count; j++)
5160 file_view_data[j]->position_info = NULL;
5166 * This function determines whether random positioning is currently enabled
5167 * for this view. The decision is based upon they type of the view, and
5168 * the current preferences settings.
5172 PositioningEnabledInView (
5173 FileMgrData * file_mgr_data)
5176 if ((file_mgr_data->show_type == SINGLE_DIRECTORY) &&
5177 (file_mgr_data->view != BY_ATTRIBUTES) &&
5178 (file_mgr_data->positionEnabled == RANDOM_ON))
5188 * This function is similar to the above function, but is less restrictive;
5189 * this function does not require that the view currently have positioning
5190 * enabled; it simply returns whether the view has positioning info.
5195 FileMgrData * file_mgr_data)
5198 if ((file_mgr_data->object_positions) &&
5199 (file_mgr_data->positionEnabled == RANDOM_ON))
5209 * When a new view of a directory is spun off of an existing view of that
5210 * directory, we want the new view to inherit the positioning information
5211 * associated with the original view. This function takes care of that.
5215 InheritPositionInfo (
5216 FileMgrData * src_file_mgr_data,
5217 FileMgrData * dest_file_mgr_data)
5220 ObjectPosition *ptr;
5221 ObjectPosition **temp_stack;
5223 if (!PositionFlagSet(src_file_mgr_data))
5225 /* Nothing to inherit */
5226 dest_file_mgr_data->num_objects = 0;
5227 dest_file_mgr_data->object_positions = NULL;
5231 dest_file_mgr_data->num_objects = src_file_mgr_data->num_objects;
5232 dest_file_mgr_data->object_positions = (ObjectPosition **) XtMalloc(
5233 sizeof(ObjectPosition *) * dest_file_mgr_data->num_objects);
5235 temp_stack = (ObjectPosition **) XtMalloc(
5236 sizeof(ObjectPosition *) * dest_file_mgr_data->num_objects);
5238 for (i = 0; i < dest_file_mgr_data->num_objects; i++)
5240 ptr = dest_file_mgr_data->object_positions[i] = (ObjectPosition *)
5241 XtMalloc(sizeof(ObjectPosition));
5243 *ptr = *(src_file_mgr_data->object_positions[i]);
5244 ptr->name = XtNewString(ptr->name);
5245 ptr->file_view_data = NULL;
5249 temp_stack[ptr->stacking_order - 1] = ptr;
5252 for(i = 0; i < dest_file_mgr_data->num_objects; i++)
5254 if(dest_file_mgr_data->object_positions[i]->stacking_order == 1)
5256 dest_file_mgr_data->object_positions[i]->next =
5257 temp_stack[dest_file_mgr_data->object_positions[i]->stacking_order];
5260 else if(dest_file_mgr_data->object_positions[i]->stacking_order ==
5261 dest_file_mgr_data->num_objects)
5263 dest_file_mgr_data->object_positions[i]->prev =
5264 temp_stack[dest_file_mgr_data->object_positions[i]->
5265 stacking_order - 2];
5269 dest_file_mgr_data->object_positions[i]->prev =
5270 temp_stack[dest_file_mgr_data->object_positions[i]->
5271 stacking_order - 2];
5272 dest_file_mgr_data->object_positions[i]->next =
5273 temp_stack[dest_file_mgr_data->object_positions[i]->stacking_order];
5277 XtFree((char *)temp_stack);
5282 * This function saves the current position information (if any) in the
5283 * associated directory; if there is no positional data, then any old
5284 * position files in this directory are removed. The entries are written
5285 * according to their position (left to right, top to bottom), not according
5286 * to their relative stacking order.
5291 FileMgrData * file_mgr_data)
5294 PositionInfo *position_info;
5295 ObjectPosition * ptr;
5298 /* Copy object positions into position info array */
5299 if (file_mgr_data->num_objects <= 0)
5300 position_info = NULL;
5303 position_info = (PositionInfo *)
5304 XtMalloc(file_mgr_data->num_objects * sizeof(PositionInfo));
5305 for (i = 0; i < file_mgr_data->num_objects; i++)
5307 ptr = file_mgr_data->object_positions[i];
5309 position_info[i].name = ptr->name;
5310 position_info[i].x = ptr->x;
5311 position_info[i].y = ptr->y;
5312 position_info[i].stacking_order = ptr->stacking_order;
5316 SetDirectoryPositionInfo(file_mgr_data->host,
5317 file_mgr_data->current_directory,
5318 file_mgr_data->num_objects, position_info);
5320 XtFree((char *)position_info);
5325 * This function will attempt to load any positional data associated with
5326 * the directory to be viewed. Within the positioning file, the entries
5327 * are order in left-to-right, top-to-bottom order, not according to the
5333 FileMgrData * file_mgr_data)
5335 PositionInfo *position_info;
5336 ObjectPosition * ptr;
5340 /* don't do anything if we already have position information */
5341 if (file_mgr_data->object_positions != NULL)
5344 /* Load the number of entries */
5345 numObjects = GetDirectoryPositionInfo(file_mgr_data->host,
5346 file_mgr_data->current_directory, &position_info);
5348 if (numObjects <= 0)
5350 file_mgr_data->object_positions = NULL;
5351 file_mgr_data->num_objects = 0;
5357 /* Proceed with the loading */
5358 file_mgr_data->object_positions = (ObjectPosition **)XtMalloc(
5359 sizeof(ObjectPosition *) * numObjects);
5361 for (i = 0; i < numObjects; i++)
5363 ptr = file_mgr_data->object_positions[i] = (ObjectPosition *)
5364 XtMalloc(sizeof(ObjectPosition));
5365 ptr->name = XtNewString(position_info[i].name);
5366 ptr->x = position_info[i].x;
5367 ptr->y = position_info[i].y;
5368 ptr->in_use = False;
5369 ptr->late_bind = False;
5370 ptr->stacking_order = position_info[i].stacking_order;
5371 ptr->file_view_data = NULL;
5376 /* Repair all of the next and prev pointers */
5377 file_mgr_data->num_objects = i;
5378 RepairStackingPointers(file_mgr_data);
5379 /* OrderChildrenList(file_mgr_data); */
5385 /************************************************************************
5387 * MoveOkCB - the user wishes to actually do the move even though its
5388 * not the desktop object that is actually getting moved.
5389 * This function calls the routines which do the moves. It
5390 * depends on the view type to determine how it does it.
5392 * DESKTOP - the drop happened on a Desktop object
5393 * and the object was a directory
5394 * NOT_DESKTOP_DIR - the drop happened on a directory
5395 * but it wasn't a directory on the desktop.
5396 * NOT_DESKTOP - drop happened in a FileManager view
5397 * and not on a directory.
5400 ************************************************************************/
5404 XtPointer client_data,
5405 XtPointer call_data )
5407 XtUnmanageChild((Widget)client_data);
5408 XmUpdateDisplay((Widget)client_data);
5409 XtDestroyWidget((Widget)client_data);
5414 /************************************************************************
5416 * MoveCancelCB - function called when the user cancels out of the
5417 * Move file question dialog. Just deleted the dialog.
5419 ************************************************************************/
5423 XtPointer client_data,
5424 XtPointer call_data )
5426 FileMgrRec *file_mgr_rec;
5428 XtUnmanageChild((Widget)client_data);
5429 XmUpdateDisplay((Widget)client_data);
5430 XtDestroyWidget((Widget)client_data);
5432 if(view_type == NOT_DESKTOP)
5434 file_mgr_rec = (FileMgrRec *)fm->file_mgr_rec;
5435 LayoutFileIcons(file_mgr_rec, fm, False, True);
5440 RemoveIconInWorkspace(
5442 char * workspaceName )
5444 DesktopRec *desktopWin;
5446 char iconName[MAX_PATH];
5449 for(i = 0; i < desktop_data->numIconsUsed; i++)
5451 desktopWin = desktop_data->desktopWindows[i];
5453 if( strcmp( desktopWin->dir_linked_to, "/" ) == 0 )
5454 sprintf( iconName, "/%s", desktopWin->file_name );
5456 sprintf( iconName, "%s/%s", desktopWin->dir_linked_to, desktopWin->file_name );
5458 DtEliminateDots( iconName );
5460 if( strcmp( fileName, iconName ) == 0
5461 && strcmp( workspaceName, desktopWin->workspace_name ) == 0 )
5463 RemoveDT( desktopWin->shell, (XtPointer) desktopWin,
5470 /*************************************************************************
5472 * CheckMoveType - function used to determine:
5473 * 1) is the file being moved have a reference to a
5475 * 2) if yes: is the file being moved dragged from
5476 * the Desktop (check widget_dragged)?
5477 * 2a) if yes: set up global varibles used by message
5479 * 2b) if no: execute the move, then if one of the objects
5480 * is on the Desktop, move the link to the
5482 * 3) question 1 answer is no: just exectute the move
5484 * Other information:
5486 * DESKTOP - the drop happened on a Desktop object
5487 * and the object was a directory
5488 * NOT_DESKTOP_DIR - the drop happened on a directory
5489 * but it wasn't a directory on the desktop.
5490 * NOT_DESKTOP - drop happened in a FileManager view
5491 * and not on a directory.
5494 **************************************************************************/
5497 FileMgrData *file_mgr_data,
5498 FileViewData *file_view_data,
5499 DirectorySet * directory_data,
5500 DesktopRec * desktopWindow,
5503 unsigned int modifiers,
5514 char directory[MAX_PATH];
5517 Screen *currentScreen;
5519 char * workspace_name;
5523 #ifdef _CHECK_FOR_SPACES
5524 if (_DtSpacesInFileNames(file_set, file_count))
5526 char * tmpStr = (GETMESSAGE(27,94, "The File Manager does not support objects\nwith spaces in their names, so we cannot delete them.\nTo delete these objects:\n - select 'Open Terminal' from the File Manager menu\n - then issue the remove command to delete them."));
5527 char * msg = XtNewString(tmpStr);
5528 FileOperationError (toplevel, msg, NULL);
5534 display = XtDisplay(toplevel);
5535 screen = XDefaultScreen(display);
5536 currentScreen = XScreenOfDisplay(display, screen);
5537 rootWindow = RootWindowOfScreen(currentScreen);
5539 if( DtWsmGetCurrentWorkspace(display,rootWindow,&pCurrent) == Success )
5541 workspace_name = XGetAtomName (display, pCurrent);
5542 CleanUpWSName(workspace_name);
5545 /* Fix for the case, when you drop an object from App. Manager on to desktop
5546 and try to move it to File Manager. It must copied for this operation
5547 (modifers == ControlMask). */
5551 Str = (char *)IsAFileOnDesktop2(file_set, file_count, &number,&IsToolBox);
5553 modifiers = ControlMask;
5557 * If number is comes back greater than 0 then at least one of the files
5558 * dropped has a reference to a Desktop object
5560 * If widget_dragged is != NULL then the files dragged are from the
5561 * desktop; in this case set up globals, and post a confirmation dialog.
5563 modifiers &= ~Button2Mask;
5564 modifiers &= ~Button1Mask;
5566 modifiers != ControlMask && modifiers != ShiftMask &&
5567 widget_dragged != NULL)
5569 char *message = NULL;
5571 char *from, *to, *filename;
5573 global_file_count = file_count;
5574 _DtCopyDroppedFileInfo(file_count, file_set, host_set,
5575 &global_file_set, &global_host_set);
5578 fv = file_view_data;
5584 /* desktop object dropped on a desktop directory */
5585 dtWindow = desktopWindow;
5586 fm = (FileMgrData *)NULL;
5587 dd = (DirectorySet *)NULL;
5588 to = (char *)XtMalloc(strlen(directory_data->name) +
5589 strlen(fv->file_data->file_name)+ 2);
5590 sprintf(to, "%s/%s", directory_data->name,
5591 fv->file_data->file_name );
5592 DtEliminateDots(to);
5594 case NOT_DESKTOP_DIR:
5595 /* desktop object dropped on a file view directory icon */
5596 dtWindow = (DesktopRec *)NULL;
5598 dd = directory_data;
5599 to = (char *)XtMalloc(strlen(dd->name) +
5600 strlen(fv->file_data->file_name) + 2);
5601 sprintf( to, "%s/%s",dd->name , fv->file_data->file_name );
5602 (void) DtEliminateDots(to);
5604 default:/* view == NOT_DESKTOP */
5605 /* desktop object dropped in a file manager view */
5606 dtWindow = (DesktopRec *)NULL;
5608 dd = (DirectorySet *)NULL;
5609 to = (char *)XtMalloc(strlen(file_mgr_data->current_directory)
5611 strcpy(to, file_mgr_data->current_directory);
5615 for(i=0; i<file_count; i++)
5617 if(strcmp(file_set[i], to) == 0)
5620 FileMgrRec *file_mgr_rec;
5622 GETMESSAGE(11,16,"A folder cannot be moved into itself.\n%s");
5623 msg = XtNewString(tmpStr);
5624 if(file_view_data == NULL)
5626 file_mgr_rec = (FileMgrRec *)file_mgr_data->file_mgr_rec;
5627 FileOperationError(file_mgr_rec->shell, msg, file_set[i]);
5631 FileOperationError(file_view_data->widget, msg, file_set[i]);
5636 XtFree(workspace_name);
5641 tmpStr = (GETMESSAGE(12,3, "Move File(s)"));
5642 title = XtNewString(tmpStr);
5645 int len = strlen(to);
5649 && file_mgr_data->toolbox )
5651 ptr = strrchr(file_set[0], '/');
5652 ptr1 = (char *)XtMalloc(strlen(to) + strlen(ptr) + 1);
5653 sprintf(ptr1, "%s%s", to, ptr);
5654 ptr1 = _DtResolveAppManPath( ptr1,
5655 file_mgr_data->restricted_directory);
5657 if (strncmp(ptr1, file_set[0], len) == 0)
5666 from = XtNewString( file_set[0] );
5667 ptr = strrchr( from, '/' );
5669 filename = XtNewString("");
5673 ptr = strrchr(file_set[0], '/');
5677 from = (char *)XtMalloc(strlen(file_set[0]) + 1);
5678 strcpy(from, file_set[0]);
5681 filename = (char *)XtMalloc(strlen(ptr) + 1);
5682 strcpy(filename, ptr);
5686 from = (char *)XtMalloc(strlen(ptr) + 1);
5688 filename = XtNewString("");
5692 if( strcmp( from, to ) == 0 )
5694 RemoveIconInWorkspace( file_set[0], workspace_name );
5698 XtFree(workspace_name);
5702 #ifdef sun /* This format statement core dumps on SunOS 4.0.3 and 4.1 */
5703 tmpStr = (GETMESSAGE(12,4, "The object %s is currently in folder %s.\nYou are moving the object to folder %s.\nIs this what you want to do?"));
5705 tmpStr = (GETMESSAGE(12,5, "The object %1$s is currently in folder %2$s.\nYou are moving the object to folder %3$s.\nIs this what you want to do?"));
5707 message = (char *)XtMalloc(strlen(tmpStr) + strlen(filename) +
5708 strlen(to) + strlen(from) + 1);
5710 sprintf(message, tmpStr, filename, from, to);
5717 int len = strlen(to);
5721 for( i = 0; i < desktop_data->numWorkspaces; ++i )
5723 if( strcmp( workspace_name, desktop_data->workspaceData[i]->name) == 0 )
5725 workspace_num = desktop_data->workspaceData[i]->number;
5730 DeselectAllDTFiles( desktop_data->workspaceData[workspace_num -1] );
5736 && file_mgr_data->toolbox)
5738 to = _DtResolveAppManPath( to,
5739 file_mgr_data->restricted_directory );
5740 for( i = 0; i < number; ++i )
5744 from = (char *)XtNewString( file_set[i] );
5745 ptr = strrchr( from, '/' );
5747 from = _DtResolveAppManPath( from,
5748 file_mgr_data->restricted_directory );
5751 if( strcmp( from, to ) == 0 )
5752 RemoveIconInWorkspace( file_set[i], workspace_name );
5760 for( i = 0; i < number; ++i )
5762 ptr = strrchr(file_set[i], '/');
5766 from = (char *)XtMalloc(strlen(file_set[i]) + 1);
5767 strcpy(from, file_set[i]);
5772 from = (char *)XtMalloc(strlen(ptr) + 1);
5776 if( strcmp( to, from ) == 0 )
5778 RemoveIconInWorkspace( file_set[i], workspace_name );
5791 tmpStr = (GETMESSAGE(12,6, "At least one of the files you dropped is from a different\nfolder. You are moving all these files to %s.\nIs this what you want to do?"));
5792 message = (char *)XtMalloc(strlen(tmpStr) + strlen(to) + 1);
5794 sprintf(message, tmpStr, to);
5804 _DtMessageDialog(toplevel, title, message, NULL, TRUE,
5805 MoveCancelCB, MoveOkCB, NULL, HelpRequestCB, False,
5812 XtFree(workspace_name);
5816 XtFree(Str); /* No longer used, so free it up */
5817 XtFree(workspace_name);
5819 * Files are not dragged from the desktop.
5821 * Just execute the operation. The target directory dependings on
5822 * the view type (i.e. DESKTOP, NOT_DESKTOP, or NOT_DESKTOP_DIR).
5827 target_host = desktopWindow->host;
5828 sprintf( directory, "%s/%s", directory_data->name,
5829 file_view_data->file_data->file_name );
5830 DtEliminateDots(directory);
5831 value = FileMoveCopyDesktop (file_view_data, directory,
5832 host_set, file_set, file_count,
5833 modifiers, desktopWindow,
5837 case NOT_DESKTOP_DIR:
5838 target_host = file_mgr_data->host;
5839 sprintf( directory, "%s/%s", directory_data->name,
5840 file_view_data->file_data->file_name );
5841 DtEliminateDots(directory);
5842 value = FileMoveCopy (file_mgr_data,
5843 NULL, directory, target_host,
5844 host_set, file_set, file_count,
5845 modifiers, NULL, NULL);
5848 default:/* view == NOT_DESKTOP */
5849 target_host = file_mgr_data->host;
5850 strcpy(directory, file_mgr_data->current_directory);
5854 RepositionIcons(file_mgr_data, file_set, file_count, drop_x,
5857 value = FileMoveCopy(file_mgr_data,
5858 NULL, directory, target_host,
5859 host_set, file_set, file_count,
5860 modifiers, NULL, NULL);
5867 * If this was a move and any of the files is referenced by a
5868 * Desktop object we need to change the reference to the new
5869 * location that the file moved to.
5871 * @@@ This should really be done in the pipe callback!
5875 modifiers != ControlMask && modifiers != ShiftMask)
5877 Tt_status tt_status;
5879 for(j = 0; j < file_count; j++)
5882 DesktopRec *desktopWin;
5885 * loop through each desktop object to see if the file
5886 * being operated on has a reference to a desktop object.
5887 * If it does change the reference in the desktop object
5889 * NOTE: if we find a desktop object the file references,
5890 * after we've changed the DT object we can't break
5891 * because there might be more than one DT object which
5894 for(i = 0; i < desktop_data->numIconsUsed; i++)
5896 desktopWin = desktop_data->desktopWindows[i];
5897 fileName = ResolveLocalPathName( desktopWin->host, desktopWin->dir_linked_to,
5898 desktopWin->file_name, home_host_name, &tt_status);
5899 if( TT_OK == tt_status && strcmp(fileName, file_set[j]) == 0 )
5902 * if fileName == file_set[j] then the file is on the
5903 * Desktop so change the dir_linked to reference. What the
5904 * new reference is depends on which view type is being
5907 XtFree(desktopWin->host);
5908 desktopWin->host = XtNewString(target_host);
5910 XtFree(desktopWin->dir_linked_to);
5911 desktopWin->dir_linked_to = XtNewString(directory);
5913 XtFree(desktopWin->restricted_directory);
5914 if(file_mgr_data->restricted_directory != NULL)
5915 desktopWin->restricted_directory =
5916 XtNewString(file_mgr_data->restricted_directory);
5918 desktopWin->restricted_directory = NULL;
5920 XtFree(desktopWin->title);
5921 if(file_mgr_data->title != NULL)
5922 desktopWin->title = XtNewString(file_mgr_data->title);
5924 desktopWin->title = NULL;
5926 XtFree(desktopWin->helpVol);
5927 if(file_mgr_data->helpVol != NULL)
5928 desktopWin->helpVol = XtNewString(file_mgr_data->helpVol);
5930 desktopWin->helpVol = NULL;
5932 desktopWin->toolbox = file_mgr_data->toolbox;
5935 } /* for ( i = 0 ...) */
5936 } /* for (j = 0 ...) */
5938 /* since at least one of the file has been moved lets update
5939 the !dtdesktop file */
5940 SaveDesktopInfo(NORMAL_RESTORE);
5947 * This function returns the current working directory settings, used when
5948 * invoking an action. The caller passes in the current directory for the
5949 * command, and we will simply copy it and return new pointers, unless the
5950 * path specifies a directory which is part of the tool/apps area; in this
5951 * case, the cwd is set to the user's home directory.
5953 * The application must free up these two return pointers.
5965 if ((strcmp(home_host_name, viewHost) == 0) && type != NULL)
5969 /* Force app dir and any of its subdirs to use $HOME */
5970 if(strcmp(users_home_dir, "/") != 0)
5972 ptr = strrchr(users_home_dir, '/');
5974 *pwdDirRet = XtNewString(users_home_dir);
5978 *pwdDirRet = XtNewString(users_home_dir);
5979 *pwdHostRet = XtNewString(home_host_name);
5983 /* Simply use the passed in cwd */
5984 *pwdHostRet = XtNewString(viewHost);
5985 *pwdDirRet = XtNewString(viewDir);
5990 CreateFmPopup (Widget w)
5992 Widget popupBtns[FM_POPUP_CHILDREN];
5993 XmString label_string;
6000 /* Create file manager popup menu */
6002 XtSetArg(args[n],XmNmenuAccelerator," "); n++;
6003 XtSetArg(args[n],XmNwhichButton, bMenuButton); n++;
6004 fileMgrPopup.menu = XmCreatePopupMenu(w, "FMPopup", args, n);
6005 XtAddCallback(fileMgrPopup.menu, XmNhelpCallback,
6006 (XtCallbackProc)HelpRequestCB,
6007 HELP_POPUP_MENU_STR);
6010 /* Create file manager title */
6011 fileMgrPopup.title = popupBtns[i] =
6012 (Widget)XmCreateLabelGadget(fileMgrPopup.menu, "fmtitle", NULL, 0);
6016 /* Create title separators */
6017 popupBtns[i++] = XmCreateSeparatorGadget(fileMgrPopup.menu, "sep2",
6021 /* Create 'Properties' option - white space popup */
6022 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 150, "Change Permissions...")));
6023 XtSetArg (args[0], XmNlabelString, label_string);
6024 mnemonic = ((char *)GETMESSAGE(20, 17, "P"));
6025 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6027 fileMgrPopup.wsPopup[BTN_PROPERTIES] = popupBtns[i] =
6028 XmCreatePushButtonGadget (fileMgrPopup.menu, "permissions", args, 2);
6029 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6030 (XtCallbackProc)HelpRequestCB,
6031 HELP_POPUP_MENU_STR);
6033 XmStringFree (label_string);
6036 /* Create 'Find' option -- white space popup */
6037 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 18, "Find...")));
6038 XtSetArg (args[0], XmNlabelString, label_string);
6039 mnemonic = ((char *)GETMESSAGE(20, 19, "F"));
6040 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6042 fileMgrPopup.wsPopup[BTN_FIND] = popupBtns[i] =
6043 XmCreatePushButtonGadget (fileMgrPopup.menu, "find", args, 2);
6044 XtAddCallback (popupBtns[i], XmNactivateCallback,
6045 ShowFindDialog, (XtPointer) FM_POPUP);
6046 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6047 (XtCallbackProc)HelpRequestCB,
6048 HELP_FILE_MENU_STR);
6050 XmStringFree (label_string);
6053 /* Create 'Clean Up' option -- white space popup */
6054 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 99, "Clean Up")));
6055 XtSetArg (args[0], XmNlabelString, label_string);
6056 mnemonic = ((char *)GETMESSAGE(20, 100, "C"));
6057 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6059 fileMgrPopup.wsPopup[BTN_CLEANUP] = popupBtns[i] =
6060 XmCreatePushButtonGadget (fileMgrPopup.menu, "cleanUp", args, 2);
6061 XtAddCallback (popupBtns[i], XmNactivateCallback,
6062 CleanUp, (XtPointer) FM_POPUP);
6063 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6064 (XtCallbackProc)HelpRequestCB,
6065 HELP_CLEAN_UP_COMMAND_STR);
6067 XmStringFree (label_string);
6070 /* Create 'Select All' option -- white space popup */
6071 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 48, "Select All")));
6072 XtSetArg (args[0], XmNlabelString, label_string);
6073 mnemonic = ((char *)GETMESSAGE(20, 51, "S"));
6074 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6076 fileMgrPopup.wsPopup[BTN_SELECTALL] = popupBtns[i] =
6077 XmCreatePushButtonGadget (fileMgrPopup.menu, "selectAll", args, 2);
6078 XtAddCallback (popupBtns[i], XmNactivateCallback,
6079 SelectAll, (XtPointer) FM_POPUP);
6080 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6081 (XtCallbackProc)HelpRequestCB,
6082 HELP_SELECT_ALL_COMMAND_STR);
6084 XmStringFree (label_string);
6087 /* Create 'Unselect All' option -- white space popup */
6088 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 52, "Deselect All")));
6089 XtSetArg (args[0], XmNlabelString, label_string);
6090 mnemonic = ((char *)GETMESSAGE(20, 55, "D"));
6091 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6093 fileMgrPopup.wsPopup[BTN_UNSELECTALL] = popupBtns[i] =
6094 XmCreatePushButtonGadget (fileMgrPopup.menu, "deselectAll", args, 2);
6095 XtAddCallback (popupBtns[i], XmNactivateCallback,
6096 UnselectAll, (XtPointer) FM_POPUP);
6097 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6098 (XtCallbackProc)HelpRequestCB,
6099 HELP_UNSELECT_ALL_COMMAND_STR);
6101 XmStringFree (label_string);
6104 /* Create 'Show Hidden Files' option -- white space popup */
6105 label_string = XmStringCreateLocalized((GETMESSAGE(20, 156, "Show Hidden Objects")));
6106 XtSetArg (args[0], XmNlabelString, label_string);
6107 mnemonic = ((char *)GETMESSAGE(20, 102, "H"));
6108 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6110 fileMgrPopup.wsPopup[BTN_SHOWHIDDEN] = popupBtns[i] =
6111 XmCreateToggleButtonGadget (fileMgrPopup.menu, "showHiddenObjects", args, 2);
6112 XtAddCallback (popupBtns[i], XmNvalueChangedCallback,
6113 ShowHiddenFiles, (XtPointer) FM_POPUP);
6114 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6115 (XtCallbackProc)HelpRequestCB,
6116 HELP_SHOW_HIDDEN_COMMAND_STR);
6118 XmStringFree (label_string);
6121 /* Manage white space popup buttons -- since XmNadjustMargin defaults */
6122 /* to true, we manage these buttons now so that they will be aligned */
6123 /* according to the 'ShowHiddenFiles' toggle button */
6124 XtManageChildren(fileMgrPopup.wsPopup, WS_BTNS);
6127 /* Adjust XmNadjustMargin such that the rest of the popup buttons will */
6128 /* NOT be forced to align with the 'ShowHiddenFiles' toggle button */
6129 XtSetArg(args[0], XmNadjustMargin, False);
6130 XtSetValues(fileMgrPopup.menu, args, 1);
6133 /* Create 'Properties' option - object popup */
6134 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 150, "Change Permissions...")));
6135 XtSetArg (args[0], XmNlabelString, label_string);
6136 mnemonic = ((char *)GETMESSAGE(20, 17, "P"));
6137 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6139 fileMgrPopup.objPopup[BTN_PROPERTIES] = popupBtns[i] =
6140 XmCreatePushButtonGadget (fileMgrPopup.menu, "permissions", args, 2);
6141 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6142 (XtCallbackProc)HelpRequestCB,
6143 HELP_POPUP_MENU_STR);
6145 XmStringFree (label_string);
6148 /* Create 'Put In Workspace' option -- object popup */
6149 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 84, "Put in Workspace")));
6150 XtSetArg (args[0], XmNlabelString, label_string);
6151 mnemonic = ((char *)GETMESSAGE(20, 85, "W"));
6152 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6154 fileMgrPopup.objPopup[BTN_PUTON] = popupBtns[i] =
6155 XmCreatePushButtonGadget (fileMgrPopup.menu, "putInWorkspace", args, 2);
6156 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6157 (XtCallbackProc)HelpRequestCB,
6158 HELP_POPUP_MENU_STR);
6160 XmStringFree (label_string);
6163 /* Create 'Delete To Trash' option -- object popup */
6164 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 151, "Put in Trash")));
6165 XtSetArg (args[0], XmNlabelString, label_string);
6166 mnemonic = ((char *)GETMESSAGE(20, 91, "T"));
6167 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6169 fileMgrPopup.objPopup[BTN_TRASH] = popupBtns[i] =
6170 XmCreatePushButtonGadget (fileMgrPopup.menu, "trash", args, 2);
6171 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6172 (XtCallbackProc)HelpRequestCB,
6173 HELP_POPUP_MENU_STR);
6175 XmStringFree (label_string);
6177 /* Create 'Help' option -- object popup */
6178 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 123, "Help")));
6179 XtSetArg (args[0], XmNlabelString, label_string);
6180 mnemonic = ((char *)GETMESSAGE(20, 102, "H"));
6181 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6183 fileMgrPopup.objPopup[BTN_HELP] = popupBtns[i] =
6184 XmCreatePushButtonGadget (fileMgrPopup.menu, "popupHelp", args, 2);
6185 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6186 (XtCallbackProc)HelpRequestCB,
6187 HELP_HELP_MENU_STR);
6189 XmStringFree (label_string);
6191 /* Create 'Restore' option -- trash popup */
6192 label_string = XmStringCreateLocalized ((GETMESSAGE(27, 24, "Put back")));
6193 XtSetArg (args[0], XmNlabelString, label_string);
6194 mnemonic = ((char *)GETMESSAGE(27, 26, "P"));
6195 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6196 fileMgrPopup.trash_objPopup[BTN_RESTORE] = popupBtns[i] =
6197 XmCreatePushButtonGadget (fileMgrPopup.menu, "putBack", args, 2);
6198 XtAddCallback(popupBtns[i++], XmNhelpCallback,
6199 (XtCallbackProc)HelpRequestCB,
6200 HELP_TRASH_DIALOG_STR);
6201 XmStringFree (label_string);
6204 /* Create 'Remove' option -- trash popup */
6205 label_string = XmStringCreateLocalized ((GETMESSAGE(27, 28, "Shred")));
6206 XtSetArg (args[0], XmNlabelString, label_string);
6207 mnemonic = ((char *)GETMESSAGE(27, 30, "h"));
6208 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6209 fileMgrPopup.trash_objPopup[BTN_REMOVE] = popupBtns[i] =
6210 XmCreatePushButtonGadget (fileMgrPopup.menu, "shred", args, 2);
6211 XtAddCallback(popupBtns[i++], XmNhelpCallback,
6212 (XtCallbackProc)HelpRequestCB,
6213 HELP_TRASH_DIALOG_STR);
6214 XmStringFree (label_string);
6217 /* Create separator -- white space popup and object popup */
6218 fileMgrPopup.action_separator = popupBtns[i++] =
6219 XmCreateSeparatorGadget(fileMgrPopup.menu, "sep2", NULL, 0);
6222 /* Manage popup buttons */
6223 XtManageChildren(popupBtns, i);
6228 /************************************************************************
6230 * DoTheMove - the user wishes to actually do the move even though its
6231 * not the desktop object that is actually getting moved.
6232 * This function calls the routines which do the moves. It
6233 * depends on the view type to determine how it does it.
6235 * DESKTOP - the drop happened on a Desktop object
6236 * and the object was a directory
6237 * NOT_DESKTOP_DIR - the drop happened on a directory
6238 * but it wasn't a directory on the desktop.
6239 * NOT_DESKTOP - drop happened in a FileManager view
6240 * and not on a directory.
6242 * if the type passed in is DESKTOP, then remove the corresponding
6245 ************************************************************************/
6254 char *file, *next, *end;
6255 char directory[MAX_PATH];
6256 Boolean result = True;
6258 file_count = global_file_count;
6259 file_set = global_file_set;
6260 host_set = global_host_set;
6266 RepositionIcons(fm, file_set, file_count, dx, dy, True);
6268 result = FileMoveCopy(fm,
6269 NULL, fm->current_directory, fm->host,
6270 host_set, file_set, file_count,
6271 (unsigned int)0, NULL, NULL);
6276 for(j = 0; j < file_count; j++)
6278 /* remove the Desktop object which corresponds to this move */
6279 for(i = 0; i < desktop_data->numIconsUsed; i++)
6282 DesktopRec *desktopWin;
6284 desktopWin = desktop_data->desktopWindows[i];
6285 if (strcmp(desktopWin->host, host_set[j]) != 0)
6288 fileName = (char *)XtMalloc(strlen(desktopWin->dir_linked_to)+
6289 strlen(desktopWin->file_name) + 3);
6290 sprintf( fileName, "%s/%s", desktopWin->dir_linked_to,
6291 desktopWin->file_name );
6293 * if fileName == file_set[j] then the file is on the
6294 * Desktop so change the dir_linked to reference. What the
6295 * new reference is depends on which view type is being
6298 if(strcmp(fileName, file_set[j]) == 0)
6302 Screen *currentScreen;
6304 char *workspace_name;
6306 screen = XDefaultScreen(XtDisplay(desktopWin->shell));
6308 XScreenOfDisplay(XtDisplay(desktopWin->shell), screen);
6309 rootWindow = RootWindowOfScreen(currentScreen);
6311 if(DtWsmGetCurrentWorkspace(XtDisplay(desktopWin->shell),
6312 rootWindow, &pCurrent) == Success)
6314 XGetAtomName (XtDisplay(desktopWin->shell), pCurrent);
6316 workspace_name = XtNewString("One");
6317 if (strcmp(workspace_name, desktopWin->workspace_name) == 0)
6319 RemoveDT (desktopWin->shell, (XtPointer) desktopWin,
6321 XtFree(workspace_name);
6322 workspace_name = NULL;
6325 XtFree(workspace_name);
6326 workspace_name = NULL;
6334 case NOT_DESKTOP_DIR:
6335 sprintf( directory, "%s/%s", dd->name, fv->file_data->file_name );
6337 result = FileMoveCopy (fm,
6338 NULL, directory, fm->host,
6339 host_set, file_set, file_count,
6340 (unsigned int) 0, NULL, NULL);
6347 DirectorySet * directory_data = (DirectorySet *)fv->directory_set;
6349 sprintf( directory, "%s/%s", directory_data->name,
6350 fv->file_data->file_name );
6352 result = FileMoveCopyDesktop (fv, directory, host_set, file_set,
6353 file_count, mod, dtWindow,
6359 _DtFreeDroppedFileInfo(file_count, file_set, host_set);
6367 Cardinal *num_params )
6369 XmDrawingAreaCallbackStruct cb ;
6370 FileMgrRec * fileMgrRec;
6372 Widget input_on_gadget ;
6374 if ((event->type == KeyPress)
6375 ||(event->type == KeyRelease))
6383 cb.reason = XmCR_INPUT ;
6386 if( *(params[0]) != '@' )
6389 sscanf( params[0], "%lx", &fileMgrRec );
6391 sscanf( params[0], "%p", &fileMgrRec );
6393 FileWindowInputCallback( wid, (XtPointer)fileMgrRec, (XtPointer)&cb );