don't break lines in the middle of word

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22002 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík 2003-07-15 18:39:09 +00:00
parent 8ba2f3ec94
commit b6d93b260e
2 changed files with 33 additions and 6 deletions

View 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;

View 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;
}
}