From fc48f78fd0af945f1259ff3edc94259025500deb Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 5 May 2010 12:20:15 +0000 Subject: [PATCH] Notify user less intrusively about overflow when previewing HTML printouts. We used to show a modal dialog if the page didn't fit horizontally but this was too intrusive when the user was just previewing the output and not really printing it. Moreover, the question of the message box ("Print" or "Cancel") simply didn't make sense in this case. Fix both problems by not showing this dialog at all when previewing. Instead, notify the user with a much less intrusive info bar in the preview window. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64214 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/html/htmprint.h | 8 +++++--- src/html/htmprint.cpp | 39 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/include/wx/html/htmprint.h b/include/wx/html/htmprint.h index 4e0ccc9150..73239426d8 100644 --- a/include/wx/html/htmprint.h +++ b/include/wx/html/htmprint.h @@ -176,15 +176,17 @@ public: private: // this function is called by the base class OnPreparePrinting() // implementation and by default checks whether the document fits into - // pageArea horizontally and warns the user if it does not, giving him - // the possibility to cancel printing in this case + // pageArea horizontally and warns the user if it does not and, if we're + // going to print and not just to preview the document, giving him the + // possibility to cancel printing // // you may override it to either suppress this check if truncation of the // HTML being printed is acceptable or, on the contrary, add more checks to // it, e.g. for the fit in the vertical direction if the document should // always appear on a single page // - // return true if printing should go ahead or false to cancel it + // return true if printing should go ahead or false to cancel it (the + // return value is ignored when previewing) virtual bool CheckFit(const wxSize& pageArea, const wxSize& docArea) const; void RenderPage(wxDC *dc, int page); diff --git a/src/html/htmprint.cpp b/src/html/htmprint.cpp index 14d478faa9..2bd1e572ca 100644 --- a/src/html/htmprint.cpp +++ b/src/html/htmprint.cpp @@ -31,6 +31,7 @@ #include "wx/html/htmprint.h" #include "wx/wxhtml.h" #include "wx/wfstream.h" +#include "wx/infobar.h" // default font size of normal text (HTML font size 0) for printing, in points: @@ -225,8 +226,42 @@ void wxHtmlPrintout::AddFilter(wxHtmlFilter *filter) bool wxHtmlPrintout::CheckFit(const wxSize& pageArea, const wxSize& docArea) const { - if ( docArea.x > pageArea.x ) + // Nothing to do if the contents fits horizontally. + if ( docArea.x <= pageArea.x ) + return true; + + // Otherwise warn the user more or less intrusively depending on whether + // we're previewing or printing: + if ( wxPrintPreview * const preview = GetPreview() ) { + // Don't annoy the user too much when previewing by using info bar + // instead of a dialog box. +#if wxUSE_INFOBAR + wxFrame * const parent = preview->GetFrame(); + wxCHECK_MSG( parent, false, "No parent preview frame?" ); + + wxSizer * const sizer = parent->GetSizer(); + wxCHECK_MSG( sizer, false, "Preview frame should be using sizers" ); + + wxInfoBar * const bar = new wxInfoBar(parent); + sizer->Add(bar, wxSizerFlags().Expand()); + + // Note that the message here is similar to the one below but not + // exactly the same, notably we don't use the document title here + // because it's already clear which document it pertains to and the + // title may be long enough to make the text not fit in the window. + bar->ShowMessage + ( + _("This document doesn't fit on the page horizontally and " + "will be truncated when it is printed."), + wxICON_WARNING + ); +#endif // wxUSE_INFOBAR + } + else // We're going to really print and not just preview. + { + // This is our last chance to warn the user that the output will be + // mangled so do show a message box. wxMessageDialog dlg ( @@ -323,7 +358,7 @@ void wxHtmlPrintout::OnPreparePrinting() if ( CheckFit(wxSize(printAreaW, printAreaH), wxSize(m_Renderer->GetTotalWidth(), - m_Renderer->GetTotalHeight())) ) + m_Renderer->GetTotalHeight())) || IsPreview() ) { // do paginate the document CountPages();