1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     Generic print dialogs 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // ============================================================================ 
  14 // ============================================================================ 
  16 // ---------------------------------------------------------------------------- 
  18 // ---------------------------------------------------------------------------- 
  20 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  21     #pragma implementation "prntdlgg.h" 
  24 // For compilers that support precompilation, includes "wx.h". 
  25 #include "wx/wxprec.h" 
  31 #if wxUSE_PRINTING_ARCHITECTURE && (!defined(__WXMSW__) || wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW) 
  36     #include "wx/stattext.h" 
  37     #include "wx/statbox.h" 
  38     #include "wx/button.h" 
  39     #include "wx/checkbox.h" 
  40     #include "wx/textctrl.h" 
  41     #include "wx/radiobox.h" 
  42     #include "wx/filedlg.h" 
  43     #include "wx/combobox.h" 
  46     #include "wx/cmndata.h" 
  50   #include "wx/statline.h" 
  53 #include "wx/generic/prntdlgg.h" 
  56     #include "wx/generic/dcpsg.h" 
  59 #include "wx/prntbase.h" 
  60 #include "wx/printdlg.h" 
  62 #include "wx/filename.h" 
  63 #include "wx/tokenzr.h" 
  64 #include "wx/imaglist.h" 
  69 // ---------------------------------------------------------------------------- 
  71 // ---------------------------------------------------------------------------- 
  73 extern wxPrintPaperDatabase 
*wxThePrintPaperDatabase
; 
  77 //---------------------------------------------------------------------------- 
  78 // wxPostScriptNativeData 
  79 //---------------------------------------------------------------------------- 
  81 IMPLEMENT_CLASS(wxPostScriptPrintNativeData
, wxPrintNativeDataBase
) 
  83 wxPostScriptPrintNativeData::wxPostScriptPrintNativeData() 
  85     m_previewCommand 
= wxEmptyString
; 
  87     m_printerCommand 
= wxT("print"); 
  88     m_printerOptions 
= wxT("/nonotify/queue=psqueue"); 
  89     m_afmPath 
= wxT("sys$ps_font_metrics:"); 
  93     m_printerCommand 
= wxT("print"); 
  94     m_printerOptions 
= wxEmptyString
; 
  95     m_afmPath 
= wxT("c:\\windows\\system\\"); 
  98 #if !defined(__VMS__) && !defined(__WXMSW__) 
  99     m_printerCommand 
= wxT("lpr"); 
 100     m_printerOptions 
= wxEmptyString
; 
 101     m_afmPath 
= wxEmptyString
; 
 104     m_printerScaleX 
= 1.0; 
 105     m_printerScaleY 
= 1.0; 
 106     m_printerTranslateX 
= 0; 
 107     m_printerTranslateY 
= 0; 
 110 wxPostScriptPrintNativeData::~wxPostScriptPrintNativeData() 
 114 bool wxPostScriptPrintNativeData::TransferTo( wxPrintData 
&WXUNUSED(data
) ) 
 119 bool wxPostScriptPrintNativeData::TransferFrom( const wxPrintData 
&WXUNUSED(data
) ) 
 124 // ---------------------------------------------------------------------------- 
 125 // Generic print dialog for non-Windows printing use. 
 126 // ---------------------------------------------------------------------------- 
 128 IMPLEMENT_CLASS(wxGenericPrintDialog
, wxPrintDialogBase
) 
 130 BEGIN_EVENT_TABLE(wxGenericPrintDialog
, wxPrintDialogBase
) 
 131     EVT_BUTTON(wxID_OK
, wxGenericPrintDialog::OnOK
) 
 132     EVT_BUTTON(wxPRINTID_SETUP
, wxGenericPrintDialog::OnSetup
) 
 133     EVT_RADIOBOX(wxPRINTID_RANGE
, wxGenericPrintDialog::OnRange
) 
 136 wxGenericPrintDialog::wxGenericPrintDialog(wxWindow 
*parent
, 
 137                                            wxPrintDialogData
* data
) 
 138                     : wxPrintDialogBase(parent
, wxID_ANY
, _("Print"), 
 139                                wxPoint(0,0), wxSize(600, 600), 
 140                                wxDEFAULT_DIALOG_STYLE 
| 
 144         m_printDialogData 
= *data
; 
 149 wxGenericPrintDialog::wxGenericPrintDialog(wxWindow 
*parent
, 
 151                     : wxPrintDialogBase(parent
, wxID_ANY
, _("Print"), 
 152                                wxPoint(0,0), wxSize(600, 600), 
 153                                wxDEFAULT_DIALOG_STYLE 
| 
 157         m_printDialogData 
= *data
; 
 162 void wxGenericPrintDialog::Init(wxWindow 
* WXUNUSED(parent
)) 
 164   //    wxDialog::Create(parent, wxID_ANY, _("Print"), wxPoint(0,0), wxSize(600, 600), 
 165   //                     wxDEFAULT_DIALOG_STYLE | wxTAB_TRAVERSAL); 
 167     wxBoxSizer 
*mainsizer 
= new wxBoxSizer( wxVERTICAL 
); 
 171     wxPrintFactory
* factory 
= wxPrintFactory::GetFactory(); 
 173     wxStaticBoxSizer 
*topsizer 
= new wxStaticBoxSizer( 
 174         new wxStaticBox( this, wxID_ANY
, _( "Printer options" ) ), wxHORIZONTAL 
); 
 175     wxFlexGridSizer 
*flex 
= new wxFlexGridSizer( 2 ); 
 176     flex
->AddGrowableCol( 1 ); 
 177     topsizer
->Add( flex
, 1, wxGROW 
); 
 179     m_printToFileCheckBox 
= new wxCheckBox( this, wxPRINTID_PRINTTOFILE
, _("Print to File") ); 
 180     flex
->Add( m_printToFileCheckBox
, 0, wxALIGN_CENTER_VERTICAL
|wxALL
, 5 ); 
 182     m_setupButton 
= new wxButton(this, wxPRINTID_SETUP
, _("Setup...") ); 
 183     flex
->Add( m_setupButton
, 0, wxALIGN_CENTER_VERTICAL
|wxALIGN_RIGHT
|wxALL
, 5 ); 
 185     if (!factory
->HasPrintSetupDialog()) 
 186         m_setupButton
->Enable( false ); 
 188     if (factory
->HasPrinterLine()) 
 190         flex
->Add( new wxStaticText( this, wxID_ANY
, _("Printer:") ), 
 191             0, wxALIGN_CENTER_VERTICAL
|wxALL
, 5 ); 
 192         flex
->Add( new wxStaticText( this, wxID_ANY
, factory
->CreatePrinterLine() ), 
 193             0, wxALIGN_CENTER_VERTICAL
|wxALL
, 5 ); 
 196     if (factory
->HasStatusLine()) 
 198         flex
->Add( new wxStaticText( this, wxID_ANY
, _("Status:") ), 
 199             0, wxALIGN_CENTER_VERTICAL
|wxALL
-wxTOP
, 5 ); 
 200         flex
->Add( new wxStaticText( this, wxID_ANY
, factory
->CreateStatusLine() ), 
 201             0, wxALIGN_CENTER_VERTICAL
|wxALL
-wxTOP
, 5 ); 
 204     mainsizer
->Add( topsizer
, 0, wxLEFT
|wxTOP
|wxRIGHT
|wxGROW
, 10 ); 
 206     // 2) middle row with radio box 
 208     wxString 
*choices 
= new wxString
[2]; 
 209     choices
[0] = _("All"); 
 210     choices
[1] = _("Pages"); 
 212     m_fromText 
= (wxTextCtrl
*)NULL
; 
 213     m_toText 
= (wxTextCtrl
*)NULL
; 
 214     m_rangeRadioBox 
= (wxRadioBox 
*)NULL
; 
 216     if (m_printDialogData
.GetFromPage() != 0) 
 218         m_rangeRadioBox 
= new wxRadioBox(this, wxPRINTID_RANGE
, _("Print Range"), 
 219                                          wxDefaultPosition
, wxDefaultSize
, 
 222         m_rangeRadioBox
->SetSelection(1); 
 224         mainsizer
->Add( m_rangeRadioBox
, 0, wxLEFT
|wxTOP
|wxRIGHT
, 10 ); 
 229     wxBoxSizer 
*bottomsizer 
= new wxBoxSizer( wxHORIZONTAL 
); 
 231     if (m_printDialogData
.GetFromPage() != 0) 
 233         bottomsizer
->Add( new wxStaticText(this, wxPRINTID_STATIC
, _("From:") ), 0, wxCENTER
|wxALL
, 5 ); 
 234         m_fromText 
= new wxTextCtrl(this, wxPRINTID_FROM
, wxEmptyString
, wxDefaultPosition
, wxSize(40, wxDefaultCoord
)); 
 235         bottomsizer
->Add( m_fromText
, 1, wxCENTER
|wxRIGHT
, 10 ); 
 237         bottomsizer
->Add( new wxStaticText(this, wxPRINTID_STATIC
, _("To:") ), 0, wxCENTER
|wxALL
, 5); 
 238         m_toText 
= new wxTextCtrl(this, wxPRINTID_TO
, wxEmptyString
, wxDefaultPosition
, wxSize(40, wxDefaultCoord
)); 
 239         bottomsizer
->Add( m_toText
, 1, wxCENTER
|wxRIGHT
, 10 ); 
 242     bottomsizer
->Add( new wxStaticText(this, wxPRINTID_STATIC
, _("Copies:") ), 0, wxCENTER
|wxALL
, 5 ); 
 243     m_noCopiesText 
= new wxTextCtrl(this, wxPRINTID_COPIES
, wxEmptyString
, wxPoint(252, 130), wxSize(40, wxDefaultCoord
)); 
 244     bottomsizer
->Add( m_noCopiesText
, 1, wxCENTER
|wxRIGHT
, 10 ); 
 246     mainsizer
->Add( bottomsizer
, 0, wxTOP
|wxLEFT
|wxRIGHT
, 12 ); 
 250     mainsizer
->Add( new wxStaticLine( this, wxID_ANY 
), 0, wxEXPAND 
| wxLEFT
|wxRIGHT
|wxTOP
, 10 ); 
 255     mainsizer
->Add( CreateButtonSizer( wxOK
|wxCANCEL
), 0, wxEXPAND
|wxALL
, 10 ); 
 257     SetAutoLayout( true ); 
 258     SetSizer( mainsizer 
); 
 260     mainsizer
->Fit( this ); 
 263     // Calls wxWindow::OnInitDialog and then wxGenericPrintDialog::TransferDataToWindow 
 268 int wxGenericPrintDialog::ShowModal() 
 270     return wxDialog::ShowModal(); 
 273 wxGenericPrintDialog::~wxGenericPrintDialog() 
 277 void wxGenericPrintDialog::OnOK(wxCommandEvent
& WXUNUSED(event
)) 
 279     TransferDataFromWindow(); 
 281     // An empty 'to' field signals printing just the 
 283     if (m_printDialogData
.GetToPage() < 1) 
 284         m_printDialogData
.SetToPage(m_printDialogData
.GetFromPage()); 
 286     // There are some interactions between the global setup data 
 287     // and the standard print dialog. The global printing 'mode' 
 288     // is determined by whether the user checks Print to file 
 290     if (m_printDialogData
.GetPrintToFile()) 
 292         m_printDialogData
.GetPrintData().SetPrintMode(wxPRINT_MODE_FILE
); 
 294         wxFileName 
fname( m_printDialogData
.GetPrintData().GetFilename() ); 
 296         wxFileDialog 
dialog( this, _("PostScript file"), 
 297             fname
.GetPath(), fname
.GetFullName(), wxT("*.ps"), wxSAVE 
| wxOVERWRITE_PROMPT 
); 
 298         if (dialog
.ShowModal() != wxID_OK
) return; 
 300         m_printDialogData
.GetPrintData().SetFilename( dialog
.GetPath() ); 
 304         m_printDialogData
.GetPrintData().SetPrintMode(wxPRINT_MODE_PRINTER
); 
 310 void wxGenericPrintDialog::OnRange(wxCommandEvent
& event
) 
 312     if (!m_fromText
) return; 
 314     if (event
.GetInt() == 0) 
 316         m_fromText
->Enable(false); 
 317         m_toText
->Enable(false); 
 319     else if (event
.GetInt() == 1) 
 321         m_fromText
->Enable(true); 
 322         m_toText
->Enable(true); 
 326 void wxGenericPrintDialog::OnSetup(wxCommandEvent
& WXUNUSED(event
)) 
 328     wxPrintFactory
* factory 
= wxPrintFactory::GetFactory(); 
 330     if (factory
->HasPrintSetupDialog()) 
 332         // The print setup dialog should change the 
 333         // print data in-place if not cancelled. 
 334         wxDialog 
*dialog 
= factory
->CreatePrintSetupDialog( this, &m_printDialogData
.GetPrintData() ); 
 340 bool wxGenericPrintDialog::TransferDataToWindow() 
 342     if(m_printDialogData
.GetFromPage() != 0) 
 346           if (m_printDialogData
.GetEnablePageNumbers()) 
 348              m_fromText
->Enable(true); 
 349              m_toText
->Enable(true); 
 350              if (m_printDialogData
.GetFromPage() > 0) 
 351                 m_fromText
->SetValue(wxString::Format(_T("%d"), m_printDialogData
.GetFromPage())); 
 352              if (m_printDialogData
.GetToPage() > 0) 
 353                 m_toText
->SetValue(wxString::Format(_T("%d"), m_printDialogData
.GetToPage())); 
 355                 if (m_printDialogData
.GetAllPages() || m_printDialogData
.GetFromPage() == 0) 
 356                    m_rangeRadioBox
->SetSelection(0); 
 358                    m_rangeRadioBox
->SetSelection(1); 
 362              m_fromText
->Enable(false); 
 363              m_toText
->Enable(false); 
 366                 m_rangeRadioBox
->SetSelection(0); 
 367                 m_rangeRadioBox
->wxRadioBox::Enable(1, false); 
 372     m_noCopiesText
->SetValue( 
 373         wxString::Format(_T("%d"), m_printDialogData
.GetNoCopies())); 
 375     m_printToFileCheckBox
->SetValue(m_printDialogData
.GetPrintToFile()); 
 376     m_printToFileCheckBox
->Enable(m_printDialogData
.GetEnablePrintToFile()); 
 380 bool wxGenericPrintDialog::TransferDataFromWindow() 
 383     if(m_printDialogData
.GetFromPage() != -1) 
 385         if (m_printDialogData
.GetEnablePageNumbers()) 
 389                 wxString value 
= m_fromText
->GetValue(); 
 390                 if (value
.ToLong( &res 
)) 
 391                     m_printDialogData
.SetFromPage( res 
); 
 395                 wxString value 
= m_toText
->GetValue(); 
 396                 if (value
.ToLong( &res 
)) 
 397                     m_printDialogData
.SetToPage( res 
); 
 402             if (m_rangeRadioBox
->GetSelection() == 0) 
 404                 m_printDialogData
.SetAllPages(true); 
 406                 // This means all pages, more or less 
 407                 m_printDialogData
.SetFromPage(1); 
 408                 m_printDialogData
.SetToPage(32000); 
 411                 m_printDialogData
.SetAllPages(false); 
 415     { // continuous printing 
 416         m_printDialogData
.SetFromPage(1); 
 417         m_printDialogData
.SetToPage(32000); 
 420     wxString value 
= m_noCopiesText
->GetValue(); 
 421     if (value
.ToLong( &res 
)) 
 422         m_printDialogData
.SetNoCopies( res 
); 
 424     m_printDialogData
.SetPrintToFile(m_printToFileCheckBox
->GetValue()); 
 429 wxDC 
*wxGenericPrintDialog::GetPrintDC() 
 431     return new wxPostScriptDC(GetPrintDialogData().GetPrintData()); 
 434 // ---------------------------------------------------------------------------- 
 435 // Generic print setup dialog 
 436 // ---------------------------------------------------------------------------- 
 438 IMPLEMENT_CLASS(wxGenericPrintSetupDialog
, wxDialog
) 
 440 BEGIN_EVENT_TABLE(wxGenericPrintSetupDialog
, wxDialog
) 
 441     EVT_LIST_ITEM_ACTIVATED(wxPRINTID_PRINTER
, wxGenericPrintSetupDialog::OnPrinter
) 
 444 wxGenericPrintSetupDialog::wxGenericPrintSetupDialog(wxWindow 
*parent
, wxPrintData
* data
): 
 445 wxDialog(parent
, wxID_ANY
, _("Print Setup"), wxPoint(0,0), wxSize(600, 600), wxDEFAULT_DIALOG_STYLE
|wxTAB_TRAVERSAL
) 
 451 static char * check_xpm
[] = { 
 452 /* width height ncolors chars_per_pixel */ 
 478 void wxGenericPrintSetupDialog::Init(wxPrintData
* data
) 
 485     wxBoxSizer 
*main_sizer 
= new wxBoxSizer( wxVERTICAL 
); 
 489     wxStaticBoxSizer 
*printer_sizer 
= new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY
, _("Printer") ), wxVERTICAL 
); 
 490     main_sizer
->Add( printer_sizer
, 0, wxALL
|wxGROW
, 10 ); 
 492     m_printerListCtrl 
= new wxListCtrl( this, wxPRINTID_PRINTER
, 
 493         wxDefaultPosition
, wxSize(wxDefaultCoord
,100), wxLC_REPORT
|wxLC_SINGLE_SEL
|wxSUNKEN_BORDER 
); 
 494     wxImageList 
*image_list 
= new wxImageList
; 
 495     image_list
->Add( wxBitmap(check_xpm
) ); 
 496     m_printerListCtrl
->AssignImageList( image_list
, wxIMAGE_LIST_SMALL 
); 
 498     m_printerListCtrl
->InsertColumn( 0, wxT(" "), wxLIST_FORMAT_LEFT
, 20 ); 
 499     m_printerListCtrl
->InsertColumn( 1, wxT("Printer"), wxLIST_FORMAT_LEFT
, 150 ); 
 500     m_printerListCtrl
->InsertColumn( 2, wxT("Device"), wxLIST_FORMAT_LEFT
, 150 ); 
 501     m_printerListCtrl
->InsertColumn( 3, wxT("Status"), wxLIST_FORMAT_LEFT
, 80 ); 
 504     item
.SetMask( wxLIST_MASK_TEXT 
); 
 506     item
.SetText( _("Default printer") ); 
 507     item
.SetId( m_printerListCtrl
->InsertItem( item 
) ); 
 509     if (data
->GetPrinterName().empty()) 
 512         item2
.SetId( item
.GetId() ); 
 513         item2
.SetMask( wxLIST_MASK_IMAGE 
); 
 515         m_printerListCtrl
->SetItem( item2 
); 
 518     item
.SetId( 1+ item
.GetId() ); 
 520     wxArrayString errors
; 
 521     wxArrayString output
; 
 522     long res 
= wxExecute( wxT("lpstat -v"), output
, errors
, wxEXEC_NODISABLE 
); 
 523     if (res 
>= 0 && errors
.GetCount() == 0) 
 526         for (i 
= 0; i 
< output
.GetCount(); i
++) 
 528             wxStringTokenizer 
tok( output
[i
], wxT(" ") ); 
 529             wxString tmp 
= tok
.GetNextToken(); // "device" 
 530             if (tmp 
!= wxT("device")) 
 531                 break;  // the lpstat syntax must have changed. 
 532             tmp 
= tok
.GetNextToken();          // "for" 
 533             if (tmp 
!= wxT("for")) 
 534                 break;  // the lpstat syntax must have changed. 
 535             tmp 
= tok
.GetNextToken();          // "hp_deskjet930c:" 
 536             if (tmp
[tmp
.Len()-1] == wxT(':')) 
 537                 tmp
.Remove(tmp
.Len()-1,1); 
 539             item
.SetText( name 
); 
 540             item
.SetId( m_printerListCtrl
->InsertItem( item 
) ); 
 541             tmp 
= tok
.GetNextToken();          // "parallel:/dev/lp0" 
 544             m_printerListCtrl
->SetItem( item 
); 
 545             if (data
->GetPrinterName() == name
) 
 548                 item2
.SetId( item
.GetId() ); 
 549                 item2
.SetMask( wxLIST_MASK_IMAGE 
); 
 551                 m_printerListCtrl
->SetItem( item2 
); 
 554             wxString command 
= wxT("lpstat -p "); 
 556             wxArrayString errors2
; 
 557             wxArrayString output2
; 
 558             res 
= wxExecute( command
, output2
, errors2
, wxEXEC_NODISABLE 
); 
 559             if (res 
>= 0 && errors2
.GetCount() == 0 && output2
.GetCount() > 0) 
 561                 tmp 
= output2
[0]; // "printer hp_deskjet930c is idle. enable since ..." 
 562                 int pos 
= tmp
.Find( wxT('.') ); 
 563                 if (pos 
!= wxNOT_FOUND
) 
 564                     tmp
.Remove( (size_t)pos
, tmp
.Len()-(size_t)pos 
); 
 565                 wxStringTokenizer 
tok2( tmp
, wxT(" ") ); 
 566                 tmp 
= tok2
.GetNextToken();  // "printer" 
 567                 tmp 
= tok2
.GetNextToken();  // "hp_deskjet930c" 
 569                 while (tok2
.HasMoreTokens()) 
 571                     tmp 
+= tok2
.GetNextToken(); 
 576                 m_printerListCtrl
->SetItem( item 
); 
 580             item
.SetId( 1+ item
.GetId() ); 
 585     printer_sizer
->Add( m_printerListCtrl
, 0, wxALL
|wxGROW
, 5 ); 
 587     wxBoxSizer 
*item1 
= new wxBoxSizer( wxHORIZONTAL 
); 
 588     main_sizer
->Add( item1
, 0, wxALL
, 5 ); 
 590     // printer options (on the left) 
 592     wxBoxSizer 
*item2 
= new wxBoxSizer( wxVERTICAL 
); 
 594     wxStaticBox 
*item4 
= new wxStaticBox( this, wxPRINTID_STATIC
, _("Paper size") ); 
 595     wxStaticBoxSizer 
*item3 
= new wxStaticBoxSizer( item4
, wxVERTICAL 
); 
 597     m_paperTypeChoice 
= CreatePaperTypeChoice(); 
 598     item3
->Add( m_paperTypeChoice
, 0, wxALIGN_CENTER
|wxALL
, 5 ); 
 600     item2
->Add( item3
, 0, wxALIGN_CENTER
|wxALL
, 5 ); 
 607     m_orientationRadioBox
= new wxRadioBox( this, wxPRINTID_ORIENTATION
, _("Orientation"), wxDefaultPosition
, wxDefaultSize
, 2, strs6
, 1, wxRA_SPECIFY_ROWS 
); 
 608     item2
->Add( m_orientationRadioBox
, 0, wxGROW
|wxALIGN_CENTER_VERTICAL
|wxALL
, 5 ); 
 610     wxStaticBox 
*item8 
= new wxStaticBox( this, wxID_ANY
, _("Options") ); 
 611     wxStaticBoxSizer 
*item7 
= new wxStaticBoxSizer( item8
, wxHORIZONTAL 
); 
 613     m_colourCheckBox 
= new wxCheckBox( this, wxPRINTID_PRINTCOLOUR
, _("Print in colour") ); 
 614     item7
->Add( m_colourCheckBox
, 0, wxALIGN_CENTER
|wxALL
, 5 ); 
 616     item2
->Add( item7
, 0, wxGROW
|wxALIGN_CENTER_VERTICAL
|wxALL
, 5 ); 
 618     item1
->Add( item2
, 0, wxALIGN_CENTER_HORIZONTAL
, 5 ); 
 620     // spooling options (on the right) 
 622     wxStaticBox 
*item11 
= new wxStaticBox( this, wxID_ANY
, _("Print spooling") ); 
 623     wxStaticBoxSizer 
*item10 
= new wxStaticBoxSizer( item11
, wxVERTICAL 
); 
 625     wxStaticText 
*item12 
= new wxStaticText( this, wxID_ANY
, _("Printer command:") ); 
 626     item10
->Add( item12
, 0, wxALIGN_CENTER_VERTICAL
|wxALL
, 5 ); 
 628     wxBoxSizer 
*item13 
= new wxBoxSizer( wxHORIZONTAL 
); 
 630     item13
->Add( 20, 20, 0, wxALIGN_CENTER
|wxALL
, 5 ); 
 632     m_printerCommandText 
= new wxTextCtrl( this, wxPRINTID_COMMAND
, wxEmptyString
, wxDefaultPosition
, wxSize(160,wxDefaultCoord
) ); 
 633     item13
->Add( m_printerCommandText
, 0, wxALIGN_CENTER
|wxALL
, 5 ); 
 635     item10
->Add( item13
, 0, wxALIGN_CENTER
|wxALL
, 0 ); 
 637     wxStaticText 
*item15 
= new wxStaticText( this, wxID_ANY
, _("Printer options:") ); 
 638     item10
->Add( item15
, 0, wxALIGN_CENTER_VERTICAL
|wxALL
, 5 ); 
 640     wxBoxSizer 
*item16 
= new wxBoxSizer( wxHORIZONTAL 
); 
 642     item16
->Add( 20, 20, 0, wxALIGN_CENTER
|wxALL
, 5 ); 
 644     m_printerOptionsText 
= new wxTextCtrl( this, wxPRINTID_OPTIONS
, wxEmptyString
, wxDefaultPosition
, wxSize(160,wxDefaultCoord
) ); 
 645     item16
->Add( m_printerOptionsText
, 0, wxALIGN_CENTER
|wxALL
, 5 ); 
 647     item10
->Add( item16
, 0, wxALIGN_CENTER
|wxALL
, 0 ); 
 649     item1
->Add( item10
, 0, wxALIGN_CENTER_HORIZONTAL
|wxALL
, 5 ); 
 654     main_sizer
->Add( new wxStaticLine( this, wxID_ANY 
), 0, wxEXPAND 
| wxLEFT
|wxRIGHT
|wxTOP
, 10 ); 
 659     main_sizer
->Add( CreateButtonSizer( wxOK
|wxCANCEL
), 0, wxEXPAND
|wxALL
, 10 ); 
 661     SetAutoLayout( true ); 
 662     SetSizer( main_sizer 
); 
 664     main_sizer
->Fit( this ); 
 674 wxGenericPrintSetupDialog::~wxGenericPrintSetupDialog() 
 678 void wxGenericPrintSetupDialog::OnPrinter(wxListEvent
& event
) 
 682     for (item 
= 0; item 
< m_printerListCtrl
->GetItemCount(); item
++) 
 683         m_printerListCtrl
->SetItemImage( item
, -1 ); 
 685     m_printerListCtrl
->SetItemImage( event
.GetIndex(), 0 ); 
 687     if (event
.GetIndex() == 0) 
 689         m_printerCommandText
->SetValue( wxT("lpr") ); 
 693         wxString tmp 
= wxT("lpr -P"); 
 696         item
.SetMask( wxLIST_MASK_TEXT 
); 
 697         item
.SetId( event
.GetIndex() ); 
 698         m_printerListCtrl
->GetItem( item 
); 
 699         tmp 
+= item
.GetText(); 
 700         m_printerCommandText
->SetValue( tmp 
); 
 704 bool wxGenericPrintSetupDialog::TransferDataToWindow() 
 706     wxPostScriptPrintNativeData 
*data 
= 
 707         (wxPostScriptPrintNativeData 
*) m_printData
.GetNativeData(); 
 709     if (m_printerCommandText 
&& data
->GetPrinterCommand()) 
 710         m_printerCommandText
->SetValue(data
->GetPrinterCommand()); 
 711     if (m_printerOptionsText 
&& data
->GetPrinterOptions()) 
 712         m_printerOptionsText
->SetValue(data
->GetPrinterOptions()); 
 713     if (m_colourCheckBox
) 
 714         m_colourCheckBox
->SetValue(m_printData
.GetColour()); 
 716     if (m_orientationRadioBox
) 
 718         if (m_printData
.GetOrientation() == wxPORTRAIT
) 
 719             m_orientationRadioBox
->SetSelection(0); 
 721             m_orientationRadioBox
->SetSelection(1); 
 726 bool wxGenericPrintSetupDialog::TransferDataFromWindow() 
 728     wxPostScriptPrintNativeData 
*data 
= 
 729         (wxPostScriptPrintNativeData 
*) m_printData
.GetNativeData(); 
 731     // find selected printer 
 732     long id 
= m_printerListCtrl
->GetNextItem( -1, wxLIST_NEXT_ALL
, wxLIST_STATE_SELECTED 
); 
 735         m_printData
.SetPrinterName( wxEmptyString 
); 
 741         item
.SetMask( wxLIST_MASK_TEXT 
); 
 743         m_printerListCtrl
->GetItem( item 
); 
 744         m_printData
.SetPrinterName( item
.GetText() ); 
 747     if (m_printerCommandText
) 
 748         data
->SetPrinterCommand(m_printerCommandText
->GetValue()); 
 749     if (m_printerOptionsText
) 
 750         data
->SetPrinterOptions(m_printerOptionsText
->GetValue()); 
 751     if (m_colourCheckBox
) 
 752         m_printData
.SetColour(m_colourCheckBox
->GetValue()); 
 753     if (m_orientationRadioBox
) 
 755         int sel 
= m_orientationRadioBox
->GetSelection(); 
 757             m_printData
.SetOrientation(wxPORTRAIT
); 
 759             m_printData
.SetOrientation(wxLANDSCAPE
); 
 761     if (m_paperTypeChoice
) 
 763         int selectedItem 
= m_paperTypeChoice
->GetSelection(); 
 764         if (selectedItem 
!= -1) 
 766             wxPrintPaperType 
*paper 
= wxThePrintPaperDatabase
->Item(selectedItem
); 
 768               m_printData
.SetPaperId( paper
->GetId()); 
 773         *m_targetData 
= m_printData
; 
 778 wxComboBox 
*wxGenericPrintSetupDialog::CreatePaperTypeChoice() 
 780     size_t n 
= wxThePrintPaperDatabase
->GetCount(); 
 781     wxString 
*choices 
= new wxString 
[n
]; 
 784     for (size_t i 
= 0; i 
< n
; i
++) 
 786         wxPrintPaperType 
*paper 
= wxThePrintPaperDatabase
->Item(i
); 
 787         choices
[i
] = paper
->GetName(); 
 788         if (m_printData
.GetPaperId() == paper
->GetId()) 
 794     wxComboBox 
*choice 
= new wxComboBox( this, 
 798                                          wxSize(width
, wxDefaultCoord
), 
 803     choice
->SetSelection(sel
); 
 807 #endif // wxUSE_POSTSCRIPT 
 809 // ---------------------------------------------------------------------------- 
 810 // Generic page setup dialog 
 811 // ---------------------------------------------------------------------------- 
 813 IMPLEMENT_CLASS(wxGenericPageSetupDialog
, wxPageSetupDialogBase
) 
 815 BEGIN_EVENT_TABLE(wxGenericPageSetupDialog
, wxPageSetupDialogBase
) 
 816     EVT_BUTTON(wxPRINTID_SETUP
, wxGenericPageSetupDialog::OnPrinter
) 
 819 wxGenericPageSetupDialog::wxGenericPageSetupDialog( wxWindow 
*parent
, 
 820                                                     wxPageSetupDialogData
* data
) 
 821     : wxPageSetupDialogBase( parent
, 
 826                 wxDEFAULT_DIALOG_STYLE
|wxTAB_TRAVERSAL 
) 
 833     wxBoxSizer 
*mainsizer 
= new wxBoxSizer( wxVERTICAL 
); 
 836     wxStaticBoxSizer 
*topsizer 
= new wxStaticBoxSizer( 
 837       new wxStaticBox(this,wxPRINTID_STATIC
, _("Paper size")), wxHORIZONTAL 
); 
 839     size_t      n 
= wxThePrintPaperDatabase
->GetCount(); 
 840     wxString   
*choices 
= new wxString 
[n
]; 
 842     for (size_t i 
= 0; i 
< n
; i
++) 
 844         wxPrintPaperType 
*paper 
= wxThePrintPaperDatabase
->Item(i
); 
 845         choices
[i
] = paper
->GetName(); 
 848     m_paperTypeChoice 
= new wxComboBox( this, 
 852                                         wxSize(300, wxDefaultCoord
), 
 854     topsizer
->Add( m_paperTypeChoice
, 1, wxEXPAND
|wxALL
, 5 ); 
 855 //  m_paperTypeChoice->SetSelection(sel); 
 857     mainsizer
->Add( topsizer
, 0, wxTOP
|wxLEFT
|wxRIGHT 
| wxEXPAND
, 10 ); 
 859     // 2) middle sizer with radio box 
 861     wxString 
*choices2 
= new wxString
[2]; 
 862     choices2
[0] = _("Portrait"); 
 863     choices2
[1] = _("Landscape"); 
 864     m_orientationRadioBox 
= new wxRadioBox(this, wxPRINTID_ORIENTATION
, _("Orientation"), 
 865         wxDefaultPosition
, wxDefaultSize
, 2, choices2
, 2); 
 866     m_orientationRadioBox
->SetSelection(0); 
 868     mainsizer
->Add( m_orientationRadioBox
, 0, wxTOP
|wxLEFT
|wxRIGHT
, 10 ); 
 872     wxBoxSizer 
*table 
= new wxBoxSizer( wxHORIZONTAL 
); 
 874     wxBoxSizer 
*column1 
= new wxBoxSizer( wxVERTICAL 
); 
 875     column1
->Add( new wxStaticText(this, wxPRINTID_STATIC
, _("Left margin (mm):")),1,wxALL
|wxALIGN_RIGHT
,5 ); 
 876     column1
->Add( new wxStaticText(this, wxPRINTID_STATIC
, _("Top margin (mm):")),1,wxALL
|wxALIGN_RIGHT
,5 ); 
 877     table
->Add( column1
, 0, wxALL 
| wxEXPAND
, 5 ); 
 879     wxBoxSizer 
*column2 
= new wxBoxSizer( wxVERTICAL 
); 
 880     m_marginLeftText 
= new wxTextCtrl(this, wxPRINTID_LEFTMARGIN
, wxEmptyString
, wxDefaultPosition
, wxSize(textWidth
, wxDefaultCoord
)); 
 881     m_marginTopText 
= new wxTextCtrl(this, wxPRINTID_TOPMARGIN
, wxEmptyString
, wxDefaultPosition
, wxSize(textWidth
, wxDefaultCoord
)); 
 882     column2
->Add( m_marginLeftText
, 1, wxALL
, 5 ); 
 883     column2
->Add( m_marginTopText
, 1, wxALL
, 5 ); 
 884     table
->Add( column2
, 0, wxRIGHT
|wxTOP
|wxBOTTOM 
| wxEXPAND
, 5 ); 
 886     wxBoxSizer 
*column3 
= new wxBoxSizer( wxVERTICAL 
); 
 887     column3
->Add( new wxStaticText(this, wxPRINTID_STATIC
, _("Right margin (mm):")),1,wxALL
|wxALIGN_RIGHT
,5 ); 
 888     column3
->Add( new wxStaticText(this, wxPRINTID_STATIC
, _("Bottom margin (mm):")),1,wxALL
|wxALIGN_RIGHT
,5 ); 
 889     table
->Add( column3
, 0, wxALL 
| wxEXPAND
, 5 ); 
 891     wxBoxSizer 
*column4 
= new wxBoxSizer( wxVERTICAL 
); 
 892     m_marginRightText 
= new wxTextCtrl(this, wxPRINTID_RIGHTMARGIN
, wxEmptyString
, wxDefaultPosition
, wxSize(textWidth
, wxDefaultCoord
)); 
 893     m_marginBottomText 
= new wxTextCtrl(this, wxPRINTID_BOTTOMMARGIN
, wxEmptyString
, wxDefaultPosition
, wxSize(textWidth
, wxDefaultCoord
)); 
 894     column4
->Add( m_marginRightText
, 1, wxALL
, 5 ); 
 895     column4
->Add( m_marginBottomText
, 1, wxALL
, 5 ); 
 896     table
->Add( column4
, 0, wxRIGHT
|wxTOP
|wxBOTTOM 
| wxEXPAND
, 5 ); 
 898     mainsizer
->Add( table
, 0 ); 
 902     mainsizer
->Add( new wxStaticLine( this, wxID_ANY 
), 0, wxEXPAND 
| wxLEFT
|wxRIGHT
|wxTOP
, 10 ); 
 907     wxSizer
* buttonsizer 
= CreateButtonSizer( wxOK
|wxCANCEL
); 
 909     if (wxPrintFactory::GetFactory()->HasPrintSetupDialog()) 
 911         m_printerButton 
= new wxButton(this, wxPRINTID_SETUP
, _("Printer...") ); 
 912         buttonsizer
->Add( m_printerButton
, 0, wxLEFT
|wxRIGHT
, 10 ); 
 913         if ( !m_pageData
.GetEnablePrinter() ) 
 914             m_printerButton
->Enable(false); 
 918         m_printerButton 
= NULL
; 
 921     //  if (m_printData.GetEnableHelp()) 
 922     //  wxButton *helpButton = new wxButton(this, (wxFunction)wxGenericPageSetupHelpProc, _("Help"), wxDefaultCoord, wxDefaultCoord, buttonWidth, buttonHeight); 
 923     mainsizer
->Add( buttonsizer
, 0, wxEXPAND
|wxALL
, 10 ); 
 926     SetAutoLayout( true ); 
 927     SetSizer( mainsizer 
); 
 929     mainsizer
->Fit( this ); 
 938 wxGenericPageSetupDialog::~wxGenericPageSetupDialog() 
 942 wxPageSetupDialogData
& wxGenericPageSetupDialog::GetPageSetupDialogData() 
 947 bool wxGenericPageSetupDialog::TransferDataToWindow() 
 949     if (m_marginLeftText
) 
 950         m_marginLeftText
->SetValue(wxString::Format(wxT("%d"), m_pageData
.GetMarginTopLeft().x
)); 
 952         m_marginTopText
->SetValue(wxString::Format(wxT("%d"), m_pageData
.GetMarginTopLeft().y
)); 
 953     if (m_marginRightText
) 
 954         m_marginRightText
->SetValue(wxString::Format(wxT("%d"), m_pageData
.GetMarginBottomRight().x
)); 
 955     if (m_marginBottomText
) 
 956         m_marginBottomText
->SetValue(wxString::Format(wxT("%d"), m_pageData
.GetMarginBottomRight().y
)); 
 958     if (m_orientationRadioBox
) 
 960         if (m_pageData
.GetPrintData().GetOrientation() == wxPORTRAIT
) 
 961             m_orientationRadioBox
->SetSelection(0); 
 963             m_orientationRadioBox
->SetSelection(1); 
 966     // Find the paper type from either the current paper size in the wxPageSetupDialogData, or 
 967     // failing that, the id in the wxPrintData object. 
 969     wxPrintPaperType
* type 
= wxThePrintPaperDatabase
->FindPaperType( 
 970              wxSize(m_pageData
.GetPaperSize().x 
* 10, m_pageData
.GetPaperSize().y 
* 10)); 
 972     if (!type 
&& m_pageData
.GetPrintData().GetPaperId() != wxPAPER_NONE
) 
 973         type 
= wxThePrintPaperDatabase
->FindPaperType(m_pageData
.GetPrintData().GetPaperId()); 
 977         m_paperTypeChoice
->SetStringSelection(type
->GetName()); 
 983 bool wxGenericPageSetupDialog::TransferDataFromWindow() 
 985     if (m_marginLeftText 
&& m_marginTopText
) 
 987         int left 
= wxAtoi( m_marginLeftText
->GetValue().c_str() ); 
 988         int top 
= wxAtoi( m_marginTopText
->GetValue().c_str() ); 
 989         m_pageData
.SetMarginTopLeft( wxPoint(left
,top
) ); 
 991     if (m_marginRightText 
&& m_marginBottomText
) 
 993         int right 
= wxAtoi( m_marginRightText
->GetValue().c_str() ); 
 994         int bottom 
= wxAtoi( m_marginBottomText
->GetValue().c_str() ); 
 995         m_pageData
.SetMarginBottomRight( wxPoint(right
,bottom
) ); 
 998     if (m_orientationRadioBox
) 
1000         int sel 
= m_orientationRadioBox
->GetSelection(); 
1003             m_pageData
.GetPrintData().SetOrientation(wxPORTRAIT
); 
1007             m_pageData
.GetPrintData().SetOrientation(wxLANDSCAPE
); 
1011     if (m_paperTypeChoice
) 
1013         int selectedItem 
= m_paperTypeChoice
->GetSelection(); 
1014         if (selectedItem 
!= -1) 
1016             wxPrintPaperType 
*paper 
= wxThePrintPaperDatabase
->Item(selectedItem
); 
1019                 m_pageData
.SetPaperSize(wxSize(paper
->GetWidth()/10, paper
->GetHeight()/10)); 
1020                 m_pageData
.GetPrintData().SetPaperId(paper
->GetId()); 
1028 wxComboBox 
*wxGenericPageSetupDialog::CreatePaperTypeChoice(int *x
, int *y
) 
1031     if (!wxThePrintPaperDatabase) 
1033         wxThePrintPaperDatabase = new wxPrintPaperDatabase; 
1034         wxThePrintPaperDatabase->CreateDatabase(); 
1038     size_t      n 
= wxThePrintPaperDatabase
->GetCount(); 
1039     wxString   
*choices 
= new wxString 
[n
]; 
1041     for (size_t i 
= 0; i 
< n
; i
++) 
1043         wxPrintPaperType 
*paper 
= wxThePrintPaperDatabase
->Item(i
); 
1044         choices
[i
] = paper
->GetName(); 
1047     (void) new wxStaticText(this, wxPRINTID_STATIC
, _("Paper size"), wxPoint(*x
, *y
)); 
1050     wxComboBox 
*choice 
= new wxComboBox( this, 
1051                                          wxPRINTID_PAPERSIZE
, 
1054                                          wxSize(300, wxDefaultCoord
), 
1059 //    choice->SetSelection(sel); 
1063 void wxGenericPageSetupDialog::OnPrinter(wxCommandEvent
& WXUNUSED(event
)) 
1065     // We no longer query GetPrintMode, so we can eliminate the need 
1066     // to call SetPrintMode. 
1067     // This has the limitation that we can't explicitly call the PostScript 
1068     // print setup dialog from the generic Page Setup dialog under Windows, 
1069     // but since this choice would only happen when trying to do PostScript 
1070     // printing under Windows (and only in 16-bit Windows which 
1071     // doesn't have a Windows-specific page setup dialog) it's worth it. 
1073     // First save the current settings, so the wxPrintData object is up to date. 
1074     TransferDataFromWindow(); 
1076     // Transfer the current print settings from this dialog to the page setup dialog. 
1079     // Use print factory later 
1081     wxPrintDialogData data
; 
1082     data 
= GetPageSetupData().GetPrintData(); 
1083     data
.SetSetupDialog(true); 
1084     wxPrintDialog 
printDialog(this, & data
); 
1085     printDialog
.ShowModal(); 
1087     // Transfer the page setup print settings from the page dialog to this dialog again, in case 
1088     // the page setup dialog changed something. 
1089     GetPageSetupData().GetPrintData() = printDialog
.GetPrintDialogData().GetPrintData(); 
1090     GetPageSetupData().CalculatePaperSizeFromId(); // Make sure page size reflects the id in wxPrintData 
1092     // Now update the dialog in case the page setup dialog changed some of our settings. 
1093     TransferDataToWindow();