Initial import of the CDE 2.1.30 sources from the Open Group.
[oweals/cde.git] / cde / programs / dtfile / PrefsP.c
1 /* $XConsortium: PrefsP.c /main/4 1995/11/02 14:43:38 rswiston $ */
2 /************************************<+>*************************************
3  ****************************************************************************
4  *
5  *   FILE:           PrefsP.c
6  *
7  *   COMPONENT_NAME: Desktop File Manager (dtfile)
8  *
9  *   Description:    Processing functions for the preferences dialog.
10  *
11  *   FUNCTIONS: PreferencesChange
12  *              PreferencesClose
13  *              ShowPreferencesDialog
14  *
15  *   (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
16  *   (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
17  *   (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
18  *   (c) Copyright 1993, 1994, 1995 Novell, Inc.
19  *
20  ****************************************************************************
21  ************************************<+>*************************************/
22
23 #include <Xm/Xm.h>
24 #include <Xm/RowColumn.h>
25
26 #include <Dt/FileM.h>
27 #include "Encaps.h"
28 #include "SharedProcs.h"
29
30 #include "FileMgr.h"
31 #include "Desktop.h"
32 #include "Main.h"
33 #include "Prefs.h"
34
35
36 /********    Static Function Declarations    ********/
37
38 static void PreferencesChange(
39                         XtPointer client_data,
40                         DialogData *old_dialog_data,
41                         DialogData *new_dialog_data,
42                         XtPointer call_data) ;
43 static void PreferencesClose(
44                         XtPointer client_data,
45                         DialogData *old_dialog_data,
46                         DialogData *new_dialog_data) ;
47
48 /********    End Static Function Declarations    ********/
49
50
51 /************************************************************************
52  *
53  *  ShowPreferencesDialog
54  *      Callback functions invoked from the Change Directory... menu
55  *      item.  This function displays the change directory dialog.
56  *
57  ************************************************************************/
58
59 void
60 ShowPreferencesDialog(
61         Widget w,
62         XtPointer client_data,
63         XtPointer callback )
64 {
65    FileMgrRec  * file_mgr_rec;
66    DialogData  * dialog_data;
67    FileMgrData * file_mgr_data;
68    PreferencesRec *preferences_rec;
69    Arg args[1];
70    Widget mbar;
71    char *tmpStr, *tempStr;
72
73
74
75    /*  Set the menu item to insensitive to prevent multiple  */
76    /*  dialogs from being posted and get the area under the  */
77    /*  menu pane redrawn.                                    */
78
79    if (w)
80    {
81       mbar = XmGetPostedFromWidget(XtParent(w));
82       XmUpdateDisplay (w);
83       XtSetArg(args[0], XmNuserData, &file_mgr_rec);
84       XtGetValues(mbar, args, 1);
85
86       /* Ignore accelerators when we're insensitive */
87       if ((file_mgr_rec->menuStates & PREFERENCES) == 0)
88       {
89          XSetInputFocus(XtDisplay(w),
90                         XtWindow(file_mgr_rec->preferencesBtn_child),
91                         RevertToParent, CurrentTime);
92          return;
93       }
94    }
95    else
96    {
97       /* Done only during a restore session */
98       file_mgr_rec = (FileMgrRec *)client_data;
99    }
100
101
102    /* Ignore accelerators received after we're unposted */
103    if ((dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec)) == NULL)
104       return;
105    file_mgr_data = (FileMgrData *) dialog_data->data;
106
107    file_mgr_rec->menuStates &= ~ PREFERENCES;
108
109    _DtShowDialog (file_mgr_rec->shell, NULL, (XtPointer)file_mgr_rec, 
110                file_mgr_data->preferences, PreferencesChange,
111                (XtPointer)file_mgr_rec, PreferencesClose,
112                (XtPointer)file_mgr_rec, NULL, False, False, NULL, NULL);
113
114    /* set the title */
115    preferences_rec = (PreferencesRec *)_DtGetDialogInstance(
116                                         file_mgr_data->preferences);
117
118    if(file_mgr_data->title != NULL &&
119            (strcmp(file_mgr_data->helpVol, DTFILE_HELP_NAME) != 0 ||
120             strcmp(file_mgr_data->title, "Trash Can") == 0))
121    {
122       tmpStr = GETMESSAGE(23, 1, "Set View Options");
123       tempStr = (char *)XtMalloc(strlen(tmpStr) +
124                                  strlen(file_mgr_data->title) + 5);
125       sprintf(tempStr, "%s - %s", file_mgr_data->title, tmpStr);
126    }
127    else
128    {
129       tmpStr = (GETMESSAGE(23,22, "File Manager - Set View Options"));
130       tempStr = XtNewString(tmpStr);
131    }
132    XtSetArg (args[0], XmNtitle, tempStr);
133    XtSetValues (preferences_rec->shell, args, 1);
134    XtFree(tempStr);
135    file_mgr_rec->preferencesBtn_child=preferences_rec->shell;
136 }
137
138
139
140
141 /************************************************************************
142  *
143  *  PreferencesChange
144  *      Callback functions invoked from the current directory dialog's
145  *      apply button being pressed.  This function updates and redisplays
146  *      the current directory information.
147  *
148  ************************************************************************/
149
150 static void
151 PreferencesChange(
152         XtPointer client_data,
153         DialogData *old_dialog_data,
154         DialogData *new_dialog_data,
155         XtPointer call_data )
156 {
157    FileMgrRec  * file_mgr_rec = (FileMgrRec *) client_data;
158    DialogData  * dialog_data;
159    FileMgrData * file_mgr_data;
160    XtPointer save_data;
161    PreferencesData * preferences_data;
162    unsigned char *viewP;
163    FileViewData  *branch;
164    int i;
165
166    dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec);
167    file_mgr_data = (FileMgrData *) dialog_data->data;
168
169    save_data = file_mgr_data->preferences->data;
170    file_mgr_data->preferences->data = new_dialog_data->data;
171    new_dialog_data->data = save_data;
172    _DtFreeDialogData (new_dialog_data);
173
174
175    preferences_data = (PreferencesData *) (file_mgr_data->preferences->data);
176
177    if (file_mgr_data->show_type != preferences_data->show_type  ||
178        file_mgr_data->tree_files != preferences_data->tree_files ||
179        file_mgr_data->view_single != preferences_data->view_single ||
180        file_mgr_data->view_tree != preferences_data->view_tree ||
181        file_mgr_data->order != preferences_data->order          ||
182        file_mgr_data->direction != preferences_data->direction  ||
183        file_mgr_data->positionEnabled != preferences_data->positionEnabled ||
184        file_mgr_data->show_iconic_path != preferences_data->show_iconic_path ||
185        file_mgr_data->show_current_dir != preferences_data->show_current_dir ||
186        file_mgr_data->show_status_line != preferences_data->show_status_line)
187    {
188       /*
189        * Depending upon which of the preferences values changed, positioning
190        * may need to be disabled, and the preferences dialog updated.
191        */
192       if (((file_mgr_data->order != preferences_data->order) ||
193           (file_mgr_data->direction != preferences_data->direction)) &&
194           (file_mgr_data->positionEnabled == RANDOM_ON))
195       {
196          /* Discard positioning info */
197          file_mgr_data->grid_height = 0;
198          file_mgr_data->grid_width = 0;
199          if(file_mgr_data->object_positions)
200             FreePositionInfo(file_mgr_data);
201       }
202
203       /*
204        * In tree mode, if we switch from showing files "always" to "choose",
205        * change all branches from tsAll back to tsDirs.
206        */
207       if (file_mgr_data->tree_files == TREE_FILES_ALWAYS &&
208           preferences_data->tree_files == TREE_FILES_CHOOSE)
209       {
210         for (i = 0; i < file_mgr_data->directory_count; i++)
211         {
212            branch = file_mgr_data->directory_set[i]->sub_root;
213            if (branch->ts == tsAll)
214            {
215               branch->ts = tsDirs;
216               UpdateBranchList(file_mgr_data, file_mgr_data->directory_set[i]);
217            }
218         }
219       }
220
221       if (preferences_data->show_type == MULTIPLE_DIRECTORY)
222         viewP = &preferences_data->view_tree;
223       else
224         viewP = &preferences_data->view_single;
225       if (file_mgr_data->view != *viewP)
226       {
227          file_mgr_data->newSize = True;
228       }
229       else
230       { 
231          if (file_mgr_data->show_type != preferences_data->show_type) 
232             file_mgr_data->newSize = True;
233          else
234             file_mgr_data->newSize = False;
235       }
236       file_mgr_data->show_type = preferences_data->show_type;
237       file_mgr_data->tree_files = preferences_data->tree_files;
238       file_mgr_data->view = *viewP;
239       file_mgr_data->view_single = preferences_data->view_single;
240       file_mgr_data->view_tree = preferences_data->view_tree;
241       file_mgr_data->order = preferences_data->order;
242       file_mgr_data->direction = preferences_data->direction;
243       file_mgr_data->show_iconic_path = preferences_data->show_iconic_path;
244       file_mgr_data->show_current_dir = preferences_data->show_current_dir;
245       file_mgr_data->show_status_line = preferences_data->show_status_line;
246       if (file_mgr_data->positionEnabled == preferences_data->positionEnabled)
247          FileMgrRedisplayFiles (file_mgr_rec, file_mgr_data, False);
248       else
249       {
250          file_mgr_data->positionEnabled = preferences_data->positionEnabled;
251          FileMgrRedisplayFiles (file_mgr_rec, file_mgr_data, True);
252       }
253    
254       if(openDirType == NEW)
255          ForceMyIconOpen(file_mgr_data->host, NULL);
256    }
257 }
258
259
260
261
262 /************************************************************************
263  *
264  *  PreferencesClose
265  *      Callback function invoked from the preferences dialog's close
266  *      button.  This function resensitizes the menu item.
267  *
268  ************************************************************************/
269
270 static void
271 PreferencesClose(
272         XtPointer client_data,
273         DialogData *old_dialog_data,
274         DialogData *new_dialog_data )
275 {
276    FileMgrRec * file_mgr_rec = (FileMgrRec *) client_data;
277
278    _DtFreeDialogData (new_dialog_data);
279
280    /* Resensitize the associated menu button */
281    file_mgr_rec->menuStates |= PREFERENCES;
282 }