]> git.saurik.com Git - wxWidgets.git/commitdiff
preparing for HTML printing
authorVáclav Slavík <vslavik@fastmail.fm>
Sun, 10 Oct 1999 20:17:42 +0000 (20:17 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Sun, 10 Oct 1999 20:17:42 +0000 (20:17 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3919 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/html/htmlcell.h
include/wx/html/htmldefs.h
src/html/htmlcell.cpp
src/html/m_image.cpp

index 7d725e29e170db30f2dcb59f560e5cb609de89f9..862f7ebebbf5f9ec24b91a455b2e1b06cb6531f7 100644 (file)
@@ -38,7 +38,7 @@ class wxHtmlContainerCell;
 class WXDLLEXPORT wxHtmlCell : public wxObject
 {
     public:
-        wxHtmlCell() : wxObject() {m_Next = NULL; m_Parent = NULL; m_Width = m_Height = m_Descent = 0;};
+        wxHtmlCell() : wxObject() {m_Next = NULL; m_Parent = NULL; m_Width = m_Height = m_Descent = 0; m_CanLiveOnPagebreak = TRUE;}
         virtual ~wxHtmlCell() {if (m_Next) delete m_Next;};
 
         void SetParent(wxHtmlContainerCell *p) {m_Parent = p;}
@@ -94,6 +94,20 @@ class WXDLLEXPORT wxHtmlCell : public wxObject
                 // Parent is pointer to wxHtmlWindow that generated the event
                 // HINT: if this handling is not enough for you you should use
                 //       wxHtmlBinderCell
+                
+        virtual bool AdjustPagebreak(int *pagebreak);
+                // This method used to adjust pagebreak position. The parameter is
+                // variable that contains y-coordinate of page break (= horizontal line that
+                // should not be crossed by words, images etc.). If this cell cannot be divided
+                // into two pieces (each one on another page) then it moves the pagebreak
+                // few pixels up.
+                //
+                // Returned value : true if pagebreak was modified, false otherwise
+                // Usage : while (container->AdjustPagebreak(&p)) {}
+                
+        void SetCanLiveOnPagebreak(bool can) {m_CanLiveOnPagebreak = can;}
+                // Sets cell's behaviour on pagebreaks (see AdjustPagebreak). Default
+                // is true - the cell can be split on two pages
 
 
     protected:
@@ -108,6 +122,8 @@ class WXDLLEXPORT wxHtmlCell : public wxObject
                 // position where the fragment is drawn
         wxString m_Link;
                 // destination address if this fragment is hypertext link, "" otherwise
+        bool m_CanLiveOnPagebreak;
+                // true if this cell can be placed on pagebreak, false otherwise
 
 };
 
@@ -175,6 +191,7 @@ class WXDLLEXPORT wxHtmlContainerCell : public wxHtmlCell
         virtual void Layout(int w);
         virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
         virtual void DrawInvisible(wxDC& dc, int x, int y);
+        virtual bool AdjustPagebreak(int *pagebreak);
 
         void InsertCell(wxHtmlCell *cell);
                 // insert cell at the end of m_Cells list
index 6b0e43dbafddd762a59ce4c1391242808fd998cc..fb316d43baa308750c2f1eb27f60c2e2bd34a5a5 100644 (file)
@@ -77,8 +77,8 @@
        
 #define HTML_COND_ISIMAGEMAP            2
         // Finds imagemap of 'param' name (pointer to wxString).
-       // (used exclusively by mod_image.cpp)
-
+       // (used exclusively by m_image.cpp)
+       
 #define HTML_COND_USER              10000
         // User-defined conditions should start from this number
 
@@ -94,6 +94,8 @@
     /* size of temporary buffer used during parsing */
 #define HTML_REALLOC_STEP              32
     /* steps of array reallocation */
+#define HTML_PRINT_MAX_PAGES          999
+    /* maximum number of pages printable via html printing */
 
 #endif
 #endif
index dd4e4502a76f37f468d0c079eeb5a3a25e8eb8ef..ac40ae3c7f4389f0eb401ed8b9d0cce5e96aea76 100644 (file)
@@ -46,6 +46,25 @@ void wxHtmlCell::OnMouseClick(wxWindow *parent, int x, int y,
 
 
 
+bool wxHtmlCell::AdjustPagebreak(int *pagebreak)
+{
+
+    if ((!m_CanLiveOnPagebreak) && 
+                m_PosY < *pagebreak && m_PosY + m_Height >= *pagebreak) {
+        *pagebreak = m_PosY;
+        if (m_Next != NULL) m_Next -> AdjustPagebreak(pagebreak);
+        return TRUE;
+    }
+    
+    else {
+        if (m_Next != NULL) return m_Next -> AdjustPagebreak(pagebreak);
+        else return FALSE;
+    }
+}
+
+
+
+
 //-----------------------------------------------------------------------------
 // wxHtmlWordCell
 //-----------------------------------------------------------------------------
@@ -59,6 +78,7 @@ wxHtmlWordCell::wxHtmlWordCell(const wxString& word, wxDC& dc) : wxHtmlCell()
     m_Word.Replace("&gt;", ">", TRUE);
     m_Word.Replace("&amp;", "&", TRUE);
     dc.GetTextExtent(m_Word, &m_Width, &m_Height, &m_Descent);
+    SetCanLiveOnPagebreak(FALSE);
 }
 
 
@@ -129,6 +149,24 @@ int wxHtmlContainerCell::GetIndentUnits(int ind) const
 
 
 
+bool wxHtmlContainerCell::AdjustPagebreak(int *pagebreak)
+{
+    if (!m_CanLiveOnPagebreak) 
+        return wxHtmlCell::AdjustPagebreak(pagebreak);
+    else {
+        wxHtmlCell *c = GetFirstCell();
+        bool rt = FALSE;
+
+        while (c) {
+            if (c -> AdjustPagebreak(pagebreak)) rt = TRUE;
+            c = c -> GetNext();
+        }
+        return rt;
+    }
+}
+
+
+
 void wxHtmlContainerCell::Layout(int w)
 {
     wxHtmlCell *cell = m_Cells, *line = m_Cells;
index 60bb5f5734489dc94e48dc67fafcb454ff2df131..5fb966afa421de3933f56644cc27652695a4a2c4 100644 (file)
@@ -321,6 +321,7 @@ wxHtmlImageCell::wxHtmlImageCell(wxFSFile *input, int w, int h, int align, wxStr
 
     m_ImageMap = NULL;
     m_MapName = mapname;
+    SetCanLiveOnPagebreak(FALSE);
 }