2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $TOG: FileMgr.c /main/19 1998/01/27 12:19:54 mgreess $ */
24 /************************************<+>*************************************
25 ****************************************************************************
29 * COMPONENT_NAME: Desktop File Manager (dtfile)
31 * Description: Source file for the File Manager dialog.
33 * FUNCTIONS: BranchListToString
45 * DropOnPrimaryHotspot
48 * FileMgrBuildDirectories
49 * FileMgrPropagateSettings
50 * FileMgrRedisplayFiles
71 * PositioningEnabledInView
72 * ProcessDropOnFileWindow
78 * SelectionListToString
88 * StringToSelectionList
96 * (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
97 * (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
98 * (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
99 * (c) Copyright 1993, 1994, 1995 Novell, Inc.
101 ****************************************************************************
102 ************************************<+>*************************************/
105 #include <sys/types.h>
108 #include <sys/stat.h>
112 #include <Xm/CascadeB.h>
113 #include <Xm/DrawingA.h>
114 #include <Xm/DrawingAP.h>
115 #include <Xm/DrawnB.h>
116 #include <Xm/Frame.h>
118 #include <Xm/LabelG.h>
119 #include <Xm/MainW.h>
120 #include <Xm/PushBG.h>
121 #include <Xm/RowColumn.h>
122 #include <Xm/ScrolledW.h>
123 #include <Xm/SeparatoG.h>
125 #include <Xm/TextF.h>
126 #include <Xm/ToggleBG.h>
127 #include <Xm/VendorSEP.h>
129 #include <Dt/IconP.h>
130 #include <Dt/IconFile.h>
132 #include <X11/ShellP.h>
133 #include <X11/Shell.h>
134 #include <X11/Xatom.h>
135 #include <X11/keysymdef.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()\n\
512 <Key>Return:DrawingAreaInput() ManagerGadgetSelect()\n\
513 <Key>space:DrawingAreaInput() ManagerGadgetSelect()\n\
514 :<Key>plus:DrawingAreaInput() ManagerGadgetSelect()\n\
515 :<Key>minus:DrawingAreaInput() ManagerGadgetSelect()\n\
516 <KeyDown>:DrawingAreaInput() ManagerGadgetKeyInput()\n\
517 <KeyUp>:DrawingAreaInput()";
518 #endif /* DOUBLE_CLICK_DRAG */
520 /************************************************************************
522 * FontListDefaultEntry
524 * Return the first entry in the font list with the tag
525 * XmFONTLIST_DEFAULT_TAG. If there isn't one, just return the
526 * first entry in the font list.
528 ************************************************************************/
530 static XmFontListEntry
531 FontListDefaultEntry(XmFontList font_list)
533 XmFontContext context;
534 XmFontListEntry first_entry, entry;
537 if (!XmFontListInitFontContext(&context, font_list))
540 entry = first_entry = XmFontListNextEntry(context);
542 tag = XmFontListEntryGetTag(entry);
543 if (!strcmp(XmFONTLIST_DEFAULT_TAG, tag)) {
549 entry = XmFontListNextEntry(context);
552 XmFontListFreeFontContext(context);
554 return entry ? entry : first_entry;
557 /************************************************************************
561 ************************************************************************/
567 Widget *return_widget,
570 static Boolean first = True;
571 FileMgrRec * file_mgr_rec;
576 Widget header_separator;
577 Widget iconic_path_da;
578 Widget current_directory_frame;
579 Widget current_directory_drop;
580 Widget current_directory_icon;
581 Widget directory_list_form;
584 Widget status_separator;
594 XmFontList font_list;
595 XtPointer entry_font;
597 XFontSetExtents *extents;
604 int icon_offset, cur_dir_offset;
605 Dimension shadow_thickness;
606 Dimension highlight_thickness;
607 XtTranslations trans_table, trans_table1;
610 /* Allocate the change directory dialog instance record. */
612 file_mgr_rec = (FileMgrRec *) XtMalloc (sizeof (FileMgrRec));
613 file_mgr_rec->action_pane_file_type = NULL;
615 /* set up translations in main edit widget */
616 trans_table = XtParseTranslationTable(translations_sp_esc);
618 char * resolvedTranslationString;
620 resolvedTranslationString = ResolveTranslationString( translations_da,
621 (char *)file_mgr_rec );
622 trans_table1 = XtParseTranslationTable( resolvedTranslationString );
623 XtFree( resolvedTranslationString );
624 resolvedTranslationString = NULL;
627 /* Create the shell and main window used for the view. */
629 XtSetArg (args[0], XmNallowShellResize, True);
630 if(!first && (special_view == True && special_title != NULL && !TrashView))
632 file_mgr_rec->shell = shell =
633 XtAppCreateShell (special_title, DTFILE_CLASS_NAME,
634 applicationShellWidgetClass, display, args, 1);
635 XtFree(special_title);
636 special_title = NULL;
639 file_mgr_rec->shell = shell =
640 XtAppCreateShell (application_name, DTFILE_CLASS_NAME,
641 applicationShellWidgetClass, display, args, 1);
643 special_view = False;
646 XtSetArg (args[n], XmNdeleteResponse, XmUNMAP); n++;
648 if (first == False || TrashView)
650 XtSetArg (args[n], XmNgeometry, NULL); n++;
655 /* Set the useAsyncGeo on the shell */
656 XtSetArg (args[n], XmNuseAsyncGeometry, True); n++;
657 XtSetValues (shell, args, n);
659 delete_window = XmInternAtom (XtDisplay (shell), "WM_DELETE_WINDOW", False);
660 XmAddWMProtocolCallback (shell, delete_window, (XtCallbackProc)SystemClose,
661 (XtPointer)file_mgr_rec);
663 file_mgr_rec->main = mainWidget = XmCreateMainWindow (shell, "main", args, 1);
664 XtManageChild (mainWidget);
665 XtAddCallback(mainWidget, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
666 HELP_FILE_MANAGER_VIEW_STR);
669 /* Get the select color */
671 XtSetArg (args[0], XmNbackground, &background);
672 XtSetArg (args[1], XmNcolormap, &colormap);
673 XtGetValues (mainWidget, args, 2);
675 XmGetColors (XtScreen (mainWidget), colormap, background,
676 &foreground, &top_shadow, &bottom_shadow, &select);
678 /* Create the menu. */
683 file_mgr_rec->menuStates = 0;
684 file_mgr_rec->menu = menu = CreateTrashMenu (mainWidget, file_mgr_rec);
688 file_mgr_rec->menuStates = (RENAME | MOVE | DUPLICATE | LINK | TRASH |
689 MODIFY | CHANGEDIR | PREFERENCES | FILTER |
690 FIND | CREATE_DIR | CREATE_FILE | SETTINGS |
692 HOME | CHANGE_DIR | TERMINAL);
694 file_mgr_rec->menu = menu = CreateMenu (mainWidget, file_mgr_rec);
697 /* Create the work area frame. */
699 XtSetArg (args[0], XmNshadowThickness, 1);
700 XtSetArg (args[1], XmNshadowType, XmSHADOW_OUT);
701 XtSetArg (args[2], XmNmarginWidth, 5);
702 XtSetArg (args[3], XmNmarginHeight, 5);
703 work_frame = XmCreateFrame (mainWidget, "work_frame", args, 4);
704 XtManageChild (work_frame);
707 /* Create the current directory frame. */
710 XtSetArg (args[n], XmNshadowThickness, 1); n++;
711 XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
712 XtSetArg (args[n], XmNmarginWidth, 1); n++;
713 XtSetArg (args[n], XmNmarginHeight, 1); n++;
714 XtSetArg (args[n], XmNtextTranslations, trans_table); n++;
715 file_mgr_rec->header_frame = header_frame =
716 XmCreateForm (mainWidget, "header_frame", args, n);
718 XtAddCallback(header_frame, XmNhelpCallback,
719 (XtCallbackProc)HelpRequestCB,
720 HELP_FILE_MANAGER_VIEW_STR);
722 /* Create the current directory line only if not in showFilesystem. */
723 if (showFilesystem && !TrashView)
725 /* Create the iconic path */
727 XtSetArg (args[n], DtNfileMgrRec, file_mgr_rec); n++;
728 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
729 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
730 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
731 file_mgr_rec->iconic_path_da = iconic_path_da =
732 _DtCreateIconicPath(header_frame, "iconic_path", args, n);
733 XtManageChild (iconic_path_da);
734 file_mgr_rec->iconic_path_width = 0;
736 /* Create the separator between iconic path and current directory */
738 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
739 XtSetArg (args[n], XmNtopWidget, iconic_path_da); n++;
740 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
741 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
742 file_mgr_rec->header_separator = header_separator =
743 XmCreateSeparatorGadget(header_frame, "header_separator", args, n);
744 XtManageChild (header_separator);
746 /* Create a form for the current directory */
748 XtSetArg (args[n], XmNtextTranslations, trans_table); n++;
749 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
750 XtSetArg (args[n], XmNtopWidget, header_separator); n++;
751 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
752 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
753 file_mgr_rec->current_directory_frame = current_directory_frame =
754 XmCreateForm (header_frame, "current_directory_frame", args, n);
755 XtManageChild (file_mgr_rec->current_directory_frame);
757 /* Event handler for detecting drag threshold surpassed */
758 XtAddEventHandler(current_directory_frame,
759 Button1MotionMask|Button2MotionMask,
760 False, (XtEventHandler)CurrentDirectoryIconMotion,
763 /* Create the change directory drop zone. */
766 if (change_view_pixmap == XmUNSPECIFIED_PIXMAP)
769 _DtGetPixmap(XtScreen(current_directory_frame),
770 CHANGE_VIEW_ICON_S, foreground, background);
773 XtSetArg (args[n], XmNstring, NULL); n++;
774 XtSetArg (args[n], XmNshadowThickness, 2); n++;
775 XtSetArg (args[n], XmNfillOnArm, False); n++;
776 XtSetArg (args[n], XmNhighlightThickness, 0); n++;
777 XtSetArg (args[n], XmNpixmap, change_view_pixmap); n++;
778 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
779 XtSetArg (args[n], XmNtopOffset, 2); n++;
780 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
781 XtSetArg (args[n], XmNleftOffset, 5); n++;
782 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
783 XtSetArg (args[n], XmNbottomOffset, 2); n++;
784 XtSetArg (args[n], XmNtraversalOn, False); n++;
785 XtSetArg (args[n], XmNdropSiteOperations,
786 XmDROP_MOVE | XmDROP_COPY | XmDROP_LINK); n++;
787 file_mgr_rec->current_directory_drop = current_directory_drop =
788 _DtCreateIcon (current_directory_frame, "drop_cd", args, n);
790 XtAddCallback (current_directory_drop, XmNdropCallback,
791 DropOnChangeView, (XtPointer) file_mgr_rec);
794 file_mgr_rec->current_directory_drop = current_directory_drop = NULL;
796 /* Create the current directory icon. */
798 XtSetArg (args[n], XmNstring, NULL); n++;
799 XtSetArg (args[n], XmNimageName, SMALL_DIRECTORY_ICON); n++;
800 XtSetArg (args[n], XmNshadowThickness, 0); n++;
801 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
804 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
805 XtSetArg (args[n], XmNleftWidget, current_directory_drop); n++;
806 XtSetArg (args[n], XmNleftOffset, 0); n++;
810 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
811 XtSetArg (args[n], XmNleftOffset, 5); n++;
813 XtSetArg (args[n], XmNtraversalOn, False); n++;
814 file_mgr_rec->current_directory_icon = current_directory_icon =
815 _DtCreateIcon (current_directory_frame, "current_directory_icon",
818 /* Create the current directory line */
820 XtSetArg (args[n], XmNshadowThickness, 0); n++;
821 XtSetArg (args[n], XmNmarginWidth, 0); n++;
822 XtSetArg (args[n], XmNmarginHeight, 0); n++;
823 XtSetArg (args[n], XmNpushButtonEnabled, False); n++;
824 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
825 XtSetArg (args[n], XmNtopOffset, 1); n++;
826 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
827 XtSetArg (args[n], XmNleftOffset, 5); n++;
828 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
829 XtSetArg (args[n], XmNrightOffset, 1); n++;
830 XtSetArg (args[n], XmNtraversalOn, True); n++;
831 file_mgr_rec->current_directory =
832 XmCreateDrawnButton(current_directory_frame, "current_directory",
834 XtManageChild (file_mgr_rec->current_directory);
837 /* Create overlay text field, for typing in a new directory */
839 XtSetArg (args[n], XmNmarginHeight, 0); n++;
840 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
841 XtSetArg (args[n], XmNtopOffset, 1); n++;
842 XtSetArg (args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET);n++;
843 XtSetArg (args[n], XmNleftWidget,
844 file_mgr_rec->current_directory); n++;
845 XtSetArg (args[n], XmNleftOffset, 0); n++;
846 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET);n++;
847 XtSetArg (args[n], XmNbottomWidget,
848 file_mgr_rec->current_directory); n++;
849 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
850 XtSetArg (args[n], XmNrightOffset, 1); n++;
851 XtSetArg (args[n], XmNtraversalOn, True); n++;
852 file_mgr_rec->current_directory_text = XmCreateTextField(
853 current_directory_frame, FAST_RENAME, args, n);
856 * Make sure the font & highlight thickness of the text field is the
857 * same as the corresponding values for the current directory line.
859 XtSetArg (args[0], XmNhighlightThickness, &highlight_thickness);
860 XtSetArg (args[1], XmNfontList, &font_list);
861 XtGetValues (file_mgr_rec->current_directory, args, 2);
863 XtSetArg (args[0], XmNhighlightThickness, highlight_thickness);
864 XtSetArg (args[1], XmNfontList, font_list);
865 XtSetValues (file_mgr_rec->current_directory_text, args, 2);
868 * Calculate how high to make the current directory line by adding
869 * up the font height and the highlight and shadow thickness
871 XtSetArg (args[0], XmNshadowThickness, &shadow_thickness);
872 XtGetValues (file_mgr_rec->current_directory_text, args, 1);
874 entry_font = XmFontListEntryGetFont(FontListDefaultEntry(font_list), &type);
875 if(type == XmFONT_IS_FONTSET) {
876 extents = XExtentsOfFontSet((XFontSet)entry_font);
877 font_height = extents->max_logical_extent.height;
880 font_height = ((XFontStruct *)entry_font)->ascent +
881 ((XFontStruct *)entry_font)->descent;
883 curdir_height = font_height + 2*(highlight_thickness + shadow_thickness);
885 XtSetArg (args[0], XmNtopOffset, &cur_dir_offset);
886 XtGetValues (file_mgr_rec->current_directory, args, 1);
888 XtSetArg (args[0], XmNheight, curdir_height);
889 XtSetValues (file_mgr_rec->current_directory, args, 1);
891 XtSetArg (args[0], XmNheight, curdir_height + 2*cur_dir_offset);
892 XtSetValues (file_mgr_rec->current_directory_frame, args, 1);
894 XtAddCallback(file_mgr_rec->current_directory_text, XmNactivateCallback,
895 (XtCallbackProc)ChangeToNewDir, file_mgr_rec);
896 XtAddCallback(file_mgr_rec->current_directory_text, XmNhelpCallback,
897 (XtCallbackProc)HelpRequestCB,
898 HELP_FILE_MANAGER_VIEW_STR);
900 /* This code is here so the Text Path (used to be Fast Change Dir
901 text) will be checked if user is ever try to type on the portion
902 before his restricted path.
903 It's no longer needed because, there won't be anything since
904 I'm tryting to treat restrictMode the same way I treat restricted
905 directory (i.e. dtfile -restricted).
906 Why I want to treat them the same way? Because they are the
907 same sort of things and it, also, solves the iconic path problem.
908 Note that user can double click on one of the icon and to a directory
909 above the restricted directory.
913 /* add the callbacks to make sure the user isn't able to
914 go anywhere above their restricted directory */
915 XtAddCallback (file_mgr_rec->current_directory_text,
916 XmNmodifyVerifyCallback, (XtCallbackProc)TextChange,
918 XtAddCallback (file_mgr_rec->current_directory_text,
919 XmNmotionVerifyCallback, (XtCallbackProc)TextChange,
925 /* create the status line */
927 XtSetArg (args[n], XmNshadowThickness, 1); n++;
928 XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
929 XtSetArg (args[n], XmNmarginWidth, 5); n++;
930 XtSetArg (args[n], XmNmarginHeight, 1); n++;
931 status_form = XmCreateForm (mainWidget, "status_form", args, n);
932 XtManageChild (status_form);
935 XtSetArg (args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
936 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
937 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
938 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
939 file_mgr_rec->status_line =
940 XmCreateLabelGadget (status_form, "status_line", args, n);
941 XtManageChild (file_mgr_rec->status_line);
943 /* Associate the menu and frames with the appropriate */
944 /* areas of the main windows. */
946 XmMainWindowSetAreas (mainWidget, menu, file_mgr_rec->header_frame,
947 NULL, NULL, work_frame);
948 XtSetArg (args[0], XmNmessageWindow, status_form);
949 XtSetValues(mainWidget, args, 1);
951 /* Create the Scrolled Window for the file display area and */
952 /* set the scrollbars colors correctly. */
955 XtSetArg (args[n], XmNspacing, 2); n++;
956 XtSetArg (args[n], XmNscrollingPolicy, XmAUTOMATIC); n++;
957 XtSetArg (args[n], XmNscrollBarDisplayPolicy, XmAS_NEEDED); n++;
958 file_mgr_rec->scroll_window =
959 XmCreateScrolledWindow (work_frame, "scroll_window", args, n);
960 XtManageChild (file_mgr_rec->scroll_window);
962 XtAddCallback(file_mgr_rec->scroll_window, XmNhelpCallback,
963 (XtCallbackProc)HelpRequestCB,
964 HELP_TRASH_OVERVIEW_TOPIC_STR);
966 XtAddCallback(file_mgr_rec->scroll_window, XmNhelpCallback,
967 (XtCallbackProc)HelpRequestCB,
968 HELP_FILE_MANAGER_VIEW_STR);
970 /* Get the 2 scrollbars and reset their foreground to the proper color */
971 /* Also turn their traversal off and set the highlight thickness to 0. */
973 XtSetArg (args[0], XmNhorizontalScrollBar, &(file_mgr_rec->horizontal_scroll_bar));
974 XtSetArg (args[1], XmNverticalScrollBar, &(file_mgr_rec->vertical_scroll_bar));
975 XtGetValues (file_mgr_rec->scroll_window, args, 2);
977 XtSetArg (args[0], XmNforeground, background);
978 XtSetArg (args[1], XmNtraversalOn, True);
979 XtSetValues (file_mgr_rec->horizontal_scroll_bar, args, 2);
980 XtSetValues (file_mgr_rec->vertical_scroll_bar, args, 2);
983 /* Add an event handler to catch resizes occuring on the scrolled */
984 /* window, in order to force a relayout of the icons. */
986 XtAddEventHandler (file_mgr_rec->scroll_window, StructureNotifyMask,
987 False, (XtEventHandler)FileWindowResizeCallback,
989 XtAddEventHandler (shell, StructureNotifyMask,
990 False, (XtEventHandler)FileWindowMapCallback,
994 /* Create a drawing area as a child of the scrolled window */
997 XtSetArg (args[n], XmNmarginWidth, 0); n++;
998 XtSetArg (args[n], XmNmarginHeight, 0); n++;
999 XtSetArg (args[n], XmNresizePolicy, XmRESIZE_GROW); n++;
1000 file_mgr_rec->file_window =
1001 XmCreateDrawingArea (file_mgr_rec->scroll_window, "file_window", args, n);
1002 XtAppAddActions( XtWidgetToApplicationContext(file_mgr_rec->file_window),
1004 XtNumber(FMAction));
1005 XtManageChild (file_mgr_rec->file_window);
1007 XtManageChild (file_mgr_rec->header_frame);
1009 XtSetArg (args[0], XmNbackground, select);
1010 XtSetValues (file_mgr_rec->file_window, args, 1);
1012 XtSetArg (args[0], XmNbackground, select);
1013 XtSetValues (XtParent (file_mgr_rec->file_window), args, 1);
1015 if(fileMgrPopup.menu == NULL)
1016 CreateFmPopup(file_mgr_rec->file_window);
1018 XmAddToPostFromList(fileMgrPopup.menu, file_mgr_rec->file_window);
1020 /* set up translations in main edit widget */
1021 #ifdef DOUBLE_CLICK_DRAG
1022 XtUninstallTranslations(file_mgr_rec->file_window);
1023 XtOverrideTranslations(file_mgr_rec->file_window,
1025 ((XmManagerClassRec *)XtClass(file_mgr_rec->file_window))
1026 ->manager_class.translations);
1027 XtOverrideTranslations(file_mgr_rec->file_window, trans_table1);
1028 XtOverrideTranslations(file_mgr_rec->file_window,
1029 XtParseTranslationTable(_XmDrawingA_traversalTranslations));
1031 XtOverrideTranslations(file_mgr_rec->file_window, trans_table1);
1034 /* Add the callbacks for processing selections, exposures, */
1035 /* and geometry changes of the drawing area. */
1037 XtAddCallback (file_mgr_rec->file_window, XmNexposeCallback,
1038 FileWindowExposeCallback, file_mgr_rec);
1040 XtAddCallback (file_mgr_rec->file_window, XmNinputCallback,
1041 FileWindowInputCallback, file_mgr_rec);
1043 /* Event handler for detecting drag threshold surpassed */
1044 XtAddEventHandler(file_mgr_rec->file_window,
1045 Button1MotionMask|Button2MotionMask,
1046 False, (XtEventHandler)FileIconMotion,
1049 /* Arrange for initial focus to be inside the file window */
1050 file_mgr_rec->focus_widget = file_mgr_rec->file_window;
1052 /* Set the return values for the dialog widget and dialog instance. */
1054 *return_widget = (Widget) mainWidget;
1055 *dialog = (XtPointer) file_mgr_rec;
1059 /************************************************************************
1063 ************************************************************************/
1066 GetDefaultValues( void )
1068 FileMgrData * file_mgr_data;
1069 PreferencesData *preferences_data;
1070 unsigned char *viewP;
1073 /* Allocate and initialize the default change dir dialog data. */
1075 file_mgr_data = (FileMgrData *) XtMalloc (sizeof (FileMgrData));
1077 file_mgr_data->displayed = False;
1078 file_mgr_data->mapped = False;
1079 file_mgr_data->x = 0;
1080 file_mgr_data->y = 0;
1082 file_mgr_data->busy_status = not_busy;
1083 file_mgr_data->busy_detail = 0;
1085 file_mgr_data->num_objects = 0;
1086 file_mgr_data->object_positions = NULL;
1087 file_mgr_data->grid_height = 0;
1088 file_mgr_data->grid_width = 0;
1089 file_mgr_data->layout_data = NULL;
1091 file_mgr_data->special_msg = NULL;
1092 file_mgr_data->msg_timer_id = 0;
1094 file_mgr_data->show_type = SINGLE_DIRECTORY;
1095 file_mgr_data->tree_files = TREE_FILES_NEVER;
1096 file_mgr_data->view_single = BY_NAME_AND_ICON;
1097 file_mgr_data->view_tree = BY_NAME_AND_SMALL_ICON;
1098 file_mgr_data->tree_preread_level = 1;
1099 file_mgr_data->tree_show_level = 1;
1100 file_mgr_data->show_iconic_path = True;
1101 file_mgr_data->show_current_dir = True;
1102 file_mgr_data->show_status_line = True;
1104 file_mgr_data->scrollToThisFile = NULL;
1105 file_mgr_data->scrollToThisDirectory = NULL;
1107 file_mgr_data->renaming = NULL;
1109 if(special_view && !TrashView)
1111 if(special_title != NULL)
1113 file_mgr_data->title = XtNewString(special_title);
1116 file_mgr_data->title = NULL;
1118 if(special_helpVol != NULL)
1120 file_mgr_data->helpVol = XtNewString(special_helpVol);
1121 XtFree(special_helpVol);
1122 special_helpVol = NULL;
1125 file_mgr_data->helpVol = XtNewString(fileMgrHelpVol);
1127 if(special_restricted != NULL)
1128 file_mgr_data->restricted_directory = special_restricted;
1130 file_mgr_data->restricted_directory = NULL;
1132 if(special_treeType == UNSET_VALUE)
1133 file_mgr_data->show_type = SINGLE_DIRECTORY;
1135 file_mgr_data->show_type = special_treeType;
1137 if(special_treeFiles == UNSET_VALUE)
1138 file_mgr_data->tree_files = TREE_FILES_NEVER;
1140 file_mgr_data->tree_files = special_treeFiles;
1142 if(file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1143 viewP = &file_mgr_data->view_tree;
1145 viewP = &file_mgr_data->view_single;
1146 if(special_viewType == UNSET_VALUE)
1147 file_mgr_data->view = *viewP;
1149 file_mgr_data->view = *viewP = special_viewType;
1151 if(special_orderType == UNSET_VALUE)
1152 file_mgr_data->order = ORDER_BY_ALPHABETICAL;
1154 file_mgr_data->order = special_orderType;
1156 if(special_directionType == UNSET_VALUE)
1157 file_mgr_data->direction = DIRECTION_ASCENDING;
1159 file_mgr_data->direction = special_directionType;
1161 if(special_randomType == UNSET_VALUE)
1162 file_mgr_data->positionEnabled = RANDOM_OFF;
1164 file_mgr_data->positionEnabled = special_randomType;
1169 if(fileMgrTitle == NULL)
1170 file_mgr_data->title = NULL;
1172 file_mgr_data->title = XtNewString(fileMgrTitle);
1174 file_mgr_data->helpVol = XtNewString(fileMgrHelpVol);
1176 if(treeType == UNSET_VALUE || TrashView)
1177 file_mgr_data->show_type = SINGLE_DIRECTORY;
1179 file_mgr_data->show_type = treeType;
1181 if(treeFiles == UNSET_VALUE)
1182 file_mgr_data->tree_files = TREE_FILES_NEVER;
1184 file_mgr_data->tree_files = treeFiles;
1186 if(file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1187 viewP = &file_mgr_data->view_tree;
1189 viewP = &file_mgr_data->view_single;
1190 if(viewType == UNSET_VALUE)
1191 file_mgr_data->view = *viewP;
1193 file_mgr_data->view = *viewP = viewType;
1195 if(orderType == UNSET_VALUE)
1196 file_mgr_data->order = ORDER_BY_ALPHABETICAL;
1198 file_mgr_data->order = orderType;
1200 if(directionType == UNSET_VALUE)
1201 file_mgr_data->direction = DIRECTION_ASCENDING;
1203 file_mgr_data->direction = directionType;
1205 if(randomType == UNSET_VALUE)
1206 file_mgr_data->positionEnabled = RANDOM_OFF;
1208 file_mgr_data->positionEnabled = randomType;
1210 file_mgr_data->restricted_directory = NULL;
1213 file_mgr_data->restoreKind = NORMAL_RESTORE;
1215 file_mgr_data->host = NULL;
1216 file_mgr_data->current_directory = NULL;
1217 file_mgr_data->branch_list = NULL;
1219 file_mgr_data->toolbox = False;
1220 file_mgr_data->dropSite = False;
1222 file_mgr_data->newSize = True;
1224 file_mgr_data->directory_count = 0;
1225 file_mgr_data->directory_set = NULL;
1226 file_mgr_data->tree_root = NULL;
1228 file_mgr_data->selection_list =
1229 (FileViewData **) XtMalloc (sizeof (FileViewData *));
1230 file_mgr_data->selection_list[0] = NULL;
1232 file_mgr_data->selection_table = NULL;
1233 file_mgr_data->selected_file_count = 0;
1235 file_mgr_data->fast_cd_enabled = False;
1236 file_mgr_data->show_hid_enabled = False;
1238 file_mgr_data->cd_inited = False;
1239 file_mgr_data->cd_font = NULL;
1240 file_mgr_data->cd_fontset = NULL;
1241 file_mgr_data->cd_normal_gc = 0;
1242 file_mgr_data->cd_select_gc = 0;
1243 file_mgr_data->cd_select = NULL;
1245 file_mgr_data->tree_solid_thin_gc = 0;
1246 file_mgr_data->tree_solid_thick_gc = 0;
1247 file_mgr_data->tree_dash_thin_gc = 0;
1248 file_mgr_data->tree_dash_thick_gc = 0;
1250 file_mgr_data->file_mgr_rec = NULL;
1251 file_mgr_data->popup_menu_icon = NULL;
1252 file_mgr_data->drag_file_view_data = NULL;
1254 file_mgr_data->change_dir = _DtGetDefaultDialogData (change_dir_dialog);
1255 file_mgr_data->preferences = _DtGetDefaultDialogData (preferences_dialog);
1257 /* now set up the preferences the way they really are */
1258 preferences_data = (PreferencesData *)file_mgr_data->preferences->data;
1259 preferences_data->show_type = file_mgr_data->show_type;
1260 preferences_data->tree_files = file_mgr_data->tree_files;
1261 preferences_data->view_single = file_mgr_data->view_single;
1262 preferences_data->view_tree = file_mgr_data->view_tree;
1263 preferences_data->order = file_mgr_data->order;
1264 preferences_data->direction = file_mgr_data->direction;
1265 preferences_data->positionEnabled = file_mgr_data->positionEnabled;
1266 preferences_data->show_iconic_path = file_mgr_data->show_iconic_path;
1267 preferences_data->show_current_dir = file_mgr_data->show_current_dir;
1268 preferences_data->show_status_line = file_mgr_data->show_status_line;
1270 file_mgr_data->filter_edit = _DtGetDefaultDialogData (filter_dialog);
1271 file_mgr_data->filter_active = _DtGetDefaultDialogData (filter_dialog);
1272 file_mgr_data->find = _DtGetDefaultDialogData (find_dialog);
1273 file_mgr_data->attr_dialog_list = NULL;
1274 file_mgr_data->attr_dialog_count = 0;
1275 file_mgr_data->secondaryHelpDialogList = NULL;
1276 file_mgr_data->secondaryHelpDialogCount = 0;
1277 file_mgr_data->primaryHelpDialog = NULL;
1279 return ((XtPointer) file_mgr_data);
1283 /************************************************************************
1287 ************************************************************************/
1291 XrmDatabase data_base,
1294 static Boolean first = True;
1295 FileMgrData * file_mgr_data;
1296 PreferencesData *preferences_data;
1298 char * directory_name;
1299 char * new_name_list[20];
1300 int name_list_count;
1301 struct passwd * pwInfo;
1311 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1312 SHOW_TYPE, StringToShowType, NULL, 0);
1313 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1314 TREE_FILES, StringToTreeFiles, NULL, 0);
1315 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1316 VIEW, StringToView, NULL, 0);
1317 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1318 ORDER, StringToOrder, NULL, 0);
1319 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1320 DIRECTION_RESRC, StringToDirection, NULL, 0);
1321 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1322 RANDOM, StringToRandom, NULL, 0);
1323 XtAppSetTypeConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1324 BRANCH_LIST, (XtTypeConverter)StringToBranchList,
1325 NULL, 0, XtCacheNone, NULL);
1326 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1327 SELECTION_LIST, (XtConverter)StringToSelectionList,
1332 /* Allocate and get the resources for change dir dialog data. */
1334 file_mgr_data = (FileMgrData *) XtMalloc (sizeof (FileMgrData));
1336 file_mgr_data->busy_status = not_busy;
1337 file_mgr_data->busy_detail = 0;
1338 file_mgr_data->num_objects = 0;
1339 file_mgr_data->object_positions = NULL;
1340 file_mgr_data->grid_height = 0;
1341 file_mgr_data->grid_width = 0;
1342 file_mgr_data->layout_data = NULL;
1343 file_mgr_data->secondaryHelpDialogList = NULL;
1344 file_mgr_data->secondaryHelpDialogCount = 0;
1345 file_mgr_data->attr_dialog_count = 0;
1346 file_mgr_data->attr_dialog_list = NULL;
1347 file_mgr_data->primaryHelpDialog = NULL;
1348 file_mgr_data->popup_menu_icon = NULL;
1349 file_mgr_data->title = NULL;
1350 file_mgr_data->helpVol = NULL;
1351 file_mgr_data->restricted_directory = NULL;
1352 file_mgr_data->toolbox = False;
1353 file_mgr_data->dropSite = False;
1354 file_mgr_data->tree_preread_level = 1; /* @@@ make these resources? */
1355 file_mgr_data->tree_show_level = 1;
1356 file_mgr_data->tree_files = TREE_FILES_NEVER;
1357 file_mgr_data->special_msg = NULL;
1358 file_mgr_data->msg_timer_id = 0;
1359 file_mgr_data->show_iconic_path = True;
1360 file_mgr_data->show_current_dir = True;
1361 file_mgr_data->show_status_line = True;
1362 file_mgr_data->scrollToThisFile = NULL;
1363 file_mgr_data->scrollToThisDirectory = NULL;
1364 file_mgr_data->renaming = NULL;
1366 _DtDialogGetResources (data_base, name_list, FILEMGR, (char *)file_mgr_data,
1367 resources, fileMgrClass->resource_count);
1368 if (file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1369 file_mgr_data->view = file_mgr_data->view_tree;
1371 file_mgr_data->view = file_mgr_data->view_single;
1373 /* Bases on the type of restore session we are doing we must
1374 * adjust the host, current_directory, and selections to the
1375 * proper values (e.g. restore session or restore settings)
1377 if (restoreType != NORMAL_RESTORE)
1379 GetSessionDir(file_mgr_data);
1381 /* Adjust the selected files to null */
1382 file_mgr_data->selection_list = NULL;
1384 /* Set the Displayed to false so we do not use the x and y
1385 values when we place the window in showDialog
1387 file_mgr_data->displayed = False;
1389 if(special_view && !TrashView)
1391 if(special_title != NULL)
1392 file_mgr_data->title = XtNewString(special_title);
1394 file_mgr_data->title = XtNewString(file_mgr_data->title);
1396 if(special_helpVol != NULL)
1397 file_mgr_data->helpVol = XtNewString(special_helpVol);
1399 file_mgr_data->helpVol = XtNewString(file_mgr_data->helpVol);
1401 if(special_treeType != UNSET_VALUE)
1402 file_mgr_data->show_type = special_treeType;
1404 if(special_treeFiles != UNSET_VALUE)
1405 file_mgr_data->tree_files = special_treeFiles;
1407 if(special_viewType != UNSET_VALUE)
1409 file_mgr_data->view = special_viewType;
1410 if(file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1411 file_mgr_data->view_tree = special_viewType;
1413 file_mgr_data->view_single = special_viewType;
1416 if(special_orderType != UNSET_VALUE)
1417 file_mgr_data->order = special_orderType;
1419 if(special_directionType != UNSET_VALUE)
1420 file_mgr_data->direction = special_directionType;
1422 if(special_randomType != UNSET_VALUE)
1423 file_mgr_data->positionEnabled = special_randomType;
1427 file_mgr_data->title = XtNewString(file_mgr_data->title);
1428 file_mgr_data->helpVol = XtNewString(file_mgr_data->helpVol);
1433 GetSessionDir(file_mgr_data);
1435 file_mgr_data->title = XtNewString(file_mgr_data->title);
1436 file_mgr_data->helpVol = XtNewString(file_mgr_data->helpVol);
1439 /* The GetSessionDir() function depends on the hostname being set. */
1440 /* So, we'll do it earlier */
1441 if(file_mgr_data->host != NULL)
1442 file_mgr_data->host = XtNewString(file_mgr_data->host);
1444 file_mgr_data->host = XtNewString(home_host_name);
1446 file_mgr_data->restoreKind = NORMAL_RESTORE;
1448 file_mgr_data->directory_count = 0;
1449 file_mgr_data->directory_set = NULL;
1450 file_mgr_data->tree_root = NULL;
1452 file_mgr_data->selected_file_count = 0;
1453 file_mgr_data->selection_table = (char **) file_mgr_data->selection_list;
1454 file_mgr_data->selection_list =
1455 (FileViewData **) XtMalloc (sizeof (FileViewData *));
1456 file_mgr_data->selection_list[0] = NULL;
1458 file_mgr_data->cd_inited = False;
1459 file_mgr_data->cd_font = NULL;
1460 file_mgr_data->cd_fontset = NULL;
1461 file_mgr_data->cd_normal_gc = 0;
1462 file_mgr_data->cd_select_gc = 0;
1463 file_mgr_data->cd_select = NULL;
1465 file_mgr_data->popup_menu_icon = NULL;
1466 file_mgr_data->drag_file_view_data = NULL;
1468 file_mgr_data->tree_solid_thin_gc = 0;
1469 file_mgr_data->tree_solid_thick_gc = 0;
1470 file_mgr_data->tree_dash_thin_gc = 0;
1471 file_mgr_data->tree_dash_thick_gc = 0;
1473 host_name = XtNewString (file_mgr_data->host);
1474 directory_name = XtNewString (file_mgr_data->current_directory);
1476 FileMgrBuildDirectories (file_mgr_data, host_name, directory_name);
1478 XtFree ((char *) host_name);
1480 XtFree ((char *) directory_name);
1482 if (restoreType == NORMAL_RESTORE &&
1483 file_mgr_data->positionEnabled == RANDOM_ON)
1485 /* Restore the optional positional data */
1486 RestorePositionalData(data_base, name_list, file_mgr_data, FILEMGR);
1490 /* Get a copy of the name list to be used to build new name lists. */
1492 _DtDuplicateDialogNameList(name_list, new_name_list, 20, &name_list_count);
1494 /* Load sub-dialogs */
1496 /* Get secondary help dialogs */
1497 if(restoreType == NORMAL_RESTORE &&
1498 file_mgr_data->secondaryHelpDialogCount > 0)
1500 _DtLoadSubdialogArray(new_name_list, name_list_count,
1501 &(file_mgr_data->secondaryHelpDialogList),
1502 file_mgr_data->secondaryHelpDialogCount,
1503 help_dialog, data_base, 1);
1507 file_mgr_data->secondaryHelpDialogList = NULL;
1508 file_mgr_data->secondaryHelpDialogCount = 0;
1511 /* Get primary help dialog */
1512 new_name_list[name_list_count] = number;
1513 new_name_list[name_list_count + 1] = NULL;
1514 sprintf(number, "%d", 0);
1515 if (restoreType == NORMAL_RESTORE)
1517 file_mgr_data->primaryHelpDialog =
1518 _DtGetResourceDialogData(help_dialog, data_base, new_name_list);
1519 if(((DialogInstanceData *)
1520 (file_mgr_data->primaryHelpDialog->data))->displayed == False)
1522 _DtFreeDialogData( file_mgr_data->primaryHelpDialog );
1523 file_mgr_data->primaryHelpDialog = NULL;
1527 file_mgr_data->primaryHelpDialog = NULL;
1529 if (restoreType == NORMAL_RESTORE &&
1530 file_mgr_data->attr_dialog_count > 0)
1532 /* Get properties dialogs */
1533 _DtLoadSubdialogArray(new_name_list, name_list_count,
1534 &(file_mgr_data->attr_dialog_list),
1535 file_mgr_data->attr_dialog_count,
1536 mod_attr_dialog, data_base, 1);
1540 file_mgr_data->attr_dialog_list = NULL;
1541 file_mgr_data->attr_dialog_count = 0;
1543 new_name_list[name_list_count] = NULL;
1545 file_mgr_data->change_dir =
1546 _DtGetResourceDialogData (change_dir_dialog, data_base, name_list);
1548 file_mgr_data->preferences =
1549 _DtGetResourceDialogData (preferences_dialog, data_base, name_list);
1551 /* Set all dialogs displayed flag for change_dir, and preferences
1552 * to false if not NORMAL_RESTORE
1554 if (restoreType != NORMAL_RESTORE)
1556 ((DialogInstanceData *)
1557 (file_mgr_data->change_dir->data))->displayed = False;
1559 ((DialogInstanceData *)
1560 (file_mgr_data->preferences->data))->displayed = False;
1563 /* now set up the preferences the way they really are */
1564 preferences_data = (PreferencesData *)file_mgr_data->preferences->data;
1565 preferences_data->show_type = file_mgr_data->show_type;
1566 preferences_data->tree_files = file_mgr_data->tree_files;
1567 preferences_data->view_single = file_mgr_data->view_single;
1568 preferences_data->view_tree = file_mgr_data->view_tree;
1569 preferences_data->order = file_mgr_data->order;
1570 preferences_data->direction = file_mgr_data->direction;
1571 preferences_data->positionEnabled = file_mgr_data->positionEnabled;
1572 preferences_data->show_iconic_path = file_mgr_data->show_iconic_path;
1573 preferences_data->show_current_dir = file_mgr_data->show_current_dir;
1574 preferences_data->show_status_line = file_mgr_data->show_status_line;
1576 /* Build the name list for the file dialog that is displayed, */
1577 /* get resource data and perform and other initialization. */
1579 tmpStr = GetSharedMessage(FILTER_EDIT_ID_STRING);
1580 new_name_list[name_list_count] = XtNewString (tmpStr);
1581 new_name_list[name_list_count + 1] = NULL;
1583 file_mgr_data->filter_edit =
1584 _DtGetResourceDialogData (filter_dialog, data_base, new_name_list);
1586 XtFree ((char *) new_name_list[name_list_count]);
1587 new_name_list[name_list_count] = NULL;
1590 /* Build the name list for the filter dialog that is used for the */
1591 /* current processing values. Get the resource data and perform */
1592 /* and other initialization. */
1594 tmpStr = GetSharedMessage(FILTER_ACTIVE_ID_STRING);
1595 new_name_list[name_list_count] = XtNewString (tmpStr);
1596 new_name_list[name_list_count + 1] = NULL;
1598 file_mgr_data->filter_active =
1599 _DtGetResourceDialogData (filter_dialog, data_base, new_name_list);
1601 XtFree ((char *) new_name_list[name_list_count]);
1602 new_name_list[name_list_count] = NULL;
1604 /* Get the resource data for the find dialog and perform */
1605 /* additional initialization. */
1607 file_mgr_data->find =
1608 _DtGetResourceDialogData (find_dialog, data_base, name_list);
1611 /* Set the FilterDialog and Find dialog displayed flag to false if
1612 * not NORMAL_RESTORE
1615 if (restoreType != NORMAL_RESTORE)
1617 ((DialogInstanceData *)
1618 (file_mgr_data->filter_edit->data))->displayed = False;
1620 ((DialogInstanceData *)
1621 (file_mgr_data->find->data))->displayed = False;
1625 return ((XtPointer) file_mgr_data);
1628 /************************************************************************
1632 ************************************************************************/
1636 FileMgrRec *file_mgr_rec,
1637 FileMgrData *file_mgr_data )
1639 Widget cd = file_mgr_rec->current_directory;
1640 Widget cdi = file_mgr_rec->current_directory_icon;
1641 Widget cdd = file_mgr_rec->current_directory_drop;
1643 XmFontList font_list;
1644 XtPointer entry_font;
1648 XGCValues gc_values;
1650 ChangeDirData * change_dir_data;
1651 ModAttrRec *modAttr_rec;
1652 DialogData *attr_dialog;
1653 ModAttrData *attr_data;
1659 DirectorySet ** directory_set;
1660 FileViewData ** order_list;
1661 int directory_count;
1665 char *tmpStr, *tempStr;
1667 PixmapData *pixmapData;
1669 file_mgr_data->file_mgr_rec = (XtPointer) file_mgr_rec;
1671 /* this is what we did for the ultrix port to get the name of the
1672 Application dir right, BUT it has some bugs */
1673 if(file_mgr_data->title != NULL)
1675 XtSetArg (args[0], XmNtitle, file_mgr_data->title);
1676 XtSetValues(file_mgr_rec->shell, args, 1);
1679 /* Set up the callbacks for the current directory line only if
1680 not in showFilesystem. */
1682 if(showFilesystem && !TrashView)
1684 XtRemoveAllCallbacks (cd, XmNarmCallback);
1685 XtAddCallback (cd, XmNarmCallback, CurrentDirSelected, file_mgr_rec);
1687 XtRemoveAllCallbacks (cd, XmNexposeCallback);
1688 XtAddCallback (cd, XmNexposeCallback, CurrentDirExposed, file_mgr_rec);
1690 XtRemoveAllCallbacks (cdi, XmNcallback);
1691 XtAddCallback (cdi, XmNcallback, CurrentDirIconCallback, file_mgr_rec);
1695 XtRemoveAllCallbacks (cdd, XmNcallback);
1696 XtAddCallback (cdd, XmNcallback, CurrentDirDropCallback, file_mgr_rec);
1699 DtUpdateIconicPath(file_mgr_rec, file_mgr_data, False);
1703 * To help our menu callbacks get the file_mgr_rec when they are
1704 * activated, we will register the file_mgr_rec pointer as the
1705 * user_data for the menubar. That way, since the callbacks can
1706 * find out which menubar they were invoked from, they can easily
1707 * map this into the file_mgr_rec.
1709 XtSetArg(args[0], XmNuserData, file_mgr_rec);
1710 XtSetValues(file_mgr_rec->menu, args, 1);
1711 if(fileMgrPopup.menu != NULL)
1712 XtSetValues(fileMgrPopup.menu, args, 1);
1716 * Adjust some widgets, in case this is a recycled dialog, which
1717 * previously had been used as a desktop view, or vice-versa.
1720 XtManageChild(file_mgr_rec->header_frame);
1721 XtManageChild(file_mgr_rec->directoryBarBtn);
1724 if(showFilesystem && !TrashView)
1727 XtSetArg (args[0], XmNallowShellResize, False);
1728 XtSetValues(file_mgr_rec->shell, args, 1);
1731 widg = file_mgr_rec->directoryBarBtn;
1734 XtSetArg (args[0], XmNforeground, &foreground);
1735 XtSetArg (args[1], XmNbackground, &background);
1736 XtSetArg (args[2], XmNfontList, &font_list);
1737 XtGetValues (widg, args, 3);
1739 /* If the current_directory data has not been initialized */
1740 /* for this data record, do it now. */
1742 if (file_mgr_data->cd_inited == False)
1744 file_mgr_data->cd_inited = True;
1746 entry_font = XmFontListEntryGetFont(FontListDefaultEntry(font_list), &type);
1747 if(type == XmFONT_IS_FONTSET) {
1748 file_mgr_data->cd_fontset = (XFontSet)entry_font;
1749 file_mgr_data->cd_fonttype = XmFONT_IS_FONTSET;
1750 gc_mask = GCForeground | GCBackground;
1753 file_mgr_data->cd_font = (XFontStruct *)entry_font;
1754 file_mgr_data->cd_fonttype = XmFONT_IS_FONT;
1755 gc_values.font = ((XFontStruct *)entry_font)->fid;
1756 gc_mask = GCForeground | GCBackground | GCFont;
1759 gc_values.foreground = foreground;
1760 gc_values.background = background;
1761 file_mgr_data->cd_normal_gc = XtGetGC (widg, gc_mask, &gc_values);
1763 gc_values.foreground = background;
1764 gc_values.background = foreground;
1765 file_mgr_data->cd_select_gc = XtGetGC (widg, gc_mask, &gc_values);
1767 /* graphics contexts for drawing tree lines */
1768 gc_values.foreground = foreground;
1769 XtSetArg (args[0], XmNbackground, &gc_values.background);
1770 XtGetValues (file_mgr_rec->file_window, args, 1);
1771 gc_values.line_width = 2;
1772 gc_values.line_style = LineOnOffDash;
1773 gc_values.cap_style = CapNotLast;
1774 gc_values.dashes = TREE_DASH_WIDTH;
1776 gc_mask |= GCCapStyle;
1778 file_mgr_data->tree_solid_thin_gc =
1779 XtGetGC (widg, gc_mask, &gc_values);
1780 file_mgr_data->tree_solid_thick_gc =
1781 XtGetGC (widg, gc_mask | GCLineWidth, &gc_values);
1782 file_mgr_data->tree_dash_thin_gc =
1783 XtGetGC (widg, gc_mask | GCLineStyle | GCDashList, &gc_values);
1784 file_mgr_data->tree_dash_thick_gc =
1785 XtGetGC (widg, gc_mask | GCLineWidth |
1786 GCLineStyle | GCDashList, &gc_values);
1790 if(showFilesystem && !TrashView)
1792 /* Set the current directory icon to normal colors */
1793 SetToNormalColors (file_mgr_rec->current_directory_icon,
1794 file_mgr_rec->file_window, file_mgr_rec->main, 0);
1797 /* Update the Change Directory host name */
1798 change_dir_data = (ChangeDirData *) file_mgr_data->change_dir->data;
1799 if (change_dir_data->host_name != NULL)
1800 XtFree ((char *) change_dir_data->host_name);
1801 change_dir_data->host_name = XtNewString (file_mgr_data->host);
1803 /* Display the correct small directory icon */
1804 pixmapData = GetPixmapData(file_mgr_rec,
1806 file_mgr_data->current_directory,
1809 XtSetArg (args[0], XmNimageName, pixmapData->iconFileName);
1811 XtSetArg (args[0], XmNimageName, NULL);
1812 XtSetValues(cdi, args, 1);
1814 _DtCheckAndFreePixmapData(
1815 GetDirectoryLogicalType(file_mgr_data,
1816 file_mgr_data->current_directory),
1817 file_mgr_rec->shell,
1821 if(file_mgr_data->restricted_directory == NULL)
1822 textString = XtNewString(file_mgr_data->current_directory);
1827 ptr = file_mgr_data->current_directory +
1828 strlen(file_mgr_data->restricted_directory);
1829 if(strcmp(ptr, "") == 0)
1830 textString = XtNewString( "/" );
1832 textString = XtNewString( ptr );
1834 XmTextFieldSetString(file_mgr_rec->current_directory_text, textString);
1836 /* Clear the change dir text field */
1837 if (file_mgr_data->fast_cd_enabled)
1838 XtManageChild(file_mgr_rec->current_directory_text);
1840 XtUnmanageChild(file_mgr_rec->current_directory_text);
1841 XtSetArg (args[0], XmNallowShellResize, True);
1842 XtSetValues(file_mgr_rec->shell, args, 1);
1847 /* Get the file set displayed */
1848 FileMgrRedisplayFiles (file_mgr_rec, file_mgr_data, True);
1851 /* Set the icon name for this view to the directory name. */
1852 SetIconAttributes ((FileMgrRec *)file_mgr_data->file_mgr_rec, file_mgr_data,
1853 file_mgr_data->current_directory);
1856 /* Process the selection table into a selection list */
1858 if (file_mgr_data->selection_table != NULL)
1860 DeselectAllFiles (file_mgr_data);
1862 directory_set = file_mgr_data->directory_set;
1864 if (file_mgr_data->show_type == SINGLE_DIRECTORY)
1865 directory_count = 1;
1867 directory_count = file_mgr_data->directory_count;
1870 while (file_mgr_data->selection_table[i] != NULL)
1872 for (j = 0; j < directory_count; j++)
1874 if (strncmp (directory_set[j]->name,
1875 file_mgr_data->selection_table[i],
1876 strlen (directory_set[j]->name)) == 0)
1878 file_name = strrchr(file_mgr_data->selection_table[i], '/') +1;
1879 order_list = directory_set[j]->order_list;
1881 for (k = 0; k < directory_set[j]->file_count; k++)
1883 if (strcmp (file_name,
1884 order_list[k]->file_data->file_name) == 0)
1886 if (order_list[k]->filtered == False)
1887 SelectFile (file_mgr_data, order_list[k]);
1897 file_mgr_data->selection_table = NULL;
1900 /* Initially, all menubuttons are sensitive */
1902 file_mgr_rec->menuStates = (RENAME | MOVE | DUPLICATE | LINK | TRASH |
1903 MODIFY | CHANGEDIR | PREFERENCES | FILTER |
1904 FIND | CREATE_DIR | CREATE_FILE | SETTINGS |
1905 CLEAN_UP | MOVE_UP |
1906 HOME | CHANGE_DIR | TERMINAL);
1908 if(file_mgr_data != trashFileMgrData
1909 && file_mgr_data != NULL )
1911 if (file_mgr_data->selected_file_count == 0)
1912 ActivateNoSelect (file_mgr_rec);
1913 else if (file_mgr_data->selected_file_count == 1)
1914 ActivateSingleSelect (file_mgr_rec,
1915 file_mgr_data->selection_list[0]->file_data->logical_type);
1917 ActivateMultipleSelect (file_mgr_rec);
1920 SensitizeTrashBtns();
1922 /* Display any dialogs that need to be displayed */
1923 if (((DialogInstanceData *)
1924 (file_mgr_data->change_dir->data))->displayed == True)
1926 ShowChangeDirDialog ((Widget)NULL, (XtPointer)file_mgr_rec,
1930 file_mgr_rec->menuStates |= CHANGEDIR;
1933 if (((DialogInstanceData *)
1934 (file_mgr_data->preferences->data))->displayed == True)
1936 ShowPreferencesDialog ((Widget)NULL, (XtPointer)file_mgr_rec,
1940 file_mgr_rec->menuStates |= PREFERENCES;
1942 if (((DialogInstanceData *)
1943 (file_mgr_data->find->data))->displayed == True)
1945 ShowFindDialog ((Widget)NULL, (XtPointer)file_mgr_rec, (XtPointer)NULL);
1948 file_mgr_rec->menuStates |= FIND;
1951 if (((DialogInstanceData *)
1952 (file_mgr_data->filter_edit->data))->displayed == True)
1954 ShowFilterDialog ((Widget)NULL, (XtPointer)file_mgr_rec, (XtPointer)NULL);
1957 file_mgr_rec->menuStates |= FILTER;
1959 /* Display any properties dialogs */
1960 for (i = 0; i < file_mgr_data->attr_dialog_count; i++)
1962 if (((DialogInstanceData *)
1963 (file_mgr_data->attr_dialog_list[i]->data))->displayed == False)
1969 attr_dialog = (DialogData *)file_mgr_data->attr_dialog_list[i];
1970 attr_data = (ModAttrData *) attr_dialog->data;
1972 loadOk = LoadFileAttributes(attr_data->host, attr_data->directory,
1973 attr_data->name, attr_data);
1978 /* We need the file_mgr_rec inside the create routine so
1979 * we attach it here for use later.
1981 ((ModAttrData *) (file_mgr_data->attr_dialog_list[i]->data))->
1982 main_widget = file_mgr_rec->main;
1984 _DtShowDialog (file_mgr_rec->shell, NULL, (XtPointer)file_mgr_rec,
1985 file_mgr_data->attr_dialog_list[i],
1986 ModAttrChange, (XtPointer)file_mgr_rec, ModAttrClose,
1987 (XtPointer)file_mgr_rec, NULL, False, False, NULL, NULL);
1989 modAttr_rec = (ModAttrRec *)_DtGetDialogInstance(
1990 file_mgr_data->attr_dialog_list[i]);
1992 if(file_mgr_data->title != NULL &&
1993 strcmp(file_mgr_data->helpVol, DTFILE_HELP_NAME) != 0)
1995 tmpStr = GETMESSAGE(21, 1, "File Permissions");
1996 tempStr = (char *)XtMalloc(strlen(tmpStr) +
1997 strlen(file_mgr_data->title) + 5);
1998 sprintf(tempStr, "%s - %s", file_mgr_data->title, tmpStr);
2002 tmpStr = (GETMESSAGE(21,34, "File Manager - Permissions"));
2003 tempStr = XtNewString(tmpStr);
2005 XtSetArg (args[0], XmNtitle, tempStr);
2006 XtSetValues (modAttr_rec->shell, args, 1);
2011 /* The object would have got deleted and hence we are not able to
2014 ModAttrFreeValues(attr_data);
2015 XtFree((char *)attr_dialog);
2016 file_mgr_data->attr_dialog_count--;
2017 if(file_mgr_data->attr_dialog_count >0)
2018 file_mgr_data->attr_dialog_list = (DialogData **) XtRealloc(
2019 (char *) file_mgr_data->attr_dialog_list,
2020 sizeof(DialogData *) * file_mgr_data->attr_dialog_count);
2023 XtFree((char *)file_mgr_data->attr_dialog_list);
2024 file_mgr_data->attr_dialog_list = NULL;
2029 /* Display any secondary help dialogs */
2030 for (i = 0; i < file_mgr_data->secondaryHelpDialogCount; i++)
2032 ShowHelpDialog(file_mgr_rec->shell, (XtPointer)file_mgr_rec,
2034 file_mgr_data->secondaryHelpDialogList[i], NULL, NULL,
2038 /* Display the primary help dialog, if active */
2039 if (file_mgr_data->primaryHelpDialog && ((DialogInstanceData *)
2040 (file_mgr_data->primaryHelpDialog->data))->displayed == True)
2042 ShowHelpDialog(file_mgr_rec->shell, (XtPointer)file_mgr_rec,
2044 file_mgr_data->primaryHelpDialog, NULL, NULL, NULL,
2053 /************************************************************************
2055 * WriteResourceValues
2057 ************************************************************************/
2060 WriteResourceValues(
2065 FileMgrData * file_mgr_data = (FileMgrData *) values->data;
2066 FileMgrRec * file_mgr_rec;
2067 char * new_name_list[20];
2068 int name_list_count;
2074 /* If the dialog is currently displayed, update the geometry */
2075 /* fields to their current values. */
2077 if (file_mgr_data->displayed == True)
2079 _DtGenericUpdateWindowPosition(values);
2080 file_mgr_rec = (FileMgrRec *) _DtGetDialogInstance (values);
2084 /* save FILEMGR resources */
2085 /* store netfile version of current directory name */
2087 if ( file_mgr_data->current_directory && file_mgr_data->toolbox )
2090 char *user_session_str = NULL;
2093 current_host = file_mgr_data->host;
2094 user_session_str = getenv("DTUSERSESSION");
2095 ptr = strstr(file_mgr_data->current_directory, user_session_str);
2099 file_mgr_data->host = XtNewString(file_mgr_data->current_directory);
2100 *ptr = user_session_str[0];
2104 file_mgr_data->host = XtNewString(file_mgr_data->current_directory);
2107 _DtDialogPutResources (fd, name_list, FILEMGR, values->data,
2108 resources, fileMgrClass->resource_count);
2110 XtFree(file_mgr_data->host);
2111 file_mgr_data->host = current_host;
2115 _DtDialogPutResources (fd, name_list, FILEMGR, values->data,
2116 resources, fileMgrClass->resource_count);
2120 /* Save the optional positional data if needed, if file_mgr_data->host
2121 is set to NULL, this is from a save settings, don't save the position
2124 SavePositionalData(fd, file_mgr_data, name_list, FILEMGR);
2127 /* Get a copy of the name list to be used to build new name lists */
2128 _DtDuplicateDialogNameList(name_list, new_name_list, 20, &name_list_count);
2130 /* Write out all of the dialogs */
2132 _DtWriteDialogData (file_mgr_data->change_dir, fd, name_list);
2133 _DtWriteDialogData (file_mgr_data->preferences, fd, name_list);
2136 /* Save any properties dialogs */
2137 _DtSaveSubdialogArray(new_name_list, name_list_count,
2138 file_mgr_data->attr_dialog_list,
2139 file_mgr_data->attr_dialog_count, fd, 1);
2141 /* Save any secondary help dialogs */
2142 _DtSaveSubdialogArray(new_name_list, name_list_count,
2143 file_mgr_data->secondaryHelpDialogList,
2144 file_mgr_data->secondaryHelpDialogCount, fd, 1);
2146 /* Save the primary help dialog, if active */
2147 if (file_mgr_data->primaryHelpDialog)
2149 new_name_list[name_list_count] = number;
2150 new_name_list[name_list_count + 1] = NULL;
2151 sprintf(number, "%d", 0);
2152 _DtWriteDialogData(file_mgr_data->primaryHelpDialog, fd, new_name_list);
2155 tmpStr = GetSharedMessage(FILTER_EDIT_ID_STRING);
2156 new_name_list[name_list_count] = XtNewString (tmpStr);
2157 new_name_list[name_list_count + 1] = NULL;
2158 _DtWriteDialogData (file_mgr_data->filter_edit, fd, new_name_list);
2159 XtFree ((char *) new_name_list[name_list_count]);
2160 new_name_list[name_list_count] = NULL;
2162 tmpStr = GetSharedMessage(FILTER_ACTIVE_ID_STRING);
2163 new_name_list[name_list_count] = XtNewString (tmpStr);
2164 new_name_list[name_list_count + 1] = NULL;
2165 _DtWriteDialogData (file_mgr_data->filter_active, fd, new_name_list);
2166 XtFree ((char *) new_name_list[name_list_count]);
2167 new_name_list[name_list_count] = NULL;
2169 _DtWriteDialogData (file_mgr_data->find, fd, name_list);
2175 /************************************************************************
2178 * Free up space allocated by the FileMgr dialog. This
2179 * includes sub directory information, and attached dialog data.
2181 * Note: this routine frees the FileMgrData, not the FileMgrRec
2182 * (the FileMgrRec data structure will be reused by the dialog
2183 * caching code for the next dtfile window the user might open)
2185 ************************************************************************/
2189 FileMgrData *file_mgr_data )
2193 FileMgrRec *file_mgr_rec;
2195 if (file_mgr_data == NULL)
2198 file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
2200 FreeDirectoryData (file_mgr_data);
2202 if (file_mgr_data->branch_list != NULL)
2204 for (i = 0; file_mgr_data->branch_list[i]; i++)
2205 XtFree (file_mgr_data->branch_list[i]);
2206 XtFree ((char *) file_mgr_data->branch_list);
2207 file_mgr_data->branch_list = NULL;
2210 if (file_mgr_data->selection_list != NULL)
2212 XtFree ((char *) file_mgr_data->selection_list);
2213 file_mgr_data->selection_list = NULL;
2216 if (file_mgr_data->cd_select != NULL)
2218 XtFree ((char *) file_mgr_data->cd_select);
2219 file_mgr_data->cd_select = NULL;
2222 if (file_mgr_data->desktop_file != NULL)
2224 XtFree ((char *) file_mgr_data->desktop_file);
2225 file_mgr_data->desktop_file = NULL;
2229 XtFree(file_mgr_data->special_msg);
2230 file_mgr_data->special_msg = NULL;
2231 if (file_mgr_data->msg_timer_id)
2232 XtRemoveTimeOut(file_mgr_data->msg_timer_id);
2234 _DtDestroySubdialog(file_mgr_data->change_dir);
2235 _DtDestroySubdialog(file_mgr_data->preferences);
2236 _DtDestroySubdialog(file_mgr_data->filter_edit);
2237 _DtDestroySubdialog(file_mgr_data->filter_active);
2238 _DtDestroySubdialog(file_mgr_data->find);
2239 _DtDestroySubdialogArray(file_mgr_data->attr_dialog_list,
2240 file_mgr_data->attr_dialog_count);
2241 _DtDestroySubdialogArray(file_mgr_data->secondaryHelpDialogList,
2242 file_mgr_data->secondaryHelpDialogCount);
2243 _DtDestroySubdialog(file_mgr_data->primaryHelpDialog);
2246 && file_mgr_data != trashFileMgrData
2247 && file_mgr_data != NULL )
2249 /* Free up the GC's we got in SetValues */
2250 if(file_mgr_data->cd_normal_gc != NULL)
2251 XtReleaseGC(file_mgr_rec->current_directory,
2252 file_mgr_data->cd_normal_gc);
2253 if(file_mgr_data->cd_select_gc != NULL)
2254 XtReleaseGC(file_mgr_rec->current_directory_icon,
2255 file_mgr_data->cd_select_gc);
2257 if(file_mgr_data->tree_solid_thin_gc != NULL)
2258 XtReleaseGC(file_mgr_rec->current_directory_icon,
2259 file_mgr_data->tree_solid_thin_gc);
2260 if(file_mgr_data->tree_solid_thick_gc != NULL)
2261 XtReleaseGC(file_mgr_rec->current_directory_icon,
2262 file_mgr_data->tree_solid_thick_gc);
2263 if(file_mgr_data->tree_dash_thin_gc != NULL)
2264 XtReleaseGC(file_mgr_rec->current_directory_icon,
2265 file_mgr_data->tree_dash_thin_gc);
2266 if(file_mgr_data->tree_dash_thick_gc != NULL)
2267 XtReleaseGC(file_mgr_rec->current_directory_icon,
2268 file_mgr_data->tree_dash_thick_gc);
2271 FreeLayoutData(file_mgr_data->layout_data);
2273 { /* This block is added for rectifying memory leakages */
2274 XtFree(file_mgr_data->scrollToThisFile);
2275 XtFree(file_mgr_data->scrollToThisDirectory);
2278 XtFree ((char *) file_mgr_data);
2282 /************************************************************************
2285 * Destroy widgets and free up space allocated by the FileMgr dialog.
2286 * Called when the dialog is destroyed.
2288 ************************************************************************/
2292 XtPointer recordPtr )
2294 FileMgrRec *file_mgr_rec = (FileMgrRec *) recordPtr;
2296 XtDestroyWidget(file_mgr_rec->shell);
2298 XtFree(file_mgr_rec->action_pane_file_type);
2299 XtFree((char *)file_mgr_rec);
2308 Cardinal *num_params )
2310 XmDrawingAreaCallbackStruct cb ;
2311 FileMgrRec * fileMgrRec;
2313 Widget input_on_gadget ;
2315 if ((event->type == KeyPress)
2316 ||(event->type == KeyRelease))
2324 cb.reason = XmCR_INPUT;
2327 if( *(params[0]) != '@' )
2329 char * title = XtNewString( GETMESSAGE(12, 7, "File Manager") );
2330 char * tmp = "Gjmf Nbobhfs ufbn:\n\nTboez Bnjo\nEbo Ebp\nSbhiv Lspwwjej\nUfe Sbotpn\nMjoeb Sjfl\nGsbol Tdinvdl\nNvsbmj Tpnbspvuiv\n";
2332 int i, len = strlen( tmp );
2334 message = (char *)XtCalloc( 1, len + 1 );
2336 /* Not fancy, but serve the purpose */
2337 for( i = 0; i < len; ++i ){
2338 (( isalpha( tmp[i] ) ) ? (message[i] = (int)(tmp[i]) - 1) : (message[i] = tmp[i]));
2342 sscanf( params[0], "%lx", &fileMgrRec );
2344 sscanf( params[0], "%p", (void **) &fileMgrRec );
2346 _DtMessage(toplevel, title, message, NULL, HelpRequestCB);
2354 /************************************************************************
2355 ************************************************************************
2357 * Resource converters
2359 ************************************************************************
2360 ************************************************************************/
2363 /************************************************************************
2367 ************************************************************************/
2371 FileMgrData *file_mgr_data )
2373 if (restoreType == HOME_RESTORE) /* home settings restore */
2375 struct passwd * pwInfo;
2378 /* Set current_directory to the home dir */
2379 if ((homeDir = (char *)getenv("HOME")) == NULL)
2381 pwInfo = getpwuid (getuid());
2382 homeDir = pwInfo->pw_dir;
2385 file_mgr_data->current_directory = XtNewString(homeDir);
2387 file_mgr_data->current_directory =
2388 XtNewString(file_mgr_data->current_directory);
2390 if (file_mgr_data->restricted_directory)
2391 file_mgr_data->restricted_directory =
2392 XtNewString(file_mgr_data->restricted_directory);
2394 file_mgr_data->restricted_directory = NULL;
2396 else if (restoreType == TOOL_RESTORE) /* tool settings restore */
2398 file_mgr_data->current_directory =
2399 XtNewString(file_mgr_data->restricted_directory);
2401 if (file_mgr_data->restricted_directory)
2402 file_mgr_data->restricted_directory =
2403 XtNewString(file_mgr_data->restricted_directory);
2405 file_mgr_data->restricted_directory = NULL;
2407 else /* session restore */
2409 if ((file_mgr_data->current_directory) &&
2410 (file_mgr_data->toolbox) &&
2411 (file_mgr_data->host) &&
2412 (strcmp(file_mgr_data->host, file_mgr_data->current_directory) != 0))
2415 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 current_dir = XtMalloc(strlen(root_toolbox) +
2430 strlen(user_session_str) +
2431 strlen(toolbox_dir) + 1);
2432 sprintf(current_dir, "%s%s%s", root_toolbox,
2435 file_mgr_data->current_directory = current_dir;
2437 file_mgr_data->restricted_directory = XtMalloc(strlen(root_toolbox) +
2438 strlen(user_session_str) +
2440 sprintf(file_mgr_data->restricted_directory, "%s%s", root_toolbox,
2445 file_mgr_data->current_directory =
2446 XtNewString(file_mgr_data->current_directory);
2448 if (file_mgr_data->restricted_directory)
2449 file_mgr_data->restricted_directory =
2450 XtNewString(file_mgr_data->restricted_directory);
2452 file_mgr_data->restricted_directory = NULL;
2455 file_mgr_data->host = NULL;
2459 /************************************************************************
2462 * Given a file name get the right icon name for it.
2464 ************************************************************************/
2468 FileMgrRec *file_mgr_rec,
2469 FileMgrData *file_mgr_data,
2477 PixmapData * pixmapData;
2478 Tt_status tt_status;
2480 /* Display the correct small directory icon */
2481 ftype = GetDirectoryLogicalType(file_mgr_data, path);
2485 full_name = ResolveLocalPathName(file_mgr_data->host,
2490 if( TT_OK != tt_status )
2493 short_name = strrchr(full_name, '/');
2494 if (strcmp(short_name, "/.") == 0)
2496 if (short_name == full_name)
2499 short_name = strrchr(full_name, '/');
2501 if (strcmp(full_name, "/") == 0)
2502 short_name = full_name;
2504 *short_name++ = '\0';
2507 pixmapData = _DtRetrievePixmapData(ftype,
2510 file_mgr_rec->shell,
2513 pixmapData = _DtRetrievePixmapData(ftype,
2516 file_mgr_rec->shell,
2524 /************************************************************************
2526 * BranchListToString
2527 * Write out the array of strings to the file fd.
2529 ************************************************************************/
2538 Boolean first = True;
2543 (void) write (fd, out_buf, strlen (out_buf));
2546 branch_name = (*value)[i];
2548 while (branch_name != NULL)
2551 (void) write (fd, ", ", strlen (", "));
2555 (void) write (fd, branch_name, strlen (branch_name));
2558 branch_name = (*value)[i];
2561 (void) write (fd, "\n", strlen ("\n"));
2567 /************************************************************************
2569 * SelectionListToString
2570 * Write out the array of strings to the file fd.
2572 ************************************************************************/
2575 SelectionListToString(
2577 FileViewData ***value,
2581 Boolean first = True;
2582 FileViewData * file_view_data;
2583 DirectorySet * directory_set;
2587 (void) write (fd, out_buf, strlen (out_buf));
2590 file_view_data = (*value)[i];
2593 while (file_view_data != NULL)
2595 directory_set = (DirectorySet *) file_view_data->directory_set;
2598 (void) write (fd, ", ", strlen (", "));
2603 (void) write (fd, directory_set->name, strlen (directory_set->name));
2605 if (strcmp (directory_set->name, "/") != 0)
2606 (void) write (fd, "/", strlen ("/"));
2608 (void) write (fd, file_view_data->file_data->file_name,
2609 strlen (file_view_data->file_data->file_name));
2612 file_view_data = (*value)[i];
2615 (void) write (fd, "\n", strlen ("\n"));
2622 /************************************************************************
2624 * StringToBranchList
2625 * Convert a string to a string array.
2627 ************************************************************************/
2636 XtPointer *converter_data)
2638 static char ** table_ptr;
2641 char ** table = NULL;
2646 to_val->size = sizeof (char **);
2647 to_val->addr = (XtPointer) &table_ptr;
2649 if (from_val->addr == NULL)
2653 /* Loop through the string extracting branch names */
2654 /* and placing them into an array of strings. */
2656 current = start = (char *) from_val->addr;
2658 while (start != NULL)
2660 current = DtStrchr (start, ',');
2661 if (current != NULL)
2668 table = (char **) XtRealloc ((char *)table,
2669 sizeof (char *) * (table_size + 1));
2670 table[table_size] = NULL;
2672 table[table_size - 1] = XtNewString (start);
2678 to_val->addr = (XtPointer ) &table_ptr;
2679 to_val->size = sizeof(XtPointer);
2684 /************************************************************************
2686 * StringToSelectionList
2687 * Convert a string to a string array.
2689 ************************************************************************/
2692 StringToSelectionList(
2698 static char ** table_ptr;
2701 char ** table = NULL;
2706 to_val->size = sizeof (char **);
2707 to_val->addr = (XtPointer) &table_ptr;
2709 if (from_val->addr == NULL)
2713 /* Loop through the string extracting file specifications */
2714 /* and placing them into an array of strings. */
2716 current = start = (char *) from_val->addr;
2718 while (start != NULL)
2720 current = DtStrchr (start, ',');
2721 if (current != NULL)
2728 table = (char **) XtRealloc ((char *)table,
2729 sizeof (char *) * (table_size + 1));
2730 table[table_size] = NULL;
2732 table[table_size - 1] = XtNewString (start);
2738 to_val->addr = (XtPointer ) &table_ptr;
2739 to_val->size = sizeof(XtPointer);
2745 /************************************************************************
2746 ************************************************************************
2748 File Mgr file and directory processing functions.
2750 ************************************************************************
2751 ************************************************************************/
2754 /************************************************************************
2757 * Update the iconic path and current directory line.
2759 ************************************************************************/
2763 * Update the status line label widget to show the right text.
2767 FileMgrRec *file_mgr_rec,
2768 FileMgrData *file_mgr_data)
2770 char buf[21+MAX_PATH];
2771 XmString label_string;
2774 if (file_mgr_data->special_msg &&
2775 (file_mgr_data->busy_status == initiating_readdir ||
2776 file_mgr_data->busy_status == busy_readdir))
2778 SetSpecialMsg( file_mgr_rec, file_mgr_data, NULL );
2781 if (file_mgr_data->special_msg)
2783 label_string = XmStringCreateLocalized(file_mgr_data->special_msg);
2787 GetStatusMsg(file_mgr_data, buf);
2788 label_string = XmStringCreateLocalized(buf);
2790 XtSetArg (args[0], XmNlabelString, label_string);
2791 XtSetValues(file_mgr_rec->status_line, args, 1);
2792 XmStringFree (label_string);
2798 * Timeout routine that resets the status line after a
2799 * special message was shown (see also SetSpecialMsg).
2803 FileMgrData *file_mgr_data,
2806 FileMgrRec *file_mgr_rec;
2808 if (*id != file_mgr_data->msg_timer_id)
2811 file_mgr_data->msg_timer_id = 0;
2813 if (file_mgr_data->special_msg)
2815 XtFree(file_mgr_data->special_msg);
2816 file_mgr_data->special_msg = NULL;
2817 if (file_mgr_data->show_status_line)
2819 file_mgr_rec = (FileMgrRec *)file_mgr_data->file_mgr_rec;
2820 UpdateStatusLine(file_mgr_rec, file_mgr_data);
2828 * Arrange for a special message to be shown in the status line.
2829 * After 4 seconds the status line will revert back to the usual
2830 * "x Files, y Hidden" message.
2834 FileMgrRec *file_mgr_rec,
2835 FileMgrData *file_mgr_data,
2838 if (file_mgr_data->special_msg)
2840 XtFree(file_mgr_data->special_msg);
2841 file_mgr_data->special_msg = NULL;
2843 if (file_mgr_data->msg_timer_id)
2844 XtRemoveTimeOut(file_mgr_data->msg_timer_id);
2848 file_mgr_data->special_msg = XtNewString(msg);
2849 file_mgr_data->msg_timer_id =
2850 XtAppAddTimeOut (XtWidgetToApplicationContext (file_mgr_rec->shell),
2851 4000, (XtTimerCallbackProc) MsgTimerEvent,
2852 (XtPointer) file_mgr_data);
2856 file_mgr_data->special_msg = NULL;
2857 file_mgr_data->msg_timer_id = 0;
2864 * Update the iconic path, current directory, and status lines.
2868 FileMgrRec *file_mgr_rec,
2869 FileMgrData *file_mgr_data,
2870 Boolean icons_changed)
2874 Widget cur_dir_manage[4];
2875 int cur_dir_nmanage;
2878 PixmapData *pixmapData;
2881 * No headers on the trash can.
2883 if (!showFilesystem)
2885 if(file_mgr_data->show_status_line)
2886 UpdateStatusLine(file_mgr_rec, file_mgr_data);
2889 else if(file_mgr_data == trashFileMgrData
2892 UpdateStatusLine(file_mgr_rec, file_mgr_data);
2897 * Make sure the iconic path & current directory widgets are
2898 * correctly managed & attached.
2900 if ((file_mgr_data->show_iconic_path == 0) !=
2901 (XtIsManaged(file_mgr_rec->iconic_path_da) == 0) ||
2902 (file_mgr_data->show_current_dir == 0) !=
2903 (XtIsManaged(file_mgr_rec->current_directory_frame) == 0))
2905 icons_changed = True;
2908 "UpdateHeaders: iconic_path %d, current_dir %d, status_line %d\n",
2909 file_mgr_data->show_iconic_path,
2910 file_mgr_data->show_current_dir,
2911 file_mgr_data->show_status_line));
2913 if (!file_mgr_data->show_iconic_path && !file_mgr_data->show_current_dir)
2914 XtUnmanageChild(file_mgr_rec->header_frame);
2917 ((XmManagerWidget)file_mgr_rec->header_frame)->composite.children,
2918 ((XmManagerWidget)file_mgr_rec->header_frame)->composite.num_children);
2920 ((XmManagerWidget)file_mgr_rec->current_directory_frame)->
2922 ((XmManagerWidget)file_mgr_rec->current_directory_frame)->
2923 composite.num_children);
2926 /* attach the iconic path */
2927 if (file_mgr_data->show_iconic_path)
2930 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
2931 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2932 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
2933 if (file_mgr_data->show_current_dir)
2935 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_NONE); n++;
2939 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
2941 XtSetValues(file_mgr_rec->iconic_path_da, args, n);
2942 manage[nmanage++] = file_mgr_rec->iconic_path_da;
2945 /* attach the separator */
2946 if (file_mgr_data->show_iconic_path && file_mgr_data->show_current_dir)
2949 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
2950 XtSetArg (args[n], XmNtopWidget,
2951 file_mgr_rec->iconic_path_da); n++;
2952 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2953 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
2954 XtSetValues(file_mgr_rec->header_separator, args, n);
2955 manage[nmanage++] = file_mgr_rec->header_separator;
2958 /* attach the current directory line */
2959 if (file_mgr_data->show_current_dir)
2962 if (file_mgr_data->show_iconic_path)
2964 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
2965 XtSetArg (args[n], XmNtopWidget,
2966 file_mgr_rec->header_separator); n++;
2970 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
2972 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2973 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
2975 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
2977 XtSetValues(file_mgr_rec->current_directory_frame, args, n);
2978 manage[nmanage++] = file_mgr_rec->current_directory_frame;
2981 * If the iconic path is shown, show only the current directory on
2982 * the current directory line;
2983 * if the iconic path is not shown, also show the drop target and
2984 * the icon representing the current directory.
2986 cur_dir_nmanage = 1;
2987 cur_dir_manage[0] = file_mgr_rec->current_directory;
2989 if (file_mgr_data->show_iconic_path)
2992 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2993 XtSetArg (args[n], XmNleftOffset, 5); n++;
2994 XtSetValues(file_mgr_rec->current_directory, args, n);
3001 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
3002 XtSetArg (args[n], XmNleftOffset, 5); n++;
3003 XtSetValues(file_mgr_rec->current_directory_drop, args, n);
3004 cur_dir_manage[cur_dir_nmanage++] =
3005 file_mgr_rec->current_directory_drop;
3008 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
3009 XtSetArg (args[n], XmNleftWidget,
3010 file_mgr_rec->current_directory_drop); n++;
3011 XtSetArg (args[n], XmNleftOffset, 0); n++;
3016 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
3017 XtSetArg (args[n], XmNleftOffset, 10); n++;
3019 XtSetValues(file_mgr_rec->current_directory_icon, args, n);
3020 cur_dir_manage[cur_dir_nmanage++] =
3021 file_mgr_rec->current_directory_icon;
3024 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
3025 XtSetArg (args[n], XmNleftWidget,
3026 file_mgr_rec->current_directory_icon);n++;
3027 XtSetArg (args[n], XmNleftOffset, 0); n++;
3028 XtSetValues(file_mgr_rec->current_directory, args, n);
3033 if (file_mgr_data->show_iconic_path || file_mgr_data->show_current_dir)
3035 if (file_mgr_data->show_current_dir)
3036 XtManageChildren(cur_dir_manage, cur_dir_nmanage);
3037 XtManageChildren(manage, nmanage);
3038 if (!XtIsManaged(file_mgr_rec->header_frame))
3039 XtManageChild(file_mgr_rec->header_frame);
3042 XtSetArg (args[0], XmNallowShellResize, True);
3043 XtSetValues(file_mgr_rec->shell, args, 1);
3047 * Make sure the status line is correctly managed.
3049 if (file_mgr_data->show_status_line &&
3050 !XtIsManaged(XtParent(file_mgr_rec->status_line)))
3052 XtManageChild(XtParent(file_mgr_rec->status_line));
3054 else if (!file_mgr_data->show_status_line &&
3055 XtIsManaged(XtParent(file_mgr_rec->status_line)))
3057 XtUnmanageChild(XtParent(file_mgr_rec->status_line));
3060 if (file_mgr_data->show_iconic_path)
3061 DtUpdateIconicPath(file_mgr_rec, file_mgr_data, icons_changed);
3063 if (file_mgr_data->show_current_dir)
3067 /* Display the correct small directory icon */
3068 pixmapData = GetPixmapData(file_mgr_rec,
3070 file_mgr_data->current_directory,
3072 XtSetArg (args[0], XmNallowShellResize, False);
3073 XtSetValues(file_mgr_rec->shell, args, 1);
3076 XtSetArg (args[0], XmNimageName, pixmapData->iconFileName);
3078 XtSetArg (args[0], XmNimageName, NULL);
3079 XtSetValues(file_mgr_rec->current_directory_icon, args, 1);
3080 _DtCheckAndFreePixmapData(
3081 GetDirectoryLogicalType(file_mgr_data,
3082 file_mgr_data->current_directory),
3083 file_mgr_rec->shell,
3084 (DtIconGadget) file_mgr_rec->current_directory_icon,
3087 XtSetArg (args[0], XmNallowShellResize, True);
3088 XtSetValues(file_mgr_rec->shell, args, 1);
3090 if(XtIsRealized(file_mgr_rec->main))
3091 DrawCurrentDirectory (file_mgr_rec->current_directory,
3092 file_mgr_rec, file_mgr_data);
3095 if (file_mgr_data->show_status_line)
3096 UpdateStatusLine(file_mgr_rec, file_mgr_data);
3100 /************************************************************************
3102 * FileMgrRedisplayFiles
3103 * Reprocess and redisplay the files of a view.
3105 ************************************************************************/
3108 FileMgrRedisplayFiles(
3109 FileMgrRec *file_mgr_rec,
3110 FileMgrData *file_mgr_data,
3111 Boolean new_directory)
3113 _DtTurnOnHourGlass (file_mgr_rec->shell);
3114 GetFileData (file_mgr_data, True, file_mgr_data->branch_list);
3115 XmDropSiteStartUpdate(file_mgr_rec->file_window);
3116 UpdateFileIcons(file_mgr_rec, file_mgr_data, new_directory);
3117 UpdateHeaders (file_mgr_rec, file_mgr_data, False);
3118 LayoutFileIcons(file_mgr_rec, file_mgr_data, False, False);
3119 XmDropSiteEndUpdate(file_mgr_rec->file_window);
3120 _DtTurnOffHourGlass (file_mgr_rec->shell);
3126 /************************************************************************
3129 * Update the view to the new directory.
3131 ************************************************************************/
3135 FileMgrData *file_mgr_data,
3137 char *directory_name )
3139 FileMgrRec * file_mgr_rec;
3141 char tmp_directory_name[MAX_PATH];
3147 tmp_type = DtDtsDataToDataType(directory_name, NULL, 0, NULL, NULL,
3149 if (( (strcmp(tmp_type, LT_AGROUP) == 0) ||
3150 (strstr(tmp_type, LT_AGROUP_SUBDIR)) )
3152 ( !(file_mgr_data->toolbox) ))
3154 DtActionArg *action_args;
3157 action_args = (DtActionArg *) XtCalloc(1, sizeof(DtActionArg));
3160 action_args[0].argClass = DtACTION_FILE;
3161 action_args[0].u.file.name = directory_name;
3164 pwd_dir = XtNewString(file_mgr_data->current_directory);
3165 DtActionInvoke(((FileMgrRec *) file_mgr_data->file_mgr_rec)->shell,
3166 "OpenAppGroup", action_args, 1,
3167 NULL, NULL, pwd_dir, True, NULL, NULL);
3168 DtDtsFreeDataType(tmp_type);
3172 else if (strcmp(tmp_type, LT_TRASH) == 0)
3174 DtActionArg *action_args;
3177 pwd_dir = XtNewString(file_mgr_data->current_directory);
3178 DtActionInvoke(((FileMgrRec *) file_mgr_data->file_mgr_rec)->shell,
3180 NULL, NULL, pwd_dir, True, NULL, NULL);
3181 DtDtsFreeDataType(tmp_type);
3185 DtDtsFreeDataType(tmp_type);
3187 if (openDirType == NEW)
3189 DialogData *dialog_data;
3190 FileMgrData *fileMgrData;
3192 fileMgrData = CheckOpenDir(directory_name, host_name);
3193 if(fileMgrData != NULL)
3195 dialog_data = _DtGetInstanceData(fileMgrData->file_mgr_rec);
3196 CloseView(dialog_data);
3198 ForceMyIconClosed(file_mgr_data->host, file_mgr_data->current_directory);
3201 file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
3203 /* Set the icon name for this view to the directory name. */
3205 SetIconAttributes ((FileMgrRec *)file_mgr_data->file_mgr_rec, file_mgr_data,
3208 _DtTurnOnHourGlass (file_mgr_rec->shell);
3210 DeselectAllFiles (file_mgr_data);
3211 ActivateNoSelect (file_mgr_rec);
3213 /* When leaving a directory, save any positional information */
3214 if(file_mgr_data->object_positions)
3216 SavePositionInfo(file_mgr_data);
3217 FreePositionInfo(file_mgr_data);
3220 /* save the current branch list */
3221 branch_list = file_mgr_data->branch_list;
3222 file_mgr_data->branch_list = NULL;
3224 FileMgrBuildDirectories (file_mgr_data, host_name, directory_name);
3226 GetFileData (file_mgr_data, True, branch_list);
3228 if (branch_list != NULL)
3230 for (i = 0; branch_list[i]; i++)
3231 XtFree (branch_list[i]);
3232 XtFree ((char *) branch_list);
3235 UpdateCachedDirectories (view_set, view_count);
3237 /* Inherit, or load positional data for this directory */
3238 XmDropSiteStartUpdate(file_mgr_rec->file_window);
3239 LoadPositionInfo(file_mgr_data);
3240 UpdateFileIcons(file_mgr_rec, file_mgr_data, True);
3242 if (showFilesystem && file_mgr_data != trashFileMgrData)
3243 UpdateHeaders (file_mgr_rec, file_mgr_data, True);
3244 else if(file_mgr_data == trashFileMgrData
3245 && file_mgr_data != NULL )
3246 UpdateStatusLine(file_mgr_rec, file_mgr_data);
3248 /* change the title */
3249 title = _DtBuildFMTitle(file_mgr_data);
3250 XtSetArg (args[0], XmNtitle, title);
3251 XtSetValues (file_mgr_rec->shell, args, 1);
3254 if (file_mgr_data->show_type == SINGLE_DIRECTORY)
3255 LayoutFileIcons(file_mgr_rec, file_mgr_data, True, True);
3257 LayoutFileIcons(file_mgr_rec, file_mgr_data, False, True);
3259 if (openDirType == NEW)
3260 ForceMyIconOpen (file_mgr_data->host, NULL);
3261 XmDropSiteEndUpdate(file_mgr_rec->file_window);
3267 /************************************************************************
3270 * This function causes a rescan of the directory for the view
3271 * and a full redisplay of the file icons.
3273 ************************************************************************/
3277 FileMgrRec *file_mgr_rec )
3279 DialogData * dialog_data;
3280 FileMgrData * file_mgr_data;
3281 DirectorySet ** directory_set;
3285 dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec);
3286 file_mgr_data = (FileMgrData *) dialog_data->data;
3288 _DtTurnOnHourGlass (file_mgr_rec->shell);
3290 directory_set = file_mgr_data->directory_set;
3292 for (i = 0; i < file_mgr_data->directory_count; i++)
3293 RereadDirectory (file_mgr_rec->shell, file_mgr_data->host,
3294 directory_set[i]->name);
3296 GetFileData (file_mgr_data, False, file_mgr_data->branch_list);
3297 XmDropSiteStartUpdate(file_mgr_rec->file_window);
3298 UpdateFileIcons(file_mgr_rec, file_mgr_data, False);
3299 UpdateHeaders (file_mgr_rec, file_mgr_data, False);
3300 LayoutFileIcons(file_mgr_rec, file_mgr_data, False, True);
3301 XmDropSiteEndUpdate(file_mgr_rec->file_window);
3302 /* _DtTurnOffHourGlass (file_mgr_rec->shell); */
3307 /************************************************************************
3309 * FileMgrBuildDirectories
3310 * Given a directory name, setup the directory set structure
3311 * contained in the file mgr data stucture.
3313 ************************************************************************/
3316 FileMgrBuildDirectories(
3317 FileMgrData *file_mgr_data,
3319 char *directory_name )
3321 char current_directory[MAX_PATH];
3322 DirectorySet ** directory_set;
3324 /* Inform Main that the directory is being changed and */
3325 /* free up the data contained in the current directory set. */
3327 if (file_mgr_data->current_directory != NULL)
3329 DirectoryChanged ((XtPointer)file_mgr_data, file_mgr_data->host, host_name,
3330 file_mgr_data->current_directory, directory_name);
3331 FreeDirectoryData (file_mgr_data);
3334 file_mgr_data->current_directory = (char *) XtNewString(directory_name);
3335 (void) strcpy (current_directory, file_mgr_data->current_directory);
3337 /* This code will solve the path problem if user has
3338 Dtfile*restrictMode resource set to True and
3339 also invoke dtfile with -restricted option
3342 && file_mgr_data->toolbox == False
3343 && file_mgr_data->restricted_directory
3344 && strncmp( file_mgr_data->restricted_directory, directory_name,
3345 strlen( file_mgr_data->restricted_directory ) ) != 0
3348 XtFree( file_mgr_data->restricted_directory );
3349 file_mgr_data->restricted_directory = XtNewString( directory_name );
3352 if (file_mgr_data->host != NULL)
3353 XtFree ((char *) file_mgr_data->host);
3355 file_mgr_data->host = (char *) XtNewString (host_name);
3358 /* Allocate the data for one initial directory set */
3360 file_mgr_data->directory_set = directory_set =
3361 ((DirectorySet **) XtMalloc (2 * sizeof(DirectorySet *))) + 1;
3362 file_mgr_data->directory_count = 1;
3364 directory_set[-1] = NULL;
3366 directory_set[0] = (DirectorySet *) XtMalloc (sizeof (DirectorySet));
3367 directory_set[0]->name = (char *) XtNewString (current_directory);
3368 directory_set[0]->sub_root = NULL;
3369 directory_set[0]->file_count = 0;
3370 directory_set[0]->file_view_data = NULL;
3371 directory_set[0]->order_list = NULL;
3372 directory_set[0]->filtered_file_count = 0;
3373 directory_set[0]->invisible_file_count = 0;
3374 directory_set[0]->file_mgr_data = (XtPointer) file_mgr_data;
3380 FileMgrData * file_mgr_data,
3385 static Region r = NULL;
3386 unsigned char flags;
3387 XRectangle pRect, lRect;
3389 if ((file_mgr_data->show_type != SINGLE_DIRECTORY) ||
3390 (file_mgr_data->view == BY_ATTRIBUTES))
3394 && x < (Position)(w->core.x + w->core.width)
3395 && y < (Position)(w->core.y + w->core.height)
3404 r = XCreateRegion();
3406 XSubtractRegion(r, r, r);
3408 _DtIconGetIconRects((DtIconGadget)w, &flags, &pRect, &lRect);
3410 if (flags & XmPIXMAP_RECT)
3411 XUnionRectWithRegion(&pRect, r, r);
3413 if (flags & XmLABEL_RECT)
3414 XUnionRectWithRegion(&lRect, r, r);
3416 if (XPointInRegion(r, x, y))
3425 * Check to see if the drop occurred within one of the primary hotspots.
3426 * If this is the desktop, then we need to check the hotspots according
3427 * to their stacking order; all other views have their hotspots checked
3428 * according to the order the files were loaded, since overlapping hotspots
3433 DropOnPrimaryHotspot (
3434 FileMgrData * file_mgr_data,
3437 DirectorySet ** directory_data)
3439 int directory_count;
3441 FileViewData * file_view_data;
3442 DirectorySet * dir_data;
3445 if (PositioningEnabledInView(file_mgr_data))
3447 top = GetTopOfStack(file_mgr_data);
3451 file_view_data = top->file_view_data;
3453 if(file_view_data == NULL)
3459 if (file_view_data->displayed &&
3460 DropOnGadget(file_mgr_data, file_view_data->widget, drop_x, drop_y))
3462 *directory_data = file_mgr_data->directory_set[0];
3463 return(file_view_data);
3471 if (file_mgr_data->show_type == MULTIPLE_DIRECTORY) {
3473 directory_count = file_mgr_data->directory_count;
3477 directory_count = 1;
3480 for (; i < directory_count; i++)
3482 dir_data = file_mgr_data->directory_set[i];
3484 for (j = 0; j < dir_data->file_count; j++)
3486 file_view_data = dir_data->file_view_data[j];
3488 if (!file_view_data->displayed)
3491 if (DropOnGadget(file_mgr_data, file_view_data->widget, drop_x,
3494 *directory_data = dir_data;
3495 return(file_view_data);
3501 *directory_data = NULL;
3507 /************************************************************************
3509 * ProcessDropOnFileWindow
3511 ************************************************************************/
3513 ProcessDropOnFileWindow (
3515 DtDndDropCallbackStruct *dropInfo,
3516 FileMgrData *file_mgr_data)
3518 char *command = NULL;
3521 /******************/
3522 /* transfer phase */
3523 /******************/
3524 if(dropInfo->reason != DtCR_DND_DROP_ANIMATE)
3528 XmDragContext drag_context;
3530 /* Initiating view not valid when another client initiates drag */
3532 initiating_view = NULL;
3534 /* reject the drop if the Protocol is buffer and it was
3535 dropped on the Trash Can
3537 if (dropInfo->dropData->protocol == DtDND_BUFFER_TRANSFER)
3539 if (file_mgr_data == trashFileMgrData
3540 && file_mgr_data != NULL )
3542 dropInfo->status = DtDND_FAILURE;
3543 DPRINTF (("ProcessDropOnFileWindow: Rejecting buffer drop on Trash Can\n"));
3549 /* if placement is 'As Placed', set blend model to BLEND_NONE */
3550 /* @@@...Need to check if this will work correctly for BUFFERS */
3551 if (PositioningEnabledInView(file_mgr_data))
3553 drag_context = (XmDragContext)dropInfo->dragContext;
3557 XtSetArg(args[0], XmNblendModel, XmBLEND_NONE);
3558 XtSetValues((Widget)drag_context, args, 1);
3561 /* if placement is 'Grid' */
3564 /* if initiating view is current view, set status
3567 if (initiating_view)
3569 if ((((FileMgrData *)initiating_view)->current_directory ==
3570 file_mgr_data->current_directory) &&
3571 (dropInfo->dropData->protocol == DtDND_FILENAME_TRANSFER))
3573 /* we actually want to allow a copy or a link to the same directory
3574 * but not a move. If it's a copy or link, we want the initiating
3575 * view to be NULL so that later we don't error out when it checks
3576 * to see if they are from the same view. We will fail out if the
3577 * operation is a MOVE (causing the zoom back).
3579 fileType = GetDirectoryLogicalType(file_mgr_data,
3580 file_mgr_data->current_directory);
3582 command = TypeToAction(dropInfo->operation, fileType);
3585 if (strcmp(command, "FILESYSTEM_MOVE") == 0)
3586 dropInfo->status = DtDND_FAILURE;
3588 initiating_view = NULL;
3594 /* set the complete move flag to False since the animate
3595 callback handles the deletion of the original file on the move
3598 DPRINTF(("DropOnFileWindow: Transfer Callback - Setting Complete move flag to False\n"));
3600 if(dropInfo->dropData->protocol == DtDND_BUFFER_TRANSFER)
3601 dropInfo->completeMove = True;
3603 /* set the complete move flag to False since we will be handling */
3604 /* the deletion of the original file */
3606 dropInfo->completeMove = False;
3609 /*****************************/
3610 /* animate phase, run action */
3611 /*****************************/
3614 char *command = NULL;
3617 DPRINTF(("DropOnFileWindow - Animate Callback."));
3619 fileType = GetDirectoryLogicalType(file_mgr_data,
3620 file_mgr_data->current_directory);
3622 command = TypeToAction(dropInfo->operation, fileType);
3626 DirectorySet *directory_set;
3629 /* retrieve the fileViewData for the current directory */
3630 directory_set = file_mgr_data->directory_set[0];
3631 for( i = 0; i < directory_set->file_count; ++i )
3633 if( strcmp(directory_set->order_list[i]->file_data->file_name, "." )
3636 RunCommand( command,
3638 directory_set->order_list[i],
3645 DtDtsFreeAttributeValue( command );
3651 /************************************************************************
3655 ************************************************************************/
3660 XtPointer client_data,
3661 XtPointer call_data)
3663 FileMgrData * file_mgr_data = (FileMgrData *)client_data;
3664 DtDndDropCallbackStruct *dropInfo = (DtDndDropCallbackStruct *)call_data;
3666 switch (dropInfo->dropData->protocol)
3668 case DtDND_FILENAME_TRANSFER:
3670 DPRINTF(("DropOnFileWindow: Number of Files dropped are %d\n",
3671 dropInfo->dropData->numItems));
3672 ProcessDropOnFileWindow (w, dropInfo, file_mgr_data);
3674 case DtDND_BUFFER_TRANSFER:
3675 DPRINTF (("DropOnFileWindow: Number of Buffers dropped are %d\n",
3676 dropInfo->dropData->numItems));
3677 ProcessDropOnFileWindow (w, dropInfo, file_mgr_data);
3680 dropInfo->status = DtDND_FAILURE;
3685 /************************************************************************
3687 * ProcessDropOnObject
3689 ************************************************************************/
3691 ProcessDropOnObject(
3693 DtDndDropCallbackStruct *dropInfo,
3694 FileViewData *file_view_data)
3698 DirectorySet *directory_data =
3699 (DirectorySet *) file_view_data->directory_set;
3700 FileMgrData *file_mgr_data = (FileMgrData *) directory_data->file_mgr_data;
3701 char *command = NULL;
3703 /******************/
3704 /* transfer phase */
3705 /******************/
3706 if (dropInfo->reason != DtCR_DND_DROP_ANIMATE)
3708 DPRINTF(("DropOnObject: Transfer Callback\n"));
3710 /* Initiating view not valid when another client initiates drag */
3712 initiating_view = NULL;
3714 /* check for invalid trash drop */
3715 if (FileFromTrash(dropInfo->dropData->data.files[0]))
3717 if (InvalidTrashDragDrop(dropInfo->operation,
3719 ((FileMgrRec *)file_mgr_data->file_mgr_rec)->file_window))
3721 dropInfo->status = DtDND_FAILURE;
3725 command = TypeToAction(dropInfo->operation,
3726 file_view_data->file_data->logical_type);
3728 (strncmp("FILESYSTEM_", command, strlen("FILESYSTEM_")) != 0) &&
3729 dropInfo->dropData->protocol == DtDND_BUFFER_TRANSFER)
3730 dropInfo->completeMove = True;
3732 /* set the complete move flag to False since we will be handling */
3733 /* the deletion of the original file */
3734 dropInfo->completeMove = False;
3737 /******************************************/
3738 /* animate phase, retrieve action and run */
3739 /******************************************/
3742 command = TypeToAction(dropInfo->operation,
3743 file_view_data->file_data->logical_type);
3746 RunCommand (command,
3753 DtDtsFreeAttributeValue(command);
3759 /************************************************************************
3763 ************************************************************************/
3768 XtPointer client_data,
3769 XtPointer call_data)
3771 DtDndDropCallbackStruct *dropInfo = (DtDndDropCallbackStruct *)call_data;
3773 switch (dropInfo->dropData->protocol)
3775 case DtDND_FILENAME_TRANSFER:
3776 case DtDND_BUFFER_TRANSFER:
3777 ProcessDropOnObject(w, dropInfo, (FileViewData *) client_data);
3780 dropInfo->status = DtDND_FAILURE;
3785 /************************************************************************
3787 * FileMgrPropagateSettings
3788 * Set a new (dst_data) file manager view settings to an
3789 * old (src_data) settings.
3791 ************************************************************************/
3794 FileMgrPropagateSettings(
3795 FileMgrData *src_data,
3796 FileMgrData *dst_data )
3799 PreferencesData * src_preferences_data;
3800 PreferencesData * dst_preferences_data;
3802 FilterData * src_filter_active_data;
3803 FilterData * dst_filter_active_data;
3804 FilterData * src_filter_edit_data;
3805 FilterData * dst_filter_edit_data;
3808 Dimension src_width;
3809 Dimension src_height;
3811 /* Copy the preferences data from src to dst data */
3813 src_preferences_data = (PreferencesData *) src_data->preferences->data;
3814 dst_preferences_data = (PreferencesData *) dst_data->preferences->data;
3816 dst_data->show_type = dst_preferences_data->show_type = src_data->show_type;
3817 dst_data->tree_files = dst_preferences_data->tree_files =
3818 src_data->tree_files;
3819 dst_data->view = src_data->view;
3820 dst_data->view_single = dst_preferences_data->view_single =
3821 src_data->view_single;
3822 dst_data->view_tree = dst_preferences_data->view_tree =
3823 src_data->view_tree;
3824 dst_data->order = dst_preferences_data->order = src_data->order;
3825 dst_data->direction = dst_preferences_data->direction = src_data->direction;
3826 dst_data->positionEnabled = dst_preferences_data->positionEnabled =
3827 src_data->positionEnabled;
3828 dst_data->show_iconic_path = dst_preferences_data->show_iconic_path =
3829 src_data->show_iconic_path;
3830 dst_data->show_current_dir = dst_preferences_data->show_current_dir =
3831 src_data->show_current_dir;
3832 dst_data->show_status_line = dst_preferences_data->show_status_line =
3833 src_data->show_status_line;
3836 /* Copy the Filter active info from src to dest data */
3837 src_filter_active_data = (FilterData *) src_data->filter_active->data;
3838 dst_filter_active_data = (FilterData *) dst_data->filter_active->data;
3840 dst_filter_active_data->match_flag = src_filter_active_data->match_flag;
3841 dst_filter_active_data->filter = XtNewString(src_filter_active_data->filter);
3842 dst_filter_active_data->show_hidden = src_filter_active_data->show_hidden;
3843 dst_filter_active_data->filetypesFilteredCount =
3844 src_filter_active_data->filetypesFilteredCount;
3845 XtFree(dst_filter_active_data->filetypesFiltered);
3846 dst_filter_active_data->filetypesFiltered =
3847 XtNewString(src_filter_active_data->filetypesFiltered);
3848 dst_filter_active_data->count = ReadInFiletypes(dst_filter_active_data);
3850 /* Copy the Filter edit info from src to dest data */
3851 src_filter_edit_data = (FilterData *) src_data->filter_edit->data;
3852 dst_filter_edit_data = (FilterData *) dst_data->filter_edit->data;
3854 dst_filter_edit_data->match_flag = src_filter_edit_data->match_flag;
3855 dst_filter_edit_data->filter = XtNewString(src_filter_edit_data->filter);
3856 dst_filter_edit_data->show_hidden = src_filter_edit_data->show_hidden;
3857 dst_filter_edit_data->filetypesFilteredCount =
3858 src_filter_edit_data->filetypesFilteredCount;
3859 XtFree(dst_filter_edit_data->filetypesFiltered);
3860 dst_filter_edit_data->filetypesFiltered =
3861 XtNewString(src_filter_edit_data->filetypesFiltered);
3862 dst_filter_edit_data->count = ReadInFiletypes(dst_filter_edit_data);
3864 /* Get the size info (e.g. X, Y) form src to dest data */
3865 XtSetArg (args[0], XmNwidth, &src_width);
3866 XtSetArg (args[1], XmNheight, &src_height);
3867 XtGetValues (((FileMgrRec *) src_data->file_mgr_rec)->shell, args, 2);
3869 dst_data->height = src_height;
3870 dst_data->width = src_width;
3872 /* need to propagate whether its a toolbox or not */
3873 dst_data->toolbox = src_data->toolbox;
3877 /************************************************************************
3880 * Update the list of open tree branches
3882 ************************************************************************/
3886 FileMgrData *file_mgr_data,
3887 DirectorySet *directory_set)
3890 char ** table = NULL;
3895 /* check if the given directory set is already in the table */
3896 if (directory_set && file_mgr_data->branch_list) {
3897 for (i = 0; file_mgr_data->branch_list[i]; i++)
3898 if (strcmp(file_mgr_data->branch_list[i] + 2, directory_set->name) == 0)
3900 /* just update the TreeShow value for this branch and return */
3901 file_mgr_data->branch_list[i][0] = '0' + directory_set->sub_root->ts;
3906 /* free old branch_list, if any */
3907 if (file_mgr_data->branch_list) {
3908 for (i = 0; file_mgr_data->branch_list[i]; i++)
3909 XtFree (file_mgr_data->branch_list[i]);
3910 XtFree((char *)file_mgr_data->branch_list);
3911 file_mgr_data->branch_list = NULL;
3914 /* create new brach list */
3915 for (i = 0; i < file_mgr_data->directory_count; i++) {
3917 if (file_mgr_data->directory_set[i]->sub_root->ts < tsNotRead)
3920 /* get the name of the tree branch */
3921 branch_name = file_mgr_data->directory_set[i]->name;
3923 /* generate table entry */
3924 branch_entry = (char *)XtMalloc(2 + strlen(branch_name) + 1);
3925 branch_entry[0] = '0' + file_mgr_data->directory_set[i]->sub_root->ts;
3926 branch_entry[1] = ':';
3927 strcpy(branch_entry + 2, branch_name);
3929 /* add entry to the table */
3931 table = (char **)XtRealloc((char *)table,
3932 sizeof(char *) * (table_size + 1));
3933 table[table_size - 1] = branch_entry;
3934 table[table_size] = NULL;
3937 file_mgr_data->branch_list = table;
3941 /************************************************************************
3944 * Read the directory contained in host: current_directory and
3945 * build the file data list and reset any related information
3947 ************************************************************************/
3951 FileMgrData *file_mgr_data,
3955 FileMgrRec *file_mgr_rec;
3956 int directory_count;
3957 DirectorySet ** directory_set;
3958 DirectorySet ** new_dir_set;
3959 FileViewData ** new_view_data;
3960 FileViewData *new_renaming,*new_popup_menu_icon=NULL;
3961 FileViewData *file_view_data,*new_drag_file_view_data=NULL;
3964 ObjectPtr position_info;
3971 file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
3972 directory_count = file_mgr_data->directory_count;
3973 directory_set = file_mgr_data->directory_set;
3976 * Read the directory and subdirectories given by branch_list.
3977 * Note: if any directory we need isn't yet in the cache,
3978 * ReadTreeDirectory will just kick off a background process
3979 * to read the directory and return with
3980 * file_mgr_data->busy_status set to busy_readdir.
3982 ReadTreeDirectory (file_mgr_rec->shell, file_mgr_data->host,
3983 file_mgr_data->current_directory,
3984 file_mgr_data, branch_list,
3985 &new_dir_set, &new_dir_count);
3987 /* if directories not ready yet, don't do anything */
3988 if (file_mgr_data->busy_status != not_busy)
3994 * Try to preserve the 'widget' and 'position_info' fields in the
3995 * file_view_data structure, for each file. This will allow us to
3996 * re-use the same Icon widget, to reduce flashing.
3997 * Also preserve ndir & nfile counts (used in FilterFiles to decide
3998 * whether to expand or collapse a tree branch if ndir or nfile
4002 /* loop through the old directory set */
4003 new_renaming = NULL;
4004 for (i = 0; i < directory_count; i++)
4006 /* find a directory with same name in the new directory set */
4007 for (j = 0; j < new_dir_count; j++)
4008 if (strcmp(directory_set[i]->name, new_dir_set[j]->name) == 0)
4011 /* if we couldn't find this directory, continue to the next one */
4012 if (j == new_dir_count)
4015 new_view_data = new_dir_set[j]->file_view_data;
4016 new_file_count = new_dir_set[j]->file_count;
4018 /* loop throught the old file list */
4019 for (j = 0; j < directory_set[i]->file_count; j++)
4021 file_view_data = directory_set[i]->file_view_data[j];
4022 position_info = file_view_data->position_info;
4025 * Find a file by the same name in the new file list.
4027 for (k = 0; k < new_file_count; k++)
4029 if (new_view_data[k]->file_data == file_view_data->file_data)
4031 /* Fix for defect 5029 */
4032 if(file_mgr_data->popup_menu_icon && file_view_data->file_data==
4033 file_mgr_data->popup_menu_icon->file_data)
4034 new_popup_menu_icon = new_view_data[k];
4036 /* Fix for defect 5703 */
4037 if ( file_mgr_data->drag_file_view_data &&
4038 file_mgr_data->drag_file_view_data->file_data ==
4039 file_view_data->file_data)
4040 new_drag_file_view_data = new_view_data[k];
4042 if (file_view_data == file_mgr_data->renaming)
4043 new_renaming = new_view_data[k];
4045 /* re-use the old widgets */
4046 new_view_data[k]->widget = file_view_data->widget;
4047 new_view_data[k]->treebtn = file_view_data->treebtn;
4048 new_view_data[k]->registered = file_view_data->registered;
4050 /* preserve ndir, nfile counts */
4051 new_view_data[k]->ndir = file_view_data->ndir;
4052 new_view_data[k]->nfile = file_view_data->nfile;
4054 /* preserve the position info */
4057 new_view_data[k]->position_info = position_info;
4058 position_info->file_view_data = new_view_data[k];
4061 /* preserve icon_mtime */
4062 new_view_data[k]->icon_mtime = file_view_data->icon_mtime;
4068 /* if no file by the same name was found in the new file list,
4069 the file must have gone away ... lets eliminate the
4070 position infomation */
4071 if (position_info && k == new_file_count)
4073 for (k = 0; k < file_mgr_data->num_objects; k++)
4075 if (file_mgr_data->object_positions[k] == position_info)
4077 /* @@@ what does this do? */
4078 position_info->late_bind = True;
4079 position_info->y += (file_view_data->widget->core.height / 2);
4086 /* replace the old directory set */
4087 file_mgr_data->directory_set = new_dir_set;
4088 file_mgr_data->directory_count = new_dir_count;
4089 file_mgr_data->renaming = new_renaming;
4090 file_mgr_data->popup_menu_icon = new_popup_menu_icon;
4091 file_mgr_data->drag_file_view_data = new_drag_file_view_data;
4093 /* Get the file types and the files sorted and filtered */
4094 for (i = 0; i < new_dir_count; i++)
4096 OrderFiles (file_mgr_data, new_dir_set[i]);
4097 FilterFiles (file_mgr_data, new_dir_set[i]);
4098 file_mgr_data->tree_root->filtered =
4099 file_mgr_data->show_type != MULTIPLE_DIRECTORY;
4101 SelectVisible(file_mgr_data);
4103 /* update the branch_list */
4104 UpdateBranchList(file_mgr_data, NULL);
4106 /* Update the selection list */
4108 while (j < file_mgr_data->selected_file_count)
4110 file_view_data = file_mgr_data->selection_list[j];
4112 /* See if the selected file is still around */
4114 for (i = 0; !match && i < new_dir_count; i++)
4116 for (k = 0; k < new_dir_set[i]->file_count; k++)
4118 if (file_view_data->file_data ==
4119 new_dir_set[i]->file_view_data[k]->file_data)
4123 file_mgr_data->selection_list[j] =
4124 new_dir_set[i]->file_view_data[k];
4129 /* Keep the file selected only if it was found in the new
4130 * directory set and if it is not filtered */
4131 if (match && !file_view_data->filtered)
4134 DeselectFile (file_mgr_data, file_view_data, False);
4137 /* free the old directory set */
4138 FreeLayoutData(file_mgr_data->layout_data);
4139 file_mgr_data->layout_data = NULL;
4140 FreeDirectorySet(directory_set, directory_count);
4142 /* Set the menu activation to reflect and changes in the selection. */
4144 if(file_mgr_data != trashFileMgrData
4145 && file_mgr_data != NULL )
4147 if (file_mgr_data->selected_file_count == 0)
4148 ActivateNoSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec);
4149 else if (file_mgr_data->selected_file_count == 1)
4150 ActivateSingleSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec,
4151 file_mgr_data->selection_list[0]->file_data->logical_type);
4153 ActivateMultipleSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec);
4156 SensitizeTrashBtns();
4158 /* load positional data for this directory */
4159 if ( (file_mgr_data->positionEnabled == RANDOM_ON)
4160 && ( (file_mgr_rec->menuStates & CLEAN_UP_OP) == 0)
4162 LoadPositionInfo(file_mgr_data);
4167 /************************************************************************
4170 * Search for a directory in branch list.
4172 ************************************************************************/
4176 FileMgrData *file_mgr_data,
4178 char *directory_name,
4184 if (branch_list == NULL)
4187 for (i = 0; branch_list[i]; i++)
4188 if (strcmp(branch_list[i] + 2, directory_name) == 0) {
4189 ts = branch_list[i][0] - '0';
4190 if (ts == tsNotRead)
4193 if (ts == tsAll && file_mgr_data->tree_files == TREE_FILES_NEVER)
4195 else if (ts == tsDirs && file_mgr_data->tree_files == TREE_FILES_ALWAYS)
4207 /************************************************************************
4210 * Read a directory and sub directories.
4212 ************************************************************************/
4214 static FileViewData *
4216 FileMgrData *file_mgr_data,
4218 char *directory_name,
4226 /* allocate new FileData */
4227 fp = (FileData *) XtMalloc(sizeof(FileData));
4228 memset(fp, 0, sizeof(FileData));
4231 if (strcmp(directory_name, "/") == 0)
4232 fp->file_name = XtNewString("/");
4235 p = strrchr(directory_name, '/');
4237 fp->file_name = XtNewString(p + 1);
4239 fp->file_name = XtNewString(directory_name);
4242 /* assume it's a directory for now ... */
4243 fp->is_subdir = True;
4245 /* @@@ do a readlink here ... */
4247 /* allocate FileViewData */
4248 ip = (FileViewData *)XtMalloc(sizeof(FileViewData));
4249 memset(ip, 0, sizeof(FileViewData));
4252 if (QueryBranchList(file_mgr_data, branch_list, directory_name, &ts) &&
4257 else if (file_mgr_data->tree_files == TREE_FILES_ALWAYS)
4271 * Recursively count the number of subdirectores we have read.
4276 if (ip->file_data->is_subdir && ip->ts != tsNotRead)
4279 for (dp = ip->desc; dp; dp = dp->next)
4280 CountDirectories(dp, np);
4284 static DirectorySet *
4288 FileMgrData *file_mgr_data)
4294 /* allocate a new directory set entry */
4295 ds = (DirectorySet *)XtMalloc(sizeof(DirectorySet));
4297 /* initialize the directory set entry */
4298 ds->name = XtNewString(name);
4301 for (dp = ip->desc; dp; dp = dp->next)
4303 if (ds->file_count != 0)
4304 ds->file_view_data =
4305 (FileViewData **)XtMalloc(ds->file_count*sizeof(FileViewData *));
4307 ds->file_view_data = NULL;
4309 for (dp = ip->desc, i = 0; dp; dp = dp->next, i++) {
4310 ds->file_view_data[i] = dp;
4311 dp->directory_set = (XtPointer)ds;
4313 ds->order_list = NULL;
4314 ds->filtered_file_count = 0;
4315 ds->invisible_file_count = 0;
4316 ds->file_mgr_data = (XtPointer)file_mgr_data;
4324 FileMgrData *file_mgr_data,
4326 DirectorySet **directory_set,
4329 * Recursively add directores to the directory set array.
4332 char fullname[MAX_PATH];
4335 if (ip->file_data->is_subdir && ip->ts != tsNotRead)
4337 /* add a new entry to the directory set array */
4338 GetFullName(file_mgr_data, ip, fullname);
4339 directory_set[*index] = NewDirectorySet(fullname, ip, file_mgr_data);
4343 for (dp = ip->desc; dp; dp = dp->next)
4344 MakeDirectorySets(file_mgr_data, dp, directory_set, index);
4352 char *directory_name,
4353 FileMgrData *file_mgr_data,
4355 DirectorySet ***directory_set,
4356 int *directory_count)
4358 FileViewData *ip, *dp;
4361 /* eliminate "/." */
4362 if (strcmp(directory_name, "/.") == 0)
4363 directory_name = "/";
4365 /* if not in tree mode, clear branch_list (@@@ really?) */
4366 if (file_mgr_data->show_type != MULTIPLE_DIRECTORY)
4369 /* get a FileViewData for the tree root */
4370 file_mgr_data->tree_root = ip =
4371 GetTopInfo(file_mgr_data, host_name, directory_name, branch_list);
4373 /* read the directory tree */
4374 rc = ReadDir(w, file_mgr_data, host_name, directory_name, ip,
4375 0, file_mgr_data->tree_preread_level, branch_list);
4376 if (file_mgr_data->busy_status != not_busy)
4378 /* No point in continuing any further, free up all 'ip' and return */
4379 XtFree(ip->file_data->file_name);
4380 XtFree((char *)ip->file_data);
4382 file_mgr_data->tree_root = NULL;
4388 /* update root FileData from "." */
4389 for (dp = ip->desc; dp; dp = dp->next)
4390 if (strcmp(dp->file_data->file_name, ".") == 0) {
4391 ip->file_data->physical_type = dp->file_data->physical_type;
4392 ip->file_data->logical_type =
4393 GetDirectoryLogicalType(file_mgr_data, directory_name);
4394 ip->file_data->errnum = dp->file_data->errnum;
4395 ip->file_data->stat = dp->file_data->stat;
4396 ip->file_data->is_broken = dp->file_data->is_broken;
4400 *directory_count = 0;
4401 CountDirectories(ip, directory_count);
4403 /* allocate array of directory set pointers */
4405 (DirectorySet **) XtMalloc ((*directory_count + 1)*sizeof(DirectorySet *));
4407 /* make a fake directory set for the tree root */
4409 char fullname[MAX_PATH];
4413 ds = (DirectorySet *)XtMalloc(sizeof(DirectorySet));
4414 ip->directory_set = (XtPointer)ds;
4416 strcpy(fullname, directory_name);
4417 p = strrchr(fullname, '/');
4420 ds->name = XtNewString(fullname);
4421 ds->sub_root = NULL;
4423 ds->file_view_data =
4424 (FileViewData **)XtMalloc(sizeof(FileViewData *));
4425 ds->file_view_data[0] = ip;
4427 (FileViewData **)XtMalloc(sizeof(FileViewData *));
4428 ds->order_list[0] = ip;
4429 ds->filtered_file_count = 1;
4430 ds->file_mgr_data = (XtPointer)file_mgr_data;
4432 (*directory_set)[0] = ds;
4436 /* make directory sets for the current dir and subdirs */
4438 MakeDirectorySets(file_mgr_data, ip, *directory_set, &i);
4442 /*--------------------------------------------------------------------
4444 *------------------------------------------------------------------*/
4451 * Decide if entry is currently displayed.
4456 /* filtered files are not shown */
4460 /* in flat mode all un-filtered files are shown */
4461 if (fmd->show_type == SINGLE_DIRECTORY)
4464 /* in tree mode an entry is shown only if user chooses to */
4465 ts = ip->parent? ip->parent->ts: tsDirs;
4468 else if (ts == tsDirs)
4469 return ip->file_data->is_subdir;
4478 FileViewData *dp, /* directory entry being searched */
4479 int level) /* tree depth level of this entry */
4481 * Recursively determine the display position of a given entry
4482 * Return false if the entry not currently displayed
4487 /* skip entries that are not displayed */
4488 if (level > 0 && !IsShown(fmd, dp))
4491 /* this entry is displayed */
4492 dp->displayed = True;
4494 /* traverse subtree */
4497 for (ip = dp->desc; ip; ip = ip->next)
4498 SetDisplayedRecur(fmd, ip, level);
4505 SelectVisible (FileMgrData *file_mgr_data)
4509 /* assume nothing displayed */
4510 for (i = 0; i < file_mgr_data->directory_count; i++)
4511 for (j = 0; j < file_mgr_data->directory_set[i]->file_count; j++)
4512 file_mgr_data->directory_set[i]->file_view_data[j]->displayed = False;
4514 /* set the displayed flag for all entries that are actually shown */
4515 SetDisplayedRecur(file_mgr_data, file_mgr_data->tree_root, 0);
4516 if (file_mgr_data->show_type == SINGLE_DIRECTORY)
4517 file_mgr_data->tree_root->displayed = False;
4521 /*--------------------------------------------------------------------
4522 * expand tree branches
4523 *------------------------------------------------------------------*/
4526 * UpdateBranchState:
4527 * Determine new tree brach expansion state after a subdirectory has
4528 * been re-read (op == BRANCH_UPDATE), or after the user has requested
4529 * to expand (op == BRANCH_EXPAND) or collapse (op == BRANCH_COLLAPSE)
4534 FileMgrData *file_mgr_data,
4539 TreeShow old_ts = ip->ts;
4541 if (ip->ts == tsReading && op == BRANCH_UPDATE)
4549 /* this is a new branch that's currently being read */
4553 else if (ip->ts == tsError)
4555 /* can't expand or collaps this branch */
4559 else if (op == BRANCH_UPDATE) /* update */
4563 else if (op == BRANCH_EXPAND) /* show more */
4565 if (file_mgr_data->tree_files == TREE_FILES_NEVER)
4567 if (ip->ts == tsNone || !showEmptySet && ip->ndir == 0)
4575 if (ip->ndir == 0 && ip->nfile == 0)
4577 /* the subdir is empty */
4580 else if (ip->ts == tsNone)
4585 else if (ip->ts == tsAll)
4587 else if (ip->ts == tsNone &&
4588 ip->ndir > 0 && ip->nfile > 0 &&
4589 file_mgr_data->tree_files == TREE_FILES_CHOOSE)
4597 (ip->nfile == 0 || file_mgr_data->tree_files == TREE_FILES_NEVER) &&
4600 DirectorySet *directory_set = (DirectorySet *)ip->directory_set;
4601 FileMgrData *file_mgr_data = (FileMgrData *)directory_set->file_mgr_data;
4602 FileMgrRec *file_mgr_rec = (FileMgrRec *)file_mgr_data->file_mgr_rec;
4607 msg = GETMESSAGE(12,18, "The folder %s is empty.");
4609 msg = GETMESSAGE(12,19, "The folder %s contains no subdirectories.");
4611 sprintf(buf, msg, ip->file_data->file_name);
4612 SetSpecialMsg( file_mgr_rec, file_mgr_data, buf );
4616 else if (op == BRANCH_COLLAPSE) /* show less */
4620 if (file_mgr_data->tree_files == TREE_FILES_NEVER)
4622 if (ip->ts == tsNone || !showEmptySet && ip->ndir == 0)
4629 if (ip->ndir == 0 && ip->nfile == 0)
4631 /* the subdir is empty */
4634 else if (ip->ts == tsNone)
4639 else if (ip->ts == tsNone)
4641 else if (ip->ts == tsAll &&
4642 ip->ndir > 0 && ip->nfile > 0 &&
4643 file_mgr_data->tree_files == TREE_FILES_CHOOSE)
4654 * Expand (expand == True) or collpase (expand == False) a tree branch.
4658 FileMgrData *file_mgr_data,
4662 FileMgrRec *file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
4663 DirectorySet *directory_set;
4664 int level, i, n, old_count, rc;
4670 GetAncestorInfo(file_mgr_data, ip, &level, path, NULL);
4671 SetSpecialMsg( file_mgr_rec, file_mgr_data, NULL );
4676 new_branch = (ip->ts == tsNotRead || ip->ts == tsError);
4679 /* we need to read the sub directory */
4680 _DtTurnOnHourGlass (file_mgr_rec->shell);
4681 if (ip->ts == tsError)
4683 if (file_mgr_data->busy_status == not_busy)
4685 file_mgr_data->busy_detail = 0;
4686 file_mgr_data->busy_status = initiating_readdir;
4688 RereadDirectory (file_mgr_rec->shell, file_mgr_data->host, path);
4689 if (file_mgr_data->busy_status == initiating_readdir)
4690 file_mgr_data->busy_status = not_busy;
4692 rc = ReadDir(file_mgr_rec->shell, file_mgr_data,
4693 file_mgr_data->host, path, ip,
4694 level, level, NULL);
4696 /* create new directory set entry */
4697 directory_set = NewDirectorySet(path, ip, file_mgr_data);
4699 /* if this is a new entry, add it to the directory set */
4700 if (ip->ts == tsNotRead)
4702 file_mgr_data->directory_set =
4704 XtRealloc((char *)(file_mgr_data->directory_set - 1),
4705 (file_mgr_data->directory_count + 2)*sizeof(DirectorySet *))) + 1;
4706 file_mgr_data->directory_set[file_mgr_data->directory_count] =
4708 file_mgr_data->directory_count++;
4712 /* otherwise, replace the existing entry */
4713 for (i = 0; i < file_mgr_data->directory_count; i++)
4714 if (strcmp(file_mgr_data->directory_set[i]->name, path) == 0)
4716 XtFree(file_mgr_data->directory_set[i]->name);
4717 file_mgr_data->directory_set[i]->name = NULL;
4718 if (file_mgr_data->directory_set[i]->file_view_data != NULL)
4719 XtFree((char *)file_mgr_data->directory_set[i]->file_view_data);
4720 file_mgr_data->directory_set[i]->file_view_data = NULL;
4721 XtFree((char *)file_mgr_data->directory_set[i]);
4722 file_mgr_data->directory_set[i] = directory_set;
4726 ip->ts == tsError && file_mgr_data->busy_status == busy_readdir)
4731 if (file_mgr_data->busy_status != busy_readdir)
4733 OrderFiles (file_mgr_data, directory_set);
4734 FilterFiles (file_mgr_data, directory_set);
4735 file_mgr_data->newSize = True;
4736 AddFileIcons(file_mgr_rec, file_mgr_data, directory_set);
4740 /* expand the branch */
4741 UpdateBranchState(file_mgr_data, ip, BRANCH_EXPAND,
4742 new_branch && file_mgr_data->busy_status == busy_readdir);
4746 /* collaps the branch */
4747 UpdateBranchState(file_mgr_data, ip, BRANCH_COLLAPSE, False);
4750 /* change tree button */
4751 if (file_mgr_data->busy_status != busy_readdir)
4753 px = GetTreebtnPixmap(file_mgr_data, ip);
4754 XtSetArg(args[0], XmNlabelPixmap, px);
4755 XtSetValues (ip->treebtn, args, 1);
4758 for (i = 0; i < file_mgr_data->directory_count; i++)
4759 if (strcmp(file_mgr_data->directory_set[i]->name, path) == 0)
4762 SelectVisible(file_mgr_data);
4763 UpdateBranchList(file_mgr_data, file_mgr_data->directory_set[i]);
4765 UnmanageFileIcons(file_mgr_rec, file_mgr_data, ip);
4766 EraseTreeLines(file_mgr_rec, file_mgr_data, ip);
4768 /* update the "Hidden" count */
4769 UpdateHeaders(file_mgr_rec, file_mgr_data, False);
4773 /************************************************************************
4776 * Free up the directory set data.
4778 ************************************************************************/
4782 DirectorySet ** directory_set,
4783 int directory_count)
4790 for (i = -1; i < directory_count; i++)
4792 if (directory_set[i] == NULL)
4795 XtFree ((char *) directory_set[i]->name);
4796 for (j = 0; j < directory_set[i]->file_count; j++)
4798 if( (char *) directory_set[i]->file_view_data[j]->label)
4800 XtFree ((char *) directory_set[i]->file_view_data[j]->label);
4801 directory_set[i]->file_view_data[j]->label = NULL;
4803 XtFree ((char *) directory_set[i]->file_view_data[j]);
4804 directory_set[i]->file_view_data[j] = NULL;
4806 if (directory_set[i]->file_view_data != NULL)
4807 XtFree ((char *) directory_set[i]->file_view_data);
4808 XtFree ((char *) directory_set[i]->order_list);
4809 XtFree ((char *) directory_set[i]);
4812 XtFree ((char *) (directory_set - 1));
4816 /************************************************************************
4819 * Free up the current directory and the directory set data.
4821 ************************************************************************/
4825 FileMgrData *file_mgr_data )
4827 if(file_mgr_data->object_positions)
4828 FreePositionInfo(file_mgr_data);
4830 if (file_mgr_data->current_directory != NULL)
4831 XtFree ((char *) file_mgr_data->current_directory);
4832 file_mgr_data->current_directory = NULL;
4834 if (file_mgr_data->host != NULL)
4835 XtFree ((char *) file_mgr_data->host);
4836 file_mgr_data->host = NULL;
4838 FreeLayoutData(file_mgr_data->layout_data);
4839 file_mgr_data->layout_data = NULL;
4840 FreeDirectorySet(file_mgr_data->directory_set,
4841 file_mgr_data->directory_count);
4842 file_mgr_data->directory_set = NULL;
4848 /************************************************************************
4851 * Close (destroy) the file browser view. This callback is issued
4852 * from both the Close menu item and the Close system menu.
4854 ************************************************************************/
4859 XtPointer client_data,
4860 XtPointer call_data )
4862 FileMgrRec * file_mgr_rec;
4863 DialogData * dialog_data;
4865 Widget mbar = XmGetPostedFromWidget(XtParent(w));
4868 XmUpdateDisplay (w);
4870 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
4871 XtGetValues(mbar, args, 1);
4872 /* Ignore accelerator received after we're unposted */
4873 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
4876 CloseView (dialog_data);
4882 /************************************************************************
4885 * Function called from a close on the system menu.
4887 ************************************************************************/
4894 FileMgrRec * file_mgr_rec;
4895 DialogData * dialog_data;
4898 file_mgr_rec = (FileMgrRec *) data;
4899 dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec);
4901 CloseView (dialog_data);
4906 /************************************************************************
4909 * Set the icon name and icon to be used for a file manager view.
4911 ************************************************************************/
4915 FileMgrRec *file_mgr_rec,
4916 FileMgrData *file_mgr_data,
4917 char *directory_name )
4919 static Pixmap tool_icon = XmUNSPECIFIED_PIXMAP;
4920 static Pixmap dir_icon = XmUNSPECIFIED_PIXMAP;
4921 static Pixmap tool_mask = XmUNSPECIFIED_PIXMAP;
4922 static Pixmap dir_mask = XmUNSPECIFIED_PIXMAP;
4923 char * new_directory_name;
4924 Pixel background, foreground, top_shadow, bottom_shadow, select;
4927 unsigned int height;
4930 Boolean havePixmap = False;
4931 Boolean haveMask = False;
4932 Boolean root = False;
4934 char *ptr, *fileLabel, *fileName;
4936 if (tool_icon == XmUNSPECIFIED_PIXMAP)
4938 XtSetArg (args[0], XmNbackground, &background);
4939 XtSetArg (args[1], XmNcolormap, &colormap);
4940 XtGetValues (file_mgr_rec->main, args, 2);
4942 XmGetColors (XtScreen (file_mgr_rec->main), colormap, background,
4943 &foreground, &top_shadow, &bottom_shadow, &select);
4945 /* first get the File Manager's Icon */
4946 pixmap = XmGetPixmap (XtScreen (file_mgr_rec->main), fileMgrIcon,
4947 foreground, background);
4948 if( pixmap != XmUNSPECIFIED_PIXMAP)
4951 /* now let's get the mask for the File Manager */
4952 pixmap = _DtGetMask (XtScreen (file_mgr_rec->main), fileMgrIcon);
4953 if( pixmap != XmUNSPECIFIED_PIXMAP)
4956 /* Let's get the Application Manager's Icon */
4957 pixmap = XmGetPixmap (XtScreen (file_mgr_rec->main), appMgrIcon,
4958 foreground, background);
4959 if( pixmap != XmUNSPECIFIED_PIXMAP)
4962 /* now let's get the mask for the Application Manager */
4963 pixmap = _DtGetMask (XtScreen (file_mgr_rec->main), appMgrIcon);
4964 if( pixmap != XmUNSPECIFIED_PIXMAP)
4970 if (fileLabel = DtDtsFileToAttributeValue(directory_name, DtDTS_DA_LABEL))
4972 else if (fileName = strrchr(directory_name, '/'))
4977 if(file_mgr_data->title)
4979 if(file_mgr_data->toolbox)
4981 if(strcmp(directory_name, file_mgr_data->restricted_directory) == 0)
4983 new_directory_name =
4984 (char *)XtMalloc(strlen(file_mgr_data->title) + 1);
4985 strcpy( new_directory_name, file_mgr_data->title );
4989 new_directory_name = (char *)XtMalloc( strlen(ptr) + 1 );
4990 sprintf(new_directory_name, "%s", ptr);
4995 new_directory_name = (char *)XtMalloc( strlen(ptr) + 1);
4996 sprintf(new_directory_name, "%s", ptr);
5002 if (strcmp (directory_name, "/") == 0 && !fileLabel)
5004 new_directory_name = (char *)XtMalloc(strlen(file_mgr_data->host) +
5005 strlen(root_title) + 3);
5006 sprintf( new_directory_name, "%s:%s", file_mgr_data->host, root_title );
5010 new_directory_name = ptr;
5013 XtSetArg (args[0], XmNiconName, new_directory_name);
5015 if(file_mgr_data->toolbox && tool_icon != XmUNSPECIFIED_PIXMAP)
5018 XtSetArg (args[1], XmNiconPixmap, tool_icon);
5019 if( tool_mask != XmUNSPECIFIED_PIXMAP)
5022 XtSetArg (args[2], XmNiconMask, tool_mask);
5025 else if (dir_icon != XmUNSPECIFIED_PIXMAP)
5028 XtSetArg (args[1], XmNiconPixmap, dir_icon);
5029 if( dir_mask != XmUNSPECIFIED_PIXMAP)
5032 XtSetArg (args[2], XmNiconMask, dir_mask);
5039 XtSetValues (file_mgr_rec->shell, args, 3);
5041 XtSetValues (file_mgr_rec->shell, args, 2);
5044 XtSetValues (file_mgr_rec->shell, args, 1);
5047 DtDtsFreeAttributeValue(fileLabel);
5049 XtFree(new_directory_name);
5055 * Menu callback for the fast change directory toggle. Toggles the text
5056 * field up and down.
5059 ShowChangeDirField (
5061 XtPointer client_data,
5064 FileMgrRec * file_mgr_rec;
5065 DialogData * dialog_data;
5066 FileMgrData * file_mgr_data;
5072 /* Set the menu item to insensitive to prevent multiple */
5073 /* dialogs from being posted and get the area under the */
5074 /* menu pane redrawn. */
5078 if((int)client_data == FM_POPUP)
5081 mbar = XmGetPostedFromWidget(XtParent(w));
5082 XmUpdateDisplay (w);
5083 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
5084 XtGetValues(mbar, args, 1);
5088 /* Done only during a restore session */
5089 file_mgr_rec = (FileMgrRec *)client_data;
5092 /* Got an accelerator after we were unposted */
5093 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
5095 file_mgr_data = (FileMgrData *) dialog_data->data;
5097 /* Toggle the state of the text field */
5098 if (XtIsManaged(file_mgr_rec->current_directory_text))
5100 XtSetArg (args[0], XmNallowShellResize, False);
5101 XtSetValues(file_mgr_rec->shell, args, 1);
5102 XtUnmanageChild(file_mgr_rec->current_directory_text);
5103 XtSetArg (args[0], XmNallowShellResize, True);
5104 XtSetValues(file_mgr_rec->shell, args, 1);
5105 file_mgr_data->fast_cd_enabled = False;
5108 ShowFastChangeDir(file_mgr_rec, file_mgr_data);
5114 * Class function for forcing the focus to the text field, if visible, each
5115 * time the FileMgr dialog is posted.
5120 FileMgrRec * file_mgr_rec,
5121 FileMgrData * file_mgr_data)
5123 /* Force the focus to the text field */
5124 if (file_mgr_data->fast_cd_enabled)
5126 XRaiseWindow(XtDisplay(file_mgr_rec->current_directory_text),
5127 XtWindow(file_mgr_rec->current_directory_text));
5128 XmProcessTraversal(file_mgr_rec->current_directory_text,
5129 XmTRAVERSE_CURRENT);
5135 * This function free up any position information associated with the
5136 * dtfile view, and nulls out the associated data fields.
5141 FileMgrData * file_mgr_data)
5144 FileViewData **file_view_data;
5146 /* free object positions */
5147 for (i = 0; i < file_mgr_data->num_objects; i++)
5149 XtFree(file_mgr_data->object_positions[i]->name);
5150 XtFree((char *)file_mgr_data->object_positions[i]);
5151 file_mgr_data->object_positions[i] = NULL;
5154 XtFree((char *)file_mgr_data->object_positions);
5156 file_mgr_data->object_positions = NULL;
5157 file_mgr_data->num_objects = 0;
5159 /* clear references to object positions in file_view_data */
5160 for (i = 0; i < file_mgr_data->directory_count; i++)
5162 file_view_data = file_mgr_data->directory_set[i]->file_view_data;
5163 for (j = 0; j < file_mgr_data->directory_set[i]->file_count; j++)
5164 file_view_data[j]->position_info = NULL;
5170 * This function determines whether random positioning is currently enabled
5171 * for this view. The decision is based upon they type of the view, and
5172 * the current preferences settings.
5176 PositioningEnabledInView (
5177 FileMgrData * file_mgr_data)
5180 if ((file_mgr_data->show_type == SINGLE_DIRECTORY) &&
5181 (file_mgr_data->view != BY_ATTRIBUTES) &&
5182 (file_mgr_data->positionEnabled == RANDOM_ON))
5192 * This function is similar to the above function, but is less restrictive;
5193 * this function does not require that the view currently have positioning
5194 * enabled; it simply returns whether the view has positioning info.
5199 FileMgrData * file_mgr_data)
5202 if ((file_mgr_data->object_positions) &&
5203 (file_mgr_data->positionEnabled == RANDOM_ON))
5213 * When a new view of a directory is spun off of an existing view of that
5214 * directory, we want the new view to inherit the positioning information
5215 * associated with the original view. This function takes care of that.
5219 InheritPositionInfo (
5220 FileMgrData * src_file_mgr_data,
5221 FileMgrData * dest_file_mgr_data)
5224 ObjectPosition *ptr;
5225 ObjectPosition **temp_stack;
5227 if (!PositionFlagSet(src_file_mgr_data))
5229 /* Nothing to inherit */
5230 dest_file_mgr_data->num_objects = 0;
5231 dest_file_mgr_data->object_positions = NULL;
5235 dest_file_mgr_data->num_objects = src_file_mgr_data->num_objects;
5236 dest_file_mgr_data->object_positions = (ObjectPosition **) XtMalloc(
5237 sizeof(ObjectPosition *) * dest_file_mgr_data->num_objects);
5239 temp_stack = (ObjectPosition **) XtMalloc(
5240 sizeof(ObjectPosition *) * dest_file_mgr_data->num_objects);
5242 for (i = 0; i < dest_file_mgr_data->num_objects; i++)
5244 ptr = dest_file_mgr_data->object_positions[i] = (ObjectPosition *)
5245 XtMalloc(sizeof(ObjectPosition));
5247 *ptr = *(src_file_mgr_data->object_positions[i]);
5248 ptr->name = XtNewString(ptr->name);
5249 ptr->file_view_data = NULL;
5253 temp_stack[ptr->stacking_order - 1] = ptr;
5256 for(i = 0; i < dest_file_mgr_data->num_objects; i++)
5258 if(dest_file_mgr_data->object_positions[i]->stacking_order == 1)
5260 dest_file_mgr_data->object_positions[i]->next =
5261 temp_stack[dest_file_mgr_data->object_positions[i]->stacking_order];
5264 else if(dest_file_mgr_data->object_positions[i]->stacking_order ==
5265 dest_file_mgr_data->num_objects)
5267 dest_file_mgr_data->object_positions[i]->prev =
5268 temp_stack[dest_file_mgr_data->object_positions[i]->
5269 stacking_order - 2];
5273 dest_file_mgr_data->object_positions[i]->prev =
5274 temp_stack[dest_file_mgr_data->object_positions[i]->
5275 stacking_order - 2];
5276 dest_file_mgr_data->object_positions[i]->next =
5277 temp_stack[dest_file_mgr_data->object_positions[i]->stacking_order];
5281 XtFree((char *)temp_stack);
5286 * This function saves the current position information (if any) in the
5287 * associated directory; if there is no positional data, then any old
5288 * position files in this directory are removed. The entries are written
5289 * according to their position (left to right, top to bottom), not according
5290 * to their relative stacking order.
5295 FileMgrData * file_mgr_data)
5298 PositionInfo *position_info;
5299 ObjectPosition * ptr;
5302 /* Copy object positions into position info array */
5303 if (file_mgr_data->num_objects <= 0)
5304 position_info = NULL;
5307 position_info = (PositionInfo *)
5308 XtMalloc(file_mgr_data->num_objects * sizeof(PositionInfo));
5309 for (i = 0; i < file_mgr_data->num_objects; i++)
5311 ptr = file_mgr_data->object_positions[i];
5313 position_info[i].name = ptr->name;
5314 position_info[i].x = ptr->x;
5315 position_info[i].y = ptr->y;
5316 position_info[i].stacking_order = ptr->stacking_order;
5320 SetDirectoryPositionInfo(file_mgr_data->host,
5321 file_mgr_data->current_directory,
5322 file_mgr_data->num_objects, position_info);
5324 XtFree((char *)position_info);
5329 * This function will attempt to load any positional data associated with
5330 * the directory to be viewed. Within the positioning file, the entries
5331 * are order in left-to-right, top-to-bottom order, not according to the
5337 FileMgrData * file_mgr_data)
5339 PositionInfo *position_info;
5340 ObjectPosition * ptr;
5344 /* don't do anything if we already have position information */
5345 if (file_mgr_data->object_positions != NULL)
5348 /* Load the number of entries */
5349 numObjects = GetDirectoryPositionInfo(file_mgr_data->host,
5350 file_mgr_data->current_directory, &position_info);
5352 if (numObjects <= 0)
5354 file_mgr_data->object_positions = NULL;
5355 file_mgr_data->num_objects = 0;
5361 /* Proceed with the loading */
5362 file_mgr_data->object_positions = (ObjectPosition **)XtMalloc(
5363 sizeof(ObjectPosition *) * numObjects);
5365 for (i = 0; i < numObjects; i++)
5367 ptr = file_mgr_data->object_positions[i] = (ObjectPosition *)
5368 XtMalloc(sizeof(ObjectPosition));
5369 ptr->name = XtNewString(position_info[i].name);
5370 ptr->x = position_info[i].x;
5371 ptr->y = position_info[i].y;
5372 ptr->in_use = False;
5373 ptr->late_bind = False;
5374 ptr->stacking_order = position_info[i].stacking_order;
5375 ptr->file_view_data = NULL;
5380 /* Repair all of the next and prev pointers */
5381 file_mgr_data->num_objects = i;
5382 RepairStackingPointers(file_mgr_data);
5383 /* OrderChildrenList(file_mgr_data); */
5389 /************************************************************************
5391 * MoveOkCB - the user wishes to actually do the move even though its
5392 * not the desktop object that is actually getting moved.
5393 * This function calls the routines which do the moves. It
5394 * depends on the view type to determine how it does it.
5396 * DESKTOP - the drop happened on a Desktop object
5397 * and the object was a directory
5398 * NOT_DESKTOP_DIR - the drop happened on a directory
5399 * but it wasn't a directory on the desktop.
5400 * NOT_DESKTOP - drop happened in a FileManager view
5401 * and not on a directory.
5404 ************************************************************************/
5408 XtPointer client_data,
5409 XtPointer call_data )
5411 XtUnmanageChild((Widget)client_data);
5412 XmUpdateDisplay((Widget)client_data);
5413 XtDestroyWidget((Widget)client_data);
5418 /************************************************************************
5420 * MoveCancelCB - function called when the user cancels out of the
5421 * Move file question dialog. Just deleted the dialog.
5423 ************************************************************************/
5427 XtPointer client_data,
5428 XtPointer call_data )
5430 FileMgrRec *file_mgr_rec;
5432 XtUnmanageChild((Widget)client_data);
5433 XmUpdateDisplay((Widget)client_data);
5434 XtDestroyWidget((Widget)client_data);
5436 if(view_type == NOT_DESKTOP)
5438 file_mgr_rec = (FileMgrRec *)fm->file_mgr_rec;
5439 LayoutFileIcons(file_mgr_rec, fm, False, True);
5444 RemoveIconInWorkspace(
5446 char * workspaceName )
5448 DesktopRec *desktopWin;
5450 char iconName[MAX_PATH];
5453 for(i = 0; i < desktop_data->numIconsUsed; i++)
5455 desktopWin = desktop_data->desktopWindows[i];
5457 if( strcmp( desktopWin->dir_linked_to, "/" ) == 0 )
5458 sprintf( iconName, "/%s", desktopWin->file_name );
5460 sprintf( iconName, "%s/%s", desktopWin->dir_linked_to, desktopWin->file_name );
5462 DtEliminateDots( iconName );
5464 if( strcmp( fileName, iconName ) == 0
5465 && strcmp( workspaceName, desktopWin->workspace_name ) == 0 )
5467 RemoveDT( desktopWin->shell, (XtPointer) desktopWin,
5474 /*************************************************************************
5476 * CheckMoveType - function used to determine:
5477 * 1) is the file being moved have a reference to a
5479 * 2) if yes: is the file being moved dragged from
5480 * the Desktop (check widget_dragged)?
5481 * 2a) if yes: set up global varibles used by message
5483 * 2b) if no: execute the move, then if one of the objects
5484 * is on the Desktop, move the link to the
5486 * 3) question 1 answer is no: just exectute the move
5488 * Other information:
5490 * DESKTOP - the drop happened on a Desktop object
5491 * and the object was a directory
5492 * NOT_DESKTOP_DIR - the drop happened on a directory
5493 * but it wasn't a directory on the desktop.
5494 * NOT_DESKTOP - drop happened in a FileManager view
5495 * and not on a directory.
5498 **************************************************************************/
5501 FileMgrData *file_mgr_data,
5502 FileViewData *file_view_data,
5503 DirectorySet * directory_data,
5504 DesktopRec * desktopWindow,
5507 unsigned int modifiers,
5518 char directory[MAX_PATH];
5521 Screen *currentScreen;
5523 char * workspace_name;
5527 #ifdef _CHECK_FOR_SPACES
5528 if (_DtSpacesInFileNames(file_set, file_count))
5530 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."));
5531 char * msg = XtNewString(tmpStr);
5532 FileOperationError (toplevel, msg, NULL);
5538 display = XtDisplay(toplevel);
5539 screen = XDefaultScreen(display);
5540 currentScreen = XScreenOfDisplay(display, screen);
5541 rootWindow = RootWindowOfScreen(currentScreen);
5543 if( DtWsmGetCurrentWorkspace(display,rootWindow,&pCurrent) == Success )
5545 workspace_name = XGetAtomName (display, pCurrent);
5546 CleanUpWSName(workspace_name);
5549 /* Fix for the case, when you drop an object from App. Manager on to desktop
5550 and try to move it to File Manager. It must copied for this operation
5551 (modifers == ControlMask). */
5555 Str = (char *)IsAFileOnDesktop2(file_set, file_count, &number,&IsToolBox);
5557 modifiers = ControlMask;
5561 * If number is comes back greater than 0 then at least one of the files
5562 * dropped has a reference to a Desktop object
5564 * If widget_dragged is != NULL then the files dragged are from the
5565 * desktop; in this case set up globals, and post a confirmation dialog.
5567 modifiers &= ~Button2Mask;
5568 modifiers &= ~Button1Mask;
5570 modifiers != ControlMask && modifiers != ShiftMask &&
5571 widget_dragged != NULL)
5573 char *message = NULL;
5575 char *from, *to, *filename;
5577 global_file_count = file_count;
5578 _DtCopyDroppedFileInfo(file_count, file_set, host_set,
5579 &global_file_set, &global_host_set);
5582 fv = file_view_data;
5588 /* desktop object dropped on a desktop directory */
5589 dtWindow = desktopWindow;
5590 fm = (FileMgrData *)NULL;
5591 dd = (DirectorySet *)NULL;
5592 to = (char *)XtMalloc(strlen(directory_data->name) +
5593 strlen(fv->file_data->file_name)+ 2);
5594 sprintf(to, "%s/%s", directory_data->name,
5595 fv->file_data->file_name );
5596 DtEliminateDots(to);
5598 case NOT_DESKTOP_DIR:
5599 /* desktop object dropped on a file view directory icon */
5600 dtWindow = (DesktopRec *)NULL;
5602 dd = directory_data;
5603 to = (char *)XtMalloc(strlen(dd->name) +
5604 strlen(fv->file_data->file_name) + 2);
5605 sprintf( to, "%s/%s",dd->name , fv->file_data->file_name );
5606 (void) DtEliminateDots(to);
5608 default:/* view == NOT_DESKTOP */
5609 /* desktop object dropped in a file manager view */
5610 dtWindow = (DesktopRec *)NULL;
5612 dd = (DirectorySet *)NULL;
5613 to = (char *)XtMalloc(strlen(file_mgr_data->current_directory)
5615 strcpy(to, file_mgr_data->current_directory);
5619 for(i=0; i<file_count; i++)
5621 if(strcmp(file_set[i], to) == 0)
5624 FileMgrRec *file_mgr_rec;
5626 GETMESSAGE(11,16,"A folder cannot be moved into itself.\n%s");
5627 msg = XtNewString(tmpStr);
5628 if(file_view_data == NULL)
5630 file_mgr_rec = (FileMgrRec *)file_mgr_data->file_mgr_rec;
5631 FileOperationError(file_mgr_rec->shell, msg, file_set[i]);
5635 FileOperationError(file_view_data->widget, msg, file_set[i]);
5640 XtFree(workspace_name);
5645 tmpStr = (GETMESSAGE(12,3, "Move File(s)"));
5646 title = XtNewString(tmpStr);
5649 int len = strlen(to);
5653 && file_mgr_data->toolbox )
5655 ptr = strrchr(file_set[0], '/');
5656 ptr1 = (char *)XtMalloc(strlen(to) + strlen(ptr) + 1);
5657 sprintf(ptr1, "%s%s", to, ptr);
5658 ptr1 = _DtResolveAppManPath( ptr1,
5659 file_mgr_data->restricted_directory);
5661 if (strncmp(ptr1, file_set[0], len) == 0)
5670 from = XtNewString( file_set[0] );
5671 ptr = strrchr( from, '/' );
5673 filename = XtNewString("");
5677 ptr = strrchr(file_set[0], '/');
5681 from = (char *)XtMalloc(strlen(file_set[0]) + 1);
5682 strcpy(from, file_set[0]);
5685 filename = (char *)XtMalloc(strlen(ptr) + 1);
5686 strcpy(filename, ptr);
5690 from = (char *)XtMalloc(strlen(ptr) + 1);
5692 filename = XtNewString("");
5696 if( strcmp( from, to ) == 0 )
5698 RemoveIconInWorkspace( file_set[0], workspace_name );
5702 XtFree(workspace_name);
5706 #ifdef sun /* This format statement core dumps on SunOS 4.0.3 and 4.1 */
5707 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?"));
5709 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?"));
5711 message = (char *)XtMalloc(strlen(tmpStr) + strlen(filename) +
5712 strlen(to) + strlen(from) + 1);
5714 sprintf(message, tmpStr, filename, from, to);
5721 int len = strlen(to);
5725 for( i = 0; i < desktop_data->numWorkspaces; ++i )
5727 if( strcmp( workspace_name, desktop_data->workspaceData[i]->name) == 0 )
5729 workspace_num = desktop_data->workspaceData[i]->number;
5734 DeselectAllDTFiles( desktop_data->workspaceData[workspace_num -1] );
5740 && file_mgr_data->toolbox)
5742 to = _DtResolveAppManPath( to,
5743 file_mgr_data->restricted_directory );
5744 for( i = 0; i < number; ++i )
5748 from = (char *)XtNewString( file_set[i] );
5749 ptr = strrchr( from, '/' );
5751 from = _DtResolveAppManPath( from,
5752 file_mgr_data->restricted_directory );
5755 if( strcmp( from, to ) == 0 )
5756 RemoveIconInWorkspace( file_set[i], workspace_name );
5764 for( i = 0; i < number; ++i )
5766 ptr = strrchr(file_set[i], '/');
5770 from = (char *)XtMalloc(strlen(file_set[i]) + 1);
5771 strcpy(from, file_set[i]);
5776 from = (char *)XtMalloc(strlen(ptr) + 1);
5780 if( strcmp( to, from ) == 0 )
5782 RemoveIconInWorkspace( file_set[i], workspace_name );
5795 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?"));
5796 message = (char *)XtMalloc(strlen(tmpStr) + strlen(to) + 1);
5798 sprintf(message, tmpStr, to);
5808 _DtMessageDialog(toplevel, title, message, NULL, TRUE,
5809 MoveCancelCB, MoveOkCB, NULL, HelpRequestCB, False,
5816 XtFree(workspace_name);
5820 XtFree(Str); /* No longer used, so free it up */
5821 XtFree(workspace_name);
5823 * Files are not dragged from the desktop.
5825 * Just execute the operation. The target directory dependings on
5826 * the view type (i.e. DESKTOP, NOT_DESKTOP, or NOT_DESKTOP_DIR).
5831 target_host = desktopWindow->host;
5832 sprintf( directory, "%s/%s", directory_data->name,
5833 file_view_data->file_data->file_name );
5834 DtEliminateDots(directory);
5835 value = FileMoveCopyDesktop (file_view_data, directory,
5836 host_set, file_set, file_count,
5837 modifiers, desktopWindow,
5841 case NOT_DESKTOP_DIR:
5842 target_host = file_mgr_data->host;
5843 sprintf( directory, "%s/%s", directory_data->name,
5844 file_view_data->file_data->file_name );
5845 DtEliminateDots(directory);
5846 value = FileMoveCopy (file_mgr_data,
5847 NULL, directory, target_host,
5848 host_set, file_set, file_count,
5849 modifiers, NULL, NULL);
5852 default:/* view == NOT_DESKTOP */
5853 target_host = file_mgr_data->host;
5854 strcpy(directory, file_mgr_data->current_directory);
5858 RepositionIcons(file_mgr_data, file_set, file_count, drop_x,
5861 value = FileMoveCopy(file_mgr_data,
5862 NULL, directory, target_host,
5863 host_set, file_set, file_count,
5864 modifiers, NULL, NULL);
5871 * If this was a move and any of the files is referenced by a
5872 * Desktop object we need to change the reference to the new
5873 * location that the file moved to.
5875 * @@@ This should really be done in the pipe callback!
5879 modifiers != ControlMask && modifiers != ShiftMask)
5881 Tt_status tt_status;
5883 for(j = 0; j < file_count; j++)
5886 DesktopRec *desktopWin;
5889 * loop through each desktop object to see if the file
5890 * being operated on has a reference to a desktop object.
5891 * If it does change the reference in the desktop object
5893 * NOTE: if we find a desktop object the file references,
5894 * after we've changed the DT object we can't break
5895 * because there might be more than one DT object which
5898 for(i = 0; i < desktop_data->numIconsUsed; i++)
5900 desktopWin = desktop_data->desktopWindows[i];
5901 fileName = ResolveLocalPathName( desktopWin->host, desktopWin->dir_linked_to,
5902 desktopWin->file_name, home_host_name, &tt_status);
5903 if( TT_OK == tt_status && strcmp(fileName, file_set[j]) == 0 )
5906 * if fileName == file_set[j] then the file is on the
5907 * Desktop so change the dir_linked to reference. What the
5908 * new reference is depends on which view type is being
5911 XtFree(desktopWin->host);
5912 desktopWin->host = XtNewString(target_host);
5914 XtFree(desktopWin->dir_linked_to);
5915 desktopWin->dir_linked_to = XtNewString(directory);
5917 XtFree(desktopWin->restricted_directory);
5918 if(file_mgr_data->restricted_directory != NULL)
5919 desktopWin->restricted_directory =
5920 XtNewString(file_mgr_data->restricted_directory);
5922 desktopWin->restricted_directory = NULL;
5924 XtFree(desktopWin->title);
5925 if(file_mgr_data->title != NULL)
5926 desktopWin->title = XtNewString(file_mgr_data->title);
5928 desktopWin->title = NULL;
5930 XtFree(desktopWin->helpVol);
5931 if(file_mgr_data->helpVol != NULL)
5932 desktopWin->helpVol = XtNewString(file_mgr_data->helpVol);
5934 desktopWin->helpVol = NULL;
5936 desktopWin->toolbox = file_mgr_data->toolbox;
5939 } /* for ( i = 0 ...) */
5940 } /* for (j = 0 ...) */
5942 /* since at least one of the file has been moved lets update
5943 the !dtdesktop file */
5944 SaveDesktopInfo(NORMAL_RESTORE);
5951 * This function returns the current working directory settings, used when
5952 * invoking an action. The caller passes in the current directory for the
5953 * command, and we will simply copy it and return new pointers, unless the
5954 * path specifies a directory which is part of the tool/apps area; in this
5955 * case, the cwd is set to the user's home directory.
5957 * The application must free up these two return pointers.
5969 if ((strcmp(home_host_name, viewHost) == 0) && type != NULL)
5973 /* Force app dir and any of its subdirs to use $HOME */
5974 if(strcmp(users_home_dir, "/") != 0)
5976 ptr = strrchr(users_home_dir, '/');
5978 *pwdDirRet = XtNewString(users_home_dir);
5982 *pwdDirRet = XtNewString(users_home_dir);
5983 *pwdHostRet = XtNewString(home_host_name);
5987 /* Simply use the passed in cwd */
5988 *pwdHostRet = XtNewString(viewHost);
5989 *pwdDirRet = XtNewString(viewDir);
5994 CreateFmPopup (Widget w)
5996 Widget popupBtns[FM_POPUP_CHILDREN];
5997 XmString label_string;
6004 /* Create file manager popup menu */
6006 XtSetArg(args[n],XmNmenuAccelerator," "); n++;
6007 XtSetArg(args[n],XmNwhichButton, bMenuButton); n++;
6008 fileMgrPopup.menu = XmCreatePopupMenu(w, "FMPopup", args, n);
6009 XtAddCallback(fileMgrPopup.menu, XmNhelpCallback,
6010 (XtCallbackProc)HelpRequestCB,
6011 HELP_POPUP_MENU_STR);
6014 /* Create file manager title */
6015 fileMgrPopup.title = popupBtns[i] =
6016 (Widget)XmCreateLabelGadget(fileMgrPopup.menu, "fmtitle", NULL, 0);
6020 /* Create title separators */
6021 popupBtns[i++] = XmCreateSeparatorGadget(fileMgrPopup.menu, "sep2",
6025 /* Create 'Properties' option - white space popup */
6026 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 150, "Change Permissions...")));
6027 XtSetArg (args[0], XmNlabelString, label_string);
6028 mnemonic = ((char *)GETMESSAGE(20, 17, "P"));
6029 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6031 fileMgrPopup.wsPopup[BTN_PROPERTIES] = popupBtns[i] =
6032 XmCreatePushButtonGadget (fileMgrPopup.menu, "permissions", args, 2);
6033 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6034 (XtCallbackProc)HelpRequestCB,
6035 HELP_POPUP_MENU_STR);
6037 XmStringFree (label_string);
6040 /* Create 'Find' option -- white space popup */
6041 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 18, "Find...")));
6042 XtSetArg (args[0], XmNlabelString, label_string);
6043 mnemonic = ((char *)GETMESSAGE(20, 19, "F"));
6044 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6046 fileMgrPopup.wsPopup[BTN_FIND] = popupBtns[i] =
6047 XmCreatePushButtonGadget (fileMgrPopup.menu, "find", args, 2);
6048 XtAddCallback (popupBtns[i], XmNactivateCallback,
6049 ShowFindDialog, (XtPointer) FM_POPUP);
6050 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6051 (XtCallbackProc)HelpRequestCB,
6052 HELP_FILE_MENU_STR);
6054 XmStringFree (label_string);
6057 /* Create 'Clean Up' option -- white space popup */
6058 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 99, "Clean Up")));
6059 XtSetArg (args[0], XmNlabelString, label_string);
6060 mnemonic = ((char *)GETMESSAGE(20, 100, "C"));
6061 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6063 fileMgrPopup.wsPopup[BTN_CLEANUP] = popupBtns[i] =
6064 XmCreatePushButtonGadget (fileMgrPopup.menu, "cleanUp", args, 2);
6065 XtAddCallback (popupBtns[i], XmNactivateCallback,
6066 CleanUp, (XtPointer) FM_POPUP);
6067 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6068 (XtCallbackProc)HelpRequestCB,
6069 HELP_CLEAN_UP_COMMAND_STR);
6071 XmStringFree (label_string);
6074 /* Create 'Select All' option -- white space popup */
6075 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 48, "Select All")));
6076 XtSetArg (args[0], XmNlabelString, label_string);
6077 mnemonic = ((char *)GETMESSAGE(20, 51, "S"));
6078 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6080 fileMgrPopup.wsPopup[BTN_SELECTALL] = popupBtns[i] =
6081 XmCreatePushButtonGadget (fileMgrPopup.menu, "selectAll", args, 2);
6082 XtAddCallback (popupBtns[i], XmNactivateCallback,
6083 SelectAll, (XtPointer) FM_POPUP);
6084 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6085 (XtCallbackProc)HelpRequestCB,
6086 HELP_SELECT_ALL_COMMAND_STR);
6088 XmStringFree (label_string);
6091 /* Create 'Unselect All' option -- white space popup */
6092 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 52, "Deselect All")));
6093 XtSetArg (args[0], XmNlabelString, label_string);
6094 mnemonic = ((char *)GETMESSAGE(20, 55, "D"));
6095 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6097 fileMgrPopup.wsPopup[BTN_UNSELECTALL] = popupBtns[i] =
6098 XmCreatePushButtonGadget (fileMgrPopup.menu, "deselectAll", args, 2);
6099 XtAddCallback (popupBtns[i], XmNactivateCallback,
6100 UnselectAll, (XtPointer) FM_POPUP);
6101 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6102 (XtCallbackProc)HelpRequestCB,
6103 HELP_UNSELECT_ALL_COMMAND_STR);
6105 XmStringFree (label_string);
6108 /* Create 'Show Hidden Files' option -- white space popup */
6109 label_string = XmStringCreateLocalized((GETMESSAGE(20, 156, "Show Hidden Objects")));
6110 XtSetArg (args[0], XmNlabelString, label_string);
6111 mnemonic = ((char *)GETMESSAGE(20, 102, "H"));
6112 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6114 fileMgrPopup.wsPopup[BTN_SHOWHIDDEN] = popupBtns[i] =
6115 XmCreateToggleButtonGadget (fileMgrPopup.menu, "showHiddenObjects", args, 2);
6116 XtAddCallback (popupBtns[i], XmNvalueChangedCallback,
6117 ShowHiddenFiles, (XtPointer) FM_POPUP);
6118 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6119 (XtCallbackProc)HelpRequestCB,
6120 HELP_SHOW_HIDDEN_COMMAND_STR);
6122 XmStringFree (label_string);
6125 /* Manage white space popup buttons -- since XmNadjustMargin defaults */
6126 /* to true, we manage these buttons now so that they will be aligned */
6127 /* according to the 'ShowHiddenFiles' toggle button */
6128 XtManageChildren(fileMgrPopup.wsPopup, WS_BTNS);
6131 /* Adjust XmNadjustMargin such that the rest of the popup buttons will */
6132 /* NOT be forced to align with the 'ShowHiddenFiles' toggle button */
6133 XtSetArg(args[0], XmNadjustMargin, False);
6134 XtSetValues(fileMgrPopup.menu, args, 1);
6137 /* Create 'Properties' option - object popup */
6138 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 150, "Change Permissions...")));
6139 XtSetArg (args[0], XmNlabelString, label_string);
6140 mnemonic = ((char *)GETMESSAGE(20, 17, "P"));
6141 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6143 fileMgrPopup.objPopup[BTN_PROPERTIES] = popupBtns[i] =
6144 XmCreatePushButtonGadget (fileMgrPopup.menu, "permissions", args, 2);
6145 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6146 (XtCallbackProc)HelpRequestCB,
6147 HELP_POPUP_MENU_STR);
6149 XmStringFree (label_string);
6152 /* Create 'Put In Workspace' option -- object popup */
6153 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 84, "Put in Workspace")));
6154 XtSetArg (args[0], XmNlabelString, label_string);
6155 mnemonic = ((char *)GETMESSAGE(20, 85, "W"));
6156 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6158 fileMgrPopup.objPopup[BTN_PUTON] = popupBtns[i] =
6159 XmCreatePushButtonGadget (fileMgrPopup.menu, "putInWorkspace", args, 2);
6160 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6161 (XtCallbackProc)HelpRequestCB,
6162 HELP_POPUP_MENU_STR);
6164 XmStringFree (label_string);
6167 /* Create 'Delete To Trash' option -- object popup */
6168 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 151, "Put in Trash")));
6169 XtSetArg (args[0], XmNlabelString, label_string);
6170 mnemonic = ((char *)GETMESSAGE(20, 91, "T"));
6171 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6173 fileMgrPopup.objPopup[BTN_TRASH] = popupBtns[i] =
6174 XmCreatePushButtonGadget (fileMgrPopup.menu, "trash", args, 2);
6175 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6176 (XtCallbackProc)HelpRequestCB,
6177 HELP_POPUP_MENU_STR);
6179 XmStringFree (label_string);
6181 /* Create 'Help' option -- object popup */
6182 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 123, "Help")));
6183 XtSetArg (args[0], XmNlabelString, label_string);
6184 mnemonic = ((char *)GETMESSAGE(20, 102, "H"));
6185 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6187 fileMgrPopup.objPopup[BTN_HELP] = popupBtns[i] =
6188 XmCreatePushButtonGadget (fileMgrPopup.menu, "popupHelp", args, 2);
6189 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6190 (XtCallbackProc)HelpRequestCB,
6191 HELP_HELP_MENU_STR);
6193 XmStringFree (label_string);
6195 /* Create 'Restore' option -- trash popup */
6196 label_string = XmStringCreateLocalized ((GETMESSAGE(27, 24, "Put back")));
6197 XtSetArg (args[0], XmNlabelString, label_string);
6198 mnemonic = ((char *)GETMESSAGE(27, 26, "P"));
6199 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6200 fileMgrPopup.trash_objPopup[BTN_RESTORE] = popupBtns[i] =
6201 XmCreatePushButtonGadget (fileMgrPopup.menu, "putBack", args, 2);
6202 XtAddCallback(popupBtns[i++], XmNhelpCallback,
6203 (XtCallbackProc)HelpRequestCB,
6204 HELP_TRASH_DIALOG_STR);
6205 XmStringFree (label_string);
6208 /* Create 'Remove' option -- trash popup */
6209 label_string = XmStringCreateLocalized ((GETMESSAGE(27, 28, "Shred")));
6210 XtSetArg (args[0], XmNlabelString, label_string);
6211 mnemonic = ((char *)GETMESSAGE(27, 30, "h"));
6212 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6213 fileMgrPopup.trash_objPopup[BTN_REMOVE] = popupBtns[i] =
6214 XmCreatePushButtonGadget (fileMgrPopup.menu, "shred", args, 2);
6215 XtAddCallback(popupBtns[i++], XmNhelpCallback,
6216 (XtCallbackProc)HelpRequestCB,
6217 HELP_TRASH_DIALOG_STR);
6218 XmStringFree (label_string);
6221 /* Create separator -- white space popup and object popup */
6222 fileMgrPopup.action_separator = popupBtns[i++] =
6223 XmCreateSeparatorGadget(fileMgrPopup.menu, "sep2", NULL, 0);
6226 /* Manage popup buttons */
6227 XtManageChildren(popupBtns, i);
6232 /************************************************************************
6234 * DoTheMove - the user wishes to actually do the move even though its
6235 * not the desktop object that is actually getting moved.
6236 * This function calls the routines which do the moves. It
6237 * depends on the view type to determine how it does it.
6239 * DESKTOP - the drop happened on a Desktop object
6240 * and the object was a directory
6241 * NOT_DESKTOP_DIR - the drop happened on a directory
6242 * but it wasn't a directory on the desktop.
6243 * NOT_DESKTOP - drop happened in a FileManager view
6244 * and not on a directory.
6246 * if the type passed in is DESKTOP, then remove the corresponding
6249 ************************************************************************/
6258 char *file, *next, *end;
6259 char directory[MAX_PATH];
6260 Boolean result = True;
6262 file_count = global_file_count;
6263 file_set = global_file_set;
6264 host_set = global_host_set;
6270 RepositionIcons(fm, file_set, file_count, dx, dy, True);
6272 result = FileMoveCopy(fm,
6273 NULL, fm->current_directory, fm->host,
6274 host_set, file_set, file_count,
6275 (unsigned int)0, NULL, NULL);
6280 for(j = 0; j < file_count; j++)
6282 /* remove the Desktop object which corresponds to this move */
6283 for(i = 0; i < desktop_data->numIconsUsed; i++)
6286 DesktopRec *desktopWin;
6288 desktopWin = desktop_data->desktopWindows[i];
6289 if (strcmp(desktopWin->host, host_set[j]) != 0)
6292 fileName = (char *)XtMalloc(strlen(desktopWin->dir_linked_to)+
6293 strlen(desktopWin->file_name) + 3);
6294 sprintf( fileName, "%s/%s", desktopWin->dir_linked_to,
6295 desktopWin->file_name );
6297 * if fileName == file_set[j] then the file is on the
6298 * Desktop so change the dir_linked to reference. What the
6299 * new reference is depends on which view type is being
6302 if(strcmp(fileName, file_set[j]) == 0)
6306 Screen *currentScreen;
6308 char *workspace_name;
6310 screen = XDefaultScreen(XtDisplay(desktopWin->shell));
6312 XScreenOfDisplay(XtDisplay(desktopWin->shell), screen);
6313 rootWindow = RootWindowOfScreen(currentScreen);
6315 if(DtWsmGetCurrentWorkspace(XtDisplay(desktopWin->shell),
6316 rootWindow, &pCurrent) == Success)
6318 XGetAtomName (XtDisplay(desktopWin->shell), pCurrent);
6320 workspace_name = XtNewString("One");
6321 if (strcmp(workspace_name, desktopWin->workspace_name) == 0)
6323 RemoveDT (desktopWin->shell, (XtPointer) desktopWin,
6325 XtFree(workspace_name);
6326 workspace_name = NULL;
6329 XtFree(workspace_name);
6330 workspace_name = NULL;
6338 case NOT_DESKTOP_DIR:
6339 sprintf( directory, "%s/%s", dd->name, fv->file_data->file_name );
6341 result = FileMoveCopy (fm,
6342 NULL, directory, fm->host,
6343 host_set, file_set, file_count,
6344 (unsigned int) 0, NULL, NULL);
6351 DirectorySet * directory_data = (DirectorySet *)fv->directory_set;
6353 sprintf( directory, "%s/%s", directory_data->name,
6354 fv->file_data->file_name );
6356 result = FileMoveCopyDesktop (fv, directory, host_set, file_set,
6357 file_count, mod, dtWindow,
6363 _DtFreeDroppedFileInfo(file_count, file_set, host_set);
6371 Cardinal *num_params )
6373 XmDrawingAreaCallbackStruct cb ;
6374 FileMgrRec * fileMgrRec;
6376 Widget input_on_gadget ;
6378 if ((event->type == KeyPress)
6379 ||(event->type == KeyRelease))
6387 cb.reason = XmCR_INPUT ;
6390 if( *(params[0]) != '@' )
6393 sscanf( params[0], "%lx", &fileMgrRec );
6395 sscanf( params[0], "%p", (void **) &fileMgrRec );
6397 FileWindowInputCallback( wid, (XtPointer)fileMgrRec, (XtPointer)&cb );