00001 #include "SdlArs.h"
00002
00003 namespace Ars
00004 {
00005 XTextBox::XTextBox( void )
00006 : vScrollBar( 0 )
00007 {
00008 vScrollBar = new XScrollBar();
00009 }
00010
00011 XTextBox::~XTextBox( void )
00012 {
00013 if( vScrollBar )
00014 delete vScrollBar;
00015 vScrollBar = 0;
00016 }
00017
00018 void XTextBox::Init( icstring &aStr )
00019 {
00020 XLabel::Init( aStr );
00021
00022 vScrollBar->SetFgColor( GetFgColor() );
00023 vScrollBar->SetBgColor( GetBgColor() );
00024 vScrollBar->SetFont( GetFont() );
00025 vScrollBar->SetState( S_SUNKEN );
00026 vScrollBar->SetFlags( F_NONE );
00027 icstring tmp = Rsrc::FindCrdOf( aStr, "scrollbar" );
00028 vScrollBar->Init( tmp );
00029
00030 vScrollBar->SetWindowRect( XRect( Right() - 20, y , 20 , Height() ) );
00031 }
00032
00033 const bool XTextBox::SetupWindow( const Message &msg )
00034 {
00035 XLabel::SetupWindow( msg );
00036
00037 vScrollBar->SetParent( this );
00038 vScrollBar->SetupWindow( msg );
00039
00040 MessageServer::Instance().RegisterMessageClient(this, Message::CTRL_VALUECHANGE);
00041 MessageServer::Instance().RegisterMessageClient(this, Message::CTRL_VALUECHANGING);
00042
00043 return true;
00044 }
00045
00046 void XTextBox::DrawBG( void )
00047 {
00048 w -= 21;
00049 XLabel::DrawBG();
00050 w += 21;
00051 }
00052
00053 void XTextBox::Draw(void)
00054 {
00055 w -= 21;
00056 XBox::Draw();
00057 w += 21;
00058 XRect r( GetClientRect() );
00059 r.w -= 21;
00060
00061 int iStartIndex = vScrollBar->GetPosition();
00062 int n = (Height() + GetFontSize() - 1) / GetFontSize();
00063
00064 for( int j = 0; j < n ; ++j )
00065 {
00066 int i = j + iStartIndex;
00067 if( i < (int)textList.size() )
00068 {
00069 XRect ItemRect( r.x , r.y + (i - iStartIndex) * GetFontSize() , r.Width() , GetFontSize() );
00070 if( ItemRect.Overlaps(r ) )
00071 {
00072 ItemRect.ClipTo( r );
00073 ItemRect.SetBottom(ItemRect.Bottom() - 1);
00074 ItemRect.Grow(-1);
00075 TextOutStr( ItemRect , textList[i] , GetFgColor() );
00076 }
00077 }
00078 }
00079 }
00080
00081 void XTextBox::SetWndText( const std::string &sWindowText )
00082 {
00083 XLabel::SetWndText( sWindowText );
00084
00085 textList.clear();
00086
00087 size_t n0 = 0 , n1 = sWindowText.find( '\n' , n0 );
00088 while( n1 != string::npos )
00089 {
00090 textList.push_back( sWindowText.substr( n0 , n1 - n0 ) );
00091 n0 = n1 + 1;
00092 n1 = sWindowText.find( '\n' , n0 );
00093 }
00094 int iMax = textList.size() + 1;
00095 int n = Height() / GetFontSize();
00096 iMax -= n;
00097 vScrollBar->SetLimits( 0 , max( 0 , iMax ) );
00098 SetDirty( true );
00099 }
00100
00101 void XTextBox::SetWindowRect( const XRect &WindowRect )
00102 {
00103 XLabel::SetWindowRect( WindowRect );
00104
00105 XRect ScrollbarRect( *this );
00106 ScrollbarRect.Grow(-1);
00107 vScrollBar->SetWindowRect( XRect( ScrollbarRect.Right() - 12 , ScrollbarRect.y , ScrollbarRect.Width(), ScrollbarRect.Height() ) );
00108 clientRect = XRect( 2 , 2 , Width() - 16 , Height() - 4 );
00109 }
00110
00111 const bool XTextBox::evValueChange( const CtrlMessage &msg )
00112 {
00113 bool ans = XLabel::evValueChange( msg );
00114
00115 if( !textList.empty() )
00116 {
00117 if( msg.source == vScrollBar )
00118 {
00119 SetDirty();
00120 ans = true;
00121 }
00122 }
00123 return ans;
00124 }
00125
00126 const bool XTextBox::evValueChanging( const CtrlMessage &msg )
00127 {
00128 bool ans = XLabel::evValueChanging( msg );
00129
00130 if( !textList.empty() )
00131 {
00132 if( msg.source == vScrollBar )
00133 {
00134 SetDirty();
00135 ans = true;
00136 }
00137 }
00138 return ans;
00139 }
00140
00141 }