Fl_Printer class on Xlib: allow dialog text customization at run-time

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@7350 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Manolo Gouy 2010-03-28 14:03:40 +00:00
parent 99f2e8b5be
commit b77071a3de
4 changed files with 177 additions and 111 deletions

View File

@ -38,7 +38,7 @@
This class has the same API as class Fl_Printer except for start_job() member function.
\see class Fl_Printer.
*/
class FL_EXPORT Fl_PSfile_Device : public Fl_Abstract_Printer {
FL_EXPORT class Fl_PSfile_Device : public Fl_Abstract_Printer {
public:
/**
\brief Possible page formats.
@ -251,42 +251,12 @@ class FL_EXPORT Fl_PSfile_Device : public Fl_Abstract_Printer {
int end_page (void);
void end_job(void);
#endif // FL_DOXYGEN
/**
@brief The constructor.
*/
Fl_PSfile_Device(void);
/**
@brief Begins the session where all graphics requests will go to a local PostScript file.
*
Opens a file dialog entitled with Fl_PSfile_Device::file_chooser_title to select an output PostScript file.
@param pagecount The total number of pages to be created.
@param format Desired page format.
@param layout Desired page layout.
@return 0 iff OK, 1 if user cancelled the file dialog, 2 if fopen failed on user-selected output file.
*/
int start_job(int pagecount, enum Page_Format format = A4, enum Page_Layout layout = PORTRAIT);
/**
@brief Begins the session where all graphics requests will go to FILE pointer.
*
@param ps_output A writable FILE pointer that will receive PostScript output and that will be closed
when end_job() will be called.
@param pagecount The total number of pages to be created.
@param format Desired page format.
@param layout Desired page layout.
@return always 0.
*/
int start_job(FILE *ps_output, int pagecount, enum Page_Format format = A4, enum Page_Layout layout = PORTRAIT);
/**
@brief The destructor.
*/
virtual ~Fl_PSfile_Device();
// how to have the const value appear in Doxygen as occurs with Fl_File_Chooser ?
/** \brief "Select a .ps file" [this text may be customized at run-time] */
/** [this text may be customized at run-time] */
static const char *file_chooser_title;
};

View File

@ -94,6 +94,48 @@ public:
#endif
int end_page (void);
void end_job (void);
#ifdef FL_DOXYGEN
/** \name These attributes apply to the Xlib platform only.
\{
*/
/** [this text may be customized at run-time] */
static const char *dialog_title;
/** [this text may be customized at run-time] */
static const char *dialog_printer;
/** [this text may be customized at run-time] */
static const char *dialog_range;
/** [this text may be customized at run-time] */
static const char *dialog_copies;
/** [this text may be customized at run-time] */
static const char *dialog_all;
/** [this text may be customized at run-time] */
static const char *dialog_pages;
/** [this text may be customized at run-time] */
static const char *dialog_from;
/** [this text may be customized at run-time] */
static const char *dialog_to;
/** "Properties..." [this text may be customized at run-time] */
static const char *dialog_properties;
/** [this text may be customized at run-time] */
static const char *dialog_copyNo;
/** [this text may be customized at run-time] */
static const char *dialog_print_button;
/** [this text may be customized at run-time] */
static const char *dialog_cancel_button;
/** [this text may be customized at run-time] */
static const char *property_title;
/** [this text may be customized at run-time] */
static const char *property_pagesize;
/** [this text may be customized at run-time] */
static const char *property_mode;
/** [this text may be customized at run-time] */
static const char *property_use;
/** [this text may be customized at run-time] */
static const char *property_save;
/** [this text may be customized at run-time] */
static const char *property_cancel;
/** \} */
#endif
};
#else
@ -102,6 +144,25 @@ public:
class Fl_Printer : public Fl_PSfile_Device {
public:
static const char *dialog_title;
static const char *dialog_printer;
static const char *dialog_range;
static const char *dialog_copies;
static const char *dialog_all;
static const char *dialog_pages;
static const char *dialog_from;
static const char *dialog_to;
static const char *dialog_properties;
static const char *dialog_copyNo;
static const char *dialog_print_button;
static const char *dialog_cancel_button;
static const char *property_title;
static const char *property_pagesize;
static const char *property_mode;
static const char *property_use;
static const char *property_save;
static const char *property_cancel;
Fl_Printer(void) {};
~Fl_Printer(void) {};
int start_job(int pages, int *firstpage = NULL, int *lastpage = NULL);

View File

@ -25,23 +25,87 @@
// http://www.fltk.org/str.php
//
#ifndef FL_DOXYGEN
#include <FL/Fl_PSfile_Device.H>
#include <FL/Fl.H>
#include <FL/fl_ask.H>
#include <FL/fl_draw.H>
#include <FL/Fl_Native_File_Chooser.H>
#include <stdio.h>
#include <math.h>
#include <FL/Fl_PSfile_Device.H>
#include <FL/Fl_Native_File_Chooser.H>
const char *Fl_PSfile_Device::file_chooser_title = "Select a .ps file";
/**
@brief The constructor.
*/
Fl_PSfile_Device::Fl_PSfile_Device(void)
{
close_cmd_ = 0;
//lang_level_ = 3;
lang_level_ = 2;
mask = 0;
ps_filename_ = NULL;
type_ = postscript_device;
#ifdef __APPLE__
gc = fl_gc; // the display context is used by fl_text_extents()
#endif
}
/**
@brief Begins the session where all graphics requests will go to a local PostScript file.
*
Opens a file dialog entitled with Fl_PSfile_Device::file_chooser_title to select an output PostScript file.
@param pagecount The total number of pages to be created.
@param format Desired page format.
@param layout Desired page layout.
@return 0 iff OK, 1 if user cancelled the file dialog, 2 if fopen failed on user-selected output file.
*/
int Fl_PSfile_Device::start_job (int pagecount, enum Page_Format format, enum Page_Layout layout)
{
Fl_Native_File_Chooser fnfc;
fnfc.title(Fl_PSfile_Device::file_chooser_title);
fnfc.type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE);
fnfc.options(Fl_Native_File_Chooser::SAVEAS_CONFIRM);
fnfc.filter("PostScript\t*.ps\n");
// Show native chooser
if ( fnfc.show() ) return 1;
output = fopen(fnfc.filename(), "w");
if(output == NULL) return 2;
ps_filename_ = strdup(fnfc.filename());
start_postscript(pagecount, format, layout);
return 0;
}
/**
@brief Begins the session where all graphics requests will go to FILE pointer.
*
@param ps_output A writable FILE pointer that will receive PostScript output and that will be closed
when end_job() will be called.
@param pagecount The total number of pages to be created.
@param format Desired page format.
@param layout Desired page layout.
@return always 0.
*/
int Fl_PSfile_Device::start_job (FILE *ps_output, int pagecount, enum Page_Format format, enum Page_Layout layout)
{
output = ps_output;
ps_filename_ = NULL;
start_postscript(pagecount, format, layout);
return 0;
}
/**
@brief The destructor.
*/
Fl_PSfile_Device::~Fl_PSfile_Device() {
if (ps_filename_) free(ps_filename_);
}
#ifndef FL_DOXYGEN
#if ! (defined(__APPLE__) || defined(WIN32) )
#include "print_panel.cxx"
#endif
const char *Fl_PSfile_Device::file_chooser_title = "Select a .ps file";
const Fl_PSfile_Device::page_format Fl_PSfile_Device::page_formats[NO_PAGE_FORMATS] = { // order of enum Page_Format
// comes from appendix B of 5003.PPD_Spec_v4.3.pdf
@ -394,19 +458,6 @@ static const char * prolog_3 = // prolog relevant only if lang_level >2
// end prolog
Fl_PSfile_Device::Fl_PSfile_Device(void)
{
close_cmd_ = 0;
//lang_level_ = 3;
lang_level_ = 2;
mask = 0;
ps_filename_ = NULL;
type_ = postscript_device;
#ifdef __APPLE__
gc = fl_gc; // the display context is used by fl_text_extents()
#endif
}
int Fl_PSfile_Device::start_postscript (int pagecount, enum Page_Format format, enum Page_Layout layout)
//returns 0 iff OK
{
@ -465,10 +516,6 @@ int Fl_PSfile_Device::start_postscript (int pagecount, enum Page_Format format,
return 0;
}
Fl_PSfile_Device::~Fl_PSfile_Device() {
if (ps_filename_) free(ps_filename_);
}
void Fl_PSfile_Device::recover(){
color(cr_,cg_,cb_);
line_style(linestyle_,linewidth_,linedash_);
@ -1197,30 +1244,6 @@ int Fl_PSfile_Device::end_page (void)
return 0;
}
int Fl_PSfile_Device::start_job (int pagecount, enum Page_Format format, enum Page_Layout layout)
{
Fl_Native_File_Chooser fnfc;
fnfc.title(Fl_PSfile_Device::file_chooser_title);
fnfc.type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE);
fnfc.options(Fl_Native_File_Chooser::SAVEAS_CONFIRM);
fnfc.filter("PostScript\t*.ps\n");
// Show native chooser
if ( fnfc.show() ) return 1;
output = fopen(fnfc.filename(), "w");
if(output == NULL) return 2;
ps_filename_ = strdup(fnfc.filename());
start_postscript(pagecount, format, layout);
return 0;
}
int Fl_PSfile_Device::start_job (FILE *ps_output, int pagecount, enum Page_Format format, enum Page_Layout layout)
{
output = ps_output;
ps_filename_ = NULL;
start_postscript(pagecount, format, layout);
return 0;
}
void Fl_PSfile_Device::end_job (void)
// finishes PostScript & closes file
{
@ -1321,14 +1344,6 @@ int Fl_Printer::start_job(int pages, int *firstpage, int *lastpage) {
return Fl_PSfile_Device::start_postscript(pages, format, layout); // start printing
}
/*
void print_cb(Fl_Return_Button *, void *) {
printf ("print_cb called\n"); fflush(stdout);
print_panel->hide();
// return Fl_PSfile_Device::start_postscript(pages, format); // temporary
}
*/
#endif // ! (defined(__APPLE__) || defined(WIN32) )
#endif // FL_DOXYGEN

View File

@ -69,6 +69,26 @@ static Fl_Spinner *print_copies=(Fl_Spinner *)0;
static int print_start = 0; // 1 if print_okay has been clicked
static int print_pipe = 0; // 0 = file, 1 = pipe (lp)
const char *Fl_Printer::dialog_title = "Print";
const char *Fl_Printer::dialog_printer = "Printer:";
const char *Fl_Printer::dialog_range = "Print Range";
const char *Fl_Printer::dialog_copies = "Copies";
const char *Fl_Printer::dialog_all = "All";
const char *Fl_Printer::dialog_pages = "Pages";
const char *Fl_Printer::dialog_from = "From:";
const char *Fl_Printer::dialog_to = "To:";
const char *Fl_Printer::dialog_properties = "Properties...";
const char *Fl_Printer::dialog_copyNo = "# Copies:";
const char *Fl_Printer::dialog_print_button = "Print";
const char *Fl_Printer::dialog_cancel_button = "Cancel";
const char *Fl_Printer::property_title = "Printer Properties";
const char *Fl_Printer::property_pagesize = "Page Size:";
const char *Fl_Printer::property_mode = "Output Mode:";
const char *Fl_Printer::property_use = "Use";
const char *Fl_Printer::property_save = "Save";
const char *Fl_Printer::property_cancel = "Cancel";
static void cb_print_choice(Fl_Choice*, void*) {
print_update_status();
}
@ -248,31 +268,31 @@ static void cb_Use(Fl_Button*, void*) {
}
Fl_Double_Window* make_print_panel() {
{ print_panel = new Fl_Double_Window(465, 235, "Print");
{ print_panel = new Fl_Double_Window(465, 235, Fl_Printer::dialog_title);
{ print_panel_controls = new Fl_Group(10, 10, 447, 216);
{ print_choice = new Fl_Choice(113, 10, 181, 25, "Printer:");
{ print_choice = new Fl_Choice(133, 10, 181, 25, Fl_Printer::dialog_printer);
print_choice->down_box(FL_BORDER_BOX);
print_choice->labelfont(1);
print_choice->callback((Fl_Callback*)cb_print_choice);
print_choice->when(FL_WHEN_CHANGED);
} // Fl_Choice* print_choice
{ print_properties = new Fl_Button(294, 10, 105, 25, "Properties...");
{ print_properties = new Fl_Button(314, 10, 115, 25, Fl_Printer::dialog_properties);
print_properties->callback((Fl_Callback*)cb_print_properties);
} // Fl_Button* print_properties
{ print_status = new Fl_Box(111, 41, 288, 17, "printer/job status");
print_status->align(Fl_Align(68|FL_ALIGN_INSIDE));
{ print_status = new Fl_Box(0, 41, print_panel_controls->w(), 17, "printer/job status");
print_status->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE|FL_ALIGN_LEFT));
} // Fl_Box* print_status
{ Fl_Group* o = new Fl_Group(10, 86, 227, 105, "Print Range");
{ Fl_Group* o = new Fl_Group(10, 86, 227, 105, Fl_Printer::dialog_range);
o->box(FL_THIN_DOWN_BOX);
o->labelfont(1);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
{ print_all = new Fl_Round_Button(20, 96, 38, 25, "All");
{ print_all = new Fl_Round_Button(20, 96, 38, 25, Fl_Printer::dialog_all);
print_all->type(102);
print_all->down_box(FL_ROUND_DOWN_BOX);
print_all->value(1);
print_all->callback((Fl_Callback*)cb_print_all);
} // Fl_Round_Button* print_all
{ print_pages = new Fl_Round_Button(20, 126, 64, 25, "Pages");
{ print_pages = new Fl_Round_Button(20, 126, 64, 25, Fl_Printer::dialog_pages);
print_pages->type(102);
print_pages->down_box(FL_ROUND_DOWN_BOX);
print_pages->callback((Fl_Callback*)cb_print_pages);
@ -282,23 +302,23 @@ Fl_Double_Window* make_print_panel() {
print_selection->down_box(FL_ROUND_DOWN_BOX);
print_selection->callback((Fl_Callback*)cb_print_selection);
} // Fl_Round_Button* print_selection
{ print_from = new Fl_Int_Input(136, 126, 28, 25, "From:");
{ print_from = new Fl_Int_Input(136, 126, 28, 25, Fl_Printer::dialog_from);
print_from->type(2);
print_from->textfont(4);
print_from->deactivate();
} // Fl_Int_Input* print_from
{ print_to = new Fl_Int_Input(199, 126, 28, 25, "To:");
{ print_to = new Fl_Int_Input(199, 126, 28, 25, Fl_Printer::dialog_to);
print_to->type(2);
print_to->textfont(4);
print_to->deactivate();
} // Fl_Int_Input* print_to
o->end();
} // Fl_Group* o
{ Fl_Group* o = new Fl_Group(247, 86, 210, 105, "Copies");
{ Fl_Group* o = new Fl_Group(247, 86, 210, 105, Fl_Printer::dialog_copies);
o->box(FL_THIN_DOWN_BOX);
o->labelfont(1);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
{ print_copies = new Fl_Spinner(321, 96, 45, 25, "# Copies:");
{ print_copies = new Fl_Spinner(321, 96, 45, 25, Fl_Printer::dialog_copyNo);
print_copies->callback((Fl_Callback*)cb_print_copies);
print_copies->when(FL_WHEN_CHANGED);
} // Fl_Spinner* print_copies
@ -436,10 +456,10 @@ Fl_Double_Window* make_print_panel() {
} // Fl_Group* print_collate_group[1]
o->end();
} // Fl_Group* o
{ Fl_Return_Button* o = new Fl_Return_Button(309, 201, 70, 25, "Print");
{ Fl_Return_Button* o = new Fl_Return_Button(279, 201, 100, 25, Fl_Printer::dialog_print_button);
o->callback((Fl_Callback*)print_cb);
} // Fl_Return_Button* o
{ Fl_Button* o = new Fl_Button(389, 201, 68, 25, "Cancel");
{ Fl_Button* o = new Fl_Button(389, 201, 68, 25, Fl_Printer::dialog_cancel_button);
o->callback((Fl_Callback*)cb_Cancel);
} // Fl_Button* o
print_panel_controls->end();
@ -451,15 +471,15 @@ Fl_Double_Window* make_print_panel() {
print_panel->set_modal();
print_panel->end();
} // Fl_Double_Window* print_panel
{ print_properties_panel = new Fl_Double_Window(290, 130, "Printer Properties");
{ print_properties_panel = new Fl_Double_Window(290, 130, Fl_Printer::property_title);
print_properties_panel->callback((Fl_Callback*)cb_print_properties_panel);
{ print_page_size = new Fl_Choice(110, 10, 80, 25, "Page Size:");
{ print_page_size = new Fl_Choice(150, 10, 80, 25, Fl_Printer::property_pagesize);
print_page_size->down_box(FL_BORDER_BOX);
print_page_size->labelfont(1);
print_page_size->labelfont(FL_HELVETICA);
print_page_size->menu(menu_print_page_size);
} // Fl_Choice* print_page_size
{ Fl_Group* o = new Fl_Group(110, 45, 170, 40, "Output Mode:");
o->labelfont(1);
{ Fl_Group* o = new Fl_Group(110, 45, 170, 40, Fl_Printer::property_mode);
o->labelfont(FL_HELVETICA);
o->align(Fl_Align(FL_ALIGN_LEFT));
{ print_output_mode[0] = new Fl_Button(110, 45, 30, 40);
print_output_mode[0]->type(102);
@ -496,13 +516,13 @@ Fl_Double_Window* make_print_panel() {
} // Fl_Button* print_output_mode[3]
o->end();
} // Fl_Group* o
{ Fl_Return_Button* o = new Fl_Return_Button(123, 95, 79, 25, "Save");
{ Fl_Return_Button* o = new Fl_Return_Button(93, 95, 99, 25, Fl_Printer::property_save);
o->callback((Fl_Callback*)cb_Save);
} // Fl_Return_Button* o
{ Fl_Button* o = new Fl_Button(212, 95, 68, 25, "Cancel");
{ Fl_Button* o = new Fl_Button(202, 95, 78, 25, Fl_Printer::property_cancel);
o->callback((Fl_Callback*)cb_Cancel1);
} // Fl_Button* o
{ Fl_Button* o = new Fl_Button(60, 95, 53, 25, "Use");
{ Fl_Button* o = new Fl_Button(10, 95, 73, 25, Fl_Printer::property_use);
o->callback((Fl_Callback*)cb_Use);
} // Fl_Button* o
print_properties_panel->set_modal();