00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #pragma warning(disable:4786)
00012
00013 #include "a2dprec.h"
00014
00015 #ifdef __BORLANDC__
00016 #pragma hdrstop
00017 #endif
00018
00019 #ifndef WX_PRECOMP
00020 #include "wx/wx.h"
00021 #endif
00022
00023 #include <wx/wfstream.h>
00024 #include <math.h>
00025
00026 #if wxART2D_USE_CANEXTOBJ
00027 #include "wx/canextobj/eval.h"
00028 #endif //wxART2D_USE_CANEXTOBJ
00029
00030 #include "wx/curves/meta.h"
00031
00032 #include "wx/canvas/canobj.h"
00033 #include "wx/canvas/candoc.h"
00034 #include "wx/canvas/drawer.h"
00035 #include "wx/canvas/canvas.h"
00036 #include "wx/canvas/cancom.h"
00037
00038 #if wxART2D_USE_EDITOR
00039 #include "wx/editor/edit.h"
00040 #endif //wxART2D_USE_EDITOR
00041
00042
00043
00044
00045
00046 IMPLEMENT_CLASS(a2dCurveZoomTool,a2dStTool)
00047
00048
00049
00050
00051
00052 class a2dCommand_SetInternalBoundaries: public a2dCommand
00053 {
00054
00055 public:
00056
00057 static const a2dCommandId COMID_SetInternalBoundaries;
00058
00059 a2dCommand_SetInternalBoundaries( a2dCanvasXYDisplayGroupAreas* object, a2dBboxHash* irectHash);
00060
00061 ~a2dCommand_SetInternalBoundaries(void);
00062
00063 bool Do(void);
00064 bool Undo(void);
00065
00066 inline a2dCanvasCommandProcessor *GetCanvasCmp() { return wxStaticCast( m_cmp, a2dCanvasCommandProcessor); }
00067
00068 protected:
00069
00070 a2dSmrtPtr<a2dBboxHash> m_irectHash;
00071
00072
00073
00074
00075
00076 a2dSmrtPtr<a2dCanvasXYDisplayGroupAreas> m_canvasobject;
00077
00078
00079 };
00080
00081 const a2dCommandId a2dCommand_SetInternalBoundaries::COMID_SetInternalBoundaries( wxT("SetInternalBoundaries") );
00082
00083
00084
00085
00086
00087 a2dCommand_SetInternalBoundaries::a2dCommand_SetInternalBoundaries(
00088 a2dCanvasXYDisplayGroupAreas* object, a2dBboxHash* irectHash) :
00089
00090 a2dCommand( true, COMID_SetInternalBoundaries ), m_irectHash(irectHash)
00091 {
00092 m_canvasobject = object;
00093
00094
00095
00096
00097 }
00098
00099 a2dCommand_SetInternalBoundaries::~a2dCommand_SetInternalBoundaries(void)
00100 {
00101 }
00102
00103 bool a2dCommand_SetInternalBoundaries::Do(void)
00104 {
00105 a2dBboxHash* oldIRectHash = new a2dBboxHash;
00106 const a2dCurvesAreaList& areaList = m_canvasobject->GetCurvesAreaList();
00107 size_t i;
00108 for(i=0; i < areaList.GetCount(); i++)
00109 {
00110 a2dCurvesArea* area = areaList.Item(i);
00111 const a2dBoundingBox& aRect = area->GetInternalBoundaries();
00112 (*oldIRectHash)[area->GetName()] = aRect;
00113 }
00114
00115 for(i=0; i < areaList.GetCount(); i++)
00116 {
00117 a2dCurvesArea* area = areaList.Item(i);
00118 const a2dBoundingBox& aRect = (*m_irectHash)[area->GetName()];
00119 area->SetInternalBoundaries(m_canvasobject->GetPlotAreaRect(),aRect);
00120 }
00121 m_canvasobject->SetPending(true);
00122 m_canvasobject->GetAxisX()->SetPending(true);
00123 if(m_canvasobject->GetCursor())
00124 m_canvasobject->GetCursor()->SetPending(true);
00125
00126 m_irectHash = oldIRectHash;
00127
00128 m_canvasobject->Update( a2dCanvasObject::updatemask_normal );
00129
00130 GetCanvasCmp()->GetCanvasDocument()->Modify(true);
00131 GetCanvasCmp()->GetCanvasDocument()->UpdateAllViews( NULL, a2dCANVIEW_UPDATE_OLDNEW|a2dCANVIEW_UPDATE_VIEWDEPENDENT|a2dCANVIEW_UPDATE_VIEWDEPENDENT_RIGHTNOW );
00132
00133 return true;
00134 }
00135
00136 bool a2dCommand_SetInternalBoundaries::Undo(void)
00137 {
00138 a2dBboxHash* oldIRectHash = new a2dBboxHash;
00139 const a2dCurvesAreaList& areaList = m_canvasobject->GetCurvesAreaList();
00140 size_t i;
00141 for(i=0; i < areaList.GetCount(); i++)
00142 {
00143 a2dCurvesArea* area = areaList.Item(i);
00144 const a2dBoundingBox& aRect = area->GetInternalBoundaries();
00145 (*oldIRectHash)[area->GetName()] = aRect;
00146 }
00147
00148 for(i=0; i < areaList.GetCount(); i++)
00149 {
00150 a2dCurvesArea* area = areaList.Item(i);
00151 const a2dBoundingBox& aRect = (*m_irectHash)[area->GetName()];
00152 area->SetInternalBoundaries(m_canvasobject->GetPlotAreaRect(),aRect);
00153 }
00154 m_canvasobject->SetPending(true);
00155 m_canvasobject->GetAxisX()->SetPending(true);
00156 if(m_canvasobject->GetCursor())
00157 m_canvasobject->GetCursor()->SetPending(true);
00158
00159 m_irectHash = oldIRectHash;
00160
00161 m_canvasobject->Update( a2dCanvasObject::updatemask_normal );
00162
00163 GetCanvasCmp()->GetCanvasDocument()->Modify(true);
00164 GetCanvasCmp()->GetCanvasDocument()->UpdateAllViews( NULL, a2dCANVIEW_UPDATE_OLDNEW|a2dCANVIEW_UPDATE_VIEWDEPENDENT|a2dCANVIEW_UPDATE_VIEWDEPENDENT_RIGHTNOW );
00165
00166 return true;
00167 }
00168
00169
00170
00171
00172
00173
00174 #if wxART2D_USE_EDITOR
00175
00176 #define CONTRDRAWER m_controller->GetCanvasView()
00177 #define CONTRDRAWER2D m_controller->GetCanvasView()->GetDrawer2D()
00178
00179 A2D_BEGIN_EVENT_TABLE(a2dCurveZoomTool,a2dStTool)
00180 A2D_EVT_CHAR(a2dCurveZoomTool::OnChar)
00181 A2D_EVT_MOUSE_EVENTS(a2dCurveZoomTool::OnMouseEvent)
00182 A2D_END_EVENT_TABLE()
00183
00184 a2dCurveZoomTool::a2dCurveZoomTool(a2dStToolContr* controller):a2dStTool(controller)
00185 {
00186 m_anotate = true;
00187 m_toolcursor = a2dCanvasGlobals->GetCursor( a2dCURSOR_MAGNIFIER );
00188 m_toolBusyCursor = a2dCanvasGlobals->GetCursor( a2dCURSOR_CROSS );
00189
00190
00191 if(a2dDocviewGlobals->GetEventDistributer())
00192 a2dDocviewGlobals->GetEventDistributer()->Unregister( this );
00193
00194
00195 SetFill( *a2dTRANSPARENT_FILL );
00196 SetStroke( a2dStroke(*wxBLACK, 1, a2dSTROKE_LONG_DASH) );
00197 }
00198
00199 a2dCurveZoomTool::~a2dCurveZoomTool()
00200 {
00201 }
00202
00203 void a2dCurveZoomTool::GenerateAnotation()
00204 {
00205
00206 a2dStTool::AddAnotationToPendingUpdateArea();
00207
00208 a2dRect* rec = wxStaticCast( m_canvasobject.Get(), a2dRect );
00209 m_anotation.Printf( wxT("w %6.3f h %6.3f") , rec->GetWidth(), rec->GetHeight() );
00210 m_xanotation = m_x;
00211 m_yanotation = m_y;
00212
00213 wxDC *dc = GetDrawer2D()->GetRenderDC();
00214 if ( dc )
00215 {
00216 wxCoord w, h;
00217 dc->SetFont( m_annotateFont );
00218 dc->GetTextExtent( m_anotation, &w, &h );
00219 m_xanotation = m_x + (int) h;
00220 m_yanotation = m_y + (int) h;
00221 a2dStTool::AddAnotationToPendingUpdateArea();
00222 }
00223 }
00224
00225 void a2dCurveZoomTool::OnChar(wxKeyEvent& event)
00226 {
00227 if (!GetBusy())
00228 {
00229 switch(event.GetKeyCode())
00230 {
00231 case WXK_RETURN:
00232 {
00233 m_stcontroller->Zoomout();
00234 }
00235 break;
00236 case WXK_SUBTRACT:
00237 {
00238 m_stcontroller->ZoomUndo();
00239 }
00240 break;
00241 default:
00242 event.Skip();
00243 }
00244 }
00245 else
00246 event.Skip();
00247 }
00248
00249 void a2dCurveZoomTool::OnMouseEvent(wxMouseEvent& event)
00250 {
00251 if (!m_active)
00252 {
00253 event.Skip();
00254 return;
00255 }
00256
00257 if ( GetBusy() )
00258 GetCanvasView()->SetCursor( m_toolBusyCursor );
00259 else
00260 GetCanvasView()->SetCursor( m_toolcursor );
00261
00262 m_x = event.GetX();
00263 m_y = event.GetY();
00264 MouseToToolWorld( m_x, m_y, m_xwprev, m_ywprev );
00265
00266 if (event.LeftDClick() && !GetBusy())
00267 {
00268
00269 a2dCanvasObject* object;
00270 object = GetCanvasView()->IsHitWorld( m_xwprev, m_ywprev );
00271
00272 if (!object)
00273 return;
00274 if (0 == wxDynamicCast(object , a2dCanvasXYDisplayGroupAreas))
00275 {
00276 m_curves=0;
00277 return;
00278 }
00279 m_curves=(a2dCanvasXYDisplayGroupAreas*)object;
00280
00281 a2dBboxHash* aHash = new a2dBboxHash;
00282
00283 m_curves->AppendCurvesBoundaries(aHash);
00284
00285 GetCanvasDocument()->GetCommandProcessor()->Submit(
00286 new a2dCommand_SetInternalBoundaries( m_curves, aHash));
00287
00288 m_curves->SetPending( true );
00289 }
00290 else if (event.LeftDown() && !GetBusy())
00291 {
00292 a2dCanvasObject* object;
00293 object = GetCanvasView()->IsHitWorld( m_xwprev, m_ywprev );
00294
00295 if (!object)
00296 return;
00297 if ( 0 == wxDynamicCast(object , a2dCanvasXYDisplayGroupAreas) )
00298 {
00299 m_curves = 0;
00300 return;
00301 }
00302 m_curves = (a2dCanvasXYDisplayGroupAreas*)object;
00303
00304 a2dRect* rec = new a2dRect( m_xwprev, m_ywprev, 0, 0, 0);
00305 m_parentobject = GetCanvasView()->GetShowObject();
00306 m_canvasobject = rec;
00307 AddDecorationObject( rec );
00308
00309 rec->SetCanvasDocument( GetCanvasView()->GetCanvasDocument() );
00310 rec->SetFill( m_fill );
00311 rec->SetStroke( m_stroke );
00312 rec->Update( a2dCanvasObject::updatemask_force );
00313 m_pending = true;
00314 EnterBusyMode();
00315
00316
00317
00318
00319 event.Skip();
00320 }
00321 else if ( event.LeftUp() && GetBusy())
00322 {
00323 a2dRect* rec = wxStaticCast( m_canvasobject.Get(), a2dRect );
00324
00325 double w = GetDrawer2D()->WorldToDeviceXRel( rec->GetWidth() );
00326 double h = GetDrawer2D()->WorldToDeviceYRel( rec->GetHeight() );
00327
00328 a2dAffineMatrix tworld = m_curves->GetTransformMatrix();
00329
00330 a2dAffineMatrix inverse = tworld;
00331 inverse.Invert();
00332
00333
00334
00335 if (fabs( w ) < 3 && fabs( h )< 3)
00336 {
00337 FinishBusyMode();
00338 SetPending( true );
00339 a2dCursor* aCursor = m_curves->GetCursor();
00340 if(aCursor)
00341 {
00342
00343 double xwi;
00344 double ywi;
00345 inverse.TransformPoint( rec->GetPosX(),rec->GetPosY(), xwi, ywi );
00346 a2dSmrtPtr<a2dCurvesArea> area = m_curves->GetCurvesAreaList().GetBaseCurvesArea();
00347 double xcurve, ycurve;
00348 area->World2Curve( xwi, ywi, xcurve, ycurve );
00349 aCursor->SetPosition(xcurve, ycurve, area->GetCurveAreaTransform());
00350 }
00351 event.Skip();
00352 }
00353 else
00354 {
00355 double xwi;
00356 double ywi;
00357 double x2wi;
00358 double y2wi;
00359 inverse.TransformPoint( rec->GetBbox().GetMinX(), rec->GetBbox().GetMinY(), xwi, ywi );
00360 inverse.TransformPoint( rec->GetBbox().GetMaxX(), rec->GetBbox().GetMaxY(), x2wi, y2wi );
00361
00362 a2dBboxHash* aHash = new a2dBboxHash;
00363
00364 const a2dCurvesAreaList& areaList = m_curves->GetCurvesAreaList();
00365 for(size_t i=0; i < areaList.GetCount(); i++)
00366 {
00367 a2dCurvesArea* area = areaList.Item(i);
00368
00369 double xcurve, ycurve;
00370 double xcurve2, ycurve2;
00371 area->World2Curve( xwi, ywi, xcurve, ycurve );
00372 area->World2Curve( x2wi, y2wi, xcurve2, ycurve2 );
00373
00374 a2dBoundingBox aRect(xcurve, ycurve, xcurve2, ycurve2);
00375 (*aHash)[area->GetName()] = aRect;
00376 }
00377
00378 GetCanvasDocument()->GetCommandProcessor()->Submit(
00379 new a2dCommand_SetInternalBoundaries( m_curves, aHash ) );
00380
00381 m_curves->SetPending( true );
00382
00383 FinishBusyMode();
00384 event.Skip();
00385 }
00386 }
00387 else if ((event.Dragging() && GetBusy()) )
00388 {
00389 a2dRect* rec = wxStaticCast( m_canvasobject.Get(), a2dRect );
00390 rec->SetWidth( m_xwprev - rec->GetPosX() );
00391 rec->SetHeight( m_ywprev - rec->GetPosY() );
00392
00393 m_pending = true;
00394 }
00395 else
00396 event.Skip();
00397 }
00398
00399 #endif //wxART2D_USE_EDITOR
00400
00401
00402