void RichLabel::SplitLabel( const Gwen::UnicodeString & text, Gwen::Font* pFont, const DividedText & txt, int & x, int & y, int & lineheight ) { Gwen::Utility::Strings::UnicodeList lst; Gwen::Utility::Strings::Split( text, U" ", lst, true ); if ( lst.size() == 0 ) { return; } int iSpaceLeft = Width() - x; // Does the whole word fit in? { Gwen::Point StringSize = GetSkin()->GetRender()->MeasureText( pFont, text ); if ( iSpaceLeft > StringSize.x ) { return CreateLabel( text, txt, x, y, lineheight, true ); } } // If the first word is bigger than the line, just give up. { Gwen::Point WordSize = GetSkin()->GetRender()->MeasureText( pFont, lst[0] ); if ( WordSize.x >= iSpaceLeft ) { CreateLabel( lst[0], txt, x, y, lineheight, true ); if ( lst[0].size() >= text.size() ) { return; } Gwen::UnicodeString LeftOver = text.substr( lst[0].size() + 1 ); return SplitLabel( LeftOver, pFont, txt, x, y, lineheight ); } } Gwen::UnicodeString strNewString = U""; for ( size_t i = 0; i < lst.size(); i++ ) { Gwen::Point WordSize = GetSkin()->GetRender()->MeasureText( pFont, strNewString + lst[i] ); if ( WordSize.x > iSpaceLeft ) { CreateLabel( strNewString, txt, x, y, lineheight, true ); x = 0; y += lineheight; break;; } strNewString += lst[i]; } if ( strNewString.size() >= text.size() ) return; Gwen::UnicodeString LeftOver = text.substr( strNewString.size() + 1 ); return SplitLabel( LeftOver, pFont, txt, x, y, lineheight ); }
void TextBox::InsertText( const Gwen::UnicodeString& strInsert ) { // TODO: Make sure fits (implement maxlength) if ( HasSelection() ) { EraseSelection(); } if ( m_iCursorPos > TextLength() ) m_iCursorPos = TextLength(); if ( !IsTextAllowed( strInsert, m_iCursorPos ) ) return; UnicodeString str = GetText(); str.insert( m_iCursorPos, strInsert ); SetText( str ); m_iCursorPos += (int) strInsert.size(); m_iCursorEnd = m_iCursorPos; RefreshCursorBounds(); }