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
This commit is contained in:
Václav Slavík 2003-07-17 12:11:10 +00:00
parent ef1b8570d5
commit ace0fab4f1
4 changed files with 98 additions and 2 deletions

View 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,

View 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 */

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

View File

@ -208,6 +208,8 @@ wxObject* wxHtmlWinParser::GetProduct()
top = m_Container;
while (top->GetParent()) top = top->GetParent();
top->RemoveExtraSpacing(true, true);
return top;
}