X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a1ae1090eebbc49d8495c3d3464457277af846db..88db1d64cb9e20de436a3503952dc9303060c33a:/src/html/htmlcell.cpp diff --git a/src/html/htmlcell.cpp b/src/html/htmlcell.cpp index dc3d29287c..90dfc46e46 100644 --- a/src/html/htmlcell.cpp +++ b/src/html/htmlcell.cpp @@ -4,7 +4,7 @@ // Author: Vaclav Slavik // RCS-ID: $Id$ // Copyright: (c) 1999 Vaclav Slavik -// Licence: wxWindows Licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) @@ -94,7 +94,7 @@ wxHtmlCell::wxHtmlCell() : wxObject() m_Next = NULL; m_Parent = NULL; m_Width = m_Height = m_Descent = 0; - m_CanLiveOnPagebreak = TRUE; + m_CanLiveOnPagebreak = true; m_Link = NULL; } @@ -139,10 +139,10 @@ bool wxHtmlCell::AdjustPagebreak(int *pagebreak, int* WXUNUSED(known_pagebreaks) m_PosY < *pagebreak && m_PosY + m_Height > *pagebreak) { *pagebreak = m_PosY; - return TRUE; + return true; } - return FALSE; + return false; } @@ -260,7 +260,7 @@ wxHtmlWordCell::wxHtmlWordCell(const wxString& word, wxDC& dc) : wxHtmlCell() { m_Word = word; dc.GetTextExtent(m_Word, &m_Width, &m_Height, &m_Descent); - SetCanLiveOnPagebreak(FALSE); + SetCanLiveOnPagebreak(false); m_allowLinebreak = true; } @@ -283,7 +283,7 @@ void wxHtmlWordCell::Split(wxDC& dc, wxPoint pt1 = (selFrom == wxDefaultPosition) ? wxDefaultPosition : selFrom - GetAbsPos(); wxPoint pt2 = (selTo == wxDefaultPosition) ? - wxPoint(m_Width, -1) : selTo - GetAbsPos(); + wxPoint(m_Width, wxDefaultPosition.y) : selTo - GetAbsPos(); wxCoord charW, charH; unsigned len = m_Word.length(); @@ -381,7 +381,7 @@ void wxHtmlWordCell::Draw(wxDC& dc, int x, int y, { #if 0 // useful for debugging dc.SetPen(*wxBLACK_PEN); - dc.DrawRectangle(x+m_PosX,y+m_PosY,m_Width,m_Height); + dc.DrawRectangle(x+m_PosX,y+m_PosY,m_Width /* VZ: +1? */ ,m_Height); #endif bool drawSelectionAfterCell = false; @@ -535,8 +535,8 @@ wxHtmlContainerCell::wxHtmlContainerCell(wxHtmlContainerCell *parent) : wxHtmlCe m_AlignVer = wxHTML_ALIGN_BOTTOM; m_IndentLeft = m_IndentRight = m_IndentTop = m_IndentBottom = 0; m_WidthFloat = 100; m_WidthFloatUnits = wxHTML_UNITS_PERCENT; - m_UseBkColour = FALSE; - m_UseBorder = FALSE; + m_UseBkColour = false; + m_UseBorder = false; m_MinHeight = 0; m_MinHeightAlign = wxHTML_ALIGN_TOP; m_LastLayout = -1; @@ -581,7 +581,7 @@ int wxHtmlContainerCell::GetIndent(int ind) const int wxHtmlContainerCell::GetIndentUnits(int ind) const { - bool p = FALSE; + bool p = false; if (ind & wxHTML_INDENT_LEFT) p = m_IndentLeft < 0; else if (ind & wxHTML_INDENT_RIGHT) p = m_IndentRight < 0; else if (ind & wxHTML_INDENT_TOP) p = m_IndentTop < 0; @@ -600,13 +600,13 @@ bool wxHtmlContainerCell::AdjustPagebreak(int *pagebreak, int* known_pagebreaks, else { wxHtmlCell *c = GetFirstChild(); - bool rt = FALSE; + bool rt = false; int pbrk = *pagebreak - m_PosY; while (c) { if (c->AdjustPagebreak(&pbrk, known_pagebreaks, number_of_pages)) - rt = TRUE; + rt = true; c = c->GetNext(); } if (rt) @@ -645,7 +645,6 @@ void wxHtmlContainerCell::Layout(int w) int s_width, nextWordWidth, s_indent; int ysizeup = 0, ysizedown = 0; int MaxLineWidth = 0; - int xcnt = 0; int curLineWidth = 0; m_MaxTotalWidth = 0; @@ -717,7 +716,6 @@ void wxHtmlContainerCell::Layout(int w) curLineWidth += cell->GetMaxTotalWidth(); cell = cell->GetNext(); - xcnt++; // compute length of the next word that would be added: nextWordWidth = 0; @@ -772,29 +770,47 @@ void wxHtmlContainerCell::Layout(int w) // an added complication is that some cells have fixed size and // shouldn't get any increment (it so happens that these cells // also don't allow line break on them which provides with an - // easy way to test for this) + // easy way to test for this) -- and neither should the cells + // adjacent to them as this could result in a visible space + // between two cells separated by, e.g. font change, cell which + // is wrong - const int step = s_width - xpos; + int step = s_width - xpos; if ( step > 0 ) { // first count the cells which will get extra space int total = 0; - for ( wxHtmlCell *c = line; c != cell; c = c->GetNext() ) + + const wxHtmlCell *c, + *prev = NULL, + *next wxDUMMY_INITIALIZE(NULL); + for ( c = line; c != cell; prev = c, c = next ) { - if ( c->IsLinebreakAllowed() ) + next = c->GetNext(); + if ( c->IsLinebreakAllowed() && + (next == cell || next->IsLinebreakAllowed()) && + (!prev || prev->IsLinebreakAllowed()) ) + { total++; + } } // and now extra space to those cells which merit it if ( total ) { - for ( int n = 0; line != cell; line = line->GetNext() ) + prev = + next = NULL; + for ( int n = 0; line != cell; prev = line, line = line->GetNext() ) { line->SetPos(line->GetPosX() + s_indent + ((n * step) / total), line->GetPosY() + ypos); - if ( line->IsLinebreakAllowed() ) + next = line->GetNext(); + if ( line->IsLinebreakAllowed() && + (next == cell || + next->IsLinebreakAllowed()) && + (!prev || prev->IsLinebreakAllowed()) ) { // offset the next cell relative to this one // thus increasing our size @@ -802,8 +818,14 @@ void wxHtmlContainerCell::Layout(int w) } } } + else + { + // this will cause the code to enter "else branch" below: + step = 0; + } } - else // no extra space to distribute + // else branch: + if ( step <= 0 ) // no extra space to distribute { // just set the indent properly while (line != cell) @@ -816,7 +838,7 @@ void wxHtmlContainerCell::Layout(int w) } ypos += ysizedown; - xpos = xcnt = 0; + xpos = 0; ysizeup = ysizedown = 0; line = cell; }