Flu_File_Chooser.h
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:18k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: Flu_File_Chooser.h,v $
  4.  * PRODUCTION Revision 1000.0  2004/04/12 18:21:39  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [CATCHUP_003] Dev-tree R1.1
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*
  10.  * These files were imported into NCBI's CVS directly from FLU version 2.9.1.
  11.  * Modifications to the source are listed below.
  12.  *
  13.  * ==========================================================================
  14.  * $Log: Flu_File_Chooser.h,v $
  15.  * Revision 1000.0  2004/04/12 18:21:39  gouriano
  16.  * PRODUCTION: IMPORTED [CATCHUP_003] Dev-tree R1.1
  17.  *
  18.  * Revision 1.1  2004/03/11 13:51:54  dicuccio
  19.  * Imported FLU version 2.9.1.  Altered export specifiers to match NCBI layout.
  20.  * Altered include paths to match NCBI toolkit layout.
  21.  *
  22.  * ==========================================================================
  23.  */
  24. // $Id: Flu_File_Chooser.h,v 1000.0 2004/04/12 18:21:39 gouriano Exp $
  25. /***************************************************************
  26.  *                FLU - FLTK Utility Widgets 
  27.  *  Copyright (C) 2002 Ohio Supercomputer Center, Ohio State University
  28.  *
  29.  * This file and its content is protected by a software license.
  30.  * You should have received a copy of this license with this file.
  31.  * If not, please contact the Ohio Supercomputer Center immediately:
  32.  * Attn: Jason Bryan Re: FLU 1224 Kinnear Rd, Columbus, Ohio 43212
  33.  * 
  34.  ***************************************************************/
  35. #ifndef _FLU_FILE_CHOOSER_H
  36. #define _FLU_FILE_CHOOSER_H
  37. #include <FL/Fl_Double_Window.H>
  38. #include <FL/Fl_Input.H>
  39. #include <FL/Fl_Menu_Button.H>
  40. #include <FL/Fl_Tile.H>
  41. #include <FL/Fl_Pack.H>
  42. #include <FL/Fl_Scroll.H>
  43. #include <FL/Fl_Check_Button.H>
  44. #include <gui/widgets/FLU/Flu_Button.h>
  45. #include <gui/widgets/FLU/Flu_Return_Button.h>
  46. #include <gui/widgets/FLU/Flu_Wrap_Group.h>
  47. #include <gui/widgets/FLU/Flu_Combo_Tree.h>
  48. #include <gui/widgets/FLU/Flu_Combo_List.h>
  49. #include <gui/widgets/FLU/FluSimpleString.h>
  50. #include <gui/widgets/FLU/VectorClass.h>
  51. NCBI_GUIWIDGETS_FLU_EXPORT const char* flu_file_chooser( const char *message, const char *pattern, const char *filename );
  52. NCBI_GUIWIDGETS_FLU_EXPORT const char* flu_dir_chooser( const char *message, const char *filename );
  53. MakeVectorClass( FluSimpleString, StringVector );
  54. //! A file and directory choosing widget that looks and acts similar to the stock Windows file chooser
  55. class NCBI_GUIWIDGETS_FLU_EXPORT Flu_File_Chooser : public Fl_Double_Window
  56. {
  57.   friend class FileInput;
  58.   class FileInput : public Fl_Input
  59.     {
  60.     public:
  61.       FileInput( int x, int y, int w, int h, const char *l, Flu_File_Chooser *c );
  62.       ~FileInput();
  63.       int handle( int event );
  64.     protected:
  65.       Flu_File_Chooser *chooser;
  66.     };
  67.  public:
  68.   //! This class must be derived from to create a "preview" widget.
  69.   /*! Simply derive from this class and overload Fl_Group's methods to create a widget
  70.     able to preview whatever file type you want. Register it with Flu_File_Chooser::add_preview_handler()
  71.     When a file is previewed, all registered handlers are visited until the preview() virtual function
  72.     for one of them returns nonzero. When preview() is called, the absolute path of the file is passed in,
  73.     and the widget should determine whether it can preview the file and update itself accordingly. If
  74.     it can preview the file, it should return nonzero, else it should return zero.
  75.    */
  76.   class PreviewWidgetBase : public Fl_Group
  77.     {
  78.     public:
  79.       PreviewWidgetBase();
  80.       virtual ~PreviewWidgetBase();
  81.       virtual int preview( const char *filename ) = 0;
  82.     };
  83.   //! File entry type
  84.   enum { 
  85.     ENTRY_NONE = 1,         /*!< An empty (or non-existant) entry */
  86.     ENTRY_DIR = 2,          /*!< A directory entry */
  87.     ENTRY_FILE = 4,         /*!< A file entry */
  88.     ENTRY_FAVORITE = 8,     /*!< A favorite entry */
  89.     ENTRY_DRIVE = 16,       /*!< An entry that refers to a disk drive */
  90.     ENTRY_MYDOCUMENTS = 32, /*!< The entry referring to the current user's documents */
  91.     ENTRY_MYCOMPUTER = 64   /*!< The entry referring to "My Computer" in Windows */
  92.   };
  93.   //! Chooser type
  94.   enum { 
  95.     SINGLE = 0,    /*!< Chooser a single file or directory */
  96.     MULTI = 1,     /*!< Choose multiple files or directories */
  97.     DIRECTORY = 4  /*!< Choose directories (choosing files is implicit if this bit is clear) */
  98.   };
  99.   //! Structure holding the info needed for custom file types
  100.   struct FileTypeInfo
  101.   {
  102.     Fl_Image *icon;
  103.     FluSimpleString extensions;
  104.     FluSimpleString type, shortType;
  105.   };
  106.   //! Constructor opening a file chooser with title b title visiting directory b path with files filtered according to b pattern. b type is a logical OR of Flu_File_Chooser::SINGLE, Flu_File_Chooser::MULTI, and Flu_File_Chooser::DIRECTORY 
  107.   Flu_File_Chooser( const char *path, const char *pattern, int type, const char *title );
  108.   //! Destructor
  109.   ~Flu_File_Chooser();
  110.   //! Add a custom callback that is called when the user right-clicks on an entry
  111.   /*! param type is the type of entry to handle (i.e. a logical OR of c ENTRY_NONE, c ENTRY_DIR, c ENTRY_FILE, c ENTRY_FAVORITE, c ENTRY_DRIVE, c ENTRY_MYDOCUMENTS, c ENTRY_MYCOMPUTER). To add a "nothing" handler (when the user right-clicks on nothing), use ENTRY_NONE
  112.     param ext is the extension of the file that will cause this handler to be added to the popup menu
  113.     param name is the name that will appear in the popup menu for this handler
  114.    */
  115.   static void add_context_handler( int type, const char *ext, const char *name,
  116.    void (*cb)(const char*,int,void*), void *cbd );
  117.   //! Add a "preview" widget (derived from class Flu_File_Chooser::PreviewWidgetBase) that will handle custom previewing of files
  118.   static void add_preview_handler( PreviewWidgetBase *w );
  119.   //! Add descriptive information and an icon for a file type
  120.   /*! param extensions is a space- or comma-delimited list of file extensions, or c NULL for directories. e.g. "zip,tgz,rar"
  121.     param short_description is a short description (!) of the file type. e.g. "Compressed Archive"
  122.     param icon is an optional custom icon to use for this file type
  123.    */
  124.   static void add_type( const char *extensions, const char *short_description, Fl_Image *icon = NULL );
  125.   //! Set whether the names of files/directories are allowed to be edited by the user (by selecting the file and then clicking on it again). Default is on (true)
  126.   inline void allow_file_editing( bool b )
  127.     { fileEditing = b; }
  128.   //! Get whether the names of files/directories are allowed to be edited by the user (by selecting the file and then clicking on it again)
  129.   inline bool allow_file_editing() const
  130.     { return fileEditing; }
  131.   //! Set whether file sorting is case insensitive. Default value is case-insensitive for windows, case-sensitive for everything else
  132.   inline void case_insensitive_sort( bool b )
  133.     { caseSort = !b; }
  134.   //! Get whether file sorting is case insensitive
  135.   inline bool case_insensitive_sort() const
  136.     { return !caseSort; }
  137.   //! Change the current directory the chooser is browsing to b path
  138.   void cd( const char *path );
  139.   //! Clear the history of which directories have been visited
  140.   void clear_history();
  141.   //! return how many files are selected
  142.   int count();
  143.   //! Set the default icon to use for all files for which no other icon has been specified
  144.   inline void default_file_icon( Fl_Image* i )
  145.     { defaultFileIcon = i; }
  146.   //! Alias for cd()
  147.   inline void directory( const char *d )
  148.     { cd( d ); }
  149.   //! Alias for pattern()
  150.   inline void filter( const char *p )
  151.     { pattern( p ); }
  152.   //! Alias for pattern()
  153.   inline const char* filter() const
  154.     { return pattern(); }
  155.   //! return a pointer to a FileTypeInfo structure for files with type b extension
  156.   static FileTypeInfo *find_type( const char *extension );
  157.   //! return the current directory that the browser is visiting
  158.   inline const char* get_current_directory() const
  159.     { return currentDir.c_str(); }
  160.   //! Override of Fl_Double_Window::handle()
  161.   int handle( int event );
  162.   //! Change the file filter pattern to b p
  163.   void pattern( const char *p );
  164.   //! Get the current file filter pattern
  165.   inline const char* pattern() const
  166.     { return rawPattern.c_str(); }
  167.   //! Set the state of the preview button
  168.   inline void preview( bool b )
  169.     { previewBtn->value(b); previewBtn->do_callback(); }
  170.   //! Get the state of the preview button
  171.   inline int preview() const
  172.     { return previewBtn->value(); }
  173.   //! Refresh the current directory
  174.   inline void rescan() { reloadCB(); }
  175.   //! Override of Fl_Double_Window::resize()
  176.   void resize( int x, int y, int w, int h );
  177.   //! Select all entries (only valid for multiple-selections)
  178.   void select_all();
  179.   //! Set a custom sorting function for sorting entries based on filename
  180.   inline void set_sort_function( int (*cb)(const char*,const char*) )
  181.     { customSort = cb; rescan(); }
  182.   //! Unselect all entries
  183.   void unselect_all();
  184.   //! Set the current file the chooser is selecting
  185.   void value( const char *v );
  186.   //! Get the current file the chooser is selecting
  187.   const char *value();
  188.   //! For MULTI file queries, get selected file b n (base 1 - i.e. 1 returns the first file, 2 the second, etc)
  189.   const char *value( int n );
  190.   FileInput filename;
  191.   // the <Enter> key behavior is not correct for versions before 1.1.4rc2
  192. #if FL_MAJOR_VERSION >= 1 && FL_MINOR_VERSION >= 1 && FL_PATCH_VERSION >= 4
  193.   Flu_Return_Button ok;
  194. #else
  195.   Flu_Button ok;
  196. #endif
  197.   Flu_Button cancel;
  198.   // apparently there is a bug in VC6 that prevents friend classes from accessing
  199.   // non-public members. stupid windows
  200.   // several other compilers were reported to have a problem with this too, so 
  201.   // i'm just making the whole class public to eliminate potential problems.
  202.   // bad c++ - i know...
  203.   //#ifndef WIN32
  204.   //protected:
  205.   //#endif
  206.   class ContextHandler
  207.     {
  208.     public:
  209.       FluSimpleString ext, name;
  210.       int type;
  211.       void (*callback)(const char*,int,void*);
  212.       void *callbackData;
  213.       inline ContextHandler& operator =( const ContextHandler &c )
  214.       { ext = c.ext; name = c.name; type = c.type; callback = c.callback; callbackData = c.callbackData; return *this; }
  215.     };
  216.   MakeVectorClass( ContextHandler, ContextHandlerVector );
  217.   static ContextHandlerVector contextHandlers;
  218.   typedef PreviewWidgetBase* pPreviewWidgetBase;
  219.   MakeVectorClass( pPreviewWidgetBase, PreviewHandlerVector );
  220.   static PreviewHandlerVector previewHandlers;
  221.   Fl_Check_Button *hiddenFiles;
  222.   Flu_Combo_Tree *filesystems;
  223.   inline static void _backCB( Fl_Widget *w, void *arg )
  224.     { ((Flu_File_Chooser*)arg)->backCB(); }
  225.   void backCB();
  226.   inline static void _forwardCB( Fl_Widget *w, void *arg )
  227.     { ((Flu_File_Chooser*)arg)->forwardCB(); }
  228.   void forwardCB();
  229.   inline static void _sortCB( Fl_Widget *w, void *arg )
  230.     { ((Flu_File_Chooser*)arg)->sortCB( w ); }
  231.   void sortCB( Fl_Widget *w );
  232.   inline static void _previewCB( Fl_Widget*, void *arg )
  233.     { ((Flu_File_Chooser*)arg)->previewCB(); }
  234.   void previewCB();
  235.   inline static void _filenameCB( Fl_Widget *w, void *arg )
  236.     { ((Flu_File_Chooser*)arg)->filenameCB(); }
  237.   void filenameCB();
  238.   inline static void _filesystemsCB( Fl_Widget *w, void *arg )
  239.     { ((Flu_File_Chooser*)arg)->filesystemsCB( ((Flu_Combo_Tree*)w)->value() ); }
  240.   void filesystemsCB( const char *path );
  241.   inline static void delayedCdCB( void *arg )
  242.     { ((Flu_File_Chooser*)arg)->cd( ((Flu_File_Chooser*)arg)->delayedCd.c_str() ); }
  243.   inline static void selectCB( void *arg )
  244.     { ((Flu_File_Chooser*)arg)->hide(); }
  245.   inline static void _cancelCB( Fl_Widget*, void *arg )
  246.     { ((Flu_File_Chooser*)arg)->cancelCB(); }
  247.   void cancelCB();
  248.   inline static void _okCB( Fl_Widget*, void *arg )
  249.     { ((Flu_File_Chooser*)arg)->okCB(); }
  250.   void okCB();
  251.   inline static void _trashCB( Fl_Widget*, void *arg )
  252.     { ((Flu_File_Chooser*)arg)->trashCB(); }
  253.   void trashCB( bool recycle = true );
  254.   inline static void _newFolderCB( Fl_Widget*, void *arg )
  255.     { ((Flu_File_Chooser*)arg)->newFolderCB(); }
  256.   void newFolderCB();
  257.   inline static void upDirCB( Fl_Widget*, void *arg )
  258.     { ((Flu_File_Chooser*)arg)->cd( "../" ); }
  259.   inline static void reloadCB( Fl_Widget*, void *arg )
  260.     { ((Flu_File_Chooser*)arg)->reloadCB(); }
  261.   void reloadCB();
  262.   inline static void _homeCB( Fl_Widget*, void *arg )
  263.     { ((Flu_File_Chooser*)arg)->homeCB(); }
  264.   void homeCB();
  265.   inline static void _desktopCB( Fl_Widget*, void *arg )
  266.     { ((Flu_File_Chooser*)arg)->desktopCB(); }
  267.   void desktopCB();
  268.   inline static void _favoritesCB( Fl_Widget*, void *arg )
  269.     { ((Flu_File_Chooser*)arg)->favoritesCB(); }
  270.   void favoritesCB();
  271.   inline static void _myComputerCB( Fl_Widget*, void *arg )
  272.     { ((Flu_File_Chooser*)arg)->myComputerCB(); }
  273.   void myComputerCB();
  274.   inline static void _addToFavoritesCB( Fl_Widget*, void *arg )
  275.     { ((Flu_File_Chooser*)arg)->addToFavoritesCB(); }
  276.   void addToFavoritesCB();
  277.   inline static void _documentsCB( Fl_Widget*, void *arg )
  278.     { ((Flu_File_Chooser*)arg)->documentsCB(); }
  279.   void documentsCB();
  280.   enum {
  281.     SORT_NAME = 1,
  282.     SORT_SIZE = 2,
  283.     SORT_TYPE = 4,
  284.     SORT_DATE = 8,
  285.     SORT_REVERSE = 16 
  286.   };
  287.   static void _qSort( int how, bool caseSort, Fl_Widget **array, int low, int high );
  288.   friend class Entry;
  289.   class Entry : public Fl_Input
  290.     {
  291.     public:
  292.       Entry( const char* name, int t, bool d, Flu_File_Chooser *c );
  293.       ~Entry();
  294.       int handle( int event );
  295.       void draw();
  296.       void updateSize();
  297.       void updateIcon();
  298.       FluSimpleString filename, date, filesize, shortname, 
  299. description, shortDescription, toolTip, altname;
  300.       //FluSimpleString permissions;
  301.       //unsigned char pU, pG, pO; // 3-bit unix style permissions
  302.       unsigned int type, idate;
  303.       unsigned long isize;
  304.       bool selected;
  305.       int editMode;
  306.       Flu_File_Chooser *chooser;
  307.       Fl_Image *icon;
  308.       int nameW, typeW, sizeW, dateW;
  309.       bool details;
  310.       inline static void _inputCB( Fl_Widget *w, void *arg )
  311. { ((Entry*)arg)->inputCB(); }
  312.       void inputCB();
  313.       inline static void _editCB( void *arg )
  314. { ((Entry*)arg)->editCB(); }
  315.       void editCB();
  316.     };
  317.   friend class FileList;
  318.   class FileList : public Flu_Wrap_Group
  319.     {
  320.     public:
  321.       FileList( int x, int y, int w, int h, Flu_File_Chooser *c );
  322.       ~FileList();
  323.       int handle( int event );
  324.       void sort( int numDirs = -1 );
  325.       int numDirs;
  326.       Flu_File_Chooser *chooser;
  327.     };
  328.   friend class FileDetails;
  329.   class FileDetails : public Fl_Pack
  330.     {
  331.     public:
  332.       FileDetails( int x, int y, int w, int h, Flu_File_Chooser *c );
  333.       ~FileDetails();
  334.       int handle( int event );
  335.       void sort( int numDirs = -1 );
  336.       void scroll_to( Fl_Widget *w );
  337.       Fl_Widget* next( Fl_Widget* w );
  338.       Fl_Widget* previous( Fl_Widget* w );
  339.       int numDirs;
  340.       Flu_File_Chooser *chooser;
  341.     };
  342.   friend class CBTile;
  343.   class CBTile : public Fl_Tile
  344.     {
  345.     public:
  346.       CBTile( int x, int y, int w, int h, Flu_File_Chooser *c );
  347.       int handle( int event );
  348.       Flu_File_Chooser *chooser;
  349.     };
  350.   friend class FileColumns;
  351.   class FileColumns : public Fl_Tile
  352.     {
  353.     public:
  354.       FileColumns( int x, int y, int w, int h, Flu_File_Chooser *c );
  355.       ~FileColumns();
  356.       int handle( int event );
  357.       void resize( int x, int y, int w, int h );
  358.       Flu_File_Chooser *chooser;
  359.       int W1, W2, W3, W4;
  360.     };
  361.   friend class PreviewTile;
  362.   class PreviewTile : public Fl_Tile
  363.     {
  364.     public:
  365.       PreviewTile( int x, int y, int w, int h, Flu_File_Chooser *c );
  366.       int handle( int event );
  367.       Flu_File_Chooser *chooser;
  368.       int last;
  369.     };
  370.   class ImgTxtPreview : public PreviewWidgetBase
  371.     {
  372.     public:
  373.       int preview( const char *filename );
  374.       unsigned char previewTxt[1024];
  375.     };
  376.   friend class PreviewGroup;
  377.   class PreviewGroup : public Fl_Group
  378.     {
  379.     public:
  380.       PreviewGroup( int x, int y, int w, int h, Flu_File_Chooser *c );
  381.       void draw();
  382.       Flu_File_Chooser *chooser;
  383.       FluSimpleString lastFile, file;
  384.       PreviewWidgetBase* handled;
  385.     };
  386.   Fl_Group *getEntryGroup();
  387.   Fl_Group *getEntryContainer();
  388.   void win2unix( FluSimpleString &s );
  389.   void cleanupPath( FluSimpleString &s );
  390.   bool correctPath( FluSimpleString &path );
  391.   void updateEntrySizes();
  392.   void buildFilesystemsCombo();
  393.   void addToHistory();
  394.   FluSimpleString formatDate( const char *d );
  395.   void recursiveScan( const char *dir, StringVector *files );
  396.   bool stripPatterns( FluSimpleString s, StringVector* patterns );
  397.   int popupContextMenu( Entry *entry );
  398.   FluSimpleString commonStr();
  399.   static ImgTxtPreview *imgTxtPreview;
  400.   static int (*customSort)(const char*,const char*);
  401.   PreviewGroup *previewGroup;
  402.   PreviewTile *previewTile;
  403.   Fl_Group *fileGroup;
  404.   Fl_Menu_Button entryPopup;
  405.   Fl_Image *defaultFileIcon;
  406.   Entry *lastSelected;
  407.   FileList *filelist;
  408.   FileColumns *filecolumns;
  409.   Fl_Group *fileDetailsGroup;
  410.   Fl_Scroll *filescroll;
  411.   FileDetails *filedetails;
  412.   Flu_Button *detailNameBtn, *detailTypeBtn, *detailSizeBtn, *detailDateBtn;
  413.   FluSimpleString currentDir, delayedCd, rawPattern;
  414.   FluSimpleString userHome, configFilename;
  415.   FluSimpleString drives[26];
  416.   Fl_Pixmap* driveIcons[26];
  417.   Flu_Button *fileListBtn, *fileListWideBtn, *fileDetailsBtn, *backBtn, *forwardBtn, *upDirBtn, *trashBtn,
  418.     *newDirBtn, *addFavoriteBtn, *reloadBtn, *previewBtn;
  419.   Fl_Browser *favoritesList;
  420.   Flu_Combo_List *filePattern;
  421.   int selectionType;
  422.   bool filenameEnterCallback, filenameTabCallback, walkingHistory, caseSort, fileEditing;
  423.   int sortMethod;
  424.   StringVector patterns;
  425.   static FileTypeInfo *types;
  426.   static int numTypes;
  427.   static int typeArraySize;
  428. #ifdef WIN32
  429.   unsigned int driveMask;
  430.   unsigned int driveTypes[26];
  431.   FluSimpleString volumeNames[26];
  432.   bool refreshDrives;
  433. #endif
  434.   class History
  435.   {
  436.   public:
  437.     History() { last = next = NULL; }
  438.     FluSimpleString path;
  439.     History *last, *next;
  440.   };
  441.   History *history, *currentHist;
  442. };
  443. #endif