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/canmod.h"
00022
00023 #include "wx/canvas/tools.h"
00024
00025 IMPLEMENT_CLASS( a2dBaseTool, a2dEvtHandler)
00026 IMPLEMENT_CLASS( a2dToolContr, a2dEvtHandler)
00027
00028
00029
00030
00031
00032 a2dToolList::a2dToolList()
00033 {
00034 }
00035
00036 a2dToolList::~a2dToolList()
00037 {
00038 }
00039
00040 a2dToolList* a2dToolList::Clone( a2dObject::CloneOptions options ) const
00041 {
00042 a2dToolList* a = new a2dToolList();
00043
00044 for( a2dToolList::const_iterator iter = begin(); iter != end(); ++iter )
00045 {
00046 a2dToolList::value_type toolobj = *iter;
00047
00048 if ( options & a2dObject::clone_childs )
00049 {
00050 a2dBaseTool *objnew = wxStaticCast( toolobj->Clone( options ), a2dBaseTool );
00051 a->push_back(objnew);
00052 }
00053 else
00054 a->push_back( toolobj );
00055 }
00056
00057 return a;
00058 }
00059
00060
00061
00062
00063
00064 A2D_BEGIN_EVENT_TABLE(a2dToolContr, a2dEvtHandler)
00065 A2D_EVT_CLOSE_VIEW( a2dToolContr::OnCloseView )
00066 A2D_EVT_PAINT( a2dToolContr::OnPaint )
00067 A2D_EVT_IDLE( a2dToolContr::OnIdle )
00068 A2D_EVT_ENTER_WINDOW( a2dToolContr::OnEnter )
00069 A2D_EVT_SET_DOCUMENT( a2dToolContr::OnSetDocument )
00070 A2D_END_EVENT_TABLE()
00071
00072 a2dToolContr::a2dToolContr(a2dCanvasView* drawer)
00073 {
00074 SetSnap( false );
00075 m_bussyPoping = false;
00076
00077
00078 m_view = drawer;
00079
00080 if ( m_view )
00081 {
00082
00083
00084 if ( m_view->GetCanvasDocument() && !m_view->GetCanvasDocument()->GetCommandProcessor() )
00085 m_view->GetCanvasDocument()->CreateCommandProcessor();
00086
00087 m_view->SetCanvasToolContr( this );
00088 SetEvtHandlerEnabled( true );
00089 }
00090 else
00091 SetEvtHandlerEnabled( false );
00092 }
00093
00094 a2dToolContr::~a2dToolContr()
00095 {
00096 }
00097
00098 a2dBaseTool* a2dToolContr::GetFirstTool() const
00099 {
00100 return m_tools.size()? m_tools.front(): NULL;
00101 }
00102
00103 void a2dToolContr::SetCanvasView(a2dCanvasView* view)
00104 {
00105
00106 a2dREFOBJECTPTR_KEEPALIVE;
00107
00108 if ( m_view )
00109 {
00110 m_view->SetCanvasToolContr( NULL );
00111 SetEvtHandlerEnabled( false );
00112 }
00113
00114 m_view = view;
00115
00116 if ( m_view )
00117 {
00118 m_view->SetCanvasToolContr( this );
00119 SetEvtHandlerEnabled(true);
00120 }
00121 else
00122 SetEvtHandlerEnabled(false);
00123 }
00124
00125 void a2dToolContr::ReStart()
00126 {
00127 }
00128
00129 void a2dToolContr::StopAllTools()
00130 {
00131 a2dSmrtPtr< a2dBaseTool > tool;
00132 a2dToolContr::PopTool( tool );
00133 while ( tool )
00134 {
00135 tool = NULL;
00136 a2dToolContr::PopTool( tool );
00137 }
00138 }
00139
00140 void a2dToolContr::Disable()
00141 {
00142 SetEvtHandlerEnabled( false );
00143 StopAllTools();
00144 m_view = 0;
00145 }
00146
00147 void a2dToolContr::ActivateTop( bool active )
00148 {
00149
00150 for( a2dToolList::reverse_iterator iter = m_tools.rbegin(); iter != m_tools.rend(); ++iter )
00151 {
00152 a2dToolList::value_type toolobj = *iter;
00153 if ( *iter == m_tools.front() )
00154 toolobj->SetActive( active );
00155 else
00156 toolobj->SetActive(false);
00157 }
00158 }
00159
00160 bool a2dToolContr::Activate(const wxString& tool, bool disableothers)
00161 {
00162 bool found=false;
00163
00164 for( a2dToolList::iterator iter = m_tools.begin(); iter != m_tools.end(); ++iter )
00165 {
00166 a2dToolList::value_type toolobj = *iter;
00167 if (!tool.CmpNoCase( toolobj->GetClassInfo()->GetClassName()))
00168 {
00169 toolobj->SetActive(true);
00170 found=true;
00171 }
00172 else if (disableothers)
00173 toolobj->SetActive(false);
00174 }
00175 return found;
00176 }
00177
00178 bool a2dToolContr::EnableTool(const wxString& tool, bool disableothers)
00179 {
00180 bool found=false;
00181
00182 for( a2dToolList::iterator iter = m_tools.begin(); iter != m_tools.end(); ++iter )
00183 {
00184 a2dToolList::value_type toolobj = *iter;
00185
00186 if (!tool.CmpNoCase( toolobj->GetClassInfo()->GetClassName()))
00187 {
00188 toolobj->SetEvtHandlerEnabled(true);
00189 found=true;
00190 }
00191 else if (disableothers)
00192 toolobj->SetEvtHandlerEnabled(false);
00193 }
00194 return found;
00195 }
00196
00197 bool a2dToolContr::EnableTool(a2dBaseTool* tool, bool disableothers)
00198 {
00199 bool found=false;
00200 for( a2dToolList::iterator iter = m_tools.begin(); iter != m_tools.end(); ++iter )
00201 {
00202 a2dToolList::value_type toolobj = *iter;
00203 if ( tool == toolobj )
00204 {
00205 toolobj->SetEvtHandlerEnabled(true);
00206 found=true;
00207 }
00208 else if (disableothers)
00209 toolobj->SetEvtHandlerEnabled(false);
00210 }
00211 return found;
00212 }
00213
00214 bool a2dToolContr::DisableTool(const wxString& tool )
00215 {
00216 bool found=false;
00217 for( a2dToolList::iterator iter = m_tools.begin(); iter != m_tools.end(); ++iter )
00218 {
00219 a2dToolList::value_type toolobj = *iter;
00220 if (!tool.CmpNoCase(toolobj->GetClassInfo()->GetClassName()))
00221 {
00222 toolobj->SetEvtHandlerEnabled(false);
00223 found=true;
00224 }
00225 }
00226 return found;
00227 }
00228
00229 bool a2dToolContr::DisableTool(a2dBaseTool* tooldis )
00230 {
00231 bool found=false;
00232 for( a2dToolList::iterator iter = m_tools.begin(); iter != m_tools.end(); ++iter )
00233 {
00234 a2dToolList::value_type toolobj = *iter;
00235 if ( toolobj == tooldis )
00236 {
00237 tooldis->SetEvtHandlerEnabled(false);
00238 found=true;
00239 }
00240 }
00241 return found;
00242 }
00243
00244 a2dBaseTool* a2dToolContr::SearchTool(const wxString& toolsearch )
00245 {
00246 for( a2dToolList::iterator iter = m_tools.begin(); iter != m_tools.end(); ++iter )
00247 {
00248 a2dToolList::value_type toolobj = *iter;
00249 if (!toolsearch.CmpNoCase(toolobj->GetClassInfo()->GetClassName()))
00250 return toolobj;
00251 }
00252 return (a2dBaseTool*) 0;
00253 }
00254
00255 bool a2dToolContr::ProcessEvent(wxEvent& event)
00256 {
00257 if ( !m_view || !m_view->GetEnabled())
00258 {
00259 return false;
00260 }
00261
00262 a2dEvtHandler* active = GetEventHandler();
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278 if ( active->GetEvtHandlerEnabled() )
00279 {
00280 if ( !m_bussyPoping && GetFirstTool() && GetFirstTool()->GetStopTool() )
00281 {
00282 a2dSmrtPtr<a2dBaseTool> poped;
00283 PopTool( poped );
00284 }
00285
00286 if ( a2dEvtHandler::ProcessEvent(event) )
00287 return true;
00288
00289 return ToolsProcessEvent(event);
00290 }
00291
00292 return false;
00293 }
00294
00295 bool a2dToolContr::ToolsProcessEvent(wxEvent& event)
00296 {
00297 bool handled = false;
00298
00299 if ( GetFirstTool() )
00300 {
00301
00302
00303
00304
00305 size_t nrTools = m_tools.size();
00306
00307
00308
00309
00310
00311
00312 a2dToolList::iterator iter = m_tools.begin();
00313 while( !handled && iter != m_tools.end() )
00314 {
00315 a2dBaseTool *first = (*iter).Get();
00316 iter++;
00317 handled = first->ProcessEvent(event);
00318 if ( nrTools < m_tools.size() )
00319 {
00320 iter = m_tools.begin();
00321 nrTools = m_tools.size();
00322 }
00323
00324 if ( GetFirstTool()->GetStopTool())
00325 {
00326 if ( !m_bussyPoping )
00327 {
00328 a2dSmrtPtr<a2dBaseTool> poped;
00329 PopTool(poped);
00330 }
00331 iter = m_tools.begin();
00332 }
00333
00334 }
00335
00336 return handled;
00337 }
00338 return false;
00339 }
00340
00341 bool a2dToolContr::PushTool(a2dBaseTool* handler)
00342 {
00343 a2dBaseToolPtr handlerres = handler;
00344
00345 if ( GetFirstTool() )
00346 {
00347 a2dComEvent event( GetFirstTool(), handler, &a2dBaseTool::sm_toolBeforePush );
00348 if ( GetFirstTool()->ProcessEvent( event ) && event.GetEventComIdReturn() == &a2dBaseTool::sm_toolDoPopBeforePush )
00349 {
00350
00351
00352 a2dSmrtPtr<a2dBaseTool> poped;
00353 if ( GetFirstTool()->GetStopTool() )
00354 PopTool(poped);
00355 }
00356 }
00357
00358 if ( handler->StartTool( GetFirstTool() ) )
00359 {
00360 ActivateTop( false );
00361 m_tools.push_front( handler );
00362 a2dCanvasDocument *doc;
00363 if ( GetCanvasView() )
00364 doc = GetCanvasView()->GetCanvasDocument();
00365 if ( doc )
00366 {
00367 a2dComEvent event( GetFirstTool(), &a2dBaseTool::sm_toolPushed );
00368 GetFirstTool()->ProcessEvent( event );
00369 }
00370 ActivateTop( true );
00371 return true;
00372 }
00373 return false;
00374 }
00375
00376 bool a2dToolContr::PopTool( a2dSmrtPtr<a2dBaseTool>& poped, bool force )
00377 {
00378 m_bussyPoping = true;
00379
00380 if ( GetFirstTool() && ( GetFirstTool()->AllowPop() || force ) )
00381 {
00382 GetFirstTool()->StopTool( force );
00383 poped = GetFirstTool();
00384 if ( poped )
00385 {
00386
00387
00388
00389 m_tools.ReleaseObject( poped );
00390
00391
00392 if ( GetFirstTool() )
00393 {
00394 a2dCanvasDocument *doc;
00395 if ( GetCanvasView() )
00396 doc = GetCanvasView()->GetCanvasDocument();
00397
00398 if ( doc )
00399 {
00400 a2dComEvent event( GetFirstTool(), poped, &a2dBaseTool::sm_toolPoped );
00401 GetFirstTool()->ProcessEvent( event );
00402 }
00403 }
00404 poped->SetActive( false );
00405 }
00406
00407 m_bussyPoping = false;
00408 return true;
00409 }
00410 m_bussyPoping = false;
00411 poped = NULL;
00412 return false;
00413 }
00414
00415 void a2dToolContr::AppendTool(a2dBaseTool *handler)
00416 {
00417 m_tools.push_back( handler );
00418 }
00419
00420 void a2dToolContr::OnCloseView( a2dCloseViewEvent& event )
00421 {
00422 a2dView* theView = (a2dView*) event.GetEventObject();
00423 if ( theView == m_view )
00424 {
00425 StopAllTools();
00426 event.Skip( true );
00427 }
00428 }
00429
00430 void a2dToolContr::OnSetDocument( a2dViewEvent& event )
00431 {
00432 a2dCanvasDocument* doc = (a2dCanvasDocument*) ((a2dView*)event.GetEventObject())->GetDocument();
00433 StopAllTools();
00434 event.Skip( true );
00435 }
00436
00437 void a2dToolContr::OnEnter( wxMouseEvent &event )
00438 {
00439 event.Skip(true);
00440 }
00441
00442 void a2dToolContr::OnPaint( wxPaintEvent &event )
00443 {
00444 if (GetFirstTool())
00445 {
00446 GetFirstTool()->ProcessEvent(event);
00447 }
00448
00449
00450 event.Skip(false);
00451 }
00452
00453 void a2dToolContr::OnIdle( wxIdleEvent &event )
00454 {
00455 if (GetFirstTool())
00456 {
00457 GetFirstTool()->ProcessEvent(event);
00458 }
00459 }
00460
00461 bool a2dToolContr::StartEditingObject( a2dCanvasObject* objectToEdit )
00462 {
00463 return false;
00464 }
00465
00466 bool a2dToolContr::StartEditingObject( a2dCanvasObject* objectToEdit, a2dIterC& ic )
00467 {
00468 return false;
00469 }
00470
00471 bool a2dToolContr::TriggerReStartEdit( wxUint16 editmode )
00472 {
00473 return false;
00474 }
00475
00476 void a2dToolContr::Render()
00477 {
00478 for( a2dToolList::reverse_iterator iter = m_tools.rbegin(); iter != m_tools.rend(); ++iter )
00479 (*iter)->Render();
00480 }
00481
00482 bool a2dToolContr::SetCorridor( const a2dCorridor& corridor )
00483 {
00484 wxASSERT_MSG( GetFirstTool(), wxT("No tool set in controller") );
00485 GetFirstTool()->SetCorridor( corridor );
00486 return true;
00487 }
00488
00489 void a2dToolContr::SetSnap(bool snap)
00490 {
00491 m_snap = snap;
00492 a2dRestrictionEngine *restrict = a2dCanvasGlobals->GetRestrictionEngine();
00493 if(restrict)
00494 restrict->SetSnap( m_snap );
00495 }
00496
00497
00498
00499
00500
00501
00502 a2dPropertyIdBool* a2dBaseTool::PROPID_Oneshot = NULL;
00503 a2dPropertyIdBool* a2dBaseTool::PROPID_Stop = NULL;
00504 a2dPropertyIdFill* a2dBaseTool::PROPID_Fill = NULL;
00505 a2dPropertyIdStroke* a2dBaseTool::PROPID_Stroke = NULL;
00506 a2dPropertyIdUint16* a2dBaseTool::PROPID_Layer = NULL;
00507
00508 INITIALIZE_PROPERTIES( a2dBaseTool, a2dEvtHandler )
00509 {
00510 A2D_PROPID_M( a2dPropertyIdBool, a2dBaseTool, Oneshot, false, m_oneshot );
00511 A2D_PROPID_M( a2dPropertyIdBool, a2dBaseTool, Stop, false, m_stop );
00512 A2D_PROPID_M( a2dPropertyIdUint16, a2dBaseTool, Layer, 0, m_layer );
00513
00514 PROPID_Fill = new a2dPropertyIdFill( wxT("Fill"),
00515 a2dPropertyId::flag_transfer|a2dPropertyId::flag_clonedeep,
00516 *a2dNullFILL,
00517 static_cast < a2dPropertyIdFill::ConstGet >(&a2dBaseTool::GetFill),
00518 static_cast < a2dPropertyIdFill::ConstSet >(&a2dBaseTool::SetFill) );
00519 AddPropertyId( PROPID_Fill );
00520
00521 PROPID_Stroke = new a2dPropertyIdStroke( wxT("Stroke"),
00522 a2dPropertyId::flag_transfer|a2dPropertyId::flag_clonedeep,
00523 *a2dNullSTROKE,
00524 static_cast < a2dPropertyIdStroke::ConstGet >(&a2dBaseTool::GetStroke),
00525 static_cast < a2dPropertyIdStroke::ConstSet >(&a2dBaseTool::SetStroke) );
00526 AddPropertyId( PROPID_Stroke );
00527 return true;
00528 }
00529
00530 DEFINE_EVENT_TYPE( a2dBaseTool::sm_toolPushed )
00531 DEFINE_EVENT_TYPE( a2dBaseTool::sm_toolPoped )
00532 DEFINE_EVENT_TYPE( a2dBaseTool::sm_toolBeforePush )
00533 DEFINE_EVENT_TYPE( a2dBaseTool::sm_toolDoPopBeforePush )
00534 DEFINE_EVENT_TYPE( a2dBaseTool::sm_toolComEvent )
00535
00536 A2D_BEGIN_EVENT_TABLE(a2dBaseTool, a2dEvtHandler)
00537 A2D_EVT_MOUSE_EVENTS(a2dBaseTool::OnMouseEvent)
00538 A2D_EVT_CHAR(a2dBaseTool::OnChar)
00539 A2D_EVT_KEY_DOWN(a2dBaseTool::OnKeyDown)
00540 A2D_EVT_KEY_UP(a2dBaseTool::OnKeyUp)
00541 A2D_EVT_COM_EVENT( a2dBaseTool::OnComEvent )
00542 A2D_EVT_DO( a2dBaseTool::OnDoEvent )
00543 A2D_EVT_UNDO( a2dBaseTool::OnUndoEvent )
00544 A2D_EVT_REDO( a2dBaseTool::OnRedoEvent )
00545 A2D_EVT_REMOVE_VIEW( a2dBaseTool::OnRemoveView )
00546 A2D_END_EVENT_TABLE()
00547
00548
00549 a2dBaseTool::a2dBaseTool(a2dToolContr* controller)
00550 {
00551
00552
00553 m_mode = 0;
00554
00555 m_anotate = true;
00556
00557 m_toolcursor = a2dCanvasGlobals->GetCursor( a2dCURSOR_ARROW );
00558 m_toolBusyCursor = a2dCanvasGlobals->GetCursor( a2dCURSOR_ARROW );
00559
00560 m_annotateFont = wxFont( 10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
00561
00562
00563 m_fill = *a2dNullFILL;
00564 m_stroke = *a2dNullSTROKE;
00565 m_contourwidth = 0;
00566
00567 m_layer = wxLAYER_DEFAULT;
00568 m_controller = controller;
00569 m_busy = false;
00570 m_halted = false;
00571 m_oneshot = false;
00572 m_active = true;
00573 m_stop = false;
00574 m_bussyStopping = 0;
00575 m_pending = false;
00576
00577 m_canvas_mouseevents_restore = GetCanvasView()->GetMouseEvents();
00578
00579 m_mousemenu = NULL;
00580
00581 m_corridor = a2dCorridor( *GetCanvasView() );
00582 if ( !m_corridor.empty() )
00583 {
00584 m_parentobject = m_corridor.back();
00585 wxASSERT_MSG( m_parentobject->GetCanvasDocument() != 0 , wxT("parentobject of tools has no document root set") );
00586 }
00587
00588
00589 m_eventHandler = NULL;
00590
00591 m_ignorePendingObjects = false;
00592 }
00593
00594 a2dBaseTool::a2dBaseTool( const a2dBaseTool& other, CloneOptions options )
00595 :a2dEvtHandler( other, options )
00596 {
00597
00598
00599 m_mode = other.m_mode;
00600
00601 m_anotate = other.m_anotate;
00602
00603 m_toolcursor = other.m_toolcursor;
00604 m_toolBusyCursor = other.m_toolBusyCursor;
00605
00606 m_annotateFont = other.m_annotateFont;
00607
00608
00609 m_fill = other.m_fill;
00610 m_stroke = other.m_stroke;
00611 m_contourwidth = 0;
00612
00613 m_layer = other.m_layer;
00614 m_controller = other.m_controller;
00615 m_busy = false;
00616 m_halted = false;
00617 m_oneshot = other.m_oneshot;
00618 m_active = true;
00619 m_stop = false;
00620 m_bussyStopping = 0;
00621 m_pending = false;
00622
00623 m_canvas_mouseevents_restore = GetCanvasView()->GetMouseEvents();
00624
00625 m_mousemenu = NULL;
00626
00627 m_corridor = other.m_corridor;
00628 if ( !m_corridor.empty() )
00629 m_parentobject = m_corridor.back();
00630
00631
00632 m_eventHandler = other.m_eventHandler;
00633
00634 m_ignorePendingObjects = other.m_ignorePendingObjects;
00635
00636 }
00637
00638 a2dBaseTool::~a2dBaseTool()
00639 {
00640
00641
00642 if ( GetCanvasView() )
00643 GetCanvasView()->SetMouseEvents(m_canvas_mouseevents_restore);
00644
00645 if(m_mousemenu)
00646 delete m_mousemenu;
00647 }
00648
00649 void a2dBaseTool::ResetContext()
00650 {
00651 m_corridor = a2dCorridor( *GetCanvasView() );
00652 if ( !m_corridor.empty() )
00653 m_parentobject = m_corridor.back();
00654 else
00655 m_parentobject = NULL;
00656 }
00657
00658 void a2dBaseTool::SetIgnorePendingObjects( bool onoff )
00659 {
00660 m_ignorePendingObjects = onoff;
00661 GetCanvasView()->GetCanvasDocument()->SetIgnorePendingObjects( onoff );
00662 }
00663
00664 void a2dBaseTool::SetMousePopupMenu( wxMenu* mousemenu )
00665 {
00666 if ( m_mousemenu )
00667 delete m_mousemenu;
00668 m_mousemenu = mousemenu;
00669 }
00670
00671 bool a2dBaseTool::StartTool( a2dBaseTool* WXUNUSED(currenttool) )
00672 {
00673 m_stop = false;
00674 GetCanvasView()->SetCursor( m_toolcursor );
00675 return true;
00676 }
00677
00678 void a2dBaseTool::SetActive(bool active)
00679 {
00680 m_active = active;
00681
00682 if ( GetCanvasView()->GetCanvasDocument() )
00683 GetCanvasView()->GetCanvasDocument()->SetIgnorePendingObjects( m_ignorePendingObjects );
00684
00685 if ( active )
00686 {
00687 GetCanvasView()->SetCorridorPath( m_corridor );
00688 }
00689 else
00690 {
00691 GetCanvasView()->ClearCorridorPath( true );
00692 }
00693 }
00694
00695 bool a2dBaseTool::ProcessEvent( wxEvent& event )
00696 {
00697 if ( m_eventHandler )
00698 {
00699 bool processed = m_eventHandler->ProcessEvent( event );
00700 if ( processed )
00701 return processed;
00702 }
00703 return a2dEvtHandler::ProcessEvent( event );
00704 }
00705
00706 void a2dBaseTool::OnComEvent( a2dComEvent& event )
00707 {
00708 if ( GetCanvasView() && event.GetEventComId() == &a2dCanvasView::sm_changedShowObject )
00709 {
00710 if ( event.GetEventObject() == GetCanvasView() )
00711 {
00712
00713
00714
00715 a2dCanvasObject* newtop = wxStaticCast( event.GetProperty()->GetRefObject(), a2dCanvasObject );
00716 if ( newtop )
00717 {
00718 a2dCorridor corridor;
00719 corridor.Push( newtop );
00720 SetCorridor( corridor );
00721 }
00722 else
00723 StopTool();
00724 }
00725 event.Skip();
00726 }
00727 else if ( m_active && GetEvtHandlerEnabled() && GetCanvasView())
00728 {
00729 event.Skip();
00730 }
00731 else
00732 event.Skip();
00733 }
00734
00735 void a2dBaseTool::OnRemoveView( a2dDocumentEvent& event )
00736 {
00737 a2dView* viewtoremove = (a2dView*) event.GetView();
00738 if ( GetCanvasView() == viewtoremove )
00739 {
00740 StopTool();
00741 }
00742 }
00743
00744 void a2dBaseTool::OnDoEvent( a2dCommandProcessorEvent& event )
00745 {
00746
00747 }
00748
00749 void a2dBaseTool::OnUndoEvent( a2dCommandProcessorEvent& event )
00750 {
00751
00752 }
00753
00754 void a2dBaseTool::OnRedoEvent( a2dCommandProcessorEvent& event )
00755 {
00756 OnUndoEvent( event );
00757 }
00758
00759
00760 bool a2dBaseTool::EnterBusyMode()
00761 {
00762 wxASSERT( !m_busy );
00763 m_busy = true;
00764 m_pending = true;
00765 OpenCommandGroup( false );
00766 GetCanvasView()->SetCursor( m_toolBusyCursor );
00767 return true;
00768 }
00769
00770 void a2dBaseTool::FinishBusyMode( bool closeCommandGroup )
00771 {
00772 wxASSERT( m_busy );
00773 m_busy = false;
00774 m_pending = true;
00775 if ( closeCommandGroup )
00776 CloseCommandGroup();
00777 if( GetCanvasView() )
00778 {
00779 GetCanvasView()->SetCursor( m_toolcursor );
00780 }
00781 if( m_oneshot && !m_halted )
00782 StopTool();
00783 }
00784
00785 void a2dBaseTool::AbortBusyMode()
00786 {
00787 wxASSERT( m_busy );
00788 m_busy = false;
00789 m_pending = true;
00790 CloseCommandGroup();
00791 if( GetCanvasView() )
00792 {
00793 GetCanvasView()->SetCursor( m_toolcursor );
00794 GetCanvasCommandProcessor()->Undo();
00795 }
00796 if (m_oneshot)
00797 StopTool();
00798 }
00799
00800 void a2dBaseTool::StopTool( bool abort )
00801 {
00802 m_bussyStopping++;
00803 if ( !m_stop )
00804 {
00805 DoStopTool( abort );
00806 m_stop = true;
00807 }
00808 m_bussyStopping--;
00809 }
00810
00811 void a2dBaseTool::DoStopTool( bool abort )
00812 {
00813 if (m_busy )
00814 {
00815 if ( abort )
00816 AbortBusyMode();
00817 else
00818 FinishBusyMode();
00819 }
00820 }
00821
00822 bool a2dBaseTool::GetStopTool()
00823 {
00824 return m_stop && m_bussyStopping == 0;
00825 }
00826
00827 void a2dBaseTool::SetFill( const a2dFill& fill)
00828 {
00829 m_fill = fill;
00830 };
00831
00832 void a2dBaseTool::SetStroke( const a2dStroke& stroke)
00833 {
00834 m_stroke = stroke;
00835 };
00836
00837 void a2dBaseTool::SetContourWidth(double width)
00838 {
00839 m_contourwidth = width;
00840 }
00841
00842 void a2dBaseTool::SetLayer( wxUint16 layer)
00843 {
00844 m_layer = layer;
00845 }
00846
00847 void a2dBaseTool::OnMouseEvent(wxMouseEvent& event)
00848 {
00849 event.Skip();
00850 }
00851
00852 void a2dBaseTool::OnKeyDown(wxKeyEvent& event)
00853 {
00854 event.Skip();
00855 }
00856
00857 void a2dBaseTool::OnKeyUp(wxKeyEvent& event)
00858 {
00859 event.Skip();
00860 }
00861
00862 void a2dBaseTool::OnChar(wxKeyEvent& event)
00863 {
00864 event.Skip();
00865 }
00866
00867 void a2dBaseTool::OpenCommandGroup( bool restart )
00868 {
00869 if ( restart )
00870 {
00871 if ( !m_commandgroup )
00872 {
00873 wxString name = GetCommandGroupName();
00874
00875 if( restart )
00876 name += _(" (continued)");
00877
00878 OpenCommandGroupNamed( name );
00879 }
00880 }
00881 else
00882 {
00883 if ( !m_commandgroup )
00884 {
00885 wxString name = GetCommandGroupName();
00886 OpenCommandGroupNamed( name );
00887 }
00888 }
00889 }
00890
00891 void a2dBaseTool::OpenCommandGroupNamed( const wxString &name )
00892 {
00893 wxASSERT_MSG( !m_commandgroup, wxT("Unclosed command group") );
00894
00895 m_commandgroup = GetCanvasCommandProcessor()->CommandGroupBegin( name );
00896 }
00897
00898 void a2dBaseTool::CloseCommandGroup()
00899 {
00900 if ( m_commandgroup && this == m_controller->GetFirstTool() )
00901 {
00902 if( GetCanvasView() )
00903 {
00904 GetCanvasCommandProcessor()->CommandGroupEnd( m_commandgroup );
00905 }
00906 m_commandgroup = 0;
00907 }
00908 }
00909
00910 wxString a2dBaseTool::GetCommandGroupName()
00911 {
00912 return GetClassInfo()->GetClassName();
00913 }
00914
00915 void a2dBaseTool::SetCorridor( const a2dCorridor& corridor )
00916 {
00917 m_corridor = corridor;
00918 if ( m_corridor.empty() )
00919 {
00920 m_corridor.Push( GetCanvasView()->GetShowObject() );
00921 m_parentobject = GetCanvasView()->GetShowObject();
00922 }
00923 else
00924 {
00925 m_parentobject = m_corridor.back();
00926 }
00927 wxASSERT_MSG( m_parentobject->GetCanvasDocument() != 0 , wxT("parentobject of tools has no document root set") );
00928 GetCanvasView()->SetCorridorPath( corridor );
00929 }
00930
00931 void a2dBaseTool::AddEditobject( a2dCanvasObject *object )
00932 {
00933 a2dCanvasObject::PROPID_ToolObject->SetPropertyToObject( object, this );
00934 a2dCanvasObject::PROPID_ViewSpecific->SetPropertyToObject( object, GetCanvasView() );
00935 wxASSERT_MSG( m_parentobject->GetCanvasDocument() != 0 , wxT("parentobject of tools has no document root set") );
00936 m_parentobject->Append( object );
00937 object->SetSnapTo( false );
00938 }
00939
00940 void a2dBaseTool::RemoveEditobject( a2dCanvasObject *object )
00941 {
00942
00943 m_parentobject->GetChildObjectList()->Release( object, true, false, true, a2dCanvasObject::PROPID_ToolObject );
00944 }
00945
00946 void a2dBaseTool::AddDecorationObject( a2dCanvasObject *object )
00947 {
00948 a2dCanvasObject::PROPID_ToolDecoration->SetPropertyToObject( object, true );
00949 a2dCanvasObject::PROPID_ViewSpecific->SetPropertyToObject( object, GetCanvasView() );
00950
00951 object->SetHitFlags( a2dCANOBJ_EVENT_NON );
00952 wxASSERT_MSG( m_parentobject->GetCanvasDocument() != 0 , wxT("parentobject of tools has no document root set") );
00953 m_parentobject->Append( object );
00954 object->SetSnapTo( false );
00955 }
00956
00957 void a2dBaseTool::RemoveAllDecorations()
00958 {
00959 a2dCanvasObjectList::iterator iter = m_parentobject->GetChildObjectList()->begin();
00960 while( iter != m_parentobject->GetChildObjectList()->end() )
00961 {
00962 a2dCanvasObject* obj = *iter;
00963 iter++;
00964 if( a2dCanvasObject::PROPID_ToolDecoration->GetPropertyValue( obj ) )
00965 m_parentobject->ReleaseChild( obj );
00966 }
00967
00968
00969 GetCanvasView()->GetCanvasDocument()->AddPendingUpdatesOldNew();
00970 }
00971
00972 a2dDrawer2D* a2dBaseTool::GetDrawer2D()
00973 {
00974 return m_controller->GetCanvasView()->GetDrawer2D();
00975 }
00976
00977 wxWindow* a2dBaseTool::GetDisplayWindow()
00978 {
00979 return m_controller->GetCanvasView()->GetDisplayWindow();
00980 }
00981
00982 a2dCanvasDocument* a2dBaseTool::GetCanvasDocument()
00983 {
00984 if ( !GetCanvasView() )
00985 return NULL;
00986 return GetCanvasView()->GetCanvasDocument();
00987 }
00988
00989 a2dCanvasCommandProcessor* a2dBaseTool::GetCanvasCommandProcessor()
00990 {
00991 if ( !GetCanvasDocument() )
00992 return NULL;
00993 return GetCanvasDocument()->GetCanvasCommandProcessor();
00994 }
00995
00996
00997
00998
00999
01000
01001 A2D_BEGIN_EVENT_TABLE(a2dToolEvtHandler, a2dEvtHandler )
01002 A2D_EVT_COM_EVENT( a2dToolEvtHandler::OnComEvent )
01003 A2D_END_EVENT_TABLE()
01004
01005 a2dToolEvtHandler::a2dToolEvtHandler()
01006 {
01007 }
01008
01009 void a2dToolEvtHandler::OnComEvent( a2dComEvent& event )
01010 {
01011 event.Skip();
01012 }
01013
01014 bool a2dToolEvtHandler::ProcessEvent( wxEvent& event )
01015 {
01016 if ( a2dEvtHandler::ProcessEvent( event ) )
01017 return true;
01018 return false;
01019 }
01020