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>
136 #include <Xm/Protocols.h>
138 #include <Dt/Action.h>
139 #include <Dt/DtP.h> /* required for DtDirPaths type */
140 #include <Dt/Connect.h> /* required for DtMakeConnect... */
141 #include <Dt/FileM.h>
142 #include <Dt/HourGlass.h>
143 #include <Dt/DtNlUtils.h>
145 #include <Dt/SharedProcs.h>
148 #include <Xm/DragIcon.h>
149 #include <Xm/DragC.h>
155 #include "SharedProcs.h"
163 #include "ChangeDir.h"
166 #include "SharedMsgs.h"
167 #include "IconicPath.h"
168 #include "DtSvcInternal.h"
171 /* Dialog classes installed by Main.c */
173 extern int file_mgr_dialog;
174 extern int change_dir_dialog;
175 extern int preferences_dialog;
176 extern int filter_dialog;
177 extern int find_dialog;
178 extern int mod_attr_dialog;
180 extern int ReadInFiletypes(
181 FilterData *filter_data) ;
183 /* global varibles used within this function when we have to
184 * put up a _DtMessage dialog
186 static int global_file_count;
187 static char **global_file_set;
188 static char **global_host_set;
189 static FileMgrData *fm;
190 static int view_type;
191 static FileViewData *fv;
192 static DesktopRec *dtWindow;
193 static unsigned int mod;
194 static DirectorySet *dd;
195 static Pixmap change_view_pixmap = XmUNSPECIFIED_PIXMAP;
197 /* Global variables used in Command.c, FileMgr.c and FileOp.c */
198 int G_dropx, G_dropy;
200 /******** Static Function Declarations ********/
202 static XmFontListEntry FontListDefaultEntry(
203 XmFontList font_list) ;
207 Widget *return_widget,
209 static XtPointer GetDefaultValues( void ) ;
210 static XtPointer GetResourceValues(
211 XrmDatabase data_base,
213 static void SetValues(
214 FileMgrRec *file_mgr_rec,
215 FileMgrData *file_mgr_data) ;
216 static void WriteResourceValues(
220 static void FreeValues(
221 FileMgrData *file_mgr_data) ;
223 XtPointer recordPtr) ;
224 static void GetSessionDir(
225 FileMgrData *file_mgr_data) ;
226 static void BranchListToString(
230 static void SelectionListToString(
232 FileViewData ***value,
234 static Boolean StringToBranchList(
240 XtPointer *converter_data );
241 static void StringToSelectionList(
246 static void GetFileData(
247 FileMgrData *file_mgr_data,
249 char ** branch_list) ;
250 static FileViewData * GetTopInfo(
251 FileMgrData *file_mgr_data,
253 char *directory_name,
254 char **branch_list) ;
255 static void CountDirectories(
258 static DirectorySet * NewDirectorySet(
261 FileMgrData *file_mgr_data) ;
262 static void MakeDirectorySets(
263 FileMgrData *file_mgr_data,
265 DirectorySet **directory_set,
267 static void ReadTreeDirectory(
270 char *directory_name,
271 FileMgrData *file_mgr_data,
273 DirectorySet ***directory_set,
274 int *directory_count) ;
275 static Bool IsShown( FileMgrData *fmd,
277 static void SetDisplayedRecur(
281 static void SelectVisible (
282 FileMgrData *file_mgr_data) ;
283 static void FreeDirectorySet(
284 DirectorySet ** directory_set,
285 int directory_count) ;
286 static void FreeDirectoryData(
287 FileMgrData *file_mgr_data) ;
288 static void SystemClose(
291 static void SetIconAttributes(
292 FileMgrRec *file_mgr_rec,
293 FileMgrData *file_mgr_data,
294 char *directory_name) ;
295 static void SetFocus (
296 FileMgrRec * file_mgr_rec,
297 FileMgrData * file_mgr_data) ;
298 static void MoveOkCB(
300 XtPointer client_data,
301 XtPointer call_data ) ;
302 static void MoveCancelCB(
304 XtPointer client_data,
305 XtPointer call_data ) ;
306 static void CreateFmPopup (
308 static void DoTheMove(
314 Cardinal *num_params );
315 static void ActivateClist(
319 Cardinal *num_params );
321 /******** End Static Function Declarations ********/
324 #define TREE_DASH_WIDTH 1
326 /* Resource read and write function */
328 static char * FILEMGR = "FileMgr";
331 /* Action for osfMenu */
332 static XtActionsRec FMAction[] =
333 { { "FMInput", FMInput},
334 { "ActivateClist", ActivateClist}
338 /* The resources set for the FileMgr dialog */
340 static DialogResource resources[] =
342 { "show_type", SHOW_TYPE, sizeof(unsigned char),
343 XtOffset(FileMgrDataPtr, show_type),
344 (XtPointer) SINGLE_DIRECTORY, ShowTypeToString },
346 { "tree_files", TREE_FILES, sizeof(unsigned char),
347 XtOffset(FileMgrDataPtr, tree_files),
348 (XtPointer) TREE_FILES_NEVER, TreeFilesToString },
350 { "view_single", VIEW, sizeof(unsigned char),
351 XtOffset(FileMgrDataPtr, view_single),
352 (XtPointer) BY_NAME_AND_ICON, ViewToString },
354 { "view_tree", VIEW, sizeof(unsigned char),
355 XtOffset(FileMgrDataPtr, view_tree),
356 (XtPointer) BY_NAME_AND_SMALL_ICON, ViewToString },
358 { "order", ORDER, sizeof(unsigned char),
359 XtOffset(FileMgrDataPtr, order),
360 (XtPointer) ORDER_BY_ALPHABETICAL, OrderToString },
362 { "direction", DIRECTION_RESRC, sizeof(unsigned char),
363 XtOffset(FileMgrDataPtr, direction),
364 (XtPointer) DIRECTION_ASCENDING, DirectionToString },
366 { "positionEnabled", RANDOM, sizeof(unsigned char),
367 XtOffset(FileMgrDataPtr, positionEnabled),
368 (XtPointer) RANDOM_OFF, RandomToString },
370 { "host", XmRString, sizeof(String),
371 XtOffset(FileMgrDataPtr, host), (XtPointer) NULL, _DtStringToString },
373 { "current_directory", XmRString, sizeof(String),
374 XtOffset(FileMgrDataPtr, current_directory),
375 (XtPointer) "~", _DtStringToString },
377 { "branch_list", BRANCH_LIST, sizeof(XtPointer),
378 XtOffset(FileMgrDataPtr, branch_list),
379 (XtPointer) NULL, BranchListToString },
381 { "restricted_directory", XmRString, sizeof(String),
382 XtOffset(FileMgrDataPtr, restricted_directory),
383 (XtPointer) NULL, _DtStringToString },
385 { "title", XmRString, sizeof(String),
386 XtOffset(FileMgrDataPtr, title),
387 (XtPointer) NULL, _DtStringToString },
389 { "helpVol", XmRString, sizeof(String),
390 XtOffset(FileMgrDataPtr, helpVol),
391 (XtPointer) NULL, _DtStringToString },
393 { "selection_list", SELECTION_LIST, sizeof(XtPointer),
394 XtOffset(FileMgrDataPtr, selection_list),
395 (XtPointer) NULL, SelectionListToString },
397 { "show_iconic_path", XmRBoolean, sizeof(Boolean),
398 XtOffset(FileMgrDataPtr, show_iconic_path),
399 (XtPointer) True, _DtBooleanToString },
401 { "show_current_directory", XmRBoolean, sizeof(Boolean),
402 XtOffset(FileMgrDataPtr, show_current_dir),
403 (XtPointer) False, _DtBooleanToString },
405 { "show_status_line", XmRBoolean, sizeof(Boolean),
406 XtOffset(FileMgrDataPtr, show_status_line),
407 (XtPointer) True, _DtBooleanToString },
409 { "fast_cd_enabled", XmRBoolean, sizeof(Boolean),
410 XtOffset(FileMgrDataPtr, fast_cd_enabled),
411 (XtPointer) False, _DtBooleanToString },
413 { "toolbox", XmRBoolean, sizeof(Boolean),
414 XtOffset(FileMgrDataPtr, toolbox),
415 (XtPointer) False, _DtBooleanToString },
417 { "show_hid_enabled", XmRBoolean, sizeof(Boolean),
418 XtOffset(FileMgrDataPtr, show_hid_enabled),
419 (XtPointer) False, _DtBooleanToString },
421 { "secondaryHelpDialogCount", XmRInt, sizeof(int),
422 XtOffset(FileMgrDataPtr, secondaryHelpDialogCount),
423 (XtPointer) 0, _DtIntToString },
425 { "attr_dialog_count", XmRInt, sizeof(int),
426 XtOffset(FileMgrDataPtr, attr_dialog_count),
427 (XtPointer) 0, _DtIntToString },
429 { "trashcan", XmRBoolean, sizeof(Boolean),
430 XtOffset(FileMgrDataPtr, IsTrashCan),
431 (XtPointer) False, _DtBooleanToString },
436 * The Dialog Class structure.
439 static DialogClass fileMgrClassRec =
444 (DialogInstallChangeProc) NULL,
445 (DialogInstallCloseProc) NULL,
447 (DialogGetValuesProc) NULL,
450 (DialogSetValuesProc) SetValues,
452 (DialogFreeValuesProc) FreeValues,
454 (DialogSetFocusProc) SetFocus,
457 DialogClass * fileMgrClass = (DialogClass *) &fileMgrClassRec;
459 #ifdef _CHECK_FOR_SPACES
460 char translations_sp_esc[] = "<Key>space:Space()\n\
461 <Key>osfCancel:EscapeFM()";
462 char translations_space[] = "<Key>space:Space()";
464 char translations_sp_esc[] = "Ctrl<Key>space:Space()\n\
465 <Key>osfCancel:EscapeFM()";
466 char translations_space[] = "Ctrl<Key>space:Space()";
468 char translations_escape[] = "<Key>osfCancel:EscapeFM()";
470 #define DOUBLE_CLICK_DRAG
471 #ifndef DOUBLE_CLICK_DRAG
472 char translations_da[] = "\
473 <Key>osfCancel:DrawingAreaInput() ManagerGadgetSelect()\n\
474 <Key>plus:DrawingAreaInput() ManagerGadgetSelect()\n\
475 <Key>minus:DrawingAreaInput() ManagerGadgetSelect()\n\
476 <Btn2Down>:DrawingAreaInput() ManagerGadgetArm()\n\
477 <Btn2Down>,<Btn2Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
478 <Btn2Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
479 <Btn2Down>(2+):DrawingAreaInput() ManagerGadgetMultiArm()\n\
480 <Btn2Up>(2+):DrawingAreaInput() ManagerGadgetMultiActivate()";
484 extern _XmConst char _XmDrawingA_traversalTranslations[];
486 char translations_da[] = "\
487 <BtnMotion>:ManagerGadgetButtonMotion()\n\
488 <Btn1Down>:DrawingAreaInput() ManagerGadgetArm()\n\
489 <Btn1Down>,<Btn1Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
490 <Btn1Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
491 <Btn1Down>(2+):DrawingAreaInput() ManagerGadgetMultiArm() \
492 ManagerGadgetMultiActivate()\n\
493 <Btn2Down>:DrawingAreaInput() ManagerGadgetArm()\n\
494 <Btn2Down>,<Btn2Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
495 <Btn2Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
496 <BtnDown>:DrawingAreaInput()\n\
497 <BtnUp>:DrawingAreaInput()\n\
498 :<Key>osfActivate:DrawingAreaInput() ManagerParentActivate()\n\
499 :<Key>osfCancel:DrawingAreaInput() ManagerGadgetSelect()\n\
500 :<Key>osfHelp:DrawingAreaInput() ManagerGadgetHelp()\n\
501 :<Key>osfSelect:DrawingAreaInput() ManagerGadgetSelect()\n\
502 :<Key>osfDelete:DrawingAreaInput() ManagerGadgetSelect()\n\
503 :<Key>osfMenu:FMInput(@)\n\
504 :<Key>osfEndLine:FMInput(@)\n\
505 <Key>osfBeginLine:FMInput(@)\n\
506 :<Key>osfPageDown:FMInput(@)\n\
507 :<Key>osfPageUp:FMInput(@)\n\
508 :<Key>F1:DrawingAreaInput() ManagerGadgetHelp()\n\
509 s c a <Key>c: ActivateClist(@)\n\
510 ~s ~m ~a <Key>Return:DrawingAreaInput() ManagerParentActivate()\n\
511 <Key>Return:DrawingAreaInput() ManagerGadgetSelect()\n\
512 <Key>space:DrawingAreaInput() ManagerGadgetSelect()\n\
513 :<Key>plus:DrawingAreaInput() ManagerGadgetSelect()\n\
514 :<Key>minus:DrawingAreaInput() ManagerGadgetSelect()\n\
515 <KeyDown>:DrawingAreaInput() ManagerGadgetKeyInput()\n\
516 <KeyUp>:DrawingAreaInput()";
517 #endif /* DOUBLE_CLICK_DRAG */
519 /************************************************************************
521 * FontListDefaultEntry
523 * Return the first entry in the font list with the tag
524 * XmFONTLIST_DEFAULT_TAG. If there isn't one, just return the
525 * first entry in the font list.
527 ************************************************************************/
529 static XmFontListEntry
530 FontListDefaultEntry(XmFontList font_list)
532 XmFontContext context;
533 XmFontListEntry first_entry, entry;
536 if (!XmFontListInitFontContext(&context, font_list))
539 entry = first_entry = XmFontListNextEntry(context);
541 tag = XmFontListEntryGetTag(entry);
542 if (!strcmp(XmFONTLIST_DEFAULT_TAG, tag)) {
548 entry = XmFontListNextEntry(context);
551 XmFontListFreeFontContext(context);
553 return entry ? entry : first_entry;
556 /************************************************************************
560 ************************************************************************/
566 Widget *return_widget,
569 static Boolean first = True;
570 FileMgrRec * file_mgr_rec;
575 Widget header_separator;
576 Widget iconic_path_da;
577 Widget current_directory_frame;
578 Widget current_directory_drop;
579 Widget current_directory_icon;
580 Widget directory_list_form;
583 Widget status_separator;
593 XmFontList font_list;
594 XtPointer entry_font;
596 XFontSetExtents *extents;
603 int icon_offset, cur_dir_offset;
604 Dimension shadow_thickness;
605 Dimension highlight_thickness;
606 XtTranslations trans_table, trans_table1;
609 /* Allocate the change directory dialog instance record. */
611 file_mgr_rec = (FileMgrRec *) XtMalloc (sizeof (FileMgrRec));
612 file_mgr_rec->action_pane_file_type = NULL;
614 /* set up translations in main edit widget */
615 trans_table = XtParseTranslationTable(translations_sp_esc);
617 char * resolvedTranslationString;
619 resolvedTranslationString = ResolveTranslationString( translations_da,
620 (char *)file_mgr_rec );
621 trans_table1 = XtParseTranslationTable( resolvedTranslationString );
622 XtFree( resolvedTranslationString );
623 resolvedTranslationString = NULL;
626 /* Create the shell and main window used for the view. */
628 XtSetArg (args[0], XmNallowShellResize, True);
629 if(!first && (special_view == True && special_title != NULL && !TrashView))
631 file_mgr_rec->shell = shell =
632 XtAppCreateShell (special_title, DTFILE_CLASS_NAME,
633 applicationShellWidgetClass, display, args, 1);
634 XtFree(special_title);
635 special_title = NULL;
638 file_mgr_rec->shell = shell =
639 XtAppCreateShell (application_name, DTFILE_CLASS_NAME,
640 applicationShellWidgetClass, display, args, 1);
642 special_view = False;
645 XtSetArg (args[n], XmNdeleteResponse, XmUNMAP); n++;
647 if (first == False || TrashView)
649 XtSetArg (args[n], XmNgeometry, NULL); n++;
654 /* Set the useAsyncGeo on the shell */
655 XtSetArg (args[n], XmNuseAsyncGeometry, True); n++;
656 XtSetValues (shell, args, n);
658 delete_window = XmInternAtom (XtDisplay (shell), "WM_DELETE_WINDOW", False);
659 XmAddWMProtocolCallback (shell, delete_window, (XtCallbackProc)SystemClose,
660 (XtPointer)file_mgr_rec);
662 file_mgr_rec->main = mainWidget = XmCreateMainWindow (shell, "main", args, 1);
663 XtManageChild (mainWidget);
664 XtAddCallback(mainWidget, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
665 HELP_FILE_MANAGER_VIEW_STR);
668 /* Get the select color */
670 XtSetArg (args[0], XmNbackground, &background);
671 XtSetArg (args[1], XmNcolormap, &colormap);
672 XtGetValues (mainWidget, args, 2);
674 XmGetColors (XtScreen (mainWidget), colormap, background,
675 &foreground, &top_shadow, &bottom_shadow, &select);
677 /* Create the menu. */
682 file_mgr_rec->menuStates = 0;
683 file_mgr_rec->menu = menu = CreateTrashMenu (mainWidget, file_mgr_rec);
687 file_mgr_rec->menuStates = (RENAME | MOVE | DUPLICATE | LINK | TRASH |
688 MODIFY | CHANGEDIR | PREFERENCES | FILTER |
689 FIND | CREATE_DIR | CREATE_FILE | SETTINGS |
691 HOME | CHANGE_DIR | TERMINAL);
693 file_mgr_rec->menu = menu = CreateMenu (mainWidget, file_mgr_rec);
696 /* Create the work area frame. */
698 XtSetArg (args[0], XmNshadowThickness, 1);
699 XtSetArg (args[1], XmNshadowType, XmSHADOW_OUT);
700 XtSetArg (args[2], XmNmarginWidth, 5);
701 XtSetArg (args[3], XmNmarginHeight, 5);
702 work_frame = XmCreateFrame (mainWidget, "work_frame", args, 4);
703 XtManageChild (work_frame);
706 /* Create the current directory frame. */
709 XtSetArg (args[n], XmNshadowThickness, 1); n++;
710 XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
711 XtSetArg (args[n], XmNmarginWidth, 1); n++;
712 XtSetArg (args[n], XmNmarginHeight, 1); n++;
713 XtSetArg (args[n], XmNtextTranslations, trans_table); n++;
714 file_mgr_rec->header_frame = header_frame =
715 XmCreateForm (mainWidget, "header_frame", args, n);
717 XtAddCallback(header_frame, XmNhelpCallback,
718 (XtCallbackProc)HelpRequestCB,
719 HELP_FILE_MANAGER_VIEW_STR);
721 /* Create the current directory line only if not in showFilesystem. */
722 if (showFilesystem && !TrashView)
724 /* Create the iconic path */
726 XtSetArg (args[n], DtNfileMgrRec, file_mgr_rec); n++;
727 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
728 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
729 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
730 file_mgr_rec->iconic_path_da = iconic_path_da =
731 _DtCreateIconicPath(header_frame, "iconic_path", args, n);
732 XtManageChild (iconic_path_da);
733 file_mgr_rec->iconic_path_width = 0;
735 /* Create the separator between iconic path and current directory */
737 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
738 XtSetArg (args[n], XmNtopWidget, iconic_path_da); n++;
739 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
740 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
741 file_mgr_rec->header_separator = header_separator =
742 XmCreateSeparatorGadget(header_frame, "header_separator", args, n);
743 XtManageChild (header_separator);
745 /* Create a form for the current directory */
747 XtSetArg (args[n], XmNtextTranslations, trans_table); n++;
748 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
749 XtSetArg (args[n], XmNtopWidget, header_separator); n++;
750 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
751 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
752 file_mgr_rec->current_directory_frame = current_directory_frame =
753 XmCreateForm (header_frame, "current_directory_frame", args, n);
754 XtManageChild (file_mgr_rec->current_directory_frame);
756 /* Event handler for detecting drag threshold surpassed */
757 XtAddEventHandler(current_directory_frame,
758 Button1MotionMask|Button2MotionMask,
759 False, (XtEventHandler)CurrentDirectoryIconMotion,
762 /* Create the change directory drop zone. */
765 if (change_view_pixmap == XmUNSPECIFIED_PIXMAP)
768 _DtGetPixmap(XtScreen(current_directory_frame),
769 CHANGE_VIEW_ICON_S, foreground, background);
772 XtSetArg (args[n], XmNstring, NULL); n++;
773 XtSetArg (args[n], XmNshadowThickness, 2); n++;
774 XtSetArg (args[n], XmNfillOnArm, False); n++;
775 XtSetArg (args[n], XmNhighlightThickness, 0); n++;
776 XtSetArg (args[n], XmNpixmap, change_view_pixmap); n++;
777 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
778 XtSetArg (args[n], XmNtopOffset, 2); n++;
779 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
780 XtSetArg (args[n], XmNleftOffset, 5); n++;
781 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
782 XtSetArg (args[n], XmNbottomOffset, 2); n++;
783 XtSetArg (args[n], XmNtraversalOn, False); n++;
784 XtSetArg (args[n], XmNdropSiteOperations,
785 XmDROP_MOVE | XmDROP_COPY | XmDROP_LINK); n++;
786 file_mgr_rec->current_directory_drop = current_directory_drop =
787 _DtCreateIcon (current_directory_frame, "drop_cd", args, n);
789 XtAddCallback (current_directory_drop, XmNdropCallback,
790 DropOnChangeView, (XtPointer) file_mgr_rec);
793 file_mgr_rec->current_directory_drop = current_directory_drop = NULL;
795 /* Create the current directory icon. */
797 XtSetArg (args[n], XmNstring, NULL); n++;
798 XtSetArg (args[n], XmNimageName, SMALL_DIRECTORY_ICON); n++;
799 XtSetArg (args[n], XmNshadowThickness, 0); n++;
800 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
803 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
804 XtSetArg (args[n], XmNleftWidget, current_directory_drop); n++;
805 XtSetArg (args[n], XmNleftOffset, 0); n++;
809 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
810 XtSetArg (args[n], XmNleftOffset, 5); n++;
812 XtSetArg (args[n], XmNtraversalOn, False); n++;
813 file_mgr_rec->current_directory_icon = current_directory_icon =
814 _DtCreateIcon (current_directory_frame, "current_directory_icon",
817 /* Create the current directory line */
819 XtSetArg (args[n], XmNshadowThickness, 0); n++;
820 XtSetArg (args[n], XmNmarginWidth, 0); n++;
821 XtSetArg (args[n], XmNmarginHeight, 0); n++;
822 XtSetArg (args[n], XmNpushButtonEnabled, False); n++;
823 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
824 XtSetArg (args[n], XmNtopOffset, 1); n++;
825 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
826 XtSetArg (args[n], XmNleftOffset, 5); n++;
827 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
828 XtSetArg (args[n], XmNrightOffset, 1); n++;
829 XtSetArg (args[n], XmNtraversalOn, True); n++;
830 file_mgr_rec->current_directory =
831 XmCreateDrawnButton(current_directory_frame, "current_directory",
833 XtManageChild (file_mgr_rec->current_directory);
836 /* Create overlay text field, for typing in a new directory */
838 XtSetArg (args[n], XmNmarginHeight, 0); n++;
839 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
840 XtSetArg (args[n], XmNtopOffset, 1); n++;
841 XtSetArg (args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET);n++;
842 XtSetArg (args[n], XmNleftWidget,
843 file_mgr_rec->current_directory); n++;
844 XtSetArg (args[n], XmNleftOffset, 0); n++;
845 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET);n++;
846 XtSetArg (args[n], XmNbottomWidget,
847 file_mgr_rec->current_directory); n++;
848 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
849 XtSetArg (args[n], XmNrightOffset, 1); n++;
850 XtSetArg (args[n], XmNtraversalOn, True); n++;
851 file_mgr_rec->current_directory_text = XmCreateTextField(
852 current_directory_frame, FAST_RENAME, args, n);
855 * Make sure the font & highlight thickness of the text field is the
856 * same as the corresponding values for the current directory line.
858 XtSetArg (args[0], XmNhighlightThickness, &highlight_thickness);
859 XtSetArg (args[1], XmNfontList, &font_list);
860 XtGetValues (file_mgr_rec->current_directory, args, 2);
862 XtSetArg (args[0], XmNhighlightThickness, highlight_thickness);
863 XtSetArg (args[1], XmNfontList, font_list);
864 XtSetValues (file_mgr_rec->current_directory_text, args, 2);
867 * Calculate how high to make the current directory line by adding
868 * up the font height and the highlight and shadow thickness
870 XtSetArg (args[0], XmNshadowThickness, &shadow_thickness);
871 XtGetValues (file_mgr_rec->current_directory_text, args, 1);
873 entry_font = XmFontListEntryGetFont(FontListDefaultEntry(font_list), &type);
874 if(type == XmFONT_IS_FONTSET) {
875 extents = XExtentsOfFontSet((XFontSet)entry_font);
876 font_height = extents->max_logical_extent.height;
879 font_height = ((XFontStruct *)entry_font)->ascent +
880 ((XFontStruct *)entry_font)->descent;
882 curdir_height = font_height + 2*(highlight_thickness + shadow_thickness);
884 XtSetArg (args[0], XmNtopOffset, &cur_dir_offset);
885 XtGetValues (file_mgr_rec->current_directory, args, 1);
887 XtSetArg (args[0], XmNheight, curdir_height);
888 XtSetValues (file_mgr_rec->current_directory, args, 1);
890 XtSetArg (args[0], XmNheight, curdir_height + 2*cur_dir_offset);
891 XtSetValues (file_mgr_rec->current_directory_frame, args, 1);
893 XtAddCallback(file_mgr_rec->current_directory_text, XmNactivateCallback,
894 (XtCallbackProc)ChangeToNewDir, file_mgr_rec);
895 XtAddCallback(file_mgr_rec->current_directory_text, XmNhelpCallback,
896 (XtCallbackProc)HelpRequestCB,
897 HELP_FILE_MANAGER_VIEW_STR);
899 /* This code is here so the Text Path (used to be Fast Change Dir
900 text) will be checked if user is ever try to type on the portion
901 before his restricted path.
902 It's no longer needed because, there won't be anything since
903 I'm tryting to treat restrictMode the same way I treat restricted
904 directory (i.e. dtfile -restricted).
905 Why I want to treat them the same way? Because they are the
906 same sort of things and it, also, solves the iconic path problem.
907 Note that user can double click on one of the icon and to a directory
908 above the restricted directory.
912 /* add the callbacks to make sure the user isn't able to
913 go anywhere above their restricted directory */
914 XtAddCallback (file_mgr_rec->current_directory_text,
915 XmNmodifyVerifyCallback, (XtCallbackProc)TextChange,
917 XtAddCallback (file_mgr_rec->current_directory_text,
918 XmNmotionVerifyCallback, (XtCallbackProc)TextChange,
924 /* create the status line */
926 XtSetArg (args[n], XmNshadowThickness, 1); n++;
927 XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
928 XtSetArg (args[n], XmNmarginWidth, 5); n++;
929 XtSetArg (args[n], XmNmarginHeight, 1); n++;
930 status_form = XmCreateForm (mainWidget, "status_form", args, n);
931 XtManageChild (status_form);
934 XtSetArg (args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
935 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
936 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
937 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
938 file_mgr_rec->status_line =
939 XmCreateLabelGadget (status_form, "status_line", args, n);
940 XtManageChild (file_mgr_rec->status_line);
942 /* Associate the menu and frames with the appropriate */
943 /* areas of the main windows. */
945 XmMainWindowSetAreas (mainWidget, menu, file_mgr_rec->header_frame,
946 NULL, NULL, work_frame);
947 XtSetArg (args[0], XmNmessageWindow, status_form);
948 XtSetValues(mainWidget, args, 1);
950 /* Create the Scrolled Window for the file display area and */
951 /* set the scrollbars colors correctly. */
954 XtSetArg (args[n], XmNspacing, 2); n++;
955 XtSetArg (args[n], XmNscrollingPolicy, XmAUTOMATIC); n++;
956 XtSetArg (args[n], XmNscrollBarDisplayPolicy, XmAS_NEEDED); n++;
957 file_mgr_rec->scroll_window =
958 XmCreateScrolledWindow (work_frame, "scroll_window", args, n);
959 XtManageChild (file_mgr_rec->scroll_window);
961 XtAddCallback(file_mgr_rec->scroll_window, XmNhelpCallback,
962 (XtCallbackProc)HelpRequestCB,
963 HELP_TRASH_OVERVIEW_TOPIC_STR);
965 XtAddCallback(file_mgr_rec->scroll_window, XmNhelpCallback,
966 (XtCallbackProc)HelpRequestCB,
967 HELP_FILE_MANAGER_VIEW_STR);
969 /* Get the 2 scrollbars and reset their foreground to the proper color */
970 /* Also turn their traversal off and set the highlight thickness to 0. */
972 XtSetArg (args[0], XmNhorizontalScrollBar, &(file_mgr_rec->horizontal_scroll_bar));
973 XtSetArg (args[1], XmNverticalScrollBar, &(file_mgr_rec->vertical_scroll_bar));
974 XtGetValues (file_mgr_rec->scroll_window, args, 2);
976 XtSetArg (args[0], XmNforeground, background);
977 XtSetArg (args[1], XmNtraversalOn, True);
978 XtSetValues (file_mgr_rec->horizontal_scroll_bar, args, 2);
979 XtSetValues (file_mgr_rec->vertical_scroll_bar, args, 2);
982 /* Add an event handler to catch resizes occuring on the scrolled */
983 /* window, in order to force a relayout of the icons. */
985 XtAddEventHandler (file_mgr_rec->scroll_window, StructureNotifyMask,
986 False, (XtEventHandler)FileWindowResizeCallback,
988 XtAddEventHandler (shell, StructureNotifyMask,
989 False, (XtEventHandler)FileWindowMapCallback,
993 /* Create a drawing area as a child of the scrolled window */
996 XtSetArg (args[n], XmNmarginWidth, 0); n++;
997 XtSetArg (args[n], XmNmarginHeight, 0); n++;
998 XtSetArg (args[n], XmNresizePolicy, XmRESIZE_GROW); n++;
999 file_mgr_rec->file_window =
1000 XmCreateDrawingArea (file_mgr_rec->scroll_window, "file_window", args, n);
1001 XtAppAddActions( XtWidgetToApplicationContext(file_mgr_rec->file_window),
1003 XtNumber(FMAction));
1004 XtManageChild (file_mgr_rec->file_window);
1006 XtManageChild (file_mgr_rec->header_frame);
1008 XtSetArg (args[0], XmNbackground, select);
1009 XtSetValues (file_mgr_rec->file_window, args, 1);
1011 XtSetArg (args[0], XmNbackground, select);
1012 XtSetValues (XtParent (file_mgr_rec->file_window), args, 1);
1014 if(fileMgrPopup.menu == NULL)
1015 CreateFmPopup(file_mgr_rec->file_window);
1017 XmAddToPostFromList(fileMgrPopup.menu, file_mgr_rec->file_window);
1019 /* set up translations in main edit widget */
1020 #ifdef DOUBLE_CLICK_DRAG
1021 XtUninstallTranslations(file_mgr_rec->file_window);
1022 XtOverrideTranslations(file_mgr_rec->file_window,
1024 ((XmManagerClassRec *)XtClass(file_mgr_rec->file_window))
1025 ->manager_class.translations);
1026 XtOverrideTranslations(file_mgr_rec->file_window, trans_table1);
1027 XtOverrideTranslations(file_mgr_rec->file_window,
1028 XtParseTranslationTable(_XmDrawingA_traversalTranslations));
1030 XtOverrideTranslations(file_mgr_rec->file_window, trans_table1);
1033 /* Add the callbacks for processing selections, exposures, */
1034 /* and geometry changes of the drawing area. */
1036 XtAddCallback (file_mgr_rec->file_window, XmNexposeCallback,
1037 FileWindowExposeCallback, file_mgr_rec);
1039 XtAddCallback (file_mgr_rec->file_window, XmNinputCallback,
1040 FileWindowInputCallback, file_mgr_rec);
1042 /* Event handler for detecting drag threshold surpassed */
1043 XtAddEventHandler(file_mgr_rec->file_window,
1044 Button1MotionMask|Button2MotionMask,
1045 False, (XtEventHandler)FileIconMotion,
1048 /* Arrange for initial focus to be inside the file window */
1049 file_mgr_rec->focus_widget = file_mgr_rec->file_window;
1051 /* Set the return values for the dialog widget and dialog instance. */
1053 *return_widget = (Widget) mainWidget;
1054 *dialog = (XtPointer) file_mgr_rec;
1058 /************************************************************************
1062 ************************************************************************/
1065 GetDefaultValues( void )
1067 FileMgrData * file_mgr_data;
1068 PreferencesData *preferences_data;
1069 unsigned char *viewP;
1072 /* Allocate and initialize the default change dir dialog data. */
1074 file_mgr_data = (FileMgrData *) XtMalloc (sizeof (FileMgrData));
1076 file_mgr_data->displayed = False;
1077 file_mgr_data->mapped = False;
1078 file_mgr_data->x = 0;
1079 file_mgr_data->y = 0;
1081 file_mgr_data->busy_status = not_busy;
1082 file_mgr_data->busy_detail = 0;
1084 file_mgr_data->num_objects = 0;
1085 file_mgr_data->object_positions = NULL;
1086 file_mgr_data->grid_height = 0;
1087 file_mgr_data->grid_width = 0;
1088 file_mgr_data->layout_data = NULL;
1090 file_mgr_data->special_msg = NULL;
1091 file_mgr_data->msg_timer_id = 0;
1093 file_mgr_data->show_type = SINGLE_DIRECTORY;
1094 file_mgr_data->tree_files = TREE_FILES_NEVER;
1095 file_mgr_data->view_single = BY_NAME_AND_ICON;
1096 file_mgr_data->view_tree = BY_NAME_AND_SMALL_ICON;
1097 file_mgr_data->tree_preread_level = 1;
1098 file_mgr_data->tree_show_level = 1;
1099 file_mgr_data->show_iconic_path = True;
1100 file_mgr_data->show_current_dir = True;
1101 file_mgr_data->show_status_line = True;
1103 file_mgr_data->scrollToThisFile = NULL;
1104 file_mgr_data->scrollToThisDirectory = NULL;
1106 file_mgr_data->renaming = NULL;
1108 if(special_view && !TrashView)
1110 if(special_title != NULL)
1112 file_mgr_data->title = XtNewString(special_title);
1115 file_mgr_data->title = NULL;
1117 if(special_helpVol != NULL)
1119 file_mgr_data->helpVol = XtNewString(special_helpVol);
1120 XtFree(special_helpVol);
1121 special_helpVol = NULL;
1124 file_mgr_data->helpVol = XtNewString(fileMgrHelpVol);
1126 if(special_restricted != NULL)
1127 file_mgr_data->restricted_directory = special_restricted;
1129 file_mgr_data->restricted_directory = NULL;
1131 if(special_treeType == UNSET_VALUE)
1132 file_mgr_data->show_type = SINGLE_DIRECTORY;
1134 file_mgr_data->show_type = special_treeType;
1136 if(special_treeFiles == UNSET_VALUE)
1137 file_mgr_data->tree_files = TREE_FILES_NEVER;
1139 file_mgr_data->tree_files = special_treeFiles;
1141 if(file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1142 viewP = &file_mgr_data->view_tree;
1144 viewP = &file_mgr_data->view_single;
1145 if(special_viewType == UNSET_VALUE)
1146 file_mgr_data->view = *viewP;
1148 file_mgr_data->view = *viewP = special_viewType;
1150 if(special_orderType == UNSET_VALUE)
1151 file_mgr_data->order = ORDER_BY_ALPHABETICAL;
1153 file_mgr_data->order = special_orderType;
1155 if(special_directionType == UNSET_VALUE)
1156 file_mgr_data->direction = DIRECTION_ASCENDING;
1158 file_mgr_data->direction = special_directionType;
1160 if(special_randomType == UNSET_VALUE)
1161 file_mgr_data->positionEnabled = RANDOM_OFF;
1163 file_mgr_data->positionEnabled = special_randomType;
1168 if(fileMgrTitle == NULL)
1169 file_mgr_data->title = NULL;
1171 file_mgr_data->title = XtNewString(fileMgrTitle);
1173 file_mgr_data->helpVol = XtNewString(fileMgrHelpVol);
1175 if(treeType == UNSET_VALUE || TrashView)
1176 file_mgr_data->show_type = SINGLE_DIRECTORY;
1178 file_mgr_data->show_type = treeType;
1180 if(treeFiles == UNSET_VALUE)
1181 file_mgr_data->tree_files = TREE_FILES_NEVER;
1183 file_mgr_data->tree_files = treeFiles;
1185 if(file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1186 viewP = &file_mgr_data->view_tree;
1188 viewP = &file_mgr_data->view_single;
1189 if(viewType == UNSET_VALUE)
1190 file_mgr_data->view = *viewP;
1192 file_mgr_data->view = *viewP = viewType;
1194 if(orderType == UNSET_VALUE)
1195 file_mgr_data->order = ORDER_BY_ALPHABETICAL;
1197 file_mgr_data->order = orderType;
1199 if(directionType == UNSET_VALUE)
1200 file_mgr_data->direction = DIRECTION_ASCENDING;
1202 file_mgr_data->direction = directionType;
1204 if(randomType == UNSET_VALUE)
1205 file_mgr_data->positionEnabled = RANDOM_OFF;
1207 file_mgr_data->positionEnabled = randomType;
1209 file_mgr_data->restricted_directory = NULL;
1212 file_mgr_data->restoreKind = NORMAL_RESTORE;
1214 file_mgr_data->host = NULL;
1215 file_mgr_data->current_directory = NULL;
1216 file_mgr_data->branch_list = NULL;
1218 file_mgr_data->toolbox = False;
1219 file_mgr_data->dropSite = False;
1221 file_mgr_data->newSize = True;
1223 file_mgr_data->directory_count = 0;
1224 file_mgr_data->directory_set = NULL;
1225 file_mgr_data->tree_root = NULL;
1227 file_mgr_data->selection_list =
1228 (FileViewData **) XtMalloc (sizeof (FileViewData *));
1229 file_mgr_data->selection_list[0] = NULL;
1231 file_mgr_data->selection_table = NULL;
1232 file_mgr_data->selected_file_count = 0;
1234 file_mgr_data->fast_cd_enabled = False;
1235 file_mgr_data->show_hid_enabled = False;
1237 file_mgr_data->cd_inited = False;
1238 file_mgr_data->cd_font = NULL;
1239 file_mgr_data->cd_fontset = NULL;
1240 file_mgr_data->cd_normal_gc = 0;
1241 file_mgr_data->cd_select_gc = 0;
1242 file_mgr_data->cd_select = NULL;
1244 file_mgr_data->tree_solid_thin_gc = 0;
1245 file_mgr_data->tree_solid_thick_gc = 0;
1246 file_mgr_data->tree_dash_thin_gc = 0;
1247 file_mgr_data->tree_dash_thick_gc = 0;
1249 file_mgr_data->file_mgr_rec = NULL;
1250 file_mgr_data->popup_menu_icon = NULL;
1251 file_mgr_data->drag_file_view_data = NULL;
1253 file_mgr_data->change_dir = _DtGetDefaultDialogData (change_dir_dialog);
1254 file_mgr_data->preferences = _DtGetDefaultDialogData (preferences_dialog);
1256 /* now set up the preferences the way they really are */
1257 preferences_data = (PreferencesData *)file_mgr_data->preferences->data;
1258 preferences_data->show_type = file_mgr_data->show_type;
1259 preferences_data->tree_files = file_mgr_data->tree_files;
1260 preferences_data->view_single = file_mgr_data->view_single;
1261 preferences_data->view_tree = file_mgr_data->view_tree;
1262 preferences_data->order = file_mgr_data->order;
1263 preferences_data->direction = file_mgr_data->direction;
1264 preferences_data->positionEnabled = file_mgr_data->positionEnabled;
1265 preferences_data->show_iconic_path = file_mgr_data->show_iconic_path;
1266 preferences_data->show_current_dir = file_mgr_data->show_current_dir;
1267 preferences_data->show_status_line = file_mgr_data->show_status_line;
1269 file_mgr_data->filter_edit = _DtGetDefaultDialogData (filter_dialog);
1270 file_mgr_data->filter_active = _DtGetDefaultDialogData (filter_dialog);
1271 file_mgr_data->find = _DtGetDefaultDialogData (find_dialog);
1272 file_mgr_data->attr_dialog_list = NULL;
1273 file_mgr_data->attr_dialog_count = 0;
1274 file_mgr_data->secondaryHelpDialogList = NULL;
1275 file_mgr_data->secondaryHelpDialogCount = 0;
1276 file_mgr_data->primaryHelpDialog = NULL;
1278 return ((XtPointer) file_mgr_data);
1282 /************************************************************************
1286 ************************************************************************/
1290 XrmDatabase data_base,
1293 static Boolean first = True;
1294 FileMgrData * file_mgr_data;
1295 PreferencesData *preferences_data;
1297 char * directory_name;
1298 char * new_name_list[20];
1299 int name_list_count;
1300 struct passwd * pwInfo;
1310 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1311 SHOW_TYPE, StringToShowType, NULL, 0);
1312 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1313 TREE_FILES, StringToTreeFiles, NULL, 0);
1314 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1315 VIEW, StringToView, NULL, 0);
1316 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1317 ORDER, StringToOrder, NULL, 0);
1318 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1319 DIRECTION_RESRC, StringToDirection, NULL, 0);
1320 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1321 RANDOM, StringToRandom, NULL, 0);
1322 XtAppSetTypeConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1323 BRANCH_LIST, (XtTypeConverter)StringToBranchList,
1324 NULL, 0, XtCacheNone, NULL);
1325 XtAppAddConverter (XtWidgetToApplicationContext (toplevel), XmRString,
1326 SELECTION_LIST, (XtConverter)StringToSelectionList,
1331 /* Allocate and get the resources for change dir dialog data. */
1333 file_mgr_data = (FileMgrData *) XtMalloc (sizeof (FileMgrData));
1335 file_mgr_data->busy_status = not_busy;
1336 file_mgr_data->busy_detail = 0;
1337 file_mgr_data->num_objects = 0;
1338 file_mgr_data->object_positions = NULL;
1339 file_mgr_data->grid_height = 0;
1340 file_mgr_data->grid_width = 0;
1341 file_mgr_data->layout_data = NULL;
1342 file_mgr_data->secondaryHelpDialogList = NULL;
1343 file_mgr_data->secondaryHelpDialogCount = 0;
1344 file_mgr_data->attr_dialog_count = 0;
1345 file_mgr_data->attr_dialog_list = NULL;
1346 file_mgr_data->primaryHelpDialog = NULL;
1347 file_mgr_data->popup_menu_icon = NULL;
1348 file_mgr_data->title = NULL;
1349 file_mgr_data->helpVol = NULL;
1350 file_mgr_data->restricted_directory = NULL;
1351 file_mgr_data->toolbox = False;
1352 file_mgr_data->dropSite = False;
1353 file_mgr_data->tree_preread_level = 1; /* @@@ make these resources? */
1354 file_mgr_data->tree_show_level = 1;
1355 file_mgr_data->tree_files = TREE_FILES_NEVER;
1356 file_mgr_data->special_msg = NULL;
1357 file_mgr_data->msg_timer_id = 0;
1358 file_mgr_data->show_iconic_path = True;
1359 file_mgr_data->show_current_dir = True;
1360 file_mgr_data->show_status_line = True;
1361 file_mgr_data->scrollToThisFile = NULL;
1362 file_mgr_data->scrollToThisDirectory = NULL;
1363 file_mgr_data->renaming = NULL;
1365 _DtDialogGetResources (data_base, name_list, FILEMGR, (char *)file_mgr_data,
1366 resources, fileMgrClass->resource_count);
1367 if (file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1368 file_mgr_data->view = file_mgr_data->view_tree;
1370 file_mgr_data->view = file_mgr_data->view_single;
1372 /* Bases on the type of restore session we are doing we must
1373 * adjust the host, current_directory, and selections to the
1374 * proper values (e.g. restore session or restore settings)
1376 if (restoreType != NORMAL_RESTORE)
1378 GetSessionDir(file_mgr_data);
1380 /* Adjust the selected files to null */
1381 file_mgr_data->selection_list = NULL;
1383 /* Set the Displayed to false so we do not use the x and y
1384 values when we place the window in showDialog
1386 file_mgr_data->displayed = False;
1388 if(special_view && !TrashView)
1390 if(special_title != NULL)
1391 file_mgr_data->title = XtNewString(special_title);
1393 file_mgr_data->title = XtNewString(file_mgr_data->title);
1395 if(special_helpVol != NULL)
1396 file_mgr_data->helpVol = XtNewString(special_helpVol);
1398 file_mgr_data->helpVol = XtNewString(file_mgr_data->helpVol);
1400 if(special_treeType != UNSET_VALUE)
1401 file_mgr_data->show_type = special_treeType;
1403 if(special_treeFiles != UNSET_VALUE)
1404 file_mgr_data->tree_files = special_treeFiles;
1406 if(special_viewType != UNSET_VALUE)
1408 file_mgr_data->view = special_viewType;
1409 if(file_mgr_data->show_type == MULTIPLE_DIRECTORY)
1410 file_mgr_data->view_tree = special_viewType;
1412 file_mgr_data->view_single = special_viewType;
1415 if(special_orderType != UNSET_VALUE)
1416 file_mgr_data->order = special_orderType;
1418 if(special_directionType != UNSET_VALUE)
1419 file_mgr_data->direction = special_directionType;
1421 if(special_randomType != UNSET_VALUE)
1422 file_mgr_data->positionEnabled = special_randomType;
1426 file_mgr_data->title = XtNewString(file_mgr_data->title);
1427 file_mgr_data->helpVol = XtNewString(file_mgr_data->helpVol);
1432 GetSessionDir(file_mgr_data);
1434 file_mgr_data->title = XtNewString(file_mgr_data->title);
1435 file_mgr_data->helpVol = XtNewString(file_mgr_data->helpVol);
1438 /* The GetSessionDir() function depends on the hostname being set. */
1439 /* So, we'll do it earlier */
1440 if(file_mgr_data->host != NULL)
1441 file_mgr_data->host = XtNewString(file_mgr_data->host);
1443 file_mgr_data->host = XtNewString(home_host_name);
1445 file_mgr_data->restoreKind = NORMAL_RESTORE;
1447 file_mgr_data->directory_count = 0;
1448 file_mgr_data->directory_set = NULL;
1449 file_mgr_data->tree_root = NULL;
1451 file_mgr_data->selected_file_count = 0;
1452 file_mgr_data->selection_table = (char **) file_mgr_data->selection_list;
1453 file_mgr_data->selection_list =
1454 (FileViewData **) XtMalloc (sizeof (FileViewData *));
1455 file_mgr_data->selection_list[0] = NULL;
1457 file_mgr_data->cd_inited = False;
1458 file_mgr_data->cd_font = NULL;
1459 file_mgr_data->cd_fontset = NULL;
1460 file_mgr_data->cd_normal_gc = 0;
1461 file_mgr_data->cd_select_gc = 0;
1462 file_mgr_data->cd_select = NULL;
1464 file_mgr_data->popup_menu_icon = NULL;
1465 file_mgr_data->drag_file_view_data = NULL;
1467 file_mgr_data->tree_solid_thin_gc = 0;
1468 file_mgr_data->tree_solid_thick_gc = 0;
1469 file_mgr_data->tree_dash_thin_gc = 0;
1470 file_mgr_data->tree_dash_thick_gc = 0;
1472 host_name = XtNewString (file_mgr_data->host);
1473 directory_name = XtNewString (file_mgr_data->current_directory);
1475 FileMgrBuildDirectories (file_mgr_data, host_name, directory_name);
1477 XtFree ((char *) host_name);
1479 XtFree ((char *) directory_name);
1481 if (restoreType == NORMAL_RESTORE &&
1482 file_mgr_data->positionEnabled == RANDOM_ON)
1484 /* Restore the optional positional data */
1485 RestorePositionalData(data_base, name_list, file_mgr_data, FILEMGR);
1489 /* Get a copy of the name list to be used to build new name lists. */
1491 _DtDuplicateDialogNameList(name_list, new_name_list, 20, &name_list_count);
1493 /* Load sub-dialogs */
1495 /* Get secondary help dialogs */
1496 if(restoreType == NORMAL_RESTORE &&
1497 file_mgr_data->secondaryHelpDialogCount > 0)
1499 _DtLoadSubdialogArray(new_name_list, name_list_count,
1500 &(file_mgr_data->secondaryHelpDialogList),
1501 file_mgr_data->secondaryHelpDialogCount,
1502 help_dialog, data_base, 1);
1506 file_mgr_data->secondaryHelpDialogList = NULL;
1507 file_mgr_data->secondaryHelpDialogCount = 0;
1510 /* Get primary help dialog */
1511 new_name_list[name_list_count] = number;
1512 new_name_list[name_list_count + 1] = NULL;
1513 sprintf(number, "%d", 0);
1514 if (restoreType == NORMAL_RESTORE)
1516 file_mgr_data->primaryHelpDialog =
1517 _DtGetResourceDialogData(help_dialog, data_base, new_name_list);
1518 if(((DialogInstanceData *)
1519 (file_mgr_data->primaryHelpDialog->data))->displayed == False)
1521 _DtFreeDialogData( file_mgr_data->primaryHelpDialog );
1522 file_mgr_data->primaryHelpDialog = NULL;
1526 file_mgr_data->primaryHelpDialog = NULL;
1528 if (restoreType == NORMAL_RESTORE &&
1529 file_mgr_data->attr_dialog_count > 0)
1531 /* Get properties dialogs */
1532 _DtLoadSubdialogArray(new_name_list, name_list_count,
1533 &(file_mgr_data->attr_dialog_list),
1534 file_mgr_data->attr_dialog_count,
1535 mod_attr_dialog, data_base, 1);
1539 file_mgr_data->attr_dialog_list = NULL;
1540 file_mgr_data->attr_dialog_count = 0;
1542 new_name_list[name_list_count] = NULL;
1544 file_mgr_data->change_dir =
1545 _DtGetResourceDialogData (change_dir_dialog, data_base, name_list);
1547 file_mgr_data->preferences =
1548 _DtGetResourceDialogData (preferences_dialog, data_base, name_list);
1550 /* Set all dialogs displayed flag for change_dir, and preferences
1551 * to false if not NORMAL_RESTORE
1553 if (restoreType != NORMAL_RESTORE)
1555 ((DialogInstanceData *)
1556 (file_mgr_data->change_dir->data))->displayed = False;
1558 ((DialogInstanceData *)
1559 (file_mgr_data->preferences->data))->displayed = False;
1562 /* now set up the preferences the way they really are */
1563 preferences_data = (PreferencesData *)file_mgr_data->preferences->data;
1564 preferences_data->show_type = file_mgr_data->show_type;
1565 preferences_data->tree_files = file_mgr_data->tree_files;
1566 preferences_data->view_single = file_mgr_data->view_single;
1567 preferences_data->view_tree = file_mgr_data->view_tree;
1568 preferences_data->order = file_mgr_data->order;
1569 preferences_data->direction = file_mgr_data->direction;
1570 preferences_data->positionEnabled = file_mgr_data->positionEnabled;
1571 preferences_data->show_iconic_path = file_mgr_data->show_iconic_path;
1572 preferences_data->show_current_dir = file_mgr_data->show_current_dir;
1573 preferences_data->show_status_line = file_mgr_data->show_status_line;
1575 /* Build the name list for the file dialog that is displayed, */
1576 /* get resource data and perform and other initialization. */
1578 tmpStr = GetSharedMessage(FILTER_EDIT_ID_STRING);
1579 new_name_list[name_list_count] = XtNewString (tmpStr);
1580 new_name_list[name_list_count + 1] = NULL;
1582 file_mgr_data->filter_edit =
1583 _DtGetResourceDialogData (filter_dialog, data_base, new_name_list);
1585 XtFree ((char *) new_name_list[name_list_count]);
1586 new_name_list[name_list_count] = NULL;
1589 /* Build the name list for the filter dialog that is used for the */
1590 /* current processing values. Get the resource data and perform */
1591 /* and other initialization. */
1593 tmpStr = GetSharedMessage(FILTER_ACTIVE_ID_STRING);
1594 new_name_list[name_list_count] = XtNewString (tmpStr);
1595 new_name_list[name_list_count + 1] = NULL;
1597 file_mgr_data->filter_active =
1598 _DtGetResourceDialogData (filter_dialog, data_base, new_name_list);
1600 XtFree ((char *) new_name_list[name_list_count]);
1601 new_name_list[name_list_count] = NULL;
1603 /* Get the resource data for the find dialog and perform */
1604 /* additional initialization. */
1606 file_mgr_data->find =
1607 _DtGetResourceDialogData (find_dialog, data_base, name_list);
1610 /* Set the FilterDialog and Find dialog displayed flag to false if
1611 * not NORMAL_RESTORE
1614 if (restoreType != NORMAL_RESTORE)
1616 ((DialogInstanceData *)
1617 (file_mgr_data->filter_edit->data))->displayed = False;
1619 ((DialogInstanceData *)
1620 (file_mgr_data->find->data))->displayed = False;
1624 return ((XtPointer) file_mgr_data);
1627 /************************************************************************
1631 ************************************************************************/
1635 FileMgrRec *file_mgr_rec,
1636 FileMgrData *file_mgr_data )
1638 Widget cd = file_mgr_rec->current_directory;
1639 Widget cdi = file_mgr_rec->current_directory_icon;
1640 Widget cdd = file_mgr_rec->current_directory_drop;
1642 XmFontList font_list;
1643 XtPointer entry_font;
1647 XGCValues gc_values;
1649 ChangeDirData * change_dir_data;
1650 ModAttrRec *modAttr_rec;
1651 DialogData *attr_dialog;
1652 ModAttrData *attr_data;
1658 DirectorySet ** directory_set;
1659 FileViewData ** order_list;
1660 int directory_count;
1664 char *tmpStr, *tempStr;
1666 PixmapData *pixmapData;
1668 file_mgr_data->file_mgr_rec = (XtPointer) file_mgr_rec;
1670 /* this is what we did for the ultrix port to get the name of the
1671 Application dir right, BUT it has some bugs */
1672 if(file_mgr_data->title != NULL)
1674 XtSetArg (args[0], XmNtitle, file_mgr_data->title);
1675 XtSetValues(file_mgr_rec->shell, args, 1);
1678 /* Set up the callbacks for the current directory line only if
1679 not in showFilesystem. */
1681 if(showFilesystem && !TrashView)
1683 XtRemoveAllCallbacks (cd, XmNarmCallback);
1684 XtAddCallback (cd, XmNarmCallback, CurrentDirSelected, file_mgr_rec);
1686 XtRemoveAllCallbacks (cd, XmNexposeCallback);
1687 XtAddCallback (cd, XmNexposeCallback, CurrentDirExposed, file_mgr_rec);
1689 XtRemoveAllCallbacks (cdi, XmNcallback);
1690 XtAddCallback (cdi, XmNcallback, CurrentDirIconCallback, file_mgr_rec);
1694 XtRemoveAllCallbacks (cdd, XmNcallback);
1695 XtAddCallback (cdd, XmNcallback, CurrentDirDropCallback, file_mgr_rec);
1698 DtUpdateIconicPath(file_mgr_rec, file_mgr_data, False);
1702 * To help our menu callbacks get the file_mgr_rec when they are
1703 * activated, we will register the file_mgr_rec pointer as the
1704 * user_data for the menubar. That way, since the callbacks can
1705 * find out which menubar they were invoked from, they can easily
1706 * map this into the file_mgr_rec.
1708 XtSetArg(args[0], XmNuserData, file_mgr_rec);
1709 XtSetValues(file_mgr_rec->menu, args, 1);
1710 if(fileMgrPopup.menu != NULL)
1711 XtSetValues(fileMgrPopup.menu, args, 1);
1715 * Adjust some widgets, in case this is a recycled dialog, which
1716 * previously had been used as a desktop view, or vice-versa.
1719 XtManageChild(file_mgr_rec->header_frame);
1720 XtManageChild(file_mgr_rec->directoryBarBtn);
1723 if(showFilesystem && !TrashView)
1726 XtSetArg (args[0], XmNallowShellResize, False);
1727 XtSetValues(file_mgr_rec->shell, args, 1);
1730 widg = file_mgr_rec->directoryBarBtn;
1733 XtSetArg (args[0], XmNforeground, &foreground);
1734 XtSetArg (args[1], XmNbackground, &background);
1735 XtSetArg (args[2], XmNfontList, &font_list);
1736 XtGetValues (widg, args, 3);
1738 /* If the current_directory data has not been initialized */
1739 /* for this data record, do it now. */
1741 if (file_mgr_data->cd_inited == False)
1743 file_mgr_data->cd_inited = True;
1745 entry_font = XmFontListEntryGetFont(FontListDefaultEntry(font_list), &type);
1746 if(type == XmFONT_IS_FONTSET) {
1747 file_mgr_data->cd_fontset = (XFontSet)entry_font;
1748 file_mgr_data->cd_fonttype = XmFONT_IS_FONTSET;
1749 gc_mask = GCForeground | GCBackground;
1752 file_mgr_data->cd_font = (XFontStruct *)entry_font;
1753 file_mgr_data->cd_fonttype = XmFONT_IS_FONT;
1754 gc_values.font = ((XFontStruct *)entry_font)->fid;
1755 gc_mask = GCForeground | GCBackground | GCFont;
1758 gc_values.foreground = foreground;
1759 gc_values.background = background;
1760 file_mgr_data->cd_normal_gc = XtGetGC (widg, gc_mask, &gc_values);
1762 gc_values.foreground = background;
1763 gc_values.background = foreground;
1764 file_mgr_data->cd_select_gc = XtGetGC (widg, gc_mask, &gc_values);
1766 /* graphics contexts for drawing tree lines */
1767 gc_values.foreground = foreground;
1768 XtSetArg (args[0], XmNbackground, &gc_values.background);
1769 XtGetValues (file_mgr_rec->file_window, args, 1);
1770 gc_values.line_width = 2;
1771 gc_values.line_style = LineOnOffDash;
1772 gc_values.cap_style = CapNotLast;
1773 gc_values.dashes = TREE_DASH_WIDTH;
1775 gc_mask |= GCCapStyle;
1777 file_mgr_data->tree_solid_thin_gc =
1778 XtGetGC (widg, gc_mask, &gc_values);
1779 file_mgr_data->tree_solid_thick_gc =
1780 XtGetGC (widg, gc_mask | GCLineWidth, &gc_values);
1781 file_mgr_data->tree_dash_thin_gc =
1782 XtGetGC (widg, gc_mask | GCLineStyle | GCDashList, &gc_values);
1783 file_mgr_data->tree_dash_thick_gc =
1784 XtGetGC (widg, gc_mask | GCLineWidth |
1785 GCLineStyle | GCDashList, &gc_values);
1789 if(showFilesystem && !TrashView)
1791 /* Set the current directory icon to normal colors */
1792 SetToNormalColors (file_mgr_rec->current_directory_icon,
1793 file_mgr_rec->file_window, file_mgr_rec->main, 0);
1796 /* Update the Change Directory host name */
1797 change_dir_data = (ChangeDirData *) file_mgr_data->change_dir->data;
1798 if (change_dir_data->host_name != NULL)
1799 XtFree ((char *) change_dir_data->host_name);
1800 change_dir_data->host_name = XtNewString (file_mgr_data->host);
1802 /* Display the correct small directory icon */
1803 pixmapData = GetPixmapData(file_mgr_rec,
1805 file_mgr_data->current_directory,
1808 XtSetArg (args[0], XmNimageName, pixmapData->iconFileName);
1810 XtSetArg (args[0], XmNimageName, NULL);
1811 XtSetValues(cdi, args, 1);
1813 _DtCheckAndFreePixmapData(
1814 GetDirectoryLogicalType(file_mgr_data,
1815 file_mgr_data->current_directory),
1816 file_mgr_rec->shell,
1820 if(file_mgr_data->restricted_directory == NULL)
1821 textString = XtNewString(file_mgr_data->current_directory);
1826 ptr = file_mgr_data->current_directory +
1827 strlen(file_mgr_data->restricted_directory);
1828 if(strcmp(ptr, "") == 0)
1829 textString = XtNewString( "/" );
1831 textString = XtNewString( ptr );
1833 XmTextFieldSetString(file_mgr_rec->current_directory_text, textString);
1835 /* Clear the change dir text field */
1836 if (file_mgr_data->fast_cd_enabled)
1837 XtManageChild(file_mgr_rec->current_directory_text);
1839 XtUnmanageChild(file_mgr_rec->current_directory_text);
1840 XtSetArg (args[0], XmNallowShellResize, True);
1841 XtSetValues(file_mgr_rec->shell, args, 1);
1846 /* Get the file set displayed */
1847 FileMgrRedisplayFiles (file_mgr_rec, file_mgr_data, True);
1850 /* Set the icon name for this view to the directory name. */
1851 SetIconAttributes ((FileMgrRec *)file_mgr_data->file_mgr_rec, file_mgr_data,
1852 file_mgr_data->current_directory);
1855 /* Process the selection table into a selection list */
1857 if (file_mgr_data->selection_table != NULL)
1859 DeselectAllFiles (file_mgr_data);
1861 directory_set = file_mgr_data->directory_set;
1863 if (file_mgr_data->show_type == SINGLE_DIRECTORY)
1864 directory_count = 1;
1866 directory_count = file_mgr_data->directory_count;
1869 while (file_mgr_data->selection_table[i] != NULL)
1871 for (j = 0; j < directory_count; j++)
1873 if (strncmp (directory_set[j]->name,
1874 file_mgr_data->selection_table[i],
1875 strlen (directory_set[j]->name)) == 0)
1877 file_name = strrchr(file_mgr_data->selection_table[i], '/') +1;
1878 order_list = directory_set[j]->order_list;
1880 for (k = 0; k < directory_set[j]->file_count; k++)
1882 if (strcmp (file_name,
1883 order_list[k]->file_data->file_name) == 0)
1885 if (order_list[k]->filtered == False)
1886 SelectFile (file_mgr_data, order_list[k]);
1896 file_mgr_data->selection_table = NULL;
1899 /* Initially, all menubuttons are sensitive */
1901 file_mgr_rec->menuStates = (RENAME | MOVE | DUPLICATE | LINK | TRASH |
1902 MODIFY | CHANGEDIR | PREFERENCES | FILTER |
1903 FIND | CREATE_DIR | CREATE_FILE | SETTINGS |
1904 CLEAN_UP | MOVE_UP |
1905 HOME | CHANGE_DIR | TERMINAL);
1907 if(file_mgr_data != trashFileMgrData
1908 && file_mgr_data != NULL )
1910 if (file_mgr_data->selected_file_count == 0)
1911 ActivateNoSelect (file_mgr_rec);
1912 else if (file_mgr_data->selected_file_count == 1)
1913 ActivateSingleSelect (file_mgr_rec,
1914 file_mgr_data->selection_list[0]->file_data->logical_type);
1916 ActivateMultipleSelect (file_mgr_rec);
1919 SensitizeTrashBtns();
1921 /* Display any dialogs that need to be displayed */
1922 if (((DialogInstanceData *)
1923 (file_mgr_data->change_dir->data))->displayed == True)
1925 ShowChangeDirDialog ((Widget)NULL, (XtPointer)file_mgr_rec,
1929 file_mgr_rec->menuStates |= CHANGEDIR;
1932 if (((DialogInstanceData *)
1933 (file_mgr_data->preferences->data))->displayed == True)
1935 ShowPreferencesDialog ((Widget)NULL, (XtPointer)file_mgr_rec,
1939 file_mgr_rec->menuStates |= PREFERENCES;
1941 if (((DialogInstanceData *)
1942 (file_mgr_data->find->data))->displayed == True)
1944 ShowFindDialog ((Widget)NULL, (XtPointer)file_mgr_rec, (XtPointer)NULL);
1947 file_mgr_rec->menuStates |= FIND;
1950 if (((DialogInstanceData *)
1951 (file_mgr_data->filter_edit->data))->displayed == True)
1953 ShowFilterDialog ((Widget)NULL, (XtPointer)file_mgr_rec, (XtPointer)NULL);
1956 file_mgr_rec->menuStates |= FILTER;
1958 /* Display any properties dialogs */
1959 for (i = 0; i < file_mgr_data->attr_dialog_count; i++)
1961 if (((DialogInstanceData *)
1962 (file_mgr_data->attr_dialog_list[i]->data))->displayed == False)
1968 attr_dialog = (DialogData *)file_mgr_data->attr_dialog_list[i];
1969 attr_data = (ModAttrData *) attr_dialog->data;
1971 loadOk = LoadFileAttributes(attr_data->host, attr_data->directory,
1972 attr_data->name, attr_data);
1977 /* We need the file_mgr_rec inside the create routine so
1978 * we attach it here for use later.
1980 ((ModAttrData *) (file_mgr_data->attr_dialog_list[i]->data))->
1981 main_widget = file_mgr_rec->main;
1983 _DtShowDialog (file_mgr_rec->shell, NULL, (XtPointer)file_mgr_rec,
1984 file_mgr_data->attr_dialog_list[i],
1985 ModAttrChange, (XtPointer)file_mgr_rec, ModAttrClose,
1986 (XtPointer)file_mgr_rec, NULL, False, False, NULL, NULL);
1988 modAttr_rec = (ModAttrRec *)_DtGetDialogInstance(
1989 file_mgr_data->attr_dialog_list[i]);
1991 if(file_mgr_data->title != NULL &&
1992 strcmp(file_mgr_data->helpVol, DTFILE_HELP_NAME) != 0)
1994 tmpStr = GETMESSAGE(21, 1, "File Permissions");
1995 tempStr = (char *)XtMalloc(strlen(tmpStr) +
1996 strlen(file_mgr_data->title) + 5);
1997 sprintf(tempStr, "%s - %s", file_mgr_data->title, tmpStr);
2001 tmpStr = (GETMESSAGE(21,34, "File Manager - Permissions"));
2002 tempStr = XtNewString(tmpStr);
2004 XtSetArg (args[0], XmNtitle, tempStr);
2005 XtSetValues (modAttr_rec->shell, args, 1);
2010 /* The object would have got deleted and hence we are not able to
2013 ModAttrFreeValues(attr_data);
2014 XtFree((char *)attr_dialog);
2015 file_mgr_data->attr_dialog_count--;
2016 if(file_mgr_data->attr_dialog_count >0)
2017 file_mgr_data->attr_dialog_list = (DialogData **) XtRealloc(
2018 (char *) file_mgr_data->attr_dialog_list,
2019 sizeof(DialogData *) * file_mgr_data->attr_dialog_count);
2022 XtFree((char *)file_mgr_data->attr_dialog_list);
2023 file_mgr_data->attr_dialog_list = NULL;
2028 /* Display any secondary help dialogs */
2029 for (i = 0; i < file_mgr_data->secondaryHelpDialogCount; i++)
2031 ShowHelpDialog(file_mgr_rec->shell, (XtPointer)file_mgr_rec,
2033 file_mgr_data->secondaryHelpDialogList[i], NULL, NULL,
2037 /* Display the primary help dialog, if active */
2038 if (file_mgr_data->primaryHelpDialog && ((DialogInstanceData *)
2039 (file_mgr_data->primaryHelpDialog->data))->displayed == True)
2041 ShowHelpDialog(file_mgr_rec->shell, (XtPointer)file_mgr_rec,
2043 file_mgr_data->primaryHelpDialog, NULL, NULL, NULL,
2052 /************************************************************************
2054 * WriteResourceValues
2056 ************************************************************************/
2059 WriteResourceValues(
2064 FileMgrData * file_mgr_data = (FileMgrData *) values->data;
2065 FileMgrRec * file_mgr_rec;
2066 char * new_name_list[20];
2067 int name_list_count;
2073 /* If the dialog is currently displayed, update the geometry */
2074 /* fields to their current values. */
2076 if (file_mgr_data->displayed == True)
2078 _DtGenericUpdateWindowPosition(values);
2079 file_mgr_rec = (FileMgrRec *) _DtGetDialogInstance (values);
2083 /* save FILEMGR resources */
2084 /* store netfile version of current directory name */
2086 if ( file_mgr_data->current_directory && file_mgr_data->toolbox )
2089 char *user_session_str = NULL;
2092 current_host = file_mgr_data->host;
2093 user_session_str = getenv("DTUSERSESSION");
2094 ptr = strstr(file_mgr_data->current_directory, user_session_str);
2098 file_mgr_data->host = XtNewString(file_mgr_data->current_directory);
2099 *ptr = user_session_str[0];
2103 file_mgr_data->host = XtNewString(file_mgr_data->current_directory);
2106 _DtDialogPutResources (fd, name_list, FILEMGR, values->data,
2107 resources, fileMgrClass->resource_count);
2109 XtFree(file_mgr_data->host);
2110 file_mgr_data->host = current_host;
2114 _DtDialogPutResources (fd, name_list, FILEMGR, values->data,
2115 resources, fileMgrClass->resource_count);
2119 /* Save the optional positional data if needed, if file_mgr_data->host
2120 is set to NULL, this is from a save settings, don't save the position
2123 SavePositionalData(fd, file_mgr_data, name_list, FILEMGR);
2126 /* Get a copy of the name list to be used to build new name lists */
2127 _DtDuplicateDialogNameList(name_list, new_name_list, 20, &name_list_count);
2129 /* Write out all of the dialogs */
2131 _DtWriteDialogData (file_mgr_data->change_dir, fd, name_list);
2132 _DtWriteDialogData (file_mgr_data->preferences, fd, name_list);
2135 /* Save any properties dialogs */
2136 _DtSaveSubdialogArray(new_name_list, name_list_count,
2137 file_mgr_data->attr_dialog_list,
2138 file_mgr_data->attr_dialog_count, fd, 1);
2140 /* Save any secondary help dialogs */
2141 _DtSaveSubdialogArray(new_name_list, name_list_count,
2142 file_mgr_data->secondaryHelpDialogList,
2143 file_mgr_data->secondaryHelpDialogCount, fd, 1);
2145 /* Save the primary help dialog, if active */
2146 if (file_mgr_data->primaryHelpDialog)
2148 new_name_list[name_list_count] = number;
2149 new_name_list[name_list_count + 1] = NULL;
2150 sprintf(number, "%d", 0);
2151 _DtWriteDialogData(file_mgr_data->primaryHelpDialog, fd, new_name_list);
2154 tmpStr = GetSharedMessage(FILTER_EDIT_ID_STRING);
2155 new_name_list[name_list_count] = XtNewString (tmpStr);
2156 new_name_list[name_list_count + 1] = NULL;
2157 _DtWriteDialogData (file_mgr_data->filter_edit, fd, new_name_list);
2158 XtFree ((char *) new_name_list[name_list_count]);
2159 new_name_list[name_list_count] = NULL;
2161 tmpStr = GetSharedMessage(FILTER_ACTIVE_ID_STRING);
2162 new_name_list[name_list_count] = XtNewString (tmpStr);
2163 new_name_list[name_list_count + 1] = NULL;
2164 _DtWriteDialogData (file_mgr_data->filter_active, fd, new_name_list);
2165 XtFree ((char *) new_name_list[name_list_count]);
2166 new_name_list[name_list_count] = NULL;
2168 _DtWriteDialogData (file_mgr_data->find, fd, name_list);
2174 /************************************************************************
2177 * Free up space allocated by the FileMgr dialog. This
2178 * includes sub directory information, and attached dialog data.
2180 * Note: this routine frees the FileMgrData, not the FileMgrRec
2181 * (the FileMgrRec data structure will be reused by the dialog
2182 * caching code for the next dtfile window the user might open)
2184 ************************************************************************/
2188 FileMgrData *file_mgr_data )
2192 FileMgrRec *file_mgr_rec;
2194 if (file_mgr_data == NULL)
2197 file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
2199 FreeDirectoryData (file_mgr_data);
2201 if (file_mgr_data->branch_list != NULL)
2203 for (i = 0; file_mgr_data->branch_list[i]; i++)
2204 XtFree (file_mgr_data->branch_list[i]);
2205 XtFree ((char *) file_mgr_data->branch_list);
2206 file_mgr_data->branch_list = NULL;
2209 if (file_mgr_data->selection_list != NULL)
2211 XtFree ((char *) file_mgr_data->selection_list);
2212 file_mgr_data->selection_list = NULL;
2215 if (file_mgr_data->cd_select != NULL)
2217 XtFree ((char *) file_mgr_data->cd_select);
2218 file_mgr_data->cd_select = NULL;
2221 if (file_mgr_data->desktop_file != NULL)
2223 XtFree ((char *) file_mgr_data->desktop_file);
2224 file_mgr_data->desktop_file = NULL;
2228 XtFree(file_mgr_data->special_msg);
2229 file_mgr_data->special_msg = NULL;
2230 if (file_mgr_data->msg_timer_id)
2231 XtRemoveTimeOut(file_mgr_data->msg_timer_id);
2233 _DtDestroySubdialog(file_mgr_data->change_dir);
2234 _DtDestroySubdialog(file_mgr_data->preferences);
2235 _DtDestroySubdialog(file_mgr_data->filter_edit);
2236 _DtDestroySubdialog(file_mgr_data->filter_active);
2237 _DtDestroySubdialog(file_mgr_data->find);
2238 _DtDestroySubdialogArray(file_mgr_data->attr_dialog_list,
2239 file_mgr_data->attr_dialog_count);
2240 _DtDestroySubdialogArray(file_mgr_data->secondaryHelpDialogList,
2241 file_mgr_data->secondaryHelpDialogCount);
2242 _DtDestroySubdialog(file_mgr_data->primaryHelpDialog);
2245 && file_mgr_data != trashFileMgrData
2246 && file_mgr_data != NULL )
2248 /* Free up the GC's we got in SetValues */
2249 if(file_mgr_data->cd_normal_gc != NULL)
2250 XtReleaseGC(file_mgr_rec->current_directory,
2251 file_mgr_data->cd_normal_gc);
2252 if(file_mgr_data->cd_select_gc != NULL)
2253 XtReleaseGC(file_mgr_rec->current_directory_icon,
2254 file_mgr_data->cd_select_gc);
2256 if(file_mgr_data->tree_solid_thin_gc != NULL)
2257 XtReleaseGC(file_mgr_rec->current_directory_icon,
2258 file_mgr_data->tree_solid_thin_gc);
2259 if(file_mgr_data->tree_solid_thick_gc != NULL)
2260 XtReleaseGC(file_mgr_rec->current_directory_icon,
2261 file_mgr_data->tree_solid_thick_gc);
2262 if(file_mgr_data->tree_dash_thin_gc != NULL)
2263 XtReleaseGC(file_mgr_rec->current_directory_icon,
2264 file_mgr_data->tree_dash_thin_gc);
2265 if(file_mgr_data->tree_dash_thick_gc != NULL)
2266 XtReleaseGC(file_mgr_rec->current_directory_icon,
2267 file_mgr_data->tree_dash_thick_gc);
2270 FreeLayoutData(file_mgr_data->layout_data);
2272 { /* This block is added for rectifying memory leakages */
2273 XtFree(file_mgr_data->scrollToThisFile);
2274 XtFree(file_mgr_data->scrollToThisDirectory);
2277 XtFree ((char *) file_mgr_data);
2281 /************************************************************************
2284 * Destroy widgets and free up space allocated by the FileMgr dialog.
2285 * Called when the dialog is destroyed.
2287 ************************************************************************/
2291 XtPointer recordPtr )
2293 FileMgrRec *file_mgr_rec = (FileMgrRec *) recordPtr;
2295 XtDestroyWidget(file_mgr_rec->shell);
2297 XtFree(file_mgr_rec->action_pane_file_type);
2298 XtFree((char *)file_mgr_rec);
2307 Cardinal *num_params )
2309 XmDrawingAreaCallbackStruct cb ;
2310 FileMgrRec * fileMgrRec;
2312 Widget input_on_gadget ;
2314 if ((event->type == KeyPress)
2315 ||(event->type == KeyRelease))
2323 cb.reason = XmCR_INPUT;
2326 if( *(params[0]) != '@' )
2328 char * title = XtNewString( GETMESSAGE(12, 7, "File Manager") );
2329 char * tmp = "Gjmf Nbobhfs ufbn:\n\nTboez Bnjo\nEbo Ebp\nSbhiv Lspwwjej\nUfe Sbotpn\nMjoeb Sjfl\nGsbol Tdinvdl\nNvsbmj Tpnbspvuiv\n";
2331 int i, len = strlen( tmp );
2333 message = (char *)XtCalloc( 1, len + 1 );
2335 /* Not fancy, but serve the purpose */
2336 for( i = 0; i < len; ++i ){
2337 (( isalpha( tmp[i] ) ) ? (message[i] = (int)(tmp[i]) - 1) : (message[i] = tmp[i]));
2341 sscanf( params[0], "%lx", &fileMgrRec );
2343 sscanf( params[0], "%p", (void **) &fileMgrRec );
2345 _DtMessage(toplevel, title, message, NULL, HelpRequestCB);
2353 /************************************************************************
2354 ************************************************************************
2356 * Resource converters
2358 ************************************************************************
2359 ************************************************************************/
2362 /************************************************************************
2366 ************************************************************************/
2370 FileMgrData *file_mgr_data )
2372 if (restoreType == HOME_RESTORE) /* home settings restore */
2374 struct passwd * pwInfo;
2377 /* Set current_directory to the home dir */
2378 if ((homeDir = (char *)getenv("HOME")) == NULL)
2380 pwInfo = getpwuid (getuid());
2381 homeDir = pwInfo->pw_dir;
2384 file_mgr_data->current_directory = XtNewString(homeDir);
2386 file_mgr_data->current_directory =
2387 XtNewString(file_mgr_data->current_directory);
2389 if (file_mgr_data->restricted_directory)
2390 file_mgr_data->restricted_directory =
2391 XtNewString(file_mgr_data->restricted_directory);
2393 file_mgr_data->restricted_directory = NULL;
2395 else if (restoreType == TOOL_RESTORE) /* tool settings restore */
2397 file_mgr_data->current_directory =
2398 XtNewString(file_mgr_data->restricted_directory);
2400 if (file_mgr_data->restricted_directory)
2401 file_mgr_data->restricted_directory =
2402 XtNewString(file_mgr_data->restricted_directory);
2404 file_mgr_data->restricted_directory = NULL;
2406 else /* session restore */
2408 if ((file_mgr_data->current_directory) &&
2409 (file_mgr_data->toolbox) &&
2410 (file_mgr_data->host) &&
2411 (strcmp(file_mgr_data->host, file_mgr_data->current_directory) != 0))
2414 char *user_session_str;
2418 root_toolbox = (file_mgr_data->host);
2420 user_session_str = getenv("DTUSERSESSION");
2421 /* the restricted directory for any object is a parent of that *
2422 * object; the restricted directory for toolboxes is the root *
2423 * toolbox; the current toolbox dir is identified by the path *
2424 * information past the restricted dir/root toolbox */
2425 toolbox_dir = file_mgr_data->current_directory;
2426 toolbox_dir += strlen(file_mgr_data->restricted_directory);
2428 current_dir = XtMalloc(strlen(root_toolbox) +
2429 strlen(user_session_str) +
2430 strlen(toolbox_dir) + 1);
2431 sprintf(current_dir, "%s%s%s", root_toolbox,
2434 file_mgr_data->current_directory = current_dir;
2436 file_mgr_data->restricted_directory = XtMalloc(strlen(root_toolbox) +
2437 strlen(user_session_str) +
2439 sprintf(file_mgr_data->restricted_directory, "%s%s", root_toolbox,
2444 file_mgr_data->current_directory =
2445 XtNewString(file_mgr_data->current_directory);
2447 if (file_mgr_data->restricted_directory)
2448 file_mgr_data->restricted_directory =
2449 XtNewString(file_mgr_data->restricted_directory);
2451 file_mgr_data->restricted_directory = NULL;
2454 file_mgr_data->host = NULL;
2458 /************************************************************************
2461 * Given a file name get the right icon name for it.
2463 ************************************************************************/
2467 FileMgrRec *file_mgr_rec,
2468 FileMgrData *file_mgr_data,
2476 PixmapData * pixmapData;
2477 Tt_status tt_status;
2479 /* Display the correct small directory icon */
2480 ftype = GetDirectoryLogicalType(file_mgr_data, path);
2484 full_name = ResolveLocalPathName(file_mgr_data->host,
2489 if( TT_OK != tt_status )
2492 short_name = strrchr(full_name, '/');
2493 if (strcmp(short_name, "/.") == 0)
2495 if (short_name == full_name)
2498 short_name = strrchr(full_name, '/');
2500 if (strcmp(full_name, "/") == 0)
2501 short_name = full_name;
2503 *short_name++ = '\0';
2506 pixmapData = _DtRetrievePixmapData(ftype,
2509 file_mgr_rec->shell,
2512 pixmapData = _DtRetrievePixmapData(ftype,
2515 file_mgr_rec->shell,
2523 /************************************************************************
2525 * BranchListToString
2526 * Write out the array of strings to the file fd.
2528 ************************************************************************/
2537 Boolean first = True;
2542 (void) write (fd, out_buf, strlen (out_buf));
2545 branch_name = (*value)[i];
2547 while (branch_name != NULL)
2550 (void) write (fd, ", ", strlen (", "));
2554 (void) write (fd, branch_name, strlen (branch_name));
2557 branch_name = (*value)[i];
2560 (void) write (fd, "\n", strlen ("\n"));
2566 /************************************************************************
2568 * SelectionListToString
2569 * Write out the array of strings to the file fd.
2571 ************************************************************************/
2574 SelectionListToString(
2576 FileViewData ***value,
2580 Boolean first = True;
2581 FileViewData * file_view_data;
2582 DirectorySet * directory_set;
2586 (void) write (fd, out_buf, strlen (out_buf));
2589 file_view_data = (*value)[i];
2592 while (file_view_data != NULL)
2594 directory_set = (DirectorySet *) file_view_data->directory_set;
2597 (void) write (fd, ", ", strlen (", "));
2602 (void) write (fd, directory_set->name, strlen (directory_set->name));
2604 if (strcmp (directory_set->name, "/") != 0)
2605 (void) write (fd, "/", strlen ("/"));
2607 (void) write (fd, file_view_data->file_data->file_name,
2608 strlen (file_view_data->file_data->file_name));
2611 file_view_data = (*value)[i];
2614 (void) write (fd, "\n", strlen ("\n"));
2621 /************************************************************************
2623 * StringToBranchList
2624 * Convert a string to a string array.
2626 ************************************************************************/
2635 XtPointer *converter_data)
2637 static char ** table_ptr;
2640 char ** table = NULL;
2645 to_val->size = sizeof (char **);
2646 to_val->addr = (XtPointer) &table_ptr;
2648 if (from_val->addr == NULL)
2652 /* Loop through the string extracting branch names */
2653 /* and placing them into an array of strings. */
2655 current = start = (char *) from_val->addr;
2657 while (start != NULL)
2659 current = DtStrchr (start, ',');
2660 if (current != NULL)
2667 table = (char **) XtRealloc ((char *)table,
2668 sizeof (char *) * (table_size + 1));
2669 table[table_size] = NULL;
2671 table[table_size - 1] = XtNewString (start);
2677 to_val->addr = (XtPointer ) &table_ptr;
2678 to_val->size = sizeof(XtPointer);
2683 /************************************************************************
2685 * StringToSelectionList
2686 * Convert a string to a string array.
2688 ************************************************************************/
2691 StringToSelectionList(
2697 static char ** table_ptr;
2700 char ** table = NULL;
2705 to_val->size = sizeof (char **);
2706 to_val->addr = (XtPointer) &table_ptr;
2708 if (from_val->addr == NULL)
2712 /* Loop through the string extracting file specifications */
2713 /* and placing them into an array of strings. */
2715 current = start = (char *) from_val->addr;
2717 while (start != NULL)
2719 current = DtStrchr (start, ',');
2720 if (current != NULL)
2727 table = (char **) XtRealloc ((char *)table,
2728 sizeof (char *) * (table_size + 1));
2729 table[table_size] = NULL;
2731 table[table_size - 1] = XtNewString (start);
2737 to_val->addr = (XtPointer ) &table_ptr;
2738 to_val->size = sizeof(XtPointer);
2744 /************************************************************************
2745 ************************************************************************
2747 File Mgr file and directory processing functions.
2749 ************************************************************************
2750 ************************************************************************/
2753 /************************************************************************
2756 * Update the iconic path and current directory line.
2758 ************************************************************************/
2762 * Update the status line label widget to show the right text.
2766 FileMgrRec *file_mgr_rec,
2767 FileMgrData *file_mgr_data)
2769 char buf[21+MAX_PATH];
2770 XmString label_string;
2773 if (file_mgr_data->special_msg &&
2774 (file_mgr_data->busy_status == initiating_readdir ||
2775 file_mgr_data->busy_status == busy_readdir))
2777 SetSpecialMsg( file_mgr_rec, file_mgr_data, NULL );
2780 if (file_mgr_data->special_msg)
2782 label_string = XmStringCreateLocalized(file_mgr_data->special_msg);
2786 GetStatusMsg(file_mgr_data, buf);
2787 label_string = XmStringCreateLocalized(buf);
2789 XtSetArg (args[0], XmNlabelString, label_string);
2790 XtSetValues(file_mgr_rec->status_line, args, 1);
2791 XmStringFree (label_string);
2797 * Timeout routine that resets the status line after a
2798 * special message was shown (see also SetSpecialMsg).
2802 FileMgrData *file_mgr_data,
2805 FileMgrRec *file_mgr_rec;
2807 if (*id != file_mgr_data->msg_timer_id)
2810 file_mgr_data->msg_timer_id = 0;
2812 if (file_mgr_data->special_msg)
2814 XtFree(file_mgr_data->special_msg);
2815 file_mgr_data->special_msg = NULL;
2816 if (file_mgr_data->show_status_line)
2818 file_mgr_rec = (FileMgrRec *)file_mgr_data->file_mgr_rec;
2819 UpdateStatusLine(file_mgr_rec, file_mgr_data);
2827 * Arrange for a special message to be shown in the status line.
2828 * After 4 seconds the status line will revert back to the usual
2829 * "x Files, y Hidden" message.
2833 FileMgrRec *file_mgr_rec,
2834 FileMgrData *file_mgr_data,
2837 if (file_mgr_data->special_msg)
2839 XtFree(file_mgr_data->special_msg);
2840 file_mgr_data->special_msg = NULL;
2842 if (file_mgr_data->msg_timer_id)
2843 XtRemoveTimeOut(file_mgr_data->msg_timer_id);
2847 file_mgr_data->special_msg = XtNewString(msg);
2848 file_mgr_data->msg_timer_id =
2849 XtAppAddTimeOut (XtWidgetToApplicationContext (file_mgr_rec->shell),
2850 4000, (XtTimerCallbackProc) MsgTimerEvent,
2851 (XtPointer) file_mgr_data);
2855 file_mgr_data->special_msg = NULL;
2856 file_mgr_data->msg_timer_id = 0;
2863 * Update the iconic path, current directory, and status lines.
2867 FileMgrRec *file_mgr_rec,
2868 FileMgrData *file_mgr_data,
2869 Boolean icons_changed)
2873 Widget cur_dir_manage[4];
2874 int cur_dir_nmanage;
2877 PixmapData *pixmapData;
2880 * No headers on the trash can.
2882 if (!showFilesystem)
2884 if(file_mgr_data->show_status_line)
2885 UpdateStatusLine(file_mgr_rec, file_mgr_data);
2888 else if(file_mgr_data == trashFileMgrData
2891 UpdateStatusLine(file_mgr_rec, file_mgr_data);
2896 * Make sure the iconic path & current directory widgets are
2897 * correctly managed & attached.
2899 if ((file_mgr_data->show_iconic_path == 0) !=
2900 (XtIsManaged(file_mgr_rec->iconic_path_da) == 0) ||
2901 (file_mgr_data->show_current_dir == 0) !=
2902 (XtIsManaged(file_mgr_rec->current_directory_frame) == 0))
2904 icons_changed = True;
2907 "UpdateHeaders: iconic_path %d, current_dir %d, status_line %d\n",
2908 file_mgr_data->show_iconic_path,
2909 file_mgr_data->show_current_dir,
2910 file_mgr_data->show_status_line));
2912 if (!file_mgr_data->show_iconic_path && !file_mgr_data->show_current_dir)
2913 XtUnmanageChild(file_mgr_rec->header_frame);
2916 ((XmManagerWidget)file_mgr_rec->header_frame)->composite.children,
2917 ((XmManagerWidget)file_mgr_rec->header_frame)->composite.num_children);
2919 ((XmManagerWidget)file_mgr_rec->current_directory_frame)->
2921 ((XmManagerWidget)file_mgr_rec->current_directory_frame)->
2922 composite.num_children);
2925 /* attach the iconic path */
2926 if (file_mgr_data->show_iconic_path)
2929 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
2930 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2931 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
2932 if (file_mgr_data->show_current_dir)
2934 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_NONE); n++;
2938 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
2940 XtSetValues(file_mgr_rec->iconic_path_da, args, n);
2941 manage[nmanage++] = file_mgr_rec->iconic_path_da;
2944 /* attach the separator */
2945 if (file_mgr_data->show_iconic_path && file_mgr_data->show_current_dir)
2948 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
2949 XtSetArg (args[n], XmNtopWidget,
2950 file_mgr_rec->iconic_path_da); n++;
2951 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2952 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
2953 XtSetValues(file_mgr_rec->header_separator, args, n);
2954 manage[nmanage++] = file_mgr_rec->header_separator;
2957 /* attach the current directory line */
2958 if (file_mgr_data->show_current_dir)
2961 if (file_mgr_data->show_iconic_path)
2963 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
2964 XtSetArg (args[n], XmNtopWidget,
2965 file_mgr_rec->header_separator); n++;
2969 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
2971 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2972 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
2974 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
2976 XtSetValues(file_mgr_rec->current_directory_frame, args, n);
2977 manage[nmanage++] = file_mgr_rec->current_directory_frame;
2980 * If the iconic path is shown, show only the current directory on
2981 * the current directory line;
2982 * if the iconic path is not shown, also show the drop target and
2983 * the icon representing the current directory.
2985 cur_dir_nmanage = 1;
2986 cur_dir_manage[0] = file_mgr_rec->current_directory;
2988 if (file_mgr_data->show_iconic_path)
2991 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
2992 XtSetArg (args[n], XmNleftOffset, 5); n++;
2993 XtSetValues(file_mgr_rec->current_directory, args, n);
3000 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
3001 XtSetArg (args[n], XmNleftOffset, 5); n++;
3002 XtSetValues(file_mgr_rec->current_directory_drop, args, n);
3003 cur_dir_manage[cur_dir_nmanage++] =
3004 file_mgr_rec->current_directory_drop;
3007 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
3008 XtSetArg (args[n], XmNleftWidget,
3009 file_mgr_rec->current_directory_drop); n++;
3010 XtSetArg (args[n], XmNleftOffset, 0); n++;
3015 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
3016 XtSetArg (args[n], XmNleftOffset, 10); n++;
3018 XtSetValues(file_mgr_rec->current_directory_icon, args, n);
3019 cur_dir_manage[cur_dir_nmanage++] =
3020 file_mgr_rec->current_directory_icon;
3023 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
3024 XtSetArg (args[n], XmNleftWidget,
3025 file_mgr_rec->current_directory_icon);n++;
3026 XtSetArg (args[n], XmNleftOffset, 0); n++;
3027 XtSetValues(file_mgr_rec->current_directory, args, n);
3032 if (file_mgr_data->show_iconic_path || file_mgr_data->show_current_dir)
3034 if (file_mgr_data->show_current_dir)
3035 XtManageChildren(cur_dir_manage, cur_dir_nmanage);
3036 XtManageChildren(manage, nmanage);
3037 if (!XtIsManaged(file_mgr_rec->header_frame))
3038 XtManageChild(file_mgr_rec->header_frame);
3041 XtSetArg (args[0], XmNallowShellResize, True);
3042 XtSetValues(file_mgr_rec->shell, args, 1);
3046 * Make sure the status line is correctly managed.
3048 if (file_mgr_data->show_status_line &&
3049 !XtIsManaged(XtParent(file_mgr_rec->status_line)))
3051 XtManageChild(XtParent(file_mgr_rec->status_line));
3053 else if (!file_mgr_data->show_status_line &&
3054 XtIsManaged(XtParent(file_mgr_rec->status_line)))
3056 XtUnmanageChild(XtParent(file_mgr_rec->status_line));
3059 if (file_mgr_data->show_iconic_path)
3060 DtUpdateIconicPath(file_mgr_rec, file_mgr_data, icons_changed);
3062 if (file_mgr_data->show_current_dir)
3066 /* Display the correct small directory icon */
3067 pixmapData = GetPixmapData(file_mgr_rec,
3069 file_mgr_data->current_directory,
3071 XtSetArg (args[0], XmNallowShellResize, False);
3072 XtSetValues(file_mgr_rec->shell, args, 1);
3075 XtSetArg (args[0], XmNimageName, pixmapData->iconFileName);
3077 XtSetArg (args[0], XmNimageName, NULL);
3078 XtSetValues(file_mgr_rec->current_directory_icon, args, 1);
3079 _DtCheckAndFreePixmapData(
3080 GetDirectoryLogicalType(file_mgr_data,
3081 file_mgr_data->current_directory),
3082 file_mgr_rec->shell,
3083 (DtIconGadget) file_mgr_rec->current_directory_icon,
3086 XtSetArg (args[0], XmNallowShellResize, True);
3087 XtSetValues(file_mgr_rec->shell, args, 1);
3089 if(XtIsRealized(file_mgr_rec->main))
3090 DrawCurrentDirectory (file_mgr_rec->current_directory,
3091 file_mgr_rec, file_mgr_data);
3094 if (file_mgr_data->show_status_line)
3095 UpdateStatusLine(file_mgr_rec, file_mgr_data);
3099 /************************************************************************
3101 * FileMgrRedisplayFiles
3102 * Reprocess and redisplay the files of a view.
3104 ************************************************************************/
3107 FileMgrRedisplayFiles(
3108 FileMgrRec *file_mgr_rec,
3109 FileMgrData *file_mgr_data,
3110 Boolean new_directory)
3112 _DtTurnOnHourGlass (file_mgr_rec->shell);
3113 GetFileData (file_mgr_data, True, file_mgr_data->branch_list);
3114 XmDropSiteStartUpdate(file_mgr_rec->file_window);
3115 UpdateFileIcons(file_mgr_rec, file_mgr_data, new_directory);
3116 UpdateHeaders (file_mgr_rec, file_mgr_data, False);
3117 LayoutFileIcons(file_mgr_rec, file_mgr_data, False, False);
3118 XmDropSiteEndUpdate(file_mgr_rec->file_window);
3119 _DtTurnOffHourGlass (file_mgr_rec->shell);
3125 /************************************************************************
3128 * Update the view to the new directory.
3130 ************************************************************************/
3134 FileMgrData *file_mgr_data,
3136 char *directory_name )
3138 FileMgrRec * file_mgr_rec;
3140 char tmp_directory_name[MAX_PATH];
3146 tmp_type = DtDtsDataToDataType(directory_name, NULL, 0, NULL, NULL,
3148 if (( (strcmp(tmp_type, LT_AGROUP) == 0) ||
3149 (strstr(tmp_type, LT_AGROUP_SUBDIR)) )
3151 ( !(file_mgr_data->toolbox) ))
3153 DtActionArg *action_args;
3156 action_args = (DtActionArg *) XtCalloc(1, sizeof(DtActionArg));
3159 action_args[0].argClass = DtACTION_FILE;
3160 action_args[0].u.file.name = directory_name;
3163 pwd_dir = XtNewString(file_mgr_data->current_directory);
3164 DtActionInvoke(((FileMgrRec *) file_mgr_data->file_mgr_rec)->shell,
3165 "OpenAppGroup", action_args, 1,
3166 NULL, NULL, pwd_dir, True, NULL, NULL);
3167 DtDtsFreeDataType(tmp_type);
3171 else if (strcmp(tmp_type, LT_TRASH) == 0)
3173 DtActionArg *action_args;
3176 pwd_dir = XtNewString(file_mgr_data->current_directory);
3177 DtActionInvoke(((FileMgrRec *) file_mgr_data->file_mgr_rec)->shell,
3179 NULL, NULL, pwd_dir, True, NULL, NULL);
3180 DtDtsFreeDataType(tmp_type);
3184 DtDtsFreeDataType(tmp_type);
3186 if (openDirType == NEW)
3188 DialogData *dialog_data;
3189 FileMgrData *fileMgrData;
3191 fileMgrData = CheckOpenDir(directory_name, host_name);
3192 if(fileMgrData != NULL)
3194 dialog_data = _DtGetInstanceData(fileMgrData->file_mgr_rec);
3195 CloseView(dialog_data);
3197 ForceMyIconClosed(file_mgr_data->host, file_mgr_data->current_directory);
3200 file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
3202 /* Set the icon name for this view to the directory name. */
3204 SetIconAttributes ((FileMgrRec *)file_mgr_data->file_mgr_rec, file_mgr_data,
3207 _DtTurnOnHourGlass (file_mgr_rec->shell);
3209 DeselectAllFiles (file_mgr_data);
3210 ActivateNoSelect (file_mgr_rec);
3212 /* When leaving a directory, save any positional information */
3213 if(file_mgr_data->object_positions)
3215 SavePositionInfo(file_mgr_data);
3216 FreePositionInfo(file_mgr_data);
3219 /* save the current branch list */
3220 branch_list = file_mgr_data->branch_list;
3221 file_mgr_data->branch_list = NULL;
3223 FileMgrBuildDirectories (file_mgr_data, host_name, directory_name);
3225 GetFileData (file_mgr_data, True, branch_list);
3227 if (branch_list != NULL)
3229 for (i = 0; branch_list[i]; i++)
3230 XtFree (branch_list[i]);
3231 XtFree ((char *) branch_list);
3234 UpdateCachedDirectories (view_set, view_count);
3236 /* Inherit, or load positional data for this directory */
3237 XmDropSiteStartUpdate(file_mgr_rec->file_window);
3238 LoadPositionInfo(file_mgr_data);
3239 UpdateFileIcons(file_mgr_rec, file_mgr_data, True);
3241 if (showFilesystem && file_mgr_data != trashFileMgrData)
3242 UpdateHeaders (file_mgr_rec, file_mgr_data, True);
3243 else if(file_mgr_data == trashFileMgrData
3244 && file_mgr_data != NULL )
3245 UpdateStatusLine(file_mgr_rec, file_mgr_data);
3247 /* change the title */
3248 title = _DtBuildFMTitle(file_mgr_data);
3249 XtSetArg (args[0], XmNtitle, title);
3250 XtSetValues (file_mgr_rec->shell, args, 1);
3253 if (file_mgr_data->show_type == SINGLE_DIRECTORY)
3254 LayoutFileIcons(file_mgr_rec, file_mgr_data, True, True);
3256 LayoutFileIcons(file_mgr_rec, file_mgr_data, False, True);
3258 if (openDirType == NEW)
3259 ForceMyIconOpen (file_mgr_data->host, NULL);
3260 XmDropSiteEndUpdate(file_mgr_rec->file_window);
3266 /************************************************************************
3269 * This function causes a rescan of the directory for the view
3270 * and a full redisplay of the file icons.
3272 ************************************************************************/
3276 FileMgrRec *file_mgr_rec )
3278 DialogData * dialog_data;
3279 FileMgrData * file_mgr_data;
3280 DirectorySet ** directory_set;
3284 dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec);
3285 file_mgr_data = (FileMgrData *) dialog_data->data;
3287 _DtTurnOnHourGlass (file_mgr_rec->shell);
3289 directory_set = file_mgr_data->directory_set;
3291 for (i = 0; i < file_mgr_data->directory_count; i++)
3292 RereadDirectory (file_mgr_rec->shell, file_mgr_data->host,
3293 directory_set[i]->name);
3295 GetFileData (file_mgr_data, False, file_mgr_data->branch_list);
3296 XmDropSiteStartUpdate(file_mgr_rec->file_window);
3297 UpdateFileIcons(file_mgr_rec, file_mgr_data, False);
3298 UpdateHeaders (file_mgr_rec, file_mgr_data, False);
3299 LayoutFileIcons(file_mgr_rec, file_mgr_data, False, True);
3300 XmDropSiteEndUpdate(file_mgr_rec->file_window);
3301 /* _DtTurnOffHourGlass (file_mgr_rec->shell); */
3306 /************************************************************************
3308 * FileMgrBuildDirectories
3309 * Given a directory name, setup the directory set structure
3310 * contained in the file mgr data stucture.
3312 ************************************************************************/
3315 FileMgrBuildDirectories(
3316 FileMgrData *file_mgr_data,
3318 char *directory_name )
3320 char current_directory[MAX_PATH];
3321 DirectorySet ** directory_set;
3323 /* Inform Main that the directory is being changed and */
3324 /* free up the data contained in the current directory set. */
3326 if (file_mgr_data->current_directory != NULL)
3328 DirectoryChanged ((XtPointer)file_mgr_data, file_mgr_data->host, host_name,
3329 file_mgr_data->current_directory, directory_name);
3330 FreeDirectoryData (file_mgr_data);
3333 file_mgr_data->current_directory = (char *) XtNewString(directory_name);
3334 (void) strcpy (current_directory, file_mgr_data->current_directory);
3336 /* This code will solve the path problem if user has
3337 Dtfile*restrictMode resource set to True and
3338 also invoke dtfile with -restricted option
3341 && file_mgr_data->toolbox == False
3342 && file_mgr_data->restricted_directory
3343 && strncmp( file_mgr_data->restricted_directory, directory_name,
3344 strlen( file_mgr_data->restricted_directory ) ) != 0
3347 XtFree( file_mgr_data->restricted_directory );
3348 file_mgr_data->restricted_directory = XtNewString( directory_name );
3351 if (file_mgr_data->host != NULL)
3352 XtFree ((char *) file_mgr_data->host);
3354 file_mgr_data->host = (char *) XtNewString (host_name);
3357 /* Allocate the data for one initial directory set */
3359 file_mgr_data->directory_set = directory_set =
3360 ((DirectorySet **) XtMalloc (2 * sizeof(DirectorySet *))) + 1;
3361 file_mgr_data->directory_count = 1;
3363 directory_set[-1] = NULL;
3365 directory_set[0] = (DirectorySet *) XtMalloc (sizeof (DirectorySet));
3366 directory_set[0]->name = (char *) XtNewString (current_directory);
3367 directory_set[0]->sub_root = NULL;
3368 directory_set[0]->file_count = 0;
3369 directory_set[0]->file_view_data = NULL;
3370 directory_set[0]->order_list = NULL;
3371 directory_set[0]->filtered_file_count = 0;
3372 directory_set[0]->invisible_file_count = 0;
3373 directory_set[0]->file_mgr_data = (XtPointer) file_mgr_data;
3379 FileMgrData * file_mgr_data,
3384 static Region r = NULL;
3385 unsigned char flags;
3386 XRectangle pRect, lRect;
3388 if ((file_mgr_data->show_type != SINGLE_DIRECTORY) ||
3389 (file_mgr_data->view == BY_ATTRIBUTES))
3393 && x < (Position)(w->core.x + w->core.width)
3394 && y < (Position)(w->core.y + w->core.height)
3403 r = XCreateRegion();
3405 XSubtractRegion(r, r, r);
3407 _DtIconGetIconRects((DtIconGadget)w, &flags, &pRect, &lRect);
3409 if (flags & XmPIXMAP_RECT)
3410 XUnionRectWithRegion(&pRect, r, r);
3412 if (flags & XmLABEL_RECT)
3413 XUnionRectWithRegion(&lRect, r, r);
3415 if (XPointInRegion(r, x, y))
3424 * Check to see if the drop occurred within one of the primary hotspots.
3425 * If this is the desktop, then we need to check the hotspots according
3426 * to their stacking order; all other views have their hotspots checked
3427 * according to the order the files were loaded, since overlapping hotspots
3432 DropOnPrimaryHotspot (
3433 FileMgrData * file_mgr_data,
3436 DirectorySet ** directory_data)
3438 int directory_count;
3440 FileViewData * file_view_data;
3441 DirectorySet * dir_data;
3444 if (PositioningEnabledInView(file_mgr_data))
3446 top = GetTopOfStack(file_mgr_data);
3450 file_view_data = top->file_view_data;
3452 if(file_view_data == NULL)
3458 if (file_view_data->displayed &&
3459 DropOnGadget(file_mgr_data, file_view_data->widget, drop_x, drop_y))
3461 *directory_data = file_mgr_data->directory_set[0];
3462 return(file_view_data);
3470 if (file_mgr_data->show_type == MULTIPLE_DIRECTORY) {
3472 directory_count = file_mgr_data->directory_count;
3476 directory_count = 1;
3479 for (; i < directory_count; i++)
3481 dir_data = file_mgr_data->directory_set[i];
3483 for (j = 0; j < dir_data->file_count; j++)
3485 file_view_data = dir_data->file_view_data[j];
3487 if (!file_view_data->displayed)
3490 if (DropOnGadget(file_mgr_data, file_view_data->widget, drop_x,
3493 *directory_data = dir_data;
3494 return(file_view_data);
3500 *directory_data = NULL;
3506 /************************************************************************
3508 * ProcessDropOnFileWindow
3510 ************************************************************************/
3512 ProcessDropOnFileWindow (
3514 DtDndDropCallbackStruct *dropInfo,
3515 FileMgrData *file_mgr_data)
3517 char *command = NULL;
3520 /******************/
3521 /* transfer phase */
3522 /******************/
3523 if(dropInfo->reason != DtCR_DND_DROP_ANIMATE)
3527 XmDragContext drag_context;
3529 /* Initiating view not valid when another client initiates drag */
3531 initiating_view = NULL;
3533 /* reject the drop if the Protocol is buffer and it was
3534 dropped on the Trash Can
3536 if (dropInfo->dropData->protocol == DtDND_BUFFER_TRANSFER)
3538 if (file_mgr_data == trashFileMgrData
3539 && file_mgr_data != NULL )
3541 dropInfo->status = DtDND_FAILURE;
3542 DPRINTF (("ProcessDropOnFileWindow: Rejecting buffer drop on Trash Can\n"));
3548 /* if placement is 'As Placed', set blend model to BLEND_NONE */
3549 /* @@@...Need to check if this will work correctly for BUFFERS */
3550 if (PositioningEnabledInView(file_mgr_data))
3552 drag_context = (XmDragContext)dropInfo->dragContext;
3556 XtSetArg(args[0], XmNblendModel, XmBLEND_NONE);
3557 XtSetValues((Widget)drag_context, args, 1);
3560 /* if placement is 'Grid' */
3563 /* if initiating view is current view, set status
3566 if (initiating_view)
3568 if ((((FileMgrData *)initiating_view)->current_directory ==
3569 file_mgr_data->current_directory) &&
3570 (dropInfo->dropData->protocol == DtDND_FILENAME_TRANSFER))
3572 /* we actually want to allow a copy or a link to the same directory
3573 * but not a move. If it's a copy or link, we want the initiating
3574 * view to be NULL so that later we don't error out when it checks
3575 * to see if they are from the same view. We will fail out if the
3576 * operation is a MOVE (causing the zoom back).
3578 fileType = GetDirectoryLogicalType(file_mgr_data,
3579 file_mgr_data->current_directory);
3581 command = TypeToAction(dropInfo->operation, fileType);
3584 if (strcmp(command, "FILESYSTEM_MOVE") == 0)
3585 dropInfo->status = DtDND_FAILURE;
3587 initiating_view = NULL;
3593 /* set the complete move flag to False since the animate
3594 callback handles the deletion of the original file on the move
3597 DPRINTF(("DropOnFileWindow: Transfer Callback - Setting Complete move flag to False\n"));
3599 if(dropInfo->dropData->protocol == DtDND_BUFFER_TRANSFER)
3600 dropInfo->completeMove = True;
3602 /* set the complete move flag to False since we will be handling */
3603 /* the deletion of the original file */
3605 dropInfo->completeMove = False;
3608 /*****************************/
3609 /* animate phase, run action */
3610 /*****************************/
3613 char *command = NULL;
3616 DPRINTF(("DropOnFileWindow - Animate Callback."));
3618 fileType = GetDirectoryLogicalType(file_mgr_data,
3619 file_mgr_data->current_directory);
3621 command = TypeToAction(dropInfo->operation, fileType);
3625 DirectorySet *directory_set;
3628 /* retrieve the fileViewData for the current directory */
3629 directory_set = file_mgr_data->directory_set[0];
3630 for( i = 0; i < directory_set->file_count; ++i )
3632 if( strcmp(directory_set->order_list[i]->file_data->file_name, "." )
3635 RunCommand( command,
3637 directory_set->order_list[i],
3644 DtDtsFreeAttributeValue( command );
3650 /************************************************************************
3654 ************************************************************************/
3659 XtPointer client_data,
3660 XtPointer call_data)
3662 FileMgrData * file_mgr_data = (FileMgrData *)client_data;
3663 DtDndDropCallbackStruct *dropInfo = (DtDndDropCallbackStruct *)call_data;
3665 switch (dropInfo->dropData->protocol)
3667 case DtDND_FILENAME_TRANSFER:
3669 DPRINTF(("DropOnFileWindow: Number of Files dropped are %d\n",
3670 dropInfo->dropData->numItems));
3671 ProcessDropOnFileWindow (w, dropInfo, file_mgr_data);
3673 case DtDND_BUFFER_TRANSFER:
3674 DPRINTF (("DropOnFileWindow: Number of Buffers dropped are %d\n",
3675 dropInfo->dropData->numItems));
3676 ProcessDropOnFileWindow (w, dropInfo, file_mgr_data);
3679 dropInfo->status = DtDND_FAILURE;
3684 /************************************************************************
3686 * ProcessDropOnObject
3688 ************************************************************************/
3690 ProcessDropOnObject(
3692 DtDndDropCallbackStruct *dropInfo,
3693 FileViewData *file_view_data)
3697 DirectorySet *directory_data =
3698 (DirectorySet *) file_view_data->directory_set;
3699 FileMgrData *file_mgr_data = (FileMgrData *) directory_data->file_mgr_data;
3700 char *command = NULL;
3702 /******************/
3703 /* transfer phase */
3704 /******************/
3705 if (dropInfo->reason != DtCR_DND_DROP_ANIMATE)
3707 DPRINTF(("DropOnObject: Transfer Callback\n"));
3709 /* Initiating view not valid when another client initiates drag */
3711 initiating_view = NULL;
3713 /* check for invalid trash drop */
3714 if (FileFromTrash(dropInfo->dropData->data.files[0]))
3716 if (InvalidTrashDragDrop(dropInfo->operation,
3718 ((FileMgrRec *)file_mgr_data->file_mgr_rec)->file_window))
3720 dropInfo->status = DtDND_FAILURE;
3724 command = TypeToAction(dropInfo->operation,
3725 file_view_data->file_data->logical_type);
3727 (strncmp("FILESYSTEM_", command, strlen("FILESYSTEM_")) != 0) &&
3728 dropInfo->dropData->protocol == DtDND_BUFFER_TRANSFER)
3729 dropInfo->completeMove = True;
3731 /* set the complete move flag to False since we will be handling */
3732 /* the deletion of the original file */
3733 dropInfo->completeMove = False;
3736 /******************************************/
3737 /* animate phase, retrieve action and run */
3738 /******************************************/
3741 command = TypeToAction(dropInfo->operation,
3742 file_view_data->file_data->logical_type);
3745 RunCommand (command,
3752 DtDtsFreeAttributeValue(command);
3758 /************************************************************************
3762 ************************************************************************/
3767 XtPointer client_data,
3768 XtPointer call_data)
3770 DtDndDropCallbackStruct *dropInfo = (DtDndDropCallbackStruct *)call_data;
3772 switch (dropInfo->dropData->protocol)
3774 case DtDND_FILENAME_TRANSFER:
3775 case DtDND_BUFFER_TRANSFER:
3776 ProcessDropOnObject(w, dropInfo, (FileViewData *) client_data);
3779 dropInfo->status = DtDND_FAILURE;
3784 /************************************************************************
3786 * FileMgrPropagateSettings
3787 * Set a new (dst_data) file manager view settings to an
3788 * old (src_data) settings.
3790 ************************************************************************/
3793 FileMgrPropagateSettings(
3794 FileMgrData *src_data,
3795 FileMgrData *dst_data )
3798 PreferencesData * src_preferences_data;
3799 PreferencesData * dst_preferences_data;
3801 FilterData * src_filter_active_data;
3802 FilterData * dst_filter_active_data;
3803 FilterData * src_filter_edit_data;
3804 FilterData * dst_filter_edit_data;
3807 Dimension src_width;
3808 Dimension src_height;
3810 /* Copy the preferences data from src to dst data */
3812 src_preferences_data = (PreferencesData *) src_data->preferences->data;
3813 dst_preferences_data = (PreferencesData *) dst_data->preferences->data;
3815 dst_data->show_type = dst_preferences_data->show_type = src_data->show_type;
3816 dst_data->tree_files = dst_preferences_data->tree_files =
3817 src_data->tree_files;
3818 dst_data->view = src_data->view;
3819 dst_data->view_single = dst_preferences_data->view_single =
3820 src_data->view_single;
3821 dst_data->view_tree = dst_preferences_data->view_tree =
3822 src_data->view_tree;
3823 dst_data->order = dst_preferences_data->order = src_data->order;
3824 dst_data->direction = dst_preferences_data->direction = src_data->direction;
3825 dst_data->positionEnabled = dst_preferences_data->positionEnabled =
3826 src_data->positionEnabled;
3827 dst_data->show_iconic_path = dst_preferences_data->show_iconic_path =
3828 src_data->show_iconic_path;
3829 dst_data->show_current_dir = dst_preferences_data->show_current_dir =
3830 src_data->show_current_dir;
3831 dst_data->show_status_line = dst_preferences_data->show_status_line =
3832 src_data->show_status_line;
3835 /* Copy the Filter active info from src to dest data */
3836 src_filter_active_data = (FilterData *) src_data->filter_active->data;
3837 dst_filter_active_data = (FilterData *) dst_data->filter_active->data;
3839 dst_filter_active_data->match_flag = src_filter_active_data->match_flag;
3840 dst_filter_active_data->filter = XtNewString(src_filter_active_data->filter);
3841 dst_filter_active_data->show_hidden = src_filter_active_data->show_hidden;
3842 dst_filter_active_data->filetypesFilteredCount =
3843 src_filter_active_data->filetypesFilteredCount;
3844 XtFree(dst_filter_active_data->filetypesFiltered);
3845 dst_filter_active_data->filetypesFiltered =
3846 XtNewString(src_filter_active_data->filetypesFiltered);
3847 dst_filter_active_data->count = ReadInFiletypes(dst_filter_active_data);
3849 /* Copy the Filter edit info from src to dest data */
3850 src_filter_edit_data = (FilterData *) src_data->filter_edit->data;
3851 dst_filter_edit_data = (FilterData *) dst_data->filter_edit->data;
3853 dst_filter_edit_data->match_flag = src_filter_edit_data->match_flag;
3854 dst_filter_edit_data->filter = XtNewString(src_filter_edit_data->filter);
3855 dst_filter_edit_data->show_hidden = src_filter_edit_data->show_hidden;
3856 dst_filter_edit_data->filetypesFilteredCount =
3857 src_filter_edit_data->filetypesFilteredCount;
3858 XtFree(dst_filter_edit_data->filetypesFiltered);
3859 dst_filter_edit_data->filetypesFiltered =
3860 XtNewString(src_filter_edit_data->filetypesFiltered);
3861 dst_filter_edit_data->count = ReadInFiletypes(dst_filter_edit_data);
3863 /* Get the size info (e.g. X, Y) form src to dest data */
3864 XtSetArg (args[0], XmNwidth, &src_width);
3865 XtSetArg (args[1], XmNheight, &src_height);
3866 XtGetValues (((FileMgrRec *) src_data->file_mgr_rec)->shell, args, 2);
3868 dst_data->height = src_height;
3869 dst_data->width = src_width;
3871 /* need to propagate whether its a toolbox or not */
3872 dst_data->toolbox = src_data->toolbox;
3876 /************************************************************************
3879 * Update the list of open tree branches
3881 ************************************************************************/
3885 FileMgrData *file_mgr_data,
3886 DirectorySet *directory_set)
3889 char ** table = NULL;
3894 /* check if the given directory set is already in the table */
3895 if (directory_set && file_mgr_data->branch_list) {
3896 for (i = 0; file_mgr_data->branch_list[i]; i++)
3897 if (strcmp(file_mgr_data->branch_list[i] + 2, directory_set->name) == 0)
3899 /* just update the TreeShow value for this branch and return */
3900 file_mgr_data->branch_list[i][0] = '0' + directory_set->sub_root->ts;
3905 /* free old branch_list, if any */
3906 if (file_mgr_data->branch_list) {
3907 for (i = 0; file_mgr_data->branch_list[i]; i++)
3908 XtFree (file_mgr_data->branch_list[i]);
3909 XtFree((char *)file_mgr_data->branch_list);
3910 file_mgr_data->branch_list = NULL;
3913 /* create new brach list */
3914 for (i = 0; i < file_mgr_data->directory_count; i++) {
3916 if (file_mgr_data->directory_set[i]->sub_root->ts < tsNotRead)
3919 /* get the name of the tree branch */
3920 branch_name = file_mgr_data->directory_set[i]->name;
3922 /* generate table entry */
3923 branch_entry = (char *)XtMalloc(2 + strlen(branch_name) + 1);
3924 branch_entry[0] = '0' + file_mgr_data->directory_set[i]->sub_root->ts;
3925 branch_entry[1] = ':';
3926 strcpy(branch_entry + 2, branch_name);
3928 /* add entry to the table */
3930 table = (char **)XtRealloc((char *)table,
3931 sizeof(char *) * (table_size + 1));
3932 table[table_size - 1] = branch_entry;
3933 table[table_size] = NULL;
3936 file_mgr_data->branch_list = table;
3940 /************************************************************************
3943 * Read the directory contained in host: current_directory and
3944 * build the file data list and reset any related information
3946 ************************************************************************/
3950 FileMgrData *file_mgr_data,
3954 FileMgrRec *file_mgr_rec;
3955 int directory_count;
3956 DirectorySet ** directory_set;
3957 DirectorySet ** new_dir_set;
3958 FileViewData ** new_view_data;
3959 FileViewData *new_renaming,*new_popup_menu_icon=NULL;
3960 FileViewData *file_view_data,*new_drag_file_view_data=NULL;
3963 ObjectPtr position_info;
3970 file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
3971 directory_count = file_mgr_data->directory_count;
3972 directory_set = file_mgr_data->directory_set;
3975 * Read the directory and subdirectories given by branch_list.
3976 * Note: if any directory we need isn't yet in the cache,
3977 * ReadTreeDirectory will just kick off a background process
3978 * to read the directory and return with
3979 * file_mgr_data->busy_status set to busy_readdir.
3981 ReadTreeDirectory (file_mgr_rec->shell, file_mgr_data->host,
3982 file_mgr_data->current_directory,
3983 file_mgr_data, branch_list,
3984 &new_dir_set, &new_dir_count);
3986 /* if directories not ready yet, don't do anything */
3987 if (file_mgr_data->busy_status != not_busy)
3993 * Try to preserve the 'widget' and 'position_info' fields in the
3994 * file_view_data structure, for each file. This will allow us to
3995 * re-use the same Icon widget, to reduce flashing.
3996 * Also preserve ndir & nfile counts (used in FilterFiles to decide
3997 * whether to expand or collapse a tree branch if ndir or nfile
4001 /* loop through the old directory set */
4002 new_renaming = NULL;
4003 for (i = 0; i < directory_count; i++)
4005 /* find a directory with same name in the new directory set */
4006 for (j = 0; j < new_dir_count; j++)
4007 if (strcmp(directory_set[i]->name, new_dir_set[j]->name) == 0)
4010 /* if we couldn't find this directory, continue to the next one */
4011 if (j == new_dir_count)
4014 new_view_data = new_dir_set[j]->file_view_data;
4015 new_file_count = new_dir_set[j]->file_count;
4017 /* loop throught the old file list */
4018 for (j = 0; j < directory_set[i]->file_count; j++)
4020 file_view_data = directory_set[i]->file_view_data[j];
4021 position_info = file_view_data->position_info;
4024 * Find a file by the same name in the new file list.
4026 for (k = 0; k < new_file_count; k++)
4028 if (new_view_data[k]->file_data == file_view_data->file_data)
4030 /* Fix for defect 5029 */
4031 if(file_mgr_data->popup_menu_icon && file_view_data->file_data==
4032 file_mgr_data->popup_menu_icon->file_data)
4033 new_popup_menu_icon = new_view_data[k];
4035 /* Fix for defect 5703 */
4036 if ( file_mgr_data->drag_file_view_data &&
4037 file_mgr_data->drag_file_view_data->file_data ==
4038 file_view_data->file_data)
4039 new_drag_file_view_data = new_view_data[k];
4041 if (file_view_data == file_mgr_data->renaming)
4042 new_renaming = new_view_data[k];
4044 /* re-use the old widgets */
4045 new_view_data[k]->widget = file_view_data->widget;
4046 new_view_data[k]->treebtn = file_view_data->treebtn;
4047 new_view_data[k]->registered = file_view_data->registered;
4049 /* preserve ndir, nfile counts */
4050 new_view_data[k]->ndir = file_view_data->ndir;
4051 new_view_data[k]->nfile = file_view_data->nfile;
4053 /* preserve the position info */
4056 new_view_data[k]->position_info = position_info;
4057 position_info->file_view_data = new_view_data[k];
4060 /* preserve icon_mtime */
4061 new_view_data[k]->icon_mtime = file_view_data->icon_mtime;
4067 /* if no file by the same name was found in the new file list,
4068 the file must have gone away ... lets eliminate the
4069 position infomation */
4070 if (position_info && k == new_file_count)
4072 for (k = 0; k < file_mgr_data->num_objects; k++)
4074 if (file_mgr_data->object_positions[k] == position_info)
4076 /* @@@ what does this do? */
4077 position_info->late_bind = True;
4078 position_info->y += (file_view_data->widget->core.height / 2);
4085 /* replace the old directory set */
4086 file_mgr_data->directory_set = new_dir_set;
4087 file_mgr_data->directory_count = new_dir_count;
4088 file_mgr_data->renaming = new_renaming;
4089 file_mgr_data->popup_menu_icon = new_popup_menu_icon;
4090 file_mgr_data->drag_file_view_data = new_drag_file_view_data;
4092 /* Get the file types and the files sorted and filtered */
4093 for (i = 0; i < new_dir_count; i++)
4095 OrderFiles (file_mgr_data, new_dir_set[i]);
4096 FilterFiles (file_mgr_data, new_dir_set[i]);
4097 file_mgr_data->tree_root->filtered =
4098 file_mgr_data->show_type != MULTIPLE_DIRECTORY;
4100 SelectVisible(file_mgr_data);
4102 /* update the branch_list */
4103 UpdateBranchList(file_mgr_data, NULL);
4105 /* Update the selection list */
4107 while (j < file_mgr_data->selected_file_count)
4109 file_view_data = file_mgr_data->selection_list[j];
4111 /* See if the selected file is still around */
4113 for (i = 0; !match && i < new_dir_count; i++)
4115 for (k = 0; k < new_dir_set[i]->file_count; k++)
4117 if (file_view_data->file_data ==
4118 new_dir_set[i]->file_view_data[k]->file_data)
4122 file_mgr_data->selection_list[j] =
4123 new_dir_set[i]->file_view_data[k];
4128 /* Keep the file selected only if it was found in the new
4129 * directory set and if it is not filtered */
4130 if (match && !file_view_data->filtered)
4133 DeselectFile (file_mgr_data, file_view_data, False);
4136 /* free the old directory set */
4137 FreeLayoutData(file_mgr_data->layout_data);
4138 file_mgr_data->layout_data = NULL;
4139 FreeDirectorySet(directory_set, directory_count);
4141 /* Set the menu activation to reflect and changes in the selection. */
4143 if(file_mgr_data != trashFileMgrData
4144 && file_mgr_data != NULL )
4146 if (file_mgr_data->selected_file_count == 0)
4147 ActivateNoSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec);
4148 else if (file_mgr_data->selected_file_count == 1)
4149 ActivateSingleSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec,
4150 file_mgr_data->selection_list[0]->file_data->logical_type);
4152 ActivateMultipleSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec);
4155 SensitizeTrashBtns();
4157 /* load positional data for this directory */
4158 if ( (file_mgr_data->positionEnabled == RANDOM_ON)
4159 && ( (file_mgr_rec->menuStates & CLEAN_UP_OP) == 0)
4161 LoadPositionInfo(file_mgr_data);
4166 /************************************************************************
4169 * Search for a directory in branch list.
4171 ************************************************************************/
4175 FileMgrData *file_mgr_data,
4177 char *directory_name,
4183 if (branch_list == NULL)
4186 for (i = 0; branch_list[i]; i++)
4187 if (strcmp(branch_list[i] + 2, directory_name) == 0) {
4188 ts = branch_list[i][0] - '0';
4189 if (ts == tsNotRead)
4192 if (ts == tsAll && file_mgr_data->tree_files == TREE_FILES_NEVER)
4194 else if (ts == tsDirs && file_mgr_data->tree_files == TREE_FILES_ALWAYS)
4206 /************************************************************************
4209 * Read a directory and sub directories.
4211 ************************************************************************/
4213 static FileViewData *
4215 FileMgrData *file_mgr_data,
4217 char *directory_name,
4225 /* allocate new FileData */
4226 fp = (FileData *) XtMalloc(sizeof(FileData));
4227 memset(fp, 0, sizeof(FileData));
4230 if (strcmp(directory_name, "/") == 0)
4231 fp->file_name = XtNewString("/");
4234 p = strrchr(directory_name, '/');
4236 fp->file_name = XtNewString(p + 1);
4238 fp->file_name = XtNewString(directory_name);
4241 /* assume it's a directory for now ... */
4242 fp->is_subdir = True;
4244 /* @@@ do a readlink here ... */
4246 /* allocate FileViewData */
4247 ip = (FileViewData *)XtMalloc(sizeof(FileViewData));
4248 memset(ip, 0, sizeof(FileViewData));
4251 if (QueryBranchList(file_mgr_data, branch_list, directory_name, &ts) &&
4256 else if (file_mgr_data->tree_files == TREE_FILES_ALWAYS)
4270 * Recursively count the number of subdirectores we have read.
4275 if (ip->file_data->is_subdir && ip->ts != tsNotRead)
4278 for (dp = ip->desc; dp; dp = dp->next)
4279 CountDirectories(dp, np);
4283 static DirectorySet *
4287 FileMgrData *file_mgr_data)
4293 /* allocate a new directory set entry */
4294 ds = (DirectorySet *)XtMalloc(sizeof(DirectorySet));
4296 /* initialize the directory set entry */
4297 ds->name = XtNewString(name);
4300 for (dp = ip->desc; dp; dp = dp->next)
4302 if (ds->file_count != 0)
4303 ds->file_view_data =
4304 (FileViewData **)XtMalloc(ds->file_count*sizeof(FileViewData *));
4306 ds->file_view_data = NULL;
4308 for (dp = ip->desc, i = 0; dp; dp = dp->next, i++) {
4309 ds->file_view_data[i] = dp;
4310 dp->directory_set = (XtPointer)ds;
4312 ds->order_list = NULL;
4313 ds->filtered_file_count = 0;
4314 ds->invisible_file_count = 0;
4315 ds->file_mgr_data = (XtPointer)file_mgr_data;
4323 FileMgrData *file_mgr_data,
4325 DirectorySet **directory_set,
4328 * Recursively add directores to the directory set array.
4331 char fullname[MAX_PATH];
4334 if (ip->file_data->is_subdir && ip->ts != tsNotRead)
4336 /* add a new entry to the directory set array */
4337 GetFullName(file_mgr_data, ip, fullname);
4338 directory_set[*index] = NewDirectorySet(fullname, ip, file_mgr_data);
4342 for (dp = ip->desc; dp; dp = dp->next)
4343 MakeDirectorySets(file_mgr_data, dp, directory_set, index);
4351 char *directory_name,
4352 FileMgrData *file_mgr_data,
4354 DirectorySet ***directory_set,
4355 int *directory_count)
4357 FileViewData *ip, *dp;
4360 /* eliminate "/." */
4361 if (strcmp(directory_name, "/.") == 0)
4362 directory_name = "/";
4364 /* if not in tree mode, clear branch_list (@@@ really?) */
4365 if (file_mgr_data->show_type != MULTIPLE_DIRECTORY)
4368 /* get a FileViewData for the tree root */
4369 file_mgr_data->tree_root = ip =
4370 GetTopInfo(file_mgr_data, host_name, directory_name, branch_list);
4372 /* read the directory tree */
4373 rc = ReadDir(w, file_mgr_data, host_name, directory_name, ip,
4374 0, file_mgr_data->tree_preread_level, branch_list);
4375 if (file_mgr_data->busy_status != not_busy)
4377 /* No point in continuing any further, free up all 'ip' and return */
4378 XtFree(ip->file_data->file_name);
4379 XtFree((char *)ip->file_data);
4381 file_mgr_data->tree_root = NULL;
4387 /* update root FileData from "." */
4388 for (dp = ip->desc; dp; dp = dp->next)
4389 if (strcmp(dp->file_data->file_name, ".") == 0) {
4390 ip->file_data->physical_type = dp->file_data->physical_type;
4391 ip->file_data->logical_type =
4392 GetDirectoryLogicalType(file_mgr_data, directory_name);
4393 ip->file_data->errnum = dp->file_data->errnum;
4394 ip->file_data->stat = dp->file_data->stat;
4395 ip->file_data->is_broken = dp->file_data->is_broken;
4399 *directory_count = 0;
4400 CountDirectories(ip, directory_count);
4402 /* allocate array of directory set pointers */
4404 (DirectorySet **) XtMalloc ((*directory_count + 1)*sizeof(DirectorySet *));
4406 /* make a fake directory set for the tree root */
4408 char fullname[MAX_PATH];
4412 ds = (DirectorySet *)XtMalloc(sizeof(DirectorySet));
4413 ip->directory_set = (XtPointer)ds;
4415 strcpy(fullname, directory_name);
4416 p = strrchr(fullname, '/');
4419 ds->name = XtNewString(fullname);
4420 ds->sub_root = NULL;
4422 ds->file_view_data =
4423 (FileViewData **)XtMalloc(sizeof(FileViewData *));
4424 ds->file_view_data[0] = ip;
4426 (FileViewData **)XtMalloc(sizeof(FileViewData *));
4427 ds->order_list[0] = ip;
4428 ds->filtered_file_count = 1;
4429 ds->file_mgr_data = (XtPointer)file_mgr_data;
4431 (*directory_set)[0] = ds;
4435 /* make directory sets for the current dir and subdirs */
4437 MakeDirectorySets(file_mgr_data, ip, *directory_set, &i);
4441 /*--------------------------------------------------------------------
4443 *------------------------------------------------------------------*/
4450 * Decide if entry is currently displayed.
4455 /* filtered files are not shown */
4459 /* in flat mode all un-filtered files are shown */
4460 if (fmd->show_type == SINGLE_DIRECTORY)
4463 /* in tree mode an entry is shown only if user chooses to */
4464 ts = ip->parent? ip->parent->ts: tsDirs;
4467 else if (ts == tsDirs)
4468 return ip->file_data->is_subdir;
4477 FileViewData *dp, /* directory entry being searched */
4478 int level) /* tree depth level of this entry */
4480 * Recursively determine the display position of a given entry
4481 * Return false if the entry not currently displayed
4486 /* skip entries that are not displayed */
4487 if (level > 0 && !IsShown(fmd, dp))
4490 /* this entry is displayed */
4491 dp->displayed = True;
4493 /* traverse subtree */
4496 for (ip = dp->desc; ip; ip = ip->next)
4497 SetDisplayedRecur(fmd, ip, level);
4504 SelectVisible (FileMgrData *file_mgr_data)
4508 /* assume nothing displayed */
4509 for (i = 0; i < file_mgr_data->directory_count; i++)
4510 for (j = 0; j < file_mgr_data->directory_set[i]->file_count; j++)
4511 file_mgr_data->directory_set[i]->file_view_data[j]->displayed = False;
4513 /* set the displayed flag for all entries that are actually shown */
4514 SetDisplayedRecur(file_mgr_data, file_mgr_data->tree_root, 0);
4515 if (file_mgr_data->show_type == SINGLE_DIRECTORY)
4516 file_mgr_data->tree_root->displayed = False;
4520 /*--------------------------------------------------------------------
4521 * expand tree branches
4522 *------------------------------------------------------------------*/
4525 * UpdateBranchState:
4526 * Determine new tree brach expansion state after a subdirectory has
4527 * been re-read (op == BRANCH_UPDATE), or after the user has requested
4528 * to expand (op == BRANCH_EXPAND) or collapse (op == BRANCH_COLLAPSE)
4533 FileMgrData *file_mgr_data,
4538 TreeShow old_ts = ip->ts;
4540 if (ip->ts == tsReading && op == BRANCH_UPDATE)
4548 /* this is a new branch that's currently being read */
4552 else if (ip->ts == tsError)
4554 /* can't expand or collaps this branch */
4558 else if (op == BRANCH_UPDATE) /* update */
4562 else if (op == BRANCH_EXPAND) /* show more */
4564 if (file_mgr_data->tree_files == TREE_FILES_NEVER)
4566 if (ip->ts == tsNone || !showEmptySet && ip->ndir == 0)
4574 if (ip->ndir == 0 && ip->nfile == 0)
4576 /* the subdir is empty */
4579 else if (ip->ts == tsNone)
4584 else if (ip->ts == tsAll)
4586 else if (ip->ts == tsNone &&
4587 ip->ndir > 0 && ip->nfile > 0 &&
4588 file_mgr_data->tree_files == TREE_FILES_CHOOSE)
4596 (ip->nfile == 0 || file_mgr_data->tree_files == TREE_FILES_NEVER) &&
4599 DirectorySet *directory_set = (DirectorySet *)ip->directory_set;
4600 FileMgrData *file_mgr_data = (FileMgrData *)directory_set->file_mgr_data;
4601 FileMgrRec *file_mgr_rec = (FileMgrRec *)file_mgr_data->file_mgr_rec;
4606 msg = GETMESSAGE(12,18, "The folder %s is empty.");
4608 msg = GETMESSAGE(12,19, "The folder %s contains no subdirectories.");
4610 sprintf(buf, msg, ip->file_data->file_name);
4611 SetSpecialMsg( file_mgr_rec, file_mgr_data, buf );
4615 else if (op == BRANCH_COLLAPSE) /* show less */
4619 if (file_mgr_data->tree_files == TREE_FILES_NEVER)
4621 if (ip->ts == tsNone || !showEmptySet && ip->ndir == 0)
4628 if (ip->ndir == 0 && ip->nfile == 0)
4630 /* the subdir is empty */
4633 else if (ip->ts == tsNone)
4638 else if (ip->ts == tsNone)
4640 else if (ip->ts == tsAll &&
4641 ip->ndir > 0 && ip->nfile > 0 &&
4642 file_mgr_data->tree_files == TREE_FILES_CHOOSE)
4653 * Expand (expand == True) or collpase (expand == False) a tree branch.
4657 FileMgrData *file_mgr_data,
4661 FileMgrRec *file_mgr_rec = (FileMgrRec *) file_mgr_data->file_mgr_rec;
4662 DirectorySet *directory_set;
4663 int level, i, n, old_count, rc;
4669 GetAncestorInfo(file_mgr_data, ip, &level, path, NULL);
4670 SetSpecialMsg( file_mgr_rec, file_mgr_data, NULL );
4675 new_branch = (ip->ts == tsNotRead || ip->ts == tsError);
4678 /* we need to read the sub directory */
4679 _DtTurnOnHourGlass (file_mgr_rec->shell);
4680 if (ip->ts == tsError)
4682 if (file_mgr_data->busy_status == not_busy)
4684 file_mgr_data->busy_detail = 0;
4685 file_mgr_data->busy_status = initiating_readdir;
4687 RereadDirectory (file_mgr_rec->shell, file_mgr_data->host, path);
4688 if (file_mgr_data->busy_status == initiating_readdir)
4689 file_mgr_data->busy_status = not_busy;
4691 rc = ReadDir(file_mgr_rec->shell, file_mgr_data,
4692 file_mgr_data->host, path, ip,
4693 level, level, NULL);
4695 /* create new directory set entry */
4696 directory_set = NewDirectorySet(path, ip, file_mgr_data);
4698 /* if this is a new entry, add it to the directory set */
4699 if (ip->ts == tsNotRead)
4701 file_mgr_data->directory_set =
4703 XtRealloc((char *)(file_mgr_data->directory_set - 1),
4704 (file_mgr_data->directory_count + 2)*sizeof(DirectorySet *))) + 1;
4705 file_mgr_data->directory_set[file_mgr_data->directory_count] =
4707 file_mgr_data->directory_count++;
4711 /* otherwise, replace the existing entry */
4712 for (i = 0; i < file_mgr_data->directory_count; i++)
4713 if (strcmp(file_mgr_data->directory_set[i]->name, path) == 0)
4715 XtFree(file_mgr_data->directory_set[i]->name);
4716 file_mgr_data->directory_set[i]->name = NULL;
4717 if (file_mgr_data->directory_set[i]->file_view_data != NULL)
4718 XtFree((char *)file_mgr_data->directory_set[i]->file_view_data);
4719 file_mgr_data->directory_set[i]->file_view_data = NULL;
4720 XtFree((char *)file_mgr_data->directory_set[i]);
4721 file_mgr_data->directory_set[i] = directory_set;
4725 ip->ts == tsError && file_mgr_data->busy_status == busy_readdir)
4730 if (file_mgr_data->busy_status != busy_readdir)
4732 OrderFiles (file_mgr_data, directory_set);
4733 FilterFiles (file_mgr_data, directory_set);
4734 file_mgr_data->newSize = True;
4735 AddFileIcons(file_mgr_rec, file_mgr_data, directory_set);
4739 /* expand the branch */
4740 UpdateBranchState(file_mgr_data, ip, BRANCH_EXPAND,
4741 new_branch && file_mgr_data->busy_status == busy_readdir);
4745 /* collaps the branch */
4746 UpdateBranchState(file_mgr_data, ip, BRANCH_COLLAPSE, False);
4749 /* change tree button */
4750 if (file_mgr_data->busy_status != busy_readdir)
4752 px = GetTreebtnPixmap(file_mgr_data, ip);
4753 XtSetArg(args[0], XmNlabelPixmap, px);
4754 XtSetValues (ip->treebtn, args, 1);
4757 for (i = 0; i < file_mgr_data->directory_count; i++)
4758 if (strcmp(file_mgr_data->directory_set[i]->name, path) == 0)
4761 SelectVisible(file_mgr_data);
4762 UpdateBranchList(file_mgr_data, file_mgr_data->directory_set[i]);
4764 UnmanageFileIcons(file_mgr_rec, file_mgr_data, ip);
4765 EraseTreeLines(file_mgr_rec, file_mgr_data, ip);
4767 /* update the "Hidden" count */
4768 UpdateHeaders(file_mgr_rec, file_mgr_data, False);
4772 /************************************************************************
4775 * Free up the directory set data.
4777 ************************************************************************/
4781 DirectorySet ** directory_set,
4782 int directory_count)
4789 for (i = -1; i < directory_count; i++)
4791 if (directory_set[i] == NULL)
4794 XtFree ((char *) directory_set[i]->name);
4795 for (j = 0; j < directory_set[i]->file_count; j++)
4797 if( (char *) directory_set[i]->file_view_data[j]->label)
4799 XtFree ((char *) directory_set[i]->file_view_data[j]->label);
4800 directory_set[i]->file_view_data[j]->label = NULL;
4802 XtFree ((char *) directory_set[i]->file_view_data[j]);
4803 directory_set[i]->file_view_data[j] = NULL;
4805 if (directory_set[i]->file_view_data != NULL)
4806 XtFree ((char *) directory_set[i]->file_view_data);
4807 XtFree ((char *) directory_set[i]->order_list);
4808 XtFree ((char *) directory_set[i]);
4811 XtFree ((char *) (directory_set - 1));
4815 /************************************************************************
4818 * Free up the current directory and the directory set data.
4820 ************************************************************************/
4824 FileMgrData *file_mgr_data )
4826 if(file_mgr_data->object_positions)
4827 FreePositionInfo(file_mgr_data);
4829 if (file_mgr_data->current_directory != NULL)
4830 XtFree ((char *) file_mgr_data->current_directory);
4831 file_mgr_data->current_directory = NULL;
4833 if (file_mgr_data->host != NULL)
4834 XtFree ((char *) file_mgr_data->host);
4835 file_mgr_data->host = NULL;
4837 FreeLayoutData(file_mgr_data->layout_data);
4838 file_mgr_data->layout_data = NULL;
4839 FreeDirectorySet(file_mgr_data->directory_set,
4840 file_mgr_data->directory_count);
4841 file_mgr_data->directory_set = NULL;
4847 /************************************************************************
4850 * Close (destroy) the file browser view. This callback is issued
4851 * from both the Close menu item and the Close system menu.
4853 ************************************************************************/
4858 XtPointer client_data,
4859 XtPointer call_data )
4861 FileMgrRec * file_mgr_rec;
4862 DialogData * dialog_data;
4864 Widget mbar = XmGetPostedFromWidget(XtParent(w));
4867 XmUpdateDisplay (w);
4869 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
4870 XtGetValues(mbar, args, 1);
4871 /* Ignore accelerator received after we're unposted */
4872 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
4875 CloseView (dialog_data);
4881 /************************************************************************
4884 * Function called from a close on the system menu.
4886 ************************************************************************/
4893 FileMgrRec * file_mgr_rec;
4894 DialogData * dialog_data;
4897 file_mgr_rec = (FileMgrRec *) data;
4898 dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec);
4900 CloseView (dialog_data);
4905 /************************************************************************
4908 * Set the icon name and icon to be used for a file manager view.
4910 ************************************************************************/
4914 FileMgrRec *file_mgr_rec,
4915 FileMgrData *file_mgr_data,
4916 char *directory_name )
4918 static Pixmap tool_icon = XmUNSPECIFIED_PIXMAP;
4919 static Pixmap dir_icon = XmUNSPECIFIED_PIXMAP;
4920 static Pixmap tool_mask = XmUNSPECIFIED_PIXMAP;
4921 static Pixmap dir_mask = XmUNSPECIFIED_PIXMAP;
4922 char * new_directory_name;
4923 Pixel background, foreground, top_shadow, bottom_shadow, select;
4926 unsigned int height;
4929 Boolean havePixmap = False;
4930 Boolean haveMask = False;
4931 Boolean root = False;
4933 char *ptr, *fileLabel, *fileName;
4935 if (tool_icon == XmUNSPECIFIED_PIXMAP)
4937 XtSetArg (args[0], XmNbackground, &background);
4938 XtSetArg (args[1], XmNcolormap, &colormap);
4939 XtGetValues (file_mgr_rec->main, args, 2);
4941 XmGetColors (XtScreen (file_mgr_rec->main), colormap, background,
4942 &foreground, &top_shadow, &bottom_shadow, &select);
4944 /* first get the File Manager's Icon */
4945 pixmap = XmGetPixmap (XtScreen (file_mgr_rec->main), fileMgrIcon,
4946 foreground, background);
4947 if( pixmap != XmUNSPECIFIED_PIXMAP)
4950 /* now let's get the mask for the File Manager */
4951 pixmap = _DtGetMask (XtScreen (file_mgr_rec->main), fileMgrIcon);
4952 if( pixmap != XmUNSPECIFIED_PIXMAP)
4955 /* Let's get the Application Manager's Icon */
4956 pixmap = XmGetPixmap (XtScreen (file_mgr_rec->main), appMgrIcon,
4957 foreground, background);
4958 if( pixmap != XmUNSPECIFIED_PIXMAP)
4961 /* now let's get the mask for the Application Manager */
4962 pixmap = _DtGetMask (XtScreen (file_mgr_rec->main), appMgrIcon);
4963 if( pixmap != XmUNSPECIFIED_PIXMAP)
4969 if (fileLabel = DtDtsFileToAttributeValue(directory_name, DtDTS_DA_LABEL))
4971 else if (fileName = strrchr(directory_name, '/'))
4976 if(file_mgr_data->title)
4978 if(file_mgr_data->toolbox)
4980 if(strcmp(directory_name, file_mgr_data->restricted_directory) == 0)
4982 new_directory_name =
4983 (char *)XtMalloc(strlen(file_mgr_data->title) + 1);
4984 strcpy( new_directory_name, file_mgr_data->title );
4988 new_directory_name = (char *)XtMalloc( strlen(ptr) + 1 );
4989 sprintf(new_directory_name, "%s", ptr);
4994 new_directory_name = (char *)XtMalloc( strlen(ptr) + 1);
4995 sprintf(new_directory_name, "%s", ptr);
5001 if (strcmp (directory_name, "/") == 0 && !fileLabel)
5003 new_directory_name = (char *)XtMalloc(strlen(file_mgr_data->host) +
5004 strlen(root_title) + 3);
5005 sprintf( new_directory_name, "%s:%s", file_mgr_data->host, root_title );
5009 new_directory_name = ptr;
5012 XtSetArg (args[0], XmNiconName, new_directory_name);
5014 if(file_mgr_data->toolbox && tool_icon != XmUNSPECIFIED_PIXMAP)
5017 XtSetArg (args[1], XmNiconPixmap, tool_icon);
5018 if( tool_mask != XmUNSPECIFIED_PIXMAP)
5021 XtSetArg (args[2], XmNiconMask, tool_mask);
5024 else if (dir_icon != XmUNSPECIFIED_PIXMAP)
5027 XtSetArg (args[1], XmNiconPixmap, dir_icon);
5028 if( dir_mask != XmUNSPECIFIED_PIXMAP)
5031 XtSetArg (args[2], XmNiconMask, dir_mask);
5038 XtSetValues (file_mgr_rec->shell, args, 3);
5040 XtSetValues (file_mgr_rec->shell, args, 2);
5043 XtSetValues (file_mgr_rec->shell, args, 1);
5046 DtDtsFreeAttributeValue(fileLabel);
5048 XtFree(new_directory_name);
5054 * Menu callback for the fast change directory toggle. Toggles the text
5055 * field up and down.
5058 ShowChangeDirField (
5060 XtPointer client_data,
5063 FileMgrRec * file_mgr_rec;
5064 DialogData * dialog_data;
5065 FileMgrData * file_mgr_data;
5071 /* Set the menu item to insensitive to prevent multiple */
5072 /* dialogs from being posted and get the area under the */
5073 /* menu pane redrawn. */
5077 if((intptr_t) client_data == FM_POPUP)
5080 mbar = XmGetPostedFromWidget(XtParent(w));
5081 XmUpdateDisplay (w);
5082 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
5083 XtGetValues(mbar, args, 1);
5087 /* Done only during a restore session */
5088 file_mgr_rec = (FileMgrRec *)client_data;
5091 /* Got an accelerator after we were unposted */
5092 if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
5094 file_mgr_data = (FileMgrData *) dialog_data->data;
5096 /* Toggle the state of the text field */
5097 if (XtIsManaged(file_mgr_rec->current_directory_text))
5099 XtSetArg (args[0], XmNallowShellResize, False);
5100 XtSetValues(file_mgr_rec->shell, args, 1);
5101 XtUnmanageChild(file_mgr_rec->current_directory_text);
5102 XtSetArg (args[0], XmNallowShellResize, True);
5103 XtSetValues(file_mgr_rec->shell, args, 1);
5104 file_mgr_data->fast_cd_enabled = False;
5107 ShowFastChangeDir(file_mgr_rec, file_mgr_data);
5113 * Class function for forcing the focus to the text field, if visible, each
5114 * time the FileMgr dialog is posted.
5119 FileMgrRec * file_mgr_rec,
5120 FileMgrData * file_mgr_data)
5122 /* Force the focus to the text field */
5123 if (file_mgr_data->fast_cd_enabled)
5125 XRaiseWindow(XtDisplay(file_mgr_rec->current_directory_text),
5126 XtWindow(file_mgr_rec->current_directory_text));
5127 XmProcessTraversal(file_mgr_rec->current_directory_text,
5128 XmTRAVERSE_CURRENT);
5134 * This function free up any position information associated with the
5135 * dtfile view, and nulls out the associated data fields.
5140 FileMgrData * file_mgr_data)
5143 FileViewData **file_view_data;
5145 /* free object positions */
5146 for (i = 0; i < file_mgr_data->num_objects; i++)
5148 XtFree(file_mgr_data->object_positions[i]->name);
5149 XtFree((char *)file_mgr_data->object_positions[i]);
5150 file_mgr_data->object_positions[i] = NULL;
5153 XtFree((char *)file_mgr_data->object_positions);
5155 file_mgr_data->object_positions = NULL;
5156 file_mgr_data->num_objects = 0;
5158 /* clear references to object positions in file_view_data */
5159 for (i = 0; i < file_mgr_data->directory_count; i++)
5161 file_view_data = file_mgr_data->directory_set[i]->file_view_data;
5162 for (j = 0; j < file_mgr_data->directory_set[i]->file_count; j++)
5163 file_view_data[j]->position_info = NULL;
5169 * This function determines whether random positioning is currently enabled
5170 * for this view. The decision is based upon they type of the view, and
5171 * the current preferences settings.
5175 PositioningEnabledInView (
5176 FileMgrData * file_mgr_data)
5179 if ((file_mgr_data->show_type == SINGLE_DIRECTORY) &&
5180 (file_mgr_data->view != BY_ATTRIBUTES) &&
5181 (file_mgr_data->positionEnabled == RANDOM_ON))
5191 * This function is similar to the above function, but is less restrictive;
5192 * this function does not require that the view currently have positioning
5193 * enabled; it simply returns whether the view has positioning info.
5198 FileMgrData * file_mgr_data)
5201 if ((file_mgr_data->object_positions) &&
5202 (file_mgr_data->positionEnabled == RANDOM_ON))
5212 * When a new view of a directory is spun off of an existing view of that
5213 * directory, we want the new view to inherit the positioning information
5214 * associated with the original view. This function takes care of that.
5218 InheritPositionInfo (
5219 FileMgrData * src_file_mgr_data,
5220 FileMgrData * dest_file_mgr_data)
5223 ObjectPosition *ptr;
5224 ObjectPosition **temp_stack;
5226 if (!PositionFlagSet(src_file_mgr_data))
5228 /* Nothing to inherit */
5229 dest_file_mgr_data->num_objects = 0;
5230 dest_file_mgr_data->object_positions = NULL;
5234 dest_file_mgr_data->num_objects = src_file_mgr_data->num_objects;
5235 dest_file_mgr_data->object_positions = (ObjectPosition **) XtMalloc(
5236 sizeof(ObjectPosition *) * dest_file_mgr_data->num_objects);
5238 temp_stack = (ObjectPosition **) XtMalloc(
5239 sizeof(ObjectPosition *) * dest_file_mgr_data->num_objects);
5241 for (i = 0; i < dest_file_mgr_data->num_objects; i++)
5243 ptr = dest_file_mgr_data->object_positions[i] = (ObjectPosition *)
5244 XtMalloc(sizeof(ObjectPosition));
5246 *ptr = *(src_file_mgr_data->object_positions[i]);
5247 ptr->name = XtNewString(ptr->name);
5248 ptr->file_view_data = NULL;
5252 temp_stack[ptr->stacking_order - 1] = ptr;
5255 for(i = 0; i < dest_file_mgr_data->num_objects; i++)
5257 if(dest_file_mgr_data->object_positions[i]->stacking_order == 1)
5259 dest_file_mgr_data->object_positions[i]->next =
5260 temp_stack[dest_file_mgr_data->object_positions[i]->stacking_order];
5263 else if(dest_file_mgr_data->object_positions[i]->stacking_order ==
5264 dest_file_mgr_data->num_objects)
5266 dest_file_mgr_data->object_positions[i]->prev =
5267 temp_stack[dest_file_mgr_data->object_positions[i]->
5268 stacking_order - 2];
5272 dest_file_mgr_data->object_positions[i]->prev =
5273 temp_stack[dest_file_mgr_data->object_positions[i]->
5274 stacking_order - 2];
5275 dest_file_mgr_data->object_positions[i]->next =
5276 temp_stack[dest_file_mgr_data->object_positions[i]->stacking_order];
5280 XtFree((char *)temp_stack);
5285 * This function saves the current position information (if any) in the
5286 * associated directory; if there is no positional data, then any old
5287 * position files in this directory are removed. The entries are written
5288 * according to their position (left to right, top to bottom), not according
5289 * to their relative stacking order.
5294 FileMgrData * file_mgr_data)
5297 PositionInfo *position_info;
5298 ObjectPosition * ptr;
5301 /* Copy object positions into position info array */
5302 if (file_mgr_data->num_objects <= 0)
5303 position_info = NULL;
5306 position_info = (PositionInfo *)
5307 XtMalloc(file_mgr_data->num_objects * sizeof(PositionInfo));
5308 for (i = 0; i < file_mgr_data->num_objects; i++)
5310 ptr = file_mgr_data->object_positions[i];
5312 position_info[i].name = ptr->name;
5313 position_info[i].x = ptr->x;
5314 position_info[i].y = ptr->y;
5315 position_info[i].stacking_order = ptr->stacking_order;
5319 SetDirectoryPositionInfo(file_mgr_data->host,
5320 file_mgr_data->current_directory,
5321 file_mgr_data->num_objects, position_info);
5323 XtFree((char *)position_info);
5328 * This function will attempt to load any positional data associated with
5329 * the directory to be viewed. Within the positioning file, the entries
5330 * are order in left-to-right, top-to-bottom order, not according to the
5336 FileMgrData * file_mgr_data)
5338 PositionInfo *position_info;
5339 ObjectPosition * ptr;
5343 /* don't do anything if we already have position information */
5344 if (file_mgr_data->object_positions != NULL)
5347 /* Load the number of entries */
5348 numObjects = GetDirectoryPositionInfo(file_mgr_data->host,
5349 file_mgr_data->current_directory, &position_info);
5351 if (numObjects <= 0)
5353 file_mgr_data->object_positions = NULL;
5354 file_mgr_data->num_objects = 0;
5360 /* Proceed with the loading */
5361 file_mgr_data->object_positions = (ObjectPosition **)XtMalloc(
5362 sizeof(ObjectPosition *) * numObjects);
5364 for (i = 0; i < numObjects; i++)
5366 ptr = file_mgr_data->object_positions[i] = (ObjectPosition *)
5367 XtMalloc(sizeof(ObjectPosition));
5368 ptr->name = XtNewString(position_info[i].name);
5369 ptr->x = position_info[i].x;
5370 ptr->y = position_info[i].y;
5371 ptr->in_use = False;
5372 ptr->late_bind = False;
5373 ptr->stacking_order = position_info[i].stacking_order;
5374 ptr->file_view_data = NULL;
5379 /* Repair all of the next and prev pointers */
5380 file_mgr_data->num_objects = i;
5381 RepairStackingPointers(file_mgr_data);
5382 /* OrderChildrenList(file_mgr_data); */
5388 /************************************************************************
5390 * MoveOkCB - the user wishes to actually do the move even though its
5391 * not the desktop object that is actually getting moved.
5392 * This function calls the routines which do the moves. It
5393 * depends on the view type to determine how it does it.
5395 * DESKTOP - the drop happened on a Desktop object
5396 * and the object was a directory
5397 * NOT_DESKTOP_DIR - the drop happened on a directory
5398 * but it wasn't a directory on the desktop.
5399 * NOT_DESKTOP - drop happened in a FileManager view
5400 * and not on a directory.
5403 ************************************************************************/
5407 XtPointer client_data,
5408 XtPointer call_data )
5410 XtUnmanageChild((Widget)client_data);
5411 XmUpdateDisplay((Widget)client_data);
5412 XtDestroyWidget((Widget)client_data);
5417 /************************************************************************
5419 * MoveCancelCB - function called when the user cancels out of the
5420 * Move file question dialog. Just deleted the dialog.
5422 ************************************************************************/
5426 XtPointer client_data,
5427 XtPointer call_data )
5429 FileMgrRec *file_mgr_rec;
5431 XtUnmanageChild((Widget)client_data);
5432 XmUpdateDisplay((Widget)client_data);
5433 XtDestroyWidget((Widget)client_data);
5435 if(view_type == NOT_DESKTOP)
5437 file_mgr_rec = (FileMgrRec *)fm->file_mgr_rec;
5438 LayoutFileIcons(file_mgr_rec, fm, False, True);
5443 RemoveIconInWorkspace(
5445 char * workspaceName )
5447 DesktopRec *desktopWin;
5449 char iconName[MAX_PATH];
5452 for(i = 0; i < desktop_data->numIconsUsed; i++)
5454 desktopWin = desktop_data->desktopWindows[i];
5456 if( strcmp( desktopWin->dir_linked_to, "/" ) == 0 )
5457 sprintf( iconName, "/%s", desktopWin->file_name );
5459 sprintf( iconName, "%s/%s", desktopWin->dir_linked_to, desktopWin->file_name );
5461 DtEliminateDots( iconName );
5463 if( strcmp( fileName, iconName ) == 0
5464 && strcmp( workspaceName, desktopWin->workspace_name ) == 0 )
5466 RemoveDT( desktopWin->shell, (XtPointer) desktopWin,
5473 /*************************************************************************
5475 * CheckMoveType - function used to determine:
5476 * 1) is the file being moved have a reference to a
5478 * 2) if yes: is the file being moved dragged from
5479 * the Desktop (check widget_dragged)?
5480 * 2a) if yes: set up global varibles used by message
5482 * 2b) if no: execute the move, then if one of the objects
5483 * is on the Desktop, move the link to the
5485 * 3) question 1 answer is no: just exectute the move
5487 * Other information:
5489 * DESKTOP - the drop happened on a Desktop object
5490 * and the object was a directory
5491 * NOT_DESKTOP_DIR - the drop happened on a directory
5492 * but it wasn't a directory on the desktop.
5493 * NOT_DESKTOP - drop happened in a FileManager view
5494 * and not on a directory.
5497 **************************************************************************/
5500 FileMgrData *file_mgr_data,
5501 FileViewData *file_view_data,
5502 DirectorySet * directory_data,
5503 DesktopRec * desktopWindow,
5506 unsigned int modifiers,
5517 char directory[MAX_PATH];
5520 Screen *currentScreen;
5522 char * workspace_name;
5526 #ifdef _CHECK_FOR_SPACES
5527 if (_DtSpacesInFileNames(file_set, file_count))
5529 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."));
5530 char * msg = XtNewString(tmpStr);
5531 FileOperationError (toplevel, msg, NULL);
5537 display = XtDisplay(toplevel);
5538 screen = XDefaultScreen(display);
5539 currentScreen = XScreenOfDisplay(display, screen);
5540 rootWindow = RootWindowOfScreen(currentScreen);
5542 if( DtWsmGetCurrentWorkspace(display,rootWindow,&pCurrent) == Success )
5544 workspace_name = XGetAtomName (display, pCurrent);
5545 CleanUpWSName(workspace_name);
5548 /* Fix for the case, when you drop an object from App. Manager on to desktop
5549 and try to move it to File Manager. It must copied for this operation
5550 (modifers == ControlMask). */
5554 Str = (char *)IsAFileOnDesktop2(file_set, file_count, &number,&IsToolBox);
5556 modifiers = ControlMask;
5560 * If number is comes back greater than 0 then at least one of the files
5561 * dropped has a reference to a Desktop object
5563 * If widget_dragged is != NULL then the files dragged are from the
5564 * desktop; in this case set up globals, and post a confirmation dialog.
5566 modifiers &= ~Button2Mask;
5567 modifiers &= ~Button1Mask;
5569 modifiers != ControlMask && modifiers != ShiftMask &&
5570 widget_dragged != NULL)
5572 char *message = NULL;
5574 char *from, *to, *filename;
5576 global_file_count = file_count;
5577 _DtCopyDroppedFileInfo(file_count, file_set, host_set,
5578 &global_file_set, &global_host_set);
5581 fv = file_view_data;
5587 /* desktop object dropped on a desktop directory */
5588 dtWindow = desktopWindow;
5589 fm = (FileMgrData *)NULL;
5590 dd = (DirectorySet *)NULL;
5591 to = (char *)XtMalloc(strlen(directory_data->name) +
5592 strlen(fv->file_data->file_name)+ 2);
5593 sprintf(to, "%s/%s", directory_data->name,
5594 fv->file_data->file_name );
5595 DtEliminateDots(to);
5597 case NOT_DESKTOP_DIR:
5598 /* desktop object dropped on a file view directory icon */
5599 dtWindow = (DesktopRec *)NULL;
5601 dd = directory_data;
5602 to = (char *)XtMalloc(strlen(dd->name) +
5603 strlen(fv->file_data->file_name) + 2);
5604 sprintf( to, "%s/%s",dd->name , fv->file_data->file_name );
5605 (void) DtEliminateDots(to);
5607 default:/* view == NOT_DESKTOP */
5608 /* desktop object dropped in a file manager view */
5609 dtWindow = (DesktopRec *)NULL;
5611 dd = (DirectorySet *)NULL;
5612 to = (char *)XtMalloc(strlen(file_mgr_data->current_directory)
5614 strcpy(to, file_mgr_data->current_directory);
5618 for(i=0; i<file_count; i++)
5620 if(strcmp(file_set[i], to) == 0)
5623 FileMgrRec *file_mgr_rec;
5625 GETMESSAGE(11,16,"A folder cannot be moved into itself.\n%s");
5626 msg = XtNewString(tmpStr);
5627 if(file_view_data == NULL)
5629 file_mgr_rec = (FileMgrRec *)file_mgr_data->file_mgr_rec;
5630 FileOperationError(file_mgr_rec->shell, msg, file_set[i]);
5634 FileOperationError(file_view_data->widget, msg, file_set[i]);
5639 XtFree(workspace_name);
5644 tmpStr = (GETMESSAGE(12,3, "Move File(s)"));
5645 title = XtNewString(tmpStr);
5648 int len = strlen(to);
5652 && file_mgr_data->toolbox )
5654 ptr = strrchr(file_set[0], '/');
5655 ptr1 = (char *)XtMalloc(strlen(to) + strlen(ptr) + 1);
5656 sprintf(ptr1, "%s%s", to, ptr);
5657 ptr1 = _DtResolveAppManPath( ptr1,
5658 file_mgr_data->restricted_directory);
5660 if (strncmp(ptr1, file_set[0], len) == 0)
5669 from = XtNewString( file_set[0] );
5670 ptr = strrchr( from, '/' );
5672 filename = XtNewString("");
5676 ptr = strrchr(file_set[0], '/');
5680 from = (char *)XtMalloc(strlen(file_set[0]) + 1);
5681 strcpy(from, file_set[0]);
5684 filename = (char *)XtMalloc(strlen(ptr) + 1);
5685 strcpy(filename, ptr);
5689 from = (char *)XtMalloc(strlen(ptr) + 1);
5691 filename = XtNewString("");
5695 if( strcmp( from, to ) == 0 )
5697 RemoveIconInWorkspace( file_set[0], workspace_name );
5701 XtFree(workspace_name);
5705 #ifdef sun /* This format statement core dumps on SunOS 4.0.3 and 4.1 */
5706 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?"));
5708 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?"));
5710 message = (char *)XtMalloc(strlen(tmpStr) + strlen(filename) +
5711 strlen(to) + strlen(from) + 1);
5713 sprintf(message, tmpStr, filename, from, to);
5720 int len = strlen(to);
5724 for( i = 0; i < desktop_data->numWorkspaces; ++i )
5726 if( strcmp( workspace_name, desktop_data->workspaceData[i]->name) == 0 )
5728 workspace_num = desktop_data->workspaceData[i]->number;
5733 DeselectAllDTFiles( desktop_data->workspaceData[workspace_num -1] );
5739 && file_mgr_data->toolbox)
5741 to = _DtResolveAppManPath( to,
5742 file_mgr_data->restricted_directory );
5743 for( i = 0; i < number; ++i )
5747 from = (char *)XtNewString( file_set[i] );
5748 ptr = strrchr( from, '/' );
5750 from = _DtResolveAppManPath( from,
5751 file_mgr_data->restricted_directory );
5754 if( strcmp( from, to ) == 0 )
5755 RemoveIconInWorkspace( file_set[i], workspace_name );
5763 for( i = 0; i < number; ++i )
5765 ptr = strrchr(file_set[i], '/');
5769 from = (char *)XtMalloc(strlen(file_set[i]) + 1);
5770 strcpy(from, file_set[i]);
5775 from = (char *)XtMalloc(strlen(ptr) + 1);
5779 if( strcmp( to, from ) == 0 )
5781 RemoveIconInWorkspace( file_set[i], workspace_name );
5794 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?"));
5795 message = (char *)XtMalloc(strlen(tmpStr) + strlen(to) + 1);
5797 sprintf(message, tmpStr, to);
5807 _DtMessageDialog(toplevel, title, message, NULL, TRUE,
5808 MoveCancelCB, MoveOkCB, NULL, HelpRequestCB, False,
5815 XtFree(workspace_name);
5819 XtFree(Str); /* No longer used, so free it up */
5820 XtFree(workspace_name);
5822 * Files are not dragged from the desktop.
5824 * Just execute the operation. The target directory dependings on
5825 * the view type (i.e. DESKTOP, NOT_DESKTOP, or NOT_DESKTOP_DIR).
5830 target_host = desktopWindow->host;
5831 sprintf( directory, "%s/%s", directory_data->name,
5832 file_view_data->file_data->file_name );
5833 DtEliminateDots(directory);
5834 value = FileMoveCopyDesktop (file_view_data, directory,
5835 host_set, file_set, file_count,
5836 modifiers, desktopWindow,
5840 case NOT_DESKTOP_DIR:
5841 target_host = file_mgr_data->host;
5842 sprintf( directory, "%s/%s", directory_data->name,
5843 file_view_data->file_data->file_name );
5844 DtEliminateDots(directory);
5845 value = FileMoveCopy (file_mgr_data,
5846 NULL, directory, target_host,
5847 host_set, file_set, file_count,
5848 modifiers, NULL, NULL);
5851 default:/* view == NOT_DESKTOP */
5852 target_host = file_mgr_data->host;
5853 strcpy(directory, file_mgr_data->current_directory);
5857 RepositionIcons(file_mgr_data, file_set, file_count, drop_x,
5860 value = FileMoveCopy(file_mgr_data,
5861 NULL, directory, target_host,
5862 host_set, file_set, file_count,
5863 modifiers, NULL, NULL);
5870 * If this was a move and any of the files is referenced by a
5871 * Desktop object we need to change the reference to the new
5872 * location that the file moved to.
5874 * @@@ This should really be done in the pipe callback!
5878 modifiers != ControlMask && modifiers != ShiftMask)
5880 Tt_status tt_status;
5882 for(j = 0; j < file_count; j++)
5885 DesktopRec *desktopWin;
5888 * loop through each desktop object to see if the file
5889 * being operated on has a reference to a desktop object.
5890 * If it does change the reference in the desktop object
5892 * NOTE: if we find a desktop object the file references,
5893 * after we've changed the DT object we can't break
5894 * because there might be more than one DT object which
5897 for(i = 0; i < desktop_data->numIconsUsed; i++)
5899 desktopWin = desktop_data->desktopWindows[i];
5900 fileName = ResolveLocalPathName( desktopWin->host, desktopWin->dir_linked_to,
5901 desktopWin->file_name, home_host_name, &tt_status);
5902 if( TT_OK == tt_status && strcmp(fileName, file_set[j]) == 0 )
5905 * if fileName == file_set[j] then the file is on the
5906 * Desktop so change the dir_linked to reference. What the
5907 * new reference is depends on which view type is being
5910 XtFree(desktopWin->host);
5911 desktopWin->host = XtNewString(target_host);
5913 XtFree(desktopWin->dir_linked_to);
5914 desktopWin->dir_linked_to = XtNewString(directory);
5916 XtFree(desktopWin->restricted_directory);
5917 if(file_mgr_data->restricted_directory != NULL)
5918 desktopWin->restricted_directory =
5919 XtNewString(file_mgr_data->restricted_directory);
5921 desktopWin->restricted_directory = NULL;
5923 XtFree(desktopWin->title);
5924 if(file_mgr_data->title != NULL)
5925 desktopWin->title = XtNewString(file_mgr_data->title);
5927 desktopWin->title = NULL;
5929 XtFree(desktopWin->helpVol);
5930 if(file_mgr_data->helpVol != NULL)
5931 desktopWin->helpVol = XtNewString(file_mgr_data->helpVol);
5933 desktopWin->helpVol = NULL;
5935 desktopWin->toolbox = file_mgr_data->toolbox;
5938 } /* for ( i = 0 ...) */
5939 } /* for (j = 0 ...) */
5941 /* since at least one of the file has been moved lets update
5942 the !dtdesktop file */
5943 SaveDesktopInfo(NORMAL_RESTORE);
5950 * This function returns the current working directory settings, used when
5951 * invoking an action. The caller passes in the current directory for the
5952 * command, and we will simply copy it and return new pointers, unless the
5953 * path specifies a directory which is part of the tool/apps area; in this
5954 * case, the cwd is set to the user's home directory.
5956 * The application must free up these two return pointers.
5968 if ((strcmp(home_host_name, viewHost) == 0) && type != NULL)
5972 /* Force app dir and any of its subdirs to use $HOME */
5973 if(strcmp(users_home_dir, "/") != 0)
5975 ptr = strrchr(users_home_dir, '/');
5977 *pwdDirRet = XtNewString(users_home_dir);
5981 *pwdDirRet = XtNewString(users_home_dir);
5982 *pwdHostRet = XtNewString(home_host_name);
5986 /* Simply use the passed in cwd */
5987 *pwdHostRet = XtNewString(viewHost);
5988 *pwdDirRet = XtNewString(viewDir);
5993 CreateFmPopup (Widget w)
5995 Widget popupBtns[FM_POPUP_CHILDREN];
5996 XmString label_string;
6003 /* Create file manager popup menu */
6005 XtSetArg(args[n],XmNmenuAccelerator," "); n++;
6006 XtSetArg(args[n],XmNwhichButton, bMenuButton); n++;
6007 fileMgrPopup.menu = XmCreatePopupMenu(w, "FMPopup", args, n);
6008 XtAddCallback(fileMgrPopup.menu, XmNhelpCallback,
6009 (XtCallbackProc)HelpRequestCB,
6010 HELP_POPUP_MENU_STR);
6013 /* Create file manager title */
6014 fileMgrPopup.title = popupBtns[i] =
6015 (Widget)XmCreateLabelGadget(fileMgrPopup.menu, "fmtitle", NULL, 0);
6019 /* Create title separators */
6020 popupBtns[i++] = XmCreateSeparatorGadget(fileMgrPopup.menu, "sep2",
6024 /* Create 'Properties' option - white space popup */
6025 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 150, "Change Permissions...")));
6026 XtSetArg (args[0], XmNlabelString, label_string);
6027 mnemonic = ((char *)GETMESSAGE(20, 17, "P"));
6028 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6030 fileMgrPopup.wsPopup[BTN_PROPERTIES] = popupBtns[i] =
6031 XmCreatePushButtonGadget (fileMgrPopup.menu, "permissions", args, 2);
6032 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6033 (XtCallbackProc)HelpRequestCB,
6034 HELP_POPUP_MENU_STR);
6036 XmStringFree (label_string);
6039 /* Create 'Find' option -- white space popup */
6040 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 18, "Find...")));
6041 XtSetArg (args[0], XmNlabelString, label_string);
6042 mnemonic = ((char *)GETMESSAGE(20, 19, "F"));
6043 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6045 fileMgrPopup.wsPopup[BTN_FIND] = popupBtns[i] =
6046 XmCreatePushButtonGadget (fileMgrPopup.menu, "find", args, 2);
6047 XtAddCallback (popupBtns[i], XmNactivateCallback,
6048 ShowFindDialog, (XtPointer) FM_POPUP);
6049 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6050 (XtCallbackProc)HelpRequestCB,
6051 HELP_FILE_MENU_STR);
6053 XmStringFree (label_string);
6056 /* Create 'Clean Up' option -- white space popup */
6057 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 99, "Clean Up")));
6058 XtSetArg (args[0], XmNlabelString, label_string);
6059 mnemonic = ((char *)GETMESSAGE(20, 100, "C"));
6060 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6062 fileMgrPopup.wsPopup[BTN_CLEANUP] = popupBtns[i] =
6063 XmCreatePushButtonGadget (fileMgrPopup.menu, "cleanUp", args, 2);
6064 XtAddCallback (popupBtns[i], XmNactivateCallback,
6065 CleanUp, (XtPointer) FM_POPUP);
6066 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6067 (XtCallbackProc)HelpRequestCB,
6068 HELP_CLEAN_UP_COMMAND_STR);
6070 XmStringFree (label_string);
6073 /* Create 'Select All' option -- white space popup */
6074 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 48, "Select All")));
6075 XtSetArg (args[0], XmNlabelString, label_string);
6076 mnemonic = ((char *)GETMESSAGE(20, 51, "S"));
6077 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6079 fileMgrPopup.wsPopup[BTN_SELECTALL] = popupBtns[i] =
6080 XmCreatePushButtonGadget (fileMgrPopup.menu, "selectAll", args, 2);
6081 XtAddCallback (popupBtns[i], XmNactivateCallback,
6082 SelectAll, (XtPointer) FM_POPUP);
6083 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6084 (XtCallbackProc)HelpRequestCB,
6085 HELP_SELECT_ALL_COMMAND_STR);
6087 XmStringFree (label_string);
6090 /* Create 'Unselect All' option -- white space popup */
6091 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 52, "Deselect All")));
6092 XtSetArg (args[0], XmNlabelString, label_string);
6093 mnemonic = ((char *)GETMESSAGE(20, 55, "D"));
6094 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6096 fileMgrPopup.wsPopup[BTN_UNSELECTALL] = popupBtns[i] =
6097 XmCreatePushButtonGadget (fileMgrPopup.menu, "deselectAll", args, 2);
6098 XtAddCallback (popupBtns[i], XmNactivateCallback,
6099 UnselectAll, (XtPointer) FM_POPUP);
6100 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6101 (XtCallbackProc)HelpRequestCB,
6102 HELP_UNSELECT_ALL_COMMAND_STR);
6104 XmStringFree (label_string);
6107 /* Create 'Show Hidden Files' option -- white space popup */
6108 label_string = XmStringCreateLocalized((GETMESSAGE(20, 156, "Show Hidden Objects")));
6109 XtSetArg (args[0], XmNlabelString, label_string);
6110 mnemonic = ((char *)GETMESSAGE(20, 102, "H"));
6111 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6113 fileMgrPopup.wsPopup[BTN_SHOWHIDDEN] = popupBtns[i] =
6114 XmCreateToggleButtonGadget (fileMgrPopup.menu, "showHiddenObjects", args, 2);
6115 XtAddCallback (popupBtns[i], XmNvalueChangedCallback,
6116 ShowHiddenFiles, (XtPointer) FM_POPUP);
6117 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6118 (XtCallbackProc)HelpRequestCB,
6119 HELP_SHOW_HIDDEN_COMMAND_STR);
6121 XmStringFree (label_string);
6124 /* Manage white space popup buttons -- since XmNadjustMargin defaults */
6125 /* to true, we manage these buttons now so that they will be aligned */
6126 /* according to the 'ShowHiddenFiles' toggle button */
6127 XtManageChildren(fileMgrPopup.wsPopup, WS_BTNS);
6130 /* Adjust XmNadjustMargin such that the rest of the popup buttons will */
6131 /* NOT be forced to align with the 'ShowHiddenFiles' toggle button */
6132 XtSetArg(args[0], XmNadjustMargin, False);
6133 XtSetValues(fileMgrPopup.menu, args, 1);
6136 /* Create 'Properties' option - object popup */
6137 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 150, "Change Permissions...")));
6138 XtSetArg (args[0], XmNlabelString, label_string);
6139 mnemonic = ((char *)GETMESSAGE(20, 17, "P"));
6140 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6142 fileMgrPopup.objPopup[BTN_PROPERTIES] = popupBtns[i] =
6143 XmCreatePushButtonGadget (fileMgrPopup.menu, "permissions", args, 2);
6144 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6145 (XtCallbackProc)HelpRequestCB,
6146 HELP_POPUP_MENU_STR);
6148 XmStringFree (label_string);
6151 /* Create 'Put In Workspace' option -- object popup */
6152 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 84, "Put in Workspace")));
6153 XtSetArg (args[0], XmNlabelString, label_string);
6154 mnemonic = ((char *)GETMESSAGE(20, 85, "W"));
6155 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6157 fileMgrPopup.objPopup[BTN_PUTON] = popupBtns[i] =
6158 XmCreatePushButtonGadget (fileMgrPopup.menu, "putInWorkspace", args, 2);
6159 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6160 (XtCallbackProc)HelpRequestCB,
6161 HELP_POPUP_MENU_STR);
6163 XmStringFree (label_string);
6166 /* Create 'Delete To Trash' option -- object popup */
6167 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 151, "Put in Trash")));
6168 XtSetArg (args[0], XmNlabelString, label_string);
6169 mnemonic = ((char *)GETMESSAGE(20, 91, "T"));
6170 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6172 fileMgrPopup.objPopup[BTN_TRASH] = popupBtns[i] =
6173 XmCreatePushButtonGadget (fileMgrPopup.menu, "trash", args, 2);
6174 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6175 (XtCallbackProc)HelpRequestCB,
6176 HELP_POPUP_MENU_STR);
6178 XmStringFree (label_string);
6180 /* Create 'Help' option -- object popup */
6181 label_string = XmStringCreateLocalized ((GETMESSAGE(20, 123, "Help")));
6182 XtSetArg (args[0], XmNlabelString, label_string);
6183 mnemonic = ((char *)GETMESSAGE(20, 102, "H"));
6184 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6186 fileMgrPopup.objPopup[BTN_HELP] = popupBtns[i] =
6187 XmCreatePushButtonGadget (fileMgrPopup.menu, "popupHelp", args, 2);
6188 XtAddCallback (popupBtns[i++], XmNhelpCallback,
6189 (XtCallbackProc)HelpRequestCB,
6190 HELP_HELP_MENU_STR);
6192 XmStringFree (label_string);
6194 /* Create 'Restore' option -- trash popup */
6195 label_string = XmStringCreateLocalized ((GETMESSAGE(27, 24, "Put back")));
6196 XtSetArg (args[0], XmNlabelString, label_string);
6197 mnemonic = ((char *)GETMESSAGE(27, 26, "P"));
6198 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6199 fileMgrPopup.trash_objPopup[BTN_RESTORE] = popupBtns[i] =
6200 XmCreatePushButtonGadget (fileMgrPopup.menu, "putBack", args, 2);
6201 XtAddCallback(popupBtns[i++], XmNhelpCallback,
6202 (XtCallbackProc)HelpRequestCB,
6203 HELP_TRASH_DIALOG_STR);
6204 XmStringFree (label_string);
6207 /* Create 'Remove' option -- trash popup */
6208 label_string = XmStringCreateLocalized ((GETMESSAGE(27, 28, "Shred")));
6209 XtSetArg (args[0], XmNlabelString, label_string);
6210 mnemonic = ((char *)GETMESSAGE(27, 30, "h"));
6211 XtSetArg (args[1], XmNmnemonic, mnemonic[0]);
6212 fileMgrPopup.trash_objPopup[BTN_REMOVE] = popupBtns[i] =
6213 XmCreatePushButtonGadget (fileMgrPopup.menu, "shred", args, 2);
6214 XtAddCallback(popupBtns[i++], XmNhelpCallback,
6215 (XtCallbackProc)HelpRequestCB,
6216 HELP_TRASH_DIALOG_STR);
6217 XmStringFree (label_string);
6220 /* Create separator -- white space popup and object popup */
6221 fileMgrPopup.action_separator = popupBtns[i++] =
6222 XmCreateSeparatorGadget(fileMgrPopup.menu, "sep2", NULL, 0);
6225 /* Manage popup buttons */
6226 XtManageChildren(popupBtns, i);
6231 /************************************************************************
6233 * DoTheMove - the user wishes to actually do the move even though its
6234 * not the desktop object that is actually getting moved.
6235 * This function calls the routines which do the moves. It
6236 * depends on the view type to determine how it does it.
6238 * DESKTOP - the drop happened on a Desktop object
6239 * and the object was a directory
6240 * NOT_DESKTOP_DIR - the drop happened on a directory
6241 * but it wasn't a directory on the desktop.
6242 * NOT_DESKTOP - drop happened in a FileManager view
6243 * and not on a directory.
6245 * if the type passed in is DESKTOP, then remove the corresponding
6248 ************************************************************************/
6257 char *file, *next, *end;
6258 char directory[MAX_PATH];
6259 Boolean result = True;
6261 file_count = global_file_count;
6262 file_set = global_file_set;
6263 host_set = global_host_set;
6269 RepositionIcons(fm, file_set, file_count, dx, dy, True);
6271 result = FileMoveCopy(fm,
6272 NULL, fm->current_directory, fm->host,
6273 host_set, file_set, file_count,
6274 (unsigned int)0, NULL, NULL);
6279 for(j = 0; j < file_count; j++)
6281 /* remove the Desktop object which corresponds to this move */
6282 for(i = 0; i < desktop_data->numIconsUsed; i++)
6285 DesktopRec *desktopWin;
6287 desktopWin = desktop_data->desktopWindows[i];
6288 if (strcmp(desktopWin->host, host_set[j]) != 0)
6291 fileName = (char *)XtMalloc(strlen(desktopWin->dir_linked_to)+
6292 strlen(desktopWin->file_name) + 3);
6293 sprintf( fileName, "%s/%s", desktopWin->dir_linked_to,
6294 desktopWin->file_name );
6296 * if fileName == file_set[j] then the file is on the
6297 * Desktop so change the dir_linked to reference. What the
6298 * new reference is depends on which view type is being
6301 if(strcmp(fileName, file_set[j]) == 0)
6305 Screen *currentScreen;
6307 char *workspace_name;
6309 screen = XDefaultScreen(XtDisplay(desktopWin->shell));
6311 XScreenOfDisplay(XtDisplay(desktopWin->shell), screen);
6312 rootWindow = RootWindowOfScreen(currentScreen);
6314 if(DtWsmGetCurrentWorkspace(XtDisplay(desktopWin->shell),
6315 rootWindow, &pCurrent) == Success)
6317 XGetAtomName (XtDisplay(desktopWin->shell), pCurrent);
6319 workspace_name = XtNewString("One");
6320 if (strcmp(workspace_name, desktopWin->workspace_name) == 0)
6322 RemoveDT (desktopWin->shell, (XtPointer) desktopWin,
6324 XtFree(workspace_name);
6325 workspace_name = NULL;
6328 XtFree(workspace_name);
6329 workspace_name = NULL;
6337 case NOT_DESKTOP_DIR:
6338 sprintf( directory, "%s/%s", dd->name, fv->file_data->file_name );
6340 result = FileMoveCopy (fm,
6341 NULL, directory, fm->host,
6342 host_set, file_set, file_count,
6343 (unsigned int) 0, NULL, NULL);
6350 DirectorySet * directory_data = (DirectorySet *)fv->directory_set;
6352 sprintf( directory, "%s/%s", directory_data->name,
6353 fv->file_data->file_name );
6355 result = FileMoveCopyDesktop (fv, directory, host_set, file_set,
6356 file_count, mod, dtWindow,
6362 _DtFreeDroppedFileInfo(file_count, file_set, host_set);
6370 Cardinal *num_params )
6372 XmDrawingAreaCallbackStruct cb ;
6373 FileMgrRec * fileMgrRec;
6375 Widget input_on_gadget ;
6377 if ((event->type == KeyPress)
6378 ||(event->type == KeyRelease))
6386 cb.reason = XmCR_INPUT ;
6389 if( *(params[0]) != '@' )
6392 sscanf( params[0], "%lx", &fileMgrRec );
6394 sscanf( params[0], "%p", (void **) &fileMgrRec );
6396 FileWindowInputCallback( wid, (XtPointer)fileMgrRec, (XtPointer)&cb );