Main Page | Class Hierarchy | Class List | File List | Class Members

Flu_File_Chooser.h

00001 // $Id: Flu_File_Chooser.h,v 1.60 2004/07/06 18:46:31 jbryan Exp $
00002 
00003 /***************************************************************
00004  *                FLU - FLTK Utility Widgets 
00005  *  Copyright (C) 2002 Ohio Supercomputer Center, Ohio State University
00006  *
00007  * This file and its content is protected by a software license.
00008  * You should have received a copy of this license with this file.
00009  * If not, please contact the Ohio Supercomputer Center immediately:
00010  * Attn: Jason Bryan Re: FLU 1224 Kinnear Rd, Columbus, Ohio 43212
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/VectorClass.h"
00035 
00036 FLU_EXPORT const char* flu_file_chooser( const char *message, const char *pattern, const char *filename );
00037 FLU_EXPORT const char* flu_save_chooser( const char *message, const char *pattern, const char *filename );
00038 FLU_EXPORT const char* flu_dir_chooser( const char *message, const char *filename );
00039 FLU_EXPORT const char* flu_dir_chooser( const char *message, const char *filename, bool showFiles );
00040 FLU_EXPORT const char* flu_file_and_dir_chooser( const char *message, const char *filename );
00041 
00042 MakeVectorClass( FluSimpleString, StringVector );
00043 
00045 class FLU_EXPORT Flu_File_Chooser : public Fl_Double_Window
00046 {
00047 
00048   friend class FileInput;
00049   class FileInput : public Fl_Input
00050     {
00051     public:
00052       FileInput( int x, int y, int w, int h, const char *l, Flu_File_Chooser *c );
00053       ~FileInput();
00054 
00055       int handle( int event );
00056     protected:
00057       Flu_File_Chooser *chooser;
00058     };
00059 
00060  public:
00061 
00063 
00064   static FluSimpleString favoritesTxt;
00065   static FluSimpleString desktopTxt;
00066   static FluSimpleString myComputerTxt;
00067   static FluSimpleString myDocumentsTxt;
00068 
00069   static FluSimpleString filenameTxt;
00070   static FluSimpleString okTxt;
00071   static FluSimpleString cancelTxt;
00072   static FluSimpleString locationTxt;
00073   static FluSimpleString showHiddenTxt;
00074   static FluSimpleString fileTypesTxt;
00075   static FluSimpleString directoryTxt;
00076   static FluSimpleString allFilesTxt;
00077   static FluSimpleString defaultFolderNameTxt;
00078 
00079   static FluSimpleString backTTxt;
00080   static FluSimpleString forwardTTxt;
00081   static FluSimpleString upTTxt;
00082   static FluSimpleString reloadTTxt;
00083   static FluSimpleString trashTTxt;
00084   static FluSimpleString newDirTTxt;
00085   static FluSimpleString addFavoriteTTxt;
00086   static FluSimpleString previewTTxt;
00087   static FluSimpleString listTTxt;
00088   static FluSimpleString wideListTTxt;
00089   static FluSimpleString detailTTxt;
00090 
00091   static FluSimpleString detailTxt[4];
00092   static FluSimpleString contextMenuTxt[3];
00093   static FluSimpleString diskTypesTxt[6];
00094 
00095   static FluSimpleString createFolderErrTxt;
00096   static FluSimpleString deleteFileErrTxt;
00097   static FluSimpleString fileExistsErrTxt;
00098   static FluSimpleString renameErrTxt;
00099 
00101 
00108   class FLU_EXPORT PreviewWidgetBase : public Fl_Group
00109     {
00110     public:
00111       PreviewWidgetBase();
00112       virtual ~PreviewWidgetBase();
00113       virtual int preview( const char *filename ) = 0;
00114     };
00115 
00117   enum { 
00118     ENTRY_NONE = 1,         
00119     ENTRY_DIR = 2,          
00120     ENTRY_FILE = 4,         
00121     ENTRY_FAVORITE = 8,     
00122     ENTRY_DRIVE = 16,       
00123     ENTRY_MYDOCUMENTS = 32, 
00124     ENTRY_MYCOMPUTER = 64   
00125   };
00126 
00128   enum { 
00129     SINGLE = 0,    
00130     MULTI = 1,     
00131     DIRECTORY = 4, 
00132     DEACTIVATE_FILES = 8, 
00133     SAVING = 16,   
00134     STDFILE = 32
00135   };
00136 
00138   struct FileTypeInfo
00139   {
00140     Fl_Image *icon;
00141     FluSimpleString extensions;
00142     FluSimpleString type, shortType;
00143   };
00144 
00146   Flu_File_Chooser( const char *path, const char *pattern, int type, const char *title );
00147 
00149   ~Flu_File_Chooser();
00150 
00152 
00156   static void add_context_handler( int type, const char *ext, const char *name,
00157                                    void (*cb)(const char*,int,void*), void *cbd );
00158 
00160   static void add_preview_handler( PreviewWidgetBase *w );
00161 
00163 
00167   static void add_type( const char *extensions, const char *short_description, Fl_Image *icon = NULL );
00168 
00170   inline void allow_file_editing( bool b )
00171     { fileEditing = b; }
00172 
00174   inline bool allow_file_editing() const
00175     { return fileEditing; }
00176 
00178   inline void case_insensitive_sort( bool b )
00179     { caseSort = !b; }
00180 
00182   inline bool case_insensitive_sort() const
00183     { return !caseSort; }
00184 
00186   void cd( const char *path );
00187 
00189   void clear_history();
00190 
00192   int count();
00193 
00195   inline void default_file_icon( Fl_Image* i )
00196     { defaultFileIcon = i; }
00197 
00199   inline void directory( const char *d )
00200     { cd( d ); }
00201 
00203   inline void filter( const char *p )
00204     { pattern( p ); }
00205 
00207   inline const char* filter() const
00208     { return pattern(); }
00209 
00211   static FileTypeInfo *find_type( const char *extension );
00212 
00214   inline const char* get_current_directory() const
00215     { return currentDir.c_str(); }
00216 
00218   int handle( int event );
00219 
00221   void pattern( const char *p );
00222 
00224   inline const char* pattern() const
00225     { return rawPattern.c_str(); }
00226 
00228   inline void preview( bool b )
00229     { previewBtn->value(b); previewBtn->do_callback(); }
00230 
00232   inline int preview() const
00233     { return previewBtn->value(); }
00234 
00236   inline void rescan() { reloadCB(); }
00237 
00239   void resize( int x, int y, int w, int h );
00240 
00242   void select_all();
00243 
00245   inline void set_sort_function( int (*cb)(const char*,const char*) )
00246     { customSort = cb; rescan(); }
00247 
00249   inline void type( int t )
00250     { selectionType = t; rescan(); }
00251 
00253   inline int type( int t ) const
00254     { return selectionType; }
00255 
00257   void unselect_all();
00258 
00260   void value( const char *v );
00261 
00263   const char *value();
00264 
00266   const char *value( int n );
00267 
00268   FileInput filename;
00269   // the <Enter> key behavior is not correct for versions before 1.1.4rc2
00270 #if FL_MAJOR_VERSION >= 1 && FL_MINOR_VERSION >= 1 && FL_PATCH_VERSION >= 4
00271   Flu_Return_Button ok;
00272 #else
00273   Flu_Button ok;
00274 #endif
00275   Flu_Button cancel;
00276 
00277   // apparently there is a bug in VC6 that prevents friend classes from accessing
00278   // non-public members. stupid windows
00279   // several other compilers were reported to have a problem with this too, so 
00280   // i'm just making the whole class public to eliminate potential problems.
00281   // bad c++ - i know...
00282   //#ifndef WIN32
00283   //protected:
00284   //#endif
00285 
00286   class ContextHandler
00287     {
00288     public:
00289       FluSimpleString ext, name;
00290       int type;
00291       void (*callback)(const char*,int,void*);
00292       void *callbackData;
00293       inline ContextHandler& operator =( const ContextHandler &c )
00294       { ext = c.ext; name = c.name; type = c.type; callback = c.callback; callbackData = c.callbackData; return *this; }
00295     };
00296   MakeVectorClass( ContextHandler, ContextHandlerVector );
00297   static ContextHandlerVector contextHandlers;
00298 
00299   typedef PreviewWidgetBase* pPreviewWidgetBase;
00300   MakeVectorClass( pPreviewWidgetBase, PreviewHandlerVector );
00301   static PreviewHandlerVector previewHandlers;
00302 
00303   Fl_Check_Button *hiddenFiles;
00304   Flu_Combo_Tree *location;
00305 
00306   inline static void _backCB( Fl_Widget *w, void *arg )
00307     { ((Flu_File_Chooser*)arg)->backCB(); }
00308   void backCB();
00309 
00310   inline static void _forwardCB( Fl_Widget *w, void *arg )
00311     { ((Flu_File_Chooser*)arg)->forwardCB(); }
00312   void forwardCB();
00313 
00314   inline static void _sortCB( Fl_Widget *w, void *arg )
00315     { ((Flu_File_Chooser*)arg)->sortCB( w ); }
00316   void sortCB( Fl_Widget *w );
00317 
00318   inline static void _previewCB( Fl_Widget*, void *arg )
00319     { ((Flu_File_Chooser*)arg)->previewCB(); }
00320   void previewCB();
00321 
00322   inline static void _listModeCB( Fl_Widget *w, void *arg )
00323     { ((Flu_File_Chooser*)arg)->listModeCB(); }
00324   void listModeCB();
00325 
00326   inline static void _filenameCB( Fl_Widget *w, void *arg )
00327     { ((Flu_File_Chooser*)arg)->filenameCB(); }
00328   void filenameCB();
00329 
00330   inline static void _locationCB( Fl_Widget *w, void *arg )
00331     { ((Flu_File_Chooser*)arg)->locationCB( ((Flu_Combo_Tree*)w)->value() ); }
00332   void locationCB( const char *path );
00333 
00334   inline static void _locationQJCB( Fl_Widget *w, void *arg )
00335     { ((Flu_File_Chooser*)arg)->cd( ((Fl_Button*)w)->label() ); }
00336 
00337   inline static void delayedCdCB( void *arg )
00338     { ((Flu_File_Chooser*)arg)->cd( ((Flu_File_Chooser*)arg)->delayedCd.c_str() ); }
00339 
00340   inline static void selectCB( void *arg )
00341     { ((Flu_File_Chooser*)arg)->hide(); }
00342 
00343   inline static void _cancelCB( Fl_Widget*, void *arg )
00344     { ((Flu_File_Chooser*)arg)->cancelCB(); }
00345   void cancelCB();
00346 
00347   inline static void _okCB( Fl_Widget*, void *arg )
00348     { ((Flu_File_Chooser*)arg)->okCB(); }
00349   void okCB();
00350 
00351   inline static void _trashCB( Fl_Widget*, void *arg )
00352     { ((Flu_File_Chooser*)arg)->trashCB(); }
00353   void trashCB( bool recycle = true );
00354 
00355   inline static void _newFolderCB( Fl_Widget*, void *arg )
00356     { ((Flu_File_Chooser*)arg)->newFolderCB(); }
00357   void newFolderCB();
00358 
00359   inline static void upDirCB( Fl_Widget*, void *arg )
00360     { ((Flu_File_Chooser*)arg)->cd( "../" ); }
00361 
00362   inline static void reloadCB( Fl_Widget*, void *arg )
00363     { ((Flu_File_Chooser*)arg)->reloadCB(); }
00364   void reloadCB();
00365 
00366   inline static void _homeCB( Fl_Widget*, void *arg )
00367     { ((Flu_File_Chooser*)arg)->homeCB(); }
00368   void homeCB();
00369 
00370   inline static void _desktopCB( Fl_Widget*, void *arg )
00371     { ((Flu_File_Chooser*)arg)->desktopCB(); }
00372   void desktopCB();
00373 
00374   inline static void _favoritesCB( Fl_Widget*, void *arg )
00375     { ((Flu_File_Chooser*)arg)->favoritesCB(); }
00376   void favoritesCB();
00377 
00378   inline static void _myComputerCB( Fl_Widget*, void *arg )
00379     { ((Flu_File_Chooser*)arg)->myComputerCB(); }
00380   void myComputerCB();
00381 
00382   inline static void _addToFavoritesCB( Fl_Widget*, void *arg )
00383     { ((Flu_File_Chooser*)arg)->addToFavoritesCB(); }
00384   void addToFavoritesCB();
00385 
00386   inline static void _documentsCB( Fl_Widget*, void *arg )
00387     { ((Flu_File_Chooser*)arg)->documentsCB(); }
00388   void documentsCB();
00389 
00390   inline static void _hideCB( Fl_Widget*, void *arg )
00391     { ((Flu_File_Chooser*)arg)->hideCB(); }
00392   void hideCB();
00393   void do_callback();
00394 
00395   enum {
00396     SORT_NAME = 1,
00397     SORT_SIZE = 2,
00398     SORT_TYPE = 4,
00399     SORT_DATE = 8,
00400     SORT_REVERSE = 16 
00401   };
00402   static void _qSort( int how, bool caseSort, Fl_Widget **array, int low, int high );
00403 
00404   friend class Entry;
00405   class Entry : public Fl_Input
00406     {
00407     public:
00408       Entry( const char* name, int t, bool d, Flu_File_Chooser *c );
00409       ~Entry();
00410 
00411       int handle( int event );
00412       void draw();
00413 
00414       void updateSize();
00415       void updateIcon();
00416 
00417       FluSimpleString filename, date, filesize, shortname, 
00418         description, shortDescription, toolTip, altname;
00419       //FluSimpleString permissions;
00420       //unsigned char pU, pG, pO; // 3-bit unix style permissions
00421       unsigned int type, idate;
00422       unsigned long isize;
00423       bool selected;
00424       int editMode;
00425       Flu_File_Chooser *chooser;
00426       Fl_Image *icon;
00427 
00428       int nameW, typeW, sizeW, dateW;
00429       bool details;
00430 
00431       inline static void _inputCB( Fl_Widget *w, void *arg )
00432         { ((Entry*)arg)->inputCB(); }
00433       void inputCB();
00434 
00435       inline static void _editCB( void *arg )
00436         { ((Entry*)arg)->editCB(); }
00437       void editCB();
00438     };
00439 
00440   friend class FileList;
00441   class FileList : public Flu_Wrap_Group
00442     {
00443     public:
00444       FileList( int x, int y, int w, int h, Flu_File_Chooser *c );
00445       ~FileList();
00446 
00447       int handle( int event );
00448       void sort( int numDirs = -1 );
00449 
00450       inline Fl_Widget *child(int n) const
00451         { return Flu_Wrap_Group::child(n); }
00452 
00453       inline int children() const
00454         { return Flu_Wrap_Group::children(); }
00455 
00456       int numDirs;
00457       Flu_File_Chooser *chooser;
00458     };
00459 
00460   friend class FileDetails;
00461   class FileDetails : public Fl_Pack
00462     {
00463     public:
00464       FileDetails( int x, int y, int w, int h, Flu_File_Chooser *c );
00465       ~FileDetails();
00466 
00467       int handle( int event );
00468       void sort( int numDirs = -1 );
00469 
00470       void scroll_to( Fl_Widget *w );
00471       Fl_Widget* next( Fl_Widget* w );
00472       Fl_Widget* previous( Fl_Widget* w );
00473 
00474       int numDirs;
00475       Flu_File_Chooser *chooser;
00476     };
00477 
00478   friend class CBTile;
00479   class CBTile : public Fl_Tile
00480     {
00481     public:
00482       CBTile( int x, int y, int w, int h, Flu_File_Chooser *c );
00483       int handle( int event );
00484       Flu_File_Chooser *chooser;
00485     };
00486 
00487   friend class FileColumns;
00488   class FileColumns : public Fl_Tile
00489     {
00490     public:
00491       FileColumns( int x, int y, int w, int h, Flu_File_Chooser *c );
00492       ~FileColumns();
00493 
00494       int handle( int event );
00495       void resize( int x, int y, int w, int h );
00496       Flu_File_Chooser *chooser;
00497       int W1, W2, W3, W4;
00498     };
00499 
00500   friend class PreviewTile;
00501   class PreviewTile : public Fl_Tile
00502     {
00503     public:
00504       PreviewTile( int x, int y, int w, int h, Flu_File_Chooser *c );
00505       int handle( int event );
00506       Flu_File_Chooser *chooser;
00507       int last;
00508     };
00509 
00510   class ImgTxtPreview : public PreviewWidgetBase
00511     {
00512     public:
00513       int preview( const char *filename );
00514       unsigned char previewTxt[1024];
00515     };
00516 
00517   friend class PreviewGroup;
00518   class PreviewGroup : public Fl_Group
00519     {
00520     public:
00521       PreviewGroup( int x, int y, int w, int h, Flu_File_Chooser *c );
00522       void draw();
00523       Flu_File_Chooser *chooser;
00524       FluSimpleString lastFile, file;
00525       PreviewWidgetBase* handled;
00526     };
00527 
00528   Fl_Group *getEntryGroup();
00529   Fl_Group *getEntryContainer();
00530 
00531   void win2unix( FluSimpleString &s );
00532 
00533   void cleanupPath( FluSimpleString &s );
00534 
00535   bool correctPath( FluSimpleString &path );
00536 
00537   void updateEntrySizes();
00538 
00539   void buildLocationCombo();
00540 
00541   void updateLocationQJ();
00542 
00543   void addToHistory();
00544 
00545   FluSimpleString formatDate( const char *d );
00546 
00547   void recursiveScan( const char *dir, StringVector *files );
00548 
00549   bool stripPatterns( FluSimpleString s, StringVector* patterns );
00550 
00551   int popupContextMenu( Entry *entry );
00552 
00553   FluSimpleString commonStr();
00554 
00555   static ImgTxtPreview *imgTxtPreview;
00556 
00557   static int (*customSort)(const char*,const char*);
00558 
00559   PreviewGroup *previewGroup;
00560   PreviewTile *previewTile;
00561   Fl_Group *fileGroup, *locationQuickJump;
00562   Fl_Menu_Button entryPopup;
00563   Fl_Image *defaultFileIcon;
00564   Entry *lastSelected;
00565   FileList *filelist;
00566   FileColumns *filecolumns;
00567   Fl_Group *fileDetailsGroup;
00568   Fl_Scroll *filescroll;
00569   FileDetails *filedetails;
00570   Flu_Button *detailNameBtn, *detailTypeBtn, *detailSizeBtn, *detailDateBtn;
00571   FluSimpleString currentDir, delayedCd, rawPattern;
00572   FluSimpleString configFilename;
00573   FluSimpleString userHome, userDesktop, userDocs;
00574   FluSimpleString drives[26];
00575   Fl_Pixmap* driveIcons[26];
00576   Flu_Button *fileListBtn, *fileListWideBtn, *fileDetailsBtn, *backBtn, *forwardBtn, *upDirBtn, *trashBtn,
00577     *newDirBtn, *addFavoriteBtn, *reloadBtn, *previewBtn;
00578   Fl_Browser *favoritesList;
00579   Flu_Combo_List *filePattern;
00580   int selectionType;
00581   bool filenameEnterCallback, filenameTabCallback, walkingHistory, caseSort, fileEditing;
00582   int sortMethod;
00583 
00584   StringVector patterns;
00585 
00586   static FileTypeInfo *types;
00587   static int numTypes;
00588   static int typeArraySize;
00589 
00590   static FluSimpleString dArrow[4];
00591   static FluSimpleString uArrow[4];
00592 
00593 #ifdef WIN32
00594   unsigned int driveMask;
00595   unsigned int driveTypes[26];
00596   FluSimpleString volumeNames[26];
00597   bool refreshDrives;
00598 #endif
00599 
00600   class History
00601   {
00602   public:
00603     History() { last = next = NULL; }
00604     FluSimpleString path;
00605     History *last, *next;
00606   };
00607 
00608   History *history, *currentHist;
00609 
00610   Fl_Callback *_callback;
00611   void *_userdata;
00612 
00613 };
00614 
00615 #endif

Generated on Mon Aug 2 10:27:46 2004 for FLTK Utility Library and Widget Collection (FLU) by doxygen 1.3.5