]> git.saurik.com Git - wxWidgets.git/commitdiff
don't distribute extra space between 0 width cells in justified paragraphs (this...
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 18 May 2004 21:55:29 +0000 (21:55 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 18 May 2004 21:55:29 +0000 (21:55 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27348 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/html/htmlcell.cpp

index 3bd6c6c2c3c5143b6b5c52c4834e29b8f1476d7d..dc3d29287c8be43ef7c10051bef18014c04de289 100644 (file)
@@ -637,7 +637,8 @@ void wxHtmlContainerCell::Layout(int w)
        return;
     }
 
        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;
     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)
             ypos += ysizeup;
 
             if (m_AlignHor != wxHTML_ALIGN_JUSTIFY || cell == NULL)
+            {
                 while (line != cell)
                 {
                     line->SetPos(line->GetPosX() + xdelta,
                                    ypos + line->GetPosY());
                     line = line->GetNext();
                 }
                 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();
+                    }
                 }
             }
 
                 }
             }