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>
109 #include <sys/stat.h>
113 #include <Xm/CascadeB.h>
114 #include <Xm/DrawingA.h>
115 #include <Xm/DrawingAP.h>
116 #include <Xm/DrawnB.h>
117 #include <Xm/Frame.h>
119 #include <Xm/LabelG.h>
120 #include <Xm/MainW.h>
121 #include <Xm/PushBG.h>
122 #include <Xm/RowColumn.h>
123 #include <Xm/ScrolledW.h>
124 #include <Xm/SeparatoG.h>
126 #include <Xm/TextF.h>
127 #include <Xm/ToggleBG.h>
128 #include <Xm/VendorSEP.h>
130 #include <Dt/IconP.h>
131 #include <Dt/IconFile.h>
133 #include <X11/ShellP.h>
134 #include <X11/Shell.h>
135 #include <X11/Xatom.h>
137 #include <Xm/Protocols.h>
139 #include <Dt/Action.h>
140 #include <Dt/DtP.h> /* required for DtDirPaths type */
141 #include <Dt/Connect.h> /* required for DtMakeConnect... */
142 #include <Dt/FileM.h>
143 #include <Dt/HourGlass.h>
144 #include <Dt/DtNlUtils.h>
146 #include <Dt/SharedProcs.h>
149 #include <Xm/DragIcon.h>
150 #include <Xm/DragC.h>
156 #include "SharedProcs.h"
164 #include "ChangeDir.h"
167 #include "SharedMsgs.h"
168 #include "IconicPath.h"
169 #include "DtSvcInternal.h"
172 /* Dialog classes installed by Main.c */
174 extern int file_mgr_dialog;
175 extern int change_dir_dialog;
176 extern int preferences_dialog;
177 extern int filter_dialog;
178 extern int find_dialog;
179 extern int mod_attr_dialog;
181 extern int ReadInFiletypes(
182 FilterData *filter_data) ;
184 /* global varibles used within this function when we have to
185 * put up a _DtMessage dialog
187 static int global_file_count;
188 static char **global_file_set;
189 static char **global_host_set;
190 static FileMgrData *fm;
191 static int view_type;
192 static FileViewData *fv;
193 static DesktopRec *dtWindow;
194 static unsigned int mod;
195 static DirectorySet *dd;
196 static Pixmap change_view_pixmap = XmUNSPECIFIED_PIXMAP;
198 /* Global variables used in Command.c, FileMgr.c and FileOp.c */
199 int G_dropx, G_dropy;
201 /******** Static Function Declarations ********/
203 static XmFontListEntry FontListDefaultEntry(
204 XmFontList font_list) ;
208 Widget *return_widget,
210 static XtPointer GetDefaultValues( void ) ;
211 static XtPointer GetResourceValues(
212 XrmDatabase data_base,
214 static void SetValues(
215 FileMgrRec *file_mgr_rec,
216 FileMgrData *file_mgr_data) ;
217 static void WriteResourceValues(
221 static void FreeValues(
222 FileMgrData *file_mgr_data) ;
224 XtPointer recordPtr) ;
225 static void GetSessionDir(
226 FileMgrData *file_mgr_data) ;
227 static void BranchListToString(
231 static void SelectionListToString(
233 FileViewData ***value,
235 static Boolean StringToBranchList(
241 XtPointer *converter_data );
242 static void StringToSelectionList(
247 static void GetFileData(
248 FileMgrData *file_mgr_data,
250 char ** branch_list) ;
251 static FileViewData * GetTopInfo(
252 FileMgrData *file_mgr_data,
254 char *directory_name,
255 char **branch_list) ;
256 static void CountDirectories(
259 static DirectorySet * NewDirectorySet(
262 FileMgrData *file_mgr_data) ;
263 static void MakeDirectorySets(
264 FileMgrData *file_mgr_data,
266 DirectorySet **directory_set,
268 static void ReadTreeDirectory(
271 char *directory_name,
272 FileMgrData *file_mgr_data,
274 DirectorySet ***directory_set,
275 int *directory_count) ;
276 static Bool IsShown( FileMgrData *fmd,
278 static void SetDisplayedRecur(
282 static void SelectVisible (
283 FileMgrData *file_mgr_data) ;
284 static void FreeDirectorySet(
285 DirectorySet ** directory_set,
286 int directory_count) ;
287 static void FreeDirectoryData(
288 FileMgrData *file_mgr_data) ;
289 static void SystemClose(
292 static void SetIconAttributes(
293 FileMgrRec *file_mgr_rec,
294 FileMgrData *file_mgr_data,
295 char *directory_name) ;
296 static void SetFocus (
297 FileMgrRec * file_mgr_rec,
298 FileMgrData * file_mgr_data) ;
299 static void MoveOkCB(
301 XtPointer client_data,
302 XtPointer call_data ) ;
303 static void MoveCancelCB(
305 XtPointer client_data,
306 XtPointer call_data ) ;
307 static void CreateFmPopup (
309 static void DoTheMove(
315 Cardinal *num_params );
316 static void ActivateClist(
320 Cardinal *num_params );
322 /******** End Static Function Declarations ********/
325 #define TREE_DASH_WIDTH 1
327 /* Resource read and write function */
329 static char * FILEMGR = "FileMgr";
332 /* Action for osfMenu */
333 static XtActionsRec FMAction[] =
334 { { "FMInput", FMInput},
335 { "ActivateClist", ActivateClist}
339 /* The resources set for the FileMgr dialog */
341 static DialogResource resources[] =
343 { "show_type", SHOW_TYPE, sizeof(unsigned char),
344 XtOffset(FileMgrDataPtr, show_type),
345 (XtPointer) SINGLE_DIRECTORY, ShowTypeToString },
347 { "tree_files", TREE_FILES, sizeof(unsigned char),
348 XtOffset(FileMgrDataPtr, tree_files),
349 (XtPointer) TREE_FILES_NEVER, TreeFilesToString },
351 { "view_single", VIEW, sizeof(unsigned char),
352 XtOffset(FileMgrDataPtr, view_single),
353 (XtPointer) BY_NAME_AND_ICON, ViewToString },
355 { "view_tree", VIEW, sizeof(unsigned char),
356 XtOffset(FileMgrDataPtr, view_tree),
357 (XtPointer) BY_NAME_AND_SMALL_ICON, ViewToString },
359 { "order", ORDER, sizeof(unsigned char),
360 XtOffset(FileMgrDataPtr, order),
361 (XtPointer) ORDER_BY_ALPHABETICAL, OrderToString },
363 { "direction", DIRECTION_RESRC, sizeof(unsigned char),
364 XtOffset(FileMgrDataPtr, direction),
365 (XtPointer) DIRECTION_ASCENDING, DirectionToString },
367 { "positionEnabled", RANDOM, sizeof(unsigned char),
368 XtOffset(FileMgrDataPtr, positionEnabled),
369 (XtPointer) RANDOM_OFF, RandomToString },
371 { "host", XmRString, sizeof(String),
372 XtOffset(FileMgrDataPtr, host), (XtPointer) NULL, _DtStringToString },
374 { "current_directory", XmRString, sizeof(String),
375 XtOffset(FileMgrDataPtr, current_directory),
376 (XtPointer) "~", _DtStringToString },
378 { "branch_list", BRANCH_LIST, sizeof(XtPointer),
379 XtOffset(FileMgrDataPtr, branch_list),
380 (XtPointer) NULL, BranchListToString },
382 { "restricted_directory", XmRString, sizeof(String),
383 XtOffset(FileMgrDataPtr, restricted_directory),
384 (XtPointer) NULL, _DtStringToString },
386 { "title", XmRString, sizeof(String),
387 XtOffset(FileMgrDataPtr, title),
388 (XtPointer) NULL, _DtStringToString },
390 { "helpVol", XmRString, sizeof(String),
391 XtOffset(FileMgrDataPtr, helpVol),
392 (XtPointer) NULL, _DtStringToString },
394 { "selection_list", SELECTION_LIST, sizeof(XtPointer),
395 XtOffset(FileMgrDataPtr, selection_list),
396 (XtPointer) NULL, SelectionListToString },
398 { "show_iconic_path", XmRBoolean, sizeof(Boolean),
399 XtOffset(FileMgrDataPtr, show_iconic_path),
400 (XtPointer) True, _DtBooleanToString },
402 { "show_current_directory", XmRBoolean, sizeof(Boolean),
403 XtOffset(FileMgrDataPtr, show_current_dir),
404 (XtPointer) False, _DtBooleanToString },
406 { "show_status_line", XmRBoolean, sizeof(Boolean),
407 XtOffset(FileMgrDataPtr, show_status_line),
408 (XtPointer) True, _DtBooleanToString },
410 { "fast_cd_enabled", XmRBoolean, sizeof(Boolean),
411 XtOffset(FileMgrDataPtr, fast_cd_enabled),
412 (XtPointer) False, _DtBooleanToString },
414 { "toolbox", XmRBoolean, sizeof(Boolean),
415 XtOffset(FileMgrDataPtr, toolbox),
416 (XtPointer) False, _DtBooleanToString },
418 { "show_hid_enabled", XmRBoolean, sizeof(Boolean),
419 XtOffset(FileMgrDataPtr, show_hid_enabled),
420 (XtPointer) False, _DtBooleanToString },
422 { "secondaryHelpDialogCount", XmRInt, sizeof(int),
423 XtOffset(FileMgrDataPtr, secondaryHelpDialogCount),
424 (XtPointer) 0, _DtIntToString },
426 { "attr_dialog_count", XmRInt, sizeof(int),
427 XtOffset(FileMgrDataPtr, attr_dialog_count),
428 (XtPointer) 0, _DtIntToString },
430 { "trashcan", XmRBoolean, sizeof(Boolean),
431 XtOffset(FileMgrDataPtr, IsTrashCan),
432 (XtPointer) False, _DtBooleanToString },
437 * The Dialog Class structure.
440 static DialogClass fileMgrClassRec =
445 (DialogInstallChangeProc) NULL,
446 (DialogInstallCloseProc) NULL,
448 (DialogGetValuesProc) NULL,
451 (DialogSetValuesProc) SetValues,
453 (DialogFreeValuesProc) FreeValues,
455 (DialogSetFocusProc) SetFocus,
458 DialogClass * fileMgrClass = (DialogClass *) &fileMgrClassRec;
460 #ifdef _CHECK_FOR_SPACES
461 char translations_sp_esc[] = "<Key>space:Space()\n\
462 <Key>osfCancel:EscapeFM()";
463 char translations_space[] = "<Key>space:Space()";
465 char translations_sp_esc[] = "Ctrl<Key>space:Space()\n\
466 <Key>osfCancel:EscapeFM()";
467 char translations_space[] = "Ctrl<Key>space:Space()";
469 char translations_escape[] = "<Key>osfCancel:EscapeFM()";
471 #define DOUBLE_CLICK_DRAG
472 #ifndef DOUBLE_CLICK_DRAG
473 char translations_da[] = "\
474 <Key>osfCancel:DrawingAreaInput() ManagerGadgetSelect()\n\
475 <Key>plus:DrawingAreaInput() ManagerGadgetSelect()\n\
476 <Key>minus:DrawingAreaInput() ManagerGadgetSelect()\n\
477 <Btn2Down>:DrawingAreaInput() ManagerGadgetArm()\n\
478 <Btn2Down>,<Btn2Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
479 <Btn2Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
480 <Btn2Down>(2+):DrawingAreaInput() ManagerGadgetMultiArm()\n\
481 <Btn2Up>(2+):DrawingAreaInput() ManagerGadgetMultiActivate()";
485 extern _XmConst char _XmDrawingA_traversalTranslations[];
487 char translations_da[] = "\
488 <BtnMotion>:ManagerGadgetButtonMotion()\n\
489 <Btn1Down>:DrawingAreaInput() ManagerGadgetArm()\n\
490 <Btn1Down>,<Btn1Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
491 <Btn1Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
492 <Btn1Down>(2+):DrawingAreaInput() ManagerGadgetMultiArm() \
493 ManagerGadgetMultiActivate()\n\
494 <Btn2Down>:DrawingAreaInput() ManagerGadgetArm()\n\
495 <Btn2Down>,<Btn2Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
496 <Btn2Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
497 <BtnDown>:DrawingAreaInput()\n\
498 <BtnUp>:DrawingAreaInput()\n\
499 :<Key>osfActivate:DrawingAreaInput() ManagerParentActivate()\n\
500 :<Key>osfCancel:DrawingAreaInput() ManagerGadgetSelect()\n\
501 :<Key>osfHelp:DrawingAreaInput() ManagerGadgetHelp()\n\
502 :<Key>osfSelect:DrawingAreaInput() ManagerGadgetSelect()\n\
503 :<Key>osfDelete:DrawingAreaInput() ManagerGadgetSelect()\n\
504 :<Key>osfMenu:FMInput(@)\n\
505 :<Key>osfEndLine:FMInput(@)\n\
506 <Key>osfBeginLine:FMInput(@)\n\
507 :<Key>osfPageDown:FMInput(@)\n\
508 :<Key>osfPageUp:FMInput(@)\n\
509 :<Key>F1:DrawingAreaInput() ManagerGadgetHelp()\n\
510 s c a <Key>c: ActivateClist(@)\n\
511 ~s ~m ~a <Key>Return:DrawingAreaInput() ManagerParentActivate() ManagerGadgetSelect()\n\
512 <Key>space:DrawingAreaInput() ManagerGadgetSelect()\n\
513 :<Key>plus:DrawingAreaInput() ManagerGadgetSelect()\n\
514 :<Key>minus:DrawingAreaInput() ManagerGadgetSelect()\n\
515 <KeyDown>:DrawingAreaInput() ManagerGadgetKeyInput()\n\
516 <KeyUp>:DrawingAreaInput()";
517 #endif /* DOUBLE_CLICK_DRAG */
519 /************************************************************************
521 * FontListDefaultEntry
523 * Return the first entry in the font list with the tag
524 * XmFONTLIST_DEFAULT_TAG. If there isn't one, just return the
525 * first entry in the font list.
527 ************************************************************************/
529 static XmFontListEntry
530 FontListDefaultEntry(XmFontList font_list)
532 XmFontContext context;
533 XmFontListEntry first_entry, entry;
536 if (!XmFontListInitFontContext(&context, font_list))
539 entry = first_entry = XmFontListNextEntry(context);
541 tag = XmFontListEntryGetTag(entry);
542 if (!strcmp(XmFONTLIST_DEFAULT_TAG, tag)) {
548 entry = XmFontListNextEntry(context);
551 XmFontListFreeFontContext(context);
553 return entry ? entry : first_entry;
556 /************************************************************************
560 ************************************************************************/
566 Widget *return_widget,
569 static Boolean first = True;
570 FileMgrRec * file_mgr_rec;
575 Widget header_separator;
576 Widget iconic_path_da;
577 Widget current_directory_frame;
578 Widget current_directory_drop;
579 Widget current_directory_icon;
580 Widget directory_list_form;
583 Widget status_separator;
593 XmFontList font_list;
594 XtPointer entry_font;
596 XFontSetExtents *extents;
603 int icon_offset, cur_dir_offset;
604 Dimension shadow_thickness;
605 Dimension highlight_thickness;
606 XtTranslations trans_table, trans_table1;
609 /* Allocate the change directory dialog instance record. */
611 file_mgr_rec = (FileMgrRec *) XtMalloc (sizeof (FileMgrRec));
612 file_mgr_rec->action_pane_file_type = NULL;
614 /* set up translations in main edit widget */
615 trans_table = XtParseTranslationTable(translations_sp_esc);
617 char * resolvedTranslationString;
619 resolvedTranslationString = ResolveTranslationString( translations_da,
620 (char *)file_mgr_rec );
621 trans_table1 = XtParseTranslationTable( resolvedTranslationString );
622 XtFree( resolvedTranslationString );
623 resolvedTranslationString = NULL;
626 /* Create the shell and main window used for the view. */
628 XtSetArg (args[0], XmNallowShellResize, True);
629 if(!first && (special_view == True && special_title != NULL && !TrashView))
631 file_mgr_rec->shell = shell =
632 XtAppCreateShell (special_title, DTFILE_CLASS_NAME,
633 applicationShellWidgetClass, display, args, 1);
634 XtFree(special_title);
635 special_title = NULL;
638 file_mgr_rec->shell = shell =
639 XtAppCreateShell (application_name, DTFILE_CLASS_NAME,
640 applicationShellWidgetClass, display, args, 1);
642 special_view = False;
645 XtSetArg (args[n], XmNdeleteResponse, XmUNMAP); n++;
647 if (first == False || TrashView)
649 XtSetArg (args[n], XmNgeometry, NULL); n++;
654 /* Set the useAsyncGeo on the shell */
655 XtSetArg (args[n], XmNuseAsyncGeometry, True); n++;
656 XtSetValues (shell, args, n);
658 delete_window = XmInternAtom (XtDisplay (shell), "WM_DELETE_WINDOW", False);
659 XmAddWMProtocolCallback (shell, delete_window, (XtCallbackProc)SystemClose,
660 (XtPointer)file_mgr_rec);
662 file_mgr_rec->main = mainWidget = XmCreateMainWindow (shell, "main", args, 1);
663 XtManageChild (mainWidget);
664 XtAddCallback(mainWidget, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
665 HELP_FILE_MANAGER_VIEW_STR);
668 /* Get the select color */
670 XtSetArg (args[0], XmNbackground, &background);
671 XtSetArg (args[1], XmNcolormap, &colormap);
672 XtGetValues (mainWidget, args, 2);
674 XmGetColors (XtScreen (mainWidget), colormap, background,
675 &foreground, &top_shadow, &bottom_shadow, &select);
677 /* Create the menu. */
682 file_mgr_rec->menuStates = 0;
683 file_mgr_rec->menu = menu = CreateTrashMenu (mainWidget, file_mgr_rec);
687 file_mgr_rec->menuStates = (RENAME | MOVE | DUPLICATE | LINK | TRASH |
688 MODIFY | CHANGEDIR | PREFERENCES | FILTER |
689 FIND | CREATE_DIR | CREATE_FILE | SETTINGS |
691 HOME | CHANGE_DIR | TERMINAL);
693 file_mgr_rec->menu = menu = CreateMenu (mainWidget, file_mgr_rec);
696 /* Create the work area frame. */
698 XtSetArg (args[0], XmNshadowThickness, 1);
699 XtSetArg (args[1], XmNshadowType, XmSHADOW_OUT);
700 XtSetArg (args[2], XmNmarginWidth, 5);
701 XtSetArg (args[3], XmNmarginHeight, 5);
702 work_frame = XmCreateFrame (mainWidget, "work_frame", args, 4);
703 XtManageChild (work_frame);
706 /* Create the current directory frame. */
709 XtSetArg (args[n], XmNshadowThickness, 1); n++;
710 XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
711 XtSetArg (args[n], XmNmarginWidth, 1); n++;
712 XtSetArg (args[n], XmNmarginHeight, 1); n++;
713 XtSetArg (args[n], XmNtextTranslations, trans_table); n++;
714 file_mgr_rec->header_frame = header_frame =
715 XmCreateForm (mainWidget, "header_frame", args, n);
717 XtAddCallback(header_frame, XmNhelpCallback,
718 (XtCallbackProc)HelpRequestCB,
719 HELP_FILE_MANAGER_VIEW_STR);
721 /* Create the current directory line only if not in showFilesystem. */
722 if (showFilesystem && !TrashView)
724 /* Create the iconic path */
726 XtSetArg (args[n], DtNfileMgrRec, file_mgr_rec); n++;
727 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
728 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
729 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
730 file_mgr_rec->iconic_path_da = iconic_path_da =
731 _DtCreateIconicPath(header_frame, "iconic_path", args, n);
732 XtManageChild (iconic_path_da);
733 file_mgr_rec->iconic_path_width = 0;
735 /* Create the separator between iconic path and current directory */
737 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
738 XtSetArg (args[n], XmNtopWidget, iconic_path_da); n++;
739 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
740 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
741 file_mgr_rec->header_separator = header_separator =
742 XmCreateSeparatorGadget(header_frame, "header_separator", args, n);
743 XtManageChild (header_separator);
745 /* Create a form for the current directory */
747 XtSetArg (args[n], XmNtextTranslations, trans_table); n++;
748 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
749 XtSetArg (args[n], XmNtopWidget, header_separator); n++;
750 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
751 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
752 file_mgr_rec->current_directory_frame = current_directory_frame =
753 XmCreateForm (header_frame, "current_directory_frame", args, n);
754 XtManageChild (file_mgr_rec->current_directory_frame);
756 /* Event handler for detecting drag threshold surpassed */
757 XtAddEventHandler(current_directory_frame,
758 Button1MotionMask|Button2MotionMask,
759 False, (XtEventHandler)CurrentDirectoryIconMotion,
762 /* Create the change directory drop zone. */
765 if (change_view_pixmap == XmUNSPECIFIED_PIXMAP)
768 _DtGetPixmap(XtScreen(current_directory_frame),
769 CHANGE_VIEW_ICON_S, foreground, background);
772 XtSetArg (args[n], XmNstring, NULL); n++;
773 XtSetArg (args[n], XmNshadowThickness, 2); n++;
774 XtSetArg (args[n], XmNfillOnArm, False); n++;
775 XtSetArg (args[n], XmNhighlightThickness, 0); n++;
776 XtSetArg (args[n], XmNpixmap, change_view_pixmap); n++;
777 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
778 XtSetArg (args[n], XmNtopOffset, 2); n++;
779 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
780 XtSetArg (args[n], XmNleftOffset, 5); n++;
781 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
782 XtSetArg (args[n], XmNbottomOffset, 2); n++;
783 XtSetArg (args[n], XmNtraversalOn, False); n++;
784 XtSetArg (args[n], XmNdropSiteOperations,
785 XmDROP_MOVE | XmDROP_COPY | XmDROP_LINK); n++;
786 file_mgr_rec->current_directory_drop = current_directory_drop =
787 _DtCreateIcon (current_directory_frame, "drop_cd", args, n);
789 XtAddCallback (current_directory_drop, XmNdropCallback,
790 DropOnChangeView, (XtPointer) file_mgr_rec);
793 file_mgr_rec->current_directory_drop = current_directory_drop = NULL;
795 /* Create the current directory icon. */
797 XtSetArg (args[n], XmNstring, NULL); n++;
798 XtSetArg (args[n], XmNimageName, SMALL_DIRECTORY_ICON); n++;
799 XtSetArg (args[n], XmNshadowThickness, 0); n++;
800 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
803 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
804 XtSetArg (args[n], XmNleftWidget, current_directory_drop); n++;
805 XtSetArg (args[n], XmNleftOffset, 0); n++;
809 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
810 XtSetArg (args[n], XmNleftOffset, 5); n++;
812 XtSetArg (args[n], XmNtraversalOn, False); n++;
813 file_mgr_rec->current_directory_icon = current_directory_icon =
814 _DtCreateIcon (current_directory_frame, "current_directory_icon",
817 /* Create the current directory line */
819 XtSetArg (args[n], XmNshadowThickness, 0); n++;
820 XtSetArg (args[n], XmNmarginWidth, 0); n++;
821 XtSetArg (args[n], XmNmarginHeight, 0); n++;
822 XtSetArg (args[n], XmNpushButtonEnabled, False); n++;
823 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
824 XtSetArg (args[n], XmNtopOffset, 1); n++;
825 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
826 XtSetArg (args[n], XmNleftOffset, 5); n++;
827 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
828 XtSetArg (args[n], XmNrightOffset, 1); n++;
829 XtSetArg (args[n], XmNtraversalOn, True); n++;
830 file_mgr_rec->current_directory =
831 XmCreateDrawnButton(current_directory_frame, "current_directory",
833 XtManageChild (file_mgr_rec->current_directory);
836 /* Create overlay text field, for typing in a new directory */
838 XtSetArg (args[n], XmNmarginHeight, 0); n++;
839 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
840 XtSetArg (args[n], XmNtopOffset, 1); n++;
841 XtSetArg (args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET);n++;
842 XtSetArg (args[n], XmNleftWidget,
843 file_mgr_rec->current_directory); n++;
844 XtSetArg (args[n], XmNleftOffset, 0); n++;
845 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET);n++;
846 XtSetArg (args[n], XmNbottomWidget,
847 file_mgr_rec->current_directory); n++;
848 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
849 XtSetArg (args[n], XmNrightOffset, 1); n++;
850 XtSetArg (args[n], XmNtraversalOn, True); n++;
851 file_mgr_rec->current_directory_text = XmCreateTextField(
852 current_directory_frame, FAST_RENAME, args, n);
855 * Make sure the font & highlight thickness of the text field is the
856 * same as the corresponding values for the current directory line.
858 XtSetArg (args[0], XmNhighlightThickness, &highlight_thickness);
859 XtSetArg (args[1], XmNfontList, &font_list);
860 XtGetValues (file_mgr_rec->current_directory, args, 2);
862 XtSetArg (args[0], XmNhighlightThickness, highlight_thickness);
863 XtSetArg (args[1], XmNfontList, font_list);
864 XtSetValues (file_mgr_rec->current_directory_text, args, 2);
867 * Calculate how high to make the current directory line by adding
868 * up the font height and the highlight and shadow thickness
870 XtSetArg (args[0], XmNshadowThickness, &shadow_thickness);
871 XtGetValues (file_mgr_rec->current_directory_text, args, 1);
873 entry_font = XmFontListEntryGetFont(FontListDefaultEntry(font_list), &type);
874 if(type == XmFONT_IS_FONTSET) {
875 extents = XExtentsOfFontSet((XFontSet)entry_font);
876 font_height = extents->max_logical_extent.height;
879 font_height = ((XFontStruct *)entry_font)->ascent +
880 ((XFontStruct *)entry_font)->descent;
882 curdir_height = font_height + 2*(highlight_thickness + shadow_thickness);
884 XtSetArg (args[0], XmNtopOffset, &cur_dir_offset);
885 XtGetValues (file_mgr_rec->current_directory, args, 1);
887 XtSetArg (args[0], XmNheight, curdir_height);
888 XtSetValues (file_mgr_rec->current_directory, args, 1);
890 XtSetArg (args[0], XmNheight, curdir_height + 2*cur_dir_offset);
891 XtSetValues (file_mgr_rec->current_directory_frame, args, 1);
893 XtAddCallback(file_mgr_rec->current_directory_text, XmNactivateCallback,
894 (XtCallbackProc)ChangeToNewDir, file_mgr_rec);
895 XtAddCallback(file_mgr_rec->current_directory_text, XmNhelpCallback,
896 (XtCallbackProc)HelpRequestCB,
897 HELP_FILE_MANAGER_VIEW_STR);
899 /* This code is here so the Text Path (used to be Fast Change Dir
900 text) will be checked if user is ever try to type on the portion
901 before his restricted path.
902 It's no longer needed because, there won't be anything since
903 I'm tryting to treat restrictMode the same way I treat restricted
904 directory (i.e. dtfile -restricted).
905 Why I want to treat them the same way? Because they are the
906 same sort of things and it, also, solves the iconic path problem.
907 Note that user can double click on one of the icon and to a directory
908 above the restricted directory.
912 /* add the callbacks to make sure the user isn't able to
913 go anywhere above their restricted directory */
914 XtAddCallback (file_mgr_rec->current_directory_text,
915 XmNmodifyVerifyCallback, (XtCallbackProc)TextChange,
917 XtAddCallback (file_mgr_rec->current_directory_text,
918 XmNmotionVerifyCallback, (XtCallbackProc)TextChange,
924 /* create the status line */
926 XtSetArg (args[n], XmNshadowThickness, 1); n++;
927 XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
928 XtSetArg (args[n], XmNmarginWidth, 5); n++;
929 XtSetArg (args[n], XmNmarginHeight, 1); n++;
930 status_form = XmCreateForm (mainWidget, "status_form", args, n);
931 XtManageChild (status_form);
934 XtSetArg (args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
935 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
936 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
937 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
938 file_mgr_rec->status_line =
939 XmCreateLabelGadget (status_form, "status_line", args, n);
940 XtManageChild (file_mgr_rec->status_line);
942 /* Associate the menu and frames with the appropriate */
943 /* areas of the main windows. */
945 XmMainWindowSetAreas (mainWidget, menu, file_mgr_rec->header_frame,
946 NULL, NULL, work_frame);
947 XtSetArg (args[0], XmNmessageWindow, status_form);
948 XtSetValues(mainWidget, args, 1);
950 /* Create the Scrolled Window for the file display area and */
951 /* set the scrollbars colors correctly. */
954 XtSetArg (args[n], XmNspacing, 2); n++;
955 XtSetArg (args[n], XmNscrollingPolicy, XmAUTOMATIC); n++;
956 XtSetArg (args[n], XmNscrollBarDisplayPolicy, XmAS_NEEDED); n++;
957 file_mgr_rec->scroll_window =
958 XmCreateScrolledWindow (work_frame, "scroll_window", args, n);
959 XtManageChild (file_mgr_rec->scroll_window);
961 XtAddCallback(file_mgr_rec->scroll_window, XmNhelpCallback,
962 (XtCallbackProc)HelpRequestCB,
963 HELP_TRASH_OVERVIEW_TOPIC_STR);
965 XtAddCallback(file_mgr_rec->scroll_window, XmNhelpCallback,
966 (XtCallbackProc)HelpRequestCB,
967 HELP_FILE_MANAGER_VIEW_STR);
969 /* Get the 2 scrollbars and reset their foreground to the proper color */
970 /* Also turn their traversal off and set the highlight thickness to 0. */
972 XtSetArg (args[0], XmNhorizontalScrollBar, &(file_mgr_rec->horizontal_scroll_bar));
973 XtSetArg (args[1], XmNverticalScrollBar, &(file_mgr_rec->vertical_scroll_bar));
974 XtGetValues (file_mgr_rec->scroll_window, args, 2);
976 XtSetArg (args[0], XmNforeground, background);
977 XtSetArg (args[1], XmNtraversalOn, True);
978 XtSetValues (file_mgr_rec->horizontal_scroll_bar, args, 2);
979 XtSetValues (file_mgr_rec->vertical_scroll_bar, args, 2);
982 /* Add an event handler to catch resizes occuring on the scrolled */
983 /* window, in order to force a relayout of the icons. */
985 XtAddEventHandler (file_mgr_rec->scroll_window, StructureNotifyMask,
986 False, (XtEventHandler)FileWindowResizeCallback,
988 XtAddEventHandler (shell, StructureNotifyMask,
989 False, (XtEventHandler)FileWindowMapCallback,
993 /* Create a drawing area as a child of the scrolled window */
996 XtSetArg (args[n], XmNmarginWidth, 0); n++;
997 XtSetArg (args[n], XmNmarginHeight, 0); n++;
998 XtSetArg (args[n], XmNresizePolicy, XmRESIZE_GROW); n++;
999 file_mgr_rec->file_window =
1000 XmCreateDrawingArea (file_mgr_rec->scroll_window, "file_window", args, n);
1001 XtAppAddActions( XtWidgetToApplicationContext(file_mgr_rec->file_window),
1003 XtNumber(FMAction));
1004 XtManageChild (file_mgr_rec->file_window);
1006 XtManageChild (file_mgr_rec->header_frame);
1008 XtSetArg (args[0], XmNbackground, select);
1009 XtSetValues (file_mgr_rec->file_window, args, 1);
1011 XtSetArg (args[0], XmNbackground, select);
1012 XtSetValues (XtParent (file_mgr_rec->file_window), args, 1);
1014 if(fileMgrPopup.menu == NULL)
1015 CreateFmPopup(file_mgr_rec->file_window);
1017 XmAddToPostFromList(fileMgrPopup.menu, file_mgr_rec->file_window);
1019 /* set up translations in main edit widget */
1020 #ifdef DOUBLE_CLICK_DRAG
1021 XtUninstallTranslations(file_mgr_rec->file_window);
1022 XtOverrideTranslations(file_mgr_rec->file_window,
1024 ((XmManagerClassRec *)XtClass(file_mgr_rec->file_window))
1025 ->manager_class.translations);
1026 XtOverrideTranslations(file_mgr_rec->file_window, trans_table1);
1027 XtOverrideTranslations(file_mgr_rec->file_window,
1028 XtParseTranslationTable(_XmDrawingA_traversalTranslations));
1030 XtOverrideTranslations(file_mgr_rec->file_window, trans_table1);
1033 /* Add the callbacks for processing selections, exposures, */
1034 /* and geometry changes of the drawing area. */
1036 XtAddCallback (file_mgr_rec->file_window, XmNexposeCallback,
1037 FileWindowExposeCallback, file_mgr_rec);
1039 XtAddCallback (file_mgr_rec->file_window, XmNinputCallback,
1040 FileWindowInputCallback, file_mgr_rec);
1042 /* Event handler for detecting drag threshold surpassed */
1043 XtAddEventHandler(file_mgr_rec->file_window,
1044 Button1MotionMask|Button2MotionMask,
1045 False, (XtEventHandler)FileIconMotion,
1048 /* Arrange for initial focus to be inside the file window */
1049 file_mgr_rec->focus_widget = file_mgr_rec->file_window;
1051 /* Set the return values for the dialog widget and dialog instance. */
1053 *return_widget = (Widget) mainWidget;
1054 *dialog = (XtPointer) file_mgr_rec;
1058 /************************************************************************
1062 ************************************************************************/
1065 GetDefaultValues( void )
1067 FileMgrData * file_mgr_data;
1068 PreferencesData *preferences_data;
1069 unsigned char *viewP;
1072 /* Allocate and initialize the default change dir dialog data. */
1074 file_mgr_data = (FileMgrData *) XtMalloc (sizeof (FileMgrData));
1076 file_mgr_data->displayed = False;
1077 file_mgr_data->mapped = False;
1078 file_mgr_data->x = 0;
1079 file_mgr_data->y = 0;
1081 file_mgr_data->busy_status = not_busy;
1082 file_mgr_data->busy_detail = 0;
1084 file_mgr_data->num_objects = 0;
1085 file_mgr_data->object_positions = NULL;
1086 file_mgr_data->grid_height = 0;
1087 file_mgr_data->grid_width = 0;
1088 file_mgr_data->layout_data = NULL;
1090 file_mgr_data->special_msg = NULL;
1091 file_mgr_data->msg_timer_id = 0;
1093 file_mgr_data->show_type = SINGLE_DIRECTORY;
1094 file_mgr_data->tree_files = TREE_FILES_NEVER;
1095 file_mgr_data->view_single = BY_NAME_AND_ICON;
1096 file_mgr_data->view_tree = BY_NAME_AND_SMALL_ICON;
1097 file_mgr_data->tree_preread_level = 1;
1098 file_mgr_data->tree_show_level = 1;
1099 file_mgr_data->show_iconic_path = True;
1100 file_mgr_data->show_current_dir = True;
1101 file_mgr_data->show_status_line = True;
1103 file_mgr_data->scrollToThisFile = NULL;
1104 file_mgr_data->scrollToThisDirectory = NULL;
1106 file_mgr_data->renaming = NULL;
1108 if(special_view && !TrashView)
1110 if(special_title != NULL)
1112 file_mgr_data->title = XtNewString(special_title);
1115 file_mgr_data->title = NULL;
1117 if(special_helpVol != NULL)
1119 file_mgr_data->helpVol = XtNewString(special_helpVol);
1120 XtFree(special_helpVol);
1121 special_helpVol = NULL;
1124 file_mgr_data->helpVol = XtNewString(fileMgrHelpVol);
1126 if(special_restricted != NULL)
1127 file_mgr_data->restricted_directory = special_restricted;
1129 file_mgr_data->restricted_directory = NULL;
1131 if(special_treeType == UNSET_VALUE)
1132 file_mgr_data->show_type = SINGLE_DIRECTORY;
1134 file_mgr_data->show_type = special_treeType;
1136 if(special_treeFiles == UNSET_VALUE)
1137 file_mgr_data->tree_files = TREE_FILES_NEVER;
1139 file_mgr_data->tree_files = special_treeFiles;
1141 if(file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1142 viewP = &file_mgr_data->view_tree;
1144 viewP = &file_mgr_data->view_single;
1145 if(special_viewType == UNSET_VALUE)
1146 file_mgr_data->view = *viewP;
1148 file_mgr_data->view = *viewP = special_viewType;
1150 if(special_orderType == UNSET_VALUE)
1151 file_mgr_data->order = ORDER_BY_ALPHABETICAL;
1153 file_mgr_data->order = special_orderType;
1155 if(special_directionType == UNSET_VALUE)
1156 file_mgr_data->direction = DIRECTION_ASCENDING;
1158 file_mgr_data->direction = special_directionType;
1160 if(special_randomType == UNSET_VALUE)
1161 file_mgr_data->positionEnabled = RANDOM_OFF;
1163 file_mgr_data->positionEnabled = special_randomType;
1168 if(fileMgrTitle == NULL)
1169 file_mgr_data->title = NULL;
1171 file_mgr_data->title = XtNewString(fileMgrTitle);
1173 file_mgr_data->helpVol = XtNewString(fileMgrHelpVol);
1175 if(treeType == UNSET_VALUE || TrashView)
1176 file_mgr_data->show_type = SINGLE_DIRECTORY;
1178 file_mgr_data->show_type = treeType;
1180 if(treeFiles == UNSET_VALUE)
1181 file_mgr_data->tree_files = TREE_FILES_NEVER;
1183 file_mgr_data->tree_files = treeFiles;
1185 if(file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1186 viewP = &file_mgr_data->view_tree;
1188 viewP = &file_mgr_data->view_single;
1189 if(viewType == UNSET_VALUE)
1190 file_mgr_data->view = *viewP;
1192 file_mgr_data->view = *viewP = viewType;
1194 if(orderType == UNSET_VALUE)
1195 file_mgr_data->order = ORDER_BY_ALPHABETICAL;
1197 file_mgr_data->order = orderType;
1199 if(directionType == UNSET_VALUE)
1200 file_mgr_data->direction = DIRECTION_ASCENDING;
1202 file_mgr_data->direction = directionType;
1204 if(randomType == UNSET_VALUE)
1205 file_mgr_data->positionEnabled = RANDOM_OFF;
1207 file_mgr_data->positionEnabled = randomType;
1209 file_mgr_data->restricted_directory = NULL;
1212 file_mgr_data->restoreKind = NORMAL_RESTORE;
1214 file_mgr_data->host = NULL;
1215 file_mgr_data->current_directory = NULL;
1216 file_mgr_data->branch_list = NULL;
1218 file_mgr_data->toolbox = False;
1219 file_mgr_data->dropSite = False;
1221 file_mgr_data->newSize = True;
1223 file_mgr_data->directory_count = 0;
1224 file_mgr_data->directory_set = NULL;
1225 file_mgr_data->tree_root = NULL;
1227 file_mgr_data->selection_list =
1228 (FileViewData **) XtMalloc (sizeof (FileViewData *));
1229 file_mgr_data->selection_list[0] = NULL;
1231 file_mgr_data->selection_table = NULL;
1232 file_mgr_data->selected_file_count = 0;
1234 file_mgr_data->fast_cd_enabled = False;
1235 file_mgr_data->show_hid_enabled = False;
1237 file_mgr_data->cd_inited = False;
1238 file_mgr_data->cd_font = NULL;
1239 file_mgr_data->cd_fontset = NULL;
1240 file_mgr_data->cd_normal_gc = 0;
1241 file_mgr_data->cd_select_gc = 0;
1242 file_mgr_data->cd_select = NULL;
1244 file_mgr_data->tree_solid_thin_gc = 0;
1245 file_mgr_data->tree_solid_thick_gc = 0;
1246 file_mgr_data->tree_dash_thin_gc = 0;
1247 file_mgr_data->tree_dash_thick_gc = 0;
1249 file_mgr_data->file_mgr_rec = NULL;
1250 file_mgr_data->popup_menu_icon = NULL;
1251 file_mgr_data->drag_file_view_data = NULL;
1253 file_mgr_data->change_dir = _DtGetDefaultDialogData (change_dir_dialog);
1254 file_mgr_data->preferences = _DtGetDefaultDialogData (preferences_dialog);
1256 /* now set up the preferences the way they really are */
1257 preferences_data = (PreferencesData *)file_mgr_data->preferences->data;
1258 preferences_data->show_type = file_mgr_data->show_type;
1259 preferences_data->tree_files = file_mgr_data->tree_files;
1260 preferences_data->view_single = file_mgr_data->view_single;
1261 preferences_data->view_tree = file_mgr_data->view_tree;
1262 preferences_data->order = file_mgr_data->order;
1263 preferences_data->direction = file_mgr_data->direction;
1264 preferences_data->positionEnabled = file_mgr_data->positionEnabled;
1265 preferences_data->show_iconic_path = file_mgr_data->show_iconic_path;
1266 preferences_data->show_current_dir = file_mgr_data->show_current_dir;
1267 preferences_data->show_status_line = file_mgr_data->show_status_line;
1269 file_mgr_data->filter_edit = _DtGetDefaultDialogData (filter_dialog);
1270 file_mgr_data->filter_active = _DtGetDefaultDialogData (filter_dialog);
1271 file_mgr_data->find = _DtGetDefaultDialogData (find_dialog);
1272 file_mgr_data->attr_dialog_list = NULL;
1273 file_mgr_data->attr_dialog_count = 0;
1274 file_mgr_data->secondaryHelpDialogList = NULL;
1275 file_mgr_data->secondaryHelpDialogCount = 0;
1276 file_mgr_data->primaryHelpDialog = NULL;
1278 return ((XtPointer) file_mgr_data);
1282 /************************************************************************
1286 ************************************************************************/
1290 XrmDatabase data_base,
1293 static Boolean first = True;
1294 FileMgrData * file_mgr_data;
1295 PreferencesData *preferences_data;
1297 char * directory_name;
1298 char * new_name_list[20];
1299 int name_list_count;
1300 struct passwd * pwInfo;
1310 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1311 SHOW_TYPE, StringToShowType, NULL, 0);
1312 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1313 TREE_FILES, StringToTreeFiles, NULL, 0);
1314 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1315 VIEW, StringToView, NULL, 0);
1316 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1317 ORDER, StringToOrder, NULL, 0);
1318 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1319 DIRECTION_RESRC, StringToDirection, NULL, 0);
1320 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1321 RANDOM, StringToRandom, NULL, 0);
1322 XtAppSetTypeConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1323 BRANCH_LIST, (XtTypeConverter)StringToBranchList,
1324 NULL, 0, XtCacheNone, NULL);
1325 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1326 SELECTION_LIST, (XtConverter)StringToSelectionList,
1331 /* Allocate and get the resources for change dir dialog data. */
1333 file_mgr_data = (FileMgrData *) XtMalloc (sizeof (FileMgrData));
1335 file_mgr_data->busy_status = not_busy;
1336 file_mgr_data->busy_detail = 0;
1337 file_mgr_data->num_objects = 0;
1338 file_mgr_data->object_positions = NULL;
1339 file_mgr_data->grid_height = 0;
1340 file_mgr_data->grid_width = 0;
1341 file_mgr_data->layout_data = NULL;
1342 file_mgr_data->secondaryHelpDialogList = NULL;
1343 file_mgr_data->secondaryHelpDialogCount = 0;
1344 file_mgr_data->attr_dialog_count = 0;
1345 file_mgr_data->attr_dialog_list = NULL;
1346 file_mgr_data->primaryHelpDialog = NULL;
1347 file_mgr_data->popup_menu_icon = NULL;
1348 file_mgr_data->title = NULL;
1349 file_mgr_data->helpVol = NULL;
1350 file_mgr_data->restricted_directory = NULL;
1351 file_mgr_data->toolbox = False;
1352 file_mgr_data->dropSite = False;
1353 file_mgr_data->tree_preread_level = 1; /* @@@ make these resources? */
1354 file_mgr_data->tree_show_level = 1;
1355 file_mgr_data->tree_files = TREE_FILES_NEVER;
1356 file_mgr_data->special_msg = NULL;
1357 file_mgr_data->msg_timer_id = 0;
1358 file_mgr_data->show_iconic_path = True;
1359 file_mgr_data->show_current_dir = True;
1360 file_mgr_data->show_status_line = True;
1361 file_mgr_data->scrollToThisFile = NULL;
1362 file_mgr_data->scrollToThisDirectory = NULL;
1363 file_mgr_data->renaming = NULL;
1365 _DtDialogGetResources (data_base, name_list, FILEMGR, (char *)file_mgr_data,
1366 resources, fileMgrClass->resource_count);
1367 if (file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1368 file_mgr_data->view = file_mgr_data->view_tree;
1370 file_mgr_data->view = file_mgr_data->view_single;
1372 /* Bases on the type of restore session we are doing we must
1373 * adjust the host, current_directory, and selections to the
1374 * proper values (e.g. restore session or restore settings)
1376 if (restoreType != NORMAL_RESTORE)
1378 GetSessionDir(file_mgr_data);
1380 /* Adjust the selected files to null */
1381 file_mgr_data->selection_list = NULL;
1383 /* Set the Displayed to false so we do not use the x and y
1384 values when we place the window in showDialog
1386 file_mgr_data->displayed = False;
1388 if(special_view && !TrashView)
1390 if(special_title != NULL)
1391 file_mgr_data->title = XtNewString(special_title);
1393 file_mgr_data->title = XtNewString(file_mgr_data->title);
1395 if(special_helpVol != NULL)
1396 file_mgr_data->helpVol = XtNewString(special_helpVol);
1398 file_mgr_data->helpVol = XtNewString(file_mgr_data->helpVol);
1400 if(special_treeType != UNSET_VALUE)
1401 file_mgr_data->show_type = special_treeType;
1403 if(special_treeFiles != UNSET_VALUE)
1404 file_mgr_data->tree_files = special_treeFiles;
1406 if(special_viewType != UNSET_VALUE)
1408 file_mgr_data->view = special_viewType;
1409 if(file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1410 file_mgr_data->view_tree = special_viewType;
1412 file_mgr_data->view_single = special_viewType;
1415 if(special_orderType != UNSET_VALUE)
1416 file_mgr_data->order = special_orderType;
1418 if(special_directionType != UNSET_VALUE)
1419 file_mgr_data->direction = special_directionType;
1421 if(special_randomType != UNSET_VALUE)
1422 file_mgr_data->positionEnabled = special_randomType;
1426 file_mgr_data->title = XtNewString(file_mgr_data->title);
1427 file_mgr_data->helpVol = XtNewString(file_mgr_data->helpVol);
1432 GetSessionDir(file_mgr_data);
1434 file_mgr_data->title = XtNewString(file_mgr_data->title);
1435 file_mgr_data->helpVol = XtNewString(file_mgr_data->helpVol);
1438 /* The GetSessionDir() function depends on the hostname being set. */
1439 /* So, we'll do it earlier */
1440 if(file_mgr_data->host != NULL)
1441 file_mgr_data->host = XtNewString(file_mgr_data->host);
1443 file_mgr_data->host = XtNewString(home_host_name);
1445 file_mgr_data->restoreKind = NORMAL_RESTORE;
1447 file_mgr_data->directory_count = 0;
1448 file_mgr_data->directory_set = NULL;
1449 file_mgr_data->tree_root = NULL;
1451 file_mgr_data->selected_file_count = 0;
1452 file_mgr_data->selection_table = (char **) file_mgr_data->selection_list;
1453 file_mgr_data->selection_list =
1454 (FileViewData **) XtMalloc (sizeof (FileViewData *));
1455 file_mgr_data->selection_list[0] = NULL;
1457 file_mgr_data->cd_inited = False;
1458 file_mgr_data->cd_font = NULL;
1459 file_mgr_data->cd_fontset = NULL;
1460 file_mgr_data->cd_normal_gc = 0;
1461 file_mgr_data->cd_select_gc = 0;
1462 file_mgr_data->cd_select = NULL;
1464 file_mgr_data->popup_menu_icon = NULL;
1465 file_mgr_data->drag_file_view_data = NULL;
1467 file_mgr_data->tree_solid_thin_gc = 0;
1468 file_mgr_data->tree_solid_thick_gc = 0;
1469 file_mgr_data->tree_dash_thin_gc = 0;
1470 file_mgr_data->tree_dash_thick_gc = 0;
1472 host_name = XtNewString (file_mgr_data->host);
1473 directory_name = XtNewString (file_mgr_data->current_directory);
1475 FileMgrBuildDirectories (file_mgr_data, host_name, directory_name);
1477 XtFree ((char *) host_name);
1479 XtFree ((char *) directory_name);
1481 if (restoreType == NORMAL_RESTORE &&
1482 file_mgr_data->positionEnabled == RANDOM_ON)
1484 /* Restore the optional positional data */
1485 RestorePositionalData(data_base, name_list, file_mgr_data, FILEMGR);
1489 /* Get a copy of the name list to be used to build new name lists. */
1491 _DtDuplicateDialogNameList(name_list, new_name_list, 20, &name_list_count);
1493 /* Load sub-dialogs */
1495 /* Get secondary help dialogs */
1496 if(restoreType == NORMAL_RESTORE &&
1497 file_mgr_data->secondaryHelpDialogCount > 0)
1499 _DtLoadSubdialogArray(new_name_list, name_list_count,
1500 &(file_mgr_data->secondaryHelpDialogList),
1501 file_mgr_data->secondaryHelpDialogCount,
1502 help_dialog, data_base, 1);
1506 file_mgr_data->secondaryHelpDialogList = NULL;
1507 file_mgr_data->secondaryHelpDialogCount = 0;
1510 /* Get primary help dialog */
1511 new_name_list[name_list_count] = number;
1512 new_name_list[name_list_count + 1] = NULL;
1513 sprintf(number, "%d", 0);
1514 if (restoreType == NORMAL_RESTORE)
1516 file_mgr_data->primaryHelpDialog =
1517 _DtGetResourceDialogData(help_dialog, data_base, new_name_list);
1518 if(((DialogInstanceData *)
1519 (file_mgr_data->primaryHelpDialog->data))->displayed == False)
1521 _DtFreeDialogData( file_mgr_data->primaryHelpDialog );
1522 file_mgr_data->primaryHelpDialog = NULL;
1526 file_mgr_data->primaryHelpDialog = NULL;
1528 if (restoreType == NORMAL_RESTORE &&
1529 file_mgr_data->attr_dialog_count > 0)
1531 /* Get properties dialogs */
1532 _DtLoadSubdialogArray(new_name_list, name_list_count,
1533 &(file_mgr_data->attr_dialog_list),
1534 file_mgr_data->attr_dialog_count,
1535 mod_attr_dialog, data_base, 1);
1539 file_mgr_data->attr_dialog_list = NULL;
1540 file_mgr_data->attr_dialog_count = 0;
1542 new_name_list[name_list_count] = NULL;
1544 file_mgr_data->change_dir =
1545 _DtGetResourceDialogData (change_dir_dialog, data_base, name_list);
1547 file_mgr_data->preferences =
1548 _DtGetResourceDialogData (preferences_dialog, data_base, name_list);
1550 /* Set all dialogs displayed flag for change_dir, and preferences
1551 * to false if not NORMAL_RESTORE
1553 if (restoreType != NORMAL_RESTORE)
1555 ((DialogInstanceData *)
1556 (file_mgr_data->change_dir->data))->displayed = False;
1558 ((DialogInstanceData *)
1559 (file_mgr_data->preferences->data))->displayed = False;
1562 /* now set up the preferences the way they really are */
1563 preferences_data = (PreferencesData *)file_mgr_data->preferences->data;
1564 preferences_data->show_type = file_mgr_data->show_type;
1565 preferences_data->tree_files = file_mgr_data->tree_files;
1566 preferences_data->view_single = file_mgr_data->view_single;
1567 preferences_data->view_tree = file_mgr_data->view_tree;
1568 preferences_data->order = file_mgr_data->order;
1569 preferences_data->direction = file_mgr_data->direction;
1570 preferences_data->positionEnabled = file_mgr_data->positionEnabled;
1571 preferences_data->show_iconic_path = file_mgr_data->show_iconic_path;
1572 preferences_data->show_current_dir = file_mgr_data->show_current_dir;
1573 preferences_data->show_status_line = file_mgr_data->show_status_line;
1575 /* Build the name list for the file dialog that is displayed, */
1576 /* get resource data and perform and other initialization. */
1578 tmpStr = GetSharedMessage(FILTER_EDIT_ID_STRING);
1579 new_name_list[name_list_count] = XtNewString (tmpStr);
1580 new_name_list[name_list_count + 1] = NULL;
1582 file_mgr_data->filter_edit =
1583 _DtGetResourceDialogData (filter_dialog, data_base, new_name_list);
1585 XtFree ((char *) new_name_list[name_list_count]);
1586 new_name_list[name_list_count] = NULL;
1589 /* Build the name list for the filter dialog that is used for the */
1590 /* current processing values. Get the resource data and perform */
1591 /* and other initialization. */
1593 tmpStr = GetSharedMessage(FILTER_ACTIVE_ID_STRING);
1594 new_name_list[name_list_count] = XtNewString (tmpStr);
1595 new_name_list[name_list_count + 1] = NULL;
1597 file_mgr_data->filter_active =
1598 _DtGetResourceDialogData (filter_dialog, data_base, new_name_list);
1600 XtFree ((char *) new_name_list[name_list_count]);
1601 new_name_list[name_list_count] = NULL;
1603 /* Get the resource data for the find dialog and perform */
1604 /* additional initialization. */
1606 file_mgr_data->find =
1607 _DtGetResourceDialogData (find_dialog, data_base, name_list);
1610 /* Set the FilterDialog and Find dialog displayed flag to false if
1611 * not NORMAL_RESTORE
1614 if (restoreType != NORMAL_RESTORE)
1616 ((DialogInstanceData *)
1617 (file_mgr_data->filter_edit->data))->displayed = False;
1619 ((DialogInstanceData *)
1620 (file_mgr_data->find->data))->displayed = False;
1624 return ((XtPointer) file_mgr_data);
1627 /************************************************************************
1631 ************************************************************************/
1635 FileMgrRec *file_mgr_rec,
1636 FileMgrData *file_mgr_data )
1638 Widget cd = file_mgr_rec->current_directory;
1639 Widget cdi = file_mgr_rec->current_directory_icon;
1640 Widget cdd = file_mgr_rec->current_directory_drop;
1642 XmFontList font_list;
1643 XtPointer entry_font;
1647 XGCValues gc_values;
1649 ChangeDirData * change_dir_data;
1650 ModAttrRec *modAttr_rec;
1651 DialogData *attr_dialog;
1652 ModAttrData *attr_data;
1658 DirectorySet ** directory_set;
1659 FileViewData ** order_list;
1660 int directory_count;
1664 char *tmpStr, *tempStr;
1666 PixmapData *pixmapData;
1668 file_mgr_data->file_mgr_rec = (XtPointer) file_mgr_rec;
1670 /* this is what we did for the ultrix port to get the name of the
1671 Application dir right, BUT it has some bugs */
1672 if(file_mgr_data->title != NULL)
1674 XtSetArg (args[0], XmNtitle, file_mgr_data->title);
1675 XtSetValues(file_mgr_rec->shell, args, 1);
1678 /* Set up the callbacks for the current directory line only if
1679 not in showFilesystem. */
1681 if(showFilesystem && !TrashView)
1683 XtRemoveAllCallbacks (cd, XmNarmCallback);
1684 XtAddCallback (cd, XmNarmCallback, CurrentDirSelected, file_mgr_rec);
1686 XtRemoveAllCallbacks (cd, XmNexposeCallback);
1687 XtAddCallback (cd, XmNexposeCallback, CurrentDirExposed, file_mgr_rec);
1689 XtRemoveAllCallbacks (cdi, XmNcallback);
1690 XtAddCallback (cdi, XmNcallback, CurrentDirIconCallback, file_mgr_rec);
1694 XtRemoveAllCallbacks (cdd, XmNcallback);
1695 XtAddCallback (cdd, XmNcallback, CurrentDirDropCallback, file_mgr_rec);
1698 DtUpdateIconicPath(file_mgr_rec, file_mgr_data, False);
1702 * To help our menu callbacks get the file_mgr_rec when they are
1703 * activated, we will register the file_mgr_rec pointer as the
1704 * user_data for the menubar. That way, since the callbacks can
1705 * find out which menubar they were invoked from, they can easily
1706 * map this into the file_mgr_rec.
1708 XtSetArg(args[0], XmNuserData, file_mgr_rec);
1709 XtSetValues(file_mgr_rec->menu, args, 1);
1710 if(fileMgrPopup.menu != NULL)
1711 XtSetValues(fileMgrPopup.menu, args, 1);
1715 * Adjust some widgets, in case this is a recycled dialog, which
1716 * previously had been used as a desktop view, or vice-versa.
1719 XtManageChild(file_mgr_rec->header_frame);
1720 XtManageChild(file_mgr_rec->directoryBarBtn);
1723 if(showFilesystem && !TrashView)
1726 XtSetArg (args[0], XmNallowShellResize, False);
1727 XtSetValues(file_mgr_rec->shell, args, 1);
1730 widg = file_mgr_rec->directoryBarBtn;
1733 XtSetArg (args[0], XmNforeground, &foreground);
1734 XtSetArg (args[1], XmNbackground, &background);
1735 XtSetArg (args[2], XmNfontList, &font_list);
1736 XtGetValues (widg, args, 3);
1738 /* If the current_directory data has not been initialized */
1739 /* for this data record, do it now. */
1741 if (file_mgr_data->cd_inited == False)
1743 file_mgr_data->cd_inited = True;
1745 entry_font = XmFontListEntryGetFont(FontListDefaultEntry(font_list), &type);
1746 if(type == XmFONT_IS_FONTSET) {
1747 file_mgr_data->cd_fontset = (XFontSet)entry_font;
1748 file_mgr_data->cd_fonttype = XmFONT_IS_FONTSET;
1749 gc_mask = GCForeground | GCBackground;
1752 file_mgr_data->cd_font = (XFontStruct *)entry_font;
1753 file_mgr_data->cd_fonttype = XmFONT_IS_FONT;
1754 gc_values.font = ((XFontStruct *)entry_font)->fid;
1755 gc_mask = GCForeground | GCBackground | GCFont;
1758 gc_values.foreground = foreground;
1759 gc_values.background = background;
1760 file_mgr_data->cd_normal_gc = XtGetGC (widg, gc_mask, &gc_values);
1762 gc_values.foreground = background;
1763 gc_values.background = foreground;
1764 file_mgr_data->cd_select_gc = XtGetGC (widg, gc_mask, &gc_values);
1766 /* graphics contexts for drawing tree lines */
1767 gc_values.foreground = foreground;
1768 XtSetArg (args[0], XmNbackground, &gc_values.background);
1769 XtGetValues (file_mgr_rec->file_window, args, 1);
1770 gc_values.line_width = 2;
1771 gc_values.line_style = LineOnOffDash;
1772 gc_values.cap_style = CapNotLast;
1773 gc_values.dashes = TREE_DASH_WIDTH;
1775 gc_mask |= GCCapStyle;
1777 file_mgr_data->tree_solid_thin_gc =
1778 XtGetGC (widg, gc_mask, &gc_values);
1779 file_mgr_data->tree_solid_thick_gc =
1780 XtGetGC (widg, gc_mask | GCLineWidth, &gc_values);
1781 file_mgr_data->tree_dash_thin_gc =
1782 XtGetGC (widg, gc_mask | GCLineStyle | GCDashList, &gc_values);
1783 file_mgr_data->tree_dash_thick_gc =
1784 XtGetGC (widg, gc_mask | GCLineWidth |
1785 GCLineStyle | GCDashList, &gc_values);
1789 if(showFilesystem && !TrashView)
1791 /* Set the current directory icon to normal colors */
1792 SetToNormalColors (file_mgr_rec->current_directory_icon,
1793 file_mgr_rec->file_window, file_mgr_rec->main, 0);
1796 /* Update the Change Directory host name */
1797 change_dir_data = (ChangeDirData *) file_mgr_data->change_dir->data;
1798 if (change_dir_data->host_name != NULL)
1799 XtFree ((char *) change_dir_data->host_name);
1800 change_dir_data->host_name = XtNewString (file_mgr_data->host);
1802 /* Display the correct small directory icon */
1803 pixmapData = GetPixmapData(file_mgr_rec,
1805 file_mgr_data->current_directory,
1808 XtSetArg (args[0], XmNimageName, pixmapData->iconFileName);
1810 XtSetArg (args[0], XmNimageName, NULL);
1811 XtSetValues(cdi, args, 1);
1813 _DtCheckAndFreePixmapData(
1814 GetDirectoryLogicalType(file_mgr_data,
1815 file_mgr_data->current_directory),
1816 file_mgr_rec->shell,
1820 if(file_mgr_data->restricted_directory == NULL)
1821 textString = XtNewString(file_mgr_data->current_directory);
1826 ptr = file_mgr_data->current_directory +
1827 strlen(file_mgr_data->restricted_directory);
1828 if(strcmp(ptr, "") == 0)
1829 textString = XtNewString( "/" );
1831 textString = XtNewString( ptr );
1833 XmTextFieldSetString(file_mgr_rec->current_directory_text, textString);
1835 /* Clear the change dir text field */
1836 if (file_mgr_data->fast_cd_enabled)
1837 XtManageChild(file_mgr_rec->current_directory_text);
1839 XtUnmanageChild(file_mgr_rec->current_directory_text);
1840 XtSetArg (args[0], XmNallowShellResize, True);
1841 XtSetValues(file_mgr_rec->shell, args, 1);
1846 /* Get the file set displayed */
1847 FileMgrRedisplayFiles (file_mgr_rec, file_mgr_data, True);
1850 /* Set the icon name for this view to the directory name. */
1851 SetIconAttributes ((FileMgrRec *)file_mgr_data->file_mgr_rec, file_mgr_data,
1852 file_mgr_data->current_directory);
1855 /* Process the selection table into a selection list */
1857 if (file_mgr_data->selection_table != NULL)
1859 DeselectAllFiles (file_mgr_data);
1861 directory_set = file_mgr_data->directory_set;
1863 if (file_mgr_data->show_type == SINGLE_DIRECTORY)
1864 directory_count = 1;
1866 directory_count = file_mgr_data->directory_count;
1869 while (file_mgr_data->selection_table[i] != NULL)
1871 for (j = 0; j < directory_count; j++)
1873 if (strncmp (directory_set[j]->name,
1874 file_mgr_data->selection_table[i],
1875 strlen (directory_set[j]->name)) == 0)
1877 file_name = strrchr(file_mgr_data->selection_table[i], '/') +1;
1878 order_list = directory_set[j]->order_list;
1880 for (k = 0; k < directory_set[j]->file_count; k++)
1882 if (strcmp (file_name,
1883 order_list[k]->file_data->file_name) == 0)
1885 if (order_list[k]->filtered == False)
1886 SelectFile (file_mgr_data, order_list[k]);
1896 file_mgr_data->selection_table = NULL;
1899 /* Initially, all menubuttons are sensitive */
1901 file_mgr_rec->menuStates = (RENAME | MOVE | DUPLICATE | LINK | TRASH |
1902 MODIFY | CHANGEDIR | PREFERENCES | FILTER |
1903 FIND | CREATE_DIR | CREATE_FILE | SETTINGS |
1904 CLEAN_UP | MOVE_UP |
1905 HOME | CHANGE_DIR | TERMINAL);
1907 if(file_mgr_data != trashFileMgrData
1908 && file_mgr_data != NULL )
1910 if (file_mgr_data->selected_file_count == 0)
1911 ActivateNoSelect (file_mgr_rec);
1912 else if (file_mgr_data->selected_file_count == 1)
1913 ActivateSingleSelect (file_mgr_rec,
1914 file_mgr_data->selection_list[0]->file_data->logical_type);
1916 ActivateMultipleSelect (file_mgr_rec);
1919 SensitizeTrashBtns();
1921 /* Display any dialogs that need to be displayed */
1922 if (((DialogInstanceData *)
1923 (file_mgr_data->change_dir->data))->displayed == True)
1925 ShowChangeDirDialog ((Widget)NULL, (XtPointer)file_mgr_rec,
1929 file_mgr_rec->menuStates |= CHANGEDIR;
1932 if (((DialogInstanceData *)
1933 (file_mgr_data->preferences->data))->displayed == True)
1935 ShowPreferencesDialog ((Widget)NULL, (XtPointer)file_mgr_rec,
1939 file_mgr_rec->menuStates |= PREFERENCES;
1941 if (((DialogInstanceData *)
1942 (file_mgr_data->find->data))->displayed == True)
1944 ShowFindDialog ((Widget)NULL, (XtPointer)file_mgr_rec, (XtPointer)NULL);
1947 file_mgr_rec->menuStates |= FIND;
1950 if (((DialogInstanceData *)
1951 (file_mgr_data->filter_edit->data))->displayed == True)
1953 ShowFilterDialog ((Widget)NULL, (XtPointer)file_mgr_rec, (XtPointer)NULL);
1956 file_mgr_rec->menuStates |= FILTER;
1958 /* Display any properties dialogs */
1959 for (i = 0; i < file_mgr_data->attr_dialog_count; i++)
1961 if (((DialogInstanceData *)
1962 (file_mgr_data->attr_dialog_list[i]->data))->displayed == False)
1968 attr_dialog = (DialogData *)file_mgr_data->attr_dialog_list[i];
1969 attr_data = (ModAttrData *) attr_dialog->data;
1971 loadOk = LoadFileAttributes(attr_data->host, attr_data->directory,
1972 attr_data->name, attr_data);
1977 /* We need the file_mgr_rec inside the create routine so
1978 * we attach it here for use later.
1980 ((ModAttrData *) (file_mgr_data->attr_dialog_list[i]->data))->
1981 main_widget = file_mgr_rec->main;
1983 _DtShowDialog (file_mgr_rec->shell, NULL, (XtPointer)file_mgr_rec,
1984 file_mgr_data->attr_dialog_list[i],
1985 ModAttrChange, (XtPointer)file_mgr_rec, ModAttrClose,
1986 (XtPointer)file_mgr_rec, NULL, False, False, NULL, NULL);
1988 modAttr_rec = (ModAttrRec *)_DtGetDialogInstance(
1989 file_mgr_data->attr_dialog_list[i]);
1991 if(file_mgr_data->title != NULL &&
1992 strcmp(file_mgr_data->helpVol, DTFILE_HELP_NAME) != 0)
1994 tmpStr = GETMESSAGE(21, 1, "File Permissions");
1995 tempStr = (char *)XtMalloc(strlen(tmpStr) +
1996 strlen(file_mgr_data->title) + 5);
1997 sprintf(tempStr, "%s - %s", file_mgr_data->title, tmpStr);
2001 tmpStr = (GETMESSAGE(21,34, "File Manager - Permissions"));
2002 tempStr = XtNewString(tmpStr);
2004 XtSetArg (args[0], XmNtitle, tempStr);
2005 XtSetValues (modAttr_rec->shell, args, 1);
2010 /* The object would have got deleted and hence we are not able to
2013 ModAttrFreeValues(attr_data);
2014 XtFree((char *)attr_dialog);
2015 file_mgr_data->attr_dialog_count--;
2016 if(file_mgr_data->attr_dialog_count >0)
2017 file_mgr_data->attr_dialog_list = (DialogData **) XtRealloc(
2018 (char *) file_mgr_data->attr_dialog_list,
2019 sizeof(DialogData *) * file_mgr_data->attr_dialog_count);
2022 XtFree((char *)file_mgr_data->attr_dialog_list);
2023 file_mgr_data->attr_dialog_list = NULL;
2028 /* Display any secondary help dialogs */
2029 for (i = 0; i < file_mgr_data->secondaryHelpDialogCount; i++)
2031 ShowHelpDialog(file_mgr_rec->shell, (XtPointer)file_mgr_rec,
2033 file_mgr_data->secondaryHelpDialogList[i], NULL, NULL,
2037 /* Display the primary help dialog, if active */
2038 if (file_mgr_data->primaryHelpDialog && ((DialogInstanceData *)
2039 (file_mgr_data->primaryHelpDialog->data))->displayed == True)
2041 ShowHelpDialog(file_mgr_rec->shell, (XtPointer)file_mgr_rec,
2043 file_mgr_data->primaryHelpDialog, NULL, NULL, NULL,
2052 /************************************************************************
2054 * WriteResourceValues
2056 ************************************************************************/
2059 WriteResourceValues(
2064 FileMgrData * file_mgr_data = (FileMgrData *) values->data;
2065 FileMgrRec * file_mgr_rec;
2066 char * new_name_list[20];
2067 int name_list_count;
2073 /* If the dialog is currently displayed, update the geometry */
2074 /* fields to their current values. */
2076 if (file_mgr_data->displayed == True)
2078 _DtGenericUpdateWindowPosition(values);
2079 file_mgr_rec = (FileMgrRec *) _DtGetDialogInstance (values);
2083 /* save FILEMGR resources */
2084 /* store netfile version of current directory name */
2086 if ( file_mgr_data->current_directory && file_mgr_data->toolbox )
2089 char *user_session_str = NULL;
2092 current_host = file_mgr_data->host;
2093 user_session_str = getenv("DTUSERSESSION");
2094 ptr = strstr(file_mgr_data->current_directory, user_session_str);
2098 file_mgr_data->host = XtNewString(file_mgr_data->current_directory);
2099 *ptr = user_session_str[0];
2103 file_mgr_data->host = XtNewString(file_mgr_data->current_directory);
2106 _DtDialogPutResources (fd, name_list, FILEMGR, values->data,
2107 resources, fileMgrClass->resource_count);
2109 XtFree(file_mgr_data->host);
2110 file_mgr_data->host = current_host;
2114 _DtDialogPutResources (fd, name_list, FILEMGR, values->data,
2115 resources, fileMgrClass->resource_count);
2119 /* Save the optional positional data if needed, if file_mgr_data->host
2120 is set to NULL, this is from a save settings, don't save the position
2123 SavePositionalData(fd, file_mgr_data, name_list, FILEMGR);
2126 /* Get a copy of the name list to be used to build new name lists */
2127 _DtDuplicateDialogNameList(name_list, new_name_list, 20, &name_list_count);
2129 /* Write out all of the dialogs */
2131 _DtWriteDialogData (file_mgr_data->change_dir, fd, name_list);
2132 _DtWriteDialogData (file_mgr_data->preferences, fd, name_list);
2135 /* Save any properties dialogs */
2136 _DtSaveSubdialogArray(new_name_list, name_list_count,
2137 file_mgr_data->attr_dialog_list,
2138 file_mgr_data->attr_dialog_count, fd, 1);
2140 /* Save any secondary help dialogs */
2141 _DtSaveSubdialogArray(new_name_list, name_list_count,
2142 file_mgr_data->secondaryHelpDialogList,
2143 file_mgr_data->secondaryHelpDialogCount, fd, 1);
2145 /* Save the primary help dialog, if active */
2146 if (file_mgr_data->primaryHelpDialog)
2148 new_name_list[name_list_count] = number;
2149 new_name_list[name_list_count + 1] = NULL;
2150 sprintf(number, "%d", 0);
2151 _DtWriteDialogData(file_mgr_data->primaryHelpDialog, fd, new_name_list);
2154 tmpStr = GetSharedMessage(FILTER_EDIT_ID_STRING);
2155 new_name_list[name_list_count] = XtNewString (tmpStr);
2156 new_name_list[name_list_count + 1] = NULL;
2157 _DtWriteDialogData (file_mgr_data->filter_edit, fd, new_name_list);
2158 XtFree ((char *) new_name_list[name_list_count]);
2159 new_name_list[name_list_count] = NULL;
2161 tmpStr = GetSharedMessage(FILTER_ACTIVE_ID_STRING);
2162 new_name_list[name_list_count] = XtNewString (tmpStr);
2163 new_name_list[name_list_count + 1] = NULL;
2164 _DtWriteDialogData (file_mgr_data->filter_active, fd, new_name_list);
2165 XtFree ((char *) new_name_list[name_list_count]);
2166 new_name_list[name_list_count] = NULL;
2168 _DtWriteDialogData (file_mgr_data->find, fd, name_list);
2174 /************************************************************************
2177 * Free up space allocated by the FileMgr dialog. This
2178 * includes sub directory information, and attached dialog data.
2180 * Note: this routine frees the FileMgrData, not the FileMgrRec
2181 * (the FileMgrRec data structure will be reused by the dialog
2182 * caching code for the next dtfile window the user might open)
2184 ************************************************************************/
2188 FileMgrData *file_mgr_data )
2192 FileMgrRec *file_mgr_rec;
2194 if (file_mgr_data == NULL)
2197 file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
2199 FreeDirectoryData (file_mgr_data);
2201 if (file_mgr_data->branch_list != NULL)
2203 for (i = 0; file_mgr_data->branch_list[i]; i++)
2204 XtFree (file_mgr_data->branch_list[i]);
2205 XtFree ((char *) file_mgr_data->branch_list);
2206 file_mgr_data->branch_list = NULL;
2209 if (file_mgr_data->selection_list != NULL)
2211 XtFree ((char *) file_mgr_data->selection_list);
2212 file_mgr_data->selection_list = NULL;
2215 if (file_mgr_data->cd_select != NULL)
2217 XtFree ((char *) file_mgr_data->cd_select);
2218 file_mgr_data->cd_select = NULL;
2221 if (file_mgr_data->desktop_file != NULL)
2223 XtFree ((char *) file_mgr_data->desktop_file);
2224 file_mgr_data->desktop_file = NULL;
2228 XtFree(file_mgr_data->special_msg);
2229 file_mgr_data->special_msg = NULL;
2230 if (file_mgr_data->msg_timer_id)
2231 XtRemoveTimeOut(file_mgr_data->msg_timer_id);
2233 _DtDestroySubdialog(file_mgr_data->change_dir);
2234 _DtDestroySubdialog(file_mgr_data->preferences);
2235 _DtDestroySubdialog(file_mgr_data->filter_edit);
2236 _DtDestroySubdialog(file_mgr_data->filter_active);
2237 _DtDestroySubdialog(file_mgr_data->find);
2238 _DtDestroySubdialogArray(file_mgr_data->attr_dialog_list,
2239 file_mgr_data->attr_dialog_count);
2240 _DtDestroySubdialogArray(file_mgr_data->secondaryHelpDialogList,
2241 file_mgr_data->secondaryHelpDialogCount);
2242 _DtDestroySubdialog(file_mgr_data->primaryHelpDialog);
2245 && file_mgr_data != trashFileMgrData
2246 && file_mgr_data != NULL )
2248 /* Free up the GC's we got in SetValues */
2249 if(file_mgr_data->cd_normal_gc != NULL)
2250 XtReleaseGC(file_mgr_rec->current_directory,
2251 file_mgr_data->cd_normal_gc);
2252 if(file_mgr_data->cd_select_gc != NULL)
2253 XtReleaseGC(file_mgr_rec->current_directory_icon,
2254 file_mgr_data->cd_select_gc);
2256 if(file_mgr_data->tree_solid_thin_gc != NULL)
2257 XtReleaseGC(file_mgr_rec->current_directory_icon,
2258 file_mgr_data->tree_solid_thin_gc);
2259 if(file_mgr_data->tree_solid_thick_gc != NULL)
2260 XtReleaseGC(file_mgr_rec->current_directory_icon,
2261 file_mgr_data->tree_solid_thick_gc);
2262 if(file_mgr_data->tree_dash_thin_gc != NULL)
2263 XtReleaseGC(file_mgr_rec->current_directory_icon,
2264 file_mgr_data->tree_dash_thin_gc);
2265 if(file_mgr_data->tree_dash_thick_gc != NULL)
2266 XtReleaseGC(file_mgr_rec->current_directory_icon,
2267 file_mgr_data->tree_dash_thick_gc);
2270 FreeLayoutData(file_mgr_data->layout_data);
2272 { /* This block is added for rectifying memory leakages */
2273 XtFree(file_mgr_data->scrollToThisFile);
2274 XtFree(file_mgr_data->scrollToThisDirectory);
2277 XtFree ((char *) file_mgr_data);
2281 /************************************************************************
2284 * Destroy widgets and free up space allocated by the FileMgr dialog.
2285 * Called when the dialog is destroyed.
2287 ************************************************************************/
2291 XtPointer recordPtr )
2293 FileMgrRec *file_mgr_rec = (FileMgrRec *) recordPtr;
2295 XtDestroyWidget(file_mgr_rec->shell);
2297 XtFree(file_mgr_rec->action_pane_file_type);
2298 XtFree((char *)file_mgr_rec);
2307 Cardinal *num_params )
2309 XmDrawingAreaCallbackStruct cb ;
2310 FileMgrRec * fileMgrRec;
2312 Widget input_on_gadget ;
2314 if ((event->type == KeyPress)
2315 ||(event->type == KeyRelease))
2323 cb.reason = XmCR_INPUT;
2326 if( *(params[0]) != '@' )
2328 char * title = XtNewString( GETMESSAGE(12, 7, "File Manager") );
2329 char * tmp = "Gjmf Nbobhfs ufbn:\n\nTboez Bnjo\nEbo Ebp\nSbhiv Lspwwjej\nUfe Sbotpn\nMjoeb Sjfl\nGsbol Tdinvdl\nNvsbmj Tpnbspvuiv\n";
2331 int i, len = strlen( tmp );
2333 message = (char *)XtCalloc( 1, len + 1 );
2335 /* Not fancy, but serve the purpose */
2336 for( i = 0; i < len; ++i ){
2337 (( isalpha( tmp[i] ) ) ? (message[i] = (int)(tmp[i]) - 1) : (message[i] = tmp[i]));
2341 sscanf( params[0], "%lx", &fileMgrRec );
2343 sscanf( params[0], "%p", (void **) &fileMgrRec );
2345 _DtMessage(toplevel, title, message, NULL, HelpRequestCB);
2353 /************************************************************************
2354 ************************************************************************
2356 * Resource converters
2358 ************************************************************************
2359 ************************************************************************/
2362 /************************************************************************
2366 ************************************************************************/
2370 FileMgrData *file_mgr_data )
2372 if (restoreType == HOME_RESTORE) /* home settings restore */
2374 struct passwd * pwInfo;
2377 /* Set current_directory to the home dir */
2378 if ((homeDir = (char *)getenv("HOME")) == NULL)
2380 pwInfo = getpwuid (getuid());
2381 homeDir = pwInfo->pw_dir;
2384 file_mgr_data->current_directory = XtNewString(homeDir);
2386 file_mgr_data->current_directory =
2387 XtNewString(file_mgr_data->current_directory);
2389 if (file_mgr_data->restricted_directory)
2390 file_mgr_data->restricted_directory =
2391 XtNewString(file_mgr_data->restricted_directory);
2393 file_mgr_data->restricted_directory = NULL;
2395 else if (restoreType == TOOL_RESTORE) /* tool settings restore */
2397 file_mgr_data->current_directory =
2398 XtNewString(file_mgr_data->restricted_directory);
2400 if (file_mgr_data->restricted_directory)
2401 file_mgr_data->restricted_directory =
2402 XtNewString(file_mgr_data->restricted_directory);
2404 file_mgr_data->restricted_directory = NULL;
2406 else /* session restore */
2408 if ((file_mgr_data->current_directory) &&
2409 (file_mgr_data->toolbox) &&
2410 (file_mgr_data->host) &&
2411 (strcmp(file_mgr_data->host, file_mgr_data->current_directory) != 0))
2414 char *user_session_str;
2419 root_toolbox = (file_mgr_data->host);
2421 user_session_str = getenv("DTUSERSESSION");
2422 /* the restricted directory for any object is a parent of that *
2423 * object; the restricted directory for toolboxes is the root *
2424 * toolbox; the current toolbox dir is identified by the path *
2425 * information past the restricted dir/root toolbox */
2426 toolbox_dir = file_mgr_data->current_directory;
2427 toolbox_dir += strlen(file_mgr_data->restricted_directory);
2429 len = strlen(root_toolbox) +
2430 strlen(user_session_str) +
2431 strlen(toolbox_dir) + 1;
2432 current_dir = XtMalloc(len);
2435 snprintf(current_dir, len, "%s%s%s", root_toolbox,
2438 file_mgr_data->current_directory = current_dir;
2441 len = strlen(root_toolbox) + strlen(user_session_str) + 1;
2442 file_mgr_data->restricted_directory = XtMalloc(len);
2443 if (file_mgr_data->restricted_directory)
2445 snprintf(file_mgr_data->restricted_directory, len, "%s%s",
2452 file_mgr_data->current_directory =
2453 XtNewString(file_mgr_data->current_directory);
2455 if (file_mgr_data->restricted_directory)
2456 file_mgr_data->restricted_directory =
2457 XtNewString(file_mgr_data->restricted_directory);
2459 file_mgr_data->restricted_directory = NULL;
2462 file_mgr_data->host = NULL;
2466 /************************************************************************
2469 * Given a file name get the right icon name for it.
2471 ************************************************************************/
2475 FileMgrRec *file_mgr_rec,
2476 FileMgrData *file_mgr_data,
2484 PixmapData * pixmapData;
2485 Tt_status tt_status;
2487 /* Display the correct small directory icon */
2488 ftype = GetDirectoryLogicalType(file_mgr_data, path);
2492 full_name = ResolveLocalPathName(file_mgr_data->host,
2497 if( TT_OK != tt_status )
2500 short_name = strrchr(full_name, '/');
2501 if (strcmp(short_name, "/.") == 0)
2503 if (short_name == full_name)
2506 short_name = strrchr(full_name, '/');
2508 if (strcmp(full_name, "/") == 0)
2509 short_name = full_name;
2511 *short_name++ = '\0';
2514 pixmapData = _DtRetrievePixmapData(ftype,
2517 file_mgr_rec->shell,
2520 pixmapData = _DtRetrievePixmapData(ftype,
2523 file_mgr_rec->shell,
2531 /************************************************************************
2533 * BranchListToString
2534 * Write out the array of strings to the file fd.
2536 ************************************************************************/
2545 Boolean first = True;
2551 rv = write (fd, out_buf, strlen (out_buf));
2554 branch_name = (*value)[i];
2556 while (branch_name != NULL)
2559 rv = write (fd, ", ", strlen (", "));
2563 rv = write (fd, branch_name, strlen (branch_name));
2566 branch_name = (*value)[i];
2569 rv = write (fd, "\n", strlen ("\n"));
2575 /************************************************************************
2577 * SelectionListToString
2578 * Write out the array of strings to the file fd.
2580 ************************************************************************/
2583 SelectionListToString(
2585 FileViewData ***value,
2589 Boolean first = True;
2590 FileViewData * file_view_data;
2591 DirectorySet * directory_set;
2592 int rv; /* probably should actually check this... */
2596 rv = write (fd, out_buf, strlen (out_buf));
2599 file_view_data = (*value)[i];
2602 while (file_view_data != NULL)
2604 directory_set = (DirectorySet *) file_view_data->directory_set;
2607 rv = write (fd, ", ", strlen (", "));
2612 rv = write (fd, directory_set->name, strlen (directory_set->name));
2614 if (strcmp (directory_set->name, "/") != 0)
2615 rv = write (fd, "/", strlen ("/"));
2617 rv = write (fd, file_view_data->file_data->file_name,
2618 strlen (file_view_data->file_data->file_name));
2621 file_view_data = (*value)[i];
2624 rv = write (fd, "\n", strlen ("\n"));
2631 /************************************************************************
2633 * StringToBranchList
2634 * Convert a string to a string array.
2636 ************************************************************************/
2645 XtPointer *converter_data)
2647 static char ** table_ptr;
2650 char ** table = NULL;
2655 to_val->size = sizeof (char **);
2656 to_val->addr = (XtPointer) &table_ptr;
2658 if (from_val->addr == NULL)
2662 /* Loop through the string extracting branch names */
2663 /* and placing them into an array of strings. */
2665 current = start = (char *) from_val->addr;
2667 while (start != NULL)
2669 current = DtStrchr (start, ',');
2670 if (current != NULL)
2677 table = (char **) XtRealloc ((char *)table,
2678 sizeof (char *) * (table_size + 1));
2679 table[table_size] = NULL;
2681 table[table_size - 1] = XtNewString (start);
2687 to_val->addr = (XtPointer ) &table_ptr;
2688 to_val->size = sizeof(XtPointer);
2693 /************************************************************************
2695 * StringToSelectionList
2696 * Convert a string to a string array.
2698 ************************************************************************/
2701 StringToSelectionList(
2707 static char ** table_ptr;
2710 char ** table = NULL;
2715 to_val->size = sizeof (char **);
2716 to_val->addr = (XtPointer) &table_ptr;
2718 if (from_val->addr == NULL)
2722 /* Loop through the string extracting file specifications */
2723 /* and placing them into an array of strings. */
2725 current = start = (char *) from_val->addr;
2727 while (start != NULL)
2729 current = DtStrchr (start, ',');
2730 if (current != NULL)
2737 table = (char **) XtRealloc ((char *)table,
2738 sizeof (char *) * (table_size + 1));
2739 table[table_size] = NULL;
2741 table[table_size - 1] = XtNewString (start);
2747 to_val->addr = (XtPointer ) &table_ptr;
2748 to_val->size = sizeof(XtPointer);
2754 /************************************************************************
2755 ************************************************************************
2757 File Mgr file and directory processing functions.
2759 ************************************************************************
2760 ************************************************************************/
2763 /************************************************************************
2766 * Update the iconic path and current directory line.
2768 ************************************************************************/
2772 * Update the status line label widget to show the right text.
2776 FileMgrRec *file_mgr_rec,
2777 FileMgrData *file_mgr_data)
2779 char buf[21+MAX_PATH];
2780 XmString label_string;
2783 if (file_mgr_data->special_msg &&
2784 (file_mgr_data->busy_status == initiating_readdir ||
2785 file_mgr_data->busy_status == busy_readdir))
2787 SetSpecialMsg( file_mgr_rec, file_mgr_data, NULL );
2790 if (file_mgr_data->special_msg)
2792 label_string = XmStringCreateLocalized(file_mgr_data->special_msg);
2796 GetStatusMsg(file_mgr_data, buf);
2797 label_string = XmStringCreateLocalized(buf);
2799 XtSetArg (args[0], XmNlabelString, label_string);
2800 XtSetValues(file_mgr_rec->status_line, args, 1);
2801 XmStringFree (label_string);
2807 * Timeout routine that resets the status line after a
2808 * special message was shown (see also SetSpecialMsg).
2812 FileMgrData *file_mgr_data,
2815 FileMgrRec *file_mgr_rec;
2817 if (*id != file_mgr_data->msg_timer_id)
2820 file_mgr_data->msg_timer_id = 0;
2822 if (file_mgr_data->special_msg)
2824 XtFree(file_mgr_data->special_msg);
2825 file_mgr_data->special_msg = NULL;
2826 if (file_mgr_data->show_status_line)
2828 file_mgr_rec = (FileMgrRec *)file_mgr_data->file_mgr_rec;
2829 UpdateStatusLine(file_mgr_rec, file_mgr_data);
2837 * Arrange for a special message to be shown in the status line.
2838 * After 4 seconds the status line will revert back to the usual
2839 * "x Files, y Hidden" message.
2843 FileMgrRec *file_mgr_rec,
2844 FileMgrData *file_mgr_data,
2847 if (file_mgr_data->special_msg)
2849 XtFree(file_mgr_data->special_msg);
2850 file_mgr_data->special_msg = NULL;
2852 if (file_mgr_data->msg_timer_id)
2853 XtRemoveTimeOut(file_mgr_data->msg_timer_id);
2857 file_mgr_data->special_msg = XtNewString(msg);
2858 file_mgr_data->msg_timer_id =
2859 XtAppAddTimeOut (XtWidgetToApplicationContext (file_mgr_rec->shell),
2860 4000, (XtTimerCallbackProc) MsgTimerEvent,
2861 (XtPointer) file_mgr_data);
2865 file_mgr_data->special_msg = NULL;
2866 file_mgr_data->msg_timer_id = 0;
2873 * Update the iconic path, current directory, and status lines.
2877 FileMgrRec *file_mgr_rec,
2878 FileMgrData *file_mgr_data,
2879 Boolean icons_changed)
2883 Widget cur_dir_manage[4];
2884 int cur_dir_nmanage;
2887 PixmapData *pixmapData;
2890 * No headers on the trash can.
2892 if (!showFilesystem)
2894 if(file_mgr_data->show_status_line)
2895 UpdateStatusLine(file_mgr_rec, file_mgr_data);
2898 else if(file_mgr_data == trashFileMgrData
2901 UpdateStatusLine(file_mgr_rec, file_mgr_data);
2906 * Make sure the iconic path & current directory widgets are
2907 * correctly managed & attached.
2909 if ((file_mgr_data->show_iconic_path == 0) !=
2910 (XtIsManaged(file_mgr_rec->iconic_path_da) == 0) ||
2911 (file_mgr_data->show_current_dir == 0) !=
2912 (XtIsManaged(file_mgr_rec->current_directory_frame) == 0))
2914 icons_changed = True;
2917 "UpdateHeaders: iconic_path %d, current_dir %d, status_line %d\n",
2918 file_mgr_data->show_iconic_path,
2919 file_mgr_data->show_current_dir,
2920 file_mgr_data->show_status_line));
2922 if (!file_mgr_data->show_iconic_path && !file_mgr_data->show_current_dir)
2923 XtUnmanageChild(file_mgr_rec->header_frame);
2926 ((XmManagerWidget)file_mgr_rec->header_frame)->composite.children,
2927 ((XmManagerWidget)file_mgr_rec->header_frame)->composite.num_children);
2929 ((XmManagerWidget)file_mgr_rec->current_directory_frame)->
2931 ((XmManagerWidget)file_mgr_rec->current_directory_frame)->
2932 composite.num_children);
2935 /* attach the iconic path */
2936 if (file_mgr_data->show_iconic_path)
2939 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
2940 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2941 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
2942 if (file_mgr_data->show_current_dir)
2944 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_NONE); n++;
2948 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
2950 XtSetValues(file_mgr_rec->iconic_path_da, args, n);
2951 manage[nmanage++] = file_mgr_rec->iconic_path_da;
2954 /* attach the separator */
2955 if (file_mgr_data->show_iconic_path && file_mgr_data->show_current_dir)
2958 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
2959 XtSetArg (args[n], XmNtopWidget,
2960 file_mgr_rec->iconic_path_da); n++;
2961 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2962 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
2963 XtSetValues(file_mgr_rec->header_separator, args, n);
2964 manage[nmanage++] = file_mgr_rec->header_separator;
2967 /* attach the current directory line */
2968 if (file_mgr_data->show_current_dir)
2971 if (file_mgr_data->show_iconic_path)
2973 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
2974 XtSetArg (args[n], XmNtopWidget,
2975 file_mgr_rec->header_separator); n++;
2979 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
2981 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2982 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
2984 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
2986 XtSetValues(file_mgr_rec->current_directory_frame, args, n);
2987 manage[nmanage++] = file_mgr_rec->current_directory_frame;
2990 * If the iconic path is shown, show only the current directory on
2991 * the current directory line;
2992 * if the iconic path is not shown, also show the drop target and
2993 * the icon representing the current directory.
2995 cur_dir_nmanage = 1;
2996 cur_dir_manage[0] = file_mgr_rec->current_directory;
2998 if (file_mgr_data->show_iconic_path)
3001 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
3002 XtSetArg (args[n], XmNleftOffset, 5); n++;
3003 XtSetValues(file_mgr_rec->current_directory, args, n);
3010 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
3011 XtSetArg (args[n], XmNleftOffset, 5); n++;
3012 XtSetValues(file_mgr_rec->current_directory_drop, args, n);
3013 cur_dir_manage[cur_dir_nmanage++] =
3014 file_mgr_rec->current_directory_drop;
3017 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
3018 XtSetArg (args[n], XmNleftWidget,
3019 file_mgr_rec->current_directory_drop); n++;
3020 XtSetArg (args[n], XmNleftOffset, 0); n++;
3025 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
3026 XtSetArg (args[n], XmNleftOffset, 10); n++;
3028 XtSetValues(file_mgr_rec->current_directory_icon, args, n);
3029 cur_dir_manage[cur_dir_nmanage++] =
3030 file_mgr_rec->current_directory_icon;
3033 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
3034 XtSetArg (args[n], XmNleftWidget,
3035 file_mgr_rec->current_directory_icon);n++;
3036 XtSetArg (args[n], XmNleftOffset, 0); n++;
3037 XtSetValues(file_mgr_rec->current_directory, args, n);
3042 if (file_mgr_data->show_iconic_path || file_mgr_data->show_current_dir)
3044 if (file_mgr_data->show_current_dir)
3045 XtManageChildren(cur_dir_manage, cur_dir_nmanage);
3046 XtManageChildren(manage, nmanage);
3047 if (!XtIsManaged(file_mgr_rec->header_frame))
3048 XtManageChild(file_mgr_rec->header_frame);
3051 XtSetArg (args[0], XmNallowShellResize, True);
3052 XtSetValues(file_mgr_rec->shell, args, 1);
3056 * Make sure the status line is correctly managed.
3058 if (file_mgr_data->show_status_line &&
3059 !XtIsManaged(XtParent(file_mgr_rec->status_line)))
3061 XtManageChild(XtParent(file_mgr_rec->status_line));
3063 else if (!file_mgr_data->show_status_line &&
3064 XtIsManaged(XtParent(file_mgr_rec->status_line)))
3066 XtUnmanageChild(XtParent(file_mgr_rec->status_line));
3069 if (file_mgr_data->show_iconic_path)
3070 DtUpdateIconicPath(file_mgr_rec, file_mgr_data, icons_changed);
3072 if (file_mgr_data->show_current_dir)
3076 /* Display the correct small directory icon */
3077 pixmapData = GetPixmapData(file_mgr_rec,
3079 file_mgr_data->current_directory,
3081 XtSetArg (args[0], XmNallowShellResize, False);
3082 XtSetValues(file_mgr_rec->shell, args, 1);
3085 XtSetArg (args[0], XmNimageName, pixmapData->iconFileName);
3087 XtSetArg (args[0], XmNimageName, NULL);
3088 XtSetValues(file_mgr_rec->current_directory_icon, args, 1);
3089 _DtCheckAndFreePixmapData(
3090 GetDirectoryLogicalType(file_mgr_data,
3091 file_mgr_data->current_directory),
3092 file_mgr_rec->shell,
3093 (DtIconGadget) file_mgr_rec->current_directory_icon,
3096 XtSetArg (args[0], XmNallowShellResize, True);
3097 XtSetValues(file_mgr_rec->shell, args, 1);
3099 if(XtIsRealized(file_mgr_rec->main))
3100 DrawCurrentDirectory (file_mgr_rec->current_directory,
3101 file_mgr_rec, file_mgr_data);
3104 if (file_mgr_data->show_status_line)
3105 UpdateStatusLine(file_mgr_rec, file_mgr_data);
3109 /************************************************************************
3111 * FileMgrRedisplayFiles
3112 * Reprocess and redisplay the files of a view.
3114 ************************************************************************/
3117 FileMgrRedisplayFiles(
3118 FileMgrRec *file_mgr_rec,
3119 FileMgrData *file_mgr_data,
3120 Boolean new_directory)
3122 _DtTurnOnHourGlass (file_mgr_rec->shell);
3123 GetFileData (file_mgr_data, True, file_mgr_data->branch_list);
3124 XmDropSiteStartUpdate(file_mgr_rec->file_window);
3125 UpdateFileIcons(file_mgr_rec, file_mgr_data, new_directory);
3126 UpdateHeaders (file_mgr_rec, file_mgr_data, False);
3127 LayoutFileIcons(file_mgr_rec, file_mgr_data, False, False);
3128 XmDropSiteEndUpdate(file_mgr_rec->file_window);
3129 _DtTurnOffHourGlass (file_mgr_rec->shell);
3135 /************************************************************************
3138 * Update the view to the new directory.
3140 ************************************************************************/
3144 FileMgrData *file_mgr_data,
3146 char *directory_name )
3148 FileMgrRec * file_mgr_rec;
3150 char tmp_directory_name[MAX_PATH];
3156 tmp_type = DtDtsDataToDataType(directory_name, NULL, 0, NULL, NULL,
3158 if (( (strcmp(tmp_type, LT_AGROUP) == 0) ||
3159 (strstr(tmp_type, LT_AGROUP_SUBDIR)) )
3161 ( !(file_mgr_data->toolbox) ))
3163 DtActionArg *action_args;
3166 action_args = (DtActionArg *) XtCalloc(1, sizeof(DtActionArg));
3169 action_args[0].argClass = DtACTION_FILE;
3170 action_args[0].u.file.name = directory_name;
3173 pwd_dir = XtNewString(file_mgr_data->current_directory);
3174 DtActionInvoke(((FileMgrRec *) file_mgr_data->file_mgr_rec)->shell,
3175 "OpenAppGroup", action_args, 1,
3176 NULL, NULL, pwd_dir, True, NULL, NULL);
3177 DtDtsFreeDataType(tmp_type);
3181 else if (strcmp(tmp_type, LT_TRASH) == 0)
3183 DtActionArg *action_args;
3186 pwd_dir = XtNewString(file_mgr_data->current_directory);
3187 DtActionInvoke(((FileMgrRec *) file_mgr_data->file_mgr_rec)->shell,
3189 NULL, NULL, pwd_dir, True, NULL, NULL);
3190 DtDtsFreeDataType(tmp_type);
3194 DtDtsFreeDataType(tmp_type);
3196 if (openDirType == NEW)
3198 DialogData *dialog_data;
3199 FileMgrData *fileMgrData;
3201 fileMgrData = CheckOpenDir(directory_name, host_name);
3202 if(fileMgrData != NULL)
3204 dialog_data = _DtGetInstanceData(fileMgrData->file_mgr_rec);
3205 CloseView(dialog_data);
3207 ForceMyIconClosed(file_mgr_data->host, file_mgr_data->current_directory);
3210 file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
3212 /* Set the icon name for this view to the directory name. */
3214 SetIconAttributes ((FileMgrRec *)file_mgr_data->file_mgr_rec, file_mgr_data,
3217 _DtTurnOnHourGlass (file_mgr_rec->shell);
3219 DeselectAllFiles (file_mgr_data);
3220 ActivateNoSelect (file_mgr_rec);
3222 /* When leaving a directory, save any positional information */
3223 if(file_mgr_data->object_positions)
3225 SavePositionInfo(file_mgr_data);
3226 FreePositionInfo(file_mgr_data);
3229 /* save the current branch list */
3230 branch_list = file_mgr_data->branch_list;
3231 file_mgr_data->branch_list = NULL;
3233 FileMgrBuildDirectories (file_mgr_data, host_name, directory_name);
3235 GetFileData (file_mgr_data, True, branch_list);
3237 if (branch_list != NULL)
3239 for (i = 0; branch_list[i]; i++)
3240 XtFree (branch_list[i]);
3241 XtFree ((char *) branch_list);
3244 UpdateCachedDirectories (view_set, view_count);
3246 /* Inherit, or load positional data for this directory */
3247 XmDropSiteStartUpdate(file_mgr_rec->file_window);
3248 LoadPositionInfo(file_mgr_data);
3249 UpdateFileIcons(file_mgr_rec, file_mgr_data, True);
3251 if (showFilesystem && file_mgr_data != trashFileMgrData)
3252 UpdateHeaders (file_mgr_rec, file_mgr_data, True);
3253 else if(file_mgr_data == trashFileMgrData
3254 && file_mgr_data != NULL )
3255 UpdateStatusLine(file_mgr_rec, file_mgr_data);
3257 /* change the title */
3258 title = _DtBuildFMTitle(file_mgr_data);
3259 XtSetArg (args[0], XmNtitle, title);
3260 XtSetValues (file_mgr_rec->shell, args, 1);
3263 if (file_mgr_data->show_type == SINGLE_DIRECTORY)
3264 LayoutFileIcons(file_mgr_rec, file_mgr_data, True, True);
3266 LayoutFileIcons(file_mgr_rec, file_mgr_data, False, True);
3268 if (openDirType == NEW)
3269 ForceMyIconOpen (file_mgr_data->host, NULL);
3270 XmDropSiteEndUpdate(file_mgr_rec->file_window);
3276 /************************************************************************
3279 * This function causes a rescan of the directory for the view
3280 * and a full redisplay of the file icons.
3282 ************************************************************************/
3286 FileMgrRec *file_mgr_rec )
3288 DialogData * dialog_data;
3289 FileMgrData * file_mgr_data;
3290 DirectorySet ** directory_set;
3294 dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec);
3295 file_mgr_data = (FileMgrData *) dialog_data->data;
3297 _DtTurnOnHourGlass (file_mgr_rec->shell);
3299 directory_set = file_mgr_data->directory_set;
3301 for (i = 0; i < file_mgr_data->directory_count; i++)
3302 RereadDirectory (file_mgr_rec->shell, file_mgr_data->host,
3303 directory_set[i]->name);
3305 GetFileData (file_mgr_data, False, file_mgr_data->branch_list);
3306 XmDropSiteStartUpdate(file_mgr_rec->file_window);
3307 UpdateFileIcons(file_mgr_rec, file_mgr_data, False);
3308 UpdateHeaders (file_mgr_rec, file_mgr_data, False);
3309 LayoutFileIcons(file_mgr_rec, file_mgr_data, False, True);
3310 XmDropSiteEndUpdate(file_mgr_rec->file_window);
3311 /* _DtTurnOffHourGlass (file_mgr_rec->shell); */
3316 /************************************************************************
3318 * FileMgrBuildDirectories
3319 * Given a directory name, setup the directory set structure
3320 * contained in the file mgr data stucture.
3322 ************************************************************************/
3325 FileMgrBuildDirectories(
3326 FileMgrData *file_mgr_data,
3328 char *directory_name )
3330 char current_directory[MAX_PATH];
3331 DirectorySet ** directory_set;
3333 /* Inform Main that the directory is being changed and */
3334 /* free up the data contained in the current directory set. */
3336 if (file_mgr_data->current_directory != NULL)
3338 DirectoryChanged ((XtPointer)file_mgr_data, file_mgr_data->host, host_name,
3339 file_mgr_data->current_directory, directory_name);
3340 FreeDirectoryData (file_mgr_data);
3343 file_mgr_data->current_directory = (char *) XtNewString(directory_name);
3344 (void) strcpy (current_directory, file_mgr_data->current_directory);
3346 /* This code will solve the path problem if user has
3347 Dtfile*restrictMode resource set to True and
3348 also invoke dtfile with -restricted option
3351 && file_mgr_data->toolbox == False
3352 && file_mgr_data->restricted_directory
3353 && strncmp( file_mgr_data->restricted_directory, directory_name,
3354 strlen( file_mgr_data->restricted_directory ) ) != 0
3357 XtFree( file_mgr_data->restricted_directory );
3358 file_mgr_data->restricted_directory = XtNewString( directory_name );
3361 if (file_mgr_data->host != NULL)
3362 XtFree ((char *) file_mgr_data->host);
3364 file_mgr_data->host = (char *) XtNewString (host_name);
3367 /* Allocate the data for one initial directory set */
3369 file_mgr_data->directory_set = directory_set =
3370 ((DirectorySet **) XtMalloc (2 * sizeof(DirectorySet *))) + 1;
3371 file_mgr_data->directory_count = 1;
3373 directory_set[-1] = NULL;
3375 directory_set[0] = (DirectorySet *) XtMalloc (sizeof (DirectorySet));
3376 directory_set[0]->name = (char *) XtNewString (current_directory);
3377 directory_set[0]->sub_root = NULL;
3378 directory_set[0]->file_count = 0;
3379 directory_set[0]->file_view_data = NULL;
3380 directory_set[0]->order_list = NULL;
3381 directory_set[0]->filtered_file_count = 0;
3382 directory_set[0]->invisible_file_count = 0;
3383 directory_set[0]->file_mgr_data = (XtPointer) file_mgr_data;
3389 FileMgrData * file_mgr_data,
3394 static Region r = NULL;
3395 unsigned char flags;
3396 XRectangle pRect, lRect;
3398 if ((file_mgr_data->show_type != SINGLE_DIRECTORY) ||
3399 (file_mgr_data->view == BY_ATTRIBUTES))
3403 && x < (Position)(w->core.x + w->core.width)
3404 && y < (Position)(w->core.y + w->core.height)
3413 r = XCreateRegion();
3415 XSubtractRegion(r, r, r);
3417 _DtIconGetIconRects((DtIconGadget)w, &flags, &pRect, &lRect);
3419 if (flags & XmPIXMAP_RECT)
3420 XUnionRectWithRegion(&pRect, r, r);
3422 if (flags & XmLABEL_RECT)
3423 XUnionRectWithRegion(&lRect, r, r);
3425 if (XPointInRegion(r, x, y))
3434 * Check to see if the drop occurred within one of the primary hotspots.
3435 * If this is the desktop, then we need to check the hotspots according
3436 * to their stacking order; all other views have their hotspots checked
3437 * according to the order the files were loaded, since overlapping hotspots
3442 DropOnPrimaryHotspot (
3443 FileMgrData * file_mgr_data,
3446 DirectorySet ** directory_data)
3448 int directory_count;
3450 FileViewData * file_view_data;
3451 DirectorySet * dir_data;
3454 if (PositioningEnabledInView(file_mgr_data))
3456 top = GetTopOfStack(file_mgr_data);
3460 file_view_data = top->file_view_data;
3462 if(file_view_data == NULL)
3468 if (file_view_data->displayed &&
3469 DropOnGadget(file_mgr_data, file_view_data->widget, drop_x, drop_y))
3471 *directory_data = file_mgr_data->directory_set[0];
3472 return(file_view_data);
3480 if (file_mgr_data->show_type == MULTIPLE_DIRECTORY) {
3482 directory_count = file_mgr_data->directory_count;
3486 directory_count = 1;
3489 for (; i < directory_count; i++)
3491 dir_data = file_mgr_data->directory_set[i];
3493 for (j = 0; j < dir_data->file_count; j++)
3495 file_view_data = dir_data->file_view_data[j];
3497 if (!file_view_data->displayed)
3500 if (DropOnGadget(file_mgr_data, file_view_data->widget, drop_x,
3503 *directory_data = dir_data;
3504 return(file_view_data);
3510 *directory_data = NULL;
3516 /************************************************************************
3518 * ProcessDropOnFileWindow
3520 ************************************************************************/
3522 ProcessDropOnFileWindow (
3524 DtDndDropCallbackStruct *dropInfo,
3525 FileMgrData *file_mgr_data)
3527 char *command = NULL;
3530 /******************/
3531 /* transfer phase */
3532 /******************/
3533 if(dropInfo->reason != DtCR_DND_DROP_ANIMATE)
3537 XmDragContext drag_context;
3539 /* Initiating view not valid when another client initiates drag */
3541 initiating_view = NULL;
3543 /* reject the drop if the Protocol is buffer and it was
3544 dropped on the Trash Can
3546 if (dropInfo->dropData->protocol == DtDND_BUFFER_TRANSFER)
3548 if (file_mgr_data == trashFileMgrData
3549 && file_mgr_data != NULL )
3551 dropInfo->status = DtDND_FAILURE;
3552 DPRINTF (("ProcessDropOnFileWindow: Rejecting buffer drop on Trash Can\n"));
3558 /* if placement is 'As Placed', set blend model to BLEND_NONE */
3559 /* @@@...Need to check if this will work correctly for BUFFERS */
3560 if (PositioningEnabledInView(file_mgr_data))
3562 drag_context = (XmDragContext)dropInfo->dragContext;
3566 XtSetArg(args[0], XmNblendModel, XmBLEND_NONE);
3567 XtSetValues((Widget)drag_context, args, 1);
3570 /* if placement is 'Grid' */
3573 /* if initiating view is current view, set status
3576 if (initiating_view)
3578 if ((((FileMgrData *)initiating_view)->current_directory ==
3579 file_mgr_data->current_directory) &&
3580 (dropInfo->dropData->protocol == DtDND_FILENAME_TRANSFER))
3582 /* we actually want to allow a copy or a link to the same directory
3583 * but not a move. If it's a copy or link, we want the initiating
3584 * view to be NULL so that later we don't error out when it checks
3585 * to see if they are from the same view. We will fail out if the
3586 * operation is a MOVE (causing the zoom back).
3588 fileType = GetDirectoryLogicalType(file_mgr_data,
3589 file_mgr_data->current_directory);
3591 command = TypeToAction(dropInfo->operation, fileType);
3594 if (strcmp(command, "FILESYSTEM_MOVE") == 0)
3595 dropInfo->status = DtDND_FAILURE;
3597 initiating_view = NULL;
3603 /* set the complete move flag to False since the animate
3604 callback handles the deletion of the original file on the move
3607 DPRINTF(("DropOnFileWindow: Transfer Callback - Setting Complete move flag to False\n"));
3609 if(dropInfo->dropData->protocol == DtDND_BUFFER_TRANSFER)
3610 dropInfo->completeMove = True;
3612 /* set the complete move flag to False since we will be handling */
3613 /* the deletion of the original file */
3615 dropInfo->completeMove = False;
3618 /*****************************/
3619 /* animate phase, run action */
3620 /*****************************/
3623 char *command = NULL;
3626 DPRINTF(("DropOnFileWindow - Animate Callback."));
3628 fileType = GetDirectoryLogicalType(file_mgr_data,
3629 file_mgr_data->current_directory);
3631 command = TypeToAction(dropInfo->operation, fileType);
3635 DirectorySet *directory_set;
3638 /* retrieve the fileViewData for the current directory */
3639 directory_set = file_mgr_data->directory_set[0];
3640 for( i = 0; i < directory_set->file_count; ++i )
3642 if( strcmp(directory_set->order_list[i]->file_data->file_name, "." )
3645 RunCommand( command,
3647 directory_set->order_list[i],
3654 DtDtsFreeAttributeValue( command );
3660 /************************************************************************
3664 ************************************************************************/
3669 XtPointer client_data,
3670 XtPointer call_data)
3672 FileMgrData * file_mgr_data = (FileMgrData *)client_data;
3673 DtDndDropCallbackStruct *dropInfo = (DtDndDropCallbackStruct *)call_data;
3675 switch (dropInfo->dropData->protocol)
3677 case DtDND_FILENAME_TRANSFER:
3679 DPRINTF(("DropOnFileWindow: Number of Files dropped are %d\n",
3680 dropInfo->dropData->numItems));
3681 ProcessDropOnFileWindow (w, dropInfo, file_mgr_data);
3683 case DtDND_BUFFER_TRANSFER:
3684 DPRINTF (("DropOnFileWindow: Number of Buffers dropped are %d\n",
3685 dropInfo->dropData->numItems));
3686 ProcessDropOnFileWindow (w, dropInfo, file_mgr_data);
3689 dropInfo->status = DtDND_FAILURE;
3694 /************************************************************************
3696 * ProcessDropOnObject
3698 ************************************************************************/
3700 ProcessDropOnObject(
3702 DtDndDropCallbackStruct *dropInfo,
3703 FileViewData *file_view_data)
3707 DirectorySet *directory_data =
3708 (DirectorySet *) file_view_data->directory_set;
3709 FileMgrData *file_mgr_data = (FileMgrData *) directory_data->file_mgr_data;
3710 char *command = NULL;
3712 /******************/
3713 /* transfer phase */
3714 /******************/
3715 if (dropInfo->reason != DtCR_DND_DROP_ANIMATE)
3717 DPRINTF(("DropOnObject: Transfer Callback\n"));
3719 /* Initiating view not valid when another client initiates drag */
3721 initiating_view = NULL;
3723 /* check for invalid trash drop */
3724 if (FileFromTrash(dropInfo->dropData->data.files[0]))
3726 if (InvalidTrashDragDrop(dropInfo->operation,
3728 ((FileMgrRec *)file_mgr_data->file_mgr_rec)->file_window))
3730 dropInfo->status = DtDND_FAILURE;
3734 command = TypeToAction(dropInfo->operation,
3735 file_view_data->file_data->logical_type);
3737 (strncmp("FILESYSTEM_", command, strlen("FILESYSTEM_")) != 0) &&
3738 dropInfo->dropData->protocol == DtDND_BUFFER_TRANSFER)
3739 dropInfo->completeMove = True;
3741 /* set the complete move flag to False since we will be handling */
3742 /* the deletion of the original file */
3743 dropInfo->completeMove = False;
3746 /******************************************/
3747 /* animate phase, retrieve action and run */
3748 /******************************************/
3751 command = TypeToAction(dropInfo->operation,
3752 file_view_data->file_data->logical_type);
3755 RunCommand (command,
3762 DtDtsFreeAttributeValue(command);
3768 /************************************************************************
3772 ************************************************************************/
3777 XtPointer client_data,
3778 XtPointer call_data)
3780 DtDndDropCallbackStruct *dropInfo = (DtDndDropCallbackStruct *)call_data;
3782 switch (dropInfo->dropData->protocol)
3784 case DtDND_FILENAME_TRANSFER:
3785 case DtDND_BUFFER_TRANSFER:
3786 ProcessDropOnObject(w, dropInfo, (FileViewData *) client_data);
3789 dropInfo->status = DtDND_FAILURE;
3794 /************************************************************************
3796 * FileMgrPropagateSettings
3797 * Set a new (dst_data) file manager view settings to an
3798 * old (src_data) settings.
3800 ************************************************************************/
3803 FileMgrPropagateSettings(
3804 FileMgrData *src_data,
3805 FileMgrData *dst_data )
3808 PreferencesData * src_preferences_data;
3809 PreferencesData * dst_preferences_data;
3811 FilterData * src_filter_active_data;
3812 FilterData * dst_filter_active_data;
3813 FilterData * src_filter_edit_data;
3814 FilterData * dst_filter_edit_data;
3817 Dimension src_width;
3818 Dimension src_height;
3820 /* Copy the preferences data from src to dst data */
3822 src_preferences_data = (PreferencesData *) src_data->preferences->data;
3823 dst_preferences_data = (PreferencesData *) dst_data->preferences->data;
3825 dst_data->show_type = dst_preferences_data->show_type = src_data->show_type;
3826 dst_data->tree_files = dst_preferences_data->tree_files =
3827 src_data->tree_files;
3828 dst_data->view = src_data->view;
3829 dst_data->view_single = dst_preferences_data->view_single =
3830 src_data->view_single;
3831 dst_data->view_tree = dst_preferences_data->view_tree =
3832 src_data->view_tree;
3833 dst_data->order = dst_preferences_data->order = src_data->order;
3834 dst_data->direction = dst_preferences_data->direction = src_data->direction;
3835 dst_data->positionEnabled = dst_preferences_data->positionEnabled =
3836 src_data->positionEnabled;
3837 dst_data->show_iconic_path = dst_preferences_data->show_iconic_path =
3838 src_data->show_iconic_path;
3839 dst_data->show_current_dir = dst_preferences_data->show_current_dir =
3840 src_data->show_current_dir;
3841 dst_data->show_status_line = dst_preferences_data->show_status_line =
3842 src_data->show_status_line;
3845 /* Copy the Filter active info from src to dest data */
3846 src_filter_active_data = (FilterData *) src_data->filter_active->data;
3847 dst_filter_active_data = (FilterData *) dst_data->filter_active->data;
3849 dst_filter_active_data->match_flag = src_filter_active_data->match_flag;
3850 dst_filter_active_data->filter = XtNewString(src_filter_active_data->filter);
3851 dst_filter_active_data->show_hidden = src_filter_active_data->show_hidden;
3852 dst_filter_active_data->filetypesFilteredCount =
3853 src_filter_active_data->filetypesFilteredCount;
3854 XtFree(dst_filter_active_data->filetypesFiltered);
3855 dst_filter_active_data->filetypesFiltered =
3856 XtNewString(src_filter_active_data->filetypesFiltered);
3857 dst_filter_active_data->count = ReadInFiletypes(dst_filter_active_data);
3859 /* Copy the Filter edit info from src to dest data */
3860 src_filter_edit_data = (FilterData *) src_data->filter_edit->data;
3861 dst_filter_edit_data = (FilterData *) dst_data->filter_edit->data;
3863 dst_filter_edit_data->match_flag = src_filter_edit_data->match_flag;
3864 dst_filter_edit_data->filter = XtNewString(src_filter_edit_data->filter);
3865 dst_filter_edit_data->show_hidden = src_filter_edit_data->show_hidden;
3866 dst_filter_edit_data->filetypesFilteredCount =
3867 src_filter_edit_data->filetypesFilteredCount;
3868 XtFree(dst_filter_edit_data->filetypesFiltered);
3869 dst_filter_edit_data->filetypesFiltered =
3870 XtNewString(src_filter_edit_data->filetypesFiltered);
3871 dst_filter_edit_data->count = ReadInFiletypes(dst_filter_edit_data);
3873 /* Get the size info (e.g. X, Y) form src to dest data */
3874 XtSetArg (args[0], XmNwidth, &src_width);
3875 XtSetArg (args[1], XmNheight, &src_height);
3876 XtGetValues (((FileMgrRec *) src_data->file_mgr_rec)->shell, args, 2);
3878 dst_data->height = src_height;
3879 dst_data->width = src_width;
3881 /* need to propagate whether its a toolbox or not */
3882 dst_data->toolbox = src_data->toolbox;
3886 /************************************************************************
3889 * Update the list of open tree branches
3891 ************************************************************************/
3895 FileMgrData *file_mgr_data,
3896 DirectorySet *directory_set)
3899 char ** table = NULL;
3904 /* check if the given directory set is already in the table */
3905 if (directory_set && file_mgr_data->branch_list) {
3906 for (i = 0; file_mgr_data->branch_list[i]; i++)
3907 if (strcmp(file_mgr_data->branch_list[i] + 2, directory_set->name) == 0)
3909 /* just update the TreeShow value for this branch and return */
3910 file_mgr_data->branch_list[i][0] = '0' + directory_set->sub_root->ts;
3915 /* free old branch_list, if any */
3916 if (file_mgr_data->branch_list) {
3917 for (i = 0; file_mgr_data->branch_list[i]; i++)
3918 XtFree (file_mgr_data->branch_list[i]);
3919 XtFree((char *)file_mgr_data->branch_list);
3920 file_mgr_data->branch_list = NULL;
3923 /* create new brach list */
3924 for (i = 0; i < file_mgr_data->directory_count; i++) {
3926 if (file_mgr_data->directory_set[i]->sub_root->ts < tsNotRead)
3929 /* get the name of the tree branch */
3930 branch_name = file_mgr_data->directory_set[i]->name;
3932 /* generate table entry */
3933 branch_entry = (char *)XtMalloc(2 + strlen(branch_name) + 1);
3934 branch_entry[0] = '0' + file_mgr_data->directory_set[i]->sub_root->ts;
3935 branch_entry[1] = ':';
3936 strcpy(branch_entry + 2, branch_name);
3938 /* add entry to the table */
3940 table = (char **)XtRealloc((char *)table,
3941 sizeof(char *) * (table_size + 1));
3942 table[table_size - 1] = branch_entry;
3943 table[table_size] = NULL;
3946 file_mgr_data->branch_list = table;
3950 /************************************************************************
3953 * Read the directory contained in host: current_directory and
3954 * build the file data list and reset any related information
3956 ************************************************************************/
3960 FileMgrData *file_mgr_data,
3964 FileMgrRec *file_mgr_rec;
3965 int directory_count;
3966 DirectorySet ** directory_set;
3967 DirectorySet ** new_dir_set;
3968 FileViewData ** new_view_data;
3969 FileViewData *new_renaming,*new_popup_menu_icon=NULL;
3970 FileViewData *file_view_data,*new_drag_file_view_data=NULL;
3973 ObjectPtr position_info;
3980 file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
3981 directory_count = file_mgr_data->directory_count;
3982 directory_set = file_mgr_data->directory_set;
3985 * Read the directory and subdirectories given by branch_list.
3986 * Note: if any directory we need isn't yet in the cache,
3987 * ReadTreeDirectory will just kick off a background process
3988 * to read the directory and return with
3989 * file_mgr_data->busy_status set to busy_readdir.
3991 ReadTreeDirectory (file_mgr_rec->shell, file_mgr_data->host,
3992 file_mgr_data->current_directory,
3993 file_mgr_data, branch_list,
3994 &new_dir_set, &new_dir_count);
3996 /* if directories not ready yet, don't do anything */
3997 if (file_mgr_data->busy_status != not_busy)
4003 * Try to preserve the 'widget' and 'position_info' fields in the
4004 * file_view_data structure, for each file. This will allow us to
4005 * re-use the same Icon widget, to reduce flashing.
4006 * Also preserve ndir & nfile counts (used in FilterFiles to decide
4007 * whether to expand or collapse a tree branch if ndir or nfile
4011 /* loop through the old directory set */
4012 new_renaming = NULL;
4013 for (i = 0; i < directory_count; i++)
4015 /* find a directory with same name in the new directory set */
4016 for (j = 0; j < new_dir_count; j++)
4017 if (strcmp(directory_set[i]->name, new_dir_set[j]->name) == 0)
4020 /* if we couldn't find this directory, continue to the next one */
4021 if (j == new_dir_count)
4024 new_view_data = new_dir_set[j]->file_view_data;
4025 new_file_count = new_dir_set[j]->file_count;
4027 /* loop throught the old file list */
4028 for (j = 0; j < directory_set[i]->file_count; j++)
4030 file_view_data = directory_set[i]->file_view_data[j];
4031 position_info = file_view_data->position_info;
4034 * Find a file by the same name in the new file list.
4036 for (k = 0; k < new_file_count; k++)
4038 if (new_view_data[k]->file_data == file_view_data->file_data)
4040 /* Fix for defect 5029 */
4041 if(file_mgr_data->popup_menu_icon && file_view_data->file_data==
4042 file_mgr_data->popup_menu_icon->file_data)
4043 new_popup_menu_icon = new_view_data[k];
4045 /* Fix for defect 5703 */
4046 if ( file_mgr_data->drag_file_view_data &&
4047 file_mgr_data->drag_file_view_data->file_data ==
4048 file_view_data->file_data)
4049 new_drag_file_view_data = new_view_data[k];
4051 if (file_view_data == file_mgr_data->renaming)
4052 new_renaming = new_view_data[k];
4054 /* re-use the old widgets */
4055 new_view_data[k]->widget = file_view_data->widget;
4056 new_view_data[k]->treebtn = file_view_data->treebtn;
4057 new_view_data[k]->registered = file_view_data->registered;
4059 /* preserve ndir, nfile counts */
4060 new_view_data[k]->ndir = file_view_data->ndir;
4061 new_view_data[k]->nfile = file_view_data->nfile;
4063 /* preserve the position info */
4066 new_view_data[k]->position_info = position_info;
4067 position_info->file_view_data = new_view_data[k];
4070 /* preserve icon_mtime */
4071 new_view_data[k]->icon_mtime = file_view_data->icon_mtime;
4077 /* if no file by the same name was found in the new file list,
4078 the file must have gone away ... lets eliminate the
4079 position infomation */
4080 if (position_info && k == new_file_count)
4082 for (k = 0; k < file_mgr_data->num_objects; k++)
4084 if (file_mgr_data->object_positions[k] == position_info)
4086 /* @@@ what does this do? */
4087 position_info->late_bind = True;
4088 position_info->y += (file_view_data->widget->core.height / 2);
4095 /* replace the old directory set */
4096 file_mgr_data->directory_set = new_dir_set;
4097 file_mgr_data->directory_count = new_dir_count;
4098 file_mgr_data->renaming = new_renaming;
4099 file_mgr_data->popup_menu_icon = new_popup_menu_icon;
4100 file_mgr_data->drag_file_view_data = new_drag_file_view_data;
4102 /* Get the file types and the files sorted and filtered */
4103 for (i = 0; i < new_dir_count; i++)
4105 OrderFiles (file_mgr_data, new_dir_set[i]);
4106 FilterFiles (file_mgr_data, new_dir_set[i]);
4107 file_mgr_data->tree_root->filtered =
4108 file_mgr_data->show_type != MULTIPLE_DIRECTORY;
4110 SelectVisible(file_mgr_data);
4112 /* update the branch_list */
4113 UpdateBranchList(file_mgr_data, NULL);
4115 /* Update the selection list */
4117 while (j < file_mgr_data->selected_file_count)
4119 file_view_data = file_mgr_data->selection_list[j];
4121 /* See if the selected file is still around */
4123 for (i = 0; !match && i < new_dir_count; i++)
4125 for (k = 0; k < new_dir_set[i]->file_count; k++)
4127 if (file_view_data->file_data ==
4128 new_dir_set[i]->file_view_data[k]->file_data)
4132 file_mgr_data->selection_list[j] =
4133 new_dir_set[i]->file_view_data[k];
4138 /* Keep the file selected only if it was found in the new
4139 * directory set and if it is not filtered */
4140 if (match && !file_view_data->filtered)
4143 DeselectFile (file_mgr_data, file_view_data, False);
4146 /* free the old directory set */
4147 FreeLayoutData(file_mgr_data->layout_data);
4148 file_mgr_data->layout_data = NULL;
4149 FreeDirectorySet(directory_set, directory_count);
4151 /* Set the menu activation to reflect and changes in the selection. */
4153 if(file_mgr_data != trashFileMgrData
4154 && file_mgr_data != NULL )
4156 if (file_mgr_data->selected_file_count == 0)
4157 ActivateNoSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec);
4158 else if (file_mgr_data->selected_file_count == 1)
4159 ActivateSingleSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec,
4160 file_mgr_data->selection_list[0]->file_data->logical_type);
4162 ActivateMultipleSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec);
4165 SensitizeTrashBtns();
4167 /* load positional data for this directory */
4168 if ( (file_mgr_data->positionEnabled == RANDOM_ON)
4169 && ( (file_mgr_rec->menuStates & CLEAN_UP_OP) == 0)
4171 LoadPositionInfo(file_mgr_data);
4176 /************************************************************************
4179 * Search for a directory in branch list.
4181 ************************************************************************/
4185 FileMgrData *file_mgr_data,
4187 char *directory_name,
4193 if (branch_list == NULL)
4196 for (i = 0; branch_list[i]; i++)
4197 if (strcmp(branch_list[i] + 2, directory_name) == 0) {
4198 ts = branch_list[i][0] - '0';
4199 if (ts == tsNotRead)
4202 if (ts == tsAll && file_mgr_data->tree_files == TREE_FILES_NEVER)
4204 else if (ts == tsDirs && file_mgr_data->tree_files == TREE_FILES_ALWAYS)
4216 /************************************************************************
4219 * Read a directory and sub directories.
4221 ************************************************************************/
4223 static FileViewData *
4225 FileMgrData *file_mgr_data,
4227 char *directory_name,
4235 /* allocate new FileData */
4236 fp = (FileData *) XtMalloc(sizeof(FileData));
4237 memset(fp, 0, sizeof(FileData));
4240 if (strcmp(directory_name, "/") == 0)
4241 fp->file_name = XtNewString("/");
4244 p = strrchr(directory_name, '/');
4246 fp->file_name = XtNewString(p + 1);
4248 fp->file_name = XtNewString(directory_name);
4251 /* assume it's a directory for now ... */
4252 fp->is_subdir = True;
4254 /* @@@ do a readlink here ... */
4256 /* allocate FileViewData */
4257 ip = (FileViewData *)XtMalloc(sizeof(FileViewData));
4258 memset(ip, 0, sizeof(FileViewData));
4261 if (QueryBranchList(file_mgr_data, branch_list, directory_name, &ts) &&
4266 else if (file_mgr_data->tree_files == TREE_FILES_ALWAYS)
4280 * Recursively count the number of subdirectores we have read.
4285 if (ip->file_data->is_subdir && ip->ts != tsNotRead)
4288 for (dp = ip->desc; dp; dp = dp->next)
4289 CountDirectories(dp, np);
4293 static DirectorySet *
4297 FileMgrData *file_mgr_data)
4303 /* allocate a new directory set entry */
4304 ds = (DirectorySet *)XtMalloc(sizeof(DirectorySet));
4306 /* initialize the directory set entry */
4307 ds->name = XtNewString(name);
4310 for (dp = ip->desc; dp; dp = dp->next)
4312 if (ds->file_count != 0)
4313 ds->file_view_data =
4314 (FileViewData **)XtMalloc(ds->file_count*sizeof(FileViewData *));
4316 ds->file_view_data = NULL;
4318 for (dp = ip->desc, i = 0; dp; dp = dp->next, i++) {
4319 ds->file_view_data[i] = dp;
4320 dp->directory_set = (XtPointer)ds;
4322 ds->order_list = NULL;
4323 ds->filtered_file_count = 0;
4324 ds->invisible_file_count = 0;
4325 ds->file_mgr_data = (XtPointer)file_mgr_data;
4333 FileMgrData *file_mgr_data,
4335 DirectorySet **directory_set,
4338 * Recursively add directores to the directory set array.
4341 char fullname[MAX_PATH];
4344 if (ip->file_data->is_subdir && ip->ts != tsNotRead)
4346 /* add a new entry to the directory set array */
4347 GetFullName(file_mgr_data, ip, fullname);
4348 directory_set[*index] = NewDirectorySet(fullname, ip, file_mgr_data);
4352 for (dp = ip->desc; dp; dp = dp->next)
4353 MakeDirectorySets(file_mgr_data, dp, directory_set, index);
4361 char *directory_name,
4362 FileMgrData *file_mgr_data,
4364 DirectorySet ***directory_set,
4365 int *directory_count)
4367 FileViewData *ip, *dp;
4370 /* eliminate "/." */
4371 if (strcmp(directory_name, "/.") == 0)
4372 directory_name = "/";
4374 /* if not in tree mode, clear branch_list (@@@ really?) */
4375 if (file_mgr_data->show_type != MULTIPLE_DIRECTORY)
4378 /* get a FileViewData for the tree root */
4379 file_mgr_data->tree_root = ip =
4380 GetTopInfo(file_mgr_data, host_name, directory_name, branch_list);
4382 /* read the directory tree */
4383 rc = ReadDir(w, file_mgr_data, host_name, directory_name, ip,
4384 0, file_mgr_data->tree_preread_level, branch_list);
4385 if (file_mgr_data->busy_status != not_busy)
4387 /* No point in continuing any further, free up all 'ip' and return */
4388 XtFree(ip->file_data->file_name);
4389 XtFree((char *)ip->file_data);
4391 file_mgr_data->tree_root = NULL;
4397 /* update root FileData from "." */
4398 for (dp = ip->desc; dp; dp = dp->next)
4399 if (strcmp(dp->file_data->file_name, ".") == 0) {
4400 ip->file_data->physical_type = dp->file_data->physical_type;
4401 ip->file_data->logical_type =
4402 GetDirectoryLogicalType(file_mgr_data, directory_name);
4403 ip->file_data->errnum = dp->file_data->errnum;
4404 ip->file_data->stat = dp->file_data->stat;
4405 ip->file_data->is_broken = dp->file_data->is_broken;
4409 *directory_count = 0;
4410 CountDirectories(ip, directory_count);
4412 /* allocate array of directory set pointers */
4414 (DirectorySet **) XtMalloc ((*directory_count + 1)*sizeof(DirectorySet *));
4416 /* make a fake directory set for the tree root */
4418 char fullname[MAX_PATH];
4422 ds = (DirectorySet *)XtMalloc(sizeof(DirectorySet));
4423 ip->directory_set = (XtPointer)ds;
4425 strcpy(fullname, directory_name);
4426 p = strrchr(fullname, '/');
4429 ds->name = XtNewString(fullname);
4430 ds->sub_root = NULL;
4432 ds->file_view_data =
4433 (FileViewData **)XtMalloc(sizeof(FileViewData *));
4434 ds->file_view_data[0] = ip;
4436 (FileViewData **)XtMalloc(sizeof(FileViewData *));
4437 ds->order_list[0] = ip;
4438 ds->filtered_file_count = 1;
4439 ds->file_mgr_data = (XtPointer)file_mgr_data;
4441 (*directory_set)[0] = ds;
4445 /* make directory sets for the current dir and subdirs */
4447 MakeDirectorySets(file_mgr_data, ip, *directory_set, &i);
4451 /*--------------------------------------------------------------------
4453 *------------------------------------------------------------------*/
4460 * Decide if entry is currently displayed.
4465 /* filtered files are not shown */
4469 /* in flat mode all un-filtered files are shown */
4470 if (fmd->show_type == SINGLE_DIRECTORY)
4473 /* in tree mode an entry is shown only if user chooses to */
4474 ts = ip->parent? ip->parent->ts: tsDirs;
4477 else if (ts == tsDirs)
4478 return ip->file_data->is_subdir;
4487 FileViewData *dp, /* directory entry being searched */
4488 int level) /* tree depth level of this entry */
4490 * Recursively determine the display position of a given entry
4491 * Return false if the entry not currently displayed
4496 /* skip entries that are not displayed */
4497 if (level > 0 && !IsShown(fmd, dp))
4500 /* this entry is displayed */
4501 dp->displayed = True;
4503 /* traverse subtree */
4506 for (ip = dp->desc; ip; ip = ip->next)
4507 SetDisplayedRecur(fmd, ip, level);
4514 SelectVisible (FileMgrData *file_mgr_data)
4518 /* assume nothing displayed */
4519 for (i = 0; i < file_mgr_data->directory_count; i++)
4520 for (j = 0; j < file_mgr_data->directory_set[i]->file_count; j++)
4521 file_mgr_data->directory_set[i]->file_view_data[j]->displayed = False;
4523 /* set the displayed flag for all entries that are actually shown */
4524 SetDisplayedRecur(file_mgr_data, file_mgr_data->tree_root, 0);
4525 if (file_mgr_data->show_type == SINGLE_DIRECTORY)
4526 file_mgr_data->tree_root->displayed = False;
4530 /*--------------------------------------------------------------------
4531 * expand tree branches
4532 *------------------------------------------------------------------*/
4535 * UpdateBranchState:
4536 * Determine new tree brach expansion state after a subdirectory has
4537 * been re-read (op == BRANCH_UPDATE), or after the user has requested
4538 * to expand (op == BRANCH_EXPAND) or collapse (op == BRANCH_COLLAPSE)
4543 FileMgrData *file_mgr_data,
4548 TreeShow old_ts = ip->ts;
4550 if (ip->ts == tsReading && op == BRANCH_UPDATE)
4558 /* this is a new branch that's currently being read */
4562 else if (ip->ts == tsError)
4564 /* can't expand or collaps this branch */
4568 else if (op == BRANCH_UPDATE) /* update */
4572 else if (op == BRANCH_EXPAND) /* show more */
4574 if (file_mgr_data->tree_files == TREE_FILES_NEVER)
4576 if (ip->ts == tsNone || !showEmptySet && ip->ndir == 0)
4584 if (ip->ndir == 0 && ip->nfile == 0)
4586 /* the subdir is empty */
4589 else if (ip->ts == tsNone)
4594 else if (ip->ts == tsAll)
4596 else if (ip->ts == tsNone &&
4597 ip->ndir > 0 && ip->nfile > 0 &&
4598 file_mgr_data->tree_files == TREE_FILES_CHOOSE)
4606 (ip->nfile == 0 || file_mgr_data->tree_files == TREE_FILES_NEVER) &&
4609 DirectorySet *directory_set = (DirectorySet *)ip->directory_set;
4610 FileMgrData *file_mgr_data = (FileMgrData *)directory_set->file_mgr_data;
4611 FileMgrRec *file_mgr_rec = (FileMgrRec *)file_mgr_data->file_mgr_rec;
4616 msg = GETMESSAGE(12,18, "The folder %s is empty.");
4618 msg = GETMESSAGE(12,19, "The folder %s contains no subdirectories.");
4620 sprintf(buf, msg, ip->file_data->file_name);
4621 SetSpecialMsg( file_mgr_rec, file_mgr_data, buf );
4625 else if (op == BRANCH_COLLAPSE) /* show less */
4629 if (file_mgr_data->tree_files == TREE_FILES_NEVER)
4631 if (ip->ts == tsNone || !showEmptySet && ip->ndir == 0)
4638 if (ip->ndir == 0 && ip->nfile == 0)
4640 /* the subdir is empty */
4643 else if (ip->ts == tsNone)
4648 else if (ip->ts == tsNone)
4650 else if (ip->ts == tsAll &&
4651 ip->ndir > 0 && ip->nfile > 0 &&
4652 file_mgr_data->tree_files == TREE_FILES_CHOOSE)
4663 * Expand (expand == True) or collpase (expand == False) a tree branch.
4667 FileMgrData *file_mgr_data,
4671 FileMgrRec *file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
4672 DirectorySet *directory_set;
4673 int level, i, n, old_count, rc;
4679 GetAncestorInfo(file_mgr_data, ip, &level, path, NULL);
4680 SetSpecialMsg( file_mgr_rec, file_mgr_data, NULL );
4685 new_branch = (ip->ts == tsNotRead || ip->ts == tsError);
4688 /* we need to read the sub directory */
4689 _DtTurnOnHourGlass (file_mgr_rec->shell);
4690 if (ip->ts == tsError)
4692 if (file_mgr_data->busy_status == not_busy)
4694 file_mgr_data->busy_detail = 0;
4695 file_mgr_data->busy_status = initiating_readdir;
4697 RereadDirectory (file_mgr_rec->shell, file_mgr_data->host, path);
4698 if (file_mgr_data->busy_status == initiating_readdir)
4699 file_mgr_data->busy_status = not_busy;
4701 rc = ReadDir(file_mgr_rec->shell, file_mgr_data,
4702 file_mgr_data->host, path, ip,
4703 level, level, NULL);
4705 /* create new directory set entry */
4706 directory_set = NewDirectorySet(path, ip, file_mgr_data);
4708 /* if this is a new entry, add it to the directory set */
4709 if (ip->ts == tsNotRead)
4711 file_mgr_data->directory_set =
4713 XtRealloc((char *)(file_mgr_data->directory_set - 1),
4714 (file_mgr_data->directory_count + 2)*sizeof(DirectorySet *))) + 1;
4715 file_mgr_data->directory_set[file_mgr_data->directory_count] =
4717 file_mgr_data->directory_count++;
4721 /* otherwise, replace the existing entry */
4722 for (i = 0; i < file_mgr_data->directory_count; i++)
4723 if (strcmp(file_mgr_data->directory_set[i]->name, path) == 0)
4725 XtFree(file_mgr_data->directory_set[i]->name);
4726 file_mgr_data->directory_set[i]->name = NULL;
4727 if (file_mgr_data->directory_set[i]->file_view_data != NULL)
4728 XtFree((char *)file_mgr_data->directory_set[i]->file_view_data);
4729 file_mgr_data->directory_set[i]->file_view_data = NULL;
4730 XtFree((char *)file_mgr_data->directory_set[i]);
4731 file_mgr_data->directory_set[i] = directory_set;
4735 ip->ts == tsError && file_mgr_data->busy_status == busy_readdir)
4740 if (file_mgr_data->busy_status != busy_readdir)
4742 OrderFiles (file_mgr_data, directory_set);
4743 FilterFiles (file_mgr_data, directory_set);
4744 file_mgr_data->newSize = True;
4745 AddFileIcons(file_mgr_rec, file_mgr_data, directory_set);
4749 /* expand the branch */
4750 UpdateBranchState(file_mgr_data, ip, BRANCH_EXPAND,
4751 new_branch && file_mgr_data->busy_status == busy_readdir);
4755 /* collaps the branch */
4756 UpdateBranchState(file_mgr_data, ip, BRANCH_COLLAPSE, False);
4759 /* change tree button */
4760 if (file_mgr_data->busy_status != busy_readdir)
4762 px = GetTreebtnPixmap(file_mgr_data, ip);
4763 XtSetArg(args[0], XmNlabelPixmap, px);
4764 XtSetValues (ip->treebtn, args, 1);
4767 for (i = 0; i < file_mgr_data->directory_count; i++)
4768 if (strcmp(file_mgr_data->directory_set[i]->name, path) == 0)
4771 SelectVisible(file_mgr_data);
4772 UpdateBranchList(file_mgr_data, file_mgr_data->directory_set[i]);
4774 UnmanageFileIcons(file_mgr_rec, file_mgr_data, ip);
4775 EraseTreeLines(file_mgr_rec, file_mgr_data, ip);
4777 /* update the "Hidden" count */
4778 UpdateHeaders(file_mgr_rec, file_mgr_data, False);
4782 /************************************************************************
4785 * Free up the directory set data.
4787 ************************************************************************/
4791 DirectorySet ** directory_set,
4792 int directory_count)
4799 for (i = -1; i < directory_count; i++)
4801 if (directory_set[i] == NULL)
4804 XtFree ((char *) directory_set[i]->name);
4805 for (j = 0; j < directory_set[i]->file_count; j++)
4807 if( (char *) directory_set[i]->file_view_data[j]->label)
4809 XtFree ((char *) directory_set[i]->file_view_data[j]->label);
4810 directory_set[i]->file_view_data[j]->label = NULL;
4812 XtFree ((char *) directory_set[i]->file_view_data[j]);
4813 directory_set[i]->file_view_data[j] = NULL;
4815 if (directory_set[i]->file_view_data != NULL)
4816 XtFree ((char *) directory_set[i]->file_view_data);
4817 XtFree ((char *) directory_set[i]->order_list);
4818 XtFree ((char *) directory_set[i]);
4821 XtFree ((char *) (directory_set - 1));
4825 /************************************************************************
4828 * Free up the current directory and the directory set data.
4830 ************************************************************************/
4834 FileMgrData *file_mgr_data )
4836 if(file_mgr_data->object_positions)
4837 FreePositionInfo(file_mgr_data);
4839 if (file_mgr_data->current_directory != NULL)
4840 XtFree ((char *) file_mgr_data->current_directory);
4841 file_mgr_data->current_directory = NULL;
4843 if (file_mgr_data->host != NULL)
4844 XtFree ((char *) file_mgr_data->host);
4845 file_mgr_data->host = NULL;
4847 FreeLayoutData(file_mgr_data->layout_data);
4848 file_mgr_data->layout_data = NULL;
4849 FreeDirectorySet(file_mgr_data->directory_set,
4850 file_mgr_data->directory_count);
4851 file_mgr_data->directory_set = NULL;
4857 /************************************************************************
4860 * Close (destroy) the file browser view. This callback is issued
4861 * from both the Close menu item and the Close system menu.
4863 ************************************************************************/
4868 XtPointer client_data,
4869 XtPointer call_data )
4871 FileMgrRec * file_mgr_rec;
4872 DialogData * dialog_data;
4874 Widget mbar = XmGetPostedFromWidget(XtParent(w));
4877 XmUpdateDisplay (w);
4879 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
4880 XtGetValues(mbar, args, 1);
4881 /* Ignore accelerator received after we're unposted */
4882 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
4885 CloseView (dialog_data);
4891 /************************************************************************
4894 * Function called from a close on the system menu.
4896 ************************************************************************/
4903 FileMgrRec * file_mgr_rec;
4904 DialogData * dialog_data;
4907 file_mgr_rec = (FileMgrRec *) data;
4908 dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec);
4910 CloseView (dialog_data);
4915 /************************************************************************
4918 * Set the icon name and icon to be used for a file manager view.
4920 ************************************************************************/
4924 FileMgrRec *file_mgr_rec,
4925 FileMgrData *file_mgr_data,
4926 char *directory_name )
4928 static Pixmap tool_icon = XmUNSPECIFIED_PIXMAP;
4929 static Pixmap dir_icon = XmUNSPECIFIED_PIXMAP;
4930 static Pixmap tool_mask = XmUNSPECIFIED_PIXMAP;
4931 static Pixmap dir_mask = XmUNSPECIFIED_PIXMAP;
4932 char * new_directory_name;
4933 Pixel background, foreground, top_shadow, bottom_shadow, select;
4936 unsigned int height;
4939 Boolean havePixmap = False;
4940 Boolean haveMask = False;
4941 Boolean root = False;
4943 char *ptr, *fileLabel, *fileName;
4945 if (tool_icon == XmUNSPECIFIED_PIXMAP)
4947 XtSetArg (args[0], XmNbackground, &background);
4948 XtSetArg (args[1], XmNcolormap, &colormap);
4949 XtGetValues (file_mgr_rec->main, args, 2);
4951 XmGetColors (XtScreen (file_mgr_rec->main), colormap, background,
4952 &foreground, &top_shadow, &bottom_shadow, &select);
4954 /* first get the File Manager's Icon */
4955 pixmap = XmGetPixmap (XtScreen (file_mgr_rec->main), fileMgrIcon,
4956 foreground, background);
4957 if( pixmap != XmUNSPECIFIED_PIXMAP)
4960 /* now let's get the mask for the File Manager */
4961 pixmap = _DtGetMask (XtScreen (file_mgr_rec->main), fileMgrIcon);
4962 if( pixmap != XmUNSPECIFIED_PIXMAP)
4965 /* Let's get the Application Manager's Icon */
4966 pixmap = XmGetPixmap (XtScreen (file_mgr_rec->main), appMgrIcon,
4967 foreground, background);
4968 if( pixmap != XmUNSPECIFIED_PIXMAP)
4971 /* now let's get the mask for the Application Manager */
4972 pixmap = _DtGetMask (XtScreen (file_mgr_rec->main), appMgrIcon);
4973 if( pixmap != XmUNSPECIFIED_PIXMAP)
4979 if (fileLabel = DtDtsFileToAttributeValue(directory_name, DtDTS_DA_LABEL))
4981 else if (fileName = strrchr(directory_name, '/'))
4986 if(file_mgr_data->title)
4988 if(file_mgr_data->toolbox)
4990 if(strcmp(directory_name, file_mgr_data->restricted_directory) == 0)
4992 new_directory_name =
4993 (char *)XtMalloc(strlen(file_mgr_data->title) + 1);
4994 strcpy( new_directory_name, file_mgr_data->title );
4998 new_directory_name = (char *)XtMalloc( strlen(ptr) + 1 );
4999 sprintf(new_directory_name, "%s", ptr);
5004 new_directory_name = (char *)XtMalloc( strlen(ptr) + 1);
5005 sprintf(new_directory_name, "%s", ptr);
5011 if (strcmp (directory_name, "/") == 0 && !fileLabel)
5013 new_directory_name = (char *)XtMalloc(strlen(file_mgr_data->host) +
5014 strlen(root_title) + 3);
5015 sprintf( new_directory_name, "%s:%s", file_mgr_data->host, root_title );
5019 new_directory_name = ptr;
5022 XtSetArg (args[0], XmNiconName, new_directory_name);
5024 if(file_mgr_data->toolbox && tool_icon != XmUNSPECIFIED_PIXMAP)
5027 XtSetArg (args[1], XmNiconPixmap, tool_icon);
5028 if( tool_mask != XmUNSPECIFIED_PIXMAP)
5031 XtSetArg (args[2], XmNiconMask, tool_mask);
5034 else if (dir_icon != XmUNSPECIFIED_PIXMAP)
5037 XtSetArg (args[1], XmNiconPixmap, dir_icon);
5038 if( dir_mask != XmUNSPECIFIED_PIXMAP)
5041 XtSetArg (args[2], XmNiconMask, dir_mask);
5048 XtSetValues (file_mgr_rec->shell, args, 3);
5050 XtSetValues (file_mgr_rec->shell, args, 2);
5053 XtSetValues (file_mgr_rec->shell, args, 1);
5056 DtDtsFreeAttributeValue(fileLabel);
5058 XtFree(new_directory_name);
5064 * Menu callback for the fast change directory toggle. Toggles the text
5065 * field up and down.
5068 ShowChangeDirField (
5070 XtPointer client_data,
5073 FileMgrRec * file_mgr_rec;
5074 DialogData * dialog_data;
5075 FileMgrData * file_mgr_data;
5081 /* Set the menu item to insensitive to prevent multiple */
5082 /* dialogs from being posted and get the area under the */
5083 /* menu pane redrawn. */
5087 if((intptr_t) client_data == FM_POPUP)
5090 mbar = XmGetPostedFromWidget(XtParent(w));
5091 XmUpdateDisplay (w);
5092 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
5093 XtGetValues(mbar, args, 1);
5097 /* Done only during a restore session */
5098 file_mgr_rec = (FileMgrRec *)client_data;
5101 /* Got an accelerator after we were unposted */
5102 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
5104 file_mgr_data = (FileMgrData *) dialog_data->data;
5106 /* Toggle the state of the text field */
5107 if (XtIsManaged(file_mgr_rec->current_directory_text))
5109 XtSetArg (args[0], XmNallowShellResize, False);
5110 XtSetValues(file_mgr_rec->shell, args, 1);
5111 XtUnmanageChild(file_mgr_rec->current_directory_text);
5112 XtSetArg (args[0], XmNallowShellResize, True);
5113 XtSetValues(file_mgr_rec->shell, args, 1);
5114 file_mgr_data->fast_cd_enabled = False;
5117 ShowFastChangeDir(file_mgr_rec, file_mgr_data);
5123 * Class function for forcing the focus to the text field, if visible, each
5124 * time the FileMgr dialog is posted.
5129 FileMgrRec * file_mgr_rec,
5130 FileMgrData * file_mgr_data)
5132 /* Force the focus to the text field */
5133 if (file_mgr_data->fast_cd_enabled)
5135 XRaiseWindow(XtDisplay(file_mgr_rec->current_directory_text),
5136 XtWindow(file_mgr_rec->current_directory_text));
5137 XmProcessTraversal(file_mgr_rec->current_directory_text,
5138 XmTRAVERSE_CURRENT);
5144 * This function free up any position information associated with the
5145 * dtfile view, and nulls out the associated data fields.
5150 FileMgrData * file_mgr_data)
5153 FileViewData **file_view_data;
5155 /* free object positions */
5156 for (i = 0; i < file_mgr_data->num_objects; i++)
5158 XtFree(file_mgr_data->object_positions[i]->name);
5159 XtFree((char *)file_mgr_data->object_positions[i]);
5160 file_mgr_data->object_positions[i] = NULL;
5163 XtFree((char *)file_mgr_data->object_positions);
5165 file_mgr_data->object_positions = NULL;
5166 file_mgr_data->num_objects = 0;
5168 /* clear references to object positions in file_view_data */
5169 for (i = 0; i < file_mgr_data->directory_count; i++)
5171 file_view_data = file_mgr_data->directory_set[i]->file_view_data;
5172 for (j = 0; j < file_mgr_data->directory_set[i]->file_count; j++)
5173 file_view_data[j]->position_info = NULL;
5179 * This function determines whether random positioning is currently enabled
5180 * for this view. The decision is based upon they type of the view, and
5181 * the current preferences settings.
5185 PositioningEnabledInView (
5186 FileMgrData * file_mgr_data)
5189 if ((file_mgr_data->show_type == SINGLE_DIRECTORY) &&
5190 (file_mgr_data->view != BY_ATTRIBUTES) &&
5191 (file_mgr_data->positionEnabled == RANDOM_ON))
5201 * This function is similar to the above function, but is less restrictive;
5202 * this function does not require that the view currently have positioning
5203 * enabled; it simply returns whether the view has positioning info.
5208 FileMgrData * file_mgr_data)
5211 if ((file_mgr_data->object_positions) &&
5212 (file_mgr_data->positionEnabled == RANDOM_ON))
5222 * When a new view of a directory is spun off of an existing view of that
5223 * directory, we want the new view to inherit the positioning information
5224 * associated with the original view. This function takes care of that.
5228 InheritPositionInfo (
5229 FileMgrData * src_file_mgr_data,
5230 FileMgrData * dest_file_mgr_data)
5233 ObjectPosition *ptr;
5234 ObjectPosition **temp_stack;
5236 if (!PositionFlagSet(src_file_mgr_data))
5238 /* Nothing to inherit */
5239 dest_file_mgr_data->num_objects = 0;
5240 dest_file_mgr_data->object_positions = NULL;
5244 dest_file_mgr_data->num_objects = src_file_mgr_data->num_objects;
5245 dest_file_mgr_data->object_positions = (ObjectPosition **) XtMalloc(
5246 sizeof(ObjectPosition *) * dest_file_mgr_data->num_objects);
5248 temp_stack = (ObjectPosition **) XtMalloc(
5249 sizeof(ObjectPosition *) * dest_file_mgr_data->num_objects);
5251 for (i = 0; i < dest_file_mgr_data->num_objects; i++)
5253 ptr = dest_file_mgr_data->object_positions[i] = (ObjectPosition *)
5254 XtMalloc(sizeof(ObjectPosition));
5256 *ptr = *(src_file_mgr_data->object_positions[i]);
5257 ptr->name = XtNewString(ptr->name);
5258 ptr->file_view_data = NULL;
5262 temp_stack[ptr->stacking_order - 1] = ptr;
5265 for(i = 0; i < dest_file_mgr_data->num_objects; i++)
5267 if(dest_file_mgr_data->object_positions[i]->stacking_order == 1)
5269 dest_file_mgr_data->object_positions[i]->next =
5270 temp_stack[dest_file_mgr_data->object_positions[i]->stacking_order];
5273 else if(dest_file_mgr_data->object_positions[i]->stacking_order ==
5274 dest_file_mgr_data->num_objects)
5276 dest_file_mgr_data->object_positions[i]->prev =
5277 temp_stack[dest_file_mgr_data->object_positions[i]->
5278 stacking_order - 2];
5282 dest_file_mgr_data->object_positions[i]->prev =
5283 temp_stack[dest_file_mgr_data->object_positions[i]->
5284 stacking_order - 2];
5285 dest_file_mgr_data->object_positions[i]->next =
5286 temp_stack[dest_file_mgr_data->object_positions[i]->stacking_order];
5290 XtFree((char *)temp_stack);
5295 * This function saves the current position information (if any) in the
5296 * associated directory; if there is no positional data, then any old
5297 * position files in this directory are removed. The entries are written
5298 * according to their position (left to right, top to bottom), not according
5299 * to their relative stacking order.
5304 FileMgrData * file_mgr_data)
5307 PositionInfo *position_info;
5308 ObjectPosition * ptr;
5311 /* Copy object positions into position info array */
5312 if (file_mgr_data->num_objects <= 0)
5313 position_info = NULL;
5316 position_info = (PositionInfo *)
5317 XtMalloc(file_mgr_data->num_objects * sizeof(PositionInfo));
5318 for (i = 0; i < file_mgr_data->num_objects; i++)
5320 ptr = file_mgr_data->object_positions[i];
5322 position_info[i].name = ptr->name;
5323 position_info[i].x = ptr->x;
5324 position_info[i].y = ptr->y;
5325 position_info[i].stacking_order = ptr->stacking_order;
5329 SetDirectoryPositionInfo(file_mgr_data->host,
5330 file_mgr_data->current_directory,
5331 file_mgr_data->num_objects, position_info);
5333 XtFree((char *)position_info);
5338 * This function will attempt to load any positional data associated with
5339 * the directory to be viewed. Within the positioning file, the entries
5340 * are order in left-to-right, top-to-bottom order, not according to the
5346 FileMgrData * file_mgr_data)
5348 PositionInfo *position_info;
5349 ObjectPosition * ptr;
5353 /* don't do anything if we already have position information */
5354 if (file_mgr_data->object_positions != NULL)
5357 /* Load the number of entries */
5358 numObjects = GetDirectoryPositionInfo(file_mgr_data->host,
5359 file_mgr_data->current_directory, &position_info);
5361 if (numObjects <= 0)
5363 file_mgr_data->object_positions = NULL;
5364 file_mgr_data->num_objects = 0;
5370 /* Proceed with the loading */
5371 file_mgr_data->object_positions = (ObjectPosition **)XtMalloc(
5372 sizeof(ObjectPosition *) * numObjects);
5374 for (i = 0; i < numObjects; i++)
5376 ptr = file_mgr_data->object_positions[i] = (ObjectPosition *)
5377 XtMalloc(sizeof(ObjectPosition));
5378 ptr->name = XtNewString(position_info[i].name);
5379 ptr->x = position_info[i].x;
5380 ptr->y = position_info[i].y;
5381 ptr->in_use = False;
5382 ptr->late_bind = False;
5383 ptr->stacking_order = position_info[i].stacking_order;
5384 ptr->file_view_data = NULL;
5389 /* Repair all of the next and prev pointers */
5390 file_mgr_data->num_objects = i;
5391 RepairStackingPointers(file_mgr_data);
5392 /* OrderChildrenList(file_mgr_data); */
5398 /************************************************************************
5400 * MoveOkCB - the user wishes to actually do the move even though its
5401 * not the desktop object that is actually getting moved.
5402 * This function calls the routines which do the moves. It
5403 * depends on the view type to determine how it does it.
5405 * DESKTOP - the drop happened on a Desktop object
5406 * and the object was a directory
5407 * NOT_DESKTOP_DIR - the drop happened on a directory
5408 * but it wasn't a directory on the desktop.
5409 * NOT_DESKTOP - drop happened in a FileManager view
5410 * and not on a directory.
5413 ************************************************************************/
5417 XtPointer client_data,
5418 XtPointer call_data )
5420 XtUnmanageChild((Widget)client_data);
5421 XmUpdateDisplay((Widget)client_data);
5422 XtDestroyWidget((Widget)client_data);
5427 /************************************************************************
5429 * MoveCancelCB - function called when the user cancels out of the
5430 * Move file question dialog. Just deleted the dialog.
5432 ************************************************************************/
5436 XtPointer client_data,
5437 XtPointer call_data )
5439 FileMgrRec *file_mgr_rec;
5441 XtUnmanageChild((Widget)client_data);
5442 XmUpdateDisplay((Widget)client_data);
5443 XtDestroyWidget((Widget)client_data);
5445 if(view_type == NOT_DESKTOP)
5447 file_mgr_rec = (FileMgrRec *)fm->file_mgr_rec;
5448 LayoutFileIcons(file_mgr_rec, fm, False, True);
5453 RemoveIconInWorkspace(
5455 char * workspaceName )
5457 DesktopRec *desktopWin;
5459 char iconName[MAX_PATH];
5462 for(i = 0; i < desktop_data->numIconsUsed; i++)
5464 desktopWin = desktop_data->desktopWindows[i];
5466 if( strcmp( desktopWin->dir_linked_to, "/" ) == 0 )
5467 sprintf( iconName, "/%s", desktopWin->file_name );
5469 sprintf( iconName, "%s/%s", desktopWin->dir_linked_to, desktopWin->file_name );
5471 DtEliminateDots( iconName );
5473 if( strcmp( fileName, iconName ) == 0
5474 && strcmp( workspaceName, desktopWin->workspace_name ) == 0 )
5476 RemoveDT( desktopWin->shell, (XtPointer) desktopWin,
5483 /*************************************************************************
5485 * CheckMoveType - function used to determine:
5486 * 1) is the file being moved have a reference to a
5488 * 2) if yes: is the file being moved dragged from
5489 * the Desktop (check widget_dragged)?
5490 * 2a) if yes: set up global varibles used by message
5492 * 2b) if no: execute the move, then if one of the objects
5493 * is on the Desktop, move the link to the
5495 * 3) question 1 answer is no: just exectute the move
5497 * Other information:
5499 * DESKTOP - the drop happened on a Desktop object
5500 * and the object was a directory
5501 * NOT_DESKTOP_DIR - the drop happened on a directory
5502 * but it wasn't a directory on the desktop.
5503 * NOT_DESKTOP - drop happened in a FileManager view
5504 * and not on a directory.
5507 **************************************************************************/
5510 FileMgrData *file_mgr_data,
5511 FileViewData *file_view_data,
5512 DirectorySet * directory_data,
5513 DesktopRec * desktopWindow,
5516 unsigned int modifiers,
5527 char directory[MAX_PATH];
5530 Screen *currentScreen;
5532 char * workspace_name = NULL;
5536 #ifdef _CHECK_FOR_SPACES
5537 if (_DtSpacesInFileNames(file_set, file_count))
5539 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."));
5540 char * msg = XtNewString(tmpStr);
5541 FileOperationError (toplevel, msg, NULL);
5547 display = XtDisplay(toplevel);
5548 screen = XDefaultScreen(display);
5549 currentScreen = XScreenOfDisplay(display, screen);
5550 rootWindow = RootWindowOfScreen(currentScreen);
5552 if( DtWsmGetCurrentWorkspace(display,rootWindow,&pCurrent) == Success )
5554 workspace_name = XGetAtomName (display, pCurrent);
5555 CleanUpWSName(workspace_name);
5558 /* Fix for the case, when you drop an object from App. Manager on to desktop
5559 and try to move it to File Manager. It must copied for this operation
5560 (modifers == ControlMask). */
5564 Str = (char *)IsAFileOnDesktop2(file_set, file_count, &number,&IsToolBox);
5566 modifiers = ControlMask;
5570 * If number is comes back greater than 0 then at least one of the files
5571 * dropped has a reference to a Desktop object
5573 * If widget_dragged is != NULL then the files dragged are from the
5574 * desktop; in this case set up globals, and post a confirmation dialog.
5576 modifiers &= ~Button2Mask;
5577 modifiers &= ~Button1Mask;
5579 modifiers != ControlMask && modifiers != ShiftMask &&
5580 widget_dragged != NULL)
5582 char *message = NULL;
5584 char *from, *to, *filename;
5586 global_file_count = file_count;
5587 _DtCopyDroppedFileInfo(file_count, file_set, host_set,
5588 &global_file_set, &global_host_set);
5591 fv = file_view_data;
5597 /* desktop object dropped on a desktop directory */
5598 dtWindow = desktopWindow;
5599 fm = (FileMgrData *)NULL;
5600 dd = (DirectorySet *)NULL;
5601 to = (char *)XtMalloc(strlen(directory_data->name) +
5602 strlen(fv->file_data->file_name)+ 2);
5603 sprintf(to, "%s/%s", directory_data->name,
5604 fv->file_data->file_name );
5605 DtEliminateDots(to);
5607 case NOT_DESKTOP_DIR:
5608 /* desktop object dropped on a file view directory icon */
5609 dtWindow = (DesktopRec *)NULL;
5611 dd = directory_data;
5612 to = (char *)XtMalloc(strlen(dd->name) +
5613 strlen(fv->file_data->file_name) + 2);
5614 sprintf( to, "%s/%s",dd->name , fv->file_data->file_name );
5615 (void) DtEliminateDots(to);
5617 default:/* view == NOT_DESKTOP */
5618 /* desktop object dropped in a file manager view */
5619 dtWindow = (DesktopRec *)NULL;
5621 dd = (DirectorySet *)NULL;
5622 to = (char *)XtMalloc(strlen(file_mgr_data->current_directory)
5624 strcpy(to, file_mgr_data->current_directory);
5628 for(i=0; i<file_count; i++)
5630 if(strcmp(file_set[i], to) == 0)
5633 FileMgrRec *file_mgr_rec;
5635 GETMESSAGE(11,16,"A folder cannot be moved into itself.\n%s");
5636 msg = XtNewString(tmpStr);
5637 if(file_view_data == NULL)
5639 file_mgr_rec = (FileMgrRec *)file_mgr_data->file_mgr_rec;
5640 FileOperationError(file_mgr_rec->shell, msg, file_set[i]);
5644 FileOperationError(file_view_data->widget, msg, file_set[i]);
5649 XtFree(workspace_name);
5654 tmpStr = (GETMESSAGE(12,3, "Move File(s)"));
5655 title = XtNewString(tmpStr);
5658 int len = strlen(to);
5662 && file_mgr_data->toolbox )
5664 ptr = strrchr(file_set[0], '/');
5665 ptr1 = (char *)XtMalloc(strlen(to) + strlen(ptr) + 1);
5666 sprintf(ptr1, "%s%s", to, ptr);
5667 ptr1 = _DtResolveAppManPath( ptr1,
5668 file_mgr_data->restricted_directory);
5670 if (strncmp(ptr1, file_set[0], len) == 0)
5679 from = XtNewString( file_set[0] );
5680 ptr = strrchr( from, '/' );
5682 filename = XtNewString("");
5686 ptr = strrchr(file_set[0], '/');
5690 from = (char *)XtMalloc(strlen(file_set[0]) + 1);
5691 strcpy(from, file_set[0]);
5694 filename = (char *)XtMalloc(strlen(ptr) + 1);
5695 strcpy(filename, ptr);
5699 from = (char *)XtMalloc(strlen(ptr) + 1);
5701 filename = XtNewString("");
5705 if( strcmp( from, to ) == 0 )
5707 RemoveIconInWorkspace( file_set[0], workspace_name );
5711 XtFree(workspace_name);
5715 #ifdef sun /* This format statement core dumps on SunOS 4.0.3 and 4.1 */
5716 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?"));
5718 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?"));
5720 message = (char *)XtMalloc(strlen(tmpStr) + strlen(filename) +
5721 strlen(to) + strlen(from) + 1);
5723 sprintf(message, tmpStr, filename, from, to);
5730 int len = strlen(to);
5732 int workspace_num = 1;
5734 for( i = 0; i < desktop_data->numWorkspaces; ++i )
5736 if( strcmp( workspace_name, desktop_data->workspaceData[i]->name) == 0 )
5738 workspace_num = desktop_data->workspaceData[i]->number;
5743 DeselectAllDTFiles( desktop_data->workspaceData[workspace_num -1] );
5749 && file_mgr_data->toolbox)
5751 to = _DtResolveAppManPath( to,
5752 file_mgr_data->restricted_directory );
5753 for( i = 0; i < number; ++i )
5757 from = (char *)XtNewString( file_set[i] );
5758 ptr = strrchr( from, '/' );
5760 from = _DtResolveAppManPath( from,
5761 file_mgr_data->restricted_directory );
5764 if( strcmp( from, to ) == 0 )
5765 RemoveIconInWorkspace( file_set[i], workspace_name );
5773 for( i = 0; i < number; ++i )
5775 ptr = strrchr(file_set[i], '/');
5779 from = (char *)XtMalloc(strlen(file_set[i]) + 1);
5780 strcpy(from, file_set[i]);
5785 from = (char *)XtMalloc(strlen(ptr) + 1);
5789 if( strcmp( to, from ) == 0 )
5791 RemoveIconInWorkspace( file_set[i], workspace_name );
5804 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?"));
5805 message = (char *)XtMalloc(strlen(tmpStr) + strlen(to) + 1);
5807 sprintf(message, tmpStr, to);
5817 _DtMessageDialog(toplevel, title, message, NULL, TRUE,
5818 MoveCancelCB, MoveOkCB, NULL, HelpRequestCB, False,
5825 XtFree(workspace_name);
5829 XtFree(Str); /* No longer used, so free it up */
5830 XtFree(workspace_name);
5832 * Files are not dragged from the desktop.
5834 * Just execute the operation. The target directory dependings on
5835 * the view type (i.e. DESKTOP, NOT_DESKTOP, or NOT_DESKTOP_DIR).
5840 target_host = desktopWindow->host;
5841 sprintf( directory, "%s/%s", directory_data->name,
5842 file_view_data->file_data->file_name );
5843 DtEliminateDots(directory);
5844 value = FileMoveCopyDesktop (file_view_data, directory,
5845 host_set, file_set, file_count,
5846 modifiers, desktopWindow,
5850 case NOT_DESKTOP_DIR:
5851 target_host = file_mgr_data->host;
5852 sprintf( directory, "%s/%s", directory_data->name,
5853 file_view_data->file_data->file_name );
5854 DtEliminateDots(directory);
5855 value = FileMoveCopy (file_mgr_data,
5856 NULL, directory, target_host,
5857 host_set, file_set, file_count,
5858 modifiers, NULL, NULL);
5861 default:/* view == NOT_DESKTOP */
5862 target_host = file_mgr_data->host;
5863 strcpy(directory, file_mgr_data->current_directory);
5867 RepositionIcons(file_mgr_data, file_set, file_count, drop_x,
5870 value = FileMoveCopy(file_mgr_data,
5871 NULL, directory, target_host,
5872 host_set, file_set, file_count,
5873 modifiers, NULL, NULL);
5880 * If this was a move and any of the files is referenced by a
5881 * Desktop object we need to change the reference to the new
5882 * location that the file moved to.
5884 * @@@ This should really be done in the pipe callback!
5888 modifiers != ControlMask && modifiers != ShiftMask)
5890 Tt_status tt_status;
5892 for(j = 0; j < file_count; j++)
5895 DesktopRec *desktopWin;
5898 * loop through each desktop object to see if the file
5899 * being operated on has a reference to a desktop object.
5900 * If it does change the reference in the desktop object
5902 * NOTE: if we find a desktop object the file references,
5903 * after we've changed the DT object we can't break
5904 * because there might be more than one DT object which
5907 for(i = 0; i < desktop_data->numIconsUsed; i++)
5909 desktopWin = desktop_data->desktopWindows[i];
5910 fileName = ResolveLocalPathName( desktopWin->host, desktopWin->dir_linked_to,
5911 desktopWin->file_name, home_host_name, &tt_status);
5912 if( TT_OK == tt_status && strcmp(fileName, file_set[j]) == 0 )
5915 * if fileName == file_set[j] then the file is on the
5916 * Desktop so change the dir_linked to reference. What the
5917 * new reference is depends on which view type is being
5920 XtFree(desktopWin->host);
5921 desktopWin->host = XtNewString(target_host);
5923 XtFree(desktopWin->dir_linked_to);
5924 desktopWin->dir_linked_to = XtNewString(directory);
5926 XtFree(desktopWin->restricted_directory);
5927 if(file_mgr_data->restricted_directory != NULL)
5928 desktopWin->restricted_directory =
5929 XtNewString(file_mgr_data->restricted_directory);
5931 desktopWin->restricted_directory = NULL;
5933 XtFree(desktopWin->title);
5934 if(file_mgr_data->title != NULL)
5935 desktopWin->title = XtNewString(file_mgr_data->title);
5937 desktopWin->title = NULL;
5939 XtFree(desktopWin->helpVol);
5940 if(file_mgr_data->helpVol != NULL)
5941 desktopWin->helpVol = XtNewString(file_mgr_data->helpVol);
5943 desktopWin->helpVol = NULL;
5945 desktopWin->toolbox = file_mgr_data->toolbox;
5948 } /* for ( i = 0 ...) */
5949 } /* for (j = 0 ...) */
5951 /* since at least one of the file has been moved lets update
5952 the !dtdesktop file */
5953 SaveDesktopInfo(NORMAL_RESTORE);
5960 * This function returns the current working directory settings, used when
5961 * invoking an action. The caller passes in the current directory for the
5962 * command, and we will simply copy it and return new pointers, unless the
5963 * path specifies a directory which is part of the tool/apps area; in this
5964 * case, the cwd is set to the user's home directory.
5966 * The application must free up these two return pointers.
5978 if ((strcmp(home_host_name, viewHost) == 0) && type != NULL)
5982 /* Force app dir and any of its subdirs to use $HOME */
5983 if(strcmp(users_home_dir, "/") != 0)
5985 ptr = strrchr(users_home_dir, '/');
5987 *pwdDirRet = XtNewString(users_home_dir);
5991 *pwdDirRet = XtNewString(users_home_dir);
5992 *pwdHostRet = XtNewString(home_host_name);
5996 /* Simply use the passed in cwd */
5997 *pwdHostRet = XtNewString(viewHost);
5998 *pwdDirRet = XtNewString(viewDir);
6003 CreateFmPopup (Widget w)
6005 Widget popupBtns[FM_POPUP_CHILDREN];
6006 XmString label_string;
6013 /* Create file manager popup menu */
6015 XtSetArg(args[n],XmNmenuAccelerator," "); n++;
6016 XtSetArg(args[n],XmNwhichButton, bMenuButton); n++;
6017 fileMgrPopup.menu = XmCreatePopupMenu(w, "FMPopup", args, n);
6018 XtAddCallback(fileMgrPopup.menu, XmNhelpCallback,
6019 (XtCallbackProc)HelpRequestCB,
6020 HELP_POPUP_MENU_STR);
6023 /* Create file manager title */
6024 fileMgrPopup.title = popupBtns[i] =
6025 (Widget)XmCreateLabelGadget(fileMgrPopup.menu, "fmtitle", NULL, 0);
6029 /* Create title separators */
6030 popupBtns[i++] = XmCreateSeparatorGadget(fileMgrPopup.menu, "sep2",
6034 /* Create 'Properties' option - white space popup */
6035 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 150, "Change Permissions...")));
6036 XtSetArg (args[0], XmNlabelString, label_string);
6037 mnemonic = ((char *)GETMESSAGE(20, 17, "P"));
6038 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6040 fileMgrPopup.wsPopup[BTN_PROPERTIES] = popupBtns[i] =
6041 XmCreatePushButtonGadget (fileMgrPopup.menu, "permissions", args, 2);
6042 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6043 (XtCallbackProc)HelpRequestCB,
6044 HELP_POPUP_MENU_STR);
6046 XmStringFree (label_string);
6049 /* Create 'Find' option -- white space popup */
6050 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 18, "Find...")));
6051 XtSetArg (args[0], XmNlabelString, label_string);
6052 mnemonic = ((char *)GETMESSAGE(20, 19, "F"));
6053 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6055 fileMgrPopup.wsPopup[BTN_FIND] = popupBtns[i] =
6056 XmCreatePushButtonGadget (fileMgrPopup.menu, "find", args, 2);
6057 XtAddCallback (popupBtns[i], XmNactivateCallback,
6058 ShowFindDialog, (XtPointer) FM_POPUP);
6059 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6060 (XtCallbackProc)HelpRequestCB,
6061 HELP_FILE_MENU_STR);
6063 XmStringFree (label_string);
6066 /* Create 'Clean Up' option -- white space popup */
6067 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 99, "Clean Up")));
6068 XtSetArg (args[0], XmNlabelString, label_string);
6069 mnemonic = ((char *)GETMESSAGE(20, 100, "C"));
6070 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6072 fileMgrPopup.wsPopup[BTN_CLEANUP] = popupBtns[i] =
6073 XmCreatePushButtonGadget (fileMgrPopup.menu, "cleanUp", args, 2);
6074 XtAddCallback (popupBtns[i], XmNactivateCallback,
6075 CleanUp, (XtPointer) FM_POPUP);
6076 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6077 (XtCallbackProc)HelpRequestCB,
6078 HELP_CLEAN_UP_COMMAND_STR);
6080 XmStringFree (label_string);
6083 /* Create 'Select All' option -- white space popup */
6084 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 48, "Select All")));
6085 XtSetArg (args[0], XmNlabelString, label_string);
6086 mnemonic = ((char *)GETMESSAGE(20, 51, "S"));
6087 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6089 fileMgrPopup.wsPopup[BTN_SELECTALL] = popupBtns[i] =
6090 XmCreatePushButtonGadget (fileMgrPopup.menu, "selectAll", args, 2);
6091 XtAddCallback (popupBtns[i], XmNactivateCallback,
6092 SelectAll, (XtPointer) FM_POPUP);
6093 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6094 (XtCallbackProc)HelpRequestCB,
6095 HELP_SELECT_ALL_COMMAND_STR);
6097 XmStringFree (label_string);
6100 /* Create 'Unselect All' option -- white space popup */
6101 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 52, "Deselect All")));
6102 XtSetArg (args[0], XmNlabelString, label_string);
6103 mnemonic = ((char *)GETMESSAGE(20, 55, "D"));
6104 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6106 fileMgrPopup.wsPopup[BTN_UNSELECTALL] = popupBtns[i] =
6107 XmCreatePushButtonGadget (fileMgrPopup.menu, "deselectAll", args, 2);
6108 XtAddCallback (popupBtns[i], XmNactivateCallback,
6109 UnselectAll, (XtPointer) FM_POPUP);
6110 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6111 (XtCallbackProc)HelpRequestCB,
6112 HELP_UNSELECT_ALL_COMMAND_STR);
6114 XmStringFree (label_string);
6117 /* Create 'Show Hidden Files' option -- white space popup */
6118 label_string = XmStringCreateLocalized((GETMESSAGE(20, 156, "Show Hidden Objects")));
6119 XtSetArg (args[0], XmNlabelString, label_string);
6120 mnemonic = ((char *)GETMESSAGE(20, 102, "H"));
6121 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6123 fileMgrPopup.wsPopup[BTN_SHOWHIDDEN] = popupBtns[i] =
6124 XmCreateToggleButtonGadget (fileMgrPopup.menu, "showHiddenObjects", args, 2);
6125 XtAddCallback (popupBtns[i], XmNvalueChangedCallback,
6126 ShowHiddenFiles, (XtPointer) FM_POPUP);
6127 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6128 (XtCallbackProc)HelpRequestCB,
6129 HELP_SHOW_HIDDEN_COMMAND_STR);
6131 XmStringFree (label_string);
6134 /* Manage white space popup buttons -- since XmNadjustMargin defaults */
6135 /* to true, we manage these buttons now so that they will be aligned */
6136 /* according to the 'ShowHiddenFiles' toggle button */
6137 XtManageChildren(fileMgrPopup.wsPopup, WS_BTNS);
6140 /* Adjust XmNadjustMargin such that the rest of the popup buttons will */
6141 /* NOT be forced to align with the 'ShowHiddenFiles' toggle button */
6142 XtSetArg(args[0], XmNadjustMargin, False);
6143 XtSetValues(fileMgrPopup.menu, args, 1);
6146 /* Create 'Properties' option - object popup */
6147 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 150, "Change Permissions...")));
6148 XtSetArg (args[0], XmNlabelString, label_string);
6149 mnemonic = ((char *)GETMESSAGE(20, 17, "P"));
6150 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6152 fileMgrPopup.objPopup[BTN_PROPERTIES] = popupBtns[i] =
6153 XmCreatePushButtonGadget (fileMgrPopup.menu, "permissions", args, 2);
6154 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6155 (XtCallbackProc)HelpRequestCB,
6156 HELP_POPUP_MENU_STR);
6158 XmStringFree (label_string);
6161 /* Create 'Put In Workspace' option -- object popup */
6162 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 84, "Put in Workspace")));
6163 XtSetArg (args[0], XmNlabelString, label_string);
6164 mnemonic = ((char *)GETMESSAGE(20, 85, "W"));
6165 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6167 fileMgrPopup.objPopup[BTN_PUTON] = popupBtns[i] =
6168 XmCreatePushButtonGadget (fileMgrPopup.menu, "putInWorkspace", args, 2);
6169 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6170 (XtCallbackProc)HelpRequestCB,
6171 HELP_POPUP_MENU_STR);
6173 XmStringFree (label_string);
6176 /* Create 'Delete To Trash' option -- object popup */
6177 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 151, "Put in Trash")));
6178 XtSetArg (args[0], XmNlabelString, label_string);
6179 mnemonic = ((char *)GETMESSAGE(20, 91, "T"));
6180 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6182 fileMgrPopup.objPopup[BTN_TRASH] = popupBtns[i] =
6183 XmCreatePushButtonGadget (fileMgrPopup.menu, "trash", args, 2);
6184 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6185 (XtCallbackProc)HelpRequestCB,
6186 HELP_POPUP_MENU_STR);
6188 XmStringFree (label_string);
6190 /* Create 'Help' option -- object popup */
6191 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 123, "Help")));
6192 XtSetArg (args[0], XmNlabelString, label_string);
6193 mnemonic = ((char *)GETMESSAGE(20, 102, "H"));
6194 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6196 fileMgrPopup.objPopup[BTN_HELP] = popupBtns[i] =
6197 XmCreatePushButtonGadget (fileMgrPopup.menu, "popupHelp", args, 2);
6198 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6199 (XtCallbackProc)HelpRequestCB,
6200 HELP_HELP_MENU_STR);
6202 XmStringFree (label_string);
6204 /* Create 'Restore' option -- trash popup */
6205 label_string = XmStringCreateLocalized ((GETMESSAGE(27, 24, "Put back")));
6206 XtSetArg (args[0], XmNlabelString, label_string);
6207 mnemonic = ((char *)GETMESSAGE(27, 26, "P"));
6208 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6209 fileMgrPopup.trash_objPopup[BTN_RESTORE] = popupBtns[i] =
6210 XmCreatePushButtonGadget (fileMgrPopup.menu, "putBack", args, 2);
6211 XtAddCallback(popupBtns[i++], XmNhelpCallback,
6212 (XtCallbackProc)HelpRequestCB,
6213 HELP_TRASH_DIALOG_STR);
6214 XmStringFree (label_string);
6217 /* Create 'Remove' option -- trash popup */
6218 label_string = XmStringCreateLocalized ((GETMESSAGE(27, 28, "Shred")));
6219 XtSetArg (args[0], XmNlabelString, label_string);
6220 mnemonic = ((char *)GETMESSAGE(27, 30, "h"));
6221 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6222 fileMgrPopup.trash_objPopup[BTN_REMOVE] = popupBtns[i] =
6223 XmCreatePushButtonGadget (fileMgrPopup.menu, "shred", args, 2);
6224 XtAddCallback(popupBtns[i++], XmNhelpCallback,
6225 (XtCallbackProc)HelpRequestCB,
6226 HELP_TRASH_DIALOG_STR);
6227 XmStringFree (label_string);
6230 /* Create separator -- white space popup and object popup */
6231 fileMgrPopup.action_separator = popupBtns[i++] =
6232 XmCreateSeparatorGadget(fileMgrPopup.menu, "sep2", NULL, 0);
6235 /* Manage popup buttons */
6236 XtManageChildren(popupBtns, i);
6241 /************************************************************************
6243 * DoTheMove - the user wishes to actually do the move even though its
6244 * not the desktop object that is actually getting moved.
6245 * This function calls the routines which do the moves. It
6246 * depends on the view type to determine how it does it.
6248 * DESKTOP - the drop happened on a Desktop object
6249 * and the object was a directory
6250 * NOT_DESKTOP_DIR - the drop happened on a directory
6251 * but it wasn't a directory on the desktop.
6252 * NOT_DESKTOP - drop happened in a FileManager view
6253 * and not on a directory.
6255 * if the type passed in is DESKTOP, then remove the corresponding
6258 ************************************************************************/
6267 char *file, *next, *end;
6268 char directory[MAX_PATH];
6269 Boolean result = True;
6271 file_count = global_file_count;
6272 file_set = global_file_set;
6273 host_set = global_host_set;
6279 RepositionIcons(fm, file_set, file_count, dx, dy, True);
6281 result = FileMoveCopy(fm,
6282 NULL, fm->current_directory, fm->host,
6283 host_set, file_set, file_count,
6284 (unsigned int)0, NULL, NULL);
6289 for(j = 0; j < file_count; j++)
6291 /* remove the Desktop object which corresponds to this move */
6292 for(i = 0; i < desktop_data->numIconsUsed; i++)
6295 DesktopRec *desktopWin;
6297 desktopWin = desktop_data->desktopWindows[i];
6298 if (strcmp(desktopWin->host, host_set[j]) != 0)
6301 fileName = (char *)XtMalloc(strlen(desktopWin->dir_linked_to)+
6302 strlen(desktopWin->file_name) + 3);
6303 sprintf( fileName, "%s/%s", desktopWin->dir_linked_to,
6304 desktopWin->file_name );
6306 * if fileName == file_set[j] then the file is on the
6307 * Desktop so change the dir_linked to reference. What the
6308 * new reference is depends on which view type is being
6311 if(strcmp(fileName, file_set[j]) == 0)
6315 Screen *currentScreen;
6317 char *workspace_name;
6319 screen = XDefaultScreen(XtDisplay(desktopWin->shell));
6321 XScreenOfDisplay(XtDisplay(desktopWin->shell), screen);
6322 rootWindow = RootWindowOfScreen(currentScreen);
6324 if(DtWsmGetCurrentWorkspace(XtDisplay(desktopWin->shell),
6325 rootWindow, &pCurrent) == Success)
6327 XGetAtomName (XtDisplay(desktopWin->shell), pCurrent);
6329 workspace_name = XtNewString("One");
6330 if (strcmp(workspace_name, desktopWin->workspace_name) == 0)
6332 RemoveDT (desktopWin->shell, (XtPointer) desktopWin,
6334 XtFree(workspace_name);
6335 workspace_name = NULL;
6338 XtFree(workspace_name);
6339 workspace_name = NULL;
6347 case NOT_DESKTOP_DIR:
6348 sprintf( directory, "%s/%s", dd->name, fv->file_data->file_name );
6350 result = FileMoveCopy (fm,
6351 NULL, directory, fm->host,
6352 host_set, file_set, file_count,
6353 (unsigned int) 0, NULL, NULL);
6360 DirectorySet * directory_data = (DirectorySet *)fv->directory_set;
6362 sprintf( directory, "%s/%s", directory_data->name,
6363 fv->file_data->file_name );
6365 result = FileMoveCopyDesktop (fv, directory, host_set, file_set,
6366 file_count, mod, dtWindow,
6372 _DtFreeDroppedFileInfo(file_count, file_set, host_set);
6380 Cardinal *num_params )
6382 XmDrawingAreaCallbackStruct cb ;
6383 FileMgrRec * fileMgrRec;
6385 Widget input_on_gadget ;
6387 if ((event->type == KeyPress)
6388 ||(event->type == KeyRelease))
6396 cb.reason = XmCR_INPUT ;
6399 if( *(params[0]) != '@' )
6402 sscanf( params[0], "%lx", &fileMgrRec );
6404 sscanf( params[0], "%p", (void **) &fileMgrRec );
6406 FileWindowInputCallback( wid, (XtPointer)fileMgrRec, (XtPointer)&cb );