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