00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 #ifndef _FL_FILEDIALOG_H_
00023 #define _FL_FILEDIALOG_H_
00024 
00025 #include "Enumerations.h"
00026 #include "Fl_Image_Cache.h"
00027 #include "Fl_Input_Browser.h"
00028 #include "Fl_Item.h"
00029 #include "Fl_Dialog.h"
00030 #include "Fl_Group.h"
00031 #include "Fl_Check_Button.h"
00032 #include "Fl_Highlight_Button.h"
00033 #include "Fl_FileBrowser.h"
00034 
00035 class PreviewBox;
00036 
00038 class Fl_File_Chooser : public Fl_Dialog
00039 {
00040 public:
00041     
00042     enum {
00043         _DEFAULT = 0,
00044         _SAVE,
00045         _DIRECTORY
00046     };
00047 
00048     
00049     
00050     Fl_File_Chooser(int w, int h, const char *label=0, int mode=0);
00051     ~Fl_File_Chooser();
00052 
00053     
00054     void default_filename(const Fl_String &f) { m_default_filename = f; }
00055     void default_filename(const char *f) { m_default_filename = f; }
00056 
00057     
00058     void directory(const Fl_String &path);
00059     void directory(const char *path) { Fl_String tmp(path); directory(tmp); }
00060 
00061     
00062     const Fl_String &directory() const { return m_filebrowser->directory(); }
00063 
00064     const char *file_input() const { return m_file_input->value(); }
00065     void file_input(const char *v) { m_file_input->value(v); }
00066 
00067     
00068     const char *pattern() const { return m_filter_input->item() ? (const char *)m_filter_input->item()->user_data() : ""; }
00069 
00070     
00071     const char *filter_name() const { return m_filter_input->value(); }
00072 
00073     
00074     int mode() const { return m_mode; }
00075 
00076     
00077     char **get_selected();
00078 
00079     
00080     void get_selected(Fl_String_List &list);
00081 
00082     
00083     void multi_selection(bool v) { if(v) m_filebrowser->type(m_filebrowser->type()|Fl_ListView::MULTI_SELECTION); else m_filebrowser->type(m_filebrowser->type()&~Fl_ListView::MULTI_SELECTION); }
00084     bool multi_selection() { return m_filebrowser->multi(); }
00085 
00086     bool preview() const { return m_preview->value(); }
00087     void preview(bool show);
00088 
00089     
00090     void update_preview(const Fl_String filename);
00091 
00092     
00093     
00094     void get_filename(Fl_String path, Fl_String &buf);
00095 
00096     
00097     void get_filepath(Fl_String path, Fl_String &buf);
00098 
00099     
00100     Fl_File_Browser *filebrowser() { return m_filebrowser; }
00101 
00102     
00103     void up();
00104     
00105     void refresh() { directory(directory()); }
00106     
00107     
00108     Fl_String new_dir();
00109 
00110     
00111     
00112     void filters(const char *filters);
00113 
00114     
00115     void read_dir(const char *path) { directory(path); }
00116 
00117     virtual int handle(int e);
00118     virtual void layout();
00119 
00120     
00121 
00122 
00123 
00124 
00125 
00126 
00127 
00128 
00129 
00130     virtual bool save_data(Fl_Data_Source *ds=0);
00131 
00132 protected:
00133     
00134     void make_group();
00135 
00136     
00137     void parse_dirs(const Fl_String &fp);
00138 
00139     Fl_Highlight_Button *m_up;
00140     Fl_Highlight_Button *m_home;
00141     Fl_Highlight_Button *m_refresh;
00142     Fl_Highlight_Button *m_new_folder;
00143 
00144     Fl_Input_Browser    *m_path_input;
00145     Fl_Input_Browser    *m_filter_input;
00146     Fl_Input_Browser    *m_file_input;
00147     Fl_Check_Button     *m_preview;
00148 
00149     Fl_File_Browser     *m_filebrowser;
00150 
00151 private:
00152     PreviewBox *m_preview_box;
00153     Fl_String m_default_filename;
00154     int m_mode;
00155 
00156     void file_clicked(Fl_ListView_Item *i);
00157     void folder_clicked(Fl_ListView_Item *i);
00158 
00159     static void cb_list          (Fl_File_Browser *w, Fl_File_Chooser *d);
00160     static inline void cb_preview(Fl_Widget *w, Fl_File_Chooser *d) { d->preview(bool(w->value()==1)); }
00161 
00162     static inline void cb_new    (Fl_Widget *, Fl_File_Chooser *d) { d->new_dir(); }
00163     static inline void cb_home   (Fl_Widget *, Fl_File_Chooser *d) { d->directory(fl_homedir()); }
00164     static inline void cb_refresh(Fl_Widget *, Fl_File_Chooser *d) { d->refresh(); }
00165     static inline void cb_up     (Fl_Widget *, Fl_File_Chooser *d) { d->up(); }
00166 
00167     static inline void cb_dirc  (Fl_Input_Browser *w, Fl_File_Chooser *d) { d->directory(w->value()); }
00168     static inline void cb_filter(Fl_Input_Browser *w, Fl_File_Chooser *d) { d->filebrowser()->pattern((const char *)w->item()->user_data()); d->refresh(); }
00169     static void cb_location     (Fl_Input_Browser *w, Fl_File_Chooser *d);
00170 };
00171 
00172 
00173 
00174 
00175 
00176 
00177 extern FL_API char *fl_select_file(const char *path=0, char *filters=0, const char *caption=0);
00178 extern FL_API char **fl_select_files(const char *path=0, char *filters=0, const char *caption=0);
00179 
00180 
00181 extern FL_API char *fl_save_file(const char *path=0, char *filters=0, const char *caption=0);
00182 
00183 
00184 extern FL_API char *fl_select_dir(const char *path=0, const char *cap=0);
00185 
00186 extern FL_API int fc_initial_w;
00187 extern FL_API int fc_initial_h;
00188 extern FL_API bool fc_initial_preview;
00189 
00190 #endif