From a1ae1090eebbc49d8495c3d3464457277af846db Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 18 May 2004 21:55:29 +0000 Subject: [PATCH] don't distribute extra space between 0 width cells in justified paragraphs (this looks visually wrong) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27348 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/html/htmlcell.cpp | 61 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/src/html/htmlcell.cpp b/src/html/htmlcell.cpp index 3bd6c6c2c3..dc3d29287c 100644 --- a/src/html/htmlcell.cpp +++ b/src/html/htmlcell.cpp @@ -637,7 +637,8 @@ void wxHtmlContainerCell::Layout(int w) return; } - wxHtmlCell *cell = m_Cells, *line = m_Cells; + wxHtmlCell *cell = m_Cells, + *line = m_Cells; wxHtmlCell *nextCell; long xpos = 0, ypos = m_IndentTop; int xdelta = 0, ybasicpos = 0, ydiff; @@ -755,24 +756,62 @@ void wxHtmlContainerCell::Layout(int w) ypos += ysizeup; if (m_AlignHor != wxHTML_ALIGN_JUSTIFY || cell == NULL) + { while (line != cell) { line->SetPos(line->GetPosX() + xdelta, ypos + line->GetPosY()); line = line->GetNext(); } - else + } + else // align == justify { - int counter = 0; - int step = (s_width - xpos); - if (step < 0) step = 0; - xcnt--; - if (xcnt > 0) while (line != cell) + // we have to distribute the extra horz space between the cells + // on this line + + // 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) + + const int step = s_width - xpos; + if ( step > 0 ) { - line->SetPos(line->GetPosX() + s_indent + - (counter++ * step / xcnt), - ypos + line->GetPosY()); - line = line->GetNext(); + // first count the cells which will get extra space + int total = 0; + for ( wxHtmlCell *c = line; c != cell; c = c->GetNext() ) + { + if ( c->IsLinebreakAllowed() ) + total++; + } + + // and now extra space to those cells which merit it + if ( total ) + { + for ( int n = 0; line != cell; line = line->GetNext() ) + { + line->SetPos(line->GetPosX() + s_indent + + ((n * step) / total), + line->GetPosY() + ypos); + + if ( line->IsLinebreakAllowed() ) + { + // offset the next cell relative to this one + // thus increasing our size + n++; + } + } + } + } + else // no extra space to distribute + { + // just set the indent properly + while (line != cell) + { + line->SetPos(line->GetPosX() + s_indent, + line->GetPosY() + ypos); + line = line->GetNext(); + } } } -- 2.45.2