added tiered implementation (using draw paragraph) for stattext, corrected scrollbar paging, forced redraw before scrolling
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10671 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -57,11 +57,80 @@ bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
|
||||
return ret;
|
||||
}
|
||||
|
||||
const wxString punct = " ,.-;:!?";
|
||||
|
||||
void wxStaticText::DrawParagraph(wxDC &dc, wxString paragraph)
|
||||
{
|
||||
int x = 0 ;
|
||||
int y = 0 ;
|
||||
int i = 0 ;
|
||||
long width, height ;
|
||||
bool linedrawn = true;
|
||||
while( paragraph.Length() > 0 )
|
||||
{
|
||||
dc.GetTextExtent( paragraph , &width , &height ) ;
|
||||
|
||||
if ( width > m_width )
|
||||
{
|
||||
for ( int p = paragraph.Length() -1 ; p > 0 ; --p )
|
||||
{
|
||||
if ((punct.Find(paragraph[p]) != wxNOT_FOUND) || !linedrawn)
|
||||
{
|
||||
int blank = (paragraph[p] == ' ') ? 0 : 1;
|
||||
|
||||
dc.GetTextExtent( paragraph.Left(p + blank) , &width , &height ) ;
|
||||
|
||||
if ( width <= m_width )
|
||||
{
|
||||
int pos = x ;
|
||||
if ( HasFlag( wxALIGN_CENTER ) )
|
||||
{
|
||||
pos += ( m_width - width ) / 2 ;
|
||||
}
|
||||
else if ( HasFlag( wxALIGN_RIGHT ) )
|
||||
{
|
||||
pos += ( m_width - width ) ;
|
||||
}
|
||||
|
||||
dc.DrawText( paragraph.Left(p + blank), pos , y) ;
|
||||
y += height ;
|
||||
paragraph = paragraph.Mid(p+1) ;
|
||||
linedrawn = true;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
linedrawn = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
int pos = x ;
|
||||
if ( HasFlag( wxALIGN_CENTER ) )
|
||||
{
|
||||
pos += ( m_width - width ) / 2 ;
|
||||
}
|
||||
else if ( HasFlag( wxALIGN_RIGHT ) )
|
||||
{
|
||||
pos += ( m_width - width ) ;
|
||||
}
|
||||
|
||||
dc.DrawText( paragraph, pos , y) ;
|
||||
paragraph="";
|
||||
y += height ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void wxStaticText::OnDraw( wxDC &dc )
|
||||
{
|
||||
if (m_width <= 0 || m_height <= 0)
|
||||
return;
|
||||
|
||||
wxString paragraph;
|
||||
int i = 0 ;
|
||||
wxString text = m_label;
|
||||
|
||||
PrepareDC(dc);
|
||||
|
||||
bool doClear = true ;
|
||||
@@ -99,145 +168,17 @@ void wxStaticText::OnDraw( wxDC &dc )
|
||||
if ( doClear )
|
||||
dc.Clear() ;
|
||||
|
||||
int x = 0 ;
|
||||
int y = 0 ;
|
||||
wxString text = m_label ;
|
||||
wxString paragraph ;
|
||||
int i = 0 ;
|
||||
int laststop = 0 ;
|
||||
long width, height ;
|
||||
|
||||
while( i < text.Length() )
|
||||
{
|
||||
if( text[i] == 13 || text[i] == 10)
|
||||
{
|
||||
paragraph = text.Mid( laststop , i - laststop ) ;
|
||||
while( paragraph.Length() > 0 )
|
||||
{
|
||||
dc.GetTextExtent( paragraph , &width , &height ) ;
|
||||
if ( width > m_width )
|
||||
{
|
||||
for ( int p = paragraph.Length() -1 ; p > 0 ; --p )
|
||||
{
|
||||
if ( paragraph[p]=='.' )
|
||||
{
|
||||
dc.GetTextExtent( paragraph.Left(p+1) , &width , &height ) ;
|
||||
if ( width <= m_width )
|
||||
{
|
||||
int pos = x ;
|
||||
if ( HasFlag( wxALIGN_CENTER ) )
|
||||
{
|
||||
pos += ( m_width - width ) / 2 ;
|
||||
}
|
||||
else if ( HasFlag( wxALIGN_RIGHT ) )
|
||||
{
|
||||
pos += ( m_width - width ) ;
|
||||
}
|
||||
dc.DrawText( paragraph.Left(p+1), pos , y) ;
|
||||
y += height ;
|
||||
paragraph = paragraph.Mid(p+1) ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
if ( paragraph[p]==' ' )
|
||||
{
|
||||
dc.GetTextExtent( paragraph.Left(p) , &width , &height ) ;
|
||||
if ( width <= m_width )
|
||||
{
|
||||
int pos = x ;
|
||||
if ( HasFlag( wxALIGN_CENTER ) )
|
||||
{
|
||||
pos += ( m_width - width ) / 2 ;
|
||||
}
|
||||
else if ( HasFlag( wxALIGN_RIGHT ) )
|
||||
{
|
||||
pos += ( m_width - width ) ;
|
||||
}
|
||||
dc.DrawText( paragraph.Left(p), pos , y) ;
|
||||
y += height ;
|
||||
paragraph = paragraph.Mid(p+1) ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dc.DrawText( paragraph, x , y) ;
|
||||
paragraph="";
|
||||
y += height ;
|
||||
}
|
||||
}
|
||||
laststop = i+1 ;
|
||||
}
|
||||
++i ;
|
||||
}
|
||||
paragraph = text.Mid( laststop , text.Length() - laststop ) ;
|
||||
while( paragraph.Length() > 0 )
|
||||
while (i < text.Length())
|
||||
{
|
||||
dc.GetTextExtent( paragraph , &width , &height ) ;
|
||||
if ( width > m_width )
|
||||
{
|
||||
for ( int p = paragraph.Length() -1 ; p > 0 ; --p )
|
||||
{
|
||||
if ( paragraph[p]=='.' )
|
||||
{
|
||||
dc.GetTextExtent( paragraph.Left(p+1) , &width , &height ) ;
|
||||
if ( width <= m_width )
|
||||
{
|
||||
int pos = x ;
|
||||
if ( HasFlag( wxALIGN_CENTER ) )
|
||||
{
|
||||
pos += ( m_width - width ) / 2 ;
|
||||
}
|
||||
else if ( HasFlag( wxALIGN_RIGHT ) )
|
||||
{
|
||||
pos += ( m_width - width ) ;
|
||||
}
|
||||
dc.DrawText( paragraph.Left(p+1), pos , y) ;
|
||||
y += height ;
|
||||
paragraph = paragraph.Mid(p+1) ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
if ( paragraph[p]==' ' )
|
||||
{
|
||||
dc.GetTextExtent( paragraph.Left(p) , &width , &height ) ;
|
||||
if ( width <= m_width )
|
||||
{
|
||||
int pos = x ;
|
||||
if ( HasFlag( wxALIGN_CENTER ) )
|
||||
{
|
||||
pos += ( m_width - width ) / 2 ;
|
||||
}
|
||||
else if ( HasFlag( wxALIGN_RIGHT ) )
|
||||
{
|
||||
pos += ( m_width - width ) ;
|
||||
}
|
||||
dc.DrawText( paragraph.Left(p), pos , y) ;
|
||||
y += height ;
|
||||
paragraph = paragraph.Mid(p+1) ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int pos = x ;
|
||||
if ( HasFlag( wxALIGN_CENTER ) )
|
||||
{
|
||||
pos += ( m_width - width ) / 2 ;
|
||||
}
|
||||
else if ( HasFlag( wxALIGN_RIGHT ) )
|
||||
{
|
||||
pos += ( m_width - width ) ;
|
||||
}
|
||||
dc.DrawText( paragraph, pos , y) ;
|
||||
paragraph="";
|
||||
y += height ;
|
||||
}
|
||||
}
|
||||
paragraph += text[i];
|
||||
|
||||
if (text[i] == 13 || text[i] == 10)
|
||||
DrawParagraph(dc, paragraph);
|
||||
|
||||
++i;
|
||||
}
|
||||
if (paragraph.Length() > 0)
|
||||
DrawParagraph(dc, paragraph);
|
||||
}
|
||||
|
||||
void wxStaticText::OnPaint( wxPaintEvent &event )
|
||||
|
Reference in New Issue
Block a user