]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/htmprint.cpp
Add missing WXK constants for the control keys
[wxWidgets.git] / src / html / htmprint.cpp
index 14d478faa9be757c631e45c793859e406f6a8223..96d32d97c390fb97df558f917d8d41203c21ee53 100644 (file)
@@ -24,6 +24,7 @@
     #include "wx/settings.h"
     #include "wx/msgdlg.h"
     #include "wx/module.h"
+    #include "wx/sizer.h"
 #endif
 
 #include "wx/print.h"
@@ -31,6 +32,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:
@@ -149,7 +151,7 @@ int wxHtmlDCRenderer::Render(int x, int y,
     int pbreak, hght;
 
     pbreak = (int)(from + m_Height);
-    while (m_Cells->AdjustPagebreak(&pbreak, known_pagebreaks)) {}
+    while (m_Cells->AdjustPagebreak(&pbreak, known_pagebreaks, m_Height)) {}
     hght = pbreak - from;
     if(to < hght)
         hght = to;
@@ -194,7 +196,7 @@ wxHtmlPrintout::wxHtmlPrintout(const wxString& title) : wxPrintout(title)
 {
     m_Renderer = new wxHtmlDCRenderer;
     m_RendererHdr = new wxHtmlDCRenderer;
-    m_NumPages = wxHTML_PRINT_MAX_PAGES;
+    m_NumPages = INT_MAX;
     m_Document = m_BasePath = wxEmptyString; m_BasePathIsDir = true;
     m_Headers[0] = m_Headers[1] = wxEmptyString;
     m_Footers[0] = m_Footers[1] = wxEmptyString;
@@ -225,8 +227,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 +359,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();
@@ -456,7 +492,6 @@ void wxHtmlPrintout::CountPages()
 
     int pos = 0;
     m_NumPages = 0;
-    // m_PageBreaks[0] = 0;
 
     m_PageBreaks.Clear();
     m_PageBreaks.Add( 0);
@@ -467,12 +502,6 @@ void wxHtmlPrintout::CountPages()
                                  m_PageBreaks,
                                  pos, true, INT_MAX);
         m_PageBreaks.Add( pos);
-        if( m_PageBreaks.GetCount() > wxHTML_PRINT_MAX_PAGES)
-        {
-            wxMessageBox( _("HTML pagination algorithm generated more than the allowed maximum number of pages and it can't continue any longer!"),
-            _("Warning"), wxCANCEL | wxICON_ERROR );
-            break;
-        }
     } while (pos < m_Renderer->GetTotalHeight());
 }
 
@@ -505,7 +534,7 @@ void wxHtmlPrintout::RenderPage(wxDC *dc, int page)
                       (double)ppiPrinterY / TYPICAL_SCREEN_DPI,
                       (double)ppiPrinterY / (double)ppiScreenY);
 
-    dc->SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT);
+    dc->SetBackgroundMode(wxTRANSPARENT);
 
     m_Renderer->Render((int) (ppmm_h * m_MarginLeft),
                          (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight), m_PageBreaks,
@@ -666,7 +695,7 @@ bool wxHtmlEasyPrinting::DoPreview(wxHtmlPrintout *printout1, wxHtmlPrintout *pr
     // Pass two printout objects: for preview, and possible printing.
     wxPrintDialogData printDialogData(*GetPrintData());
     wxPrintPreview *preview = new wxPrintPreview(printout1, printout2, &printDialogData);
-    if (!preview->Ok())
+    if (!preview->IsOk())
     {
         delete preview;
         return false;
@@ -702,7 +731,7 @@ bool wxHtmlEasyPrinting::DoPrint(wxHtmlPrintout *printout)
 
 void wxHtmlEasyPrinting::PageSetup()
 {
-    if (!GetPrintData()->Ok())
+    if (!GetPrintData()->IsOk())
     {
         wxLogError(_("There was a problem during page setup: you may need to set a default printer."));
         return;