]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/htmprint.cpp
check that the version of __sync_sub_and_fetch that returns a value is supported...
[wxWidgets.git] / src / html / htmprint.cpp
index c094e0ead32e7c84ee97049a37e27748dc1b3072..cacbefbc60939d9025ffdb3cb90efe7c11d2e87c 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        htmprint.cpp
+// Name:        src/html/htmprint.cpp
 // Purpose:     html printing classes
 // Author:      Vaclav Slavik
 // Created:     25/09/99
 // Purpose:     html printing classes
 // Author:      Vaclav Slavik
 // Created:     25/09/99
@@ -8,36 +8,29 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "htmprint.h"
-#endif
-
 // For compilers that support precompilation, includes "wx/wx.h".
 #include "wx/wxprec.h"
 
 // For compilers that support precompilation, includes "wx/wx.h".
 #include "wx/wxprec.h"
 
-#include "wx/defs.h"
-
 #ifdef __BORLANDC__
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #endif
 
+#if wxUSE_HTML && wxUSE_PRINTING_ARCHITECTURE && wxUSE_STREAMS
+
 #ifndef WX_PRECOMP
     #include "wx/log.h"
     #include "wx/intl.h"
     #include "wx/dc.h"
 #ifndef WX_PRECOMP
     #include "wx/log.h"
     #include "wx/intl.h"
     #include "wx/dc.h"
+    #include "wx/settings.h"
+    #include "wx/msgdlg.h"
+    #include "wx/module.h"
 #endif
 
 #endif
 
-#if wxUSE_HTML && wxUSE_PRINTING_ARCHITECTURE && wxUSE_STREAMS
-
-#include "wx/dc.h"
 #include "wx/print.h"
 #include "wx/printdlg.h"
 #include "wx/html/htmprint.h"
 #include "wx/wxhtml.h"
 #include "wx/wfstream.h"
 #include "wx/print.h"
 #include "wx/printdlg.h"
 #include "wx/html/htmprint.h"
 #include "wx/wxhtml.h"
 #include "wx/wfstream.h"
-#include "wx/module.h"
-#include "wx/settings.h"
 
 
 //--------------------------------------------------------------------------------
 
 
 //--------------------------------------------------------------------------------
@@ -50,7 +43,7 @@ wxHtmlDCRenderer::wxHtmlDCRenderer() : wxObject()
     m_DC = NULL;
     m_Width = m_Height = 0;
     m_Cells = NULL;
     m_DC = NULL;
     m_Width = m_Height = 0;
     m_Cells = NULL;
-    m_Parser = new wxHtmlWinParser(NULL);
+    m_Parser = new wxHtmlWinParser();
     m_FS = new wxFileSystem();
     m_Parser->SetFS(m_FS);
 }
     m_FS = new wxFileSystem();
     m_Parser->SetFS(m_FS);
 }
@@ -94,7 +87,7 @@ void wxHtmlDCRenderer::SetHtmlText(const wxString& html, const wxString& basepat
 }
 
 
 }
 
 
-void wxHtmlDCRenderer::SetFonts(wxString normal_face, wxString fixed_face,
+void wxHtmlDCRenderer::SetFonts(const wxString& normal_face, const wxString& fixed_face,
                                 const int *sizes)
 {
     m_Parser->SetFonts(normal_face, fixed_face, sizes);
                                 const int *sizes)
 {
     m_Parser->SetFonts(normal_face, fixed_face, sizes);
@@ -111,30 +104,32 @@ void wxHtmlDCRenderer::SetStandardFonts(int size,
         m_Cells->Layout(m_Width);
 }
 
         m_Cells->Layout(m_Width);
 }
 
-
-int wxHtmlDCRenderer::Render(int x, int y, int from, int dont_render, int to, int *known_pagebreaks, int number_of_pages)
+int wxHtmlDCRenderer::Render(int x, int y,
+                             wxArrayInt& known_pagebreaks,
+                             int from, int dont_render, int to)
 {
     int pbreak, hght;
 
     if (m_Cells == NULL || m_DC == NULL) return 0;
 
     pbreak = (int)(from + m_Height);
 {
     int pbreak, hght;
 
     if (m_Cells == NULL || m_DC == NULL) return 0;
 
     pbreak = (int)(from + m_Height);
-    while (m_Cells->AdjustPagebreak(&pbreak, known_pagebreaks, number_of_pages)) {}
+    while (m_Cells->AdjustPagebreak(&pbreak, known_pagebreaks)) {}
     hght = pbreak - from;
     if(to < hght)
         hght = to;
 
     hght = pbreak - from;
     if(to < hght)
         hght = to;
 
-
     if (!dont_render)
     {
         wxHtmlRenderingInfo rinfo;
         wxDefaultHtmlRenderingStyle rstyle;
         rinfo.SetStyle(&rstyle);
         m_DC->SetBrush(*wxWHITE_BRUSH);
     if (!dont_render)
     {
         wxHtmlRenderingInfo rinfo;
         wxDefaultHtmlRenderingStyle rstyle;
         rinfo.SetStyle(&rstyle);
         m_DC->SetBrush(*wxWHITE_BRUSH);
+        m_DC->SetClippingRegion(x, y, m_Width, hght);
         m_Cells->Draw(*m_DC,
                       x, (y - from),
         m_Cells->Draw(*m_DC,
                       x, (y - from),
-                      y, y + hght,
+                      y, pbreak + (y /*- from*/),
                       rinfo);
                       rinfo);
+        m_DC->DestroyClippingRegion();
     }
 
     if (pbreak < m_Cells->GetHeight()) return pbreak;
     }
 
     if (pbreak < m_Cells->GetHeight()) return pbreak;
@@ -142,7 +137,6 @@ int wxHtmlDCRenderer::Render(int x, int y, int from, int dont_render, int to, in
 }
 
 
 }
 
 
-
 int wxHtmlDCRenderer::GetTotalHeight()
 {
     if (m_Cells) return m_Cells->GetHeight();
 int wxHtmlDCRenderer::GetTotalHeight()
 {
     if (m_Cells) return m_Cells->GetHeight();
@@ -257,7 +251,7 @@ bool wxHtmlPrintout::OnBeginDocument(int startPage, int endPage)
 bool wxHtmlPrintout::OnPrintPage(int page)
 {
     wxDC *dc = GetDC();
 bool wxHtmlPrintout::OnPrintPage(int page)
 {
     wxDC *dc = GetDC();
-    if (dc)
+    if (dc && dc->IsOk())
     {
         if (HasPage(page))
             RenderPage(dc, page);
     {
         if (HasPage(page))
             RenderPage(dc, page);
@@ -270,16 +264,19 @@ bool wxHtmlPrintout::OnPrintPage(int page)
 void wxHtmlPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo)
 {
     *minPage = 1;
 void wxHtmlPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo)
 {
     *minPage = 1;
-    *maxPage = m_NumPages;
+    if ( m_NumPages >= (signed)m_PageBreaks.GetCount()-1)
+        *maxPage = m_NumPages;
+    else
+        *maxPage = (signed)m_PageBreaks.GetCount()-1;
     *selPageFrom = 1;
     *selPageFrom = 1;
-    *selPageTo = m_NumPages;
+    *selPageTo = (signed)m_PageBreaks.GetCount()-1;
 }
 
 
 
 bool wxHtmlPrintout::HasPage(int pageNum)
 {
 }
 
 
 
 bool wxHtmlPrintout::HasPage(int pageNum)
 {
-    return (pageNum >= 1 && pageNum <= m_NumPages);
+    return pageNum > 0 && (unsigned)pageNum < m_PageBreaks.GetCount();
 }
 
 
 }
 
 
@@ -365,16 +362,24 @@ void wxHtmlPrintout::CountPages()
     ppmm_v = (float)pageHeight / mm_h;
 
     int pos = 0;
     ppmm_v = (float)pageHeight / mm_h;
 
     int pos = 0;
-
     m_NumPages = 0;
     m_NumPages = 0;
+    // m_PageBreaks[0] = 0;
 
 
-    m_PageBreaks[0] = 0;
+    m_PageBreaks.Clear();
+    m_PageBreaks.Add( 0);
     do
     {
         pos = m_Renderer->Render((int)( ppmm_h * m_MarginLeft),
     do
     {
         pos = m_Renderer->Render((int)( ppmm_h * m_MarginLeft),
-                                   (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight),
-                                   pos, true, INT_MAX, m_PageBreaks, m_NumPages);
-        m_PageBreaks[++m_NumPages] = pos;
+                                 (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight),
+                                 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());
 }
 
     } while (pos < m_Renderer->GetTotalHeight());
 }
 
@@ -408,19 +413,20 @@ void wxHtmlPrintout::RenderPage(wxDC *dc, int page)
     dc->SetBackgroundMode(wxTRANSPARENT);
 
     m_Renderer->Render((int) (ppmm_h * m_MarginLeft),
     dc->SetBackgroundMode(wxTRANSPARENT);
 
     m_Renderer->Render((int) (ppmm_h * m_MarginLeft),
-                         (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight),
+                         (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight), m_PageBreaks,
                          m_PageBreaks[page-1], false, m_PageBreaks[page]-m_PageBreaks[page-1]);
 
                          m_PageBreaks[page-1], false, m_PageBreaks[page]-m_PageBreaks[page-1]);
 
+
     m_RendererHdr->SetDC(dc, (double)ppiPrinterY / (double)ppiScreenY);
     if (m_Headers[page % 2] != wxEmptyString)
     {
         m_RendererHdr->SetHtmlText(TranslateHeader(m_Headers[page % 2], page));
     m_RendererHdr->SetDC(dc, (double)ppiPrinterY / (double)ppiScreenY);
     if (m_Headers[page % 2] != wxEmptyString)
     {
         m_RendererHdr->SetHtmlText(TranslateHeader(m_Headers[page % 2], page));
-        m_RendererHdr->Render((int) (ppmm_h * m_MarginLeft), (int) (ppmm_v * m_MarginTop));
+        m_RendererHdr->Render((int) (ppmm_h * m_MarginLeft), (int) (ppmm_v * m_MarginTop), m_PageBreaks);
     }
     if (m_Footers[page % 2] != wxEmptyString)
     {
         m_RendererHdr->SetHtmlText(TranslateHeader(m_Footers[page % 2], page));
     }
     if (m_Footers[page % 2] != wxEmptyString)
     {
         m_RendererHdr->SetHtmlText(TranslateHeader(m_Footers[page % 2], page));
-        m_RendererHdr->Render((int) (ppmm_h * m_MarginLeft), (int) (pageHeight - ppmm_v * m_MarginBottom - m_FooterHeight));
+        m_RendererHdr->Render((int) (ppmm_h * m_MarginLeft), (int) (pageHeight - ppmm_v * m_MarginBottom - m_FooterHeight), m_PageBreaks);
     }
 }
 
     }
 }
 
@@ -434,9 +440,15 @@ wxString wxHtmlPrintout::TranslateHeader(const wxString& instr, int page)
     num.Printf(wxT("%i"), page);
     r.Replace(wxT("@PAGENUM@"), num);
 
     num.Printf(wxT("%i"), page);
     r.Replace(wxT("@PAGENUM@"), num);
 
-    num.Printf(wxT("%i"), m_NumPages);
+    num.Printf(wxT("%lu"), (unsigned long)(m_PageBreaks.GetCount() - 1));
     r.Replace(wxT("@PAGESCNT@"), num);
 
     r.Replace(wxT("@PAGESCNT@"), num);
 
+    const wxDateTime now = wxDateTime::Now();
+    r.Replace(wxT("@DATE@"), now.FormatDate());
+    r.Replace(wxT("@TIME@"), now.FormatTime());
+
+    r.Replace(wxT("@TITLE@"), GetTitle());
+
     return r;
 }
 
     return r;
 }
 
@@ -454,7 +466,7 @@ void wxHtmlPrintout::SetMargins(float top, float bottom, float left, float right
 
 
 
 
 
 
-void wxHtmlPrintout::SetFonts(wxString normal_face, wxString fixed_face,
+void wxHtmlPrintout::SetFonts(const wxString& normal_face, const wxString& fixed_face,
                               const int *sizes)
 {
     m_Renderer->SetFonts(normal_face, fixed_face, sizes);
                               const int *sizes)
 {
     m_Renderer->SetFonts(normal_face, fixed_face, sizes);
@@ -630,7 +642,7 @@ void wxHtmlEasyPrinting::SetFooter(const wxString& footer, int pg)
 }
 
 
 }
 
 
-void wxHtmlEasyPrinting::SetFonts(wxString normal_face, wxString fixed_face,
+void wxHtmlEasyPrinting::SetFonts(const wxString& normal_face, const wxString& fixed_face,
                                   const int *sizes)
 {
     m_fontMode = FontMode_Explicit;
                                   const int *sizes)
 {
     m_fontMode = FontMode_Explicit;