]> git.saurik.com Git - wxWidgets.git/commitdiff
remove extra space at top and bottom of the page if present
authorVáclav Slavík <vslavik@fastmail.fm>
Thu, 17 Jul 2003 12:11:10 +0000 (12:11 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Thu, 17 Jul 2003 12:11:10 +0000 (12:11 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22041 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/html/htmlcell.h
include/wx/html/winpars.h
src/html/htmlcell.cpp
src/html/winpars.cpp

index 3404b1592c2e2a699f10c4b24e96608343d27d31..61e748c14d015cf54d40954edf7650b9b5d722ce 100644 (file)
@@ -418,6 +418,11 @@ public:
     
     virtual wxHtmlCell *GetFirstTerminal() const;
     virtual wxHtmlCell *GetLastTerminal() const;
+    
+    
+    // Removes indentation on top or bottom of the container (i.e. above or
+    // below first/last terminal cell). For internal use only.
+    void RemoveExtraSpacing(bool top, bool bottom);
 
 protected:
     void UpdateRenderingStatePre(wxHtmlRenderingInfo& info,
index 5735e2c3cb819957f09cd95944aa0fd2a47984be..fc687c495deeb55244461b54a474b8deba6d755f 100644 (file)
@@ -145,7 +145,7 @@ private:
             // This list is used to initialize m_Handlers member.
 
     wxHtmlContainerCell *m_Container;
-            // actual container. See Open/CloseContainer for details.
+            // current container. See Open/CloseContainer for details.
 
     int m_FontBold, m_FontItalic, m_FontUnderlined, m_FontFixed; // this is not TRUE,FALSE but 1,0, we need it for indexing
     int m_FontSize; /* -2 to +4,  0 is default */
index 4df9e7bc2a842a3cf69cfabfc05d293ac795ccf1..4f71ab0fdf7b4ededb27b0d12c1d4d782f73dbc1 100644 (file)
@@ -31,6 +31,7 @@
 #include "wx/html/htmlwin.h"
 #include "wx/settings.h"
 #include "wx/module.h"
+#include "wx/dynarray.h"
 
 #include <stdlib.h>
 
@@ -373,6 +374,7 @@ void wxHtmlWordCell::Draw(wxDC& dc, int x, int y,
                           wxHtmlRenderingInfo& info)
 {
 #if 0 // useful for debugging
+    dc.SetPen(*wxBLACK_PEN);
     dc.DrawRectangle(x+m_PosX,y+m_PosY,m_Width,m_Height);
 #endif
 
@@ -811,6 +813,10 @@ void wxHtmlContainerCell::UpdateRenderingStatePost(wxHtmlRenderingInfo& info,
 void wxHtmlContainerCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2,
                                wxHtmlRenderingInfo& info)
 {
+#if 0 // useful for debugging
+    dc.SetPen(*wxRED_PEN);
+    dc.DrawRectangle(x+m_PosX,y+m_PosY,m_Width,m_Height);
+#endif
     // container visible, draw it:
     if ((y + m_PosY <= view_y2) && (y + m_PosY + m_Height > view_y1))
     {
@@ -1060,9 +1066,14 @@ wxHtmlCell *wxHtmlContainerCell::GetLastTerminal() const
         if ( c )
             return c;
 
+        wxHtmlCell *ctmp;
         wxHtmlCell *c2 = NULL;
         for (c = m_Cells; c; c = c->GetNext())
-            c2 = c->GetLastTerminal();
+        {
+            ctmp = c->GetLastTerminal();
+            if ( ctmp )
+                c2 = ctmp;
+        }
         return c2;
     }
     else
@@ -1070,6 +1081,84 @@ wxHtmlCell *wxHtmlContainerCell::GetLastTerminal() const
 }
 
 
+static bool IsEmptyContainer(wxHtmlContainerCell *cell)
+{
+    for ( wxHtmlCell *c = cell->GetFirstChild(); c; c = c->GetNext() )
+    {
+        if ( !c->IsTerminalCell() || !c->IsFormattingCell() )
+            return false;
+    }
+    return true;
+}
+
+void wxHtmlContainerCell::RemoveExtraSpacing(bool top, bool bottom)
+{   
+    if ( top )
+        SetIndent(0, wxHTML_INDENT_TOP);
+    if ( bottom )
+        SetIndent(0, wxHTML_INDENT_BOTTOM);
+
+    if ( m_Cells )
+    {
+        wxHtmlCell *c;
+        wxHtmlContainerCell *cont;
+        if ( top )
+        {
+            for ( c = m_Cells; c; c = c->GetNext() )
+            {
+                if ( c->IsTerminalCell() )
+                {
+                    if ( !c->IsFormattingCell() )
+                        break;
+                }
+                else
+                {
+                    cont = (wxHtmlContainerCell*)c;
+                    if ( IsEmptyContainer(cont) )
+                    {
+                        cont->SetIndent(0, wxHTML_INDENT_VERTICAL);
+                    }
+                    else
+                    {
+                        cont->RemoveExtraSpacing(true, false);
+                        break;
+                    }
+                }
+            }
+        }
+        
+        if ( bottom )
+        {
+            wxArrayPtrVoid arr;
+            for ( c = m_Cells; c; c = c->GetNext() )
+                arr.Add((void*)c);
+           
+            for ( int i = arr.GetCount() - 1; i >= 0; i--)
+            {
+                c = (wxHtmlCell*)arr[i];
+                if ( c->IsTerminalCell() )
+                {
+                    if ( !c->IsFormattingCell() )
+                        break;
+                }
+                else
+                {
+                    cont = (wxHtmlContainerCell*)c;
+                    if ( IsEmptyContainer(cont) )
+                    {
+                        cont->SetIndent(0, wxHTML_INDENT_VERTICAL);                                 }
+                    else
+                    {
+                        cont->RemoveExtraSpacing(false, true);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+}
+
+
 
 
 // --------------------------------------------------------------------------
index ce73fbcfd4fc14e60eb6401c77fe02a01f71fcb3..aeb866827a84af764d5a3aaf8da89ccd36909814 100644 (file)
@@ -208,6 +208,8 @@ wxObject* wxHtmlWinParser::GetProduct()
 
     top = m_Container;
     while (top->GetParent()) top = top->GetParent();
+    top->RemoveExtraSpacing(true, true);
+
     return top;
 }