From: Václav Slavík Date: Thu, 17 Jul 2003 12:11:10 +0000 (+0000) Subject: remove extra space at top and bottom of the page if present X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/ace0fab4f1207124c8d3e4fcf552e596ff9dc470?ds=sidebyside remove extra space at top and bottom of the page if present git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22041 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/html/htmlcell.h b/include/wx/html/htmlcell.h index 3404b1592c..61e748c14d 100644 --- a/include/wx/html/htmlcell.h +++ b/include/wx/html/htmlcell.h @@ -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, diff --git a/include/wx/html/winpars.h b/include/wx/html/winpars.h index 5735e2c3cb..fc687c495d 100644 --- a/include/wx/html/winpars.h +++ b/include/wx/html/winpars.h @@ -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 */ diff --git a/src/html/htmlcell.cpp b/src/html/htmlcell.cpp index 4df9e7bc2a..4f71ab0fdf 100644 --- a/src/html/htmlcell.cpp +++ b/src/html/htmlcell.cpp @@ -31,6 +31,7 @@ #include "wx/html/htmlwin.h" #include "wx/settings.h" #include "wx/module.h" +#include "wx/dynarray.h" #include @@ -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; + } + } + } + } + } +} + + // -------------------------------------------------------------------------- diff --git a/src/html/winpars.cpp b/src/html/winpars.cpp index ce73fbcfd4..aeb866827a 100644 --- a/src/html/winpars.cpp +++ b/src/html/winpars.cpp @@ -208,6 +208,8 @@ wxObject* wxHtmlWinParser::GetProduct() top = m_Container; while (top->GetParent()) top = top->GetParent(); + top->RemoveExtraSpacing(true, true); + return top; }