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;
}