|
- //
- // "$Id: file_chooser.cxx 8164 2011-01-01 20:17:58Z matt $"
- //
- // File chooser test program.
- //
- // Copyright 1999-2010 by Michael Sweet.
- //
- // This library is free software; you can redistribute it and/or
- // modify it under the terms of the GNU Library General Public
- // License as published by the Free Software Foundation; either
- // version 2 of the License, or (at your option) any later version.
- //
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- // Library General Public License for more details.
- //
- // You should have received a copy of the GNU Library General Public
- // License along with this library; if not, write to the Free Software
- // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- // USA.
- //
- // Please report all bugs and problems on the following page:
- //
- // http://www.fltk.org/str.php
- //
- // Contents:
- //
- // main() - Create a file chooser and wait for a selection to
- // be made.
- // close_callback() - Close the main window...
- // fc_callback() - Handle choices in the file chooser...
- // pdf_check() - Check for and load the first page of a PDF file.
- // ps_check() - Check for and load the first page of a PostScript
- // file.
- // show_callback() - Show the file chooser...
- //
- // extra_callback() - circle extra groups (none,group1,check_button);
- //
-
- //
- // Include necessary headers...
- //
-
- #include <stdio.h>
- #include <FL/Fl_File_Chooser.H>
- #include <FL/Fl_File_Icon.H>
- #include <FL/Fl_Shared_Image.H>
- #include <FL/Fl_PNM_Image.H>
- #include <FL/Fl_Light_Button.H>
- #include <FL/Fl_Double_Window.H>
- #include <string.h>
-
-
- //
- // Globals...
- //
-
- Fl_Input *filter;
- Fl_File_Browser *files;
- Fl_File_Chooser *fc;
- Fl_Shared_Image *image = 0;
-
- // for choosing extra groups
- Fl_Choice *ch_extra;
- // first extra group
- Fl_Group *encodings = (Fl_Group*)0;
- Fl_Choice *ch_enc;
- // second extra widget
- Fl_Check_Button *version = (Fl_Check_Button*)0;
-
- //
- // Functions...
- //
-
- void close_callback(void);
- void create_callback(void);
- void dir_callback(void);
- void fc_callback(Fl_File_Chooser *, void *);
- void multi_callback(void);
- Fl_Image *pdf_check(const char *, uchar *, int);
- Fl_Image *ps_check(const char *, uchar *, int);
- void show_callback(void);
-
- void extra_callback(Fl_Choice*,void*);
-
- //
- // 'main()' - Create a file chooser and wait for a selection to be made.
- //
-
- int // O - Exit status
- main(int argc, // I - Number of command-line arguments
- char *argv[]) // I - Command-line arguments
- {
- Fl_Double_Window *window;// Main window
- Fl_Button *button;// Buttons
- Fl_File_Icon *icon; // New file icon
-
-
- // Make the file chooser...
- Fl::scheme(NULL);
- Fl_File_Icon::load_system_icons();
-
- fc = new Fl_File_Chooser(".", "*", Fl_File_Chooser::SINGLE, "Fl_File_Chooser Test");
- fc->callback(fc_callback);
-
- // Register the PS and PDF image types...
- Fl_Shared_Image::add_handler(pdf_check);
- Fl_Shared_Image::add_handler(ps_check);
-
- // Make the main window...
- window = new Fl_Double_Window(400, 215, "File Chooser Test");
-
- filter = new Fl_Input(50, 10, 315, 25, "Filter:");
- int argn = 1;
- #ifdef __APPLE__
- // OS X may add the process number as the first argument - ignore
- if (argc>argn && strncmp(argv[1], "-psn_", 5)==0)
- argn++;
- #endif
- if (argc > argn)
- filter->value(argv[argn]);
- else
- filter->value("PDF Files (*.pdf)\t"
- "PostScript Files (*.ps)\t"
- "Image Files (*.{bmp,gif,jpg,png})\t"
- "C/C++ Source Files (*.{c,C,cc,cpp,cxx})");
-
- button = new Fl_Button(365, 10, 25, 25);
- button->labelcolor(FL_YELLOW);
- button->callback((Fl_Callback *)show_callback);
-
- icon = Fl_File_Icon::find(".", Fl_File_Icon::DIRECTORY);
- icon->label(button);
-
- button = new Fl_Light_Button(50, 45, 80, 25, "MULTI");
- button->callback((Fl_Callback *)multi_callback);
-
- button = new Fl_Light_Button(140, 45, 90, 25, "CREATE");
- button->callback((Fl_Callback *)create_callback);
-
- button = new Fl_Light_Button(240, 45, 115, 25, "DIRECTORY");
- button->callback((Fl_Callback *)dir_callback);
-
- //
- ch_extra = new Fl_Choice(150, 75, 150, 25, "Extra Group:");
- ch_extra->add("none|encodings group|check button");
- ch_extra->value(0);
- ch_extra->callback((Fl_Callback *)extra_callback);
- //
- files = new Fl_File_Browser(50, 105, 340, 75, "Files:");
- files->align(FL_ALIGN_LEFT);
-
- button = new Fl_Button(340, 185, 50, 25, "Close");
- button->callback((Fl_Callback *)close_callback);
-
- window->resizable(files);
- window->end();
- window->show(1, argv);
-
- Fl::run();
-
- return (0);
- }
-
-
- void
- extra_callback(Fl_Choice*w,void*)
- {
- int val=w->value();
- if (0 == val) fc->add_extra(NULL);
- else if (1 == val) {
- if(!encodings){
- encodings=new Fl_Group(0,0,254,30);
- ch_enc=new Fl_Choice(152,2,100,25,"Choose Encoding:");
- ch_enc->add("ASCII|Koi8-r|win1251|Utf-8");
- encodings->end();
- }
- fc->add_extra(encodings);
- } else {
- if (!version) {
- version = new Fl_Check_Button(5,0,200,25,"Save binary 1.0 version");
- }
- fc->add_extra(version);
- }
- }
-
-
- //
- // 'close_callback()' - Close the main window...
- //
-
- void
- close_callback(void)
- {
- exit(0);
- }
-
-
- //
- // 'create_callback()' - Handle clicks on the create button.
- //
-
- void
- create_callback(void)
- {
- fc->type(fc->type() ^ Fl_File_Chooser::CREATE);
- }
-
-
- //
- // 'dir_callback()' - Handle clicks on the directory button.
- //
-
- void
- dir_callback(void)
- {
- fc->type(fc->type() ^ Fl_File_Chooser::DIRECTORY);
- }
-
-
- //
- // 'fc_callback()' - Handle choices in the file chooser...
- //
-
- void
- fc_callback(Fl_File_Chooser *fc, // I - File chooser
- void *data) // I - Data
- {
- const char *filename; // Current filename
-
-
- printf("fc_callback(fc = %p, data = %p)\n", fc, data);
-
- filename = fc->value();
-
- printf(" filename = \"%s\"\n", filename ? filename : "(null)");
- }
-
-
- //
- // 'multi_callback()' - Handle clicks on the multi button.
- //
-
- void
- multi_callback(void)
- {
- fc->type(fc->type() ^ Fl_File_Chooser::MULTI);
- }
-
-
- //
- // 'pdf_check()' - Check for and load the first page of a PDF file.
- //
-
- Fl_Image * // O - Page image or NULL
- pdf_check(const char *name, // I - Name of file
- uchar *header, // I - Header data
- int) // I - Length of header data (unused)
- {
- const char *home; // Home directory
- char preview[FL_PATH_MAX], // Preview filename
- command[FL_PATH_MAX]; // Command
-
-
- if (memcmp(header, "%PDF", 4) != 0)
- return 0;
-
- home = getenv("HOME");
- sprintf(preview, "%s/.preview.ppm", home ? home : "");
-
- sprintf(command,
- "gs -r100 -dFIXED -sDEVICE=ppmraw -dQUIET -dNOPAUSE -dBATCH "
- "-sstdout=\"%%stderr\" -sOUTPUTFILE=\'%s\' "
- "-dFirstPage=1 -dLastPage=1 \'%s\' 2>/dev/null", preview, name);
-
- if (system(command)) return 0;
-
- return new Fl_PNM_Image(preview);
- }
-
-
- //
- // 'ps_check()' - Check for and load the first page of a PostScript file.
- //
-
- Fl_Image * // O - Page image or NULL
- ps_check(const char *name, // I - Name of file
- uchar *header, // I - Header data
- int) // I - Length of header data (unused)
- {
- const char *home; // Home directory
- char preview[FL_PATH_MAX], // Preview filename
- outname[FL_PATH_MAX], // Preview PS file
- command[FL_PATH_MAX]; // Command
- FILE *in, // Input file
- *out; // Output file
- int page; // Current page
- char line[256]; // Line from file
-
-
- if (memcmp(header, "%!", 2) != 0)
- return 0;
-
- home = getenv("HOME");
- sprintf(preview, "%s/.preview.ppm", home ? home : "");
-
- if (memcmp(header, "%!PS", 4) == 0) {
- // PS file has DSC comments; extract the first page...
- sprintf(outname, "%s/.preview.ps", home ? home : "");
-
- if (strcmp(name, outname) != 0) {
- in = fl_fopen(name, "rb");
- out = fl_fopen(outname, "wb");
- page = 0;
-
- while (fgets(line, sizeof(line), in) != NULL) {
- if (strncmp(line, "%%Page:", 7) == 0) {
- page ++;
- if (page > 1) break;
- }
-
- fputs(line, out);
- }
-
- fclose(in);
- fclose(out);
- }
- } else {
- // PS file doesn't have DSC comments; do the whole file...
- strncpy(outname, name, sizeof(outname) - 1);
- outname[sizeof(outname) - 1] = '\0';
- }
-
- sprintf(command,
- "gs -r100 -dFIXED -sDEVICE=ppmraw -dQUIET -dNOPAUSE -dBATCH "
- "-sstdout=\"%%stderr\" -sOUTPUTFILE=\'%s\' \'%s\' 2>/dev/null",
- preview, outname);
-
- if (system(command)) return 0;
-
- return new Fl_PNM_Image(preview);
- }
-
-
- //
- // 'show_callback()' - Show the file chooser...
- //
-
- void
- show_callback(void)
- {
- int i; // Looping var
- int count; // Number of files selected
- char relative[FL_PATH_MAX]; // Relative filename
-
-
- if (filter->value()[0])
- fc->filter(filter->value());
-
- fc->show();
-
- while (fc->visible()) {
- Fl::wait();
- }
-
- count = fc->count();
- if (count > 0)
- {
- files->clear();
-
- for (i = 1; i <= count; i ++)
- {
- if (!fc->value(i))
- break;
-
- fl_filename_relative(relative, sizeof(relative), fc->value(i));
-
- files->add(relative,
- Fl_File_Icon::find(fc->value(i), Fl_File_Icon::PLAIN));
- }
-
- files->redraw();
- }
- }
-
-
- //
- // End of "$Id: file_chooser.cxx 8164 2011-01-01 20:17:58Z matt $".
- //
|