00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef _FLU_FILE_CHOOSER_H
00017 #define _FLU_FILE_CHOOSER_H
00018
00019 #include <FL/Fl_Double_Window.H>
00020 #include <FL/Fl_Input.H>
00021 #include <FL/Fl_Menu_Button.H>
00022 #include <FL/Fl_Tile.H>
00023 #include <FL/Fl_Pack.H>
00024 #include <FL/Fl_Scroll.H>
00025 #include <FL/Fl_Check_Button.H>
00026
00027 #include "FLU/Flu_Button.h"
00028 #include "FLU/Flu_Return_Button.h"
00029 #include "FLU/Flu_Wrap_Group.h"
00030 #include "FLU/Flu_Combo_Tree.h"
00031 #include "FLU/Flu_Combo_List.h"
00032 #include "FLU/flu_export.h"
00033 #include "FLU/FluSimpleString.h"
00034 #include "FLU/FluVectorClass.h"
00035
00036 FluMakeVectorClass( FluSimpleString, FluStringVector );
00037
00038 FLU_EXPORT const char* flu_file_chooser( const char *message, const char *pattern, const char *filename );
00039 FLU_EXPORT int flu_multi_file_chooser( const char *message, const char *pattern, const char *filename, FluStringVector *filelist );
00040 FLU_EXPORT const char* flu_save_chooser( const char *message, const char *pattern, const char *filename );
00041 FLU_EXPORT const char* flu_dir_chooser( const char *message, const char *filename );
00042 FLU_EXPORT const char* flu_dir_chooser( const char *message, const char *filename, bool showFiles );
00043 FLU_EXPORT const char* flu_file_and_dir_chooser( const char *message, const char *filename );
00044
00046 class FLU_EXPORT Flu_File_Chooser : public Fl_Double_Window
00047 {
00048
00049 friend class FileInput;
00050 class FileInput : public Fl_Input
00051 {
00052 public:
00053 FileInput( int x, int y, int w, int h, const char *l, Flu_File_Chooser *c );
00054 ~FileInput();
00055
00056 int handle( int event );
00057 protected:
00058 Flu_File_Chooser *chooser;
00059 };
00060
00061 public:
00062
00064
00065 static FluSimpleString favoritesTxt;
00066 static FluSimpleString desktopTxt;
00067 static FluSimpleString myComputerTxt;
00068 static FluSimpleString myDocumentsTxt;
00069
00070 static FluSimpleString filenameTxt;
00071 static FluSimpleString okTxt;
00072 static FluSimpleString cancelTxt;
00073 static FluSimpleString locationTxt;
00074 static FluSimpleString showHiddenTxt;
00075 static FluSimpleString fileTypesTxt;
00076 static FluSimpleString directoryTxt;
00077 static FluSimpleString allFilesTxt;
00078 static FluSimpleString defaultFolderNameTxt;
00079
00080 static FluSimpleString backTTxt;
00081 static FluSimpleString forwardTTxt;
00082 static FluSimpleString upTTxt;
00083 static FluSimpleString reloadTTxt;
00084 static FluSimpleString trashTTxt;
00085 static FluSimpleString newDirTTxt;
00086 static FluSimpleString addFavoriteTTxt;
00087 static FluSimpleString previewTTxt;
00088 static FluSimpleString listTTxt;
00089 static FluSimpleString wideListTTxt;
00090 static FluSimpleString detailTTxt;
00091
00092 static FluSimpleString detailTxt[4];
00093 static FluSimpleString contextMenuTxt[3];
00094 static FluSimpleString diskTypesTxt[6];
00095
00096 static FluSimpleString createFolderErrTxt;
00097 static FluSimpleString deleteFileErrTxt;
00098 static FluSimpleString fileExistsErrTxt;
00099 static FluSimpleString renameErrTxt;
00100
00102
00109 class FLU_EXPORT PreviewWidgetBase : public Fl_Group
00110 {
00111 public:
00112 PreviewWidgetBase();
00113 virtual ~PreviewWidgetBase();
00114 virtual int preview( const char *filename ) = 0;
00115 };
00116
00118 enum {
00119 ENTRY_NONE = 1,
00120 ENTRY_DIR = 2,
00121 ENTRY_FILE = 4,
00122 ENTRY_FAVORITE = 8,
00123 ENTRY_DRIVE = 16,
00124 ENTRY_MYDOCUMENTS = 32,
00125 ENTRY_MYCOMPUTER = 64
00126 };
00127
00129 enum {
00130 SINGLE = 0,
00131 MULTI = 1,
00132 DIRECTORY = 4,
00133 DEACTIVATE_FILES = 8,
00134 SAVING = 16,
00135 STDFILE = 32
00136 };
00137
00139 struct FileTypeInfo
00140 {
00141 Fl_Image *icon;
00142 FluSimpleString extensions;
00143 FluSimpleString type, shortType;
00144 };
00145
00147 Flu_File_Chooser( const char *path, const char *pattern, int type, const char *title );
00148
00150 ~Flu_File_Chooser();
00151
00153
00157 static void add_context_handler( int type, const char *ext, const char *name,
00158 void (*cb)(const char*,int,void*), void *cbd );
00159
00161 static void add_preview_handler( PreviewWidgetBase *w );
00162
00164
00168 static void add_type( const char *extensions, const char *short_description, Fl_Image *icon = NULL );
00169
00171 inline void allow_file_editing( bool b )
00172 { fileEditing = b; }
00173
00175 inline bool allow_file_editing() const
00176 { return fileEditing; }
00177
00179 inline void case_insensitive_sort( bool b )
00180 { caseSort = !b; }
00181
00183 inline bool case_insensitive_sort() const
00184 { return !caseSort; }
00185
00187 void cd( const char *path );
00188
00190 void clear_history();
00191
00193 int count();
00194
00196 inline void default_file_icon( Fl_Image* i )
00197 { defaultFileIcon = i; }
00198
00200 inline void directory( const char *d )
00201 { cd( d ); }
00202
00204 inline void filter( const char *p )
00205 { pattern( p ); }
00206
00208 inline const char* filter() const
00209 { return pattern(); }
00210
00212 static FileTypeInfo *find_type( const char *extension );
00213
00215 inline const char* get_current_directory() const
00216 { return currentDir.c_str(); }
00217
00219 int handle( int event );
00220
00222 void pattern( const char *p );
00223
00225 inline const char* pattern() const
00226 { return rawPattern.c_str(); }
00227
00229 inline void preview( bool b )
00230 { previewBtn->value(b); previewBtn->do_callback(); }
00231
00233 inline int preview() const
00234 { return previewBtn->value(); }
00235
00237 inline void rescan() { reloadCB(); }
00238
00240 void resize( int x, int y, int w, int h );
00241
00243 void select_all();
00244
00246 inline void set_sort_function( int (*cb)(const char*,const char*) )
00247 { customSort = cb; rescan(); }
00248
00250 inline void type( int t )
00251 { selectionType = t; rescan(); }
00252
00254 inline int type( int t ) const
00255 { return selectionType; }
00256
00258 void unselect_all();
00259
00261 void value( const char *v );
00262
00264 const char *value();
00265
00267 const char *value( int n );
00268
00269 FileInput filename;
00270
00271 #if FL_MAJOR_VERSION >= 1 && FL_MINOR_VERSION >= 1 && FL_PATCH_VERSION >= 4
00272 Flu_Return_Button ok;
00273 #else
00274 Flu_Button ok;
00275 #endif
00276 Flu_Button cancel;
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287 class ContextHandler
00288 {
00289 public:
00290 FluSimpleString ext, name;
00291 int type;
00292 void (*callback)(const char*,int,void*);
00293 void *callbackData;
00294 inline ContextHandler& operator =( const ContextHandler &c )
00295 { ext = c.ext; name = c.name; type = c.type; callback = c.callback; callbackData = c.callbackData; return *this; }
00296 };
00297 FluMakeVectorClass( ContextHandler, ContextHandlerVector );
00298 static ContextHandlerVector contextHandlers;
00299
00300 typedef PreviewWidgetBase* pPreviewWidgetBase;
00301 FluMakeVectorClass( pPreviewWidgetBase, PreviewHandlerVector );
00302 static PreviewHandlerVector previewHandlers;
00303
00304 Fl_Check_Button *hiddenFiles;
00305 Flu_Combo_Tree *location;
00306
00307 inline static void _backCB( Fl_Widget *w, void *arg )
00308 { ((Flu_File_Chooser*)arg)->backCB(); }
00309 void backCB();
00310
00311 inline static void _forwardCB( Fl_Widget *w, void *arg )
00312 { ((Flu_File_Chooser*)arg)->forwardCB(); }
00313 void forwardCB();
00314
00315 inline static void _sortCB( Fl_Widget *w, void *arg )
00316 { ((Flu_File_Chooser*)arg)->sortCB( w ); }
00317 void sortCB( Fl_Widget *w );
00318
00319 inline static void _previewCB( Fl_Widget*, void *arg )
00320 { ((Flu_File_Chooser*)arg)->previewCB(); }
00321 void previewCB();
00322
00323 inline static void _listModeCB( Fl_Widget *w, void *arg )
00324 { ((Flu_File_Chooser*)arg)->listModeCB(); }
00325 void listModeCB();
00326
00327 inline static void _filenameCB( Fl_Widget *w, void *arg )
00328 { ((Flu_File_Chooser*)arg)->filenameCB(); }
00329 void filenameCB();
00330
00331 inline static void _locationCB( Fl_Widget *w, void *arg )
00332 { ((Flu_File_Chooser*)arg)->locationCB( ((Flu_Combo_Tree*)w)->value() ); }
00333 void locationCB( const char *path );
00334
00335 inline static void _locationQJCB( Fl_Widget *w, void *arg )
00336 { ((Flu_File_Chooser*)arg)->cd( ((Fl_Button*)w)->label() ); }
00337
00338 inline static void delayedCdCB( void *arg )
00339 { ((Flu_File_Chooser*)arg)->cd( ((Flu_File_Chooser*)arg)->delayedCd.c_str() ); }
00340
00341 inline static void selectCB( void *arg )
00342 { ((Flu_File_Chooser*)arg)->okCB(); }
00343
00344 inline static void _cancelCB( Fl_Widget*, void *arg )
00345 { ((Flu_File_Chooser*)arg)->cancelCB(); }
00346 void cancelCB();
00347
00348 inline static void _okCB( Fl_Widget*, void *arg )
00349 { ((Flu_File_Chooser*)arg)->okCB(); }
00350 void okCB();
00351
00352 inline static void _trashCB( Fl_Widget*, void *arg )
00353 { ((Flu_File_Chooser*)arg)->trashCB(); }
00354 void trashCB( bool recycle = true );
00355
00356 inline static void _newFolderCB( Fl_Widget*, void *arg )
00357 { ((Flu_File_Chooser*)arg)->newFolderCB(); }
00358 void newFolderCB();
00359
00360 inline static void upDirCB( Fl_Widget*, void *arg )
00361 { ((Flu_File_Chooser*)arg)->cd( "../" ); }
00362
00363 inline static void reloadCB( Fl_Widget*, void *arg )
00364 { ((Flu_File_Chooser*)arg)->reloadCB(); }
00365 void reloadCB();
00366
00367 inline static void _homeCB( Fl_Widget*, void *arg )
00368 { ((Flu_File_Chooser*)arg)->homeCB(); }
00369 void homeCB();
00370
00371 inline static void _desktopCB( Fl_Widget*, void *arg )
00372 { ((Flu_File_Chooser*)arg)->desktopCB(); }
00373 void desktopCB();
00374
00375 inline static void _favoritesCB( Fl_Widget*, void *arg )
00376 { ((Flu_File_Chooser*)arg)->favoritesCB(); }
00377 void favoritesCB();
00378
00379 inline static void _myComputerCB( Fl_Widget*, void *arg )
00380 { ((Flu_File_Chooser*)arg)->myComputerCB(); }
00381 void myComputerCB();
00382
00383 inline static void _addToFavoritesCB( Fl_Widget*, void *arg )
00384 { ((Flu_File_Chooser*)arg)->addToFavoritesCB(); }
00385 void addToFavoritesCB();
00386
00387 inline static void _documentsCB( Fl_Widget*, void *arg )
00388 { ((Flu_File_Chooser*)arg)->documentsCB(); }
00389 void documentsCB();
00390
00391 inline static void _hideCB( Fl_Widget*, void *arg )
00392 { ((Flu_File_Chooser*)arg)->hideCB(); }
00393 void hideCB();
00394 void do_callback();
00395
00396 enum {
00397 SORT_NAME = 1,
00398 SORT_SIZE = 2,
00399 SORT_TYPE = 4,
00400 SORT_DATE = 8,
00401 SORT_REVERSE = 16
00402 };
00403 static void _qSort( int how, bool caseSort, Fl_Widget **array, int low, int high );
00404
00405 friend class Entry;
00406 class Entry : public Fl_Input
00407 {
00408 public:
00409 Entry( const char* name, int t, bool d, Flu_File_Chooser *c );
00410 ~Entry();
00411
00412 int handle( int event );
00413 void draw();
00414
00415 void updateSize();
00416 void updateIcon();
00417
00418 FluSimpleString filename, date, filesize, shortname,
00419 description, shortDescription, toolTip, altname;
00420
00421
00422 unsigned int type, idate;
00423 unsigned long isize;
00424 bool selected;
00425 int editMode;
00426 Flu_File_Chooser *chooser;
00427 Fl_Image *icon;
00428
00429 int nameW, typeW, sizeW, dateW;
00430 bool details;
00431
00432 inline static void _inputCB( Fl_Widget *w, void *arg )
00433 { ((Entry*)arg)->inputCB(); }
00434 void inputCB();
00435
00436 inline static void _editCB( void *arg )
00437 { ((Entry*)arg)->editCB(); }
00438 void editCB();
00439 };
00440
00441 friend class FileList;
00442 class FileList : public Flu_Wrap_Group
00443 {
00444 public:
00445 FileList( int x, int y, int w, int h, Flu_File_Chooser *c );
00446 ~FileList();
00447
00448 int handle( int event );
00449 void sort( int numDirs = -1 );
00450
00451 inline Fl_Widget *child(int n) const
00452 { return Flu_Wrap_Group::child(n); }
00453
00454 inline int children() const
00455 { return Flu_Wrap_Group::children(); }
00456
00457 int numDirs;
00458 Flu_File_Chooser *chooser;
00459 };
00460
00461 friend class FileDetails;
00462 class FileDetails : public Fl_Pack
00463 {
00464 public:
00465 FileDetails( int x, int y, int w, int h, Flu_File_Chooser *c );
00466 ~FileDetails();
00467
00468 int handle( int event );
00469 void sort( int numDirs = -1 );
00470
00471 void scroll_to( Fl_Widget *w );
00472 Fl_Widget* next( Fl_Widget* w );
00473 Fl_Widget* previous( Fl_Widget* w );
00474
00475 int numDirs;
00476 Flu_File_Chooser *chooser;
00477 };
00478
00479 friend class CBTile;
00480 class CBTile : public Fl_Tile
00481 {
00482 public:
00483 CBTile( int x, int y, int w, int h, Flu_File_Chooser *c );
00484 int handle( int event );
00485 Flu_File_Chooser *chooser;
00486 };
00487
00488 friend class FileColumns;
00489 class FileColumns : public Fl_Tile
00490 {
00491 public:
00492 FileColumns( int x, int y, int w, int h, Flu_File_Chooser *c );
00493 ~FileColumns();
00494
00495 int handle( int event );
00496 void resize( int x, int y, int w, int h );
00497 Flu_File_Chooser *chooser;
00498 int W1, W2, W3, W4;
00499 };
00500
00501 friend class PreviewTile;
00502 class PreviewTile : public Fl_Tile
00503 {
00504 public:
00505 PreviewTile( int x, int y, int w, int h, Flu_File_Chooser *c );
00506 int handle( int event );
00507 Flu_File_Chooser *chooser;
00508 int last;
00509 };
00510
00511 class ImgTxtPreview : public PreviewWidgetBase
00512 {
00513 public:
00514 int preview( const char *filename );
00515 unsigned char previewTxt[1024];
00516 };
00517
00518 friend class PreviewGroup;
00519 class PreviewGroup : public Fl_Group
00520 {
00521 public:
00522 PreviewGroup( int x, int y, int w, int h, Flu_File_Chooser *c );
00523 void draw();
00524 Flu_File_Chooser *chooser;
00525 FluSimpleString lastFile, file;
00526 PreviewWidgetBase* handled;
00527 };
00528
00529 Fl_Group *getEntryGroup();
00530 Fl_Group *getEntryContainer();
00531
00532 void win2unix( FluSimpleString &s );
00533
00534 void cleanupPath( FluSimpleString &s );
00535
00536 bool correctPath( FluSimpleString &path );
00537
00538 void updateEntrySizes();
00539
00540 void buildLocationCombo();
00541
00542 void updateLocationQJ();
00543
00544 void addToHistory();
00545
00546 FluSimpleString formatDate( const char *d );
00547
00548 void recursiveScan( const char *dir, FluStringVector *files );
00549
00550 bool stripPatterns( FluSimpleString s, FluStringVector* patterns );
00551
00552 int popupContextMenu( Entry *entry );
00553
00554 FluSimpleString commonStr();
00555
00556 static ImgTxtPreview *imgTxtPreview;
00557
00558 static int (*customSort)(const char*,const char*);
00559
00560 PreviewGroup *previewGroup;
00561 PreviewTile *previewTile;
00562 Fl_Group *fileGroup, *locationQuickJump;
00563 Fl_Menu_Button entryPopup;
00564 Fl_Image *defaultFileIcon;
00565 Entry *lastSelected;
00566 FileList *filelist;
00567 FileColumns *filecolumns;
00568 Fl_Group *fileDetailsGroup;
00569 Fl_Scroll *filescroll;
00570 FileDetails *filedetails;
00571 Flu_Button *detailNameBtn, *detailTypeBtn, *detailSizeBtn, *detailDateBtn;
00572 FluSimpleString currentDir, delayedCd, rawPattern;
00573 FluSimpleString configFilename;
00574 FluSimpleString userHome, userDesktop, userDocs;
00575 FluSimpleString drives[26];
00576 Fl_Pixmap* driveIcons[26];
00577 Flu_Button *fileListBtn, *fileListWideBtn, *fileDetailsBtn, *backBtn, *forwardBtn, *upDirBtn, *trashBtn,
00578 *newDirBtn, *addFavoriteBtn, *reloadBtn, *previewBtn;
00579 Fl_Browser *favoritesList;
00580 Flu_Combo_List *filePattern;
00581 int selectionType;
00582 bool filenameEnterCallback, filenameTabCallback, walkingHistory, caseSort, fileEditing;
00583 int sortMethod;
00584
00585 FluStringVector patterns;
00586
00587 static FileTypeInfo *types;
00588 static int numTypes;
00589 static int typeArraySize;
00590
00591 static FluSimpleString dArrow[4];
00592 static FluSimpleString uArrow[4];
00593
00594 #ifdef WIN32
00595 unsigned int driveMask;
00596 unsigned int driveTypes[26];
00597 FluSimpleString volumeNames[26];
00598 bool refreshDrives;
00599 #endif
00600
00601 class History
00602 {
00603 public:
00604 History() { last = next = NULL; }
00605 FluSimpleString path;
00606 History *last, *next;
00607 };
00608
00609 History *history, *currentHist;
00610
00611 Fl_Callback *_callback;
00612 void *_userdata;
00613
00614 };
00615
00616 #endif