X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b6d93b260ee0e8a145b8965da7e8eef1fed17670..e8f60bac1ab18be00b4e433f5db7b0261c5f17da:/src/html/htmlcell.cpp diff --git a/src/html/htmlcell.cpp b/src/html/htmlcell.cpp index 7a4ff817a3..f378ce4a9e 100644 --- a/src/html/htmlcell.cpp +++ b/src/html/htmlcell.cpp @@ -7,7 +7,7 @@ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "htmlcell.h" #endif @@ -31,6 +31,7 @@ #include "wx/html/htmlwin.h" #include "wx/settings.h" #include "wx/module.h" +#include "wx/dynarray.h" #include @@ -67,14 +68,16 @@ void wxHtmlSelection::Set(const wxHtmlCell *fromCell, const wxHtmlCell *toCell) Set(p1, fromCell, p2, toCell); } -wxColour wxDefaultHtmlRenderingStyle::GetSelectedTextColour( - const wxColour& clr) +wxColour +wxDefaultHtmlRenderingStyle:: +GetSelectedTextColour(const wxColour& WXUNUSED(clr)) { return wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); } -wxColour wxDefaultHtmlRenderingStyle::GetSelectedTextBgColour( - const wxColour& WXUNUSED(clr)) +wxColour +wxDefaultHtmlRenderingStyle:: +GetSelectedTextBgColour(const wxColour& WXUNUSED(clr)) { return wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT); } @@ -158,16 +161,6 @@ void wxHtmlCell::Layout(int WXUNUSED(w)) -void wxHtmlCell::GetHorizontalConstraints(int *left, int *right) const -{ - if (left) - *left = m_PosX; - if (right) - *right = m_PosX + m_Width; -} - - - const wxHtmlCell* wxHtmlCell::Find(int WXUNUSED(condition), const void* WXUNUSED(param)) const { return NULL; @@ -383,6 +376,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 @@ -821,6 +815,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)) { @@ -1046,30 +1044,6 @@ void wxHtmlContainerCell::OnMouseClick(wxWindow *parent, int x, int y, const wxM -void wxHtmlContainerCell::GetHorizontalConstraints(int *left, int *right) const -{ - int cleft = m_PosX + m_Width, cright = m_PosX; // worst case - int l, r; - - for (wxHtmlCell *cell = m_Cells; cell; cell = cell->GetNext()) - { - cell->GetHorizontalConstraints(&l, &r); - if (l < cleft) - cleft = l; - if (r > cright) - cright = r; - } - - cleft -= (m_IndentLeft < 0) ? (-m_IndentLeft * m_Width / 100) : m_IndentLeft; - cright += (m_IndentRight < 0) ? (-m_IndentRight * m_Width / 100) : m_IndentRight; - - if (left) - *left = cleft; - if (right) - *right = cright; -} - - wxHtmlCell *wxHtmlContainerCell::GetFirstTerminal() const { if ( m_Cells ) @@ -1094,9 +1068,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 @@ -1104,6 +1083,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; + } + } + } + } + } +} + + // --------------------------------------------------------------------------