00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "a2dprec.h"
00012
00013 #ifdef __BORLANDC__
00014 #pragma hdrstop
00015 #endif
00016
00017 #ifndef WX_PRECOMP
00018 #include "wx/wx.h"
00019 #endif
00020
00021 #include "wx/canvas/candoc.h"
00022 #include "wx/canvas/canvas.h"
00023 #include "wx/artbase/dcdrawer.h"
00024
00025 #if wxART2D_USE_AGGDRAWER
00026 #include "wx/aggdrawer/aggdrawer.h"
00027 #endif
00028
00029
00030
00031
00032
00033
00034
00035
00036 #define MIN_MAPSIZE 10
00037
00038 IMPLEMENT_CLASS(a2dCanvas,a2dDocumentViewWindow)
00039
00040 BEGIN_EVENT_TABLE(a2dCanvas,a2dDocumentViewWindow)
00041 EVT_PAINT( a2dCanvas::OnPaint )
00042 EVT_ERASE_BACKGROUND( a2dCanvas::OnEraseBackground )
00043 EVT_SCROLLWIN( a2dCanvas::OnScroll )
00044 EVT_CHAR( a2dCanvas::OnChar )
00045 EVT_SIZE( a2dCanvas::OnSize )
00046 EVT_MOUSEWHEEL( a2dCanvas::OnWheel )
00047 END_EVENT_TABLE()
00048
00049
00050 a2dCanvas::a2dCanvas( wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, a2dDrawer2D *drawer2D ):
00051 a2dDocumentViewWindow( parent, id, pos, size, style | wxWANTS_CHARS )
00052 {
00053 m_delta = 20;
00054 m_wantScroll = false;
00055 if ( style & wxVSCROLL || style & wxHSCROLL )
00056 m_wantScroll = true;
00057
00058 m_inSetScrollMaximum = false;
00059 m_control_doc_view = true;
00060 int dvx = size.GetWidth();
00061 int dvy = size.GetHeight();
00062
00063 if ( size == wxDefaultSize )
00064 {
00065 dvx = 1000;
00066 dvy = 1000;
00067 }
00068 else
00069 GetSaveClientSize(&dvx,&dvy);
00070
00071 m_oversizeX = 0;
00072 m_oversizeY = 0;
00073
00074
00075 m_doc = new a2dCanvasDocument();
00076
00077 a2dCanvasView* drawerView = new a2dCanvasView( dvx + m_oversizeX * 2, dvy + m_oversizeY * 2 );
00078 drawerView->SetDocument( m_doc );
00079 drawerView->SetDisplayWindow( this );
00080
00081 if ( !drawer2D )
00082 drawer2D = new a2dMemDcDrawer( dvx + m_oversizeX * 2, dvy + m_oversizeY * 2 );
00083 else
00084 drawer2D->SetBufferSize( dvx + m_oversizeX * 2, dvy + m_oversizeY * 2 );
00085
00086 drawerView->SetDrawer2D( drawer2D );
00087
00088 SetView( drawerView );
00089
00090
00091 m_virtm_minX = 0;
00092 m_virtm_minY = 0;
00093 m_virtm_maxX = drawer2D->GetWidth();
00094 if ( m_virtm_maxX == 0 )
00095 m_virtm_maxX = 1000;
00096 m_virtm_maxY = drawer2D->GetHeight();
00097 if ( m_virtm_maxY == 0 )
00098 m_virtm_maxY = 1000;
00099
00100 Init( dvx, dvy );
00101 GetDrawer2D()->SetMappingDeviceRect( m_oversizeX, m_oversizeY, dvx, dvy );
00102
00103
00104
00105
00106
00107 drawerView->Update( a2dCANVIEW_UPDATE_ALL );
00108 }
00109
00110 a2dCanvas::a2dCanvas( a2dCanvasView* drawer, wxWindow *parent, wxWindowID id,
00111 const wxPoint &position, const wxSize& size, long style ) :
00112 a2dDocumentViewWindow( drawer, parent, id, position, size, style )
00113 {
00114 m_delta = 20;
00115 m_wantScroll = false;
00116 if ( style & wxVSCROLL || style & wxHSCROLL )
00117 m_wantScroll = true;
00118
00119 m_inSetScrollMaximum = false;
00120 drawer->SetDisplayWindow( this );
00121 drawer->GetDrawer2D()->SetDisplay( this );
00122
00123 m_control_doc_view = false;
00124
00125 m_virtm_minX = 0;
00126 m_virtm_minY = 0;
00127
00128 m_virtm_maxX = size.GetWidth();
00129 if ( m_virtm_maxX == 0 )
00130 m_virtm_maxX = 1000;
00131
00132 m_virtm_maxY = size.GetHeight();
00133 if ( m_virtm_maxY == 0 )
00134 m_virtm_maxY = 1000;
00135
00136 int dvx,dvy;
00137 GetSaveClientSize(&dvx,&dvy);
00138
00139 m_oversizeX = 0;
00140 m_oversizeY = 0;
00141
00142 Init( dvx, dvy );
00143
00144
00145 SetScrollStepX(size.GetWidth()/10);
00146 SetScrollStepY(size.GetHeight()/10);
00147
00148 m_view->Update( a2dCANVIEW_UPDATE_ALL );
00149 }
00150
00151 void a2dCanvas::SetView( a2dView* view )
00152 {
00153 int w, h;
00154 if ( m_view)
00155 {
00156 a2dCanvasView* drawer = GetCanvasView();
00157 w = drawer->GetDrawer2D()->GetWidth();
00158 h = drawer->GetDrawer2D()->GetHeight();
00159 }
00160 else
00161 {
00162 GetSaveClientSize(&w,&h);
00163 }
00164
00165 a2dDocumentViewWindow::SetView( view );
00166
00167 if ( m_view )
00168 {
00169 a2dCanvasView* drawer = GetCanvasView();
00170 drawer->SetBufferSize( w, h );
00171 m_view->Update(a2dCANVIEW_UPDATE_ALL);
00172 Enable();
00173 }
00174 }
00175
00176 void a2dCanvas::SetCanvasView( a2dCanvasView* view )
00177 {
00178 SetView( view );
00179 }
00180
00181 void a2dCanvas::Init( int dvx, int dvy )
00182 {
00183 m_normalize = 10000;
00184
00185 m_aboveScrolledFixedAdjustUpp = true;
00186 m_clipToScrollMax = true;
00187 m_border = 0;
00188
00189 double dmvx = m_virtm_maxX - m_virtm_minX;
00190 double dmvy = m_virtm_maxY - m_virtm_minY;
00191
00192
00193 m_scrollstepx = dmvx/10;
00194 m_thumbx = (int)(dvx/m_scrollstepx * m_normalize );
00195 m_scrollrangex = (int)(dmvx/m_scrollstepx * m_normalize );
00196
00197 m_scrollstepy = dmvy/10;
00198 m_thumby = (int) (dvy/m_scrollstepy * m_normalize );
00199 m_scrollrangey = (int)(dmvy/m_scrollstepy * m_normalize );
00200
00201 m_scaleonresize = false;
00202 m_ContinuesSizeUpdate = true;
00203
00204 m_scrollmaxfixed = false;
00205
00206 m_xscroll_changed = false;
00207 m_yscroll_changed = false;
00208 m_has_x_scroll = false;
00209 m_has_y_scroll = false;
00210
00211 m_scrolled = false;
00212
00213 m_oldw = m_oldh = m_prevh = 0;
00214 m_prevClientW = m_prevClientH = 0;
00215 if (m_scaleonresize)
00216 m_delta = 20;
00217 else
00218 m_delta = 100;
00219
00220 m_frozen = false;
00221 }
00222
00223 void a2dCanvas::GetSaveClientSize( int* dvx, int* dvy) const
00224 {
00225 GetClientSize(dvx,dvy);
00226
00227 if ( *dvx == 0 ) *dvx = MIN_MAPSIZE;
00228 if ( *dvy == 0 ) *dvy = MIN_MAPSIZE;
00229 }
00230
00231 void a2dCanvas::ClearBackground()
00232 {
00233 SetBackgroundColour( GetCanvasView()->GetBackgroundFill().GetColour() );
00234
00235 wxWindow::ClearBackground();
00236 }
00237
00238 void a2dCanvas::Refresh( bool eraseBackground, const wxRect* rect )
00239 {
00240 if ( m_view && !rect )
00241 {
00242 m_view->Update( a2dCANVIEW_UPDATE_ALL );
00243 GetDrawer2D()->StartRefreshDisplayDisable();
00244 MakeVirtualMaxFitVisibleArea();
00245 GetDrawer2D()->EndRefreshDisplayDisable();
00246 }
00247 wxWindow::Refresh( eraseBackground, rect );
00248 }
00249
00250 a2dCanvas::~a2dCanvas()
00251 {
00252 if ( GetCanvasView() )
00253 {
00254 if (m_control_doc_view)
00255 {
00256 GetCanvasView()->Close();
00257 }
00258 }
00259 }
00260
00261 a2dCanvasDocument* a2dCanvas::GetCanvasDocument()
00262 {
00263 if (!m_view)
00264 return NULL;
00265 return GetCanvasView()->GetCanvasDocument();
00266 }
00267
00268 void a2dCanvas::SetBackgroundFill( const a2dFill& backgroundfill )
00269 {
00270 if ( !GetCanvasView() )
00271 return;
00272 GetCanvasView()->SetBackgroundFill( backgroundfill );
00273
00274 m_view->Update( a2dCANVIEW_UPDATE_ALL );
00275 }
00276
00277 void a2dCanvas::SetCanvasDocument(a2dCanvasDocument* aroot)
00278 {
00279 if ( !GetCanvasView() )
00280 return;
00281
00282
00283
00284
00285
00286 m_doc = aroot;
00287 m_view->SetDocument(aroot);
00288
00289 if (m_control_doc_view)
00290 {
00291 GetCanvasView()->Update( a2dCANVIEW_UPDATE_ALL );
00292 }
00293 }
00294
00295 a2dCanvasObject* a2dCanvas::SetShowObject(const wxString& name)
00296 {
00297 if ( !GetCanvasView() )
00298 return false;
00299 return GetCanvasView()->SetShowObject(name);
00300 }
00301
00302 bool a2dCanvas::SetShowObject(a2dCanvasObject* obj)
00303 {
00304 if ( !GetCanvasView() )
00305 return false;
00306 return GetCanvasView()->SetShowObject(obj);
00307 }
00308
00309 void a2dCanvas::SetScrollBarsVisible(bool onoff)
00310 {
00311 m_wantScroll = onoff;
00312 MakeVirtualMaxFitVisibleArea();
00313 }
00314
00315 void a2dCanvas::AppendEventHandler(wxEvtHandler *handler)
00316 {
00317 wxEvtHandler *handlerA = GetEventHandler();
00318 while ( handlerA->GetNextHandler() )
00319 {
00320 handlerA = (wxEvtHandler*)handlerA->GetNextHandler();
00321 }
00322 handlerA->SetNextHandler(handler);
00323 handler->SetNextHandler((wxEvtHandler *)NULL);
00324 }
00325
00326 wxEvtHandler *a2dCanvas::RemoveLastEventHandler(bool deleteHandler)
00327 {
00328
00329 wxEvtHandler *handlerA = GetEventHandler();
00330 wxEvtHandler *handlerB = handlerA;
00331
00332 while ( handlerA->GetNextHandler() )
00333 {
00334 handlerB = handlerA;
00335 handlerA = (wxEvtHandler*)handlerA->GetNextHandler();
00336 }
00337
00338 handlerB->SetNextHandler((wxEvtHandler *)NULL);
00339 if ( deleteHandler )
00340 {
00341 delete handlerA;
00342 }
00343
00344 return GetEventHandler();
00345 }
00346
00347 double a2dCanvas::GetVisibleMinX() const
00348 {
00349 if ( !m_view )
00350 return 0;
00351 return GetDrawer2D()->GetVisibleMinX();
00352 }
00353
00354 double a2dCanvas::GetVisibleMinY() const
00355 {
00356 if ( !m_view )
00357 return 0;
00358 return GetDrawer2D()->GetVisibleMinY();
00359 }
00360
00361 double a2dCanvas::GetUppX() const
00362 {
00363 if ( !m_view )
00364 return 1;
00365 return GetDrawer2D()->GetUppX();
00366 }
00367
00368 double a2dCanvas::GetUppY() const
00369 {
00370 if ( !m_view )
00371 return 1;
00372 return GetDrawer2D()->GetUppY();
00373 }
00374
00375 double a2dCanvas::GetVisibleMaxX() const
00376 {
00377 int dx,dy;
00378 GetSaveClientSize(&dx,&dy);
00379 return GetVisibleMinX()+GetUppX()*dx;
00380 }
00381
00382 double a2dCanvas::GetVisibleMaxY() const
00383 {
00384 int dx,dy;
00385 GetSaveClientSize(&dx,&dy);
00386 return GetVisibleMinY()+GetUppY()*dy;
00387 }
00388
00389 double a2dCanvas::GetVisibleWidth() const
00390 {
00391 int dx,dy;
00392 GetSaveClientSize(&dx,&dy);
00393 return GetUppX()*dx;
00394 }
00395
00396 double a2dCanvas::GetVisibleHeight() const
00397 {
00398 int dx,dy;
00399 GetSaveClientSize(&dx,&dy);
00400 return GetUppY()*dy;
00401 }
00402
00403 bool a2dCanvas::GetYaxis() const
00404 {
00405 if ( !GetDrawer2D() )
00406 return true;
00407 return GetDrawer2D()->GetYaxis();
00408 }
00409
00410 void a2dCanvas::Freeze()
00411 {
00412 wxWindow::Freeze();
00413 m_frozen = true;
00414 }
00415
00416 void a2dCanvas::Thaw()
00417 {
00418 wxWindow::Thaw();
00419 m_frozen = false;
00420 }
00421
00422 void a2dCanvas::OnPaint(wxPaintEvent& WXUNUSED(event) )
00423 {
00424 wxPaintDC dc( this );
00425
00426 if ( !GetCanvasView() || m_view->IsClosed() )
00427 {
00428 return;
00429 }
00430
00431 if (GetCanvasView()->IsFrozen()) return;
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445 bool eventHandlerEnabledState = GetCanvasView()->GetEvtHandlerEnabled();
00446 if ( !eventHandlerEnabledState )
00447 GetCanvasView()->SetEvtHandlerEnabled(true);
00448
00449
00450
00451
00452 GetCanvasView()->Update( a2dCANVIEW_UPDATE_AREAS );
00453
00454
00455 GetCanvasView()->SetEvtHandlerEnabled(eventHandlerEnabledState);
00456
00457
00458 GetDrawer2D()->BeginDraw();
00459
00460
00461
00462 wxRegionIterator it( GetUpdateRegion() );
00463 while (it)
00464 {
00465 int x = it.GetX();
00466 int y = it.GetY();
00467
00468 int w = it.GetWidth();
00469 int h = it.GetHeight();
00470
00471
00472 GetCanvasView()->BlitBuffer( x+m_oversizeX, y+m_oversizeY, w, h, m_oversizeX, m_oversizeY );
00473
00474 it++;
00475 }
00476 GetDrawer2D()->EndDraw();
00477 }
00478
00479 void a2dCanvas::SetMouseEvents(bool onoff)
00480 {
00481 GetCanvasView()->SetMouseEvents( onoff );
00482 }
00483
00484 void a2dCanvas::OnEraseBackground(wxEraseEvent& WXUNUSED(event) )
00485 {
00486
00487
00488 }
00489
00490 a2dCanvasObject* a2dCanvas::IsHitWorld(
00491 double x, double y,
00492 int layer,
00493 a2dHitOption option
00494 )
00495 {
00496 return GetCanvasView()->IsHitWorld( x, y, layer, option );
00497 }
00498
00499 bool a2dCanvas::WriteSVG(const wxString& filename, double Width, double Height, wxString unit)
00500 {
00501 return GetCanvasView()->GetCanvasDocument()->WriteSVG( GetCanvasView(), filename, GetShowObject(), Width, Height, unit);
00502 }
00503
00504 void a2dCanvas::SetMappingWidthHeight( double vx1, double vy1, double width, double height,bool scrollbars)
00505 {
00506 int dxn,dyn;
00507 GetSaveClientSize(&dxn,&dyn);
00508
00509 double xupp=width/dxn;
00510 double yupp=height/dyn;
00511
00512 if (yupp == 0 || xupp == 0)
00513 {
00514 yupp = 1;xupp = 1;
00515 }
00516
00517 if (yupp > xupp)
00518 {
00519 SetMappingUpp(vx1,vy1,yupp,yupp);
00520
00521 if ( scrollbars )
00522 SetScrollMaximum(vx1,vy1,vx1+yupp*dyn,vy1+yupp*dyn);
00523 }
00524 else
00525 {
00526 SetMappingUpp(vx1,vy1,xupp,xupp);
00527
00528 if ( scrollbars )
00529 SetScrollMaximum(vx1,vy1,vx1+xupp*dxn,vy1+xupp*dxn);
00530 }
00531 }
00532
00533
00534
00535 void a2dCanvas::SetMappingUpp( double vx1, double vy1, double xpp, double ypp)
00536 {
00537 int dxn,dyn;
00538 GetSaveClientSize(&dxn,&dyn);
00539
00540 GetDrawer2D()->StartRefreshDisplayDisable();
00541 GetDrawer2D()->SetMappingDeviceRect( m_oversizeX, m_oversizeY, dxn, dyn, false );
00542 GetDrawer2D()->SetMappingUpp( vx1, vy1, xpp, ypp );
00543
00544 MakeVirtualMaxFitVisibleArea();
00545 GetDrawer2D()->EndRefreshDisplayDisable();
00546 m_view->Update( a2dCANVIEW_UPDATE_ALL );
00547 }
00548
00549 void a2dCanvas::SetMappingShowAll( bool centre )
00550 {
00551 if (!GetShowObject() || !GetCanvasDocument())
00552 return;
00553
00554 m_view->Update( a2dCANVIEW_UPDATE_OLDNEW );
00555 a2dBoundingBox untr = GetShowObject()->GetBbox();
00556 a2dAffineMatrix cworld = GetShowObject()->GetTransformMatrix();
00557 cworld.Invert();
00558 untr.MapBbox(cworld);
00559
00560 double w = untr.GetWidth();
00561 double h = untr.GetHeight();
00562
00563 if ( w == 0 )
00564 w=1000;
00565 if ( h== 0 )
00566 h=1000;
00567
00568 if (!m_scrollmaxfixed)
00569 SetScrollMaximum(untr.GetMinX(), untr.GetMinY(), untr.GetMinX()+w, untr.GetMinY()+h);
00570
00571 double uppx, uppy;
00572 int clientw, clienth;
00573 GetSaveClientSize( &clientw, &clienth );
00574
00575
00576 if ( clientw - m_border > 0 )
00577 uppx = w/(clientw - m_border);
00578 else
00579 uppx = w/clientw;
00580
00581
00582 if ( clienth - m_border > 0 )
00583 uppy = h/(clienth - m_border);
00584 else
00585 uppy = h/clienth;
00586
00587
00588 if ( uppy > uppx )
00589 uppx = uppy;
00590
00591 GetDrawer2D()->StartRefreshDisplayDisable();
00592 GetDrawer2D()->SetMappingDeviceRect( m_oversizeX, m_oversizeY, clientw, clienth, false);
00593
00594 if ( !centre )
00595 {
00596 SetMappingWidthHeight( untr.GetMinX(),
00597 untr.GetMinY(),
00598 w,
00599 h,
00600 false
00601 );
00602 }
00603 else
00604 {
00605 double middlexworld = untr.GetMinX()+w/2.0;
00606 double middleyworld = untr.GetMinY()+h/2.0;
00607 GetDrawer2D()->SetMappingUpp( middlexworld - clientw/2.0*uppx, middleyworld - clienth/2.0*uppx, uppx, uppx );
00608 }
00609
00610
00611 int clientwNew, clienthNew;
00612 GetSaveClientSize( &clientwNew, &clienthNew );
00613 if ( clientw != clientwNew || clienth != clienthNew )
00614 {
00615
00616 if ( clientw - m_border > 0 )
00617 uppx = w/(clientw - m_border);
00618 else
00619 uppx = w/clientw;
00620
00621
00622 if ( clienth - m_border > 0 )
00623 uppy = h/(clienth - m_border);
00624 else
00625 uppy = h/clienth;
00626
00627
00628 if ( uppy > uppx )
00629 uppx = uppy;
00630
00631 GetDrawer2D()->SetMappingDeviceRect( m_oversizeX, m_oversizeY, clientwNew, clienthNew, false );
00632 if ( !centre )
00633 {
00634 SetMappingWidthHeight( untr.GetMinX(),
00635 untr.GetMinY(),
00636 w,
00637 h,
00638 false
00639 );
00640 }
00641 else
00642 {
00643 double middlexworld = untr.GetMinX()+w/2.0;
00644 double middleyworld = untr.GetMinY()+h/2.0;
00645 GetDrawer2D()->SetMappingUpp( middlexworld - clientwNew/2.0*uppx, middleyworld - clienthNew/2.0*uppx, uppx, uppx );
00646 }
00647 }
00648
00649 m_view->Update( a2dCANVIEW_UPDATE_OLDNEW );
00650
00651
00652 GetDrawer2D()->EndRefreshDisplayDisable();
00653 Refresh();
00654 }
00655
00656 void a2dCanvas::ZoomOut( double n )
00657 {
00658 int dx,dy;
00659 GetClientSize(&dx,&dy);
00660 if (dy > dx) dx=dy;
00661
00662 SetMappingUpp( GetDrawer2D()->GetVisibleMinX() + (1 - n ) * GetDrawer2D()->GetUppX() * dx * 0.5,
00663 GetDrawer2D()->GetVisibleMinY() + (1 - n ) * GetDrawer2D()->GetUppY() * dy * 0.5,
00664 GetDrawer2D()->GetUppX()*n, GetDrawer2D()->GetUppY()*n);
00665 }
00666
00667 void a2dCanvas::ZoomOutAtXy( int x, int y, double n )
00668 {
00669 int dx,dy;
00670 GetClientSize(&dx,&dy);
00671 if (dy > dx) dx=dy;
00672
00673 double mouse_worldx, mouse_worldy;
00674 GetCanvasView()->MouseToToolWorld( x, y, mouse_worldx, mouse_worldy );
00675
00676 mouse_worldx -= ( mouse_worldx - GetDrawer2D()->GetVisibleMinX()) * n;
00677 mouse_worldy -= ( mouse_worldy - GetDrawer2D()->GetVisibleMinY()) * n;
00678
00679 SetMappingUpp( mouse_worldx, mouse_worldy, GetDrawer2D()->GetUppX()*n, GetDrawer2D()->GetUppY()*n );
00680 }
00681
00682 void a2dCanvas::SetScrollbars(double pixelsPerUnitX, double pixelsPerUnitY,
00683 double noUnitsX, double noUnitsY,
00684 double xPos , double yPos )
00685 {
00686
00687
00688
00689
00690 GetDrawer2D()->SetYaxis(false);
00691
00692
00693
00694 int dxn,dyn;
00695 GetSaveClientSize(&dxn,&dyn);
00696
00697 m_scrollstepx = dxn/pixelsPerUnitX;
00698 m_scrollstepy = dyn/pixelsPerUnitY;
00699 SetScrollMaximum(0,0,dxn/pixelsPerUnitX*noUnitsX,dyn/pixelsPerUnitY*noUnitsY);
00700
00701 SetMappingUpp(xPos,yPos,1,1);
00702 }
00703
00704 bool a2dCanvas::MakeVirtualMaxFitVisibleArea()
00705 {
00706
00707
00708 double tol = 1 * GetUppX();
00709
00710 GetDrawer2D()->StartRefreshDisplayDisable();
00711 bool visAreaSizeChange = false;
00712 bool old_has_y_scroll = m_has_y_scroll;
00713 bool old_has_x_scroll = m_has_x_scroll;
00714
00715
00716 if( m_inSetScrollMaximum )
00717 {
00718 GetDrawer2D()->EndRefreshDisplayDisable();
00719 return false;
00720 }
00721 m_inSetScrollMaximum = true;
00722
00723
00724 int dx,dy;
00725 GetSaveClientSize(&dx,&dy);
00726
00727
00728 double dvx = GetUppX()*dx;
00729
00730 double dvy = GetUppY()*dy;
00731
00732 double dmvx = m_virtm_maxX - m_virtm_minX;
00733 double dmvy = m_virtm_maxY - m_virtm_minY;
00734
00735
00736
00737
00738 assert( dmvx > 0 );
00739 assert( dmvy > 0 );
00740
00741
00742 if ( !GetDrawer2D()->GetVirtualAreaSet() )
00743 {
00744
00745 double uppnew;
00746 if ( dmvx > dmvy )
00747 uppnew = dmvx / dvx;
00748 else
00749 uppnew = dmvy / dvy;
00750
00751 SetMappingUpp( m_virtm_minX, m_virtm_minY, uppnew, uppnew );
00752 visAreaSizeChange = true;
00753 }
00754
00755
00756
00757 double minvx = GetDrawer2D()->GetVisibleMinX();
00758 double minvy = GetDrawer2D()->GetVisibleMinY();
00759 double maxvx = GetDrawer2D()->GetVisibleMinX()+dvx;
00760 double maxvy = GetDrawer2D()->GetVisibleMinY()+dvy;
00761
00762 if (!m_scrollmaxfixed)
00763 {
00764
00765 if (m_virtm_minX - tol >= minvx) m_virtm_minX = minvx;
00766 if (m_virtm_maxX + tol <= maxvx) m_virtm_maxX = maxvx;
00767 if (m_virtm_minY - tol >= minvy) m_virtm_minY = minvy;
00768 if (m_virtm_maxY + tol <= maxvy) m_virtm_maxY = maxvy;
00769
00770 dmvx = m_virtm_maxX - m_virtm_minX;
00771 dmvy = m_virtm_maxY - m_virtm_minY;
00772
00773 visAreaSizeChange = false;
00774 }
00775 else
00776 {
00777
00778
00779 if ( m_clipToScrollMax )
00780 {
00781 bool clip = false;
00782
00783 if (m_virtm_minX - tol >= minvx)
00784 { minvx = m_virtm_minX; clip = true; }
00785 if (m_virtm_maxX + tol <= maxvx)
00786 { maxvx = m_virtm_maxX; clip = true; }
00787 if (m_virtm_minY - tol >= minvy)
00788 { minvy = m_virtm_minY; clip = true; }
00789 if (m_virtm_maxY + tol <= maxvy)
00790 { maxvy = m_virtm_maxY; clip = true; }
00791
00792
00793
00794
00795
00796
00797 if ( clip )
00798 {
00799 if ( dmvx > dvx || dmvy > dvy )
00800 {
00801
00802 if (minvx == m_virtm_minX) maxvx = m_virtm_minX + dvx;
00803 else if ( maxvx == m_virtm_maxX ) minvx = m_virtm_maxX - dvx;
00804
00805
00806
00807 if (minvy == m_virtm_minY) maxvy = m_virtm_minY + dvy;
00808 else if ( maxvy == m_virtm_maxY ) minvy = m_virtm_maxY - dvy;
00809
00810
00811
00812 GetDrawer2D()->SetMinX( minvx );
00813 GetDrawer2D()->SetMinY( minvy );
00814 }
00815 else
00816 {
00817
00818
00819 double uppX = dmvx / ( dx + 1 );
00820 double uppY = dmvy / ( dy + 1 );
00821
00822 if ( uppY > uppX )
00823 uppX = uppY;
00824
00825 GetDrawer2D()->SetMappingUpp( minvx, minvy, uppX, uppX );
00826
00827 dvx = GetUppX()*dx;
00828 dvy = GetUppY()*dy;
00829 }
00830
00831 visAreaSizeChange = true;
00832 }
00833 }
00834 }
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846 if ( !m_wantScroll )
00847 {
00848 m_inSetScrollMaximum = false;
00849 GetCanvasView()->UpdateViewDependentObjects();
00850 GetDrawer2D()->EndRefreshDisplayDisable();
00851
00852 SetScrollbar(wxHORIZONTAL,0,1,1,true);
00853 SetScrollbar(wxVERTICAL,0,1,1,true);
00854 return visAreaSizeChange;
00855 }
00856
00857
00858
00859
00860
00861
00862 m_has_y_scroll = dmvy > fabs(dvy);
00863 if( m_has_y_scroll )
00864 {
00865
00866 SetScrollbar(wxVERTICAL,0,1,2,false);
00867
00868
00869
00870
00871 }
00872
00873
00874 m_has_x_scroll = dmvx > fabs(dvx);
00875 if( m_has_x_scroll )
00876 {
00877
00878 SetScrollbar(wxHORIZONTAL,0,1,2,false);
00879
00880
00881
00882
00883
00884
00885
00886 if( !m_has_y_scroll )
00887 {
00888 m_has_y_scroll = dmvy > fabs(dvy);
00889 if( m_has_y_scroll )
00890 {
00891
00892 SetScrollbar(wxVERTICAL,0,1,2,false);
00893
00894
00895
00896
00897 }
00898 }
00899 }
00900
00901
00902 m_scrolled = (m_has_x_scroll || m_has_y_scroll);
00903
00904
00905 if( m_has_x_scroll )
00906 {
00907
00908
00909 m_thumbx = (int)floor(dvx/m_scrollstepx * m_normalize);
00910
00911 m_scrollrangex = (int) (dmvx/m_scrollstepx * m_normalize);
00912
00913
00914
00915
00916 m_xscroll_changed = true;
00917 int position = (int)( (GetVisibleMinX()-m_virtm_minX) / dmvx *m_scrollrangex );
00918 SetScrollbar(wxHORIZONTAL,position,m_thumbx,m_scrollrangex,true);
00919
00920 m_xscroll_changed=false;
00921
00922 }
00923 else
00924 {
00925
00926 SetScrollbar(wxHORIZONTAL,0,1,1,true);
00927 }
00928
00929 if( m_has_y_scroll )
00930 {
00931
00932 m_thumby = (int) (dvy/m_scrollstepy * m_normalize );
00933
00934 m_scrollrangey = (int) (dmvy/m_scrollstepy * m_normalize );
00935
00936 m_yscroll_changed = true;
00937
00938 if (GetYaxis())
00939 {
00940
00941
00942
00943
00944
00945 int position = (int) ((m_virtm_maxY-(GetVisibleMinY()+dvy)) /dmvy * m_scrollrangey );
00946 SetScrollbar(wxVERTICAL,position,m_thumby,m_scrollrangey,true);
00947 }
00948 else
00949 {
00950
00951
00952
00953
00954
00955 int position = (int) ((GetVisibleMinY()-m_virtm_minY)/dmvy *m_scrollrangey );
00956 SetScrollbar(wxVERTICAL,position,m_thumby,m_scrollrangey,true);
00957 }
00958 m_yscroll_changed = false;
00959 }
00960 else
00961 {
00962
00963 SetScrollbar(wxVERTICAL,0,1,1,true);
00964 }
00965
00966 m_inSetScrollMaximum = false;
00967
00968 if ( old_has_y_scroll != m_has_y_scroll || old_has_x_scroll != m_has_x_scroll )
00969 visAreaSizeChange = true;
00970
00971 GetCanvasView()->UpdateViewDependentObjects();
00972 GetDrawer2D()->EndRefreshDisplayDisable();
00973
00974 return visAreaSizeChange;
00975 }
00976
00977 bool a2dCanvas::SetScrollMaximum(double vx1,double vy1,double vx2,double vy2)
00978 {
00979 if( !GetDrawer2D() )
00980 return false;
00981
00982 wxASSERT_MSG( vx1 < vx2, wxT("min X bigger than max X") );
00983 wxASSERT_MSG( vy1 < vy2, wxT("min Y bigger than max Y") );
00984
00985 m_virtm_minX = vx1;
00986 m_virtm_minY = vy1;
00987 m_virtm_maxX = vx2;
00988 m_virtm_maxY = vy2;
00989
00990 return MakeVirtualMaxFitVisibleArea();
00991 }
00992
00993 void a2dCanvas::SetMinX( double vxmin )
00994 {
00995 GetDrawer2D()->SetMinX( vxmin );
00996 MakeVirtualMaxFitVisibleArea();
00997 }
00998
00999 void a2dCanvas::SetMinY( double vymin )
01000 {
01001 GetDrawer2D()->SetMinY( vymin );
01002 MakeVirtualMaxFitVisibleArea();
01003 }
01004
01005 void a2dCanvas::SetYaxis(bool up)
01006 {
01007 if ( !GetDrawer2D() )
01008 return;
01009 GetDrawer2D()->SetYaxis( up);
01010 MakeVirtualMaxFitVisibleArea();
01011
01012 m_view->Update( a2dCANVIEW_UPDATE_ALL );
01013 }
01014
01015 void a2dCanvas::SetScrollStepX(double x)
01016 {
01017 m_scrollstepx = x;
01018
01019 MakeVirtualMaxFitVisibleArea();
01020 }
01021
01022 void a2dCanvas::SetScrollStepY(double y)
01023 {
01024 m_scrollstepy = y;
01025
01026 MakeVirtualMaxFitVisibleArea();
01027 }
01028
01029 bool a2dCanvas::CheckInsideScrollMaximum(int dx,int dy)
01030 {
01031 int dvx,dvy;
01032 GetSaveClientSize(&dvx,&dvy);
01033
01034 double dyworld = GetDrawer2D()->DeviceToWorldYRel(dy);
01035 double dxworld = GetDrawer2D()->DeviceToWorldXRel(dx);
01036 double worldminy = GetVisibleMinY()-dyworld;
01037 double worldminx = GetVisibleMinX()-dxworld;
01038
01039 return CheckInsideScrollMaximum( worldminx, worldminy);
01040 }
01041
01042 bool a2dCanvas::CheckInsideScrollMaximum( double worldminx, double worldminy)
01043 {
01044 if( !m_scrollmaxfixed )
01045 return true;
01046
01047 int dvx,dvy;
01048 GetSaveClientSize(&dvx,&dvy);
01049 double worlddvx = GetUppX()*dvx;
01050 double worlddvy = GetUppY()*dvy;
01051
01052 return
01053 (m_virtm_minX <= worldminx) &&
01054 (m_virtm_maxX >= worldminx+worlddvx) &&
01055 (m_virtm_minY <= worldminy) &&
01056 (m_virtm_maxY >= worldminy+worlddvy);
01057 }
01058
01059 bool a2dCanvas::GetMouseEvents()
01060 {
01061 if ( !GetCanvasView() )
01062 return false;
01063
01064 return GetCanvasView()->GetMouseEvents();
01065 }
01066
01067
01068
01069
01070
01071 void a2dCanvas::OnScroll(wxScrollWinEvent& event)
01072 {
01073
01074 int dx,dy;
01075 GetSaveClientSize(&dx,&dy);
01076
01077 if (event.GetEventType() == wxEVT_SCROLLWIN_THUMBRELEASE)
01078 {
01079 if (event.GetOrientation() == wxHORIZONTAL)
01080 {
01081 double x = m_virtm_minX+event.GetPosition()/(m_scrollrangex*1.0)*(m_virtm_maxX-m_virtm_minX);
01082 x = x-GetVisibleMinX();
01083 ScrollWindowConstrained( x, 0);
01084 }
01085 else
01086 {
01087 double y;
01088 int position = event.GetPosition();
01089 if (GetDrawer2D()->GetYaxis())
01090 {
01091 double dvy = GetUppY()*dy;
01092
01093 y = m_virtm_maxY-position/(m_scrollrangey*1.0)*(m_virtm_maxY-m_virtm_minY);
01094 y = y-dvy-GetVisibleMinY();
01095 }
01096 else
01097 {
01098 y = m_virtm_minY+position/(m_scrollrangey*1.0)*(m_virtm_maxY-m_virtm_minY);
01099 y = y-GetVisibleMinY();
01100 }
01101 ScrollWindowConstrained( 0, y);
01102 }
01103 }
01104 else if (event.GetEventType() == wxEVT_SCROLLWIN_PAGEUP)
01105 {
01106
01107 if (event.GetOrientation() == wxHORIZONTAL)
01108 ScrollWindowConstrained( -m_scrollstepx * (m_thumbx / m_normalize), 0);
01109 else
01110 {
01111 if (GetDrawer2D()->GetYaxis())
01112 ScrollWindowConstrained( 0, m_scrollstepy * (m_thumby / m_normalize) );
01113 else
01114 ScrollWindowConstrained( 0, -m_scrollstepy * (m_thumby / m_normalize) );
01115 }
01116 }
01117 else if (event.GetEventType() == wxEVT_SCROLLWIN_PAGEDOWN)
01118 {
01119 if (event.GetOrientation() == wxHORIZONTAL)
01120 ScrollWindowConstrained(m_scrollstepx * (m_thumbx / m_normalize), 0 );
01121 else
01122 {
01123 if (GetDrawer2D()->GetYaxis())
01124 ScrollWindowConstrained( 0, -m_scrollstepy * (m_thumby / m_normalize) );
01125 else
01126 ScrollWindowConstrained( 0, m_scrollstepy * (m_thumby / m_normalize) );
01127 }
01128 }
01129 else if (event.GetEventType() == wxEVT_SCROLLWIN_LINEUP)
01130 {
01131 if (event.GetOrientation() == wxHORIZONTAL)
01132 ScrollWindowConstrained(-m_scrollstepx,0);
01133 else
01134 {
01135 if (GetDrawer2D()->GetYaxis())
01136 ScrollWindowConstrained(0,m_scrollstepy);
01137 else
01138 ScrollWindowConstrained(0,-m_scrollstepy);
01139 }
01140 }
01141 else if (event.GetEventType() == wxEVT_SCROLLWIN_LINEDOWN)
01142 {
01143 if (event.GetOrientation() == wxHORIZONTAL)
01144 ScrollWindowConstrained(m_scrollstepx, 0);
01145 else
01146 {
01147 if (GetDrawer2D()->GetYaxis())
01148 ScrollWindowConstrained(0,-m_scrollstepy);
01149 else
01150 ScrollWindowConstrained(0,m_scrollstepy);
01151 }
01152 }
01153
01154 }
01155
01156 void a2dCanvas::OnChar(wxKeyEvent& event)
01157 {
01158
01159 int dx,dy;
01160 GetSaveClientSize(&dx,&dy);
01161
01162 switch ( event.GetKeyCode() )
01163 {
01164 case WXK_PAGEUP:
01165
01166 {
01167 double y = -m_scrollstepy*m_thumby / m_normalize ;
01168 if (GetDrawer2D()->GetYaxis())
01169 y = -y;
01170 ScrollWindowConstrained(0, y);
01171 }
01172 break;
01173 case WXK_PAGEDOWN:
01174
01175 {
01176 double y = m_scrollstepy*m_thumby / m_normalize;
01177 if (GetDrawer2D()->GetYaxis())
01178 y = -y;
01179 ScrollWindowConstrained(0, y);
01180 }
01181 break;
01182 case WXK_HOME:
01183 {
01184 double y;
01185 if (GetDrawer2D()->GetYaxis())
01186 {
01187 double dvy = GetUppY()*dy;
01188 y = m_virtm_maxY-dvy-GetVisibleMinY();
01189 }
01190 else
01191 y = m_virtm_minY-GetVisibleMinY();
01192 ScrollWindowConstrained(0, y);
01193 }
01194 break;
01195 case WXK_END:
01196 {
01197 double y;
01198 if (GetDrawer2D()->GetYaxis())
01199 y = m_virtm_minY-GetVisibleMinY();
01200 else
01201 {
01202 double dvy = GetUppY()*dy;
01203 y = m_virtm_maxY-GetVisibleMinY()- dvy;
01204 }
01205 ScrollWindowConstrained(0, y );
01206 }
01207 break;
01208 case WXK_UP:
01209 {
01210 double y;
01211 if (!event.ControlDown())
01212 y = -m_scrollstepy;
01213 else
01214 y = -m_scrollstepy*m_thumby / m_normalize;
01215
01216 if (GetDrawer2D()->GetYaxis())
01217 y = -y;
01218
01219 ScrollWindowConstrained(0, y );
01220 }
01221 break;
01222
01223 case WXK_DOWN:
01224 {
01225 double y;
01226 if (!event.ControlDown())
01227 y = m_scrollstepy;
01228 else
01229 y = m_scrollstepy*m_thumby / m_normalize;
01230
01231 if (GetDrawer2D()->GetYaxis())
01232 y = -y;
01233
01234 ScrollWindowConstrained(0, y );
01235 }
01236 break;
01237
01238 case WXK_LEFT:
01239 {
01240 double x;
01241 if (!event.ControlDown())
01242 x = -m_scrollstepx;
01243 else
01244 x = -m_scrollstepx*m_thumbx / m_normalize;
01245 ScrollWindowConstrained(x, 0 );
01246 }
01247 break;
01248 case WXK_RIGHT:
01249 {
01250 double x;
01251 if (!event.ControlDown())
01252 x = m_scrollstepx;
01253 else
01254 x = m_scrollstepx*m_thumbx / m_normalize;
01255 ScrollWindowConstrained(x, 0 );
01256 }
01257 break;
01258 default:
01259
01260 {
01261 event.ResumePropagation( wxEVENT_PROPAGATE_MAX );
01262 event.Skip();
01263 }
01264 }
01265 }
01266
01267 bool a2dCanvas::ScrollWindowConstrained( double dxworld, double dyworld )
01268 {
01269 bool oke = true;
01270
01271
01272
01273
01274
01275
01276 m_view->Update( a2dCANVIEW_UPDATE_AREAS );
01277
01278 double dx = -GetDrawer2D()->WorldToDeviceXRel(dxworld);
01279 double dy = -GetDrawer2D()->WorldToDeviceYRel(dyworld);
01280
01281
01282
01283 if(dxworld!=0 && dx==0)
01284 {
01285 dx = -GetDrawer2D()->WorldToDeviceXRelNoRnd(dxworld)<0 ? -1 : 1;
01286 }
01287 if(dyworld!=0 && dy==0)
01288 {
01289 dy = -GetDrawer2D()->WorldToDeviceYRelNoRnd(dyworld)<0 ? -1 : 1;
01290 }
01291
01292
01293
01294
01295
01296 dyworld = -GetDrawer2D()->DeviceToWorldYRel( floor( dy + 0.5 ) );
01297 dxworld = -GetDrawer2D()->DeviceToWorldXRel( floor( dx + 0.5 ) );
01298
01299
01300 double newworldminx = GetVisibleMinX()+dxworld;
01301 double newworldminy = GetVisibleMinY()+dyworld;
01302
01303 GetDrawer2D()->StartRefreshDisplayDisable();
01304 GetDrawer2D()->SetMinY(newworldminy);
01305 GetDrawer2D()->SetMinX(newworldminx);
01306 if ( !MakeVirtualMaxFitVisibleArea() )
01307 {
01308
01309
01310
01311 wxWindow::ScrollWindow( (int) dx, (int) dy, NULL );
01312
01313
01314
01315
01316
01317
01318 GetDrawer2D()->SetMinX(newworldminx-dxworld);
01319
01320 if (dy != 0 || !oke )
01321
01322
01323 GetCanvasView()->Scroll( (int) dy, true, !oke);
01324
01325
01326 GetDrawer2D()->SetMinX(newworldminx);
01327
01328 if (dx != 0 || !oke )
01329
01330
01331 GetCanvasView()->Scroll( (int) dx, false, !oke);
01332
01333
01334
01335
01336
01337 if (dx != 0 || dy != 0 ||!oke )
01338 {
01339 int w,h;
01340 GetSaveClientSize(&w,&h);
01341 GetCanvasView()->BlitBuffer( 0, 0, w, h, 0, 0 );
01342 }
01343 }
01344 else
01345 m_view->Update( a2dCANVIEW_UPDATE_ALL );
01346
01347 GetDrawer2D()->EndRefreshDisplayDisable();
01348
01349 return oke;
01350 }
01351
01352 void a2dCanvas::OnSize(wxSizeEvent& WXUNUSED(event) )
01353 {
01354 if (!GetCanvasView())
01355 return;
01356
01357
01358
01359
01360
01361
01362
01363
01364
01365
01366
01367
01368
01369
01370
01371
01372
01373
01374
01375
01376
01377 if (m_xscroll_changed == true)
01378 {
01379 m_xscroll_changed = false;
01380 return;
01381 }
01382 if (m_yscroll_changed == true)
01383 {
01384 m_yscroll_changed = false;
01385 return;
01386 }
01387
01388 int clientw, clienth;
01389 int w,h;
01390
01391 GetSaveClientSize( &clientw, &clienth );
01392
01393
01394 w = clientw + m_delta;
01395 if (m_has_y_scroll)
01396 w += wxSystemSettings::GetMetric( wxSYS_VSCROLL_X );
01397 h = clienth + m_delta;
01398 if (m_has_x_scroll)
01399 h += wxSystemSettings::GetMetric( wxSYS_HSCROLL_Y );
01400
01401
01402
01403
01404 if (abs(m_oldw-w) > m_delta || abs(m_oldh-h) > m_delta)
01405 {
01406
01407 GetCanvasView()->SetBufferSize( w + m_oversizeX * 2, h + m_oversizeY * 2 );
01408
01409
01410
01411 m_view->Update( a2dCANVIEW_UPDATE_AREAS | a2dCANVIEW_UPDATE_BLIT );
01412 if (GetScaleOnResize())
01413 {
01414 GetDrawer2D()->StartRefreshDisplayDisable();
01415 if ( m_oldw != 0 && m_oldh != 0 && clientw > MIN_MAPSIZE && clienth > MIN_MAPSIZE)
01416 {
01417 if ( m_prevClientW == 0 )
01418 m_prevClientW = clientw;
01419 if ( m_prevClientH == 0 )
01420 m_prevClientH = clienth;
01421
01422 double worldoldw = GetDrawer2D()->GetVisibleWidth();
01423 double worldoldh = GetDrawer2D()->GetVisibleHeight();
01424
01425 double upp;
01426
01427 if ( clientw < clienth )
01428 upp = worldoldw/clientw;
01429 else
01430 upp = worldoldh/clienth;
01431
01432 double middlexworld = GetDrawer2D()->DeviceToWorldX(m_prevClientW/2.0);
01433 double middleyworld = GetDrawer2D()->DeviceToWorldY(m_prevClientH/2.0);
01434 GetDrawer2D()->SetMappingDeviceRect( m_oversizeX, m_oversizeY, clientw, clienth, false );
01435 GetDrawer2D()->SetMappingUpp( middlexworld - clientw/2.0*upp, middleyworld - clienth/2.0*upp, upp, upp );
01436
01437 MakeVirtualMaxFitVisibleArea();
01438
01439 m_prevClientW = clientw;
01440 m_prevClientH = clienth;
01441 }
01442
01443 GetDrawer2D()->EndRefreshDisplayDisable();
01444
01445
01446
01447
01448
01449
01450 m_view->Update( a2dCANVIEW_UPDATE_ALL | a2dCANVIEW_UPDATE_AREAS | a2dCANVIEW_UPDATE_BLIT );
01451 }
01452 else
01453 {
01454 GetDrawer2D()->StartRefreshDisplayDisable();
01455 GetDrawer2D()->SetMappingDeviceRect( m_oversizeX, m_oversizeY, clientw, clienth, false );
01456
01457
01458
01459
01460 if (GetDrawer2D()->GetYaxis())
01461 {
01462
01463
01464
01465 if (m_oldh && m_oldw)
01466 GetDrawer2D()->SetMinY(GetVisibleMinY()-(h-m_prevh)*GetUppY());
01467
01468 if (m_oldw < w)
01469 GetCanvasView()->AddPendingUpdateArea(m_oldw,0, w-m_oldw, h);
01470 if (m_oldh < h)
01471 GetCanvasView()->AddPendingUpdateArea(0,m_oldh,w, h-m_oldh);
01472 }
01473 else
01474 {
01475 if (m_oldw < w)
01476 GetCanvasView()->AddPendingUpdateArea(m_oldw,0, w-m_oldw, h);
01477 if (m_oldh < h)
01478 GetCanvasView()->AddPendingUpdateArea(0,m_oldh,w, h-m_oldh);
01479 }
01480
01481 MakeVirtualMaxFitVisibleArea();
01482 GetDrawer2D()->EndRefreshDisplayDisable();
01483
01484
01485
01486 m_view->Update( a2dCANVIEW_UPDATE_AREAS | a2dCANVIEW_UPDATE_BLIT );
01487 }
01488
01489
01490 m_oldw = w;m_oldh = h;
01491 }
01492 else
01493 {
01494 if (GetScaleOnResize())
01495 {
01496 if ( m_ContinuesSizeUpdate )
01497 {
01498 GetDrawer2D()->StartRefreshDisplayDisable();
01499 if ( m_oldw != 0 && m_oldh != 0 && clientw > MIN_MAPSIZE && clienth > MIN_MAPSIZE)
01500 {
01501 if ( m_prevClientW == 0 )
01502 m_prevClientW = clientw;
01503 if ( m_prevClientH == 0 )
01504 m_prevClientH = clienth;
01505
01506 double worldoldw = GetDrawer2D()->GetVisibleWidth();
01507 double worldoldh = GetDrawer2D()->GetVisibleHeight();
01508
01509 double upp;
01510
01511 if ( clientw < clienth )
01512 upp = worldoldw/clientw;
01513 else
01514 upp = worldoldh/clienth;
01515
01516 double middlexworld = GetDrawer2D()->DeviceToWorldX(m_prevClientW/2.0);
01517 double middleyworld = GetDrawer2D()->DeviceToWorldY(m_prevClientH/2.0);
01518 GetDrawer2D()->SetMappingDeviceRect( m_oversizeX, m_oversizeY, clientw, clienth, false );
01519 GetDrawer2D()->SetMappingUpp( middlexworld - clientw/2.0*upp, middleyworld - clienth/2.0*upp, upp, upp );
01520
01521 MakeVirtualMaxFitVisibleArea();
01522
01523 m_prevClientW = clientw;
01524 m_prevClientH = clienth;
01525 }
01526
01527 GetDrawer2D()->EndRefreshDisplayDisable();
01528
01529
01530
01531
01532
01533
01534 m_view->Update( a2dCANVIEW_UPDATE_ALL | a2dCANVIEW_UPDATE_AREAS | a2dCANVIEW_UPDATE_BLIT );
01535 }
01536 }
01537 else if (GetDrawer2D()->GetYaxis())
01538 {
01539 GetDrawer2D()->StartRefreshDisplayDisable();
01540
01541 double uppy = GetUppY();
01542
01543
01544
01545
01546
01547
01548
01549
01550
01551 GetDrawer2D()->SetMappingDeviceRect( m_oversizeX, m_oversizeY, clientw, clienth, false );
01552 GetDrawer2D()->SetMinY(GetVisibleMinY()-(h-m_prevh)*uppy);
01553
01554 if ( MakeVirtualMaxFitVisibleArea() )
01555 m_view->Update( a2dCANVIEW_UPDATE_ALL );
01556
01557 GetDrawer2D()->EndRefreshDisplayDisable();
01558
01559 }
01560
01561 }
01562 m_prevw = w;
01563 m_prevh = h;
01564 }
01565
01566
01567 void a2dCanvas::OnWheel( wxMouseEvent& event )
01568 {
01569 int rot = event.GetWheelRotation();
01570
01571 if ( rot > 0 )
01572 {
01573 if ( event.AltDown() )
01574 {
01575 if ( !event.ShiftDown() )
01576 {
01577 double y;
01578 if (!event.ControlDown())
01579 y = -m_scrollstepy;
01580 else
01581 y = -m_scrollstepy*m_thumby / m_normalize;
01582
01583 if (GetDrawer2D()->GetYaxis())
01584 y = -y;
01585
01586 ScrollWindowConstrained(0, y );
01587 }
01588 else
01589 {
01590 double x;
01591 if (!event.ControlDown())
01592 x = -m_scrollstepx;
01593 else
01594 x = -m_scrollstepx*m_thumbx / m_normalize;
01595 ScrollWindowConstrained(x, 0 );
01596 }
01597 }
01598 else
01599 {
01600 ZoomOutAtXy( event.m_x, event.m_y, 0.75 );
01601 }
01602 }
01603 else
01604 {
01605 if ( event.AltDown() )
01606 {
01607 if ( !event.ShiftDown() )
01608 {
01609 double y;
01610 if (!event.ControlDown())
01611 y = m_scrollstepy;
01612 else
01613 y = m_scrollstepy*m_thumby / m_normalize;
01614
01615 if (GetDrawer2D()->GetYaxis())
01616 y = -y;
01617
01618 ScrollWindowConstrained(0, y );
01619 }
01620 else
01621 {
01622 double x;
01623 if (!event.ControlDown())
01624 x = m_scrollstepx;
01625 else
01626 x = m_scrollstepx*m_thumbx / m_normalize;
01627 ScrollWindowConstrained(x, 0 );
01628 }
01629 }
01630 else
01631 {
01632 ZoomOutAtXy( event.m_x, event.m_y, 1.5 );
01633 }
01634 }
01635 }
01636
01637