| 1 | ///////////////////////////////////////////////////////////////////////////// |
| 2 | // Name: prntdlgg.cpp |
| 3 | // Purpose: Generic print dialogs |
| 4 | // Author: Julian Smart |
| 5 | // Modified by: |
| 6 | // Created: 04/01/98 |
| 7 | // RCS-ID: $Id$ |
| 8 | // Copyright: (c) Julian Smart and Markus Holzem |
| 9 | // Licence: wxWindows license |
| 10 | ///////////////////////////////////////////////////////////////////////////// |
| 11 | |
| 12 | // ============================================================================ |
| 13 | // declarations |
| 14 | // ============================================================================ |
| 15 | |
| 16 | // ---------------------------------------------------------------------------- |
| 17 | // headers |
| 18 | // ---------------------------------------------------------------------------- |
| 19 | |
| 20 | #ifdef __GNUG__ |
| 21 | #pragma implementation "prntdlgg.h" |
| 22 | #endif |
| 23 | |
| 24 | // For compilers that support precompilation, includes "wx.h". |
| 25 | #include "wx/wxprec.h" |
| 26 | |
| 27 | #ifdef __BORLANDC__ |
| 28 | #pragma hdrstop |
| 29 | #endif |
| 30 | |
| 31 | #include "wx/defs.h" |
| 32 | |
| 33 | #if wxUSE_PRINTING_ARCHITECTURE |
| 34 | |
| 35 | #ifndef WX_PRECOMP |
| 36 | #include "wx/utils.h" |
| 37 | #include "wx/dc.h" |
| 38 | #include "wx/app.h" |
| 39 | #include "wx/frame.h" |
| 40 | #include "wx/stattext.h" |
| 41 | #include "wx/statbox.h" |
| 42 | #include "wx/button.h" |
| 43 | #include "wx/checkbox.h" |
| 44 | #include "wx/textctrl.h" |
| 45 | #include "wx/radiobox.h" |
| 46 | #include "wx/filedlg.h" |
| 47 | #include "wx/choice.h" |
| 48 | #include "wx/combobox.h" |
| 49 | #include "wx/intl.h" |
| 50 | #include "wx/sizer.h" |
| 51 | #endif |
| 52 | |
| 53 | #if wxUSE_STATLINE |
| 54 | #include "wx/statline.h" |
| 55 | #endif |
| 56 | |
| 57 | #include "wx/generic/prntdlgg.h" |
| 58 | |
| 59 | #if wxUSE_POSTSCRIPT |
| 60 | #include "wx/generic/dcpsg.h" |
| 61 | #endif |
| 62 | |
| 63 | #include "wx/printdlg.h" |
| 64 | #include "wx/paper.h" |
| 65 | |
| 66 | // For print paper things |
| 67 | #include "wx/prntbase.h" |
| 68 | |
| 69 | #include <stdlib.h> |
| 70 | #include <string.h> |
| 71 | |
| 72 | // ---------------------------------------------------------------------------- |
| 73 | // wxWin macros |
| 74 | // ---------------------------------------------------------------------------- |
| 75 | |
| 76 | |
| 77 | #if wxUSE_POSTSCRIPT |
| 78 | |
| 79 | IMPLEMENT_CLASS(wxGenericPrintDialog, wxDialog) |
| 80 | IMPLEMENT_CLASS(wxGenericPrintSetupDialog, wxDialog) |
| 81 | |
| 82 | BEGIN_EVENT_TABLE(wxGenericPrintDialog, wxDialog) |
| 83 | EVT_BUTTON(wxID_OK, wxGenericPrintDialog::OnOK) |
| 84 | EVT_BUTTON(wxPRINTID_SETUP, wxGenericPrintDialog::OnSetup) |
| 85 | EVT_RADIOBOX(wxPRINTID_RANGE, wxGenericPrintDialog::OnRange) |
| 86 | END_EVENT_TABLE() |
| 87 | #endif |
| 88 | |
| 89 | IMPLEMENT_CLASS(wxGenericPageSetupDialog, wxDialog) |
| 90 | |
| 91 | BEGIN_EVENT_TABLE(wxGenericPageSetupDialog, wxDialog) |
| 92 | EVT_BUTTON(wxPRINTID_SETUP, wxGenericPageSetupDialog::OnPrinter) |
| 93 | END_EVENT_TABLE() |
| 94 | |
| 95 | // ---------------------------------------------------------------------------- |
| 96 | // global vars |
| 97 | // ---------------------------------------------------------------------------- |
| 98 | |
| 99 | extern wxPrintPaperDatabase *wxThePrintPaperDatabase; |
| 100 | |
| 101 | #if wxUSE_POSTSCRIPT |
| 102 | |
| 103 | // ============================================================================ |
| 104 | // implementation |
| 105 | // ============================================================================ |
| 106 | |
| 107 | // ---------------------------------------------------------------------------- |
| 108 | // Generic print dialog for non-Windows printing use. |
| 109 | // ---------------------------------------------------------------------------- |
| 110 | |
| 111 | wxGenericPrintDialog::wxGenericPrintDialog(wxWindow *parent, |
| 112 | wxPrintDialogData* data) |
| 113 | : wxDialog(parent, -1, _("Print"), |
| 114 | wxPoint(0, 0), wxSize(600, 600), |
| 115 | wxDEFAULT_DIALOG_STYLE | |
| 116 | wxDIALOG_MODAL | |
| 117 | wxTAB_TRAVERSAL) |
| 118 | { |
| 119 | if ( data ) |
| 120 | m_printDialogData = *data; |
| 121 | |
| 122 | Init(parent); |
| 123 | } |
| 124 | |
| 125 | wxGenericPrintDialog::wxGenericPrintDialog(wxWindow *parent, |
| 126 | wxPrintData* data) |
| 127 | : wxDialog(parent, -1, _("Print"), |
| 128 | wxPoint(0, 0), wxSize(600, 600), |
| 129 | wxDEFAULT_DIALOG_STYLE | |
| 130 | wxDIALOG_MODAL | |
| 131 | wxTAB_TRAVERSAL) |
| 132 | { |
| 133 | if ( data ) |
| 134 | m_printDialogData = *data; |
| 135 | |
| 136 | Init(parent); |
| 137 | } |
| 138 | |
| 139 | void wxGenericPrintDialog::Init(wxWindow * WXUNUSED(parent)) |
| 140 | { |
| 141 | // wxDialog::Create(parent, -1, _("Print"), wxPoint(0, 0), wxSize(600, 600), |
| 142 | // wxDEFAULT_DIALOG_STYLE | wxDIALOG_MODAL | wxTAB_TRAVERSAL); |
| 143 | |
| 144 | wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL ); |
| 145 | |
| 146 | // 1) top row |
| 147 | |
| 148 | wxStaticBoxSizer *topsizer = new wxStaticBoxSizer( |
| 149 | new wxStaticBox( this, -1, _( "Printer options" ) ), wxHORIZONTAL ); |
| 150 | m_printToFileCheckBox = new wxCheckBox( this, wxPRINTID_PRINTTOFILE, _("Print to File") ); |
| 151 | topsizer->Add( m_printToFileCheckBox, 0, wxCENTER|wxALL, 5 ); |
| 152 | |
| 153 | topsizer->Add( 60,2,1 ); |
| 154 | |
| 155 | m_setupButton = new wxButton(this, wxPRINTID_SETUP, _("Setup...") ); |
| 156 | topsizer->Add( m_setupButton, 0, wxCENTER|wxALL, 5 ); |
| 157 | |
| 158 | mainsizer->Add( topsizer, 0, wxLEFT|wxTOP|wxRIGHT, 10 ); |
| 159 | |
| 160 | // 2) middle row with radio box |
| 161 | |
| 162 | wxString *choices = new wxString[2]; |
| 163 | choices[0] = _("All"); |
| 164 | choices[1] = _("Pages"); |
| 165 | |
| 166 | m_fromText = (wxTextCtrl*)NULL; |
| 167 | m_toText = (wxTextCtrl*)NULL; |
| 168 | m_rangeRadioBox = (wxRadioBox *)NULL; |
| 169 | |
| 170 | if (m_printDialogData.GetFromPage() != 0) |
| 171 | { |
| 172 | m_rangeRadioBox = new wxRadioBox(this, wxPRINTID_RANGE, _("Print Range"), |
| 173 | wxDefaultPosition, wxDefaultSize, |
| 174 | 2, choices, |
| 175 | 1, wxRA_VERTICAL); |
| 176 | m_rangeRadioBox->SetSelection(1); |
| 177 | |
| 178 | mainsizer->Add( m_rangeRadioBox, 0, wxLEFT|wxTOP|wxRIGHT, 10 ); |
| 179 | } |
| 180 | |
| 181 | // 3) bottom row |
| 182 | |
| 183 | wxBoxSizer *bottomsizer = new wxBoxSizer( wxHORIZONTAL ); |
| 184 | |
| 185 | if (m_printDialogData.GetFromPage() != 0) |
| 186 | { |
| 187 | bottomsizer->Add( new wxStaticText(this, wxPRINTID_STATIC, _("From:") ), 0, wxCENTER|wxALL, 5 ); |
| 188 | m_fromText = new wxTextCtrl(this, wxPRINTID_FROM, "", wxDefaultPosition, wxSize(40, -1)); |
| 189 | bottomsizer->Add( m_fromText, 1, wxCENTER|wxRIGHT, 10 ); |
| 190 | |
| 191 | bottomsizer->Add( new wxStaticText(this, wxPRINTID_STATIC, _("To:") ), 0, wxCENTER|wxALL, 5); |
| 192 | m_toText = new wxTextCtrl(this, wxPRINTID_TO, "", wxDefaultPosition, wxSize(40, -1)); |
| 193 | bottomsizer->Add( m_toText, 1, wxCENTER|wxRIGHT, 10 ); |
| 194 | } |
| 195 | |
| 196 | bottomsizer->Add( new wxStaticText(this, wxPRINTID_STATIC, _("Copies:") ), 0, wxCENTER|wxALL, 5 ); |
| 197 | m_noCopiesText = new wxTextCtrl(this, wxPRINTID_COPIES, "", wxPoint(252, 130), wxSize(40, -1)); |
| 198 | bottomsizer->Add( m_noCopiesText, 1, wxCENTER|wxRIGHT, 10 ); |
| 199 | |
| 200 | mainsizer->Add( bottomsizer, 0, wxTOP|wxLEFT|wxRIGHT, 12 ); |
| 201 | |
| 202 | #if wxUSE_STATLINE |
| 203 | // 4) static line |
| 204 | mainsizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 ); |
| 205 | #endif |
| 206 | |
| 207 | // 5) buttons |
| 208 | |
| 209 | mainsizer->Add( CreateButtonSizer( wxOK|wxCANCEL), 0, wxCENTER|wxALL, 10 ); |
| 210 | |
| 211 | SetAutoLayout( TRUE ); |
| 212 | SetSizer( mainsizer ); |
| 213 | |
| 214 | mainsizer->Fit( this ); |
| 215 | Centre(wxBOTH); |
| 216 | |
| 217 | // Calls wxWindow::OnInitDialog and then wxGenericPrintDialog::TransferDataToWindow |
| 218 | InitDialog(); |
| 219 | delete[] choices; |
| 220 | } |
| 221 | |
| 222 | int wxGenericPrintDialog::ShowModal() |
| 223 | { |
| 224 | if ( m_printDialogData.GetSetupDialog() ) |
| 225 | { |
| 226 | // Make sure wxPrintData object reflects the settings now, in case the setup dialog |
| 227 | // changes it. In fact there aren't any common settings at |
| 228 | // present, but there might be in future. |
| 229 | // TransferDataFromWindow(); |
| 230 | |
| 231 | wxGenericPrintSetupDialog *genericPrintSetupDialog = |
| 232 | new wxGenericPrintSetupDialog(this, & m_printDialogData.GetPrintData()); |
| 233 | int ret = genericPrintSetupDialog->ShowModal(); |
| 234 | if ( ret != wxID_CANCEL ) |
| 235 | { |
| 236 | // Transfer settings to the global object (for compatibility) and to |
| 237 | // the print dialog's print data. |
| 238 | *wxThePrintSetupData = genericPrintSetupDialog->GetPrintData(); |
| 239 | m_printDialogData.GetPrintData() = genericPrintSetupDialog->GetPrintData(); |
| 240 | } |
| 241 | genericPrintSetupDialog->Destroy(); |
| 242 | |
| 243 | // Restore the wxPrintData settings again (uncomment if any settings become common |
| 244 | // to both dialogs) |
| 245 | // TransferDataToWindow(); |
| 246 | |
| 247 | return ret; |
| 248 | } |
| 249 | else |
| 250 | { |
| 251 | return wxDialog::ShowModal(); |
| 252 | } |
| 253 | } |
| 254 | |
| 255 | wxGenericPrintDialog::~wxGenericPrintDialog() |
| 256 | { |
| 257 | } |
| 258 | |
| 259 | void wxGenericPrintDialog::OnOK(wxCommandEvent& WXUNUSED(event)) |
| 260 | { |
| 261 | TransferDataFromWindow(); |
| 262 | |
| 263 | // There are some interactions between the global setup data |
| 264 | // and the standard print dialog. The global printing 'mode' |
| 265 | // is determined by whether the user checks Print to file |
| 266 | // or not. |
| 267 | if (m_printDialogData.GetPrintToFile()) |
| 268 | { |
| 269 | m_printDialogData.GetPrintData().SetPrintMode(wxPRINT_MODE_FILE); |
| 270 | wxThePrintSetupData->SetPrinterMode(wxPRINT_MODE_FILE); |
| 271 | |
| 272 | wxString f = wxFileSelector(_("PostScript file"), |
| 273 | wxPathOnly(wxThePrintSetupData->GetPrinterFile()), |
| 274 | wxFileNameFromPath(wxThePrintSetupData->GetPrinterFile()), |
| 275 | wxT("ps"), wxT("*.ps"), 0, this); |
| 276 | if ( f.IsEmpty() ) |
| 277 | return; |
| 278 | |
| 279 | m_printDialogData.GetPrintData().SetFilename(f); |
| 280 | wxThePrintSetupData->SetPrinterFile(f); |
| 281 | } |
| 282 | else |
| 283 | { |
| 284 | m_printDialogData.GetPrintData().SetPrintMode(wxPRINT_MODE_PRINTER); |
| 285 | wxThePrintSetupData->SetPrinterMode(wxPRINT_MODE_PRINTER); |
| 286 | } |
| 287 | |
| 288 | EndModal(wxID_OK); |
| 289 | } |
| 290 | |
| 291 | void wxGenericPrintDialog::OnRange(wxCommandEvent& event) |
| 292 | { |
| 293 | if (!m_fromText) return; |
| 294 | |
| 295 | if (event.GetInt() == 0) |
| 296 | { |
| 297 | m_fromText->Enable(FALSE); |
| 298 | m_toText->Enable(FALSE); |
| 299 | } |
| 300 | else if (event.GetInt() == 1) |
| 301 | { |
| 302 | m_fromText->Enable(TRUE); |
| 303 | m_toText->Enable(TRUE); |
| 304 | } |
| 305 | } |
| 306 | |
| 307 | void wxGenericPrintDialog::OnSetup(wxCommandEvent& WXUNUSED(event)) |
| 308 | { |
| 309 | *wxThePrintSetupData = m_printDialogData.GetPrintData(); |
| 310 | wxGenericPrintSetupDialog *genericPrintSetupDialog = |
| 311 | new wxGenericPrintSetupDialog(this, wxThePrintSetupData); |
| 312 | int ret = genericPrintSetupDialog->ShowModal(); |
| 313 | if ( ret != wxID_CANCEL ) |
| 314 | { |
| 315 | *wxThePrintSetupData = genericPrintSetupDialog->GetPrintData(); |
| 316 | m_printDialogData = genericPrintSetupDialog->GetPrintData(); |
| 317 | } |
| 318 | |
| 319 | genericPrintSetupDialog->Close(TRUE); |
| 320 | } |
| 321 | |
| 322 | bool wxGenericPrintDialog::TransferDataToWindow() |
| 323 | { |
| 324 | char buf[10]; |
| 325 | |
| 326 | if(m_printDialogData.GetFromPage() != 0) |
| 327 | { |
| 328 | if(m_fromText) |
| 329 | { |
| 330 | if (m_printDialogData.GetEnablePageNumbers()) |
| 331 | { |
| 332 | m_fromText->Enable(TRUE); |
| 333 | m_toText->Enable(TRUE); |
| 334 | sprintf(buf, "%d", m_printDialogData.GetFromPage()); |
| 335 | m_fromText->SetValue(buf); |
| 336 | sprintf(buf, "%d", m_printDialogData.GetToPage()); |
| 337 | m_toText->SetValue(buf); |
| 338 | if(m_rangeRadioBox) |
| 339 | if (m_printDialogData.GetAllPages()) |
| 340 | m_rangeRadioBox->SetSelection(0); |
| 341 | else |
| 342 | m_rangeRadioBox->SetSelection(1); |
| 343 | } |
| 344 | else |
| 345 | { |
| 346 | m_fromText->Enable(FALSE); |
| 347 | m_toText->Enable(FALSE); |
| 348 | if(m_rangeRadioBox) |
| 349 | { |
| 350 | m_rangeRadioBox->SetSelection(0); |
| 351 | m_rangeRadioBox->wxRadioBox::Enable(1, FALSE); |
| 352 | } |
| 353 | } |
| 354 | } |
| 355 | } |
| 356 | sprintf(buf, "%d", m_printDialogData.GetNoCopies()); |
| 357 | m_noCopiesText->SetValue(buf); |
| 358 | |
| 359 | m_printToFileCheckBox->SetValue(m_printDialogData.GetPrintToFile()); |
| 360 | m_printToFileCheckBox->Enable(m_printDialogData.GetEnablePrintToFile()); |
| 361 | return TRUE; |
| 362 | } |
| 363 | |
| 364 | bool wxGenericPrintDialog::TransferDataFromWindow() |
| 365 | { |
| 366 | if(m_printDialogData.GetFromPage() != -1) |
| 367 | { |
| 368 | if (m_printDialogData.GetEnablePageNumbers()) |
| 369 | { |
| 370 | if(m_fromText) m_printDialogData.SetFromPage(wxAtoi(m_fromText->GetValue())); |
| 371 | if(m_toText) m_printDialogData.SetToPage(wxAtoi(m_toText->GetValue())); |
| 372 | } |
| 373 | if(m_rangeRadioBox) |
| 374 | { |
| 375 | if (m_rangeRadioBox->GetSelection() == 0) |
| 376 | m_printDialogData.SetAllPages(TRUE); |
| 377 | else |
| 378 | m_printDialogData.SetAllPages(FALSE); |
| 379 | } |
| 380 | } |
| 381 | else |
| 382 | { // continuous printing |
| 383 | m_printDialogData.SetFromPage(1); |
| 384 | m_printDialogData.SetToPage(32000); |
| 385 | } |
| 386 | m_printDialogData.SetNoCopies(wxAtoi(m_noCopiesText->GetValue())); |
| 387 | m_printDialogData.SetPrintToFile(m_printToFileCheckBox->GetValue()); |
| 388 | |
| 389 | return TRUE; |
| 390 | } |
| 391 | |
| 392 | /* |
| 393 | TODO: collate and noCopies should be duplicated across dialog data and print data objects |
| 394 | (slightly different semantics on Windows but let's ignore this for a bit). |
| 395 | */ |
| 396 | |
| 397 | wxDC *wxGenericPrintDialog::GetPrintDC() |
| 398 | { |
| 399 | // return new wxPostScriptDC(wxThePrintSetupData->GetPrinterFile(), FALSE, (wxWindow *) NULL); |
| 400 | return new wxPostScriptDC(GetPrintDialogData().GetPrintData()); |
| 401 | } |
| 402 | |
| 403 | // ---------------------------------------------------------------------------- |
| 404 | // Generic print setup dialog |
| 405 | // ---------------------------------------------------------------------------- |
| 406 | |
| 407 | wxGenericPrintSetupDialog::wxGenericPrintSetupDialog(wxWindow *parent, wxPrintData* data): |
| 408 | wxDialog(parent, -1, _("Print Setup"), wxPoint(0, 0), wxSize(600, 600), wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL|wxTAB_TRAVERSAL) |
| 409 | { |
| 410 | Init(data); |
| 411 | } |
| 412 | |
| 413 | // Convert wxPrintSetupData to standard wxPrintData object |
| 414 | wxGenericPrintSetupDialog::wxGenericPrintSetupDialog(wxWindow *parent, wxPrintSetupData* data): |
| 415 | wxDialog(parent, -1, _("Print Setup"), wxPoint(0, 0), wxSize(600, 600), wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL|wxTAB_TRAVERSAL) |
| 416 | { |
| 417 | wxPrintData printData; |
| 418 | if (data) |
| 419 | printData = * data; |
| 420 | else |
| 421 | printData = * wxThePrintSetupData; |
| 422 | |
| 423 | Init(& printData); |
| 424 | } |
| 425 | |
| 426 | void wxGenericPrintSetupDialog::Init(wxPrintData* data) |
| 427 | { |
| 428 | if ( data ) |
| 429 | m_printData = *data; |
| 430 | |
| 431 | int staticBoxWidth = 300; |
| 432 | |
| 433 | (void) new wxStaticBox(this, wxPRINTID_STATIC, _("Paper size"), wxPoint(10, 10), wxSize(staticBoxWidth, 60) ); |
| 434 | |
| 435 | int xPos = 20; |
| 436 | int yPos = 30; |
| 437 | m_paperTypeChoice = CreatePaperTypeChoice(&xPos, &yPos); |
| 438 | |
| 439 | wxString *choices = new wxString[2]; |
| 440 | choices[0] = _("Portrait"); |
| 441 | choices[1] = _("Landscape"); |
| 442 | |
| 443 | m_orientationRadioBox = new wxRadioBox(this, wxPRINTID_ORIENTATION, _("Orientation"), |
| 444 | wxPoint(10, 80), wxSize(-1, -1), 2, choices, 1, wxRA_VERTICAL ); |
| 445 | m_orientationRadioBox->SetSelection(0); |
| 446 | |
| 447 | (void) new wxStaticBox(this, wxPRINTID_STATIC, _("Options"), wxPoint(10, 130), wxSize(staticBoxWidth, 50) ); |
| 448 | |
| 449 | int colourYPos = 145; |
| 450 | |
| 451 | #ifdef __WXMOTIF__ |
| 452 | colourYPos = 150; |
| 453 | #endif |
| 454 | |
| 455 | m_colourCheckBox = new wxCheckBox(this, wxPRINTID_PRINTCOLOUR, _("Print in colour"), wxPoint(15, colourYPos)); |
| 456 | |
| 457 | (void) new wxStaticBox(this, wxPRINTID_STATIC, _("Print spooling"), wxPoint(330, 10), wxSize(200,170) ); |
| 458 | |
| 459 | (void) new wxStaticText(this, wxPRINTID_STATIC, _("Printer command:"), wxPoint(340, 30)); |
| 460 | |
| 461 | m_printerCommandText = new wxTextCtrl(this, wxPRINTID_COMMAND, "", wxPoint(360, 55), wxSize(150, -1)); |
| 462 | |
| 463 | (void) new wxStaticText(this, wxPRINTID_STATIC, _("Printer options:"), wxPoint(340, 110)); |
| 464 | |
| 465 | m_printerOptionsText = new wxTextCtrl(this, wxPRINTID_OPTIONS, "", wxPoint(360, 135), wxSize(150, -1)); |
| 466 | |
| 467 | wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(130, 200), wxSize(80, -1)); |
| 468 | (void) new wxButton(this, wxID_CANCEL, _("Cancel"), wxPoint(320, 200), wxSize(80, -1)); |
| 469 | |
| 470 | okButton->SetDefault(); |
| 471 | okButton->SetFocus(); |
| 472 | |
| 473 | Fit(); |
| 474 | Centre(wxBOTH); |
| 475 | |
| 476 | InitDialog(); |
| 477 | delete[] choices; |
| 478 | } |
| 479 | |
| 480 | wxGenericPrintSetupDialog::~wxGenericPrintSetupDialog() |
| 481 | { |
| 482 | } |
| 483 | |
| 484 | bool wxGenericPrintSetupDialog::TransferDataToWindow() |
| 485 | { |
| 486 | if (m_printerCommandText && m_printData.GetPrinterCommand()) |
| 487 | m_printerCommandText->SetValue(m_printData.GetPrinterCommand()); |
| 488 | if (m_printerOptionsText && m_printData.GetPrinterOptions()) |
| 489 | m_printerOptionsText->SetValue(m_printData.GetPrinterOptions()); |
| 490 | if (m_colourCheckBox) |
| 491 | m_colourCheckBox->SetValue(m_printData.GetColour()); |
| 492 | |
| 493 | if (m_orientationRadioBox) |
| 494 | { |
| 495 | if (m_printData.GetOrientation() == wxPORTRAIT) |
| 496 | m_orientationRadioBox->SetSelection(0); |
| 497 | else |
| 498 | m_orientationRadioBox->SetSelection(1); |
| 499 | } |
| 500 | return TRUE; |
| 501 | } |
| 502 | |
| 503 | bool wxGenericPrintSetupDialog::TransferDataFromWindow() |
| 504 | { |
| 505 | if (m_printerCommandText) |
| 506 | m_printData.SetPrinterCommand(m_printerCommandText->GetValue()); |
| 507 | if (m_printerOptionsText) |
| 508 | m_printData.SetPrinterOptions(m_printerOptionsText->GetValue()); |
| 509 | if (m_colourCheckBox) |
| 510 | m_printData.SetColour(m_colourCheckBox->GetValue()); |
| 511 | if (m_orientationRadioBox) |
| 512 | { |
| 513 | int sel = m_orientationRadioBox->GetSelection(); |
| 514 | if (sel == 0) |
| 515 | m_printData.SetOrientation(wxPORTRAIT); |
| 516 | else |
| 517 | m_printData.SetOrientation(wxLANDSCAPE); |
| 518 | } |
| 519 | if (m_paperTypeChoice) |
| 520 | { |
| 521 | wxString val(m_paperTypeChoice->GetStringSelection()); |
| 522 | if (!val.IsNull() && val != "") |
| 523 | m_printData.SetPaperId(wxThePrintPaperDatabase->ConvertNameToId(val)); |
| 524 | } |
| 525 | |
| 526 | // This is for backward compatibility only |
| 527 | *wxThePrintSetupData = GetPrintData(); |
| 528 | return TRUE; |
| 529 | } |
| 530 | |
| 531 | wxComboBox *wxGenericPrintSetupDialog::CreatePaperTypeChoice(int *x, int *y) |
| 532 | { |
| 533 | /* Should not be necessary |
| 534 | if (!wxThePrintPaperDatabase) |
| 535 | { |
| 536 | wxThePrintPaperDatabase = new wxPrintPaperDatabase; |
| 537 | wxThePrintPaperDatabase->CreateDatabase(); |
| 538 | } |
| 539 | */ |
| 540 | int n = wxThePrintPaperDatabase->Number(); |
| 541 | wxString *choices = new wxString [n]; |
| 542 | int sel = 0; |
| 543 | int i; |
| 544 | for (i = 0; i < n; i++) |
| 545 | { |
| 546 | wxPrintPaperType *paper = (wxPrintPaperType *)wxThePrintPaperDatabase->Nth(i)->Data(); |
| 547 | choices[i] = paper->GetName(); |
| 548 | if (m_printData.GetPaperId() == paper->GetId()) |
| 549 | sel = i; |
| 550 | } |
| 551 | |
| 552 | int width = 250; |
| 553 | |
| 554 | wxComboBox *choice = new wxComboBox(this, wxPRINTID_PAPERSIZE, |
| 555 | _("Paper Size"), |
| 556 | wxPoint(*x, *y), wxSize(width, -1), n, |
| 557 | choices); |
| 558 | |
| 559 | // SetFont(thisFont); |
| 560 | |
| 561 | delete[] choices; |
| 562 | |
| 563 | choice->SetSelection(sel); |
| 564 | return choice; |
| 565 | } |
| 566 | #endif // wxUSE_POSTSCRIPT |
| 567 | |
| 568 | // ---------------------------------------------------------------------------- |
| 569 | // Generic page setup dialog |
| 570 | // ---------------------------------------------------------------------------- |
| 571 | |
| 572 | void wxGenericPageSetupDialog::OnPrinter(wxCommandEvent& WXUNUSED(event)) |
| 573 | { |
| 574 | // We no longer query GetPrintMode, so we can eliminate the need |
| 575 | // to call SetPrintMode. |
| 576 | // This has the limitation that we can't explicitly call the PostScript |
| 577 | // print setup dialog from the generic Page Setup dialog under Windows, |
| 578 | // but since this choice would only happen when trying to do PostScript |
| 579 | // printing under Windows (and only in 16-bit Windows which |
| 580 | // doesn't have a Windows-specific page setup dialog) it's worth it. |
| 581 | |
| 582 | // First save the current settings, so the wxPrintData object is up to date. |
| 583 | TransferDataFromWindow(); |
| 584 | |
| 585 | // Transfer the current print settings from this dialog to the page setup dialog. |
| 586 | wxPrintDialogData data; |
| 587 | data = GetPageSetupData().GetPrintData(); |
| 588 | data.SetSetupDialog(TRUE); |
| 589 | wxPrintDialog *printDialog = new wxPrintDialog(this, & data); |
| 590 | printDialog->ShowModal(); |
| 591 | |
| 592 | // Transfer the page setup print settings from the page dialog to this dialog again, in case |
| 593 | // the page setup dialog changed something. |
| 594 | GetPageSetupData().GetPrintData() = printDialog->GetPrintDialogData().GetPrintData(); |
| 595 | GetPageSetupData().CalculatePaperSizeFromId(); // Make sure page size reflects the id in wxPrintData |
| 596 | |
| 597 | printDialog->Destroy(); |
| 598 | |
| 599 | // Now update the dialog in case the page setup dialog changed some of our settings. |
| 600 | TransferDataToWindow(); |
| 601 | } |
| 602 | |
| 603 | wxGenericPageSetupDialog::wxGenericPageSetupDialog(wxWindow *parent, wxPageSetupData* data): |
| 604 | wxDialog(parent, -1, _("Page Setup"), wxPoint(0, 0), wxSize(600, 600), wxDIALOG_MODAL|wxDEFAULT_DIALOG_STYLE|wxTAB_TRAVERSAL) |
| 605 | { |
| 606 | if (data) |
| 607 | m_pageData = *data; |
| 608 | |
| 609 | int textWidth = 80; |
| 610 | |
| 611 | wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL ); |
| 612 | |
| 613 | // 1) top |
| 614 | wxStaticBoxSizer *topsizer = new wxStaticBoxSizer( |
| 615 | new wxStaticBox(this,wxPRINTID_STATIC, _("Paper size")), wxHORIZONTAL ); |
| 616 | |
| 617 | int n = wxThePrintPaperDatabase->Number(); |
| 618 | wxString *choices = new wxString [n]; |
| 619 | int i; |
| 620 | for (i = 0; i < n; i++) |
| 621 | { |
| 622 | wxPrintPaperType *paper = (wxPrintPaperType *)wxThePrintPaperDatabase->Nth(i)->Data(); |
| 623 | choices[i] = paper->GetName(); |
| 624 | } |
| 625 | |
| 626 | m_paperTypeChoice = new wxComboBox(this, wxPRINTID_PAPERSIZE, _("Paper Size"), |
| 627 | wxDefaultPosition, wxSize(300, -1), n, choices); |
| 628 | topsizer->Add( m_paperTypeChoice, 1, wxEXPAND|wxALL, 5 ); |
| 629 | // m_paperTypeChoice->SetSelection(sel); |
| 630 | |
| 631 | mainsizer->Add( topsizer, 0, wxTOP|wxLEFT|wxRIGHT | wxEXPAND, 10 ); |
| 632 | |
| 633 | // 2) middle sizer with radio box |
| 634 | |
| 635 | wxString *choices2 = new wxString[2]; |
| 636 | choices2[0] = _("Portrait"); |
| 637 | choices2[1] = _("Landscape"); |
| 638 | m_orientationRadioBox = new wxRadioBox(this, wxPRINTID_ORIENTATION, _("Orientation"), |
| 639 | wxDefaultPosition, wxDefaultSize, 2, choices2, 2); |
| 640 | m_orientationRadioBox->SetSelection(0); |
| 641 | |
| 642 | mainsizer->Add( m_orientationRadioBox, 0, wxTOP|wxLEFT|wxRIGHT, 10 ); |
| 643 | |
| 644 | // 3) margins |
| 645 | |
| 646 | wxBoxSizer *table = new wxBoxSizer( wxHORIZONTAL ); |
| 647 | |
| 648 | wxBoxSizer *column1 = new wxBoxSizer( wxVERTICAL ); |
| 649 | column1->Add( new wxStaticText(this, wxPRINTID_STATIC, _("Left margin (mm):")),1,wxALL|wxALIGN_RIGHT,5 ); |
| 650 | column1->Add( new wxStaticText(this, wxPRINTID_STATIC, _("Top margin (mm):")),1,wxALL|wxALIGN_RIGHT,5 ); |
| 651 | table->Add( column1, 0, wxALL | wxEXPAND, 5 ); |
| 652 | |
| 653 | wxBoxSizer *column2 = new wxBoxSizer( wxVERTICAL ); |
| 654 | m_marginLeftText = new wxTextCtrl(this, wxPRINTID_LEFTMARGIN, "", wxDefaultPosition, wxSize(textWidth, -1)); |
| 655 | m_marginTopText = new wxTextCtrl(this, wxPRINTID_TOPMARGIN, "", wxDefaultPosition, wxSize(textWidth, -1)); |
| 656 | column2->Add( m_marginLeftText, 1, wxALL, 5 ); |
| 657 | column2->Add( m_marginTopText, 1, wxALL, 5 ); |
| 658 | table->Add( column2, 0, wxRIGHT|wxTOP|wxBOTTOM | wxEXPAND, 5 ); |
| 659 | |
| 660 | wxBoxSizer *column3 = new wxBoxSizer( wxVERTICAL ); |
| 661 | column3->Add( new wxStaticText(this, wxPRINTID_STATIC, _("Right margin (mm):")),1,wxALL|wxALIGN_RIGHT,5 ); |
| 662 | column3->Add( new wxStaticText(this, wxPRINTID_STATIC, _("Bottom margin (mm):")),1,wxALL|wxALIGN_RIGHT,5 ); |
| 663 | table->Add( column3, 0, wxALL | wxEXPAND, 5 ); |
| 664 | |
| 665 | wxBoxSizer *column4 = new wxBoxSizer( wxVERTICAL ); |
| 666 | m_marginRightText = new wxTextCtrl(this, wxPRINTID_RIGHTMARGIN, "", wxDefaultPosition, wxSize(textWidth, -1)); |
| 667 | m_marginBottomText = new wxTextCtrl(this, wxPRINTID_BOTTOMMARGIN, "", wxDefaultPosition, wxSize(textWidth, -1)); |
| 668 | column4->Add( m_marginRightText, 1, wxALL, 5 ); |
| 669 | column4->Add( m_marginBottomText, 1, wxALL, 5 ); |
| 670 | table->Add( column4, 0, wxRIGHT|wxTOP|wxBOTTOM | wxEXPAND, 5 ); |
| 671 | |
| 672 | mainsizer->Add( table, 0 ); |
| 673 | |
| 674 | #if wxUSE_STATLINE |
| 675 | // 5) static line |
| 676 | mainsizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 ); |
| 677 | #endif |
| 678 | |
| 679 | // 6) buttons |
| 680 | |
| 681 | wxSizer* buttonsizer = CreateButtonSizer( wxOK|wxCANCEL); |
| 682 | m_printerButton = new wxButton(this, wxPRINTID_SETUP, _("Printer...") ); |
| 683 | buttonsizer->Add( m_printerButton, 0, wxLEFT|wxRIGHT, 10 ); |
| 684 | if ( !m_pageData.GetEnablePrinter() ) |
| 685 | m_printerButton->Enable(FALSE); |
| 686 | // if (m_printData.GetEnableHelp()) |
| 687 | // wxButton *helpButton = new wxButton(this, (wxFunction)wxGenericPageSetupHelpProc, _("Help"), -1, -1, buttonWidth, buttonHeight); |
| 688 | mainsizer->Add( buttonsizer, 0, wxCENTER|wxALL, 10 ); |
| 689 | |
| 690 | |
| 691 | SetAutoLayout( TRUE ); |
| 692 | SetSizer( mainsizer ); |
| 693 | |
| 694 | mainsizer->Fit( this ); |
| 695 | Centre(wxBOTH); |
| 696 | |
| 697 | InitDialog(); |
| 698 | |
| 699 | delete[] choices; |
| 700 | delete [] choices2; |
| 701 | } |
| 702 | |
| 703 | wxGenericPageSetupDialog::~wxGenericPageSetupDialog() |
| 704 | { |
| 705 | } |
| 706 | |
| 707 | bool wxGenericPageSetupDialog::TransferDataToWindow() |
| 708 | { |
| 709 | if (m_marginLeftText) |
| 710 | m_marginLeftText->SetValue(IntToString((int) m_pageData.GetMarginTopLeft().x)); |
| 711 | if (m_marginTopText) |
| 712 | m_marginTopText->SetValue(IntToString((int) m_pageData.GetMarginTopLeft().y)); |
| 713 | if (m_marginRightText) |
| 714 | m_marginRightText->SetValue(IntToString((int) m_pageData.GetMarginBottomRight().x)); |
| 715 | if (m_marginBottomText) |
| 716 | m_marginBottomText->SetValue(IntToString((int) m_pageData.GetMarginBottomRight().y)); |
| 717 | |
| 718 | if (m_orientationRadioBox) |
| 719 | { |
| 720 | if (m_pageData.GetPrintData().GetOrientation() == wxPORTRAIT) |
| 721 | m_orientationRadioBox->SetSelection(0); |
| 722 | else |
| 723 | m_orientationRadioBox->SetSelection(1); |
| 724 | } |
| 725 | |
| 726 | // Find the paper type from either the current paper size in the wxPageSetupDialogData, or |
| 727 | // failing that, the id in the wxPrintData object. |
| 728 | |
| 729 | wxPrintPaperType* type = wxThePrintPaperDatabase->FindPaperType( |
| 730 | wxSize(m_pageData.GetPaperSize().x * 10, m_pageData.GetPaperSize().y * 10)); |
| 731 | |
| 732 | if (!type && m_pageData.GetPrintData().GetPaperId() != wxPAPER_NONE) |
| 733 | type = wxThePrintPaperDatabase->FindPaperType(m_pageData.GetPrintData().GetPaperId()); |
| 734 | |
| 735 | if (type) |
| 736 | { |
| 737 | m_paperTypeChoice->SetStringSelection(type->GetName()); |
| 738 | } |
| 739 | |
| 740 | return TRUE; |
| 741 | } |
| 742 | |
| 743 | bool wxGenericPageSetupDialog::TransferDataFromWindow() |
| 744 | { |
| 745 | if (m_marginLeftText && m_marginTopText) |
| 746 | m_pageData.SetMarginTopLeft(wxPoint(wxAtoi((const wxChar *)m_marginLeftText->GetValue()),wxAtoi((const wxChar *)m_marginTopText->GetValue()))); |
| 747 | if (m_marginRightText && m_marginBottomText) |
| 748 | m_pageData.SetMarginBottomRight(wxPoint(wxAtoi((const wxChar *)m_marginRightText->GetValue()),wxAtoi((const wxChar *)m_marginBottomText->GetValue()))); |
| 749 | |
| 750 | if (m_orientationRadioBox) |
| 751 | { |
| 752 | int sel = m_orientationRadioBox->GetSelection(); |
| 753 | if (sel == 0) |
| 754 | { |
| 755 | #if wxUSE_POSTSCRIPT |
| 756 | wxThePrintSetupData->SetPrinterOrientation(wxPORTRAIT); |
| 757 | #endif |
| 758 | m_pageData.GetPrintData().SetOrientation(wxPORTRAIT); |
| 759 | } |
| 760 | else |
| 761 | { |
| 762 | #if wxUSE_POSTSCRIPT |
| 763 | wxThePrintSetupData->SetPrinterOrientation(wxLANDSCAPE); |
| 764 | #endif |
| 765 | m_pageData.GetPrintData().SetOrientation(wxLANDSCAPE); |
| 766 | } |
| 767 | } |
| 768 | if (m_paperTypeChoice) |
| 769 | { |
| 770 | wxString val(m_paperTypeChoice->GetStringSelection()); |
| 771 | if (!val.IsNull() && val != "") |
| 772 | { |
| 773 | wxPrintPaperType* paper = wxThePrintPaperDatabase->FindPaperType(val); |
| 774 | if ( paper ) |
| 775 | { |
| 776 | m_pageData.SetPaperSize(wxSize(paper->GetWidth()/10, paper->GetHeight()/10)); |
| 777 | m_pageData.GetPrintData().SetPaperId(paper->GetId()); |
| 778 | } |
| 779 | } |
| 780 | } |
| 781 | |
| 782 | return TRUE; |
| 783 | } |
| 784 | |
| 785 | wxComboBox *wxGenericPageSetupDialog::CreatePaperTypeChoice(int *x, int *y) |
| 786 | { |
| 787 | /* |
| 788 | if (!wxThePrintPaperDatabase) |
| 789 | { |
| 790 | wxThePrintPaperDatabase = new wxPrintPaperDatabase; |
| 791 | wxThePrintPaperDatabase->CreateDatabase(); |
| 792 | } |
| 793 | */ |
| 794 | |
| 795 | int n = wxThePrintPaperDatabase->Number(); |
| 796 | wxString *choices = new wxString [n]; |
| 797 | int i; |
| 798 | for (i = 0; i < n; i++) |
| 799 | { |
| 800 | wxPrintPaperType *paper = (wxPrintPaperType *)wxThePrintPaperDatabase->Nth(i)->Data(); |
| 801 | choices[i] = paper->GetName(); |
| 802 | } |
| 803 | |
| 804 | (void) new wxStaticText(this, wxPRINTID_STATIC, _("Paper size"), wxPoint(*x, *y)); |
| 805 | *y += 25; |
| 806 | |
| 807 | wxComboBox *choice = new wxComboBox(this, wxPRINTID_PAPERSIZE, |
| 808 | _("Paper Size"), |
| 809 | wxPoint(*x, *y), wxSize(300, -1), n, |
| 810 | choices); |
| 811 | *y += 35; |
| 812 | delete[] choices; |
| 813 | |
| 814 | // choice->SetSelection(sel); |
| 815 | return choice; |
| 816 | } |
| 817 | |
| 818 | #endif |