wxImageBrowserWdg.cxx

Go to the documentation of this file.
00001 
00002 #include "wxImageBrowserWdg.h"
00003 
00004 #include <math.h>
00005 //#include <gtmlib/math/mathdefs.h>
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;  //pointeur sur mon image
00051 //    int i, j, k;
00052 
00053     tmpI.Create( width, height );
00054     _nrs_list = names;
00055 
00056     // Canvas creation
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 //      unsigned short** voltemp = volume[k];
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           //memset( data, value, 3);
00076         } //rof
00077       } //rof
00078 
00079       //image is set, add it to the list
00080       //another image is created so allocation is not a problem
00081       _ima_list.Add( wxBitmap( tmpI.Scale( _sx, _sy ) ) );
00082     } // rof
00083 
00084 //FIXME:
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         } // fi
00189 
00190     } // rof
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     // Scroll bars
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     // Image index calculation (Help!!, Mr. wizard!)
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     // Select!
00233     _first_selected = this->GetIndexClicked( event );
00234 
00235     // Drawing
00236     this->Refresh( );
00237 
00238 }
00239 
00240 void wxImageBrowserWdg::OnMouseRightClick( wxMouseEvent& event )
00241 {
00242     // Select!
00243     _last_selected = this->GetIndexClicked( event );
00244 
00245     // Drawing
00246     this->Refresh( );
00247 
00248 }
00249 
00250 /*
00251 void wxImageBrowserWdg::Add( const wxImage& ima, const wxString& nrs )
00252 {
00253 _ima_list.Add( wxBitmap( ima.Scale( _sx, _sy ) ) );
00254 _nrs_list.Add( nrs );
00255 this->OnSize( wxSizeEvent( ) );
00256 }
00257 */

Generated on 18 Mar 2010 for creaMaracasVisu_lib by  doxygen 1.6.1