1 //
2 // "$Id: Fl_File_Chooser.cxx 6092 2008-04-11 12:57:37Z matt $"
3 //
4 // Fl_File_Chooser dialog for the Fast Light Tool Kit (FLTK).
5 //
6 // Copyright 1998-2005 by Bill Spitzak and others.
7 //
8 // This library is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU Library General Public
10 // License as published by the Free Software Foundation; either
11 // version 2 of the License, or (at your option) any later version.
12 //
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 // Library General Public License for more details.
17 //
18 // You should have received a copy of the GNU Library General Public
19 // License along with this library; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
21 // USA.
22 //
23 // Please report all bugs and problems on the following page:
24 //
25 //     http://www.fltk.org/str.php
26 //
27 
28 // generated by Fast Light User Interface Designer (fluid) version 1.0108
29 
30 #include "../FL/Fl_File_Chooser.H"
31 #include <FL/fl_draw.H>
32 
cb_window_i(Fl_Double_Window *,void *)33 void Fl_File_Chooser::cb_window_i(Fl_Double_Window*, void*) {
34   fileName->value("");
35 fileList->deselect();
36 Fl::remove_timeout((Fl_Timeout_Handler)previewCB, this);
37 window->hide();
38 }
cb_window(Fl_Double_Window * o,void * v)39 void Fl_File_Chooser::cb_window(Fl_Double_Window* o, void* v) {
40   ((Fl_File_Chooser*)(o->user_data()))->cb_window_i(o,v);
41 }
42 
cb_showChoice_i(Fl_Choice *,void *)43 void Fl_File_Chooser::cb_showChoice_i(Fl_Choice*, void*) {
44   showChoiceCB();
45 }
cb_showChoice(Fl_Choice * o,void * v)46 void Fl_File_Chooser::cb_showChoice(Fl_Choice* o, void* v) {
47   ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_showChoice_i(o,v);
48 }
49 
cb_favoritesButton_i(Fl_Menu_Button *,void *)50 void Fl_File_Chooser::cb_favoritesButton_i(Fl_Menu_Button*, void*) {
51   favoritesButtonCB();
52 }
cb_favoritesButton(Fl_Menu_Button * o,void * v)53 void Fl_File_Chooser::cb_favoritesButton(Fl_Menu_Button* o, void* v) {
54   ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_favoritesButton_i(o,v);
55 }
56 
cb_newButton_i(Fl_Button *,void *)57 void Fl_File_Chooser::cb_newButton_i(Fl_Button*, void*) {
58   newdir();
59 }
cb_newButton(Fl_Button * o,void * v)60 void Fl_File_Chooser::cb_newButton(Fl_Button* o, void* v) {
61   ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_newButton_i(o,v);
62 }
63 
64 #include <FL/Fl_Bitmap.H>
65 static unsigned char idata_new[] =
66 {0,0,120,0,132,0,2,1,1,254,1,128,49,128,49,128,253,128,253,128,49,128,49,
67 128,1,128,1,128,255,255,0,0};
68 static Fl_Bitmap image_new(idata_new, 16, 16);
69 
cb__i(Fl_Tile *,void *)70 void Fl_File_Chooser::cb__i(Fl_Tile*, void*) {
71   update_preview();
72 }
cb_(Fl_Tile * o,void * v)73 void Fl_File_Chooser::cb_(Fl_Tile* o, void* v) {
74   ((Fl_File_Chooser*)(o->parent()->user_data()))->cb__i(o,v);
75 }
76 
cb_fileList_i(Fl_File_Browser *,void *)77 void Fl_File_Chooser::cb_fileList_i(Fl_File_Browser*, void*) {
78   fileListCB();
79 }
cb_fileList(Fl_File_Browser * o,void * v)80 void Fl_File_Chooser::cb_fileList(Fl_File_Browser* o, void* v) {
81   ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_fileList_i(o,v);
82 }
83 
cb_previewButton_i(Fl_Check_Button *,void *)84 void Fl_File_Chooser::cb_previewButton_i(Fl_Check_Button*, void*) {
85   preview(previewButton->value());
86 }
cb_previewButton(Fl_Check_Button * o,void * v)87 void Fl_File_Chooser::cb_previewButton(Fl_Check_Button* o, void* v) {
88   ((Fl_File_Chooser*)(o->parent()->parent()->parent()->user_data()))->cb_previewButton_i(o,v);
89 }
90 
cb_fileName_i(Fl_File_Input *,void *)91 void Fl_File_Chooser::cb_fileName_i(Fl_File_Input*, void*) {
92   fileNameCB();
93 }
cb_fileName(Fl_File_Input * o,void * v)94 void Fl_File_Chooser::cb_fileName(Fl_File_Input* o, void* v) {
95   ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_fileName_i(o,v);
96 }
97 
cb_okButton_i(Fl_Return_Button *,void *)98 void Fl_File_Chooser::cb_okButton_i(Fl_Return_Button*, void*) {
99   window->hide();
100 
101 // Do any callback that is registered...
102 if (callback_)
103   (*callback_)(this, data_);
104 }
cb_okButton(Fl_Return_Button * o,void * v)105 void Fl_File_Chooser::cb_okButton(Fl_Return_Button* o, void* v) {
106   ((Fl_File_Chooser*)(o->parent()->parent()->parent()->user_data()))->cb_okButton_i(o,v);
107 }
108 
cb_cancelButton_i(Fl_Button *,void *)109 void Fl_File_Chooser::cb_cancelButton_i(Fl_Button*, void*) {
110   fileName->value("");
111 fileList->deselect();
112 Fl::remove_timeout((Fl_Timeout_Handler)previewCB, this);
113 window->hide();
114 }
cb_cancelButton(Fl_Button * o,void * v)115 void Fl_File_Chooser::cb_cancelButton(Fl_Button* o, void* v) {
116   ((Fl_File_Chooser*)(o->parent()->parent()->parent()->user_data()))->cb_cancelButton_i(o,v);
117 }
118 
cb_favList_i(Fl_File_Browser *,void *)119 void Fl_File_Chooser::cb_favList_i(Fl_File_Browser*, void*) {
120   favoritesCB(favList);
121 }
cb_favList(Fl_File_Browser * o,void * v)122 void Fl_File_Chooser::cb_favList(Fl_File_Browser* o, void* v) {
123   ((Fl_File_Chooser*)(o->parent()->user_data()))->cb_favList_i(o,v);
124 }
125 
cb_favUpButton_i(Fl_Button *,void *)126 void Fl_File_Chooser::cb_favUpButton_i(Fl_Button*, void*) {
127   favoritesCB(favUpButton);
128 }
cb_favUpButton(Fl_Button * o,void * v)129 void Fl_File_Chooser::cb_favUpButton(Fl_Button* o, void* v) {
130   ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_favUpButton_i(o,v);
131 }
132 
cb_favDeleteButton_i(Fl_Button *,void *)133 void Fl_File_Chooser::cb_favDeleteButton_i(Fl_Button*, void*) {
134   favoritesCB(favDeleteButton);
135 }
cb_favDeleteButton(Fl_Button * o,void * v)136 void Fl_File_Chooser::cb_favDeleteButton(Fl_Button* o, void* v) {
137   ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_favDeleteButton_i(o,v);
138 }
139 
cb_favDownButton_i(Fl_Button *,void *)140 void Fl_File_Chooser::cb_favDownButton_i(Fl_Button*, void*) {
141   favoritesCB(favDownButton);
142 }
cb_favDownButton(Fl_Button * o,void * v)143 void Fl_File_Chooser::cb_favDownButton(Fl_Button* o, void* v) {
144   ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_favDownButton_i(o,v);
145 }
146 
cb_favCancelButton_i(Fl_Button *,void *)147 void Fl_File_Chooser::cb_favCancelButton_i(Fl_Button*, void*) {
148   favWindow->hide();
149 }
cb_favCancelButton(Fl_Button * o,void * v)150 void Fl_File_Chooser::cb_favCancelButton(Fl_Button* o, void* v) {
151   ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_favCancelButton_i(o,v);
152 }
153 
cb_favOkButton_i(Fl_Return_Button *,void *)154 void Fl_File_Chooser::cb_favOkButton_i(Fl_Return_Button*, void*) {
155   favoritesCB(favOkButton);
156 }
cb_favOkButton(Fl_Return_Button * o,void * v)157 void Fl_File_Chooser::cb_favOkButton(Fl_Return_Button* o, void* v) {
158   ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_favOkButton_i(o,v);
159 }
160 
Fl_File_Chooser(const char * d,const char * p,int t,const char * title)161 Fl_File_Chooser::Fl_File_Chooser(const char *d, const char *p, int t, const char *title) {
162   Fl_Group *prev_current = Fl_Group::current();
163   { window = new Fl_Double_Window(490, 380, "Choose File");
164     window->callback((Fl_Callback*)cb_window, (void*)(this));
165     { Fl_Group* o = new Fl_Group(10, 10, 470, 25);
166       { showChoice = new Fl_Choice(65, 10, 215, 25, "Show:");
167         showChoice->down_box(FL_BORDER_BOX);
168         showChoice->labelfont(1);
169         showChoice->callback((Fl_Callback*)cb_showChoice);
170         Fl_Group::current()->resizable(showChoice);
171         showChoice->label(show_label);
172       } // Fl_Choice* showChoice
173       { favoritesButton = new Fl_Menu_Button(290, 10, 155, 25, "Favorites");
174         favoritesButton->down_box(FL_BORDER_BOX);
175         favoritesButton->callback((Fl_Callback*)cb_favoritesButton);
176         favoritesButton->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
177         favoritesButton->label(favorites_label);
178       } // Fl_Menu_Button* favoritesButton
179       { Fl_Button* o = newButton = new Fl_Button(455, 10, 25, 25);
180         newButton->image(image_new);
181         newButton->labelsize(8);
182         newButton->callback((Fl_Callback*)cb_newButton);
183         o->tooltip(new_directory_tooltip);
184       } // Fl_Button* newButton
185       o->end();
186     } // Fl_Group* o
187     { Fl_Tile* o = new Fl_Tile(10, 45, 470, 225);
188       o->callback((Fl_Callback*)cb_);
189       { fileList = new Fl_File_Browser(10, 45, 295, 225);
190         fileList->type(2);
191         fileList->callback((Fl_Callback*)cb_fileList);
192         fileList->window()->hotspot(fileList);
193       } // Fl_File_Browser* fileList
194       { previewBox = new Fl_Box(305, 45, 175, 225, "?");
195         previewBox->box(FL_DOWN_BOX);
196         previewBox->labelsize(100);
197         previewBox->align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE);
198       } // Fl_Box* previewBox
199       o->end();
200       Fl_Group::current()->resizable(o);
201     } // Fl_Tile* o
202     { Fl_Group* o = new Fl_Group(10, 275, 470, 95);
203       { Fl_Group* o = new Fl_Group(10, 275, 470, 20);
204         { previewButton = new Fl_Check_Button(10, 275, 73, 20, "Preview");
205           previewButton->down_box(FL_DOWN_BOX);
206           previewButton->value(1);
207           previewButton->shortcut(0x80070);
208           previewButton->callback((Fl_Callback*)cb_previewButton);
209           previewButton->label(preview_label);
210         } // Fl_Check_Button* previewButton
211         { Fl_Box* o = new Fl_Box(115, 275, 365, 20);
212           Fl_Group::current()->resizable(o);
213         } // Fl_Box* o
214         o->end();
215       } // Fl_Group* o
216       { fileName = new Fl_File_Input(115, 300, 365, 35);
217         fileName->labelfont(1);
218         fileName->callback((Fl_Callback*)cb_fileName);
219         fileName->when(FL_WHEN_ENTER_KEY);
220         Fl_Group::current()->resizable(fileName);
221         fileName->when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY);
222       } // Fl_File_Input* fileName
223       { Fl_Box* o = new Fl_Box(10, 310, 105, 25, "Filename:");
224         o->labelfont(1);
225         o->align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE);
226         o->label(filename_label);
227       } // Fl_Box* o
228       { Fl_Group* o = new Fl_Group(10, 345, 470, 25);
229         { okButton = new Fl_Return_Button(313, 345, 85, 25, "OK");
230           okButton->callback((Fl_Callback*)cb_okButton);
231           okButton->label(fl_ok);
232         } // Fl_Return_Button* okButton
233         { Fl_Button* o = cancelButton = new Fl_Button(408, 345, 72, 25, "Cancel");
234           cancelButton->callback((Fl_Callback*)cb_cancelButton);
235           o->label(fl_cancel);
236         } // Fl_Button* cancelButton
237         { Fl_Box* o = new Fl_Box(10, 345, 30, 25);
238           Fl_Group::current()->resizable(o);
239         } // Fl_Box* o
240         o->end();
241       } // Fl_Group* o
242       o->end();
243     } // Fl_Group* o
244     if (title) window->label(title);
245     window->set_modal();
246     window->end();
247   } // Fl_Double_Window* window
248   { favWindow = new Fl_Double_Window(355, 150, "Manage Favorites");
249     favWindow->user_data((void*)(this));
250     { favList = new Fl_File_Browser(10, 10, 300, 95);
251       favList->type(2);
252       favList->callback((Fl_Callback*)cb_favList);
253       Fl_Group::current()->resizable(favList);
254     } // Fl_File_Browser* favList
255     { Fl_Group* o = new Fl_Group(320, 10, 25, 95);
256       { favUpButton = new Fl_Button(320, 10, 25, 25, "@8>");
257         favUpButton->callback((Fl_Callback*)cb_favUpButton);
258       } // Fl_Button* favUpButton
259       { favDeleteButton = new Fl_Button(320, 45, 25, 25, "X");
260         favDeleteButton->labelfont(1);
261         favDeleteButton->callback((Fl_Callback*)cb_favDeleteButton);
262         Fl_Group::current()->resizable(favDeleteButton);
263       } // Fl_Button* favDeleteButton
264       { favDownButton = new Fl_Button(320, 80, 25, 25, "@2>");
265         favDownButton->callback((Fl_Callback*)cb_favDownButton);
266       } // Fl_Button* favDownButton
267       o->end();
268     } // Fl_Group* o
269     { Fl_Group* o = new Fl_Group(10, 113, 335, 29);
270       { favCancelButton = new Fl_Button(273, 115, 72, 25, "Cancel");
271         favCancelButton->callback((Fl_Callback*)cb_favCancelButton);
272         favCancelButton->label(fl_cancel);
273       } // Fl_Button* favCancelButton
274       { favOkButton = new Fl_Return_Button(181, 115, 79, 25, "Save");
275         favOkButton->callback((Fl_Callback*)cb_favOkButton);
276         favOkButton->label(save_label);
277       } // Fl_Return_Button* favOkButton
278       { Fl_Box* o = new Fl_Box(10, 115, 161, 25);
279         Fl_Group::current()->resizable(o);
280       } // Fl_Box* o
281       o->end();
282     } // Fl_Group* o
283     favWindow->label(manage_favorites_label);
284     favWindow->set_modal();
285     favWindow->size_range(181, 150);
286     favWindow->end();
287   } // Fl_Double_Window* favWindow
288   callback_ = 0;
289 data_ = 0;
290 directory_[0] = 0;
291 window->size_range(window->w(), window->h(), Fl::w(), Fl::h());
292 type(t);
293 filter(p);
294 update_favorites();
295 value(d);
296 type(t);
297 int e;
298 prefs_.get("preview", e, 1);
299 preview(e);
300 Fl_Group::current(prev_current);
301 }
302 
~Fl_File_Chooser()303 Fl_File_Chooser::~Fl_File_Chooser() {
304   Fl::remove_timeout((Fl_Timeout_Handler)previewCB, this);
305 delete window;
306 delete favWindow;
307 }
308 
callback(void (* cb)(Fl_File_Chooser *,void *),void * d)309 void Fl_File_Chooser::callback(void (*cb)(Fl_File_Chooser *, void *), void *d ) {
310   callback_ = cb;
311 data_     = d;
312 }
313 
color(Fl_Color c)314 void Fl_File_Chooser::color(Fl_Color c) {
315   fileList->color(c);
316 }
317 
color()318 Fl_Color Fl_File_Chooser::color() {
319   return (fileList->color());
320 }
321 
directory()322 char * Fl_File_Chooser::directory() {
323   return directory_;
324 }
325 
filter()326 const char * Fl_File_Chooser::filter() {
327   return (fileList->filter());
328 }
329 
filter_value()330 int Fl_File_Chooser::filter_value() {
331   return showChoice->value();
332 }
333 
filter_value(int f)334 void Fl_File_Chooser::filter_value(int f) {
335   showChoice->value(f);
336 showChoiceCB();
337 }
338 
hide()339 void Fl_File_Chooser::hide() {
340   window->hide();
341 }
342 
iconsize(uchar s)343 void Fl_File_Chooser::iconsize(uchar s) {
344   fileList->iconsize(s);
345 }
346 
iconsize()347 uchar Fl_File_Chooser::iconsize() {
348   return (fileList->iconsize());
349 }
350 
label(const char * l)351 void Fl_File_Chooser::label(const char *l) {
352   window->label(l);
353 }
354 
label()355 const char * Fl_File_Chooser::label() {
356   return (window->label());
357 }
358 
ok_label(const char * l)359 void Fl_File_Chooser::ok_label(const char *l) {
360   okButton->label(l);
361 int w=0, h=0;
362 okButton->measure_label(w, h);
363 okButton->resize(cancelButton->x() - 50 - w, cancelButton->y(),
364                  w + 40, 25);
365 okButton->parent()->init_sizes();
366 }
367 
ok_label()368 const char * Fl_File_Chooser::ok_label() {
369   return (okButton->label());
370 }
371 
show()372 void Fl_File_Chooser::show() {
373   window->hotspot(fileList);
374 window->show();
375 Fl::flush();
376 fl_cursor(FL_CURSOR_WAIT);
377 rescan_keep_filename();
378 fl_cursor(FL_CURSOR_DEFAULT);
379 fileName->take_focus();
380 }
381 
shown()382 int Fl_File_Chooser::shown() {
383   return window->shown();
384 }
385 
textcolor(Fl_Color c)386 void Fl_File_Chooser::textcolor(Fl_Color c) {
387   fileList->textcolor(c);
388 }
389 
textcolor()390 Fl_Color Fl_File_Chooser::textcolor() {
391   return (fileList->textcolor());
392 }
393 
textfont(uchar f)394 void Fl_File_Chooser::textfont(uchar f) {
395   fileList->textfont(f);
396 }
397 
textfont()398 uchar Fl_File_Chooser::textfont() {
399   return (fileList->textfont());
400 }
401 
textsize(uchar s)402 void Fl_File_Chooser::textsize(uchar s) {
403   fileList->textsize(s);
404 }
405 
textsize()406 uchar Fl_File_Chooser::textsize() {
407   return (fileList->textsize());
408 }
409 
type(int t)410 void Fl_File_Chooser::type(int t) {
411   type_ = t;
412 if (t & MULTI)
413   fileList->type(FL_MULTI_BROWSER);
414 else
415   fileList->type(FL_HOLD_BROWSER);
416 if (t & CREATE)
417   newButton->activate();
418 else
419   newButton->deactivate();
420 if (t & DIRECTORY)
421   fileList->filetype(Fl_File_Browser::DIRECTORIES);
422 else
423   fileList->filetype(Fl_File_Browser::FILES);
424 }
425 
type()426 int Fl_File_Chooser::type() {
427   return (type_);
428 }
429 
user_data() const430 void * Fl_File_Chooser::user_data() const {
431   return (data_);
432 }
433 
user_data(void * d)434 void Fl_File_Chooser::user_data(void *d) {
435   data_ = d;
436 }
437 
visible()438 int Fl_File_Chooser::visible() {
439   return window->visible();
440 }
441 
442 //
443 // End of "$Id: Fl_File_Chooser.cxx 6092 2008-04-11 12:57:37Z matt $".
444 //
445