X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d2b354f9c9f1473b2d6ff0ab643ebf57dcbfb656..8b2bac626c3fb981dad0d3e6d04a9b16744022d6:/src/common/prntbase.cpp diff --git a/src/common/prntbase.cpp b/src/common/prntbase.cpp index ee3ec90dad..bb29c3e968 100644 --- a/src/common/prntbase.cpp +++ b/src/common/prntbase.cpp @@ -9,7 +9,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "prntbase.h" #endif @@ -184,9 +184,13 @@ void wxPrintout::GetPageInfo(int *minPage, int *maxPage, int *fromPage, int *toP * Preview canvas */ +// VZ: the current code doesn't refresh properly without +// wxFULL_REPAINT_ON_RESIZE, this must be fixed as otherwise we have +// really horrible flicker when resizing the preview frame, but without +// this style it simply doesn't work correctly at all... wxPreviewCanvas::wxPreviewCanvas(wxPrintPreviewBase *preview, wxWindow *parent, const wxPoint& pos, const wxSize& size, long style, const wxString& name): -wxScrolledWindow(parent, -1, pos, size, style, name) +wxScrolledWindow(parent, -1, pos, size, style | wxFULL_REPAINT_ON_RESIZE, name) { m_printPreview = preview; #ifdef __WXMAC__ @@ -195,7 +199,7 @@ wxScrolledWindow(parent, -1, pos, size, style, name) wxSystemColour colourIndex = wxSYS_COLOUR_3DDKSHADOW; #else wxSystemColour colourIndex = wxSYS_COLOUR_APPWORKSPACE; -#endif +#endif SetBackgroundColour(wxSystemSettings::GetColour(colourIndex)); SetScrollbars(10, 10, 100, 100); @@ -232,7 +236,7 @@ void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent& event) wxSystemColour colourIndex = wxSYS_COLOUR_3DDKSHADOW; #else wxSystemColour colourIndex = wxSYS_COLOUR_APPWORKSPACE; -#endif +#endif SetBackgroundColour(wxSystemSettings::GetColour(colourIndex)); Refresh(); @@ -242,34 +246,42 @@ void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent& event) void wxPreviewCanvas::OnChar(wxKeyEvent &event) { + wxPreviewControlBar* controlBar = ((wxPreviewFrame*) GetParent())->GetControlBar(); if (event.GetKeyCode() == WXK_ESCAPE) { ((wxPreviewFrame*) GetParent())->Close(TRUE); return; } - + else if (event.GetKeyCode() == WXK_TAB) + { + controlBar->OnGoto(); + return; + } + else if (event.GetKeyCode() == WXK_RETURN) + { + controlBar->OnPrint(); + return; + } + if (!event.ControlDown()) { event.Skip(); return; } - wxPreviewControlBar* controlBar = ((wxPreviewFrame*) GetParent())->GetControlBar(); - switch(event.GetKeyCode()) - { - case WXK_NEXT: - controlBar->OnNext(); break; - case WXK_PRIOR: - controlBar->OnPrevious(); break; - case WXK_HOME: - controlBar->OnFirst(); break; - case WXK_END: - controlBar->OnLast(); break; - case WXK_TAB: - controlBar->OnGoto(); break; - default: - event.Skip(); - } + switch(event.GetKeyCode()) + { + case WXK_NEXT: + controlBar->OnNext(); break; + case WXK_PRIOR: + controlBar->OnPrevious(); break; + case WXK_HOME: + controlBar->OnFirst(); break; + case WXK_END: + controlBar->OnLast(); break; + default: + event.Skip(); + } } /* @@ -278,7 +290,7 @@ void wxPreviewCanvas::OnChar(wxKeyEvent &event) BEGIN_EVENT_TABLE(wxPreviewControlBar, wxPanel) EVT_BUTTON(wxID_PREVIEW_CLOSE, wxPreviewControlBar::OnWindowClose) - EVT_BUTTON(wxID_PREVIEW_PRINT, wxPreviewControlBar::OnPrint) + EVT_BUTTON(wxID_PREVIEW_PRINT, wxPreviewControlBar::OnPrintButton) EVT_BUTTON(wxID_PREVIEW_PREVIOUS, wxPreviewControlBar::OnPreviousButton) EVT_BUTTON(wxID_PREVIEW_NEXT, wxPreviewControlBar::OnNextButton) EVT_BUTTON(wxID_PREVIEW_FIRST, wxPreviewControlBar::OnFirstButton) @@ -323,7 +335,7 @@ void wxPreviewControlBar::OnWindowClose(wxCommandEvent& WXUNUSED(event)) frame->Close(TRUE); } -void wxPreviewControlBar::OnPrint(wxCommandEvent& WXUNUSED(event)) +void wxPreviewControlBar::OnPrint(void) { wxPrintPreviewBase *preview = GetPrintPreview(); preview->Print(TRUE); @@ -425,58 +437,56 @@ void wxPreviewControlBar::CreateButtons() SetSize(0, 0, 400, 40); wxBoxSizer *item0 = new wxBoxSizer( wxHORIZONTAL ); - - int smallButtonWidth = 45; - + m_closeButton = new wxButton( this, wxID_PREVIEW_CLOSE, _("&Close"), wxDefaultPosition, wxDefaultSize, 0 ); item0->Add( m_closeButton, 0, wxALIGN_CENTRE|wxALL, 5 ); - + if (m_buttonFlags & wxPREVIEW_PRINT) { m_printButton = new wxButton( this, wxID_PREVIEW_PRINT, _("&Print..."), wxDefaultPosition, wxDefaultSize, 0 ); item0->Add( m_printButton, 0, wxALIGN_CENTRE|wxALL, 5 ); } - + if (m_buttonFlags & wxPREVIEW_FIRST) { - m_firstPageButton = new wxButton( this, wxID_PREVIEW_FIRST, _("|<<"), wxDefaultPosition, wxSize(smallButtonWidth,-1), 0 ); + m_firstPageButton = new wxButton( this, wxID_PREVIEW_FIRST, _("|<<"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); item0->Add( m_firstPageButton, 0, wxALIGN_CENTRE|wxALL, 5 ); } - + if (m_buttonFlags & wxPREVIEW_PREVIOUS) { - m_previousPageButton = new wxButton( this, wxID_PREVIEW_PREVIOUS, _("<<"), wxDefaultPosition, wxSize(smallButtonWidth,-1), 0 ); + m_previousPageButton = new wxButton( this, wxID_PREVIEW_PREVIOUS, _("<<"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); item0->Add( m_previousPageButton, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 ); } - + if (m_buttonFlags & wxPREVIEW_NEXT) { - m_nextPageButton = new wxButton( this, wxID_PREVIEW_NEXT, _(">>"), wxDefaultPosition, wxSize(smallButtonWidth,-1), 0 ); + m_nextPageButton = new wxButton( this, wxID_PREVIEW_NEXT, _(">>"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); item0->Add( m_nextPageButton, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 ); } - + if (m_buttonFlags & wxPREVIEW_LAST) { - m_lastPageButton = new wxButton( this, wxID_PREVIEW_LAST, _(">>|"), wxDefaultPosition, wxSize(smallButtonWidth,-1), 0 ); + m_lastPageButton = new wxButton( this, wxID_PREVIEW_LAST, _(">>|"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); item0->Add( m_lastPageButton, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 ); } - + if (m_buttonFlags & wxPREVIEW_GOTO) { m_gotoPageButton = new wxButton( this, wxID_PREVIEW_GOTO, _("&Goto..."), wxDefaultPosition, wxDefaultSize, 0 ); item0->Add( m_gotoPageButton, 0, wxALIGN_CENTRE|wxALL, 5 ); } - + if (m_buttonFlags & wxPREVIEW_ZOOM) { - wxString choices[] = + wxString choices[] = { wxT("10%"), wxT("15%"), wxT("20%"), wxT("25%"), wxT("30%"), wxT("35%"), wxT("40%"), wxT("45%"), wxT("50%"), wxT("55%"), wxT("60%"), wxT("65%"), wxT("70%"), wxT("75%"), wxT("80%"), wxT("85%"), wxT("90%"), wxT("95%"), wxT("100%"), wxT("110%"), wxT("120%"), wxT("150%"), wxT("200%") }; int n = WXSIZEOF(choices); - + m_zoomControl = new wxChoice( this, wxID_PREVIEW_ZOOM, wxDefaultPosition, wxSize(70,-1), n, choices, 0 ); item0->Add( m_zoomControl, 0, wxALIGN_CENTRE|wxALL, 5 ); SetZoomControl(m_printPreview->GetZoom()); @@ -488,23 +498,34 @@ void wxPreviewControlBar::CreateButtons() void wxPreviewControlBar::SetZoomControl(int zoom) { - wxChar buf[20]; - wxSprintf( buf, wxT("%d%%"), zoom ); - if (m_zoomControl) - m_zoomControl->SetStringSelection(buf); + { + int n, count = m_zoomControl->GetCount(); + long val; + for (n=0; nGetString(n).BeforeFirst(wxT('%')).ToLong(&val) && + (val >= long(zoom))) + { + m_zoomControl->SetSelection(n); + return; + } + } + + m_zoomControl->SetSelection(count-1); + } } int wxPreviewControlBar::GetZoomControl() { - wxChar buf[20]; - if (m_zoomControl && (m_zoomControl->GetStringSelection() != wxT(""))) + if (m_zoomControl && (m_zoomControl->GetStringSelection() != wxEmptyString)) { - wxStrcpy(buf, m_zoomControl->GetStringSelection()); - buf[wxStrlen(buf) - 1] = 0; - return (int)wxAtoi(buf); + long val; + if (m_zoomControl->GetStringSelection().BeforeFirst(wxT('%')).ToLong(&val)) + return int(val); } - else return 0; + + return 0; } @@ -523,13 +544,14 @@ wxFrame(parent, -1, title, pos, size, style, name) m_printPreview = preview; m_controlBar = NULL; m_previewCanvas = NULL; + m_windowDisabler = NULL; // Give the application icon #ifdef __WXMSW__ wxFrame* topFrame = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame); if (topFrame) SetIcon(topFrame->GetIcon()); -#endif +#endif } wxPreviewFrame::~wxPreviewFrame() @@ -538,11 +560,8 @@ wxPreviewFrame::~wxPreviewFrame() void wxPreviewFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) { - // MakeModal doesn't work on wxMac, especially when there - // are multiple top-level windows. -#ifndef __WXMAC__ - MakeModal(FALSE); -#endif + if (m_windowDisabler) + delete m_windowDisabler; // Need to delete the printout and the print preview wxPrintout *printout = m_printPreview->GetPrintout(); @@ -577,14 +596,10 @@ void wxPreviewFrame::Initialize() SetAutoLayout( TRUE ); SetSizer( item0 ); - // MakeModal doesn't work on wxMac, especially when there - // are multiple top-level windows. -#ifndef __WXMAC__ - MakeModal(TRUE); -#endif + m_windowDisabler = new wxWindowDisabler(this); Layout(); - + m_printPreview->AdjustScrollbars(m_previewCanvas); m_previewCanvas->SetFocus(); m_controlBar->SetFocus(); @@ -674,11 +689,11 @@ bool wxPrintPreviewBase::SetCurrentPage(int pageNum) delete m_previewBitmap; m_previewBitmap = NULL; } - + if (m_previewCanvas) { AdjustScrollbars(m_previewCanvas); - + if (!RenderPage(pageNum)) return FALSE; m_previewCanvas->Refresh(); @@ -737,13 +752,13 @@ void wxPrintPreviewBase::AdjustScrollbars(wxPreviewCanvas *canvas) double actualHeight = (zoomScale*m_pageHeight*m_previewScale); // Set the scrollbars appropriately - int totalWidth = actualWidth + 2*m_leftMargin; - int totalHeight = actualHeight + 2*m_topMargin; + int totalWidth = (int)(actualWidth + 2*m_leftMargin); + int totalHeight = (int)(actualHeight + 2*m_topMargin); int scrollUnitsX = totalWidth/10; int scrollUnitsY = totalHeight/10; wxSize virtualSize = canvas->GetVirtualSize(); if (virtualSize.GetWidth() != totalWidth || virtualSize.GetHeight() != totalHeight) - canvas->SetScrollbars(10, 10, scrollUnitsX, scrollUnitsY, 0, 0, TRUE); + canvas->SetScrollbars(10, 10, scrollUnitsX, scrollUnitsY, 0, 0, TRUE); } bool wxPrintPreviewBase::RenderPage(int pageNum) @@ -764,12 +779,6 @@ bool wxPrintPreviewBase::RenderPage(int pageNum) int actualWidth = (int)(zoomScale*m_pageWidth*m_previewScale); int actualHeight = (int)(zoomScale*m_pageHeight*m_previewScale); - int x = (int)((canvasWidth - actualWidth)/2.0); - if (x < m_leftMargin) - x = m_leftMargin; - // int y = m_topMargin; - - if (!m_previewBitmap) { m_previewBitmap = new wxBitmap((int)actualWidth, (int)actualHeight); @@ -894,7 +903,7 @@ void wxPrintPreviewBase::SetZoom(int percent) AdjustScrollbars(m_previewCanvas); RenderPage(m_currentPage); ((wxScrolledWindow *) m_previewCanvas)->Scroll(0, 0); - m_previewCanvas->Clear(); + m_previewCanvas->ClearBackground(); m_previewCanvas->Refresh(); m_previewCanvas->SetFocus(); }