00001
00002 #include "wxImageBrowserWdg.h"
00003
00004 #include <math.h>
00005
00006 #include <mathdefs.h>
00007
00008 BEGIN_EVENT_TABLE( wxImageBrowserWdg, wxScrolledWindow )
00009 EVT_LEFT_UP( wxImageBrowserWdg::OnMouseLeftClick )
00010 EVT_RIGHT_UP( wxImageBrowserWdg::OnMouseRightClick )
00011 EVT_SIZE( wxImageBrowserWdg::OnSize )
00012 END_EVENT_TABLE( );
00013
00014 wxImageBrowserWdg::wxImageBrowserWdg(
00015 wxWindow* parent,
00016 wxWindowID id,
00017 int sx,
00018 int sy,
00019 int gap,
00020 const wxPoint& pos,
00021 const wxSize& size,
00022 long style,
00023 const wxString& name
00024 )
00025 : wxScrolledWindow( parent, id, pos, size, style, name )
00026 {
00027 _sx = sx;
00028 _sy = sy;
00029 _gap = gap;
00030 _first_selected = -1;
00031 _last_selected = -1;
00032 _ima_list.RemoveAll( );
00033 _ima_list.Create( _sx, _sy );
00034 _nrs_list.Clear( );
00035
00036 }
00037
00038 void wxImageBrowserWdg::SetVolume(
00039 unsigned short*** volume,
00040 wxArrayString& names,
00041 int width,
00042 int height,
00043 int depth,
00044 int min,
00045 int max
00046 )
00047 {
00048 wxImage tmpI;
00049 unsigned char value;
00050 unsigned char* data;
00051
00052
00053 tmpI.Create( width, height );
00054 _nrs_list = names;
00055
00056
00057 _ima_list.RemoveAll( );
00058 _ima_list.Create( _sx, _sy );
00059
00060 for( int k = 0; k < depth; k++ )
00061 {
00062
00063 data = tmpI.GetData();
00064 data += 3*width*height;
00065
00066 for ( int i = 0; i < width; i++ )
00067 {
00068 for ( int j = 0; j < height; j++ )
00069 {
00070 value = ( unsigned char )( 0x00ff*( volume[ k ][ i ][ height - j - 1] - min) / (max - min));
00071 data -= 3;
00072 data[0] = value;
00073 data[1] = value;
00074 data[2] = value;
00075
00076 }
00077 }
00078
00079
00080
00081 _ima_list.Add( wxBitmap( tmpI.Scale( _sx, _sy ) ) );
00082 }
00083
00084
00085 #ifdef __WXMSW__
00086 this->OnSize( wxSizeEvent( ) );
00087 #else
00088 wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
00089 this->OnSize(myevent);
00090 this->Show(true);
00091 #endif
00092 }
00093
00094
00095
00096 void wxImageBrowserWdg::SetScaleX( int sx )
00097 {
00098 _sx = sx;
00099
00100 }
00101
00102 void wxImageBrowserWdg::SetScaleY( int sy )
00103 {
00104 _sy = sy;
00105
00106 }
00107
00108 void wxImageBrowserWdg::SetGap( int gap )
00109 {
00110 _gap = gap;
00111
00112 }
00113
00114 int wxImageBrowserWdg::GetScaleX( )
00115 {
00116 return( _sx );
00117
00118 }
00119
00120 int wxImageBrowserWdg::GetScaleY( )
00121 {
00122 return( _sy );
00123
00124 }
00125
00126 int wxImageBrowserWdg::GetGap( )
00127 {
00128 return( _gap );
00129
00130 }
00131
00132 int wxImageBrowserWdg::GetFirst( )
00133 {
00134 return( GTM_MIN( _first_selected, _last_selected ) );
00135
00136 }
00137
00138 int wxImageBrowserWdg::GetLast( )
00139 {
00140 return( GTM_MAX( _first_selected, _last_selected ) );
00141
00142 }
00143
00144 void wxImageBrowserWdg::GetSizeParameters( int* n, int* c, int* r )
00145 {
00146 wxSize sz = this->GetClientSize( );
00147
00148 *n = _ima_list.GetImageCount( );
00149 *c = ( int )floor( ( double )( sz.GetWidth( ) ) / ( double )( _gap + _sx ) );
00150 *c = ( *c <= 0 )? 1: *c;
00151 *r = ( int )ceil( ( double )( *n ) / ( double )( *c ) );
00152
00153 }
00154
00155 void wxImageBrowserWdg::OnDraw( wxDC& dc )
00156 {
00157 int r, c, i, x, y, n, rt;
00158 wxSize sz = this->GetClientSize( );
00159
00160 dc.SetTextForeground( wxColour( 255, 255, 0 ) );
00161 dc.SetBrush( *wxTRANSPARENT_BRUSH );
00162
00163 this->GetSizeParameters( &n, &c, &r );
00164 for( i = 0; i < n; i++ )
00165 {
00166 rt = ( int )floor( ( double )i / ( double )c );
00167 x = ( _sx * ( i % c ) ) + ( ( ( i % c ) + 1 ) * _gap );
00168 y = ( _sy * ( rt % r ) ) + ( ( ( rt % r ) + 1 ) * _gap );
00169 _ima_list.Draw( i, dc, x, y, wxIMAGELIST_DRAW_NORMAL, true );
00170 dc.DrawText( _nrs_list[ i ], x, y );
00171 if( _first_selected == i && _last_selected != i )
00172 {
00173 dc.SetPen( *wxRED_PEN );
00174 dc.DrawRectangle( x - ( _gap / 2 ), y - ( _gap / 2 ), _sx + _gap, _sy + _gap );
00175
00176 }
00177 else if( _first_selected != i && _last_selected == i )
00178 {
00179 dc.SetPen( *wxGREEN_PEN );
00180 dc.DrawRectangle( x - ( _gap / 2 ), y - ( _gap / 2 ), _sx + _gap, _sy + _gap );
00181
00182 }
00183 else if( _first_selected == i && _last_selected == i )
00184 {
00185 dc.SetPen( *wxCYAN_PEN );
00186 dc.DrawRectangle( x - ( _gap / 2 ), y - ( _gap / 2 ), _sx + _gap, _sy + _gap );
00187
00188 }
00189
00190 }
00191
00192 }
00193
00194 void wxImageBrowserWdg::OnSize( wxSizeEvent& event )
00195 {
00196 int r, c, n;
00197 wxSize sz = this->GetClientSize( );
00198
00199 this->GetSizeParameters( &n, &c, &r );
00200
00201
00202 this->SetScrollbars( _sx + _gap, _sy + ( _gap * 2 ), c, r );
00203
00204 }
00205
00206 int wxImageBrowserWdg::GetIndexClicked( wxMouseEvent& event )
00207 {
00208 double re;
00209 int x, y, n, c, r, i;
00210 wxClientDC dc( this );
00211 this->PrepareDC( dc );
00212 wxPoint pos = event.GetLogicalPosition( dc );
00213
00214 this->GetSizeParameters( &n, &c, &r );
00215
00216
00217 x = -1;
00218 re = ( double )( pos.x ) / ( double )( _gap + _sx );
00219 if( ( re - floor( re ) ) >= ( ( double )( _gap ) / ( double )( _gap + _sx ) ) ) x = ( int )floor( re );
00220 x = ( x >= 0 && x < c )? x: -1;
00221 y = -1;
00222 re = ( double )( pos.y ) / ( double )( _gap + _sy );
00223 if( ( re - floor( re ) ) >= ( ( double )( _gap ) / ( double )( _gap + _sy ) ) ) y = ( int )floor( re );
00224 y = ( y >= 0 && y < r )? y: -1;
00225 i = ( x != -1 && y != -1 )? x + ( y * c ): -1;
00226 return( ( i < n )? i: -1 );
00227
00228 }
00229
00230 void wxImageBrowserWdg::OnMouseLeftClick( wxMouseEvent& event )
00231 {
00232
00233 _first_selected = this->GetIndexClicked( event );
00234
00235
00236 this->Refresh( );
00237
00238 }
00239
00240 void wxImageBrowserWdg::OnMouseRightClick( wxMouseEvent& event )
00241 {
00242
00243 _last_selected = this->GetIndexClicked( event );
00244
00245
00246 this->Refresh( );
00247
00248 }
00249
00250
00251
00252
00253
00254
00255
00256
00257