]> git.saurik.com Git - wxWidgets.git/commitdiff
don't break lines in the middle of word
authorVáclav Slavík <vslavik@fastmail.fm>
Tue, 15 Jul 2003 18:39:09 +0000 (18:39 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Tue, 15 Jul 2003 18:39:09 +0000 (18:39 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22002 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/html/htmlcell.cpp
src/html/winpars.cpp

index bf9750d649d2d6ac0de23b843acf8dcbf556fb7d..7a4ff817a3fc46cbb77cf8b2a30323ba34092274 100644 (file)
@@ -264,8 +264,17 @@ wxHtmlWordCell::wxHtmlWordCell(const wxString& word, wxDC& dc) : wxHtmlCell()
     m_Word = word;
     dc.GetTextExtent(m_Word, &m_Width, &m_Height, &m_Descent);
     SetCanLiveOnPagebreak(FALSE);
+    m_allowLinebreak = true;
 }
 
+void wxHtmlWordCell::SetPreviousWord(wxHtmlWordCell *cell)
+{
+    if ( cell && m_Parent == cell->m_Parent &&
+         !wxIsspace(cell->m_Word.Last()) && !wxIsspace(m_Word[0u]) )
+    {
+        m_allowLinebreak = false;
+    }
+}
 
 // Splits m_Word into up to three parts according to selection, returns
 // substring before, in and after selection and the points (in relative coords)
@@ -629,9 +638,10 @@ void wxHtmlContainerCell::Layout(int w)
     }
 
     wxHtmlCell *cell = m_Cells, *line = m_Cells;
+    wxHtmlCell *nextCell;
     long xpos = 0, ypos = m_IndentTop;
     int xdelta = 0, ybasicpos = 0, ydiff;
-    int s_width, s_indent;
+    int s_width, nextWordWidth, s_indent;
     int ysizeup = 0, ysizedown = 0;
     int MaxLineWidth = 0;
     int xcnt = 0;
@@ -686,13 +696,27 @@ void wxHtmlContainerCell::Layout(int w)
         if (cell->GetDescent() + ydiff > ysizedown) ysizedown = cell->GetDescent() + ydiff;
         if (ybasicpos + cell->GetDescent() < -ysizeup) ysizeup = - (ybasicpos + cell->GetDescent());
 
+        // layout nonbreakable run of cells:
         cell->SetPos(xpos, ybasicpos + cell->GetDescent());
         xpos += cell->GetWidth();
         cell = cell->GetNext();
         xcnt++;
-
+            
+        // compute length of the next word that would be added:
+        nextWordWidth = 0;
+        if (cell)
+        {
+            nextCell = cell;
+            do
+            {
+                nextWordWidth += nextCell->GetWidth();
+                nextCell = nextCell->GetNext();
+            } while (nextCell && !nextCell->IsLinebreakAllowed());
+        }
+        
         // force new line if occured:
-        if ((cell == NULL) || (xpos + cell->GetWidth() > s_width))
+        if ((cell == NULL) || 
+            (xpos + nextWordWidth > s_width && cell->IsLinebreakAllowed()))
         {
             if (xpos > MaxLineWidth) MaxLineWidth = xpos;
             if (ysizeup < 0) ysizeup = 0;
index 8410b01988210c3b3a2e6eb868e1121d88ff8b96..ce73fbcfd4fc14e60eb6401c77fe02a01f71fcb3 100644 (file)
@@ -54,6 +54,7 @@ wxHtmlWinParser::wxHtmlWinParser(wxHtmlWindow *wnd) : wxHtmlParser()
     m_InputEnc = wxFONTENCODING_ISO8859_1;
     m_OutputEnc = wxFONTENCODING_DEFAULT;
 #endif
+    m_lastWordCell = NULL;
 
     {
         int i, j, k, l, m;
@@ -170,6 +171,7 @@ void wxHtmlWinParser::InitParser(const wxString& source)
     m_ActualColor.Set(0, 0, 0);
     m_Align = wxHTML_ALIGN_LEFT;
     m_tmpLastWasSpace = FALSE;
+    m_lastWordCell = NULL;
 
     OpenContainer();
     OpenContainer();
@@ -278,9 +280,6 @@ void wxHtmlWinParser::AddText(const wxChar* txt)
         {
             temp[templen-1] = wxT(' ');
             temp[templen] = 0;
-#if 0 // VS - WHY was this here?!
-            if (templen == 1) continue;
-#endif
             templen = 0;
 #if !wxUSE_UNICODE
             if (m_EncConv)
@@ -294,6 +293,8 @@ void wxHtmlWinParser::AddText(const wxChar* txt)
             if (m_UseLink)
                 c->SetLink(m_Link);
             m_Container->InsertCell(c);
+            ((wxHtmlWordCell*)c)->SetPreviousWord(m_lastWordCell);
+            m_lastWordCell = (wxHtmlWordCell*)c;
             m_tmpLastWasSpace = TRUE;
         }
     }
@@ -313,6 +314,8 @@ void wxHtmlWinParser::AddText(const wxChar* txt)
         if (m_UseLink)
             c->SetLink(m_Link);
         m_Container->InsertCell(c);
+        ((wxHtmlWordCell*)c)->SetPreviousWord(m_lastWordCell);
+        m_lastWordCell = (wxHtmlWordCell*)c;
         m_tmpLastWasSpace = FALSE;
     }
 }