~ubuntu-branches/debian/jessie/xfe/jessie

« back to all changes in this revision

Viewing changes to .pc/14_no-mount-warning.patch/src/XFileExplorer.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Joachim Wiedorn
  • Date: 2011-10-18 14:17:15 UTC
  • Revision ID: james.westby@ubuntu.com-20111018141715-7oxdt8ifiuy9ruom
Tags: 1.32.4-3
* debian/control:
  - Update suggested packages: remove playmidi, change to xine-ui.
* debian/patches:
  - Update some patches.
  - Optimize no-mount-warning patch. By default do not warn while mounting.
  - Add not-asking-for-quit patch. By default do not ask for quit. (Closes:
    #642078)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "config.h"
 
2
#include "i18n.h"
 
3
 
 
4
#include <stdio.h>
 
5
#include <stdlib.h>
 
6
#include <signal.h>
 
7
#include <sys/types.h>
 
8
#include <sys/wait.h>
 
9
#include <unistd.h>
 
10
 
 
11
#include <fx.h>
 
12
#include <fxkeys.h>
 
13
#include <FXPNGIcon.h>
 
14
 
 
15
#include <xvt/xvt.h>
 
16
 
 
17
#include "xfedefs.h"
 
18
#include "icons.h"
 
19
#include "xfeutils.h"
 
20
#include "startupnotification.h"
 
21
#include "File.h"
 
22
#include "FileList.h"
 
23
#include "FileDict.h"
 
24
#include "Preferences.h"
 
25
#include "FilePanel.h"
 
26
#include "InputDialog.h"
 
27
#include "HistInputDialog.h"
 
28
#include "DirPanel.h"
 
29
#include "MessageBox.h"
 
30
#include "TextWindow.h"
 
31
#include "CommandWindow.h"
 
32
#include "Bookmarks.h"
 
33
#include "FileDialog.h"
 
34
#include "help.h"
 
35
#include "DirHistBox.h"
 
36
#include "XFileExplorer.h"
 
37
 
 
38
 
 
39
// Size of the location bar
 
40
#define LOCATION_BAR_LENGTH 60
 
41
#define LOCATION_BAR_HEIGHT 6
 
42
 
 
43
 
 
44
// Global variables
 
45
FXString clipboard="";
 
46
FXchar OpenHistory[OPEN_HIST_SIZE][MAX_COMMAND_SIZE];
 
47
FXint OpenNum;
 
48
FXchar FilterHistory[FILTER_HIST_SIZE][MAX_PATTERN_SIZE];
 
49
FXint FilterNum;
 
50
 
 
51
FXbool allowPopupScroll=FALSE;
 
52
FXuint single_click;
 
53
FXbool file_tooltips;
 
54
FXbool relative_resize;
 
55
//FXbool save_win_pos;
 
56
 
 
57
 
 
58
// External global variables
 
59
extern char** args;
 
60
extern FXint panel_mode;
 
61
extern FXString homedir;
 
62
extern FXString xdgdatahome;
 
63
extern FXString xdgconfighome;
 
64
 
 
65
// Global options
 
66
#if defined(linux)
 
67
extern FXStringDict* fsdevices;
 
68
extern FXStringDict* updevices;
 
69
#endif
 
70
 
 
71
 
 
72
 
 
73
// Helper function to draw a toolbar separator
 
74
void toolbarSeparator(FXToolBar* tb)
 
75
{
 
76
#define SEP_SPACE       1
 
77
#define SEP_HEIGHT      15
 
78
    new FXFrame(tb,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT,0,0,SEP_SPACE);
 
79
    new FXVerticalSeparator(tb,LAYOUT_SIDE_TOP|LAYOUT_CENTER_Y|SEPARATOR_GROOVE|LAYOUT_FIX_HEIGHT,0,0,0,SEP_HEIGHT);
 
80
    new FXFrame(tb,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT,0,0,SEP_SPACE);
 
81
}
 
82
 
 
83
 
 
84
 
 
85
// Map
 
86
FXDEFMAP(XFileExplorer) XFileExplorerMap[]=
 
87
{
 
88
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_TOGGLE_STATUS,XFileExplorer::onCmdToggleStatus),
 
89
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_RUN,XFileExplorer::onCmdRun),
 
90
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_SU,XFileExplorer::onCmdSu),
 
91
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_FILE_COPY,XFileExplorer::onCmdFileCopyClp),
 
92
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_FILE_CUT,XFileExplorer::onCmdFileCutClp),
 
93
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_FILE_PASTE,XFileExplorer::onCmdFilePasteClp),
 
94
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_FILE_RENAME,XFileExplorer::onCmdFileRename),
 
95
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_FILE_COPYTO,XFileExplorer::onCmdFileCopyto),
 
96
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_FILE_MOVETO,XFileExplorer::onCmdFileMoveto),
 
97
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_FILE_SYMLINK,XFileExplorer::onCmdFileSymlink),
 
98
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_FILE_PROPERTIES,XFileExplorer::onCmdFileProperties),
 
99
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_FILE_DELETE,XFileExplorer::onCmdFileDelete),
 
100
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_FILE_TRASH,XFileExplorer::onCmdFileTrash),
 
101
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_FILE_RESTORE,XFileExplorer::onCmdFileRestore),
 
102
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_QUIT,XFileExplorer::onQuit),
 
103
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_HELP,XFileExplorer::onCmdHelp),
 
104
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_ABOUT,XFileExplorer::onCmdAbout),
 
105
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_FILE_ASSOC,XFileExplorer::onCmdFileAssoc),
 
106
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_REFRESH,XFileExplorer::onCmdRefresh),
 
107
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_EMPTY_TRASH,XFileExplorer::onCmdEmptyTrash),
 
108
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_TRASH_SIZE,XFileExplorer::onCmdTrashSize),
 
109
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_XTERM,XFileExplorer::onCmdXTerm),
 
110
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_CLEAR_LOCATION,XFileExplorer::onCmdClearLocation),
 
111
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_GOTO_LOCATION,XFileExplorer::onCmdGotoLocation),
 
112
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_PREFS,XFileExplorer::onCmdPrefs),
 
113
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_SHOW_ONE_PANEL,XFileExplorer::onCmdShowPanels),
 
114
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_SHOW_TWO_PANELS,XFileExplorer::onCmdShowPanels),
 
115
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_SHOW_TREE_PANEL,XFileExplorer::onCmdShowPanels),
 
116
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_SHOW_TREE_TWO_PANELS,XFileExplorer::onCmdShowPanels),
 
117
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_SYNCHRONIZE_PANELS,XFileExplorer::onCmdSynchronizePanels),
 
118
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_SWITCH_PANELS,XFileExplorer::onCmdSwitchPanels),
 
119
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_RESTART,XFileExplorer::onCmdRestart),
 
120
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_NEW_WIN,XFileExplorer::onCmdNewWindow),
 
121
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_BOOKMARK,XFileExplorer::onCmdBookmark),
 
122
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_DIR_UP,XFileExplorer::onCmdDirUp),
 
123
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_ADD_BOOKMARK,XFileExplorer::onCmdBookmark),
 
124
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_DIR_BACK,XFileExplorer::onCmdDirBack),
 
125
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_DIR_FORWARD,XFileExplorer::onCmdDirForward),
 
126
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_DIR_BACK_HIST,XFileExplorer::onCmdDirBackHist),
 
127
        FXMAPFUNC(SEL_COMMAND,XFileExplorer::ID_DIR_FORWARD_HIST,XFileExplorer::onCmdDirForwardHist),
 
128
        FXMAPFUNC(SEL_KEYPRESS,0,XFileExplorer::onKeyPress),
 
129
        FXMAPFUNC(SEL_SIGNAL,XFileExplorer::ID_HARVEST,XFileExplorer::onSigHarvest),
 
130
        FXMAPFUNC(SEL_CLOSE,0,XFileExplorer::onQuit),
 
131
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_DIR_FORWARD_HIST,XFileExplorer::onUpdDirForwardHist),
 
132
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_DIR_BACK_HIST,XFileExplorer::onUpdDirBackHist),
 
133
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_DIR_BACK,XFileExplorer::onUpdDirBack),
 
134
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_DIR_FORWARD,XFileExplorer::onUpdDirForward),
 
135
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_TOGGLE_STATUS,XFileExplorer::onUpdToggleStatus),
 
136
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_SHOW_ONE_PANEL,XFileExplorer::onUpdShowPanels),
 
137
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_SHOW_TWO_PANELS,XFileExplorer::onUpdShowPanels),
 
138
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_SHOW_TREE_PANEL,XFileExplorer::onUpdShowPanels),
 
139
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_SHOW_TREE_TWO_PANELS,XFileExplorer::onUpdShowPanels),
 
140
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_GOTO_LOCATION,XFileExplorer::onUpdFileLocation),
 
141
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_EMPTY_TRASH,XFileExplorer::onUpdEmptyTrash),
 
142
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_EMPTY_TRASH,XFileExplorer::onUpdTrashSize),
 
143
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_FILE_DELETE,XFileExplorer::onUpdFileDelete),
 
144
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_FILE_TRASH,XFileExplorer::onUpdFileTrash),
 
145
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_FILE_RESTORE,XFileExplorer::onUpdFileRestore),
 
146
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_FILE_RENAME,XFileExplorer::onUpdFileRename),
 
147
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_FILE_PROPERTIES,XFileExplorer::onUpdFileMan),
 
148
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_FILE_COPYTO,XFileExplorer::onUpdFileMan),
 
149
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_FILE_MOVETO,XFileExplorer::onUpdFileMan),
 
150
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_FILE_SYMLINK,XFileExplorer::onUpdFileMan),
 
151
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_FILE_COPY,XFileExplorer::onUpdFileMan),
 
152
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_FILE_CUT,XFileExplorer::onUpdFileMan),
 
153
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_FILE_PASTE,XFileExplorer::onUpdFilePaste),
 
154
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_SYNCHRONIZE_PANELS,XFileExplorer::onUpdSynchronizePanels),
 
155
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_SWITCH_PANELS,XFileExplorer::onUpdSwitchPanels),
 
156
        FXMAPFUNC(SEL_UPDATE,XFileExplorer::ID_SU,XFileExplorer::onUpdSu),
 
157
};
 
158
 
 
159
 
 
160
// Object implementation
 
161
FXIMPLEMENT(XFileExplorer,FXMainWindow,XFileExplorerMap,ARRAYNUMBER(XFileExplorerMap))
 
162
 
 
163
 
 
164
// Make some windows
 
165
XFileExplorer::XFileExplorer(FXApp *app, const FXbool iconic, const FXbool maximized, const FXString startdir, const char *title,FXIcon *bigicon,FXIcon *miniicon):
 
166
        FXMainWindow(app,title,bigicon,miniicon,DECOR_ALL)
 
167
{
 
168
    bookmarks=new Bookmarks("bookmarks",this,ID_BOOKMARK);
 
169
 
 
170
    // Menu bar
 
171
    menubar=new FXMenuBar(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|FRAME_RAISED);
 
172
 
 
173
        // Sites where to dock (for toolbars)
 
174
        FXDockSite* topdock=new FXDockSite(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X);
 
175
        new FXDockSite(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X);
 
176
        new FXDockSite(this,LAYOUT_SIDE_LEFT|LAYOUT_FILL_Y);
 
177
        new FXDockSite(this,LAYOUT_SIDE_RIGHT|LAYOUT_FILL_Y);
 
178
        
 
179
    // General toolbar
 
180
        FXToolBarShell* dragshell1=new FXToolBarShell(this,FRAME_RAISED);
 
181
        generaltoolbar=new FXToolBar(topdock,dragshell1,LAYOUT_DOCK_NEXT|LAYOUT_SIDE_TOP|FRAME_RAISED|LAYOUT_FILL_Y);
 
182
        new FXToolBarGrip(generaltoolbar,generaltoolbar,FXToolBar::ID_TOOLBARGRIP,TOOLBARGRIP_DOUBLE);
 
183
 
 
184
    // Tools toolbar
 
185
        FXToolBarShell* dragshell2=new FXToolBarShell(this,FRAME_RAISED);
 
186
        toolstoolbar=new FXToolBar(topdock,dragshell2,LAYOUT_DOCK_SAME|LAYOUT_SIDE_TOP|FRAME_RAISED|LAYOUT_FILL_Y);
 
187
        new FXToolBarGrip(toolstoolbar,toolstoolbar,FXToolBar::ID_TOOLBARGRIP,TOOLBARGRIP_DOUBLE);
 
188
 
 
189
        // Panel toolbar
 
190
        FXToolBarShell* dragshell3=new FXToolBarShell(this,FRAME_RAISED);
 
191
        paneltoolbar=new FXToolBar(topdock,dragshell3,LAYOUT_DOCK_SAME|LAYOUT_SIDE_TOP|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
 
192
        new FXToolBarGrip(paneltoolbar,paneltoolbar,FXToolBar::ID_TOOLBARGRIP,TOOLBARGRIP_DOUBLE);
 
193
 
 
194
        // Location bar
 
195
        FXToolBarShell* dragshell4=new FXToolBarShell(this,FRAME_RAISED);
 
196
        locationbar=new FXToolBar(topdock,dragshell4,LAYOUT_DOCK_NEXT|LAYOUT_SIDE_TOP|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
 
197
        new FXToolBarGrip(locationbar,locationbar,FXToolBar::ID_TOOLBARGRIP,TOOLBARGRIP_DOUBLE);
 
198
 
 
199
    // Splitter
 
200
        FXHorizontalFrame* splitterbox=new FXHorizontalFrame(this,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE,0,0,0,0, 0,0,0,0, 0,0);
 
201
        FXSplitter* mainsplit=new FXSplitter(splitterbox,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y|SPLITTER_TRACKING|FRAME_NONE);
 
202
        
 
203
        // File list background, foreground, highlight, progress bar and attention colors
 
204
        listbackcolor=getApp()->reg().readColorEntry("SETTINGS","listbackcolor",FXRGB(255,255,255));
 
205
        listforecolor=getApp()->reg().readColorEntry("SETTINGS","listforecolor",FXRGB(0,0,0));
 
206
        highlightcolor=getApp()->reg().readColorEntry("SETTINGS","highlightcolor",FXRGB(238,238,238));
 
207
        pbarcolor=getApp()->reg().readColorEntry("SETTINGS","pbarcolor",FXRGB(0,0,255));
 
208
        attentioncolor=getApp()->reg().readColorEntry("SETTINGS","attentioncolor",FXRGB(255,0,0));
 
209
        
 
210
        // Smooth scrolling
 
211
        smoothscroll=getApp()->reg().readUnsignedEntry("SETTINGS","smooth_scroll",TRUE);
 
212
 
 
213
        // Directory panel on the left (with minimum size)
 
214
    dirpanel=new DirPanel(this,mainsplit,listbackcolor,listforecolor,smoothscroll,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE,0,0,0,0);
 
215
 
 
216
        // File panels on the right : remembers size of each field
 
217
        lpanel=new FilePanel(this,"LEFT PANEL",mainsplit,dirpanel,
 
218
                     getApp()->reg().readUnsignedEntry("LEFT PANEL","name_size",200),
 
219
                     getApp()->reg().readUnsignedEntry("LEFT PANEL","size_size",60),
 
220
                     getApp()->reg().readUnsignedEntry("LEFT PANEL","type_size",100),
 
221
                     getApp()->reg().readUnsignedEntry("LEFT PANEL","ext_size",100),
 
222
                     getApp()->reg().readUnsignedEntry("LEFT PANEL","modd_size",150),
 
223
                     getApp()->reg().readUnsignedEntry("LEFT PANEL","user_size",50),
 
224
                     getApp()->reg().readUnsignedEntry("LEFT PANEL","grou_size",50),
 
225
                     getApp()->reg().readUnsignedEntry("LEFT PANEL","attr_size",100),
 
226
                     getApp()->reg().readUnsignedEntry("LEFT PANEL","deldate_size",150),
 
227
                     getApp()->reg().readUnsignedEntry("LEFT PANEL","origpath_size",200),
 
228
                                         getApp()->reg().readUnsignedEntry("LEFT PANEL","showthumbnails",0),
 
229
                                         listbackcolor,listforecolor,attentioncolor,smoothscroll,
 
230
                                         LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE,0,0,0,0);
 
231
    rpanel=new FilePanel(this,"RIGHT PANEL",mainsplit,dirpanel,
 
232
                     getApp()->reg().readUnsignedEntry("RIGHT PANEL","name_size",200),
 
233
                     getApp()->reg().readUnsignedEntry("RIGHT PANEL","size_size",60),
 
234
                     getApp()->reg().readUnsignedEntry("RIGHT PANEL","type_size",100),
 
235
                     getApp()->reg().readUnsignedEntry("RIGHT PANEL","ext_size",100),
 
236
                     getApp()->reg().readUnsignedEntry("RIGHT PANEL","modd_size",150),
 
237
                     getApp()->reg().readUnsignedEntry("RIGHT PANEL","user_size",50),
 
238
                     getApp()->reg().readUnsignedEntry("RIGHT PANEL","grou_size",50),
 
239
                     getApp()->reg().readUnsignedEntry("RIGHT PANEL","attr_size",100),
 
240
                     getApp()->reg().readUnsignedEntry("RIGHT PANEL","deldate_size",150),
 
241
                     getApp()->reg().readUnsignedEntry("RIGHT PANEL","origpath_size",200),
 
242
                                         getApp()->reg().readUnsignedEntry("RIGHT PANEL","showthumbnails",0),
 
243
                                         listbackcolor,listforecolor,attentioncolor,smoothscroll,
 
244
                                         LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE,0,0,0,0);
 
245
 
 
246
    lpanel->Next(rpanel);
 
247
    rpanel->Next(lpanel);
 
248
    lpanel->setActive();
 
249
 
 
250
        FXString sort_func;
 
251
        
 
252
        // Dir panel options
 
253
        sort_func=getApp()->reg().readStringEntry("DIR PANEL","sort_func","ascendingCase");
 
254
    if (sort_func=="ascendingCase")
 
255
                dirpanel->setSortFunc(DirList::ascendingCase);        
 
256
    else if (sort_func=="descendingCase")
 
257
                dirpanel->setSortFunc(DirList::descendingCase);        
 
258
    else if (sort_func=="ascending")
 
259
                dirpanel->setSortFunc(DirList::ascending);        
 
260
    else if (sort_func=="descending")
 
261
                dirpanel->setSortFunc(DirList::descending);        
 
262
 
 
263
        // Left panel options
 
264
        sort_func=getApp()->reg().readStringEntry("LEFT PANEL","sort_func","ascendingCase");
 
265
    if (sort_func=="ascendingCase")
 
266
                lpanel->setSortFunc(FileList::ascendingCase);        
 
267
    else if (sort_func=="ascendingCaseMix")
 
268
                lpanel->setSortFunc(FileList::ascendingCaseMix);        
 
269
    else if (sort_func=="descendingCase")
 
270
                lpanel->setSortFunc(FileList::descendingCase);        
 
271
    else if (sort_func=="descendingCaseMix")
 
272
                lpanel->setSortFunc(FileList::descendingCaseMix);        
 
273
    else if (sort_func=="ascending")
 
274
                lpanel->setSortFunc(FileList::ascending);        
 
275
        else if (sort_func=="ascendingMix")
 
276
                lpanel->setSortFunc(FileList::ascendingMix);        
 
277
    else if (sort_func=="descending")
 
278
                lpanel->setSortFunc(FileList::descending);        
 
279
    else if (sort_func=="descendingMix")
 
280
                lpanel->setSortFunc(FileList::descendingMix);        
 
281
        else if (sort_func=="ascendingSize")
 
282
                lpanel->setSortFunc(FileList::ascendingSize);        
 
283
        else if (sort_func=="ascendingSizeMix")
 
284
                lpanel->setSortFunc(FileList::ascendingSizeMix);        
 
285
        else if (sort_func=="descendingSize")
 
286
                lpanel->setSortFunc(FileList::descendingSize);        
 
287
        else if (sort_func=="descendingSizeMix")
 
288
                lpanel->setSortFunc(FileList::descendingSizeMix);        
 
289
        else if (sort_func=="ascendingType")
 
290
                lpanel->setSortFunc(FileList::ascendingType);        
 
291
        else if (sort_func=="ascendingTypeMix")
 
292
                lpanel->setSortFunc(FileList::ascendingTypeMix);        
 
293
        else if (sort_func=="descendingType")
 
294
                lpanel->setSortFunc(FileList::descendingType);        
 
295
        else if (sort_func=="descendingTypeMix")
 
296
                lpanel->setSortFunc(FileList::descendingTypeMix);        
 
297
        else if (sort_func=="ascendingExt")
 
298
                lpanel->setSortFunc(FileList::ascendingExt);        
 
299
        else if (sort_func=="ascendingExtMix")
 
300
                lpanel->setSortFunc(FileList::ascendingExtMix);        
 
301
        else if (sort_func=="descendingExt")
 
302
                lpanel->setSortFunc(FileList::descendingExt);        
 
303
        else if (sort_func=="descendingExtMix")
 
304
                lpanel->setSortFunc(FileList::descendingExtMix);        
 
305
        else if (sort_func=="ascendingTime")
 
306
                lpanel->setSortFunc(FileList::ascendingTime);        
 
307
        else if (sort_func=="ascendingTimeMix")
 
308
                lpanel->setSortFunc(FileList::ascendingTimeMix);        
 
309
        else if (sort_func=="descendingTime")
 
310
                lpanel->setSortFunc(FileList::descendingTime);        
 
311
        else if (sort_func=="descendingTimeMix")
 
312
                lpanel->setSortFunc(FileList::descendingTimeMix);        
 
313
        else if (sort_func=="ascendingUser")
 
314
                lpanel->setSortFunc(FileList::ascendingUser);        
 
315
        else if (sort_func=="ascendingUserMix")
 
316
                lpanel->setSortFunc(FileList::ascendingUserMix);        
 
317
        else if (sort_func=="descendingUser")
 
318
                lpanel->setSortFunc(FileList::descendingUser);         
 
319
        else if (sort_func=="descendingUserMix")
 
320
                lpanel->setSortFunc(FileList::descendingUserMix);         
 
321
        else if (sort_func=="ascendingGroup")
 
322
                lpanel->setSortFunc(FileList::ascendingGroup);        
 
323
        else if (sort_func=="ascendingGroupMix")
 
324
                lpanel->setSortFunc(FileList::ascendingGroupMix);        
 
325
        else if (sort_func=="descendingGroup")
 
326
                lpanel->setSortFunc(FileList::descendingGroup);        
 
327
        else if (sort_func=="descendingGroupMix")
 
328
                lpanel->setSortFunc(FileList::descendingGroupMix);        
 
329
        else if (sort_func=="ascendingPerm")
 
330
                lpanel->setSortFunc(FileList::ascendingPerm);        
 
331
        else if (sort_func=="ascendingPermMix")
 
332
                lpanel->setSortFunc(FileList::ascendingPermMix);        
 
333
        else if (sort_func=="descendingPerm")
 
334
                lpanel->setSortFunc(FileList::descendingPerm);        
 
335
        else if (sort_func=="descendingPermMix")
 
336
                lpanel->setSortFunc(FileList::descendingPermMix);        
 
337
        FXuint ignore_case=getApp()->reg().readUnsignedEntry("LEFT PANEL","ignore_case",1);
 
338
        lpanel->setIgnoreCase(ignore_case);        
 
339
        FXuint dirs_first=getApp()->reg().readUnsignedEntry("LEFT PANEL","dirs_first",1);
 
340
        lpanel->setDirsFirst(dirs_first);        
 
341
 
 
342
        // Right panel options
 
343
        sort_func=getApp()->reg().readStringEntry("RIGHT PANEL","sort_func","ascendingCase");
 
344
    if (sort_func=="ascendingCase")
 
345
                rpanel->setSortFunc(FileList::ascendingCase);        
 
346
    else if (sort_func=="ascendingCaseMix")
 
347
                rpanel->setSortFunc(FileList::ascendingCaseMix);        
 
348
    else if (sort_func=="descendingCase")
 
349
                rpanel->setSortFunc(FileList::descendingCase);        
 
350
    else if (sort_func=="descendingCaseMix")
 
351
                rpanel->setSortFunc(FileList::descendingCaseMix);        
 
352
    else if (sort_func=="ascending")
 
353
                rpanel->setSortFunc(FileList::ascending);        
 
354
        else if (sort_func=="ascendingMix")
 
355
                rpanel->setSortFunc(FileList::ascendingMix);        
 
356
    else if (sort_func=="descending")
 
357
                rpanel->setSortFunc(FileList::descending);        
 
358
    else if (sort_func=="descendingMix")
 
359
                rpanel->setSortFunc(FileList::descendingMix);        
 
360
        else if (sort_func=="ascendingSize")
 
361
                rpanel->setSortFunc(FileList::ascendingSize);        
 
362
        else if (sort_func=="ascendingSizeMix")
 
363
                rpanel->setSortFunc(FileList::ascendingSizeMix);        
 
364
        else if (sort_func=="descendingSize")
 
365
                rpanel->setSortFunc(FileList::descendingSize);        
 
366
        else if (sort_func=="descendingSizeMix")
 
367
                rpanel->setSortFunc(FileList::descendingSizeMix);        
 
368
        else if (sort_func=="ascendingType")
 
369
                rpanel->setSortFunc(FileList::ascendingType);        
 
370
        else if (sort_func=="ascendingTypeMix")
 
371
                rpanel->setSortFunc(FileList::ascendingTypeMix);        
 
372
        else if (sort_func=="descendingType")
 
373
                rpanel->setSortFunc(FileList::descendingType);        
 
374
        else if (sort_func=="descendingTypeMix")
 
375
                rpanel->setSortFunc(FileList::descendingTypeMix);        
 
376
        else if (sort_func=="ascendingExt")
 
377
                rpanel->setSortFunc(FileList::ascendingExt);        
 
378
        else if (sort_func=="ascendingExtMix")
 
379
                rpanel->setSortFunc(FileList::ascendingExtMix);        
 
380
        else if (sort_func=="descendingExt")
 
381
                rpanel->setSortFunc(FileList::descendingExt);        
 
382
        else if (sort_func=="descendingExtMix")
 
383
                rpanel->setSortFunc(FileList::descendingExtMix);        
 
384
        else if (sort_func=="ascendingTime")
 
385
                rpanel->setSortFunc(FileList::ascendingTime);        
 
386
        else if (sort_func=="ascendingTimeMix")
 
387
                rpanel->setSortFunc(FileList::ascendingTimeMix);        
 
388
        else if (sort_func=="descendingTime")
 
389
                rpanel->setSortFunc(FileList::descendingTime);        
 
390
        else if (sort_func=="descendingTimeMix")
 
391
                rpanel->setSortFunc(FileList::descendingTimeMix);        
 
392
        else if (sort_func=="ascendingUser")
 
393
                rpanel->setSortFunc(FileList::ascendingUser);        
 
394
        else if (sort_func=="ascendingUserMix")
 
395
                rpanel->setSortFunc(FileList::ascendingUserMix);        
 
396
        else if (sort_func=="descendingUser")
 
397
                rpanel->setSortFunc(FileList::descendingUser);         
 
398
        else if (sort_func=="descendingUserMix")
 
399
                rpanel->setSortFunc(FileList::descendingUserMix);         
 
400
        else if (sort_func=="ascendingGroup")
 
401
                rpanel->setSortFunc(FileList::ascendingGroup);        
 
402
        else if (sort_func=="ascendingGroupMix")
 
403
                rpanel->setSortFunc(FileList::ascendingGroupMix);        
 
404
        else if (sort_func=="descendingGroup")
 
405
                rpanel->setSortFunc(FileList::descendingGroup);        
 
406
        else if (sort_func=="descendingGroupMix")
 
407
                rpanel->setSortFunc(FileList::descendingGroupMix);        
 
408
        else if (sort_func=="ascendingPerm")
 
409
                rpanel->setSortFunc(FileList::ascendingPerm);        
 
410
        else if (sort_func=="ascendingPermMix")
 
411
                rpanel->setSortFunc(FileList::ascendingPermMix);        
 
412
        else if (sort_func=="descendingPerm")
 
413
                rpanel->setSortFunc(FileList::descendingPerm);        
 
414
        else if (sort_func=="descendingPermMix")
 
415
                rpanel->setSortFunc(FileList::descendingPermMix);        
 
416
        ignore_case=getApp()->reg().readUnsignedEntry("RIGHT PANEL","ignore_case",1);
 
417
        rpanel->setIgnoreCase(ignore_case);        
 
418
        dirs_first=getApp()->reg().readUnsignedEntry("RIGHT PANEL","dirs_first",1);
 
419
        rpanel->setDirsFirst(dirs_first);        
 
420
 
 
421
    FXButton *btn=NULL;
 
422
        FXHotKey hotkey;
 
423
        FXString key;
 
424
 
 
425
    // General toolbar
 
426
        key=getApp()->reg().readStringEntry("KEYBINDINGS","go_back","Ctrl-Backspace");
 
427
    btn=new FXButton(generaltoolbar,TAB+_("Go to previous directory")+PARS(key),dirbackicon,this,XFileExplorer::ID_DIR_BACK,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
428
        hotkey=_parseAccel(key);
 
429
        btn->addHotKey(hotkey);
 
430
 
 
431
        btnbackhist=new FXArrowButton(generaltoolbar,this,XFileExplorer::ID_DIR_BACK_HIST,LAYOUT_FILL_Y|FRAME_RAISED|FRAME_THICK|ARROW_DOWN|ARROW_TOOLBAR);
 
432
        
 
433
        key=getApp()->reg().readStringEntry("KEYBINDINGS","go_forward","Shift-Backspace");
 
434
    btn=new FXButton(generaltoolbar,TAB+_("Go to next directory")+PARS(key),dirforwardicon,this,XFileExplorer::ID_DIR_FORWARD,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
435
        hotkey=_parseAccel(key);
 
436
        btn->addHotKey(hotkey);
 
437
 
 
438
        btnforwardhist=new FXArrowButton(generaltoolbar,this,XFileExplorer::ID_DIR_FORWARD_HIST,LAYOUT_FILL_Y|FRAME_RAISED|FRAME_THICK|ARROW_DOWN|ARROW_TOOLBAR);
 
439
 
 
440
        key=getApp()->reg().readStringEntry("KEYBINDINGS","go_up","Backspace");
 
441
        btn=new FXButton(generaltoolbar,TAB+_("Go to parent directory")+PARS(key),dirupicon,this,XFileExplorer::ID_DIR_UP,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
442
        hotkey=_parseAccel(key);
 
443
        btn->addHotKey(hotkey);
 
444
 
 
445
        toolbarSeparator(generaltoolbar);
 
446
 
 
447
        key=getApp()->reg().readStringEntry("KEYBINDINGS","go_home","Ctrl-H");
 
448
        new FXButton(generaltoolbar,TAB+_("Go to home directory")+PARS(key),homeicon,lpanel,FilePanel::ID_GO_HOME,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
449
        
 
450
        key=getApp()->reg().readStringEntry("KEYBINDINGS","refresh","Ctrl-R");
 
451
        new FXButton(generaltoolbar,TAB+_("Refresh panels")+PARS(key),reloadicon,this,XFileExplorer::ID_REFRESH,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
452
 
 
453
        toolbarSeparator(generaltoolbar);
 
454
 
 
455
        key=getApp()->reg().readStringEntry("KEYBINDINGS","new_file","F2");
 
456
        new FXButton(generaltoolbar,TAB+_("Create new file")+PARS(key),newfileicon,lpanel,FilePanel::ID_NEW_FILE,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
457
 
 
458
        key=getApp()->reg().readStringEntry("KEYBINDINGS","new_folder","F7");
 
459
    new FXButton(generaltoolbar,TAB+_("Create new folder")+PARS(key),newfoldericon,lpanel,FilePanel::ID_NEW_DIR,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
460
 
 
461
        key=getApp()->reg().readStringEntry("KEYBINDINGS","new_symlink","Ctrl-J");
 
462
    new FXButton(generaltoolbar,TAB+_("Create new symlink")+PARS(key),newlinkicon,lpanel,FilePanel::ID_NEW_SYMLINK,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
463
 
 
464
        toolbarSeparator(generaltoolbar);
 
465
        
 
466
        key=getApp()->reg().readStringEntry("KEYBINDINGS","copy","Ctrl-C");
 
467
        new FXButton(generaltoolbar,TAB+_("Copy selected files to clipboard")+PARS(key),copy_clpicon,this,XFileExplorer::ID_FILE_COPY,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT);
 
468
 
 
469
        key=getApp()->reg().readStringEntry("KEYBINDINGS","cut","Ctrl-X");
 
470
        new FXButton(generaltoolbar,TAB+_("Cut selected files to clipboard")+PARS(key),cut_clpicon,this,XFileExplorer::ID_FILE_CUT,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT);
 
471
 
 
472
        key=getApp()->reg().readStringEntry("KEYBINDINGS","paste","Ctrl-V");
 
473
    new FXButton(generaltoolbar,TAB+_("Paste from clipboard")+PARS(key),paste_clpicon,this,XFileExplorer::ID_FILE_PASTE,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT);
 
474
 
 
475
        key=getApp()->reg().readStringEntry("KEYBINDINGS","properties","F9");
 
476
    new FXButton(generaltoolbar,TAB+_("Show properties of selected files")+PARS(key),attribicon,this,XFileExplorer::ID_FILE_PROPERTIES,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT);
 
477
 
 
478
        toolbarSeparator(generaltoolbar);
 
479
 
 
480
        key=getApp()->reg().readStringEntry("KEYBINDINGS","move_to_trash","Del");
 
481
        new FXButton(generaltoolbar,TAB+_("Move selected files to trash can")+PARS(key),filedeleteicon,this,XFileExplorer::ID_FILE_TRASH,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT);
 
482
 
 
483
        key=getApp()->reg().readStringEntry("KEYBINDINGS","restore_from_trash","Alt-Del");
 
484
        new FXButton(generaltoolbar,TAB+_("Restore selected files from trash can")+PARS(key),filerestoreicon,this,XFileExplorer::ID_FILE_RESTORE,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT);
 
485
 
 
486
        key=getApp()->reg().readStringEntry("KEYBINDINGS","delete","Shift-Del");
 
487
        new FXButton(generaltoolbar,TAB+_("Delete selected files")+PARS(key),filedelete_permicon,this,XFileExplorer::ID_FILE_DELETE,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT);
 
488
                
 
489
        key=getApp()->reg().readStringEntry("KEYBINDINGS","new_window","F3");
 
490
        new FXButton(toolstoolbar,TAB+_("Launch Xfe")+PARS(key),minixfeicon,this,XFileExplorer::ID_NEW_WIN,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
491
 
 
492
        key=getApp()->reg().readStringEntry("KEYBINDINGS","new_root_window","Shift-F3");
 
493
    new FXButton(toolstoolbar,TAB+_("Launch Xfe as root")+PARS(key),minixferooticon,this,XFileExplorer::ID_SU,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
494
 
 
495
        key=getApp()->reg().readStringEntry("KEYBINDINGS","execute_command","Ctrl-E");
 
496
    new FXButton(toolstoolbar,TAB+_("Execute command")+PARS(key),runicon,this,XFileExplorer::ID_RUN,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
497
 
 
498
        key=getApp()->reg().readStringEntry("KEYBINDINGS","terminal","Ctrl-T");
 
499
    new FXButton(toolstoolbar,TAB+_("Launch terminal")+PARS(key),shellicon,this,XFileExplorer::ID_XTERM,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
500
 
 
501
#if defined(linux)
 
502
        toolbarSeparator(toolstoolbar);
 
503
 
 
504
    // Mount and unmount buttons
 
505
        key=getApp()->reg().readStringEntry("KEYBINDINGS","mount","Ctrl-M");
 
506
        btn=new FXButton(toolstoolbar,TAB+_("Mount (Linux only)")+PARS(key),maphosticon,lpanel,FilePanel::ID_MOUNT,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
507
        hotkey=_parseAccel(key);
 
508
        btn->addHotKey(hotkey);
 
509
 
 
510
        key=getApp()->reg().readStringEntry("KEYBINDINGS","unmount","Ctrl-U");
 
511
    btn=new FXButton(toolstoolbar,TAB+_("Unmount (Linux only)")+PARS(key),unmaphosticon,lpanel,FilePanel::ID_UMOUNT,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
 
512
        hotkey=_parseAccel(key);
 
513
        btn->addHotKey(hotkey);
 
514
#endif
 
515
 
 
516
        // Panel toolbar
 
517
        
 
518
        // Show one panel
 
519
        key=getApp()->reg().readStringEntry("KEYBINDINGS","one_panel","Ctrl-F1");
 
520
        btn=new FXButton(paneltoolbar,TAB+_("Show one panel")+PARS(key),onepanelicon,this,XFileExplorer::ID_SHOW_ONE_PANEL,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT);
 
521
        hotkey=_parseAccel(key);
 
522
        btn->addHotKey(hotkey);
 
523
 
 
524
        // Show tree and panel
 
525
        key=getApp()->reg().readStringEntry("KEYBINDINGS","tree_panel","Ctrl-F2");
 
526
        btn=new FXButton(paneltoolbar,TAB+_("Show tree and panel")+PARS(key),treeonepanelicon,this,XFileExplorer::ID_SHOW_TREE_PANEL,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT);
 
527
        hotkey=_parseAccel(key);
 
528
        btn->addHotKey(hotkey);
 
529
 
 
530
        // Show two panels
 
531
        key=getApp()->reg().readStringEntry("KEYBINDINGS","two_panels","Ctrl-F3");
 
532
        btn=new FXButton(paneltoolbar,TAB+_("Show two panels")+PARS(key),twopanelsicon,this,XFileExplorer::ID_SHOW_TWO_PANELS,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT);
 
533
        hotkey=_parseAccel(key);
 
534
        btn->addHotKey(hotkey);
 
535
 
 
536
        // Show tree and two panels
 
537
        key=getApp()->reg().readStringEntry("KEYBINDINGS","tree_two_panels","Ctrl-F4");
 
538
        btn = new FXButton(paneltoolbar,TAB+_("Show tree and two panels")+PARS(key),treetwopanelsicon,this,XFileExplorer::ID_SHOW_TREE_TWO_PANELS,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT);
 
539
        hotkey=_parseAccel(key);
 
540
        btn->addHotKey(hotkey);
 
541
 
 
542
        toolbarSeparator(paneltoolbar);
 
543
 
 
544
    // Switch display modes
 
545
        key=getApp()->reg().readStringEntry("KEYBINDINGS","big_icons","F10");
 
546
    btn=new FXButton(paneltoolbar,TAB+_("Big icon list")+PARS(key),bigiconsicon,lpanel,FilePanel::ID_SHOW_BIG_ICONS,BUTTON_TOOLBAR|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT|FRAME_RAISED);
 
547
        hotkey=_parseAccel(key);
 
548
        btn->addHotKey(hotkey);
 
549
 
 
550
        key=getApp()->reg().readStringEntry("KEYBINDINGS","small_icons","F11");
 
551
    btn=new FXButton(paneltoolbar,TAB+_("Small icon list")+PARS(key),smalliconsicon,lpanel,FilePanel::ID_SHOW_MINI_ICONS,BUTTON_TOOLBAR|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT|FRAME_RAISED);
 
552
        hotkey=_parseAccel(key);
 
553
        btn->addHotKey(hotkey);
 
554
 
 
555
        key=getApp()->reg().readStringEntry("KEYBINDINGS","detailed_file_list","F12");
 
556
    btn=new FXButton(paneltoolbar,TAB+_("Detailed file list")+PARS(key),detailsicon,lpanel,FilePanel::ID_SHOW_DETAILS,BUTTON_TOOLBAR|LAYOUT_TOP|LAYOUT_LEFT|ICON_BEFORE_TEXT|FRAME_RAISED);
 
557
        hotkey=_parseAccel(key);
 
558
        btn->addHotKey(hotkey);
 
559
 
 
560
        // Location bar
 
561
        new FXLabel(locationbar,_("Location:"));
 
562
        key=getApp()->reg().readStringEntry("KEYBINDINGS","clear_location","Ctrl-L");
 
563
        btn = new FXButton(locationbar,TAB+_("Clear location")+PARS(key),locationicon,this,ID_CLEAR_LOCATION,BUTTON_TOOLBAR|LAYOUT_CENTER_Y|LAYOUT_LEFT|ICON_BEFORE_TEXT|FRAME_RAISED);
 
564
        hotkey=_parseAccel(key);
 
565
        btn->addHotKey(hotkey);
 
566
        address=new ComboBox(locationbar,LOCATION_BAR_LENGTH,this,ID_GOTO_LOCATION,COMBOBOX_INSERT_LAST|JUSTIFY_LEFT|LAYOUT_CENTER_Y);
 
567
        address->setNumVisible(5);
 
568
        new FXButton(locationbar,TAB+_("Go to location"),entericon,this,ID_GOTO_LOCATION,BUTTON_TOOLBAR|LAYOUT_CENTER_Y|LAYOUT_LEFT|ICON_BEFORE_TEXT|FRAME_RAISED);
 
569
 
 
570
 
 
571
    // Menus
 
572
 
 
573
    // File menu        
 
574
        filemenu=new FXMenuPane(this);
 
575
        FXMenuCommand* mc = NULL;
 
576
 
 
577
    mc=new FXMenuCommand(filemenu,_("New &file..."),newfileicon,lpanel,FilePanel::ID_NEW_FILE); 
 
578
        key=getApp()->reg().readStringEntry("KEYBINDINGS","new_file","F2");
 
579
        mc->setAccelText(key);
 
580
        hotkey=_parseAccel(key);
 
581
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
582
 
 
583
    mc=new FXMenuCommand(filemenu,_("New fo&lder..."),newfoldericon,lpanel,FilePanel::ID_NEW_DIR);
 
584
        key=getApp()->reg().readStringEntry("KEYBINDINGS","new_folder","F7");
 
585
        mc->setAccelText(key);
 
586
        hotkey=_parseAccel(key);
 
587
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
588
 
 
589
    mc=new FXMenuCommand(filemenu,_("New s&ymlink..."),newlinkicon,lpanel,FilePanel::ID_NEW_SYMLINK);
 
590
        key=getApp()->reg().readStringEntry("KEYBINDINGS","new_symlink","Ctrl-J");
 
591
        mc->setAccelText(key);
 
592
        hotkey=_parseAccel(key);
 
593
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
594
 
 
595
    mc=new FXMenuCommand(filemenu,_("Go &home"),homeicon,lpanel,FilePanel::ID_GO_HOME);
 
596
        key=getApp()->reg().readStringEntry("KEYBINDINGS","go_home","Ctrl-H");
 
597
        mc->setAccelText(key);
 
598
        hotkey=_parseAccel(key);
 
599
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
600
 
 
601
    mc=new FXMenuCommand(filemenu,_("&Refresh"),reloadicon,this,XFileExplorer::ID_REFRESH);
 
602
        key=getApp()->reg().readStringEntry("KEYBINDINGS","refresh","Ctrl-R");
 
603
        mc->setAccelText(key);
 
604
        hotkey=_parseAccel(key);
 
605
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
606
 
 
607
    new FXMenuSeparator(filemenu);
 
608
 
 
609
    mc=new FXMenuCommand(filemenu,_("&Open..."),fileopenicon,lpanel,FilePanel::ID_OPEN);
 
610
        key=getApp()->reg().readStringEntry("KEYBINDINGS","open","Ctrl-O");
 
611
        mc->setAccelText(key);
 
612
        hotkey=_parseAccel(key);
 
613
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
614
 
 
615
    mc=new FXMenuCommand(filemenu,_("Re&name..."),renameiticon,this,XFileExplorer::ID_FILE_RENAME);
 
616
        key=getApp()->reg().readStringEntry("KEYBINDINGS","rename","Ctrl-N");
 
617
        mc->setAccelText(key);
 
618
        hotkey=_parseAccel(key);
 
619
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
620
 
 
621
    mc=new FXMenuCommand(filemenu,_("&Copy to..."),copy_clpicon,this,XFileExplorer::ID_FILE_COPYTO);
 
622
        key=getApp()->reg().readStringEntry("KEYBINDINGS","copy_to","F5");
 
623
        mc->setAccelText(key);
 
624
        hotkey=_parseAccel(key);
 
625
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
626
 
 
627
    mc=new FXMenuCommand(filemenu,_("&Move to..."),moveiticon,this,XFileExplorer::ID_FILE_MOVETO);
 
628
        key=getApp()->reg().readStringEntry("KEYBINDINGS","move_to","F6");
 
629
        mc->setAccelText(key);
 
630
        hotkey=_parseAccel(key);
 
631
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
632
 
 
633
    mc=new FXMenuCommand(filemenu,_("&Symlink to..."),minilinkicon,this,XFileExplorer::ID_FILE_SYMLINK);
 
634
        key=getApp()->reg().readStringEntry("KEYBINDINGS","symlink_to","Ctrl-S");
 
635
        mc->setAccelText(key);
 
636
        hotkey=_parseAccel(key);
 
637
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
638
 
 
639
    mc=new FXMenuCommand(filemenu,_("Mo&ve to trash"),filedeleteicon,this,XFileExplorer::ID_FILE_TRASH);
 
640
        key=getApp()->reg().readStringEntry("KEYBINDINGS","move_to_trash","Del");
 
641
        mc->setAccelText(key);
 
642
        hotkey=_parseAccel(key);
 
643
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
644
 
 
645
    mc=new FXMenuCommand(filemenu,_("R&estore from trash"),filerestoreicon,this,XFileExplorer::ID_FILE_RESTORE);
 
646
        key=getApp()->reg().readStringEntry("KEYBINDINGS","restore_from_trash","Alt-Del");
 
647
        mc->setAccelText(key);
 
648
        hotkey=_parseAccel(key);
 
649
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
650
 
 
651
    mc=new FXMenuCommand(filemenu,_("&Delete"),filedelete_permicon,this,XFileExplorer::ID_FILE_DELETE);
 
652
        key=getApp()->reg().readStringEntry("KEYBINDINGS","delete","Shift-Del");
 
653
        mc->setAccelText(key);
 
654
        hotkey=_parseAccel(key);
 
655
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
656
 
 
657
    mc=new FXMenuCommand(filemenu,_("&Properties..."),attribicon,this,XFileExplorer::ID_FILE_PROPERTIES);
 
658
        key=getApp()->reg().readStringEntry("KEYBINDINGS","properties","F9");
 
659
        mc->setAccelText(key);
 
660
        hotkey=_parseAccel(key);
 
661
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
662
 
 
663
    new FXMenuSeparator(filemenu);
 
664
 
 
665
    mc=new FXMenuCommand(filemenu,_("&Quit"),quiticon,this,XFileExplorer::ID_QUIT);
 
666
        key=getApp()->reg().readStringEntry("KEYBINDINGS","quit","Ctrl-Q");
 
667
        mc->setAccelText(key);
 
668
        hotkey=_parseAccel(key);
 
669
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
670
 
 
671
        filemenutitle=new FXMenuTitle(menubar,_("&File"),NULL,filemenu);
 
672
 
 
673
        // Edit menu
 
674
    editmenu=new FXMenuPane(this);
 
675
    
 
676
        mc=new FXMenuCommand(editmenu,_("&Copy"),copy_clpicon,this,XFileExplorer::ID_FILE_COPY);
 
677
        key=getApp()->reg().readStringEntry("KEYBINDINGS","copy","Ctrl-C");
 
678
        mc->setAccelText(key);
 
679
        hotkey=_parseAccel(key);
 
680
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
681
 
 
682
    mc=new FXMenuCommand(editmenu,_("C&ut"),cut_clpicon,this,XFileExplorer::ID_FILE_CUT);
 
683
        key=getApp()->reg().readStringEntry("KEYBINDINGS","cut","Ctrl-X");
 
684
        mc->setAccelText(key);
 
685
        hotkey=_parseAccel(key);
 
686
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
687
 
 
688
    mc=new FXMenuCommand(editmenu,_("&Paste"),paste_clpicon,this,XFileExplorer::ID_FILE_PASTE);
 
689
        key=getApp()->reg().readStringEntry("KEYBINDINGS","paste","Ctrl-V");
 
690
        mc->setAccelText(key);
 
691
        hotkey=_parseAccel(key);
 
692
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
693
   
 
694
        new FXMenuSeparator(editmenu);
 
695
    
 
696
        mc=new FXMenuCommand(editmenu,_("&Select all"),selallicon,lpanel,FilePanel::ID_SELECT_ALL);
 
697
        key=getApp()->reg().readStringEntry("KEYBINDINGS","select_all","Ctrl-A");
 
698
        mc->setAccelText(key);
 
699
        hotkey=_parseAccel(key);
 
700
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
701
   
 
702
        mc=new FXMenuCommand(editmenu,_("&Deselect all"),deselicon,lpanel,FilePanel::ID_DESELECT_ALL);
 
703
        key=getApp()->reg().readStringEntry("KEYBINDINGS","deselect_all","Ctrl-Z");
 
704
        mc->setAccelText(key);
 
705
        hotkey=_parseAccel(key);
 
706
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
707
    
 
708
        mc=new FXMenuCommand(editmenu,_("&Invert selection"),invselicon,lpanel,FilePanel::ID_SELECT_INVERSE);
 
709
        key=getApp()->reg().readStringEntry("KEYBINDINGS","invert_selection","Ctrl-I");
 
710
        mc->setAccelText(key);
 
711
        hotkey=_parseAccel(key);
 
712
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
713
 
 
714
    new FXMenuSeparator(editmenu);    
 
715
        new FXMenuCommand(editmenu,_("P&references"),prefsicon,this,XFileExplorer::ID_PREFS);
 
716
   
 
717
        editmenutitle=new FXMenuTitle(menubar,_("&Edit"),NULL,editmenu);
 
718
 
 
719
    // Bookmarks menu
 
720
    bookmarksmenu=new FXMenuPane(this);
 
721
    mc=new FXMenuCommand(bookmarksmenu,_("&Add bookmark"),setbookicon,this,ID_ADD_BOOKMARK);
 
722
        key=getApp()->reg().readStringEntry("KEYBINDINGS","add_bookmark","Ctrl-B");
 
723
        mc->setAccelText(key);
 
724
        hotkey=_parseAccel(key);
 
725
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
726
 
 
727
    new FXMenuSeparator(bookmarksmenu);
 
728
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_1);
 
729
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_2);
 
730
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_3);
 
731
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_4);
 
732
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_5);
 
733
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_6);
 
734
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_7);
 
735
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_8);
 
736
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_9);
 
737
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_10);
 
738
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_11);
 
739
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_12);
 
740
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_13);
 
741
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_14);
 
742
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_15);
 
743
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_16);
 
744
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_17);
 
745
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_18);
 
746
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_19);
 
747
    new FXMenuCommand(bookmarksmenu,FXString::null,NULL,bookmarks,Bookmarks::ID_BOOKMARK_20);
 
748
    new FXMenuSeparator(bookmarksmenu);
 
749
        new FXMenuCommand(bookmarksmenu,_("&Clear bookmarks"),clrbookicon,bookmarks,Bookmarks::ID_CLEAR);
 
750
    
 
751
        bookmarksmenutitle=new FXMenuTitle(menubar,_("&Bookmarks"),NULL,bookmarksmenu);
 
752
 
 
753
    // View menu
 
754
    viewmenu=new FXMenuPane(this);
 
755
    new FXMenuCheck(viewmenu,_("&General toolbar"),generaltoolbar,FXWindow::ID_TOGGLESHOWN);
 
756
    new FXMenuCheck(viewmenu,_("&Tools toolbar"),toolstoolbar,FXWindow::ID_TOGGLESHOWN);
 
757
    new FXMenuCheck(viewmenu,_("&Panel toolbar"),paneltoolbar,FXWindow::ID_TOGGLESHOWN);
 
758
        new FXMenuCheck(viewmenu,_("&Location bar"),locationbar,FXWindow::ID_TOGGLESHOWN);
 
759
    new FXMenuCheck(viewmenu,_("&Status bar"),this,XFileExplorer::ID_TOGGLE_STATUS);
 
760
 
 
761
    new FXMenuSeparator(viewmenu);
 
762
 
 
763
    mc=new FXMenuRadio(viewmenu,_("&One panel"),this,XFileExplorer::ID_SHOW_ONE_PANEL);
 
764
        key=getApp()->reg().readStringEntry("KEYBINDINGS","one_panel","Ctrl-F1");
 
765
        mc->setAccelText(key);
 
766
 
 
767
    mc=new FXMenuRadio(viewmenu,_("T&ree and panel"),this,XFileExplorer::ID_SHOW_TREE_PANEL);
 
768
        key=getApp()->reg().readStringEntry("KEYBINDINGS","tree_panel","Ctrl-F2");
 
769
        mc->setAccelText(key);
 
770
 
 
771
    mc=new FXMenuRadio(viewmenu,_("Two &panels"),this,XFileExplorer::ID_SHOW_TWO_PANELS);
 
772
        key=getApp()->reg().readStringEntry("KEYBINDINGS","two_panels","Ctrl-F3");
 
773
        mc->setAccelText(key);
 
774
 
 
775
    mc=new FXMenuRadio(viewmenu,_("Tr&ee and two panels"),this,XFileExplorer::ID_SHOW_TREE_TWO_PANELS);
 
776
        key=getApp()->reg().readStringEntry("KEYBINDINGS","tree_two_panels","Ctrl-F4");
 
777
        mc->setAccelText(key);
 
778
   
 
779
        viewmenutitle=new FXMenuTitle(menubar,_("&View"),NULL,viewmenu);
 
780
 
 
781
    // Left Panel Menu
 
782
    lpanelmenu=new FXMenuPane(this);
 
783
        new FXMenuCommand(lpanelmenu,_("&Filter..."),filtericon,lpanel,FilePanel::ID_FILTER);
 
784
    new FXMenuCheck(lpanelmenu,_("&Hidden files"),lpanel->getList(),FileList::ID_TOGGLE_HIDDEN);
 
785
    new FXMenuCheck(lpanelmenu,_("&Thumbnails"),lpanel->getList(),FileList::ID_TOGGLE_THUMBNAILS);
 
786
    new FXMenuSeparator(lpanelmenu);
 
787
    new FXMenuRadio(lpanelmenu,_("&Big icons"),lpanel->getList(),IconList::ID_SHOW_BIG_ICONS);
 
788
    new FXMenuRadio(lpanelmenu,_("&Small icons"),lpanel->getList(),IconList::ID_SHOW_MINI_ICONS);
 
789
    new FXMenuRadio(lpanelmenu,_("F&ull file list"),lpanel->getList(),IconList::ID_SHOW_DETAILS);
 
790
    new FXMenuSeparator(lpanelmenu);
 
791
    new FXMenuRadio(lpanelmenu,_("&Rows"),lpanel->getList(),FileList::ID_ARRANGE_BY_ROWS);
 
792
    new FXMenuRadio(lpanelmenu,_("&Columns"),lpanel->getList(),FileList::ID_ARRANGE_BY_COLUMNS);
 
793
    new FXMenuCheck(lpanelmenu,_("Autosize"),lpanel->getList(),FileList::ID_AUTOSIZE);
 
794
    new FXMenuSeparator(lpanelmenu);
 
795
    new FXMenuRadio(lpanelmenu,_("&Name"),lpanel->getList(),FileList::ID_SORT_BY_NAME);
 
796
    new FXMenuRadio(lpanelmenu,_("Si&ze"),lpanel->getList(),FileList::ID_SORT_BY_SIZE);
 
797
    new FXMenuRadio(lpanelmenu,_("T&ype"),lpanel->getList(),FileList::ID_SORT_BY_TYPE);
 
798
    new FXMenuRadio(lpanelmenu,_("E&xtension"),lpanel->getList(),FileList::ID_SORT_BY_EXT);
 
799
    new FXMenuRadio(lpanelmenu,_("D&ate"),lpanel->getList(),FileList::ID_SORT_BY_TIME);
 
800
    new FXMenuRadio(lpanelmenu,_("Us&er"),lpanel->getList(),FileList::ID_SORT_BY_USER);
 
801
    new FXMenuRadio(lpanelmenu,_("Gr&oup"),lpanel->getList(),FileList::ID_SORT_BY_GROUP);
 
802
    new FXMenuRadio(lpanelmenu,_("&Permissions"),lpanel->getList(),FileList::ID_SORT_BY_PERM);
 
803
    new FXMenuRadio(lpanelmenu,_("Deletion date"),lpanel->getList(),FileList::ID_SORT_BY_DELTIME);
 
804
    new FXMenuRadio(lpanelmenu,_("Original path"),lpanel->getList(),FileList::ID_SORT_BY_ORIGPATH);
 
805
    new FXMenuSeparator(lpanelmenu);
 
806
        new FXMenuCheck(lpanelmenu,_("I&gnore case"),lpanel->getList(),FileList::ID_SORT_CASE);
 
807
        new FXMenuCheck(lpanelmenu,_("&Directories first"),lpanel->getList(),FileList::ID_DIRS_FIRST);
 
808
        new FXMenuCheck(lpanelmenu,_("Re&verse order"),lpanel->getList(),FileList::ID_SORT_REVERSE);
 
809
    lpanelmenutitle=new FXMenuTitle(menubar,_("&Left panel"),NULL,lpanelmenu);
 
810
 
 
811
    // Right Panel Menu
 
812
    rpanelmenu=new FXMenuPane(this);
 
813
    new FXMenuCommand(rpanelmenu,_("&Filter"),filtericon,rpanel,FilePanel::ID_FILTER);
 
814
    new FXMenuCheck(rpanelmenu,_("&Hidden files"),rpanel->getList(),FileList::ID_TOGGLE_HIDDEN);
 
815
    new FXMenuCheck(rpanelmenu,_("&Thumbnails"),rpanel->getList(),FileList::ID_TOGGLE_THUMBNAILS);
 
816
    new FXMenuSeparator(rpanelmenu);
 
817
    new FXMenuRadio(rpanelmenu,_("&Big icons"),rpanel->getList(),IconList::ID_SHOW_BIG_ICONS);
 
818
    new FXMenuRadio(rpanelmenu,_("&Small icons"),rpanel->getList(),IconList::ID_SHOW_MINI_ICONS);
 
819
    new FXMenuRadio(rpanelmenu,_("F&ull file list"),rpanel->getList(),IconList::ID_SHOW_DETAILS);
 
820
    new FXMenuSeparator(rpanelmenu);
 
821
    new FXMenuRadio(rpanelmenu,_("&Rows"),rpanel->getList(),FileList::ID_ARRANGE_BY_ROWS);
 
822
    new FXMenuRadio(rpanelmenu,_("&Columns"),rpanel->getList(),FileList::ID_ARRANGE_BY_COLUMNS);
 
823
    new FXMenuCheck(rpanelmenu,_("Autosize"),rpanel->getList(),FileList::ID_AUTOSIZE);
 
824
    new FXMenuSeparator(rpanelmenu);
 
825
    new FXMenuRadio(rpanelmenu,_("&Name"),rpanel->getList(),FileList::ID_SORT_BY_NAME);
 
826
    new FXMenuRadio(rpanelmenu,_("Si&ze"),rpanel->getList(),FileList::ID_SORT_BY_SIZE);
 
827
    new FXMenuRadio(rpanelmenu,_("T&ype"),rpanel->getList(),FileList::ID_SORT_BY_TYPE);
 
828
    new FXMenuRadio(rpanelmenu,_("E&xtension"),rpanel->getList(),FileList::ID_SORT_BY_EXT);
 
829
    new FXMenuRadio(rpanelmenu,_("D&ate"),rpanel->getList(),FileList::ID_SORT_BY_TIME);
 
830
    new FXMenuRadio(rpanelmenu,_("Us&er"),rpanel->getList(),FileList::ID_SORT_BY_USER);
 
831
    new FXMenuRadio(rpanelmenu,_("Gr&oup"),rpanel->getList(),FileList::ID_SORT_BY_GROUP);
 
832
    new FXMenuRadio(rpanelmenu,_("&Permissions"),rpanel->getList(),FileList::ID_SORT_BY_PERM);
 
833
    new FXMenuRadio(rpanelmenu,_("Deletion date"),rpanel->getList(),FileList::ID_SORT_BY_DELTIME);
 
834
    new FXMenuRadio(rpanelmenu,_("Original path"),rpanel->getList(),FileList::ID_SORT_BY_ORIGPATH);
 
835
    new FXMenuSeparator(rpanelmenu);
 
836
        new FXMenuCheck(rpanelmenu,_("I&gnore case"),rpanel->getList(),FileList::ID_SORT_CASE);
 
837
        new FXMenuCheck(rpanelmenu,_("&Directories first"),rpanel->getList(),FileList::ID_DIRS_FIRST);
 
838
        new FXMenuCheck(rpanelmenu,_("Re&verse order"),rpanel->getList(),FileList::ID_SORT_REVERSE);
 
839
    rpanelmenutitle=new FXMenuTitle(menubar,_("&Right panel"),NULL,rpanelmenu);
 
840
 
 
841
        // Tools menu
 
842
        toolsmenu=new FXMenuPane(this);
 
843
    
 
844
        mc=new FXMenuCommand(toolsmenu,_("New &window"),minixfeicon,this,XFileExplorer::ID_NEW_WIN);
 
845
        key=getApp()->reg().readStringEntry("KEYBINDINGS","new_window","F3");
 
846
        mc->setAccelText(key);
 
847
        hotkey=_parseAccel(key);
 
848
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
849
 
 
850
    mc=new FXMenuCommand(toolsmenu,_("New &root window"),minixferooticon,this,XFileExplorer::ID_SU);
 
851
        key=getApp()->reg().readStringEntry("KEYBINDINGS","new_root_window","Shift-F3");
 
852
        mc->setAccelText(key);
 
853
        hotkey=_parseAccel(key);
 
854
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
855
 
 
856
    new FXMenuSeparator(toolsmenu);
 
857
 
 
858
    mc=new FXMenuCommand(toolsmenu,_("E&xecute command..."),runicon,this,ID_RUN);
 
859
        key=getApp()->reg().readStringEntry("KEYBINDINGS","execute_command","Ctrl-E");
 
860
        mc->setAccelText(key);
 
861
        hotkey=_parseAccel(key);
 
862
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
863
 
 
864
    mc=new FXMenuCommand(toolsmenu,_("&Terminal"),minishellicon,this,XFileExplorer::ID_XTERM);
 
865
        key=getApp()->reg().readStringEntry("KEYBINDINGS","terminal","Ctrl-T");
 
866
        mc->setAccelText(key);
 
867
        hotkey=_parseAccel(key);
 
868
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
869
    
 
870
        mc=new FXMenuCommand(toolsmenu,_("&Synchronize panels"),syncpanelsicon,this,XFileExplorer::ID_SYNCHRONIZE_PANELS);
 
871
        key=getApp()->reg().readStringEntry("KEYBINDINGS","synchronize_panels","Ctrl-Y");
 
872
        mc->setAccelText(key);
 
873
        hotkey=_parseAccel(key);
 
874
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
875
   
 
876
        mc=new FXMenuCommand(toolsmenu,_("Sw&itch panels"),switchpanelsicon,this,XFileExplorer::ID_SWITCH_PANELS);
 
877
        key=getApp()->reg().readStringEntry("KEYBINDINGS","switch_panels","Ctrl-K");
 
878
        mc->setAccelText(key);
 
879
        hotkey=_parseAccel(key);
 
880
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
881
 
 
882
#if defined(linux)
 
883
        new FXMenuSeparator(toolsmenu);
 
884
    
 
885
        mc=new FXMenuCommand(toolsmenu,_("&Mount"),maphosticon,lpanel,FilePanel::ID_MOUNT);
 
886
        key=getApp()->reg().readStringEntry("KEYBINDINGS","mount","Ctrl-M");
 
887
        mc->setAccelText(key);
 
888
    
 
889
        mc=new FXMenuCommand(toolsmenu,_("&Unmount"),unmaphosticon,lpanel,FilePanel::ID_UMOUNT);
 
890
        key=getApp()->reg().readStringEntry("KEYBINDINGS","unmount","Ctrl-U");
 
891
        mc->setAccelText(key);
 
892
 
 
893
#endif
 
894
        toolsmenutitle=new FXMenuTitle(menubar,_("&Tools"),NULL,toolsmenu);
 
895
 
 
896
        // Trash menu
 
897
        trashmenu=new FXMenuPane(this);
 
898
    
 
899
        mc=new FXMenuCommand(trashmenu,_("&Go to trash"),totrashicon,lpanel,FilePanel::ID_GO_TRASH);
 
900
        key=getApp()->reg().readStringEntry("KEYBINDINGS","go_to_trash","Ctrl-F8");
 
901
        mc->setAccelText(key);
 
902
        hotkey=_parseAccel(key);
 
903
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
904
    
 
905
        mc=new FXMenuCommand(trashmenu,_("&Trash size"),filedeleteicon,this,XFileExplorer::ID_TRASH_SIZE);
 
906
 
 
907
        mc=new FXMenuCommand(trashmenu,_("&Empty trash can"),trash_fullicon,this,XFileExplorer::ID_EMPTY_TRASH);
 
908
        key=getApp()->reg().readStringEntry("KEYBINDINGS","empty_trash_can","Ctrl-Del");
 
909
        mc->setAccelText(key);
 
910
        hotkey=_parseAccel(key);
 
911
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
912
 
 
913
 
 
914
        trashmenutitle=new FXMenuTitle(menubar,_("T&rash"),NULL,trashmenu);
 
915
 
 
916
        // Help menu
 
917
    helpmenu=new FXMenuPane(this);
 
918
    
 
919
        mc=new FXMenuCommand(helpmenu,_("&Help"),helpicon,this,ID_HELP);
 
920
        key=getApp()->reg().readStringEntry("KEYBINDINGS","help","F1");
 
921
        mc->setAccelText(key);
 
922
        hotkey=_parseAccel(key);
 
923
        getAccelTable()->addAccel(hotkey,mc,FXSEL(SEL_COMMAND,FXMenuCommand::ID_ACCEL));
 
924
    
 
925
        new FXMenuCommand(helpmenu,_("&About X File Explorer"),NULL,this,ID_ABOUT);
 
926
    helpmenutitle=new FXMenuTitle(menubar,_("&Help"),NULL,helpmenu);
 
927
 
 
928
        // Other accelerators
 
929
        
 
930
        key=getApp()->reg().readStringEntry("KEYBINDINGS","edit","F4");
 
931
        hotkey=_parseAccel(key);        
 
932
        getAccelTable()->addAccel(hotkey,lpanel,FXSEL(SEL_COMMAND,FilePanel::ID_EDIT));
 
933
 
 
934
        key=getApp()->reg().readStringEntry("KEYBINDINGS","view","Shift-F4");
 
935
        hotkey=_parseAccel(key);        
 
936
        getAccelTable()->addAccel(hotkey,lpanel,FXSEL(SEL_COMMAND,FilePanel::ID_VIEW));
 
937
 
 
938
        key=getApp()->reg().readStringEntry("KEYBINDINGS","hidden_dirs","Ctrl-F5");
 
939
        hotkey=_parseAccel(key);        
 
940
        getAccelTable()->addAccel(hotkey,dirpanel,FXSEL(SEL_COMMAND,DirPanel::ID_TOGGLE_HIDDEN));
 
941
        
 
942
        key=getApp()->reg().readStringEntry("KEYBINDINGS","filter","Ctrl-D");
 
943
        hotkey=_parseAccel(key);        
 
944
        getAccelTable()->addAccel(hotkey,lpanel,FXSEL(SEL_COMMAND,FilePanel::ID_FILTER_CURRENT));
 
945
 
 
946
        key=getApp()->reg().readStringEntry("KEYBINDINGS","hidden_files","Ctrl-F6");
 
947
        hotkey=_parseAccel(key);        
 
948
        getAccelTable()->addAccel(hotkey,lpanel,FXSEL(SEL_COMMAND,FilePanel::ID_TOGGLE_HIDDEN));
 
949
        
 
950
        key=getApp()->reg().readStringEntry("KEYBINDINGS","thumbnails","Ctrl-F7");
 
951
        hotkey=_parseAccel(key);        
 
952
        getAccelTable()->addAccel(hotkey,lpanel,FXSEL(SEL_COMMAND,FilePanel::ID_TOGGLE_THUMBNAILS));
 
953
 
 
954
        key=getApp()->reg().readStringEntry("KEYBINDINGS","close","Ctrl-W");
 
955
        hotkey=_parseAccel(key);        
 
956
        getAccelTable()->addAccel(hotkey,this,FXSEL(SEL_COMMAND,XFileExplorer::ID_QUIT));
 
957
        
 
958
        // Escape key
 
959
        getAccelTable()->addAccel(KEY_Escape,lpanel,FXSEL(SEL_COMMAND,FilePanel::ID_DESELECT_ALL));
 
960
        
 
961
    // Make a tool tip
 
962
    new FXToolTip(app,0);
 
963
 
 
964
        // File operations dialog
 
965
    rundialog=NULL;
 
966
        prefsdialog=NULL;
 
967
        helpwindow=NULL;
 
968
        
 
969
        // Initial focus is on (left) file panel
 
970
        panelfocus=FILEPANEL_FOCUS;
 
971
        
 
972
        // Trahscan locations
 
973
        trashfileslocation=xdgdatahome + PATHSEPSTRING TRASHFILESPATH;
 
974
        trashinfolocation=xdgdatahome + PATHSEPSTRING TRASHINFOPATH;
 
975
 
 
976
        // Start location (we return to the start location after each chdir)
 
977
        startlocation=FXSystem::getCurrentDirectory();
 
978
 
 
979
        // Other initializations
 
980
        startdirectory=startdir;
 
981
        starticonic=iconic;
 
982
        startmaximized=maximized;
 
983
        prevdir=FXString::null;
 
984
        prev_width=getWidth();
 
985
}
 
986
 
 
987
 
 
988
// Save configuration when quitting
 
989
void XFileExplorer::saveConfig()
 
990
{       
 
991
        // Get autosave flag
 
992
    FXbool auto_save_layout=getApp()->reg().readUnsignedEntry("OPTIONS","auto_save_layout",TRUE);
 
993
 
 
994
        if(auto_save_layout==TRUE)
 
995
    {
 
996
                FXString sort_func;
 
997
 
 
998
                // Dir panel options
 
999
                if (dirpanel->getSortFunc()==DirList::ascendingCase)
 
1000
                        sort_func="ascendingCase";
 
1001
                else if (dirpanel->getSortFunc()==DirList::descendingCase)
 
1002
                        sort_func="descendingCase";
 
1003
                else if (dirpanel->getSortFunc()==DirList::ascending)
 
1004
                        sort_func="ascending";
 
1005
                else if (dirpanel->getSortFunc()==DirList::descending)
 
1006
                        sort_func="descending";
 
1007
                else
 
1008
                        sort_func="ascendingCase";
 
1009
                getApp()->reg().writeStringEntry("DIR PANEL","sort_func",sort_func.text());
 
1010
        getApp()->reg().writeUnsignedEntry("DIR PANEL","hidden_dir",dirpanel->shownHiddenFiles());
 
1011
 
 
1012
                // Left panel options
 
1013
                getApp()->reg().writeUnsignedEntry("LEFT PANEL","name_size",lpanel->getHeaderSize(0));
 
1014
        getApp()->reg().writeUnsignedEntry("LEFT PANEL","size_size",lpanel->getHeaderSize(1));
 
1015
        getApp()->reg().writeUnsignedEntry("LEFT PANEL","type_size",lpanel->getHeaderSize(2));
 
1016
        getApp()->reg().writeUnsignedEntry("LEFT PANEL","ext_size",lpanel->getHeaderSize(3));
 
1017
        getApp()->reg().writeUnsignedEntry("LEFT PANEL","modd_size",lpanel->getHeaderSize(4));
 
1018
        getApp()->reg().writeUnsignedEntry("LEFT PANEL","user_size",lpanel->getHeaderSize(5));
 
1019
        getApp()->reg().writeUnsignedEntry("LEFT PANEL","grou_size",lpanel->getHeaderSize(6));
 
1020
        getApp()->reg().writeUnsignedEntry("LEFT PANEL","attr_size",lpanel->getHeaderSize(7));
 
1021
        getApp()->reg().writeUnsignedEntry("LEFT PANEL","deldate_size",lpanel->getHeaderSize(8));
 
1022
        getApp()->reg().writeUnsignedEntry("LEFT PANEL","origpath_size",lpanel->getHeaderSize(9));
 
1023
                getApp()->reg().writeUnsignedEntry("LEFT PANEL","liststyle",lpanel->getListStyle());
 
1024
        getApp()->reg().writeUnsignedEntry("LEFT PANEL","hiddenfiles",lpanel->shownHiddenFiles());
 
1025
        getApp()->reg().writeUnsignedEntry("LEFT PANEL","showthumbnails",lpanel->shownThumbnails());
 
1026
 
 
1027
                // Get and write sort function for left panel
 
1028
                if (lpanel->getSortFunc()==FileList::ascendingCase)
 
1029
                        sort_func="ascendingCase";
 
1030
                else if (lpanel->getSortFunc()==FileList::ascendingCaseMix)
 
1031
                        sort_func="ascendingCaseMix";
 
1032
                else if (lpanel->getSortFunc()==FileList::descendingCase)
 
1033
                        sort_func="descendingCase";
 
1034
                else if (lpanel->getSortFunc()==FileList::descendingCaseMix)
 
1035
                        sort_func="descendingCaseMix";
 
1036
                else if (lpanel->getSortFunc()==FileList::ascending)
 
1037
                        sort_func="ascending";
 
1038
                else if (lpanel->getSortFunc()==FileList::ascendingMix)
 
1039
                        sort_func="ascendingMix";
 
1040
                else if (lpanel->getSortFunc()==FileList::descending)
 
1041
                        sort_func="descending";
 
1042
                else if (lpanel->getSortFunc()==FileList::descendingMix)
 
1043
                        sort_func="descendingMix";
 
1044
                else if (lpanel->getSortFunc()==FileList::ascendingSize)
 
1045
                        sort_func="ascendingSize";
 
1046
                else if (lpanel->getSortFunc()==FileList::ascendingSizeMix)
 
1047
                        sort_func="ascendingSizeMix";
 
1048
                else if (lpanel->getSortFunc()==FileList::descendingSize)
 
1049
                        sort_func="descendingSize";
 
1050
                else if (lpanel->getSortFunc()==FileList::descendingSizeMix)
 
1051
                        sort_func="descendingSizeMix";
 
1052
                else if (lpanel->getSortFunc()==FileList::ascendingType)
 
1053
                        sort_func="ascendingType";
 
1054
                else if (lpanel->getSortFunc()==FileList::ascendingTypeMix)
 
1055
                        sort_func="ascendingTypeMix";
 
1056
                else if (lpanel->getSortFunc()==FileList::descendingType)
 
1057
                        sort_func="descendingType";
 
1058
                else if (lpanel->getSortFunc()==FileList::descendingTypeMix)
 
1059
                        sort_func="descendingTypeMix";
 
1060
                else if (lpanel->getSortFunc()==FileList::ascendingExt)
 
1061
                        sort_func="ascendingExt";
 
1062
                else if (lpanel->getSortFunc()==FileList::ascendingExtMix)
 
1063
                        sort_func="ascendingExtMix";
 
1064
                else if (lpanel->getSortFunc()==FileList::descendingExt)
 
1065
                        sort_func="descendingExt";
 
1066
                else if (lpanel->getSortFunc()==FileList::descendingExtMix)
 
1067
                        sort_func="descendingExtMix";
 
1068
                else if (lpanel->getSortFunc()==FileList::ascendingTime)
 
1069
                        sort_func="ascendingTime";
 
1070
                else if (lpanel->getSortFunc()==FileList::ascendingTimeMix)
 
1071
                        sort_func="ascendingTimeMix";
 
1072
                else if (lpanel->getSortFunc()==FileList::descendingTime)
 
1073
                        sort_func="descendingTime";
 
1074
                else if (lpanel->getSortFunc()==FileList::descendingTimeMix)
 
1075
                        sort_func="descendingTimeMix";
 
1076
                else if (lpanel->getSortFunc()==FileList::ascendingUser)
 
1077
                        sort_func="ascendingUser";
 
1078
                else if (lpanel->getSortFunc()==FileList::ascendingUserMix)
 
1079
                        sort_func="ascendingUserMix";
 
1080
                else if (lpanel->getSortFunc()==FileList::descendingUser)
 
1081
                        sort_func="descendingUser";
 
1082
                else if (lpanel->getSortFunc()==FileList::descendingUserMix)
 
1083
                        sort_func="descendingUserMix";
 
1084
                else if (lpanel->getSortFunc()==FileList::ascendingGroup)
 
1085
                        sort_func="ascendingGroup";
 
1086
                else if (lpanel->getSortFunc()==FileList::ascendingGroupMix)
 
1087
                        sort_func="ascendingGroupMix";
 
1088
                else if (lpanel->getSortFunc()==FileList::descendingGroup)
 
1089
                        sort_func="descendingGroup";
 
1090
                else if (lpanel->getSortFunc()==FileList::descendingGroupMix)
 
1091
                        sort_func="descendingGroupMix";
 
1092
                else if (lpanel->getSortFunc()==FileList::ascendingPerm)
 
1093
                        sort_func="ascendingPerm";
 
1094
                else if (lpanel->getSortFunc()==FileList::ascendingPermMix)
 
1095
                        sort_func="ascendingPermMix";
 
1096
                else if (lpanel->getSortFunc()==FileList::descendingPerm)
 
1097
                        sort_func="descendingPerm";
 
1098
                else if (lpanel->getSortFunc()==FileList::descendingPermMix)
 
1099
                        sort_func="descendingPermMix";
 
1100
                else
 
1101
                        sort_func="ascendingCase";
 
1102
                getApp()->reg().writeStringEntry("LEFT PANEL","sort_func",sort_func.text());
 
1103
        getApp()->reg().writeUnsignedEntry("LEFT PANEL","ignore_case",lpanel->getIgnoreCase());
 
1104
        getApp()->reg().writeUnsignedEntry("LEFT PANEL","dirs_first",lpanel->getDirsFirst());
 
1105
 
 
1106
                // Right panel options
 
1107
                getApp()->reg().writeUnsignedEntry("RIGHT PANEL","name_size",rpanel->getHeaderSize(0));
 
1108
        getApp()->reg().writeUnsignedEntry("RIGHT PANEL","size_size",rpanel->getHeaderSize(1));
 
1109
        getApp()->reg().writeUnsignedEntry("RIGHT PANEL","type_size",rpanel->getHeaderSize(2));
 
1110
        getApp()->reg().writeUnsignedEntry("RIGHT PANEL","ext_size",rpanel->getHeaderSize(3));
 
1111
        getApp()->reg().writeUnsignedEntry("RIGHT PANEL","modd_size",rpanel->getHeaderSize(4));
 
1112
        getApp()->reg().writeUnsignedEntry("RIGHT PANEL","user_size",rpanel->getHeaderSize(5));
 
1113
        getApp()->reg().writeUnsignedEntry("RIGHT PANEL","grou_size",rpanel->getHeaderSize(6));
 
1114
        getApp()->reg().writeUnsignedEntry("RIGHT PANEL","attr_size",rpanel->getHeaderSize(7));
 
1115
                getApp()->reg().writeUnsignedEntry("RIGHT PANEL","deldate_size",rpanel->getHeaderSize(8));
 
1116
        getApp()->reg().writeUnsignedEntry("RIGHT PANEL","origpath_size",rpanel->getHeaderSize(9));
 
1117
        getApp()->reg().writeUnsignedEntry("RIGHT PANEL","liststyle",rpanel->getListStyle());
 
1118
        getApp()->reg().writeUnsignedEntry("RIGHT PANEL","hiddenfiles",rpanel->shownHiddenFiles());
 
1119
        getApp()->reg().writeUnsignedEntry("RIGHT PANEL","showthumbnails",rpanel->shownThumbnails());
 
1120
 
 
1121
                // Get and write sort function for right panel
 
1122
                if (rpanel->getSortFunc()==FileList::ascendingCase)
 
1123
                        sort_func="ascendingCase";
 
1124
                else if (rpanel->getSortFunc()==FileList::ascendingCaseMix)
 
1125
                        sort_func="ascendingCaseMix";
 
1126
                else if (rpanel->getSortFunc()==FileList::descendingCase)
 
1127
                        sort_func="descendingCase";
 
1128
                else if (rpanel->getSortFunc()==FileList::descendingCaseMix)
 
1129
                        sort_func="descendingCaseMix";
 
1130
                else if (rpanel->getSortFunc()==FileList::ascending)
 
1131
                        sort_func="ascending";
 
1132
                else if (rpanel->getSortFunc()==FileList::ascendingMix)
 
1133
                        sort_func="ascendingMix";
 
1134
                else if (rpanel->getSortFunc()==FileList::descending)
 
1135
                        sort_func="descending";
 
1136
                else if (rpanel->getSortFunc()==FileList::descendingMix)
 
1137
                        sort_func="descendingMix";
 
1138
                else if (rpanel->getSortFunc()==FileList::ascendingSize)
 
1139
                        sort_func="ascendingSize";
 
1140
                else if (rpanel->getSortFunc()==FileList::ascendingSizeMix)
 
1141
                        sort_func="ascendingSizeMix";
 
1142
                else if (rpanel->getSortFunc()==FileList::descendingSize)
 
1143
                        sort_func="descendingSize";
 
1144
                else if (rpanel->getSortFunc()==FileList::descendingSizeMix)
 
1145
                        sort_func="descendingSizeMix";
 
1146
                else if (rpanel->getSortFunc()==FileList::ascendingType)
 
1147
                        sort_func="ascendingType";
 
1148
                else if (rpanel->getSortFunc()==FileList::ascendingTypeMix)
 
1149
                        sort_func="ascendingTypeMix";
 
1150
                else if (rpanel->getSortFunc()==FileList::descendingType)
 
1151
                        sort_func="descendingType";
 
1152
                else if (rpanel->getSortFunc()==FileList::descendingTypeMix)
 
1153
                        sort_func="descendingTypeMix";
 
1154
                else if (rpanel->getSortFunc()==FileList::ascendingExt)
 
1155
                        sort_func="ascendingExt";
 
1156
                else if (rpanel->getSortFunc()==FileList::ascendingExtMix)
 
1157
                        sort_func="ascendingExtMix";
 
1158
                else if (rpanel->getSortFunc()==FileList::descendingExt)
 
1159
                        sort_func="descendingExt";
 
1160
                else if (rpanel->getSortFunc()==FileList::descendingExtMix)
 
1161
                        sort_func="descendingExtMix";
 
1162
                else if (rpanel->getSortFunc()==FileList::ascendingTime)
 
1163
                        sort_func="ascendingTime";
 
1164
                else if (rpanel->getSortFunc()==FileList::ascendingTimeMix)
 
1165
                        sort_func="ascendingTimeMix";
 
1166
                else if (rpanel->getSortFunc()==FileList::descendingTime)
 
1167
                        sort_func="descendingTime";
 
1168
                else if (rpanel->getSortFunc()==FileList::descendingTimeMix)
 
1169
                        sort_func="descendingTimeMix";
 
1170
                else if (rpanel->getSortFunc()==FileList::ascendingUser)
 
1171
                        sort_func="ascendingUser";
 
1172
                else if (rpanel->getSortFunc()==FileList::ascendingUserMix)
 
1173
                        sort_func="ascendingUserMix";
 
1174
                else if (rpanel->getSortFunc()==FileList::descendingUser)
 
1175
                        sort_func="descendingUser";
 
1176
                else if (rpanel->getSortFunc()==FileList::descendingUserMix)
 
1177
                        sort_func="descendingUserMix";
 
1178
                else if (rpanel->getSortFunc()==FileList::ascendingGroup)
 
1179
                        sort_func="ascendingGroup";
 
1180
                else if (rpanel->getSortFunc()==FileList::ascendingGroupMix)
 
1181
                        sort_func="ascendingGroupMix";
 
1182
                else if (rpanel->getSortFunc()==FileList::descendingGroup)
 
1183
                        sort_func="descendingGroup";
 
1184
                else if (rpanel->getSortFunc()==FileList::descendingGroupMix)
 
1185
                        sort_func="descendingGroupMix";
 
1186
                else if (rpanel->getSortFunc()==FileList::ascendingPerm)
 
1187
                        sort_func="ascendingPerm";
 
1188
                else if (rpanel->getSortFunc()==FileList::ascendingPermMix)
 
1189
                        sort_func="ascendingPermMix";
 
1190
                else if (rpanel->getSortFunc()==FileList::descendingPerm)
 
1191
                        sort_func="descendingPerm";
 
1192
                else if (rpanel->getSortFunc()==FileList::descendingPermMix)
 
1193
                        sort_func="descendingPermMix";
 
1194
                else
 
1195
                        sort_func="ascendingCase";
 
1196
                getApp()->reg().writeStringEntry("RIGHT PANEL","sort_func",sort_func.text());
 
1197
        getApp()->reg().writeUnsignedEntry("RIGHT PANEL","ignore_case",rpanel->getIgnoreCase());
 
1198
        getApp()->reg().writeUnsignedEntry("RIGHT PANEL","dirs_first",rpanel->getDirsFirst());
 
1199
 
 
1200
        // Global options
 
1201
                getApp()->reg().writeUnsignedEntry("OPTIONS","width",(FXuint)getWidth());
 
1202
        getApp()->reg().writeUnsignedEntry("OPTIONS","height",(FXuint)getHeight());
 
1203
        
 
1204
        // Get value of window position flag and position the window
 
1205
        FXbool save_win_pos=getApp()->reg().readUnsignedEntry("SETTINGS","save_win_pos",FALSE);
 
1206
        if (save_win_pos)
 
1207
                {
 
1208
                        // Account for the Window Manager border size
 
1209
                        XWindowAttributes xwattr;
 
1210
                        if (XGetWindowAttributes((Display*)getApp()->getDisplay(),this->id(),&xwattr))
 
1211
                        {
 
1212
                                getApp()->reg().writeIntEntry("OPTIONS","xpos",getX()-xwattr.x);
 
1213
                                getApp()->reg().writeIntEntry("OPTIONS","ypos",getY()-xwattr.y);
 
1214
                        }
 
1215
                        else
 
1216
                        {
 
1217
                                getApp()->reg().writeIntEntry("OPTIONS","xpos",getX());
 
1218
                                getApp()->reg().writeIntEntry("OPTIONS","ypos",getY());
 
1219
                        }
 
1220
                }
 
1221
        getApp()->reg().writeUnsignedEntry("OPTIONS","generaltoolbar",(FXuint)generaltoolbar->shown());
 
1222
        getApp()->reg().writeUnsignedEntry("OPTIONS","toolstoolbar",(FXuint)toolstoolbar->shown());
 
1223
        getApp()->reg().writeUnsignedEntry("OPTIONS","paneltoolbar",(FXuint)paneltoolbar->shown());
 
1224
                getApp()->reg().writeUnsignedEntry("OPTIONS","locationbar",(FXuint)locationbar->shown());
 
1225
        getApp()->reg().writeUnsignedEntry("OPTIONS","status",(FXuint)lpanel->statusbarShown());
 
1226
        getApp()->reg().writeUnsignedEntry("SETTINGS","file_tooltips",(FXuint)file_tooltips);
 
1227
        getApp()->reg().writeUnsignedEntry("SETTINGS","relative_resize",(FXuint)relative_resize);
 
1228
        getApp()->reg().writeRealEntry("OPTIONS","treepanel_tree_pct",treepanel_tree_pct);
 
1229
        getApp()->reg().writeRealEntry("OPTIONS","twopanels_lpanel_pct",twopanels_lpanel_pct);
 
1230
        getApp()->reg().writeRealEntry("OPTIONS","treetwopanels_tree_pct",treetwopanels_tree_pct);
 
1231
        getApp()->reg().writeRealEntry("OPTIONS","treetwopanels_lpanel_pct",treetwopanels_lpanel_pct);
 
1232
                
 
1233
                // Save panel view only if not given from command line
 
1234
                if (panel_mode == -1)
 
1235
                        getApp()->reg().writeUnsignedEntry("OPTIONS","panel_view",(FXuint)panel_view);
 
1236
 
 
1237
        getApp()->reg().writeUnsignedEntry("SETTINGS","single_click",single_click);
 
1238
 
 
1239
        FXString history="";
 
1240
        for(FXint i=0;i<RunHistSize;i++)
 
1241
        {
 
1242
            history+=RunHistory[i];
 
1243
            history+=":";
 
1244
        }
 
1245
        if(RunHistory)
 
1246
            getApp()->reg().writeStringEntry("HISTORY","run",history.text());
 
1247
 
 
1248
        history="";
 
1249
        for(FXint i=0;i<OpenNum;i++)
 
1250
        {
 
1251
            history+=OpenHistory[i];
 
1252
            history+=":";
 
1253
        }
 
1254
        if(OpenNum)
 
1255
            getApp()->reg().writeStringEntry("HISTORY","open",history.text());
 
1256
 
 
1257
        history="";
 
1258
        for(FXint i=0;i<FilterNum;i++)
 
1259
        {
 
1260
            history+=FilterHistory[i];
 
1261
            history+=":";
 
1262
        }
 
1263
        if(FilterNum)
 
1264
            getApp()->reg().writeStringEntry("HISTORY","filter",history.text());
 
1265
    }
 
1266
        getApp()->reg().write();
 
1267
}
 
1268
 
 
1269
// Make application
 
1270
void XFileExplorer::create()
 
1271
{
 
1272
        // Eventually select panel mode from the command line option
 
1273
        // or revert to last saved panel view
 
1274
        switch (panel_mode)
 
1275
        {
 
1276
        case 0:
 
1277
                panel_view=TREE_PANEL;
 
1278
                break;
 
1279
        case 1:
 
1280
                panel_view=ONE_PANEL;
 
1281
                break;
 
1282
        case 2:
 
1283
                panel_view=TWO_PANELS;
 
1284
                break;
 
1285
        case 3:
 
1286
                panel_view=TREE_TWO_PANELS;
 
1287
                break;
 
1288
        default:
 
1289
                panel_view=getApp()->reg().readUnsignedEntry("OPTIONS","panel_view",TREE_PANEL);
 
1290
        }
 
1291
 
 
1292
    FXint width=getApp()->reg().readUnsignedEntry("OPTIONS","width",DEFAULT_WINDOW_WIDTH);
 
1293
    FXint height=getApp()->reg().readUnsignedEntry("OPTIONS","height",DEFAULT_WINDOW_HEIGHT);
 
1294
    FXint save_win_pos=getApp()->reg().readUnsignedEntry("SETTINGS","save_win_pos",FALSE);
 
1295
    if (save_win_pos)
 
1296
        {
 
1297
                FXint xpos=getApp()->reg().readIntEntry("OPTIONS","xpos",DEFAULT_WINDOW_XPOS);
 
1298
                FXint ypos=getApp()->reg().readIntEntry("OPTIONS","ypos",DEFAULT_WINDOW_YPOS);
 
1299
                position(xpos,ypos,width,height);
 
1300
        }
 
1301
        else
 
1302
        position(getX(),getY(),width,height);
 
1303
 
 
1304
    FXMainWindow::create();
 
1305
        FXint window_width=getWidth();
 
1306
        twopanels_lpanel_pct=getApp()->reg().readRealEntry("OPTIONS","twopanels_lpanel_pct",0.50);
 
1307
        treepanel_tree_pct=getApp()->reg().readRealEntry("OPTIONS","treepanel_tree_pct",0.20);
 
1308
        treetwopanels_tree_pct=getApp()->reg().readRealEntry("OPTIONS","treetwopanels_tree_pct",0.20);
 
1309
        treetwopanels_lpanel_pct=getApp()->reg().readRealEntry("OPTIONS","treetwopanels_lpanel_pct",0.40);
 
1310
        
 
1311
        switch(panel_view)
 
1312
        {
 
1313
        case ONE_PANEL:
 
1314
                rpanel->hide();
 
1315
        dirpanel->hide();
 
1316
                // Handle drag corner 
 
1317
                rpanel->showCorner(FALSE);
 
1318
                lpanel->showCorner(TRUE);
 
1319
                // Handle active icon
 
1320
        lpanel->showActiveIcon(FALSE);
 
1321
                lpanel->setWidth((FXint)round(1.0*window_width));
 
1322
                break;
 
1323
        case TWO_PANELS:
 
1324
                dirpanel->hide();
 
1325
                lpanel->setWidth((FXint)round(twopanels_lpanel_pct*window_width));
 
1326
                // Handle drag corner 
 
1327
                rpanel->showCorner(TRUE);
 
1328
                lpanel->showCorner(FALSE);
 
1329
                // Handle active icon
 
1330
       lpanel->showActiveIcon(TRUE);
 
1331
                break;
 
1332
        case TREE_PANEL:
 
1333
                rpanel->hide();
 
1334
                dirpanel->setWidth((FXint)round(treepanel_tree_pct*window_width));
 
1335
                lpanel->setWidth((FXint)round((1.0-treepanel_tree_pct)*window_width));
 
1336
                // Handle drag corner 
 
1337
                rpanel->showCorner(FALSE);
 
1338
                lpanel->showCorner(TRUE);
 
1339
                // Handle active icon
 
1340
        lpanel->showActiveIcon(TRUE);
 
1341
                break;
 
1342
        case TREE_TWO_PANELS:
 
1343
                dirpanel->setWidth((FXint)round(treetwopanels_tree_pct*window_width));
 
1344
                lpanel->setWidth((FXint)round(treetwopanels_lpanel_pct*window_width));
 
1345
                // Handle drag corner 
 
1346
                rpanel->showCorner(TRUE);
 
1347
                lpanel->showCorner(FALSE);
 
1348
                // Handle active icon
 
1349
        lpanel->showActiveIcon(TRUE);
 
1350
                break;
 
1351
        }
 
1352
 
 
1353
    if(!getApp()->reg().readUnsignedEntry("OPTIONS","generaltoolbar",TRUE))
 
1354
        generaltoolbar->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_TOGGLESHOWN),NULL);
 
1355
    if(!getApp()->reg().readUnsignedEntry("OPTIONS","toolstoolbar",TRUE))
 
1356
        toolstoolbar->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_TOGGLESHOWN),NULL);
 
1357
    if(!getApp()->reg().readUnsignedEntry("OPTIONS","paneltoolbar",TRUE))
 
1358
        paneltoolbar->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_TOGGLESHOWN),NULL);
 
1359
    if(!getApp()->reg().readUnsignedEntry("OPTIONS","locationbar",TRUE))
 
1360
        locationbar->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_TOGGLESHOWN),NULL);
 
1361
    if(!getApp()->reg().readUnsignedEntry("OPTIONS","status",TRUE))
 
1362
        handle(this,FXSEL(SEL_COMMAND,XFileExplorer::ID_TOGGLE_STATUS),NULL);
 
1363
        file_tooltips=getApp()->reg().readUnsignedEntry("SETTINGS","file_tooltips",1);
 
1364
        relative_resize=getApp()->reg().readUnsignedEntry("SETTINGS","relative_resize",1);
 
1365
 
 
1366
        // Wheel scrolling
 
1367
    FXint wheellines=getApp()->reg().readUnsignedEntry("SETTINGS","wheellines",5);
 
1368
        getApp()->setWheelLines(wheellines);
 
1369
        
 
1370
    // Open left or right panel in starting directory (if specified) or in current directory
 
1371
    if (startdirectory=="")
 
1372
        startdirectory=FXSystem::getCurrentDirectory();
 
1373
    lpanel->setDirectory(startdirectory);
 
1374
        lpanel->setPathLink(startdirectory);
 
1375
        lpanel->setPathText(startdirectory);
 
1376
    rpanel->setDirectory(startdirectory);
 
1377
        rpanel->setPathLink(startdirectory);
 
1378
        rpanel->setPathText(startdirectory);
 
1379
        dirpanel->setDirectory(startdirectory,TRUE);
 
1380
 
 
1381
        // Set file panels list style
 
1382
        liststyle=getApp()->reg().readUnsignedEntry("LEFT PANEL","liststyle",(FXuint)IconList::ID_SHOW_DETAILS);
 
1383
        lpanel->setListStyle(liststyle);
 
1384
    liststyle=getApp()->reg().readUnsignedEntry("RIGHT PANEL","liststyle",(FXuint)IconList::ID_SHOW_DETAILS);
 
1385
    rpanel->setListStyle(liststyle);
 
1386
 
 
1387
        // Show or hide hidden files listed in panels
 
1388
    FXbool hiddenfiles=getApp()->reg().readUnsignedEntry("LEFT PANEL","hiddenfiles",0);
 
1389
    lpanel->showHiddenFiles(hiddenfiles);
 
1390
    hiddenfiles=getApp()->reg().readUnsignedEntry("RIGHT PANEL","hiddenfiles",0);
 
1391
    rpanel->showHiddenFiles(hiddenfiles);
 
1392
        
 
1393
        // Show or hide hidden directories listed in dirpanel
 
1394
    FXbool hidden_dir=getApp()->reg().readUnsignedEntry("DIR PANEL","hidden_dir",0);
 
1395
    dirpanel->showHiddenFiles(hidden_dir);
 
1396
 
 
1397
        // History
 
1398
    FXString history=getApp()->reg().readStringEntry("HISTORY","run","");
 
1399
        FXint i;
 
1400
    FXString histent;
 
1401
    if(history != "")
 
1402
    {
 
1403
        for(i=0;;i++)
 
1404
        {
 
1405
            histent=history.section(':',i);
 
1406
            if(streq(histent.text(),""))
 
1407
                break;
 
1408
            strlcpy(RunHistory[i],histent.text(),histent.length()+1);
 
1409
        }
 
1410
        RunHistSize=i;
 
1411
    }
 
1412
    else
 
1413
        RunHistSize=0;
 
1414
                
 
1415
                
 
1416
    history=getApp()->reg().readStringEntry("HISTORY","open","");
 
1417
    histent="";
 
1418
    if(history != "")
 
1419
    {
 
1420
        for(i=0;;i++)
 
1421
        {
 
1422
            histent=history.section(':',i);
 
1423
            if(streq(histent.text(),""))
 
1424
                break;
 
1425
                        strlcpy(OpenHistory[i],histent.text(),histent.length()+1);
 
1426
        }
 
1427
        OpenNum=i;
 
1428
    }
 
1429
    else
 
1430
        OpenNum=0;
 
1431
 
 
1432
    history=getApp()->reg().readStringEntry("HISTORY","filter","");
 
1433
    histent="";
 
1434
    if(history != "")
 
1435
    {
 
1436
        for(i=0;;i++)
 
1437
        {
 
1438
            histent=history.section(':',i);
 
1439
            if(streq(histent.text(),""))
 
1440
                break;
 
1441
                        strlcpy(FilterHistory[i],histent.text(),histent.length()+1);
 
1442
        }
 
1443
        FilterNum=i;
 
1444
    }
 
1445
    else
 
1446
        FilterNum=0;
 
1447
 
 
1448
    getApp()->forceRefresh();
 
1449
 
 
1450
        // Running as root?
 
1451
    FXbool root_warn=getApp()->reg().readUnsignedEntry("OPTIONS","root_warn",TRUE);
 
1452
        if(getuid()==0 && root_warn)
 
1453
        MessageBox::information(this,BOX_OK,_("Warning"),_("Running Xfe as root!"));
 
1454
 
 
1455
        // Initial focus is always on the left panel
 
1456
        lpanel->setFocusOnList();
 
1457
        
 
1458
        // Show window
 
1459
    show();
 
1460
 
 
1461
#if defined(linux)
 
1462
        // Warning message if a mount point is down
 
1463
        FXbool mount_warn=getApp()->reg().readUnsignedEntry("OPTIONS","mount_warn",TRUE);
 
1464
        if (mount_warn)
 
1465
        {
 
1466
                FXint d;
 
1467
                for (d=updevices->first(); d<updevices->size(); d=updevices->next(d))
 
1468
                {
 
1469
                        if(streq(updevices->data(d),"down"))
 
1470
                                MessageBox::warning(this,BOX_OK,_("Warning"),_("Mount point %s is not responding..."),updevices->key(d));
 
1471
                }
 
1472
        }
 
1473
#endif
 
1474
 
 
1475
        // If no Xfe local configuration exists (i.e. at first call or after a purge of the configuration files),
 
1476
        // copy the global xferc file to the local configuration directory, and read / write the registry
 
1477
        FXint mask;
 
1478
        FXString configlocation=xdgconfighome + PATHSEPSTRING XFECONFIGPATH;
 
1479
        FXString configpath=configlocation + PATHSEPSTRING XFECONFIGNAME;
 
1480
        if (!::exists(configpath))
 
1481
        {
 
1482
                // If old configuration path (i.e. ~/.xfe) exists then warn the user about the new configuration scheme
 
1483
                FXString oldconfigpath=homedir + PATHSEPSTRING ".xfe";
 
1484
                if (::exists(oldconfigpath))
 
1485
                {
 
1486
                        // Display warning message              
 
1487
                        FXString message;
 
1488
                        message.format(_("Starting from Xfe 1.32, the location of the configuration files has changed to '%s'.\nNote you can manually edit the new configuration files to import your old customizations..."),configlocation.text());
 
1489
                        MessageBox::warning(this,BOX_OK,_("Warning"),message.text());
 
1490
                }
 
1491
                
 
1492
                // Create ~/.config/xfe directory if it doesn't exist   
 
1493
                if (!::exists(configlocation))
 
1494
                {
 
1495
                        // Create the ~/.config/xfe directory according to the umask
 
1496
                        mask=umask(0);
 
1497
                        umask(mask);
 
1498
                        errno=0;
 
1499
                        FXint ret=mkpath(configlocation.text(),511 & ~mask);
 
1500
                        FXint errcode=errno;
 
1501
                        if (ret==-1)
 
1502
                        {
 
1503
                                if (errcode)
 
1504
                                        MessageBox::error(this,BOX_OK,_("Error"),_("Can't create Xfe config folder %s : %s"),configlocation.text(),strerror(errcode));
 
1505
                                else
 
1506
                                        MessageBox::error(this,BOX_OK,_("Error"),_("Can't create Xfe config folder %s"),configlocation.text());                                 
 
1507
                        }
 
1508
                }
 
1509
                
 
1510
                // Copy the global xfrec file (three possible locations) to the local configuration file
 
1511
                if (::exists("/usr/share/xfe/xferc"))
 
1512
                        FXFile::copy("/usr/share/xfe/xferc",configpath,FALSE);          
 
1513
                else if (::exists("/usr/local/share/xfe/xferc"))
 
1514
                        FXFile::copy("/usr/local/share/xfe/xferc",configpath,FALSE);
 
1515
                else if (::exists("/opt/local/share/xfe/xferc"))
 
1516
                        FXFile::copy("/opt/local/share/xfe/xferc",configpath,FALSE);
 
1517
 
 
1518
                // If nothing is found, display a file dialog to let the user choose the right place
 
1519
                else
 
1520
                {
 
1521
                        FileDialog browse(this,_("No global xferc file found! Please select a configuration file..."));
 
1522
 
 
1523
                        const FXchar *patterns[]=
 
1524
                        {
 
1525
                                _("XFE configuration file"),     "*xferc*",NULL
 
1526
                        };
 
1527
                        browse.setFilename(ROOTDIR);
 
1528
                        browse.setPatternList(patterns);
 
1529
                        if(browse.execute())
 
1530
                        {
 
1531
                                FXString path=browse.getFilename();
 
1532
                                FXFile::copy(path,configpath,FALSE);
 
1533
                        }
 
1534
                }
 
1535
 
 
1536
                // Read and write the registry
 
1537
                getApp()->reg().read();
 
1538
                getApp()->reg().write();
 
1539
        }
 
1540
 
 
1541
    // Create trash can files directory if it doesn't exist
 
1542
        if (!::exists(trashfileslocation))
 
1543
        {
 
1544
                // Create the trash can files directory according to the umask
 
1545
                mask=umask(0);
 
1546
                umask(mask);
 
1547
                errno=0;
 
1548
                FXint ret=mkpath(trashfileslocation.text(),511 & ~mask);
 
1549
                FXint errcode=errno;
 
1550
                if (ret==-1)
 
1551
                {
 
1552
                        if (errcode)
 
1553
                                MessageBox::error(this,BOX_OK,_("Error"),_("Can't create trash can 'files' folder %s : %s"),trashfileslocation.text(),strerror(errcode));
 
1554
                        else
 
1555
                                MessageBox::error(this,BOX_OK,_("Error"),_("Can't create trash can 'files' folder %s"),trashfileslocation.text());                              
 
1556
                }
 
1557
        }
 
1558
    
 
1559
        // Create trash can info directory if it doesn't exist
 
1560
        if (!::exists(trashinfolocation))
 
1561
        {
 
1562
                // Create the trash can info directory according to the umask
 
1563
                mask=umask(0);
 
1564
                umask(mask);
 
1565
                errno=0;
 
1566
                FXint ret=mkpath(trashinfolocation.text(),511 & ~mask);
 
1567
                FXint errcode=errno;
 
1568
                if (ret==-1)
 
1569
                {
 
1570
                        if (errcode)
 
1571
                                MessageBox::error(this,BOX_OK,_("Error"),_("Can't create trash can 'info' folder %s: %s"),trashinfolocation.text(),strerror(errcode));
 
1572
                        else
 
1573
                                MessageBox::error(this,BOX_OK,_("Error"),_("Can't create trash can 'info' folder %s"),trashinfolocation.text());                                
 
1574
                }
 
1575
        }
 
1576
 
 
1577
        // Eventually start iconic or maximized
 
1578
        if (starticonic)
 
1579
                minimize();
 
1580
        if (startmaximized)
 
1581
                maximize();                     
 
1582
 
 
1583
#ifdef STARTUP_NOTIFICATION
 
1584
        startup_completed();
 
1585
#endif
 
1586
 
 
1587
}
 
1588
 
 
1589
// Destructor
 
1590
XFileExplorer::~XFileExplorer()
 
1591
{
 
1592
    delete menubar;
 
1593
        delete locationbar;
 
1594
        delete address;
 
1595
        delete filemenu;
 
1596
        delete toolsmenu;
 
1597
        delete trashmenu;
 
1598
        delete editmenu;
 
1599
        delete bookmarksmenu;
 
1600
        delete viewmenu;
 
1601
        delete lpanelmenu;
 
1602
        delete rpanelmenu;
 
1603
        delete helpmenu;
 
1604
        delete filemenutitle;
 
1605
        delete trashmenutitle;
 
1606
        delete editmenutitle;
 
1607
        delete bookmarksmenutitle;
 
1608
        delete viewmenutitle;
 
1609
        delete lpanelmenutitle;
 
1610
        delete rpanelmenutitle;
 
1611
        delete helpmenutitle;
 
1612
    delete generaltoolbar;
 
1613
        delete paneltoolbar;
 
1614
        delete toolstoolbar;
 
1615
    delete dirpanel;
 
1616
    delete lpanel;
 
1617
    delete rpanel;
 
1618
    delete bookmarks;   
 
1619
        delete btnbackhist;
 
1620
        delete btnforwardhist;
 
1621
        delete rundialog;
 
1622
        delete prefsdialog;
 
1623
        delete helpwindow;
 
1624
}
 
1625
 
 
1626
 
 
1627
// If Tab pressed, cycle through the panels 
 
1628
long XFileExplorer::onKeyPress(FXObject* sender,FXSelector sel,void* ptr)
 
1629
{
 
1630
    FXEvent* event=(FXEvent*)ptr;
 
1631
        FXint current;
 
1632
    
 
1633
        // Tab was pressed : cycle through the panels from left to right
 
1634
        if(event->code==KEY_Tab)
 
1635
    {
 
1636
                if (dirpanel->shown())
 
1637
                {
 
1638
                        if (dirpanel->isActive())
 
1639
                        {
 
1640
                                lpanel->setFocusOnList();
 
1641
                                current=lpanel->getCurrentItem();
 
1642
                                if (current<0)
 
1643
                                        current=0;
 
1644
                                lpanel->setCurrentItem(current);
 
1645
                                lpanel->selectItem(current);
 
1646
                        }
 
1647
                        else if ( (rpanel->shown()) && (lpanel->isActive()) )
 
1648
                        {
 
1649
                                rpanel->setFocusOnList();
 
1650
                                current=rpanel->getCurrentItem();
 
1651
                                if (current<0)
 
1652
                                        current=0;
 
1653
                                rpanel->setCurrentItem(current);
 
1654
                                rpanel->selectItem(current);                    
 
1655
                        }                       
 
1656
                        else
 
1657
                        {
 
1658
                                dirpanel->setFocusOnList();
 
1659
                                current=lpanel->getCurrentItem();
 
1660
                                if (current<0)
 
1661
                                        current=0;                              
 
1662
                                lpanel->deselectItem(current);
 
1663
                        }
 
1664
                }
 
1665
                else if (rpanel->shown())
 
1666
                {
 
1667
                        if (lpanel->getCurrent()==rpanel)
 
1668
                        {
 
1669
                                lpanel->setActive();
 
1670
                                current=lpanel->getCurrentItem();
 
1671
                                if (current<0)
 
1672
                                        current=0;
 
1673
                                lpanel->setCurrentItem(current);
 
1674
                                lpanel->selectItem(current);
 
1675
                        }
 
1676
                        else
 
1677
                        {
 
1678
                                rpanel->setActive();
 
1679
                                current=rpanel->getCurrentItem();
 
1680
                                if (current<0)
 
1681
                                        current=0;
 
1682
                                rpanel->setCurrentItem(current);
 
1683
                                rpanel->selectItem(current);
 
1684
                        }
 
1685
                }
 
1686
                return 1;
 
1687
        }
 
1688
 
 
1689
        // Shift-Tab was pressed : cycle through the panels from right to left
 
1690
        else if( ((event->state&SHIFTMASK) && (event->code==KEY_Tab))
 
1691
              || ((event->state&SHIFTMASK) && (event->code==KEY_ISO_Left_Tab)) )
 
1692
    {           
 
1693
                if (rpanel->shown())
 
1694
                {
 
1695
                        if (rpanel->isActive())
 
1696
                        {
 
1697
                                lpanel->setFocusOnList();
 
1698
                                current=lpanel->getCurrentItem();
 
1699
                                if (current<0)
 
1700
                                        current=0;
 
1701
                                lpanel->setCurrentItem(current);
 
1702
                                lpanel->selectItem(current);
 
1703
                        }
 
1704
                        else if (dirpanel->shown() && dirpanel->isActive())
 
1705
                        {
 
1706
                                rpanel->setFocusOnList();
 
1707
                                current=rpanel->getCurrentItem();
 
1708
                                if (current<0)
 
1709
                                        current=0;
 
1710
                                rpanel->setCurrentItem(current);
 
1711
                                rpanel->selectItem(current);                    
 
1712
                        }
 
1713
                        else if (lpanel->isActive())
 
1714
                        {
 
1715
                                if (dirpanel->shown())
 
1716
                                {
 
1717
                                        dirpanel->setFocusOnList();
 
1718
                                        current=lpanel->getCurrentItem();
 
1719
                                        if (current<0)
 
1720
                                                current=0;                              
 
1721
                                        lpanel->deselectItem(current);
 
1722
                                }
 
1723
                                else
 
1724
                                {
 
1725
                                        rpanel->setFocusOnList();
 
1726
                                        current=rpanel->getCurrentItem();
 
1727
                                        if (current<0)
 
1728
                                                current=0;
 
1729
                                        rpanel->setCurrentItem(current);
 
1730
                                        rpanel->selectItem(current);                    
 
1731
                                }
 
1732
                        }
 
1733
                }
 
1734
                else
 
1735
                {
 
1736
                        if (dirpanel->isActive() && dirpanel->shown())
 
1737
                        {
 
1738
                                lpanel->setFocusOnList();
 
1739
                                current=lpanel->getCurrentItem();
 
1740
                                if (current<0)
 
1741
                                        current=0;
 
1742
                                lpanel->setCurrentItem(current);
 
1743
                                lpanel->selectItem(current);
 
1744
                        }
 
1745
                        else if (dirpanel->shown())
 
1746
                        {
 
1747
                                dirpanel->setFocusOnList();
 
1748
                                current=lpanel->getCurrentItem();
 
1749
                                if (current<0)
 
1750
                                        current=0;                              
 
1751
                                lpanel->deselectItem(current);
 
1752
                        }                       
 
1753
                }
 
1754
                
 
1755
                return 1;
 
1756
        }
 
1757
 
 
1758
        // Shift-F10 was pressed : open popup menu
 
1759
        else if(event->state&SHIFTMASK && event->code==KEY_F10)
 
1760
    {
 
1761
                lpanel->getCurrent()->handle(sender,FXSEL(SEL_COMMAND,FilePanel::ID_POPUP_MENU),ptr);
 
1762
        return 1;
 
1763
    }
 
1764
 
 
1765
        // Any other key was pressed : handle the pressed key in the usual way
 
1766
    else
 
1767
        {
 
1768
                if(FXTopWindow::onKeyPress(sender,sel,ptr))
 
1769
                return 1;
 
1770
        }
 
1771
 
 
1772
        return 0;
 
1773
 
 
1774
}
 
1775
 
 
1776
 
 
1777
// Harvest the zombies
 
1778
long XFileExplorer::onSigHarvest(FXObject*,FXSelector,void*)
 
1779
{
 
1780
        while(waitpid(-1,NULL,WNOHANG)>0);
 
1781
        return 1;
 
1782
}
 
1783
 
 
1784
 
 
1785
// Handle quitting
 
1786
long XFileExplorer::onQuit(FXObject*,FXSelector,void*)
 
1787
{
 
1788
    FXbool confirm_quit=getApp()->reg().readUnsignedEntry("OPTIONS","confirm_quit",TRUE);
 
1789
        if(confirm_quit)
 
1790
        if(BOX_CLICKED_CANCEL==MessageBox::question(this,BOX_QUIT_CANCEL,_("Quitting Xfe"),_("Do you really want to quit Xfe?")))
 
1791
            return 1;
 
1792
    saveConfig();
 
1793
 
 
1794
        getApp()->exit(0);
 
1795
    return 1;
 
1796
}
 
1797
 
 
1798
 
 
1799
// Directory up
 
1800
long  XFileExplorer::onCmdDirUp(FXObject* sender,FXSelector,void*)
 
1801
{
 
1802
        lpanel->getCurrent()->handle(sender,FXSEL(SEL_COMMAND,FilePanel::ID_DIRECTORY_UP),NULL);
 
1803
 
 
1804
        // Set focus on dirpanel or filepanel
 
1805
        if (panelfocus==DIRPANEL_FOCUS)
 
1806
                dirpanel->setFocusOnList();
 
1807
        else
 
1808
                lpanel->getCurrent()->setFocusOnList();
 
1809
 
 
1810
    return 1;
 
1811
}
 
1812
 
 
1813
 
 
1814
// Directory back
 
1815
long  XFileExplorer::onCmdDirBack(FXObject*,FXSelector,void*)
 
1816
{
 
1817
        StringItem *item;
 
1818
        FXString pathname;
 
1819
        FilePanel* filepanel=lpanel->getCurrent();
 
1820
        
 
1821
        // Get the previous directory
 
1822
        item=filepanel->backhistGetFirst();
 
1823
        if (item)
 
1824
                pathname=filepanel->backhistGetString(item);
 
1825
        
 
1826
        // Update the history
 
1827
        filepanel->backhistRemoveFirstItem();
 
1828
        filepanel->forwardhistInsertFirstItem(filepanel->getDirectory());
 
1829
        
 
1830
        // Go to the previous directory
 
1831
        filepanel->setDirectory(pathname,FALSE);
 
1832
        filepanel->updatePath();
 
1833
        dirpanel->setDirectory(pathname,TRUE);
 
1834
        
 
1835
        // Set focus on dirpanel or filepanel
 
1836
        if (panelfocus==DIRPANEL_FOCUS)
 
1837
                dirpanel->setFocusOnList();
 
1838
        else
 
1839
                filepanel->setFocusOnList();
 
1840
 
 
1841
    return 1;
 
1842
}
 
1843
 
 
1844
 
 
1845
// Update directory back
 
1846
long  XFileExplorer::onUpdDirBack(FXObject* sender, FXSelector, void* ptr)
 
1847
{
 
1848
        FXString pathname;
 
1849
        FilePanel* filepanel=lpanel->getCurrent();
 
1850
        
 
1851
        // Gray out the button if no item in history 
 
1852
        if (filepanel->backhistGetNumItems()==0)
 
1853
                sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),ptr); 
 
1854
        else
 
1855
                sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),ptr);
 
1856
 
 
1857
    return 1;
 
1858
}
 
1859
 
 
1860
 
 
1861
// Directory forward
 
1862
long  XFileExplorer::onCmdDirForward(FXObject*,FXSelector,void*)
 
1863
{
 
1864
        StringItem *item;
 
1865
        FXString pathname;
 
1866
        FilePanel* filepanel=lpanel->getCurrent();
 
1867
 
 
1868
        // Get the next directory
 
1869
        item=filepanel->forwardhistGetFirst();
 
1870
        if (item)
 
1871
                pathname=filepanel->forwardhistGetString(item);
 
1872
        
 
1873
        // Update the history
 
1874
        filepanel->forwardhistRemoveFirstItem();
 
1875
        filepanel->backhistInsertFirstItem(lpanel->getCurrent()->getDirectory());
 
1876
        
 
1877
        // Go to the next directory
 
1878
        filepanel->setDirectory(pathname,FALSE);
 
1879
        filepanel->updatePath();
 
1880
        dirpanel->setDirectory(pathname,TRUE);
 
1881
 
 
1882
        // Set focus on dirpanel or filepanel
 
1883
        if (panelfocus==DIRPANEL_FOCUS)
 
1884
                dirpanel->setFocusOnList();
 
1885
        else
 
1886
                filepanel->setFocusOnList();
 
1887
 
 
1888
    return 1;
 
1889
}
 
1890
 
 
1891
 
 
1892
// Update directory forward
 
1893
long  XFileExplorer::onUpdDirForward(FXObject* sender, FXSelector sel, void* ptr)
 
1894
{
 
1895
        FXString pathname;
 
1896
        FilePanel* filepanel=lpanel->getCurrent();
 
1897
 
 
1898
        // Gray out the button if no item in history 
 
1899
        if (filepanel->forwardhistGetNumItems()==0)
 
1900
                sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),ptr);
 
1901
        else
 
1902
                sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),ptr);
 
1903
 
 
1904
    return 1;
 
1905
}
 
1906
 
 
1907
 
 
1908
// Directory back history
 
1909
long  XFileExplorer::onCmdDirBackHist(FXObject *sender,FXSelector sel,void* ptr)
 
1910
{
 
1911
        StringItem *item;
 
1912
        FXString pathname;
 
1913
        FilePanel* filepanel=lpanel->getCurrent();
 
1914
 
 
1915
        // Get all string items and display them in a list box
 
1916
        FXint num=filepanel->backhistGetNumItems();
 
1917
        if (num>0)
 
1918
        {
 
1919
                FXString *dirs= new FXString[num];
 
1920
                FXString strlist="";
 
1921
                
 
1922
                // Get string items
 
1923
                item=filepanel->backhistGetFirst();
 
1924
                FXint nb=0;
 
1925
                for(FXint i=0; i<=num-1; i++)
 
1926
                {
 
1927
                        if (item)
 
1928
                        {
 
1929
                                FXString str=filepanel->backhistGetString(item);
 
1930
                                FXbool flag=TRUE;
 
1931
                                for (FXint j=0; j<=nb-1; j++)
 
1932
                                {
 
1933
                                        if (str==dirs[j])
 
1934
                                        {
 
1935
                                                flag=FALSE;
 
1936
                                                break;
 
1937
                                        }
 
1938
                                }
 
1939
                                if (flag)
 
1940
                                {
 
1941
                                        dirs[nb]=str;
 
1942
                                        strlist=strlist+str+"\n";
 
1943
                                        nb++;
 
1944
                                }
 
1945
                                item=filepanel->backhistGetNext(item);
 
1946
                        }
 
1947
                }
 
1948
                
 
1949
                // Display list box
 
1950
                FXint pos=DirHistBox::box(btnbackhist,DECOR_NONE,strlist,this->getX()+40,this->getY()+60);
 
1951
                
 
1952
                // If an item was selected
 
1953
                if (pos!=-1)
 
1954
                {
 
1955
                        // Update back history
 
1956
                        if (pos==num-1)
 
1957
                                filepanel->backhistRemoveAllItems();
 
1958
                        else
 
1959
                        {
 
1960
                                item=filepanel->backhistGetItemAtPos(pos+1);
 
1961
                                filepanel->backhistRemoveAllItemsBefore(item);
 
1962
                        }
 
1963
                        
 
1964
                        // Update forward history
 
1965
                        filepanel->forwardhistInsertFirstItem(filepanel->getDirectory());
 
1966
                        if (pos>0)
 
1967
                        {
 
1968
                                for (FXint i=0; i<=pos-1; i++)
 
1969
                                        filepanel->forwardhistInsertFirstItem(dirs[i]);
 
1970
                        }
 
1971
        
 
1972
                        // Go to to the selected directory
 
1973
                        pathname=dirs[pos];
 
1974
                        filepanel->setDirectory(pathname,FALSE);
 
1975
                        filepanel->updatePath();
 
1976
                        dirpanel->setDirectory(pathname,TRUE);
 
1977
                }
 
1978
                delete[]dirs;
 
1979
        }
 
1980
 
 
1981
    return 1;
 
1982
}
 
1983
 
 
1984
 
 
1985
// Update directory back
 
1986
long  XFileExplorer::onUpdDirBackHist(FXObject* sender, FXSelector sel, void* ptr)
 
1987
{
 
1988
        FXString pathname;
 
1989
        FilePanel* filepanel=lpanel->getCurrent();
 
1990
 
 
1991
        // Gray out the button if no item in history 
 
1992
        if (filepanel->backhistGetNumItems()==0)
 
1993
                sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),ptr); 
 
1994
        else
 
1995
                sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),ptr);
 
1996
 
 
1997
    return 1;
 
1998
}
 
1999
 
 
2000
 
 
2001
// Directory forward history
 
2002
long  XFileExplorer::onCmdDirForwardHist(FXObject *sender,FXSelector sel,void* ptr)
 
2003
{
 
2004
        StringItem *item;
 
2005
        FXString pathname;
 
2006
        FilePanel* filepanel=lpanel->getCurrent();
 
2007
 
 
2008
        // Get all string items and display them in a list box
 
2009
        FXint num=filepanel->forwardhistGetNumItems();
 
2010
        if (num>0)
 
2011
        {
 
2012
                FXString *dirs= new FXString[num];
 
2013
                FXString strlist="";
 
2014
                
 
2015
                // Get string items
 
2016
                item=filepanel->forwardhistGetFirst();
 
2017
                FXint nb=0;
 
2018
                for(FXint i=0; i<=num-1; i++)
 
2019
                {
 
2020
                        if (item)
 
2021
                        {
 
2022
                                FXString str=filepanel->forwardhistGetString(item);
 
2023
                                FXbool flag=TRUE;
 
2024
                                for (FXint j=0; j<=nb-1; j++)
 
2025
                                {
 
2026
                                        if (str==dirs[j])
 
2027
                                        {
 
2028
                                                flag=FALSE;
 
2029
                                                break;
 
2030
                                        }
 
2031
                                }
 
2032
                                if (flag)
 
2033
                                {
 
2034
                                        dirs[nb]=str;
 
2035
                                        strlist=strlist+str+"\n";
 
2036
                                        nb++;
 
2037
                                }
 
2038
                                item=filepanel->forwardhistGetNext(item);
 
2039
                        }
 
2040
                }
 
2041
                
 
2042
                // Display list box
 
2043
                FXint pos=DirHistBox::box(btnforwardhist,DECOR_NONE,strlist,this->getX()+85,this->getY()+60);
 
2044
                
 
2045
                // If an item was selected
 
2046
                if (pos!=-1)
 
2047
                {
 
2048
                        // Update forward history
 
2049
                        if (pos==num-1)
 
2050
                                filepanel->forwardhistRemoveAllItems();
 
2051
                        else
 
2052
                        {
 
2053
                                item=filepanel->forwardhistGetItemAtPos(pos+1);
 
2054
                                filepanel->forwardhistRemoveAllItemsBefore(item);
 
2055
                        }
 
2056
                        
 
2057
                        // Update back history
 
2058
                        filepanel->backhistInsertFirstItem(filepanel->getDirectory());
 
2059
                        if (pos>0)
 
2060
                        {
 
2061
                                for (FXint i=0; i<=pos-1; i++)
 
2062
                                        filepanel->backhistInsertFirstItem(dirs[i]);
 
2063
                        }
 
2064
        
 
2065
                        // Go to to the selected directory
 
2066
                        pathname=dirs[pos];
 
2067
                        filepanel->setDirectory(pathname,FALSE);
 
2068
                        filepanel->updatePath();
 
2069
                        dirpanel->setDirectory(pathname,TRUE);
 
2070
                }
 
2071
                delete[]dirs;
 
2072
        }
 
2073
 
 
2074
    return 1;
 
2075
}
 
2076
 
 
2077
 
 
2078
// Update directory forward
 
2079
long  XFileExplorer::onUpdDirForwardHist(FXObject* sender, FXSelector sel, void* ptr)
 
2080
{
 
2081
        FXString pathname;
 
2082
        FilePanel* filepanel=lpanel->getCurrent();
 
2083
 
 
2084
        // Gray out the button if no item in history 
 
2085
        if (filepanel->forwardhistGetNumItems()==0)
 
2086
                sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),ptr);
 
2087
        else
 
2088
                sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),ptr);
 
2089
 
 
2090
    return 1;
 
2091
}
 
2092
 
 
2093
 
 
2094
// Handle bookmarks
 
2095
long  XFileExplorer::onCmdBookmark(FXObject*, FXSelector s, void* p)
 
2096
{
 
2097
    if(FXSELID(s) == ID_ADD_BOOKMARK)
 
2098
        {
 
2099
        bookmarks->appendBookmark(lpanel->getCurrent()->getDirectory());
 
2100
                saveConfig();
 
2101
        }
 
2102
        
 
2103
        // Handle location address fields
 
2104
        else if(FXSELID(s) == ID_BOOKMARK)
 
2105
        {
 
2106
        lpanel->getCurrent()->setDirectory((FXchar*)p);
 
2107
                lpanel->getCurrent()->updatePath();
 
2108
        dirpanel->setDirectory((FXchar*)p,TRUE);
 
2109
        FXString item;
 
2110
                FXint i=0;
 
2111
                FXint count=address->getNumItems();
 
2112
                if(!count)
 
2113
                {
 
2114
                        count++;
 
2115
                        address->insertItem(0,address->getText());
 
2116
                }
 
2117
        while(i < count)
 
2118
                {
 
2119
                item=address->getItem(i++);
 
2120
                if(streq((char*)p,(const char*)&item[0]))
 
2121
                        {
 
2122
                                i--;
 
2123
                                break;
 
2124
                        }
 
2125
        }
 
2126
        if(i==count) 
 
2127
                        address->insertItem(0,(FXchar*)p);
 
2128
    }
 
2129
    return 1;
 
2130
}
 
2131
 
 
2132
 
 
2133
// Goto location entered into the text field;
 
2134
long XFileExplorer::onCmdGotoLocation(FXObject*,FXSelector,void*)
 
2135
{
 
2136
        // Location where we want to go
 
2137
        FXString location=address->getText();
 
2138
        
 
2139
        // In case location is given in URI form, convert it
 
2140
        location=::fileFromURI(location);
 
2141
        
 
2142
        // Get complete path
 
2143
        FXString path=FXPath::absolute(lpanel->getCurrent()->getDirectory(),location);
 
2144
        FXString dir=path;
 
2145
 
 
2146
        // Go up to the lowest directory which still exists
 
2147
        while(!FXPath::isTopDirectory(dir) && !::isDirectory(dir))
 
2148
        dir=FXPath::upLevel(dir);
 
2149
 
 
2150
        // Move to this existing directory
 
2151
        lpanel->getCurrent()->setDirectory(dir);
 
2152
        lpanel->getCurrent()->updatePath();
 
2153
        dirpanel->setDirectory(dir,TRUE);
 
2154
        address->setText(dir);
 
2155
        
 
2156
        return 1;
 
2157
}
 
2158
 
 
2159
 
 
2160
// Clear location bar
 
2161
long XFileExplorer::onCmdClearLocation(FXObject*,FXSelector,void*)
 
2162
{
 
2163
  address->setText(FXString::null);
 
2164
  address->CursorEnd();
 
2165
  return 1;
 
2166
}
 
2167
 
 
2168
// Restart the application when required
 
2169
long  XFileExplorer::onCmdRestart(FXObject*,FXSelector,void*)
 
2170
{
 
2171
    saveConfig();
 
2172
 
 
2173
    if(fork() == 0)
 
2174
        execvp("xfe",args);
 
2175
    else
 
2176
        _exit(0);
 
2177
    return 1;
 
2178
}
 
2179
 
 
2180
// Start a new Xfe session
 
2181
long  XFileExplorer::onCmdNewWindow(FXObject*,FXSelector,void*)
 
2182
{
 
2183
        FXString cmd="xfe " + homedir + " &";
 
2184
        system(cmd.text());
 
2185
    return 1;
 
2186
}
 
2187
 
 
2188
// Run Terminal
 
2189
long  XFileExplorer::onCmdXTerm(FXObject*,FXSelector,void*)
 
2190
{
 
2191
        getApp()->beginWaitCursor();
 
2192
    FXString xterm=getApp()->reg().readStringEntry("PROGS","xterm","xterm -sb");
 
2193
        chdir(lpanel->getCurrent()->getDirectory().text());
 
2194
    FXString cmd=xterm;
 
2195
    cmd += " &";
 
2196
    system(cmd.text());
 
2197
    lpanel->getCurrent()->setFocusOnList();
 
2198
        chdir(startlocation.text());
 
2199
        getApp()->endWaitCursor();
 
2200
    return 1;
 
2201
}
 
2202
 
 
2203
 
 
2204
// Help menu
 
2205
long XFileExplorer::onCmdHelp(FXObject*,FXSelector,void*)
 
2206
{
 
2207
    // Display help window
 
2208
        if (helpwindow==NULL)
 
2209
                helpwindow=new TextWindow(getApp(),_("Help"),40,120);                   
 
2210
        helpwindow->setIcon(helpicon);
 
2211
 
 
2212
    // Set text font
 
2213
        FXString fontspec;
 
2214
        fontspec=getApp()->reg().readStringEntry("SETTINGS","textfont","Helvetica,100,normal,regular");
 
2215
        if(!fontspec.empty())
 
2216
        {
 
2217
        FXFont* font=new FXFont(getApp(),fontspec);
 
2218
        font->create();
 
2219
        helpwindow->setFont(font);
 
2220
        }
 
2221
 
 
2222
        // NB: The HELP_TEXT macro is defined in help.h
 
2223
        FXString str=(FXString)"                         "+COPYRIGHT+HELP_TEXT;
 
2224
        helpwindow->setText(str.text());
 
2225
        // Non modal window
 
2226
        helpwindow->create();
 
2227
        helpwindow->show(PLACEMENT_OWNER);
 
2228
        lpanel->getCurrent()->setFocusOnList();
 
2229
    return 1;
 
2230
}
 
2231
 
 
2232
 
 
2233
// About menu
 
2234
long XFileExplorer::onCmdAbout(FXObject*,FXSelector,void*)
 
2235
{
 
2236
    FXString msg;
 
2237
        msg.format(_("X File Explorer Version %s"),VERSION);
 
2238
        FXString copyright=(FXString)"\n\n" + COPYRIGHT + "\n\n" + _("Based on X WinCommander by Maxim Baranov\n");
 
2239
        FXString translators=
 
2240
_("\nTranslators\n\
 
2241
-------------\n\
 
2242
Argentinian Spanish: Bruno Gilberto Luciani\n\
 
2243
Brazilian Portuguese: Eduardo R.B.S., Jose Carlos Medeiros,\n\
 
2244
Phantom X, Tomas Acauan Schertel\n\
 
2245
Bosnian: Samir Ribi, Bajrami Emran, Balagija Jasmina,\n\
 
2246
Bilalovi, Omar Cogo Emir\n\
 
2247
Catalan: muzzol\n\
 
2248
Chinese: Xin Li\n\
 
2249
Chinese (Taïwan): Wei-Lun Chao\n\
 
2250
Czech: David Vachulka\n\
 
2251
Danish: Jonas Bardino, Vidar Jon Bauge\n\
 
2252
French: Claude Leo Mercier, Roland Baudin\n\
 
2253
German: Bastian Kleineidam, Joachim Wiedorn, Tim Benke, Jens Körner\n\
 
2254
Greek: Nikos Papadopoulos\n\
 
2255
Hungarian: Attila Szervac, Sandor Sipos\n\
 
2256
Italian: Claudio Fontana, Giorgio Moscardi\n\
 
2257
Japanese: Karl Skewes\n\
 
2258
Norwegian: Vidar Jon Bauge\n\
 
2259
Polish: Jacek Dziura, Franciszek Janowski\n\
 
2260
Portuguese: Miguel Santinho\n\
 
2261
Russian: Dimitri Sertolov, Vad Vad\n\
 
2262
Spanish: Felix Medrano Sanz, Lucas 'Basurero' Vieites,\n\
 
2263
Martin Carr\n\
 
2264
Swedish: Anders F. Bjorklund\n\
 
2265
Turkish: erkaN\n\
 
2266
");
 
2267
 
 
2268
        msg = msg + copyright + translators;
 
2269
    MessageBox about(this,_("About X File Explorer"),msg.text(),xfeicon,BOX_OK|DECOR_TITLE|DECOR_BORDER,
 
2270
                         JUSTIFY_CENTER_X|ICON_BEFORE_TEXT|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y); 
 
2271
        about.execute(PLACEMENT_OWNER);
 
2272
    lpanel->getCurrent()->setFocusOnList();
 
2273
    return 1;
 
2274
}
 
2275
 
 
2276
 
 
2277
// Handle file association (called by Properties.cc and FilePanel.cc)
 
2278
long XFileExplorer::onCmdFileAssoc(FXObject*,FXSelector s,void *p)
 
2279
{
 
2280
        char **str=(char**)p;
 
2281
    char* ext=str[0];
 
2282
    char* cmd=str[1];
 
2283
 
 
2284
        // ext=extension, cmd=associated command
 
2285
        // replace : to allow immediate association in Xfe
 
2286
    FileDict *associations=lpanel->getAssociations();
 
2287
        associations->replace(ext,cmd);
 
2288
    associations=rpanel->getAssociations();
 
2289
    associations->replace(ext,cmd);
 
2290
 
 
2291
    saveConfig();
 
2292
        
 
2293
    return 1;
 
2294
}
 
2295
 
 
2296
 
 
2297
// FilePanel and DirPanel refresh
 
2298
long XFileExplorer::onCmdRefresh(FXObject*,FXSelector,void*)
 
2299
{
 
2300
        getApp()->beginWaitCursor();
 
2301
        
 
2302
#if defined(linux)
 
2303
        dirpanel->forceDevicesRefresh();
 
2304
#endif
 
2305
        lpanel->getCurrent()->onCmdRefresh(0,0,0);
 
2306
        dirpanel->forceRefresh();
 
2307
        getApp()->endWaitCursor();
 
2308
        return 1;
 
2309
}
 
2310
 
 
2311
 
 
2312
// Update file location
 
2313
long XFileExplorer::onUpdFileLocation(FXObject* sender,FXSelector,void*)
 
2314
{
 
2315
        FXString currentdir=lpanel->getCurrent()->getDirectory();
 
2316
        if (currentdir != prevdir)
 
2317
        {
 
2318
                address->setText(::cleanPath(currentdir));
 
2319
                prevdir=currentdir;
 
2320
        }
 
2321
        return 1;
 
2322
}
 
2323
 
 
2324
 
 
2325
// Switch between the four possible panel views
 
2326
long XFileExplorer::onCmdShowPanels(FXObject* sender,FXSelector sel,void* ptr)
 
2327
{
 
2328
        // Get window width
 
2329
        FXint window_width=getWidth();
 
2330
 
 
2331
    switch(FXSELID(sel))
 
2332
    {
 
2333
    case ID_SHOW_ONE_PANEL:
 
2334
                panel_view=ONE_PANEL;
 
2335
                if (dirpanel->shown())
 
2336
                dirpanel->handle(sender,FXSEL(SEL_COMMAND,DirPanel::ID_TOGGLE_TREE),ptr);
 
2337
                if (rpanel->shown())
 
2338
                        rpanel->handle(sender,FXSEL(SEL_COMMAND,FXWindow::ID_TOGGLESHOWN),ptr); 
 
2339
                // Handle drag corner 
 
2340
                rpanel->showCorner(FALSE);
 
2341
                lpanel->showCorner(TRUE);
 
2342
        // Handle active icon
 
2343
        lpanel->showActiveIcon(FALSE);
 
2344
        
 
2345
        break;
 
2346
 
 
2347
        case ID_SHOW_TWO_PANELS:
 
2348
                panel_view=TWO_PANELS;
 
2349
                lpanel->setWidth((FXint)round(twopanels_lpanel_pct*window_width));
 
2350
                if (dirpanel->shown())
 
2351
                dirpanel->handle(sender,FXSEL(SEL_COMMAND,DirPanel::ID_TOGGLE_TREE),ptr);
 
2352
                if (!rpanel->shown())
 
2353
                        rpanel->handle(sender,FXSEL(SEL_COMMAND,FXWindow::ID_TOGGLESHOWN),ptr); 
 
2354
                // Handle drag corner 
 
2355
                rpanel->showCorner(TRUE);
 
2356
                lpanel->showCorner(FALSE);
 
2357
        // Handle active icon
 
2358
        lpanel->showActiveIcon(TRUE);
 
2359
        break;
 
2360
    
 
2361
        case ID_SHOW_TREE_PANEL:
 
2362
                panel_view=TREE_PANEL;
 
2363
                dirpanel->setWidth((FXint)round(treepanel_tree_pct*window_width) );
 
2364
                if (!dirpanel->shown())
 
2365
                dirpanel->handle(sender,FXSEL(SEL_COMMAND,DirPanel::ID_TOGGLE_TREE),ptr);
 
2366
                if (rpanel->shown())
 
2367
                        rpanel->handle(sender,FXSEL(SEL_COMMAND,FXWindow::ID_TOGGLESHOWN),ptr); 
 
2368
                // Handle drag corner 
 
2369
                rpanel->showCorner(FALSE);
 
2370
                lpanel->showCorner(TRUE);
 
2371
        // Handle active icon
 
2372
        lpanel->showActiveIcon(TRUE);
 
2373
                break;
 
2374
    
 
2375
        case ID_SHOW_TREE_TWO_PANELS:
 
2376
                panel_view=TREE_TWO_PANELS;
 
2377
                dirpanel->setWidth((FXint)round(treetwopanels_tree_pct*window_width) );
 
2378
                lpanel->setWidth((FXint)round(treetwopanels_lpanel_pct*window_width) );
 
2379
                if (!dirpanel->shown())
 
2380
                dirpanel->handle(sender,FXSEL(SEL_COMMAND,DirPanel::ID_TOGGLE_TREE),ptr);
 
2381
                if (!rpanel->shown())
 
2382
                        rpanel->handle(sender,FXSEL(SEL_COMMAND,FXWindow::ID_TOGGLESHOWN),ptr); 
 
2383
                // Handle drag corner 
 
2384
                lpanel->showCorner(FALSE);
 
2385
                rpanel->showCorner(TRUE);
 
2386
        // Handle active icon
 
2387
        lpanel->showActiveIcon(TRUE);
 
2388
        break;
 
2389
    }
 
2390
        
 
2391
        // Set focus on current panel
 
2392
        lpanel->getCurrent()->setFocusOnList();
 
2393
        
 
2394
        return 1;
 
2395
}
 
2396
 
 
2397
 
 
2398
// Update the panels
 
2399
long XFileExplorer::onUpdShowPanels(FXObject* sender,FXSelector sel,void* ptr)
 
2400
{               
 
2401
        // Keep the panel sizes relative to the window width (if option enabled)
 
2402
        
 
2403
        register FXint width;
 
2404
        
 
2405
        // Get the current window width
 
2406
        width=getWidth();
 
2407
        
 
2408
        // If width has changed and relative resizing option is enabled
 
2409
        if (relative_resize && prev_width!=width)
 
2410
        {
 
2411
                // One panel mode not relevant
 
2412
                
 
2413
                // Two panels mode
 
2414
                if (!dirpanel->shown() && rpanel->shown())
 
2415
                {
 
2416
                        // Set left panel width to the new value
 
2417
                        lpanel->setWidth((FXint)round(twopanels_lpanel_pct*width));
 
2418
                }
 
2419
                
 
2420
                // Tree panel mode
 
2421
                else if (dirpanel->shown() && !rpanel->shown())
 
2422
                {
 
2423
                        // Set dirpanel width to the new value
 
2424
                        dirpanel->setWidth((FXint)round(treepanel_tree_pct * width) );
 
2425
                }
 
2426
                
 
2427
                // Tree and two panels mode
 
2428
                else if (dirpanel->shown() && rpanel->shown())
 
2429
                {
 
2430
                        // Set dirpanel width to the new value
 
2431
                        dirpanel->setWidth((FXint)round(treetwopanels_tree_pct * width) );
 
2432
                        
 
2433
                        // Set left panel width to the new value
 
2434
                        lpanel->setWidth((FXint)round(treetwopanels_lpanel_pct * width) );
 
2435
                }
 
2436
        }
 
2437
                        
 
2438
        // Update previous window width
 
2439
        prev_width=width;                       
 
2440
                
 
2441
 
 
2442
        // Update the panel menus and the panel display
 
2443
        FXuint msg=FXWindow::ID_UNCHECK;
 
2444
    switch(FXSELID(sel))
 
2445
    {
 
2446
    case ID_SHOW_ONE_PANEL:
 
2447
                if (!dirpanel->shown() && !rpanel->shown())
 
2448
                {
 
2449
            msg = FXWindow::ID_CHECK;           
 
2450
                if(rpanelmenutitle->shown())
 
2451
                {
 
2452
                rpanelmenutitle->hide();
 
2453
                rpanelmenutitle->disable();
 
2454
                        lpanelmenutitle->setText(_("&Panel"));
 
2455
                                lpanel->show();
 
2456
                                lpanel->repaint();
 
2457
                                lpanel->setActive();
 
2458
                }
 
2459
                }
 
2460
        break;
 
2461
    
 
2462
        case ID_SHOW_TWO_PANELS:
 
2463
                if (!dirpanel->shown() && rpanel->shown())
 
2464
                {
 
2465
                        // Update the left panel relative size (only if the window size is sufficient)
 
2466
                        if (getWidth()>10)
 
2467
                                twopanels_lpanel_pct=(FXdouble)(lpanel->getWidth())/(FXdouble)(getWidth());
 
2468
            
 
2469
                        msg=FXWindow::ID_CHECK;
 
2470
                if(!rpanelmenutitle->shown())
 
2471
                {
 
2472
                rpanelmenutitle->enable();
 
2473
                rpanelmenutitle->show();
 
2474
                rpanelmenutitle->setText(_("&Right panel"));
 
2475
                lpanelmenutitle->setText(_("&Left panel"));
 
2476
                                lpanel->repaint();
 
2477
                                lpanel->setActive();
 
2478
                }
 
2479
                }
 
2480
        break;
 
2481
    
 
2482
        case ID_SHOW_TREE_PANEL:
 
2483
                if (dirpanel->shown() && !rpanel->shown())
 
2484
                {
 
2485
                        // Update the tree panel relative size (only if the window size is sufficient)
 
2486
                        if (getWidth()>10)
 
2487
                                treepanel_tree_pct=(FXdouble)(dirpanel->getWidth())/(FXdouble)(getWidth());
 
2488
                        
 
2489
                msg=FXWindow::ID_CHECK;         
 
2490
                if(rpanelmenutitle->shown())
 
2491
                {
 
2492
                rpanelmenutitle->hide();
 
2493
                rpanelmenutitle->disable();
 
2494
                lpanelmenutitle->setText(_("&Panel"));
 
2495
                                lpanel->repaint();
 
2496
                                lpanel->setActive();
 
2497
                }
 
2498
                }
 
2499
        break;
 
2500
    
 
2501
        case ID_SHOW_TREE_TWO_PANELS:
 
2502
                if (dirpanel->shown() && rpanel->shown())
 
2503
                {
 
2504
                        // Update the tree panel relative size (only if the window size is sufficient)
 
2505
                        if (getWidth()>10)
 
2506
                                treetwopanels_tree_pct=(FXdouble)(dirpanel->getWidth())/(FXdouble)(getWidth());
 
2507
 
 
2508
                        // Update the left panel relative size (only if the window size is sufficient)
 
2509
                        if (getWidth()>10)
 
2510
                                treetwopanels_lpanel_pct=(FXdouble)(lpanel->getWidth())/(FXdouble)(getWidth());
 
2511
 
 
2512
            msg = FXWindow::ID_CHECK;
 
2513
                if(!rpanelmenutitle->shown())
 
2514
                {
 
2515
                rpanelmenutitle->enable();
 
2516
                        rpanelmenutitle->show();
 
2517
                rpanelmenutitle->setText(_("&Right panel"));
 
2518
                lpanelmenutitle->setText(_("&Left panel"));
 
2519
                                lpanel->repaint();
 
2520
                                lpanel->setActive();
 
2521
                }
 
2522
                }
 
2523
        break;
 
2524
    }   
 
2525
    sender->handle(this,FXSEL(SEL_COMMAND,msg),ptr);
 
2526
 
 
2527
    return 1;
 
2528
}
 
2529
 
 
2530
 
 
2531
// Synchronize the panels to the same directory
 
2532
long XFileExplorer::onCmdSynchronizePanels(FXObject* sender,FXSelector sel,void*)
 
2533
{
 
2534
        FXString dir;
 
2535
        
 
2536
        // Left panel is active
 
2537
        if (lpanel->getCurrent() == lpanel)
 
2538
        {
 
2539
                dir=lpanel->getDirectory();
 
2540
                rpanel->setDirectory(dir);
 
2541
                rpanel->updatePath();
 
2542
        }
 
2543
        
 
2544
        // Right panel is active 
 
2545
        else
 
2546
        {
 
2547
                dir=rpanel->getDirectory();
 
2548
                lpanel->setDirectory(dir);
 
2549
                lpanel->updatePath();
 
2550
                
 
2551
        }
 
2552
        return 1;
 
2553
}
 
2554
 
 
2555
 
 
2556
// Update the synchronize panels menu item
 
2557
long XFileExplorer::onUpdSynchronizePanels(FXObject* o,FXSelector,void*)
 
2558
{
 
2559
        if (rpanel->shown())
 
2560
                o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE),NULL);
 
2561
        else
 
2562
                o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_DISABLE),NULL);
 
2563
 
 
2564
        return 1;
 
2565
}
 
2566
 
 
2567
 
 
2568
// Switch the panels
 
2569
long XFileExplorer::onCmdSwitchPanels(FXObject* sender,FXSelector sel,void*)
 
2570
{
 
2571
        FXString leftdir, rightdir;
 
2572
        
 
2573
        leftdir=lpanel->getDirectory();
 
2574
        rightdir=rpanel->getDirectory();
 
2575
        lpanel->setDirectory(rightdir);
 
2576
        lpanel->updatePath();
 
2577
        rpanel->setDirectory(leftdir);
 
2578
        rpanel->updatePath();
 
2579
 
 
2580
        return 1;
 
2581
}
 
2582
 
 
2583
 
 
2584
// Update the switch panels menu item
 
2585
long XFileExplorer::onUpdSwitchPanels(FXObject* o,FXSelector,void*)
 
2586
{
 
2587
        if (rpanel->shown())
 
2588
                o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE),NULL);
 
2589
        else
 
2590
                o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_DISABLE),NULL);
 
2591
 
 
2592
        return 1;
 
2593
}
 
2594
 
 
2595
 
 
2596
// Preferences
 
2597
long XFileExplorer::onCmdPrefs(FXObject*,FXSelector s,void *p)
 
2598
{
 
2599
    if (prefsdialog==NULL)
 
2600
                prefsdialog=new PreferencesBox(this,listbackcolor,listforecolor,highlightcolor,pbarcolor,attentioncolor);
 
2601
    prefsdialog->execute(PLACEMENT_SCREEN);
 
2602
    lpanel->getCurrent()->setFocusOnList();
 
2603
    return 1;
 
2604
}
 
2605
 
 
2606
 
 
2607
// Toggle status bar
 
2608
long XFileExplorer::onCmdToggleStatus(FXObject*,FXSelector s,void *p)
 
2609
{
 
2610
    dirpanel->toggleStatusbar();
 
2611
    lpanel->toggleStatusbar();
 
2612
    rpanel->toggleStatusbar();
 
2613
    return 1;
 
2614
}
 
2615
 
 
2616
 
 
2617
long XFileExplorer::onUpdToggleStatus(FXObject *o,FXSelector s,void *p)
 
2618
{
 
2619
    FXMenuCheck *cmd =(FXMenuCheck*)o;
 
2620
    if(lpanel->statusbarShown())
 
2621
        cmd->setCheck(TRUE);
 
2622
    else
 
2623
        cmd->setCheck(FALSE);
 
2624
    return 1;
 
2625
}
 
2626
 
 
2627
 
 
2628
// Run shell command or X program
 
2629
long XFileExplorer::onCmdRun(FXObject*,FXSelector,void*)
 
2630
{
 
2631
    chdir(lpanel->getCurrent()->getDirectory().text());
 
2632
    FXString command="";
 
2633
    if (rundialog==NULL)
 
2634
                rundialog=new HistInputDialog(this,"",_("Execute the command:"),_("Execute command"),"", NULL,HIST_INPUT_EXECUTABLE_FILE,TRUE, _("Console mode"));
 
2635
        rundialog->create();
 
2636
        rundialog->setText(command);
 
2637
    rundialog->CursorEnd();
 
2638
    rundialog->SelectAll();
 
2639
    rundialog->clearItems();
 
2640
 
 
2641
        for(int i=0;i<RunHistSize;i++)
 
2642
        rundialog->appendItem(RunHistory[i]);
 
2643
 
 
2644
        rundialog->setDirectory(ROOTDIR);
 
2645
    if(rundialog->execute())
 
2646
    {
 
2647
        command=rundialog->getText();
 
2648
        if(command != "")
 
2649
        {
 
2650
                        // Execute command in command window
 
2651
                        if (rundialog->getOption())
 
2652
                        {
 
2653
                        // Make and show command window
 
2654
                                CommandWindow *cmdwin=new CommandWindow(getApp(),_("Command log"),command,30,80);                       
 
2655
                                cmdwin->create();
 
2656
                                cmdwin->setIcon(runicon);
 
2657
 
 
2658
                                // The CommandWindow object will delete itself when closed!
 
2659
                        }
 
2660
                        
 
2661
                        // Execute silently in background
 
2662
                        else
 
2663
                        {
 
2664
                                command+=" &";
 
2665
                                system(command.text());
 
2666
                        }
 
2667
        }
 
2668
                // Update history list
 
2669
                RunHistSize=rundialog->getHistorySize();
 
2670
                command=rundialog->getText();
 
2671
                
 
2672
                // Check if cmd is a new string, i.e. is not already in history
 
2673
                FXbool newstr=TRUE;
 
2674
                for (FXint i=0;i<RunHistSize-1;i++)
 
2675
                {
 
2676
                        if (streq(RunHistory[i],command.text()))
 
2677
                        {
 
2678
                                newstr=FALSE;
 
2679
                                break;
 
2680
                        }
 
2681
                }
 
2682
                
 
2683
                // No new string or history limit reached
 
2684
                if (!newstr || RunHistSize>RUN_HIST_SIZE)
 
2685
                        RunHistSize--;
 
2686
                
 
2687
                // New string
 
2688
                if (newstr)
 
2689
                {
 
2690
                        // FIFO
 
2691
                        strlcpy(RunHistory[0],command.text(),command.length()+1);
 
2692
                        for(FXint i=1;i<RunHistSize;i++)
 
2693
                                strlcpy(RunHistory[i],rundialog->getHistoryItem(i-1).text(),rundialog->getHistoryItem(i-1).length()+1);
 
2694
                }
 
2695
    }
 
2696
        chdir(startlocation.text());
 
2697
    lpanel->getCurrent()->setFocusOnList();
 
2698
    return 1;
 
2699
}
 
2700
 
 
2701
 
 
2702
// Run an Xfe as root
 
2703
long XFileExplorer::onCmdSu(FXObject*,FXSelector,void*)
 
2704
{
 
2705
        // Wait cursor
 
2706
        getApp()->beginWaitCursor();
 
2707
 
 
2708
        // Obtain preferred root mode
 
2709
        FXbool use_sudo=getApp()->reg().readUnsignedEntry("OPTIONS","use_sudo",FALSE);
 
2710
 
 
2711
        // Select sudo or su to launch xfe as root
 
2712
        chdir(lpanel->getCurrent()->getDirectory().text());
 
2713
        FXString title, sucmd;
 
2714
        if (use_sudo)
 
2715
        {
 
2716
                title = _("Enter the user password:");
 
2717
                sucmd = SUDOCMD;
 
2718
        }
 
2719
        else
 
2720
        {
 
2721
                title = _("Enter the root password:");
 
2722
                sucmd = SUCMD;
 
2723
        }
 
2724
        
 
2725
        // Use appropriate background and foreground colors for Xvt
 
2726
        FXchar color[64];
 
2727
        fxnamefromcolor(color,getApp()->getBackColor());
 
2728
        FXString bg=" -bg ";
 
2729
        bg = bg + color;
 
2730
        fxnamefromcolor(color,getApp()->getForeColor());
 
2731
        FXString fg=" -fg ";
 
2732
        fg = fg + color + " ";
 
2733
        
 
2734
        // Command string
 
2735
        FXString command = "xvt -title " + ::quote(title) + bg + fg + sucmd;
 
2736
        
 
2737
        // Execute su or sudo command in an internal Xvt terminal
 
2738
        FXint status=runinxvt(command);
 
2739
        
 
2740
        // If error
 
2741
        chdir(startlocation.text());
 
2742
        if (status<0)
 
2743
        {
 
2744
                MessageBox::error(getApp(),BOX_OK,_("Error"),_("An error has occurred!"));
 
2745
                getApp()->endWaitCursor();
 
2746
                return 0;
 
2747
        }       
 
2748
        
 
2749
        // Wait cursor
 
2750
        getApp()->endWaitCursor();
 
2751
    return 1;
 
2752
}
 
2753
 
 
2754
 
 
2755
// Empty trash can
 
2756
long XFileExplorer::onCmdEmptyTrash(FXObject*,FXSelector sel,void* ptr)
 
2757
{
 
2758
    // Confirmation message
 
2759
        FXString message=_("Do you really want to empty the trash can?\n\nAll items will be definitively lost!");
 
2760
    MessageBox box(this,_("Empty trash can"),message,trash_full_bigicon,BOX_OK_CANCEL|DECOR_TITLE|DECOR_BORDER);
 
2761
        if(box.execute(PLACEMENT_CURSOR) != BOX_CLICKED_OK)
 
2762
        return 0;
 
2763
 
 
2764
        // Wait cursor
 
2765
        getApp()->beginWaitCursor();
 
2766
 
 
2767
        // Delete trash can files folder        
 
2768
        File* f;
 
2769
        f=new File(this,_("File delete"),DELETE);
 
2770
        f->create();
 
2771
        f->remove(trashfileslocation);
 
2772
        delete f;
 
2773
 
 
2774
        // Delete trash can info folder 
 
2775
        f=new File(this,_("File delete"),DELETE);
 
2776
        f->create();
 
2777
        f->remove(trashinfolocation);
 
2778
        delete f;
 
2779
        
 
2780
        // Re-create the trash can files directory
 
2781
        if (!::exists(trashfileslocation))
 
2782
        {
 
2783
                errno=0;
 
2784
                FXint ret=mkpath(trashfileslocation.text(),0755);
 
2785
                FXint errcode=errno;
 
2786
                if (ret==-1)
 
2787
                {
 
2788
                        if (errcode)
 
2789
                                MessageBox::error(this,BOX_OK,_("Error"),_("Can't create trash can 'files' folder %s: %s"),trashfileslocation.text(),strerror(errcode));
 
2790
                        else
 
2791
                                MessageBox::error(this,BOX_OK,_("Error"),_("Can't create trash can 'files' folder %s"),trashfileslocation.text());
 
2792
                }
 
2793
        }
 
2794
 
 
2795
        // Re-create the trash can info directory
 
2796
        if (!::exists(trashinfolocation))
 
2797
        {
 
2798
                errno=0;
 
2799
                FXint ret=mkpath(trashinfolocation.text(),0755);
 
2800
                FXint errcode=errno;
 
2801
                if (ret==-1)
 
2802
                {
 
2803
                        if (errcode)
 
2804
                                MessageBox::error(this,BOX_OK,_("Error"),_("Can't create trash can 'info' folder %s: %s"),trashinfolocation.text(),strerror(errcode));
 
2805
                        else
 
2806
                                MessageBox::error(this,BOX_OK,_("Error"),_("Can't create trash can 'info' folder %s"),trashinfolocation.text());
 
2807
                }
 
2808
        }
 
2809
 
 
2810
        // Wait cursor
 
2811
        getApp()->endWaitCursor();
 
2812
        
 
2813
        onCmdRefresh(0,0,0);
 
2814
        
 
2815
        return 1;
 
2816
}
 
2817
 
 
2818
 
 
2819
// Display trash size
 
2820
long XFileExplorer::onCmdTrashSize(FXObject*,FXSelector sel,void*)
 
2821
{
 
2822
        struct stat linfo;
 
2823
        FXString trashsize, trashmtime, trashnbfiles, trashnbfolders;
 
2824
        if (lstatrep(trashfileslocation.text(),&linfo)==0)
 
2825
        {
 
2826
                // Trash files size
 
2827
                trashmtime=FXSystem::time("%c",linfo.st_mtime);
 
2828
                FXchar buf[MAXPATHLEN];
 
2829
                unsigned long long dirsize=0;
 
2830
                FXuint nbfiles=0, nbsubfolders=0;
 
2831
                strlcpy(buf,trashfileslocation.text(),trashfileslocation.length()+1);
 
2832
                dirsize=pathsize(buf,&nbfiles,&nbsubfolders);
 
2833
                snprintf(buf,sizeof(buf),"%llu",dirsize);
 
2834
                trashsize=::hSize(buf);
 
2835
                trashnbfiles=FXStringVal(nbfiles-nbsubfolders);
 
2836
                trashnbfolders=FXStringVal(nbsubfolders-1);
 
2837
                
 
2838
                // Dialog box
 
2839
                FXString msg;
 
2840
                msg.format(_("Trash size: %s (%s files, %s subfolders)\n\nModified date: %s"),
 
2841
                            trashsize.text(),trashnbfiles.text(),trashnbfolders.text(),trashmtime.text());
 
2842
            MessageBox dialog(this,_("Trash size"),msg.text(),delete_bigicon,BOX_OK|DECOR_TITLE|DECOR_BORDER,
 
2843
                         JUSTIFY_LEFT|ICON_BEFORE_TEXT|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y);     
 
2844
                dialog.execute(PLACEMENT_CURSOR);
 
2845
        }
 
2846
        else
 
2847
        {
 
2848
                // Error
 
2849
                MessageBox::error(this,BOX_OK,_("Error"),_("Trash can 'files' folder %s is not readable!"),trashfileslocation.text());
 
2850
                return 0;
 
2851
        }
 
2852
                
 
2853
        return 1;
 
2854
}
 
2855
 
 
2856
 
 
2857
// File copy to clipboard
 
2858
long XFileExplorer::onCmdFileCopyClp(FXObject* o, FXSelector sel, void*)
 
2859
{
 
2860
        if (dirpanel->isActive())
 
2861
                dirpanel->handle(o,FXSEL(SEL_COMMAND,DirPanel::ID_COPY_CLIPBOARD),NULL);
 
2862
        
 
2863
        else
 
2864
                lpanel->getCurrent()->handle(o,FXSEL(SEL_COMMAND,FilePanel::ID_COPY_CLIPBOARD),NULL);   
 
2865
        
 
2866
        return 1;
 
2867
}
 
2868
 
 
2869
 
 
2870
// File cut to clipboard
 
2871
long XFileExplorer::onCmdFileCutClp(FXObject* o, FXSelector sel, void*)
 
2872
{
 
2873
        if (dirpanel->isActive())
 
2874
                dirpanel->handle(o,FXSEL(SEL_COMMAND,DirPanel::ID_CUT_CLIPBOARD),NULL);
 
2875
        
 
2876
        else
 
2877
                lpanel->getCurrent()->handle(o,FXSEL(SEL_COMMAND,FilePanel::ID_CUT_CLIPBOARD),NULL);    
 
2878
        
 
2879
        return 1;
 
2880
}
 
2881
 
 
2882
 
 
2883
// File paste from clipboard
 
2884
long XFileExplorer::onCmdFilePasteClp(FXObject* o, FXSelector sel, void*)
 
2885
{
 
2886
        if (dirpanel->isActive())
 
2887
                dirpanel->handle(o,FXSEL(SEL_COMMAND,DirPanel::ID_PASTE_CLIPBOARD),NULL);
 
2888
        
 
2889
        else
 
2890
                lpanel->getCurrent()->handle(o,FXSEL(SEL_COMMAND,FilePanel::ID_PASTE_CLIPBOARD),NULL);  
 
2891
        return 1;
 
2892
}
 
2893
 
 
2894
 
 
2895
// File rename
 
2896
long XFileExplorer::onCmdFileRename(FXObject* o, FXSelector sel, void*)
 
2897
{
 
2898
        lpanel->getCurrent()->handle(o,FXSEL(SEL_COMMAND,FilePanel::ID_FILE_RENAME),NULL);      
 
2899
        return 1;
 
2900
}
 
2901
 
 
2902
 
 
2903
// File move
 
2904
long XFileExplorer::onCmdFileMoveto(FXObject* o, FXSelector sel, void* ptr)
 
2905
{
 
2906
        if (dirpanel->isActive())
 
2907
                dirpanel->handle(o,FXSEL(SEL_COMMAND,DirPanel::ID_DIR_MOVETO),ptr);
 
2908
        
 
2909
        else
 
2910
                lpanel->getCurrent()->handle(o,FXSEL(SEL_COMMAND,FilePanel::ID_FILE_MOVETO),NULL);      
 
2911
        return 1;
 
2912
}
 
2913
 
 
2914
 
 
2915
// File copy to
 
2916
long XFileExplorer::onCmdFileCopyto(FXObject* o, FXSelector sel, void* ptr)
 
2917
{
 
2918
        if (dirpanel->isActive())
 
2919
                dirpanel->handle(o,FXSEL(SEL_COMMAND,DirPanel::ID_DIR_COPYTO),ptr);
 
2920
        
 
2921
        else
 
2922
                lpanel->getCurrent()->handle(o,FXSEL(SEL_COMMAND,FilePanel::ID_FILE_COPYTO),NULL);      
 
2923
 
 
2924
        return 1;
 
2925
}
 
2926
 
 
2927
 
 
2928
// File symlink
 
2929
long XFileExplorer::onCmdFileSymlink(FXObject* o, FXSelector sel, void* ptr)
 
2930
{
 
2931
        if (dirpanel->isActive())
 
2932
                dirpanel->handle(o,FXSEL(SEL_COMMAND,DirPanel::ID_DIR_SYMLINK),ptr);
 
2933
        
 
2934
        else
 
2935
                lpanel->getCurrent()->handle(o,FXSEL(SEL_COMMAND,FilePanel::ID_FILE_SYMLINK),NULL);     
 
2936
 
 
2937
        return 1;
 
2938
}
 
2939
 
 
2940
 
 
2941
// File trash
 
2942
long XFileExplorer::onCmdFileTrash(FXObject* o, FXSelector sel, void* ptr)
 
2943
{
 
2944
        if (dirpanel->isActive())
 
2945
                dirpanel->handle(o,FXSEL(SEL_COMMAND,DirPanel::ID_DIR_TRASH),ptr);
 
2946
        
 
2947
        else
 
2948
                lpanel->getCurrent()->handle(o,FXSEL(SEL_COMMAND,FilePanel::ID_FILE_TRASH),ptr);        
 
2949
        
 
2950
        return 1;
 
2951
}
 
2952
 
 
2953
 
 
2954
// File restore
 
2955
long XFileExplorer::onCmdFileRestore(FXObject* o,FXSelector sel,void* ptr)
 
2956
{
 
2957
        if (dirpanel->isActive())
 
2958
                dirpanel->handle(o,FXSEL(SEL_COMMAND,DirPanel::ID_DIR_RESTORE),ptr);
 
2959
        
 
2960
        else
 
2961
                lpanel->getCurrent()->handle(o,FXSEL(SEL_COMMAND,FilePanel::ID_FILE_RESTORE),ptr);      
 
2962
        
 
2963
        return 1;
 
2964
}
 
2965
 
 
2966
 
 
2967
// File delete
 
2968
long XFileExplorer::onCmdFileDelete(FXObject* o,FXSelector sel,void* ptr)
 
2969
{
 
2970
        if (dirpanel->isActive())
 
2971
                dirpanel->handle(o,FXSEL(SEL_COMMAND,DirPanel::ID_DIR_DELETE),ptr);
 
2972
        
 
2973
        else
 
2974
                lpanel->getCurrent()->handle(o,FXSEL(SEL_COMMAND,FilePanel::ID_FILE_DELETE),ptr);
 
2975
        
 
2976
        return 1;
 
2977
}
 
2978
 
 
2979
 
 
2980
// File properties
 
2981
long XFileExplorer::onCmdFileProperties(FXObject* o,FXSelector sel,void*)
 
2982
{
 
2983
        if (dirpanel->isActive())
 
2984
                dirpanel->handle(o,FXSEL(SEL_COMMAND,DirPanel::ID_PROPERTIES),NULL);
 
2985
        
 
2986
        else
 
2987
                lpanel->getCurrent()->handle(o,FXSEL(SEL_COMMAND,FilePanel::ID_PROPERTIES),NULL);       
 
2988
 
 
2989
        return 1;
 
2990
}
 
2991
 
 
2992
 
 
2993
// Update the empty trash can and trash menus
 
2994
long XFileExplorer::onUpdEmptyTrash(FXObject* o,FXSelector,void* ptr)
 
2995
{
 
2996
 
 
2997
        FXbool use_trash_can=getApp()->reg().readUnsignedEntry("OPTIONS","use_trash_can",TRUE);
 
2998
        if (use_trash_can)
 
2999
        {
 
3000
                // Update the empty trash can menu
 
3001
                o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE),NULL);
 
3002
 
 
3003
                // Update the trash menu title  
 
3004
                helpmenutitle->setText("");
 
3005
                trashmenutitle->setText(_("T&rash"));
 
3006
                trashmenutitle->enable();
 
3007
                trashmenutitle->show();
 
3008
                helpmenutitle->setText(_("&Help"));
 
3009
        }
 
3010
        else
 
3011
        {
 
3012
                // Update the empty trash can menu
 
3013
                o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_DISABLE),NULL);
 
3014
 
 
3015
                // Update the trash menu title
 
3016
                trashmenutitle->hide();
 
3017
                trashmenutitle->disable();
 
3018
                helpmenutitle->setText("");
 
3019
                helpmenutitle->setText(_("&Help"));
 
3020
        }
 
3021
 
 
3022
    return 1;
 
3023
}
 
3024
 
 
3025
 
 
3026
// Update the trash size menu
 
3027
long XFileExplorer::onUpdTrashSize(FXObject* o,FXSelector,void*)
 
3028
{
 
3029
        FXbool use_trash_can=getApp()->reg().readUnsignedEntry("OPTIONS","use_trash_can",TRUE);
 
3030
        if (use_trash_can)
 
3031
                o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE),NULL);
 
3032
        else
 
3033
                o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_DISABLE),NULL);
 
3034
 
 
3035
    return 1;
 
3036
}
 
3037
 
 
3038
 
 
3039
// Update the file delete menu item
 
3040
long XFileExplorer::onUpdFileDelete(FXObject* o,FXSelector,void* ptr)
 
3041
{
 
3042
        if (dirpanel->isActive())
 
3043
                dirpanel->handle(o,FXSEL(SEL_UPDATE,DirPanel::ID_DIR_DELETE),ptr);
 
3044
        
 
3045
        else
 
3046
                lpanel->getCurrent()->handle(o,FXSEL(SEL_UPDATE,FilePanel::ID_FILE_DELETE),ptr);
 
3047
 
 
3048
        return 1;
 
3049
}
 
3050
 
 
3051
 
 
3052
// Update the move to trash menu item
 
3053
long XFileExplorer::onUpdFileTrash(FXObject* o,FXSelector,void* ptr)
 
3054
{
 
3055
        if (dirpanel->isActive())
 
3056
                dirpanel->handle(o,FXSEL(SEL_UPDATE,DirPanel::ID_DIR_TRASH),ptr);
 
3057
        
 
3058
        else
 
3059
                lpanel->getCurrent()->handle(o,FXSEL(SEL_UPDATE,FilePanel::ID_FILE_TRASH),ptr);
 
3060
 
 
3061
   return 1;
 
3062
}
 
3063
 
 
3064
 
 
3065
// Update the restore from trash menu item
 
3066
long XFileExplorer::onUpdFileRestore(FXObject* o,FXSelector,void* ptr)
 
3067
{
 
3068
        if (dirpanel->isActive())
 
3069
                dirpanel->handle(o,FXSEL(SEL_UPDATE,DirPanel::ID_DIR_RESTORE),ptr);
 
3070
        
 
3071
        else
 
3072
                lpanel->getCurrent()->handle(o,FXSEL(SEL_UPDATE,FilePanel::ID_FILE_RESTORE),ptr);
 
3073
 
 
3074
   return 1;
 
3075
}
 
3076
 
 
3077
 
 
3078
// Update the file operation menu items
 
3079
long XFileExplorer::onUpdFileMan(FXObject* o,FXSelector,void*)
 
3080
{
 
3081
        // Update the panelfocus variable
 
3082
        if (lpanel->getCurrent()->isActive())
 
3083
                panelfocus=FILEPANEL_FOCUS;
 
3084
        if (dirpanel->isActive())
 
3085
                panelfocus=DIRPANEL_FOCUS;
 
3086
 
 
3087
        // Update the file operation menu items
 
3088
        if (dirpanel->isActive())
 
3089
        {
 
3090
                o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE),NULL);
 
3091
        }
 
3092
        else
 
3093
        {
 
3094
                FXint num=lpanel->getCurrent()->getNumSelectedItems();
 
3095
                if (num==0)
 
3096
                        o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_DISABLE),NULL);
 
3097
                else if (num==1 && lpanel->getCurrent()->isItemSelected(0))
 
3098
                        o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_DISABLE),NULL);
 
3099
                else
 
3100
                        o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE),NULL);            
 
3101
        }
 
3102
 
 
3103
        return 1;
 
3104
}
 
3105
 
 
3106
 
 
3107
// Update the file rename menu items
 
3108
long XFileExplorer::onUpdFileRename(FXObject* o,FXSelector,void*)
 
3109
{
 
3110
        FXint num=lpanel->getCurrent()->getNumSelectedItems();
 
3111
        if (num==1)
 
3112
        {
 
3113
                if (lpanel->getCurrent()->isItemSelected(0))
 
3114
                        o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_DISABLE),NULL);
 
3115
                else
 
3116
                        o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE),NULL);
 
3117
        }
 
3118
        else
 
3119
                o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_DISABLE),NULL);
 
3120
        return 1;
 
3121
}
 
3122
 
 
3123
 
 
3124
// Update the paste menu and button
 
3125
long XFileExplorer::onUpdFilePaste(FXObject* o,FXSelector sel,void*)
 
3126
{
 
3127
        lpanel->getCurrent()->handle(o,FXSEL(SEL_UPDATE,FilePanel::ID_PASTE_CLIPBOARD),NULL);   
 
3128
        return 1;
 
3129
}
 
3130
 
 
3131
 
 
3132
// Update the root menu items
 
3133
long XFileExplorer::onUpdSu(FXObject* o,FXSelector,void*)
 
3134
{
 
3135
        FXbool root_mode=getApp()->reg().readUnsignedEntry("OPTIONS","root_mode",TRUE);
 
3136
 
 
3137
        if (!root_mode || getuid()==0)
 
3138
                o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_DISABLE),NULL);
 
3139
        else
 
3140
                o->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE),NULL);
 
3141
        
 
3142
        return 1;
 
3143
}
 
3144