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
This commit is contained in:
Vadim Zeitlin 2010-05-05 12:20:15 +00:00
parent 742df99230
commit fc48f78fd0
2 changed files with 42 additions and 5 deletions

View File

@ -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);

View File

@ -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();