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 <math.h>
00022 #include <limits.h>
00023 #include <float.h>
00024
00025 #include <wx/wfstream.h>
00026
00027 #include "wx/canvas/canglob.h"
00028 #include "wx/canvas/algos.h"
00029 #include "wx/canvas/layerinf.h"
00030 #include "wx/canvas/canobj.h"
00031 #include "wx/canvas/canprim.h"
00032 #include "wx/canvas/candoc.h"
00033 #include "wx/canvas/cancom.h"
00034 #include "wx/artbase/afmatrix.h"
00035 #include "wx/artbase/drawer2d.h"
00036
00037
00038
00039
00040
00041
00042 a2dDumpWalker::a2dDumpWalker()
00043 {
00044 Initialize();
00045 }
00046
00047 a2dDumpWalker::~a2dDumpWalker()
00048 {
00049 }
00050
00051 void a2dDumpWalker::Initialize()
00052 {
00053 }
00054
00055 bool a2dDumpWalker::Start( a2dObject* object )
00056 {
00057 object->Walker( NULL, *this );
00058 return true;
00059 }
00060
00061 bool a2dDumpWalker::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00062 {
00063 if ( event == a2dWalker_a2dCanvasObjectStart )
00064 {
00065
00066 a2dCanvasObject* canobj = (a2dCanvasObject*) object;
00067 if ( canobj->GetChildObjectList() != wxNullCanvasObjectList )
00068 {
00069 forEachIn( a2dCanvasObjectList, canobj->GetChildObjectList() )
00070 {
00071
00072
00073 }
00074 }
00075 }
00076
00077 if ( event == a2dWalker_a2dPropObjectStart )
00078 {
00079 if ( wxDynamicCast( object, a2dObject ) )
00080 wxLogDebug(_T("%s"), wxDynamicCast( object, a2dObject )->GetName().c_str() );
00081 }
00082
00083 if ( event == a2dWalker_a2dNamedPropertyStart )
00084 {
00085 if ( wxDynamicCast( object, a2dNamedProperty ) )
00086 wxLogDebug(_T("%s"), wxDynamicCast( object, a2dNamedProperty )->GetName().c_str() );
00087
00088 }
00089
00090 if ( event == a2dWalker_a2dCanvasObjectPostChild )
00091 return false;
00092
00093 return true;
00094 }
00095
00096
00097
00098
00099
00100
00101 a2dWalker_CallMemberFunc::a2dWalker_CallMemberFunc()
00102 {
00103 SetDepthFirst( true );
00104 Initialize();
00105 }
00106
00107 a2dWalker_CallMemberFunc::~a2dWalker_CallMemberFunc()
00108 {
00109 }
00110
00111 bool a2dWalker_CallMemberFunc::Start( a2dObject* object, a2dCanvasObjectFunc func )
00112 {
00113 m_func = func;
00114 object->Walker( NULL, *this );
00115 return true;
00116 }
00117
00118 bool a2dWalker_CallMemberFunc::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00119 {
00120 if ( event == a2dWalker_a2dCanvasObjectStart )
00121 {
00122 a2dCanvasObject* canobj = (a2dCanvasObject*) object;
00123 (canobj->*((a2dCanvasObjectFunc) (m_func)))();
00124 }
00125
00126 if ( event == a2dWalker_a2dCanvasObjectPostChild )
00127 return false;
00128
00129 return true;
00130 }
00131
00132
00133
00134
00135
00136 a2dWalker_CallMemberFuncW::a2dWalker_CallMemberFuncW()
00137 {
00138 Initialize();
00139 }
00140
00141 a2dWalker_CallMemberFuncW::~a2dWalker_CallMemberFuncW()
00142 {
00143 }
00144
00145 bool a2dWalker_CallMemberFuncW::Start( a2dObject* object, a2dCanvasObjectFuncW func )
00146 {
00147 m_func = func;
00148 object->Walker( NULL, *this );
00149 return true;
00150 }
00151
00152 bool a2dWalker_CallMemberFuncW::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00153 {
00154 m_currentParent = parent;
00155
00156 if ( event == a2dWalker_a2dCanvasObjectStart )
00157 {
00158 a2dCanvasObject* canobj = (a2dCanvasObject*) object;
00159 (canobj->*((a2dCanvasObjectFuncW) (m_func) ))(this);
00160 }
00161
00162 if ( event == a2dWalker_a2dCanvasObjectPostChild )
00163 return false;
00164
00165 return true;
00166 }
00167
00168
00169
00170
00171
00172 a2dWalker_SetAvailable::a2dWalker_SetAvailable( a2dLayers* layerSetup )
00173 {
00174 Initialize();
00175 m_layerSetup = layerSetup;
00176 m_view = NULL;
00177 }
00178
00179 a2dWalker_SetAvailable::a2dWalker_SetAvailable( a2dCanvasView* view )
00180 {
00181 Initialize();
00182 m_layerSetup = NULL;
00183 m_view = view;
00184 }
00185
00186 a2dWalker_SetAvailable::~a2dWalker_SetAvailable()
00187 {
00188 }
00189
00190 bool a2dWalker_SetAvailable::Start( a2dObject* object )
00191 {
00192 object->Walker( NULL, *this );
00193 return true;
00194 }
00195
00196 bool a2dWalker_SetAvailable::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00197 {
00198 bool foundfirst = false;
00199
00200 if ( event == a2dWalker_a2dCanvasObjectStart )
00201 {
00202 a2dCanvasObject* canobj = (a2dCanvasObject*) object;
00203 if ( m_view )
00204 m_view->GetLayerRenderArray()[ canobj->GetLayer() ].SetAvailable( true );
00205 if ( m_layerSetup )
00206 m_layerSetup->GetLayerIndex()[ canobj->GetLayer() ]->SetAvailable( true );
00207
00208 }
00209
00210 if ( event == a2dWalker_a2dCanvasObjectPostChild )
00211 return false;
00212
00213 return true;
00214 }
00215
00216
00217
00218
00219
00220 a2dWalker_RemoveProperty::a2dWalker_RemoveProperty( bool all )
00221 {
00222 m_all = all;
00223 }
00224
00225 a2dWalker_RemoveProperty::a2dWalker_RemoveProperty( const a2dPropertyId* id , bool all )
00226 {
00227 m_propertyList.push_back( (a2dPropertyId*) &id );
00228 m_all = all;
00229 }
00230
00231 a2dWalker_RemoveProperty::a2dWalker_RemoveProperty( const a2dPropertyIdList& idList, bool all )
00232 {
00233 m_propertyList = idList;
00234 m_all = all;
00235 }
00236
00237 a2dWalker_RemoveProperty::~a2dWalker_RemoveProperty()
00238 {
00239 }
00240
00241 void a2dWalker_RemoveProperty::AddPropertyId( const a2dPropertyId* id )
00242 {
00243 m_propertyList.push_back( (a2dPropertyId*) &id );
00244 }
00245
00246
00247 bool a2dWalker_RemoveProperty::Start( a2dObject* object )
00248 {
00249 object->Walker( NULL, *this );
00250 return m_result;
00251 }
00252
00253 bool a2dWalker_RemoveProperty::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00254 {
00255 if ( event == a2dWalker_a2dPropObjectStart )
00256 {
00257 SetStopWalking( true );
00258 if ( wxDynamicCast( object, a2dPropObject ) )
00259 {
00260 a2dPropObject* propobj = wxDynamicCast( object, a2dPropObject );
00261 forEachIn( a2dPropertyIdList, &m_propertyList )
00262 {
00263 a2dPropertyId *id = *iter;
00264 m_result |= propobj->RemoveProperty( id, m_all );
00265 }
00266 }
00267 }
00268 if ( event == a2dWalker_a2dPropObjectEnd )
00269 SetStopWalking( false );
00270
00271 if ( event == a2dWalker_a2dCanvasObjectPostChild )
00272 return false;
00273
00274 return true;
00275 }
00276
00277
00278
00279
00280
00281
00282 a2dWalker_RemovePropertyCandoc::a2dWalker_RemovePropertyCandoc( a2dCanvasObjectFlagsMask mask, bool all )
00283 {
00284 m_all = all;
00285 m_mask = mask;
00286 m_makePending = false;
00287 }
00288
00289 a2dWalker_RemovePropertyCandoc::a2dWalker_RemovePropertyCandoc( const a2dPropertyId* id , a2dCanvasObjectFlagsMask mask, bool all )
00290 {
00291 m_propertyList.push_back( (a2dPropertyId*) &id );
00292 m_all = all;
00293 m_mask = mask;
00294 m_makePending = false;
00295 }
00296
00297 a2dWalker_RemovePropertyCandoc::a2dWalker_RemovePropertyCandoc( const a2dPropertyIdList& idList, a2dCanvasObjectFlagsMask mask, bool all )
00298 {
00299 m_propertyList = idList;
00300 m_all = all;
00301 m_mask = mask;
00302 m_makePending = false;
00303 }
00304
00305 a2dWalker_RemovePropertyCandoc::~a2dWalker_RemovePropertyCandoc()
00306 {
00307 }
00308
00309 void a2dWalker_RemovePropertyCandoc::AddPropertyId( const a2dPropertyId* id )
00310 {
00311 m_propertyList.push_back( (a2dPropertyId*) &id );
00312 }
00313
00314
00315 bool a2dWalker_RemovePropertyCandoc::Start( a2dCanvasObject* object )
00316 {
00317 object->Walker( NULL, *this );
00318 return m_result;
00319 }
00320
00321 bool a2dWalker_RemovePropertyCandoc::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00322 {
00323 if ( event == a2dWalker_a2dPropObjectStart )
00324 SetStopWalking( true );
00325
00326 if ( event == a2dWalker_a2dCanvasObjectStart )
00327 {
00328 a2dCanvasObject* propobj = wxDynamicCast( object, a2dCanvasObject );
00329 if ( propobj && propobj->CheckMask(m_mask) )
00330 {
00331 forEachIn( a2dPropertyIdList, &m_propertyList )
00332 {
00333 a2dPropertyId *id = *iter;
00334
00335 bool res = propobj->RemoveProperty( id, m_all );
00336 m_result |= res;
00337 if ( res && m_makePending )
00338 propobj->SetPending(true);
00339 }
00340 }
00341 }
00342 if ( event == a2dWalker_a2dPropObjectEnd )
00343 SetStopWalking( false );
00344
00345 if ( event == a2dWalker_a2dCanvasObjectPostChild )
00346 return false;
00347
00348 return true;
00349 }
00350
00351
00352
00353
00354
00355 a2dWalker_FilterCanvasObjects::a2dWalker_FilterCanvasObjects( a2dCanvasObjectFlagsMask mask )
00356 {
00357 Initialize();
00358
00359 m_mask = mask;
00360 }
00361
00362 a2dWalker_FilterCanvasObjects::a2dWalker_FilterCanvasObjects( const a2dPropertyId* id , a2dCanvasObjectFlagsMask mask )
00363 {
00364 Initialize();
00365
00366 m_propertyList.push_back( (a2dPropertyId*) &id );
00367 m_mask = mask;
00368 }
00369
00370 a2dWalker_FilterCanvasObjects::a2dWalker_FilterCanvasObjects( const a2dPropertyIdList& idList, a2dCanvasObjectFlagsMask mask )
00371 {
00372 Initialize();
00373
00374 m_propertyList = idList;
00375 m_mask = mask;
00376 m_result = false;
00377 }
00378
00379 a2dWalker_FilterCanvasObjects::~a2dWalker_FilterCanvasObjects()
00380 {
00381 }
00382
00383 void a2dWalker_FilterCanvasObjects::Initialize()
00384 {
00385 a2dWalkerIOHandler::Initialize();
00386 m_mask = a2dCanvasOFlags::ALL;
00387 m_skipStartObject = false;
00388 m_depth = INT_MAX;
00389 m_bbox = wxNonValidBbox;
00390 m_allowClassList = true;
00391 m_classnameMap.clear();
00392 m_objectname = wxT("");
00393 m_id = -1;
00394 m_layervisible = false;
00395 m_layerselectable = false;
00396 m_propertyList.clear();
00397 }
00398
00399 void a2dWalker_FilterCanvasObjects::AddPropertyId( const a2dPropertyId* id )
00400 {
00401 m_propertyList.push_back( (a2dPropertyId*) &id );
00402 }
00403
00404
00405 bool a2dWalker_FilterCanvasObjects::Start( a2dCanvasObject* object )
00406 {
00407 object->Walker( NULL, *this );
00408 return m_result;
00409 }
00410
00411 void a2dWalker_FilterCanvasObjects::AddClassName( wxString className )
00412 {
00413 if (m_classnameMap.find(className) == m_classnameMap.end())
00414 m_classnameMap.insert(className);
00415 }
00416
00417 void a2dWalker_FilterCanvasObjects::RemoveClassName( wxString className )
00418 {
00419 if (m_classnameMap.find(className) != m_classnameMap.end())
00420 m_classnameMap.erase( m_classnameMap.find(className) );
00421 }
00422
00423 bool a2dWalker_FilterCanvasObjects::ObjectOke( a2dCanvasObject* obj )
00424 {
00425 if ( obj &&
00426 ( m_objectname.IsEmpty() || m_objectname.Matches( obj->GetName() ) ) &&
00427 ( m_id == -1 || obj->GetUniqueSerializationId() == m_id ) &&
00428 obj->CheckMask(m_mask)
00429 )
00430 {
00431 if ( m_layervisible && m_layerselectable && obj->GetCanvasDocument() && obj->GetCanvasDocument()->GetLayerSetup() )
00432 {
00433 if ( m_layervisible && !obj->GetCanvasDocument()->GetLayerSetup()->GetVisible( obj->GetLayer() ) )
00434 return false;
00435 if ( m_layerselectable && !obj->GetCanvasDocument()->GetLayerSetup()->GetSelectable( obj->GetLayer() ) )
00436 return false;
00437 }
00438
00439 if ( m_bbox.GetValid() && m_bbox.Intersect( obj->GetBbox() ) != _IN )
00440 return false;
00441
00442 if ( m_propertyList.size() )
00443 {
00444 forEachIn( a2dPropertyIdList, &m_propertyList )
00445 {
00446 a2dPropertyId *id = *iter;
00447 if ( !obj->HasProperty( id ) )
00448 return false;
00449 }
00450 }
00451 return true;
00452 }
00453 return false;
00454 }
00455
00456 bool a2dWalker_FilterCanvasObjects::ClassOfObjectOke( a2dCanvasObject* obj )
00457 {
00458 if ( ! m_classnameMap.empty() )
00459 {
00460 if ( !m_allowClassList )
00461 {
00462
00463 if ( m_classnameMap.find( obj->GetClassInfo()->GetClassName() ) != m_classnameMap.end() )
00464 return false;
00465 else
00466 return true;
00467 }
00468 else
00469 {
00470
00471 if ( m_classnameMap.find( obj->GetClassInfo()->GetClassName() ) == m_classnameMap.end() )
00472 return false;
00473 else
00474 return true;
00475 }
00476 }
00477 return true;
00478 }
00479
00480 a2dCanvasObjectList* a2dWalker_FilterCanvasObjects::ConvertToPolygons( a2dCanvasObject* canvasobject, bool transform )
00481 {
00482 a2dCanvasObjectList* polylist = NULL;
00483
00484 a2dCanvasObjectList* vpath = ConvertToVpath( canvasobject, true );
00485
00486
00487
00488 if ( vpath != wxNullCanvasObjectList )
00489 {
00490 a2dCanvasObjectList::iterator iter = vpath->begin();
00491 while ( iter != vpath->end() )
00492 {
00493 a2dVectorPath* obj = (a2dVectorPath*) (*iter).Get();
00494 polylist = obj->GetAsPolygons();
00495
00496 iter = vpath->erase( iter );
00497 iter = vpath->begin();
00498 }
00499 delete vpath;
00500 }
00501 return polylist;
00502 }
00503
00504 a2dCanvasObjectList* a2dWalker_FilterCanvasObjects::ConvertToVpath( a2dCanvasObject* canvasobject, bool transform )
00505 {
00506 a2dCanvasObjectList* vpath = wxNullCanvasObjectList;
00507
00508 if ( wxDynamicCast( canvasobject, a2dRect ) ||
00509 wxDynamicCast( canvasobject, a2dRectC ) ||
00510 wxDynamicCast( canvasobject, a2dArrow ) ||
00511 wxDynamicCast( canvasobject, a2dCircle ) ||
00512 wxDynamicCast( canvasobject, a2dEllipse ) ||
00513 wxDynamicCast( canvasobject, a2dEllipticArc ) ||
00514 wxDynamicCast( canvasobject, a2dArc ) ||
00515 wxDynamicCast( canvasobject, a2dPolygonL ) ||
00516 wxDynamicCast( canvasobject, a2dVectorPath ) ||
00517 wxDynamicCast( canvasobject, a2dText ) ||
00518 wxDynamicCast( canvasobject, a2dEndsLine ) ||
00519 wxDynamicCast( canvasobject, a2dSLine ) ||
00520 wxDynamicCast( canvasobject, a2dPolylineL )
00521 )
00522 {
00523 vpath = canvasobject->GetAsCanvasVpaths( transform );
00524 }
00525 return vpath;
00526 }
00527
00528
00529
00530
00531
00532
00533 a2dWalker_CollectCanvasObjects::a2dWalker_CollectCanvasObjects( a2dCanvasObjectFlagsMask mask )
00534 :a2dWalker_FilterCanvasObjects( mask )
00535 {
00536 Initialize();
00537
00538 m_mask = mask;
00539 }
00540
00541 a2dWalker_CollectCanvasObjects::a2dWalker_CollectCanvasObjects( const a2dPropertyId* id , a2dCanvasObjectFlagsMask mask )
00542 :a2dWalker_FilterCanvasObjects( id, mask )
00543 {
00544 Initialize();
00545
00546 m_mask = mask;
00547 }
00548
00549 a2dWalker_CollectCanvasObjects::a2dWalker_CollectCanvasObjects( const a2dPropertyIdList& idList, a2dCanvasObjectFlagsMask mask )
00550 :a2dWalker_FilterCanvasObjects( idList, mask )
00551 {
00552 Initialize();
00553
00554 m_propertyList = idList;
00555 m_mask = mask;
00556 }
00557
00558 a2dWalker_CollectCanvasObjects::~a2dWalker_CollectCanvasObjects()
00559 {
00560 }
00561
00562 void a2dWalker_CollectCanvasObjects::Initialize()
00563 {
00564 a2dWalker_FilterCanvasObjects::Initialize();
00565 m_found.clear();
00566 }
00567
00568 bool a2dWalker_CollectCanvasObjects::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00569 {
00570
00571 if ( m_currentDepth > m_depth || event == a2dWalker_a2dPropObjectStart )
00572 SetStopWalking( true );
00573
00574 if ( event == a2dWalker_a2dCanvasObjectStart )
00575 {
00576 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
00577 if ( obj && ObjectOke( obj ) && ClassOfObjectOke( obj ) )
00578 {
00579 m_found.push_back( obj );
00580 m_result = true;
00581 }
00582 }
00583
00584 if ( m_currentDepth < m_depth && event == a2dWalker_a2dPropObjectEnd )
00585 SetStopWalking( false );
00586
00587 if ( event == a2dWalker_a2dCanvasObjectPostChild )
00588 return false;
00589
00590 return true;
00591 }
00592
00593
00594
00595
00596
00597 a2dWalker_FindCanvasObject::a2dWalker_FindCanvasObject( a2dCanvasObject* search )
00598 :a2dWalkerIOHandler()
00599 {
00600 Initialize();
00601 m_search = search;
00602 }
00603
00604
00605 a2dWalker_FindCanvasObject::~a2dWalker_FindCanvasObject()
00606 {
00607 }
00608
00609 void a2dWalker_FindCanvasObject::Initialize()
00610 {
00611 a2dWalkerIOHandler::Initialize();
00612 m_search = 0;
00613 }
00614
00615 bool a2dWalker_FindCanvasObject::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00616 {
00617 if ( event == a2dWalker_a2dCanvasObjectStart )
00618 {
00619 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
00620 if ( obj == m_search )
00621 {
00622 SetStopWalking( true );
00623 m_result = true;
00624 }
00625 }
00626
00627 if ( event == a2dWalker_a2dCanvasObjectPostChild )
00628 return false;
00629
00630 return true;
00631 }
00632
00633 bool a2dWalker_FindCanvasObject::Start( a2dCanvasObject* object )
00634 {
00635 m_result = false;
00636 object->Walker( NULL, *this );
00637 return m_result;
00638 }
00639
00640
00641
00642
00643
00644
00645 a2dWalker_SetSpecificFlagsCanvasObjects::a2dWalker_SetSpecificFlagsCanvasObjects( a2dCanvasObjectFlagsMask which, a2dCanvasObjectFlagsMask mask )
00646 :a2dWalker_FilterCanvasObjects( mask )
00647 {
00648 m_which = which;
00649 Initialize();
00650 }
00651
00652 a2dWalker_SetSpecificFlagsCanvasObjects::a2dWalker_SetSpecificFlagsCanvasObjects( a2dCanvasObjectFlagsMask which, const a2dPropertyId* id , a2dCanvasObjectFlagsMask mask )
00653 :a2dWalker_FilterCanvasObjects( id, mask )
00654 {
00655 m_which = which;
00656 Initialize();
00657 }
00658
00659 a2dWalker_SetSpecificFlagsCanvasObjects::a2dWalker_SetSpecificFlagsCanvasObjects( a2dCanvasObjectFlagsMask which, const a2dPropertyIdList& idList, a2dCanvasObjectFlagsMask mask )
00660 :a2dWalker_FilterCanvasObjects( idList, mask )
00661 {
00662 m_which = which;
00663 Initialize();
00664 }
00665
00666 a2dWalker_SetSpecificFlagsCanvasObjects::~a2dWalker_SetSpecificFlagsCanvasObjects()
00667 {
00668 }
00669
00670 bool a2dWalker_SetSpecificFlagsCanvasObjects::Start( a2dCanvasObject* object, bool setTo )
00671 {
00672 m_setOrClear = setTo;
00673 object->Walker( NULL, *this );
00674 return m_result;
00675 }
00676
00677 void a2dWalker_SetSpecificFlagsCanvasObjects::Initialize()
00678 {
00679 a2dWalkerIOHandler::Initialize();
00680 }
00681
00682 bool a2dWalker_SetSpecificFlagsCanvasObjects::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00683 {
00684
00685 if ( m_currentDepth > m_depth || event == a2dWalker_a2dPropObjectStart )
00686 SetStopWalking( true );
00687
00688 if ( event == a2dWalker_a2dCanvasObjectStart )
00689 {
00690 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
00691 if ( !m_skipStartObject || ( m_skipStartObject && m_currentDepth > 1 ) )
00692 if ( obj && ObjectOke( obj ) && ClassOfObjectOke( obj ) )
00693 {
00694 obj->SetSpecificFlags( m_setOrClear, m_which );
00695 m_result = true;
00696 }
00697 }
00698
00699 if ( m_currentDepth < m_depth && event == a2dWalker_a2dPropObjectEnd )
00700 SetStopWalking( false );
00701
00702 if ( event == a2dWalker_a2dCanvasObjectPostChild )
00703 return false;
00704
00705 return true;
00706 }
00707
00708
00709 a2dWalker_SetPropertyToObject::a2dWalker_SetPropertyToObject( a2dNamedProperty* prop )
00710 {
00711 m_property = prop;
00712 Initialize();
00713 }
00714
00715 a2dWalker_SetPropertyToObject::~a2dWalker_SetPropertyToObject()
00716 {
00717 }
00718
00719 void a2dWalker_SetPropertyToObject::Initialize()
00720 {
00721 a2dWalkerIOHandler::Initialize();
00722 }
00723
00724 bool a2dWalker_SetPropertyToObject::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00725 {
00726 if ( event == a2dWalker_a2dCanvasObjectStart )
00727 {
00728 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
00729 m_property->SetToObjectClone( obj, a2dPropertyId::set_none );
00730 }
00731
00732 if ( event == a2dWalker_a2dCanvasObjectPostChild )
00733 return false;
00734
00735 return true;
00736 }
00737
00738
00739
00740
00741
00742
00743 a2dWalker_SetViewDependent::a2dWalker_SetViewDependent( a2dCanvasView* aView, bool viewdependent, bool viewspecific, bool onlyinternalarea )
00744 {
00745 m_aView = aView;
00746 m_viewdependent = viewdependent;
00747 m_viewspecific = viewspecific;
00748 m_onlyinternalarea = onlyinternalarea;
00749 }
00750
00751 a2dWalker_SetViewDependent::~a2dWalker_SetViewDependent()
00752 {
00753 }
00754
00755 void a2dWalker_SetViewDependent::Initialize()
00756 {
00757 a2dWalkerIOHandler::Initialize();
00758 }
00759
00760 bool a2dWalker_SetViewDependent::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00761 {
00762 if ( event == a2dWalker_a2dCanvasObjectStart )
00763 {
00764 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
00765 obj->SetViewDependent( m_aView, m_viewdependent, m_viewspecific, m_onlyinternalarea );
00766 }
00767
00768 if ( event == a2dWalker_a2dCanvasObjectPostChild )
00769 return false;
00770
00771 return true;
00772 }
00773
00774 bool a2dWalker_SetViewDependent::Start( a2dCanvasObject* object )
00775 {
00776 object->Walker( NULL, *this );
00777 return true;
00778 }
00779
00780
00781
00782
00783
00784
00785 a2dWalker_SetCanvasDocument::a2dWalker_SetCanvasDocument( a2dCanvasDocument* root )
00786 {
00787 m_root = root;
00788 }
00789
00790 a2dWalker_SetCanvasDocument::~a2dWalker_SetCanvasDocument()
00791 {
00792 }
00793
00794 bool a2dWalker_SetCanvasDocument::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00795 {
00796 if ( event == a2dWalker_a2dCanvasObjectStart )
00797 {
00798 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
00799 obj->SetCanvasDocument( m_root, false );
00800 }
00801
00802 if ( event == a2dWalker_a2dCanvasObjectPostChild )
00803 return false;
00804
00805 return true;
00806 }
00807
00808 bool a2dWalker_SetCanvasDocument::Start( a2dCanvasObject* object )
00809 {
00810 object->Walker( NULL, *this );
00811 return true;
00812 }
00813
00814
00815
00816
00817
00818 a2dWalker_MakeTree::a2dWalker_MakeTree( a2dCanvasObjectFlagsMask mask )
00819 :a2dWalker_FilterCanvasObjects( mask )
00820 {
00821 Initialize();
00822 m_mask = mask;
00823 }
00824
00825 a2dWalker_MakeTree::a2dWalker_MakeTree( const a2dPropertyId* id , a2dCanvasObjectFlagsMask mask )
00826 :a2dWalker_FilterCanvasObjects( id, mask )
00827 {
00828 Initialize();
00829 m_mask = mask;
00830 }
00831
00832 a2dWalker_MakeTree::a2dWalker_MakeTree( const a2dPropertyIdList& idList, a2dCanvasObjectFlagsMask mask )
00833 :a2dWalker_FilterCanvasObjects( idList, mask )
00834 {
00835 Initialize();
00836 }
00837
00838 a2dWalker_MakeTree::~a2dWalker_MakeTree()
00839 {
00840 }
00841
00842 bool a2dWalker_MakeTree::Start( a2dCanvasObject* object )
00843 {
00844 a2dWalker_SetBoolProperty setp( PROPID_Check, false );
00845 setp.Start( object );
00846
00847 object->Walker( NULL, *this );
00848 return true;
00849 }
00850
00851 void a2dWalker_MakeTree::Initialize()
00852 {
00853 a2dWalker_FilterCanvasObjects::Initialize();
00854 m_useCheck = true;
00855 m_depthFirst = true;
00856 m_firstLevelChild = false;
00857 }
00858
00859 bool a2dWalker_MakeTree::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00860 {
00861 if ( m_currentDepth > m_depth )
00862 SetStopWalking( true );
00863 else
00864 SetStopWalking( false );
00865
00866 if ( event == a2dWalker_a2dObjectStart )
00867 {
00868
00869 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
00870 if ( obj && m_currentDepth == 2 && ObjectOke( obj ) && ClassOfObjectOke( obj ) && !obj->GetCheck() )
00871 {
00872 m_firstLevelChild = true;
00873 obj->SetCheck( true );
00874 }
00875 }
00876
00877 if ( event == a2dWalker_a2dCanvasObjectEnd )
00878 {
00879 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
00880
00881
00882
00883 if ( obj && m_firstLevelChild )
00884 {
00885 if ( wxDynamicCast( object, a2dCanvasObjectArrayReference ) )
00886 {
00887 a2dCanvasObjectArrayReference* arrayref = wxDynamicCast( object, a2dCanvasObjectArrayReference );
00888 if ( arrayref->GetCanvasObject() )
00889 {
00890 a2dAffineMatrix offsetXY;
00891 int i,j;
00892 for ( i = 0 ; i < arrayref->GetRows(); i++)
00893 {
00894 for ( j = 0 ; j < arrayref->GetColumns(); j++)
00895 {
00896 a2dCanvasObjectPtr cobj = (a2dCanvasObject*) arrayref->GetCanvasObject()->Clone( clone_deep );
00897 cobj->SetRelease( false );
00898
00899 obj->CreateChildObjectList()->push_back( cobj );
00900 cobj->Transform( offsetXY );
00901
00902 offsetXY.Translate( arrayref->GetHorzSpace(), 0 );
00903 }
00904
00905 offsetXY.Translate( -arrayref->GetHorzSpace()*arrayref->GetColumns(), arrayref->GetVertSpace() );
00906 }
00907 arrayref->SetCanvasObject( NULL );
00908 }
00909 }
00910 else if ( wxDynamicCast( object, a2dCanvasObjectReference ) )
00911 {
00912 a2dCanvasObjectReference* ref = wxDynamicCast( object, a2dCanvasObjectReference );
00913
00914 if ( ref->GetCanvasObject() )
00915 {
00916 obj->CreateChildObjectList()->push_back( ref->GetCanvasObject() );
00917 ref->SetCanvasObject( NULL );
00918 }
00919 }
00920
00921
00922
00923 obj->MakeReferencesUnique();
00924 obj->SetCheck( true );
00925
00926 }
00927 }
00928
00929 if ( event == a2dWalker_a2dObjectEnd )
00930 {
00931
00932 if ( m_currentDepth <= 2 )
00933 {
00934 m_firstLevelChild = false;
00935 }
00936 }
00937
00938 if ( m_currentDepth <= m_depth )
00939 SetStopWalking( false );
00940
00941 if ( event == a2dWalker_a2dCanvasObjectPostChild )
00942 return false;
00943
00944 return true;
00945 }
00946
00947
00948
00949
00950
00951 a2dWalker_RemoveHierarchy::a2dWalker_RemoveHierarchy( a2dCanvasObjectFlagsMask mask )
00952 :a2dWalker_FilterCanvasObjects( mask )
00953 {
00954 Initialize();
00955 m_mask = mask;
00956 }
00957
00958 a2dWalker_RemoveHierarchy::a2dWalker_RemoveHierarchy( const a2dPropertyId* id , a2dCanvasObjectFlagsMask mask )
00959 :a2dWalker_FilterCanvasObjects( id, mask )
00960 {
00961 Initialize();
00962 m_mask = mask;
00963 }
00964
00965 a2dWalker_RemoveHierarchy::a2dWalker_RemoveHierarchy( const a2dPropertyIdList& idList, a2dCanvasObjectFlagsMask mask )
00966 :a2dWalker_FilterCanvasObjects( idList, mask )
00967 {
00968 Initialize();
00969 }
00970
00971 a2dWalker_RemoveHierarchy::~a2dWalker_RemoveHierarchy()
00972 {
00973 }
00974
00975 bool a2dWalker_RemoveHierarchy::Start( a2dCanvasObject* object )
00976 {
00977 a2dWalker_MakeTree unify( m_mask );
00978 unify.Start( object );
00979
00980 a2dWalker_SetBoolProperty setp( PROPID_Check, false );
00981 setp.Start( object );
00982 a2dWalker_SetSpecificFlagsCanvasObjects setflags( a2dCanvasOFlags::BIN );
00983 setflags.Start( object, false );
00984
00985 object->Walker( NULL, *this );
00986 return true;
00987 }
00988
00989 void a2dWalker_RemoveHierarchy::Initialize()
00990 {
00991 a2dWalker_FilterCanvasObjects::Initialize();
00992 m_selected = true;
00993 m_useCheck = true;
00994 m_depthFirst = true;
00995 m_firstLevelChild = false;
00996 }
00997
00998 bool a2dWalker_RemoveHierarchy::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
00999 {
01000 if ( m_currentDepth > m_depth )
01001 SetStopWalking( true );
01002 else
01003 SetStopWalking( false );
01004
01005 if ( event == a2dWalker_a2dObjectStart )
01006 {
01007 m_parentList.push_front( wxDynamicCast( object, a2dObject ) );
01008
01009
01010
01011 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
01012 if ( obj && m_parentList.size() == 2 && ObjectOke( obj ) && ClassOfObjectOke( obj ) && !obj->GetCheck() )
01013 {
01014 m_firstLevelChild = true;
01015 obj->SetCheck( true );
01016 }
01017 }
01018
01019 if ( event == a2dWalker_a2dCanvasObjectEnd )
01020 {
01021 a2dCanvasObject* parentobj = wxDynamicCast( parent, a2dCanvasObject );
01022 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
01023
01024
01025
01026
01027 if ( obj && !obj->GetBin() && parentobj && m_firstLevelChild )
01028 {
01029 if ( wxDynamicCast( object, a2dCanvasObjectReference ) )
01030 {
01031 a2dCanvasObjectReference* ref = wxDynamicCast( object, a2dCanvasObjectReference );
01032 wxASSERT_MSG( ref->GetCanvasObject() == NULL, wxT("No references allowed at this stage") );
01033 }
01034
01035 if ( obj->GetChildObjectList() != wxNullCanvasObjectList )
01036 {
01037
01038 obj->SetRelease( true );
01039
01040 a2dCanvasObjectList::iterator iter = obj->GetChildObjectList()->begin();
01041 while( iter != obj->GetChildObjectList()->end() )
01042 {
01043 a2dCanvasObjectList::value_type objchild = *iter;
01044
01045 iter = obj->GetChildObjectList()->erase( iter );
01046
01047 if ( !objchild->GetRelease() )
01048 {
01049
01050 parentobj->CreateChildObjectList()->push_back( objchild );
01051 objchild->Transform( obj->GetTransformMatrix() );
01052 objchild->SetSelected( m_selected );
01053 }
01054 }
01055 }
01056 }
01057 }
01058
01059 if ( event == a2dWalker_a2dObjectEnd )
01060 {
01061
01062
01063 m_parentList.pop_front();
01064 if ( m_parentList.size() < 2 )
01065 {
01066 m_firstLevelChild = false;
01067 }
01068 }
01069
01070 if ( m_currentDepth <= m_depth )
01071 SetStopWalking( false );
01072
01073 if ( event == a2dWalker_a2dCanvasObjectPostChild )
01074 return false;
01075
01076 return true;
01077 }
01078
01079
01080
01081
01082
01083 a2dWalker_LayerGroup::a2dWalker_LayerGroup( a2dCanvasObjectFlagsMask mask )
01084 :a2dWalker_FilterCanvasObjects( mask )
01085 {
01086 Initialize();
01087 }
01088
01089 a2dWalker_LayerGroup::a2dWalker_LayerGroup( const a2dPropertyId* id , a2dCanvasObjectFlagsMask mask )
01090 :a2dWalker_FilterCanvasObjects( id, mask )
01091 {
01092 Initialize();
01093 }
01094
01095 a2dWalker_LayerGroup::a2dWalker_LayerGroup( const a2dPropertyIdList& idList, a2dCanvasObjectFlagsMask mask )
01096 :a2dWalker_FilterCanvasObjects( idList, mask )
01097 {
01098 Initialize();
01099 }
01100
01101 a2dWalker_LayerGroup::~a2dWalker_LayerGroup()
01102 {
01103 }
01104
01105 void a2dWalker_LayerGroup::Initialize()
01106 {
01107 a2dWalker_FilterCanvasObjects::Initialize();
01108 m_target = wxLAYER_DEFAULT;
01109 m_selectedOnlyA = false;
01110 m_selectedOnlyB = false;
01111 }
01112
01113 void a2dWalker_LayerGroup::SetTarget( wxUint16 targetlayer )
01114 {
01115 wxASSERT_MSG( wxMAXLAYER > targetlayer , wxT(" targetlayer > wxMAXLAYER, index to high") );
01116 m_target = targetlayer;
01117 };
01118
01119 bool a2dWalker_LayerGroup::Start( a2dCanvasObject* object )
01120 {
01121 a2dWalker_SetSpecificFlagsCanvasObjects setflags( a2dCanvasOFlags::BIN );
01122 setflags.Start( object, false );
01123
01124 object->Walker( NULL, *this );
01125 return m_result;
01126 }
01127
01128
01129
01130
01131
01132 const long a2dWalker_LayerCanvasObjects::moveLayers = wxGenNewId();
01133 const long a2dWalker_LayerCanvasObjects::copyLayers = wxGenNewId();
01134 const long a2dWalker_LayerCanvasObjects::deleteLayers = wxGenNewId();
01135 const long a2dWalker_LayerCanvasObjects::ConvertToArcs = wxGenNewId();
01136 const long a2dWalker_LayerCanvasObjects::ConvertToPolygonPolylinesWithArcs = wxGenNewId();
01137 const long a2dWalker_LayerCanvasObjects::ConvertToPolygonPolylinesWithoutArcs = wxGenNewId();
01138 const long a2dWalker_LayerCanvasObjects::ConvertPolygonToArcs = wxGenNewId();
01139 const long a2dWalker_LayerCanvasObjects::ConvertPolylineToArcs = wxGenNewId();
01140 const long a2dWalker_LayerCanvasObjects::ConvertToVPaths = wxGenNewId();
01141 const long a2dWalker_LayerCanvasObjects::ConvertLinesArcs = wxGenNewId();
01142 const long a2dWalker_LayerCanvasObjects::ConvertToPolylines = wxGenNewId();
01143 const long a2dWalker_LayerCanvasObjects::RemoveRedundant = wxGenNewId();
01144 const long a2dWalker_LayerCanvasObjects::areaLayers = wxGenNewId();
01145
01146 a2dWalker_LayerCanvasObjects::a2dWalker_LayerCanvasObjects( a2dCanvasObjectFlagsMask mask )
01147 :a2dWalker_LayerGroup( mask )
01148 {
01149 Initialize();
01150 }
01151
01152 a2dWalker_LayerCanvasObjects::a2dWalker_LayerCanvasObjects( const a2dPropertyId* id , a2dCanvasObjectFlagsMask mask )
01153 :a2dWalker_LayerGroup( id, mask )
01154 {
01155 Initialize();
01156 }
01157
01158
01159 a2dWalker_LayerCanvasObjects::a2dWalker_LayerCanvasObjects( const a2dPropertyIdList& idList, a2dCanvasObjectFlagsMask mask )
01160 :a2dWalker_LayerGroup( idList, mask )
01161 {
01162 Initialize();
01163 }
01164
01165 a2dWalker_LayerCanvasObjects::~a2dWalker_LayerCanvasObjects()
01166 {
01167 }
01168
01169 void a2dWalker_LayerCanvasObjects::Initialize()
01170 {
01171 a2dWalker_LayerGroup::Initialize();
01172 m_operation = moveLayers;
01173 m_radiusMin = 0;
01174 m_radiusMax = DBL_MAX;
01175 m_detectCircle = false;
01176 m_calculatedArea = 0.0;
01177 m_AberPolyToArc = a2dCanvasGlobals->ACCUR();
01178 }
01179
01180 bool a2dWalker_LayerCanvasObjects::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
01181 {
01182 if ( m_currentDepth > m_depth )
01183 SetStopWalking( true );
01184 else
01185 SetStopWalking( false );
01186
01187 if ( event == a2dWalker_a2dCanvasObjectStart )
01188 {
01189 a2dCanvasObject* parentobj = wxDynamicCast( parent, a2dCanvasObject );
01190 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
01191 if ( obj && parentobj && !obj->GetIgnoreLayer() && !obj->GetBin() && ObjectOke( obj ) && ClassOfObjectOke( obj ) )
01192
01193 {
01194 bool hasLayer = m_groupA.InGroup( obj->GetLayer() );
01195 if ( hasLayer && ( !m_selectedOnlyA || (m_selectedOnlyA && obj->GetSelected())) )
01196 {
01197 if ( m_operation == moveLayers )
01198 {
01199 obj->SetLayer( m_target );
01200 }
01201 else if ( m_operation == copyLayers )
01202 {
01203 a2dCanvasObject* cobj = obj->TClone( a2dObject::clone_deep );
01204 parentobj->Prepend( cobj );
01205 cobj->SetLayer( m_target );
01206 cobj->SetBin( true );
01207 }
01208 else if ( m_operation == deleteLayers )
01209 {
01210 parentobj->ReleaseChild( obj );
01211 }
01212 else if ( m_operation == ConvertToArcs )
01213 {
01214 if (0 != wxDynamicCast( obj, a2dPolylineL ) && obj->GetContourWidth() )
01215 {
01216 a2dPolylineL* objc = wxDynamicCast( obj, a2dPolylineL );
01217 a2dPolygonL* contour = objc->GetAsPolygon();
01218 contour->SetLayer( m_target );
01219 contour->SetBin( true );
01220
01221 parentobj->Append( contour );
01222 }
01223 }
01224 else if ( m_operation == ConvertPolygonToArcs || m_operation == ConvertToArcs )
01225 {
01226 if (0 != wxDynamicCast( obj, a2dPolygonL ))
01227 {
01228 a2dCanvasObject* cobj = obj->TClone( a2dObject::clone_deep );
01229 cobj->SetLayer( m_target );
01230 cobj->SetBin( true );
01231 a2dPolygonL* objc = wxDynamicCast( cobj, a2dPolygonL );
01232 objc->GetSegments()->ConvertPolygonToArc( m_AberPolyToArc, m_radiusMin, m_radiusMax );
01233 a2dPoint2D middle;
01234 double radius;
01235 if ( m_detectCircle && objc->GetSegments()->CheckForOneCircle( middle, radius ) )
01236 {
01237 a2dCircle* cir = new a2dCircle( middle.m_x, middle.m_y, radius );
01238 cir->Transform( obj->GetTransformMatrix() );
01239 cir->SetLayer( m_target );
01240 cir->SetBin( true );
01241 parentobj->Prepend( cir );
01242 delete cobj;
01243 }
01244 else
01245 parentobj->Prepend( cobj );
01246 }
01247 }
01248 else if ( m_operation == ConvertPolylineToArcs )
01249 {
01250 if (0 != wxDynamicCast( obj, a2dPolylineL ) && obj->GetContourWidth() )
01251 {
01252 a2dCanvasObject* cobj = obj->TClone( a2dObject::clone_deep );
01253 a2dPolylineL* objc = wxDynamicCast( cobj, a2dPolylineL );
01254 cobj->SetLayer( m_target );
01255 cobj->SetBin( true );
01256 parentobj->Prepend( cobj );
01257 objc->GetSegments()->ConvertPolylineToArc( m_AberPolyToArc, m_radiusMin, m_radiusMax );
01258 }
01259 else if (0 != wxDynamicCast( obj, a2dPolylineL ) )
01260 {
01261 a2dCanvasObject* cobj = obj->TClone( a2dObject::clone_deep );
01262 cobj->SetLayer( m_target );
01263 cobj->SetBin( true );
01264 parentobj->Prepend( cobj );
01265 a2dPolylineL* objc = wxDynamicCast( cobj, a2dPolylineL );
01266 objc->GetSegments()->ConvertPolylineToArc( m_AberPolyToArc, m_radiusMin, m_radiusMax );
01267 }
01268 }
01269 else if ( m_operation == ConvertToPolygonPolylinesWithArcs )
01270 {
01271 a2dCanvasObjectList* polylist = ConvertToPolygons( obj, true );
01272 for( a2dCanvasObjectList::iterator iterp = polylist->begin(); iterp != polylist->end(); ++iterp )
01273 {
01274 a2dPolygonL* poly = wxDynamicCast( (*iterp).Get(), a2dPolygonL );
01275 a2dPolylineL* polyline = wxDynamicCast( (*iterp).Get(), a2dPolylineL );
01276 if ( poly && poly->GetNumberOfSegments() > 2 )
01277 {
01278 poly->SetLayer( m_target );
01279 poly->SetBin( true );
01280 parentobj->Prepend( poly );
01281 }
01282 else if ( polyline && polyline->GetNumberOfSegments() > 2 )
01283 {
01284 polyline->SetLayer( m_target );
01285 polyline->SetBin( true );
01286 parentobj->Prepend( polyline );
01287 }
01288 }
01289 delete polylist;
01290 }
01291 else if ( m_operation == ConvertToPolygonPolylinesWithoutArcs )
01292 {
01293 a2dCanvasObjectList* polylist = ConvertToPolygons( obj, true );
01294 for( a2dCanvasObjectList::iterator iterp = polylist->begin(); iterp != polylist->end(); ++iterp )
01295 {
01296 a2dPolygonL* poly = wxDynamicCast( (*iterp).Get(), a2dPolygonL );
01297 a2dPolylineL* polyline = wxDynamicCast( (*iterp).Get(), a2dPolylineL );
01298 if ( poly && poly->GetNumberOfSegments() > 2 )
01299 {
01300 poly->SetLayer( m_target );
01301 poly->SetBin( true );
01302 poly->GetSegments()->ConvertToLines();
01303 parentobj->Prepend( poly );
01304 }
01305 else if ( polyline && polyline->GetNumberOfSegments() > 2 )
01306 {
01307 polyline->SetLayer( m_target );
01308 polyline->SetBin( true );
01309 polyline->GetSegments()->ConvertToLines();
01310 parentobj->Prepend( polyline );
01311 }
01312 }
01313 delete polylist;
01314 }
01315 else if ( m_operation == ConvertToVPaths )
01316 {
01317 a2dCanvasObjectList* vpath = ConvertToVpath( obj, true );
01318 for( a2dCanvasObjectList::iterator iterp = vpath->begin(); iterp != vpath->end(); ++iterp )
01319 {
01320 a2dVectorPath* path = wxDynamicCast( (*iterp).Get(), a2dVectorPath );
01321 path->SetLayer( m_target );
01322 path->SetBin( true );
01323 parentobj->Prepend( path );
01324 }
01325 delete vpath;
01326 }
01327 else if ( m_operation == ConvertToPolylines )
01328 {
01329 a2dCanvasObjectList* polylist = ConvertToPolygons( obj, true );
01330 int i, count = polylist->size();
01331 a2dCanvasObjectList::iterator iterp = polylist->begin();
01332 for( i = 0 ; i < count ; i++ )
01333 {
01334 a2dPolygonL* poly = wxDynamicCast( (*iterp).Get(), a2dPolygonL );
01335 a2dPolylineL* polyline = wxDynamicCast( (*iterp).Get(), a2dPolylineL );
01336 if ( poly && poly->GetNumberOfSegments() > 2 )
01337 {
01338 a2dPolylineL* conv = new a2dPolylineL( poly->GetSegments() );
01339
01340 conv->SetLayer( m_target );
01341 conv->SetBin( true );
01342 parentobj->Prepend( conv );
01343 iterp = polylist->erase( iterp );
01344 }
01345 else if ( polyline && polyline->GetNumberOfSegments() > 2 )
01346 {
01347 polyline->SetLayer( m_target );
01348 polyline->SetBin( true );
01349 parentobj->Prepend( polyline );
01350 iterp++;
01351 }
01352 }
01353 delete polylist;
01354 }
01355 else if ( m_operation == ConvertLinesArcs )
01356 {
01357 a2dCanvasObjectList* polylist = ConvertToPolygons( obj, true );
01358 int i, count = polylist->size();
01359 a2dCanvasObjectList::iterator iterp = polylist->begin();
01360 for( i = 0 ; i < count ; i++ )
01361 {
01362 a2dPolygonL* poly = wxDynamicCast( (*iterp).Get(), a2dPolygonL );
01363 poly->SetLayer( m_target );
01364 poly->SetBin(true );
01365 a2dCanvasObjectList* linesAndArcs = poly->GetAsLinesArcs();
01366 for( a2dCanvasObjectList::iterator iterl = linesAndArcs->begin(); iterl != linesAndArcs->end(); ++iterl )
01367 parentobj->Prepend( *iterl );
01368 iterp = polylist->erase( iterp );
01369 delete linesAndArcs;
01370 }
01371 delete polylist;
01372 }
01373 else if ( m_operation == RemoveRedundant )
01374 {
01375 if (0 != wxDynamicCast( obj, a2dPolylineL ) )
01376 {
01377 a2dPolylineL* cobj = wxDynamicCast( obj, a2dPolylineL );
01378 cobj->GetSegments()->RemoveRedundant(false);
01379 cobj->SetLayer( m_target );
01380 cobj->SetBin(true );
01381 }
01382 else if (0 != wxDynamicCast( obj, a2dPolygonL ))
01383 {
01384 a2dPolygonL* cobj = wxDynamicCast( obj, a2dPolygonL );
01385 cobj->GetSegments()->RemoveRedundant(true);
01386 cobj->SetLayer( m_target );
01387 cobj->SetBin(true );
01388 }
01389 }
01390 else if ( m_operation == areaLayers )
01391 {
01392 AddArea( obj );
01393 }
01394 m_result = true;
01395 }
01396 }
01397 }
01398
01399 if ( m_currentDepth <= m_depth )
01400 SetStopWalking( false );
01401
01402 if ( event == a2dWalker_a2dCanvasObjectPostChild )
01403 return false;
01404
01405 return true;
01406 }
01407
01408 void a2dWalker_LayerCanvasObjects::AddArea( a2dCanvasObject* getAsPolyObject )
01409 {
01410 a2dCanvasObjectList* vpath = wxNullCanvasObjectList;
01411
01412 if (0 != wxDynamicCast( getAsPolyObject, a2dRect ))
01413 {
01414 a2dRect* obj = wxDynamicCast( getAsPolyObject, a2dRect );
01415 vpath = obj->GetAsCanvasVpaths();
01416 }
01417 else if (0 != wxDynamicCast( getAsPolyObject, a2dRectC ))
01418 {
01419 a2dRectC* obj = wxDynamicCast( getAsPolyObject, a2dRectC );
01420 vpath = obj->GetAsCanvasVpaths();
01421 }
01422 else if (0 != wxDynamicCast( getAsPolyObject, a2dArrow ))
01423 {
01424 a2dArrow* obj = wxDynamicCast( getAsPolyObject, a2dArrow );
01425 vpath = obj->GetAsCanvasVpaths();
01426 }
01427 else if (0 != wxDynamicCast( getAsPolyObject, a2dCircle ))
01428 {
01429 a2dCircle* obj = wxDynamicCast( getAsPolyObject, a2dCircle );
01430 vpath = obj->GetAsCanvasVpaths();
01431 }
01432 else if (0 != wxDynamicCast( getAsPolyObject, a2dEllipse ))
01433 {
01434 a2dEllipse* obj = wxDynamicCast( getAsPolyObject, a2dEllipse );
01435 vpath = obj->GetAsCanvasVpaths();
01436 }
01437 else if (0 != wxDynamicCast( getAsPolyObject, a2dEllipticArc ))
01438 {
01439 a2dEllipticArc* obj = wxDynamicCast( getAsPolyObject, a2dEllipticArc );
01440 vpath = obj->GetAsCanvasVpaths();
01441 }
01442 else if (0 != wxDynamicCast( getAsPolyObject, a2dArc ))
01443 {
01444 a2dArc* obj = wxDynamicCast( getAsPolyObject, a2dArc );
01445 vpath = obj->GetAsCanvasVpaths();
01446 }
01447 else if (0 != wxDynamicCast( getAsPolyObject, a2dEndsLine ) && getAsPolyObject->GetContourWidth() )
01448 {
01449 a2dEndsLine* obj = wxDynamicCast( getAsPolyObject, a2dEndsLine );
01450 vpath = obj->GetAsCanvasVpaths();
01451 }
01452 else if (0 != wxDynamicCast( getAsPolyObject, a2dSLine ) && getAsPolyObject->GetContourWidth() )
01453 {
01454 a2dSLine* obj = wxDynamicCast( getAsPolyObject, a2dSLine );
01455 vpath = obj->GetAsCanvasVpaths();
01456 }
01457 else if (0 != wxDynamicCast( getAsPolyObject, a2dPolylineL ) && getAsPolyObject->GetContourWidth() )
01458 {
01459 a2dPolylineL* obj = wxDynamicCast( getAsPolyObject, a2dPolylineL );
01460 vpath = obj->GetAsCanvasVpaths();
01461 }
01462 else if (0 != wxDynamicCast( getAsPolyObject, a2dPolygonL ))
01463 {
01464 a2dPolygonL* obj = wxDynamicCast( getAsPolyObject, a2dPolygonL );
01465 vpath = obj->GetAsCanvasVpaths();
01466 }
01467 else if (0 != wxDynamicCast( getAsPolyObject, a2dVectorPath ))
01468 {
01469 a2dVectorPath* obj = wxDynamicCast( getAsPolyObject, a2dVectorPath );
01470 vpath = obj->GetAsCanvasVpaths();
01471 }
01472 else if (0 != wxDynamicCast( getAsPolyObject, a2dText ))
01473 {
01474 a2dText* obj = wxDynamicCast( getAsPolyObject, a2dText );
01475 vpath = obj->GetAsCanvasVpaths();
01476 }
01477
01478
01479
01480 if ( vpath != wxNullCanvasObjectList )
01481 {
01482
01483 a2dCanvasObjectList::iterator iter = vpath->begin();
01484 while ( iter != vpath->end() )
01485 {
01486 a2dCanvasObjectList* polylist = NULL;
01487 a2dVectorPath* obj = (a2dVectorPath*) (*iter).Get();
01488 polylist = obj->GetAsPolygons();
01489
01490 for( a2dCanvasObjectList::iterator iterp = polylist->begin(); iterp != polylist->end(); ++iterp )
01491 {
01492 a2dPolygonL* poly = wxDynamicCast( (*iterp).Get(), a2dPolygonL );
01493 if ( poly && poly->GetNumberOfSegments() > 2 )
01494 {
01495 m_calculatedArea += poly->GetSegments()->CalcArea();
01496 }
01497 }
01498 delete polylist;
01499
01500 iter = vpath->erase( iter );
01501 iter = vpath->begin();
01502 }
01503 delete vpath;
01504 }
01505 }
01506
01507
01508
01509
01510
01511 a2dWalker_DetectSmall::a2dWalker_DetectSmall( a2dCanvasObjectFlagsMask mask )
01512 :a2dWalker_LayerGroup( mask )
01513 {
01514 Initialize();
01515 }
01516
01517 a2dWalker_DetectSmall::a2dWalker_DetectSmall( const a2dPropertyId* id , a2dCanvasObjectFlagsMask mask )
01518 :a2dWalker_LayerGroup( id, mask )
01519 {
01520 Initialize();
01521 }
01522
01523 a2dWalker_DetectSmall::a2dWalker_DetectSmall( const a2dPropertyIdList& idList, a2dCanvasObjectFlagsMask mask )
01524 :a2dWalker_LayerGroup( idList, mask )
01525 {
01526 Initialize();
01527 }
01528
01529 a2dWalker_DetectSmall::~a2dWalker_DetectSmall()
01530 {
01531 }
01532
01533 void a2dWalker_DetectSmall::Initialize()
01534 {
01535 a2dWalker_LayerGroup::Initialize();
01536 m_asString = false;
01537
01538
01539
01540
01541
01542
01543
01544
01545 }
01546
01547 bool a2dWalker_DetectSmall::Start( a2dCanvasObject* object )
01548 {
01549 a2dWalker_SetSpecificFlagsCanvasObjects setflags( a2dCanvasOFlags::BIN );
01550 setflags.Start( object, false );
01551
01552 m_CVGwriter.WriteCvgStartDocument( m_strstream );
01553
01554 m_CVGwriter.WriteStartElementAttributes( wxT("o") );
01555 m_CVGwriter.WriteAttribute( wxT("classname"), wxT("a2dCanvasObject") );
01556 m_CVGwriter.WriteEndAttributes();
01557
01558 object->Walker( NULL, *this );
01559
01560 m_CVGwriter.WriteEndElement();
01561
01562 m_CVGwriter.WriteCvgEndDocument();
01563
01564 return m_result;
01565 }
01566
01567 bool a2dWalker_DetectSmall::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
01568 {
01569 if ( m_currentDepth > m_depth )
01570 SetStopWalking( true );
01571 else
01572 SetStopWalking( false );
01573
01574 if ( event == a2dWalker_a2dCanvasObjectStart )
01575 {
01576 a2dCanvasObject* parentobj = wxDynamicCast( parent, a2dCanvasObject );
01577 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
01578 if ( obj && parentobj && !obj->GetIgnoreLayer() && !obj->GetBin() && ObjectOke( obj ) && ClassOfObjectOke( obj ) )
01579 {
01580 bool hasLayer = m_groupA.InGroup( obj->GetLayer() );
01581 if ( hasLayer && ( !m_selectedOnlyA || (m_selectedOnlyA && obj->GetSelected())) )
01582 {
01583 if ( obj->GetBboxWidth() < m_small && obj->GetBboxHeight() < m_small )
01584 {
01585 if ( m_asString )
01586 {
01587 #if wxART2D_USE_CVGIO
01588 m_CVGwriter.WriteObject( obj );
01589 #endif //wxART2D_USE_CVGIO
01590 }
01591 else
01592 {
01593 a2dCanvasObject* cobj = obj->TClone( a2dObject::clone_deep );
01594 cobj->SetLayer( m_target );
01595 cobj->SetBin( true );
01596 parentobj->Prepend( cobj );
01597 }
01598 m_result = true;
01599 }
01600 }
01601 }
01602 }
01603
01604 if ( m_currentDepth <= m_depth )
01605 SetStopWalking( false );
01606
01607 if ( event == a2dWalker_a2dCanvasObjectPostChild )
01608 return false;
01609
01610 return true;
01611 }
01612
01613
01614
01615
01616
01617 a2dWalker_DetectSmallSegments::a2dWalker_DetectSmallSegments( a2dCanvasObjectFlagsMask mask )
01618 :a2dWalker_LayerGroup( mask )
01619 {
01620 Initialize();
01621 }
01622
01623 a2dWalker_DetectSmallSegments::a2dWalker_DetectSmallSegments( const a2dPropertyId* id , a2dCanvasObjectFlagsMask mask )
01624 :a2dWalker_LayerGroup( id, mask )
01625 {
01626 Initialize();
01627 }
01628
01629 a2dWalker_DetectSmallSegments::a2dWalker_DetectSmallSegments( const a2dPropertyIdList& idList, a2dCanvasObjectFlagsMask mask )
01630 :a2dWalker_LayerGroup( idList, mask )
01631 {
01632 Initialize();
01633 }
01634
01635 a2dWalker_DetectSmallSegments::~a2dWalker_DetectSmallSegments()
01636 {
01637 }
01638
01639 void a2dWalker_DetectSmallSegments::Initialize()
01640 {
01641 a2dWalker_LayerGroup::Initialize();
01642 m_asString = false;
01643
01644
01645
01646
01647
01648
01649
01650
01651 }
01652
01653 bool a2dWalker_DetectSmallSegments::Start( a2dCanvasObject* object )
01654 {
01655 a2dWalker_SetSpecificFlagsCanvasObjects setflags( a2dCanvasOFlags::BIN );
01656 setflags.Start( object, false );
01657
01658 m_CVGwriter.WriteCvgStartDocument( m_strstream );
01659
01660 m_CVGwriter.WriteStartElementAttributes( wxT("o") );
01661 m_CVGwriter.WriteAttribute( wxT("classname"), wxT("a2dCanvasObject") );
01662 m_CVGwriter.WriteEndAttributes();
01663
01664 object->Walker( NULL, *this );
01665
01666 m_CVGwriter.WriteEndElement();
01667
01668 m_CVGwriter.WriteCvgEndDocument();
01669
01670 return m_result;
01671 }
01672
01673 bool a2dWalker_DetectSmallSegments::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
01674 {
01675 if ( m_currentDepth > m_depth )
01676 SetStopWalking( true );
01677 else
01678 SetStopWalking( false );
01679
01680 if ( event == a2dWalker_a2dCanvasObjectStart )
01681 {
01682 a2dCanvasObject* parentobj = wxDynamicCast( parent, a2dCanvasObject );
01683 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
01684 if ( obj && parentobj && !obj->GetIgnoreLayer() && !obj->GetBin() && ObjectOke( obj ) && ClassOfObjectOke( obj ) )
01685 {
01686 bool hasLayer = m_groupA.InGroup( obj->GetLayer() );
01687 if ( hasLayer && ( !m_selectedOnlyA || (m_selectedOnlyA && obj->GetSelected())) )
01688 {
01689 a2dVertexListPtr redun;
01690 if (0 != wxDynamicCast( obj, a2dPolylineL ) )
01691 {
01692 a2dPolylineL* cobj = wxDynamicCast( obj, a2dPolylineL );
01693 redun = cobj->GetSegments()->GetRedundant( false, m_small );
01694 if ( redun )
01695 {
01696 m_result = true;
01697 a2dSmrtPtr<a2dPolylineL> p = new a2dPolylineL( redun, false );
01698 p->SetLayer( m_target );
01699 p->SetBin( true );
01700 if ( m_asString )
01701 {
01702 #if wxART2D_USE_CVGIO
01703 m_CVGwriter.WriteObject( p );
01704 #endif //wxART2D_USE_CVGIO
01705 }
01706 else
01707 parentobj->Append( p );
01708 }
01709 }
01710 else if (0 != wxDynamicCast( obj, a2dPolygonL ))
01711 {
01712 a2dPolygonL* cobj = wxDynamicCast( obj, a2dPolygonL );
01713 redun = cobj->GetSegments()->GetRedundant( true, m_small );
01714 if ( redun )
01715 {
01716 m_result = true;
01717 a2dSmrtPtr<a2dPolygonL> p = new a2dPolygonL( redun, false );
01718 p->SetLayer( m_target );
01719 p->SetBin( true );
01720 if ( m_asString )
01721 {
01722 #if wxART2D_USE_CVGIO
01723 m_CVGwriter.WriteObject( p );
01724 #endif //wxART2D_USE_CVGIO
01725 }
01726 else
01727 parentobj->Append( p );
01728 }
01729 }
01730 }
01731 }
01732 }
01733
01734 if ( m_currentDepth <= m_depth )
01735 SetStopWalking( false );
01736
01737 if ( event == a2dWalker_a2dCanvasObjectPostChild )
01738 return false;
01739
01740 return true;
01741 }
01742
01743
01744
01745
01746
01747 a2dWalker_FindAndSetCorridorPath::a2dWalker_FindAndSetCorridorPath( a2dCanvasObject* search )
01748 :a2dWalker_FindCanvasObject( search )
01749 {
01750 }
01751
01752
01753 a2dWalker_FindAndSetCorridorPath::~a2dWalker_FindAndSetCorridorPath()
01754 {
01755 }
01756
01757 bool a2dWalker_FindAndSetCorridorPath::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
01758 {
01759 if ( event == a2dWalker_a2dPropObjectStart )
01760 SetStopWalking( true );
01761
01762 if ( event == a2dWalker_a2dCanvasObjectStart )
01763 {
01764 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
01765 if ( !m_result )
01766 obj->SetIsOnCorridorPath( true );
01767 if ( obj == m_search )
01768 {
01769 m_result = true;
01770 SetStopWalking( true );
01771 return true;
01772 }
01773 }
01774
01775 if ( event == a2dWalker_a2dCanvasObjectEnd )
01776 {
01777 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
01778 if ( !m_result )
01779 {
01780 obj->SetIsOnCorridorPath( false );
01781 return true;
01782 }
01783 }
01784 if ( event == a2dWalker_a2dCanvasObjectPostChild )
01785 return false;
01786
01787 if ( !m_result && event == a2dWalker_a2dPropObjectEnd )
01788 SetStopWalking( false );
01789
01790
01791 return true;
01792 }
01793
01794
01795
01796
01797 /! Search for objects that are multiple referenced from within the document.
01798 All such object get there m_bin2 flag set.
01799 /
01800 virtual bool MarkMultiReferences();
01801
01802
01803 bool a2dCanvasObject::MarkMultiReferences()
01804 {
01805 bool found = true;
01806
01807 if ( GetBin() )
01808 {
01809 m_flags.m_bin2 = true;
01810 found = true;
01811 }
01812 m_flags.m_bin = true; //passed here
01813
01814 if ( canobj->GetChildObjectList() == wxNullCanvasObjectList )
01815 return found;
01816
01817 forEachIn( a2dCanvasObjectList, canobj->GetChildObjectList() )
01818 {
01819 a2dCanvasObject *obj = *iter;
01820 found = obj->MarkMultiReferences() && found;
01821 }
01822 return found;
01823 }
01824
01825
01826
01827
01828
01829
01830
01831
01832
01833 /!
01834 The base implementation calls this function on its childs, so in a derived object always
01835 call the base class to keep recursing deeper.
01836
01837 \param function id of the user function to be called
01838 \param data for the called function (type depends on id)
01839 \param depth recursion depth (0=this object, 1=this object+childs, ...)
01840 \param flags objects with this flag set ignore the depth limit
01841 /
01842 virtual bool UserBaseFunctionEx( int function, void *data, int depth, a2dCanvasObjectFlagsMask flags );
01843
01844
01845
01846 bool a2dCanvasObject::UserBaseFunctionEx( int function, void *data, int depth, a2dCanvasObjectFlagsMask flags )
01847 {
01848 if( depth<=0 && !CheckMask( flags ) )
01849 return true;
01850
01851 bool rslt = true;
01852 if( GetChildObjectsCount() )
01853 {
01854 forEachIn( a2dCanvasObjectList, canobj->GetChildObjectList() )
01855 {
01856 a2dCanvasObject *obj = *iter;
01857 rslt &= obj->UserBaseFunctionEx( function, data, depth-1, flags );
01858 }
01859 }
01860 return rslt;
01861 }
01862
01863
01864
01865
01866
01867 /!
01868 This brings the wxWindows controls back to the front.
01869 /
01870 void RefreshControls();
01871
01872
01873 void a2dCanvasObject::RefreshControls()
01874 {
01875 if ( canobj->GetChildObjectList() == wxNullCanvasObjectList )
01876 return;
01877
01878 forEachIn( a2dCanvasObjectList, canobj->GetChildObjectList() )
01879 {
01880 a2dCanvasObject *obj = *iter;
01881 obj->RefreshControls();
01882 }
01883 }
01884 */
01885
01886
01887
01888
01889
01890
01891 a2dWalker_AllowedObjects::a2dWalker_AllowedObjects( a2dCanvasObjectFlagsMask mask )
01892 :a2dWalker_LayerGroup( mask )
01893 {
01894 Initialize();
01895 }
01896
01897 a2dWalker_AllowedObjects::a2dWalker_AllowedObjects( const a2dPropertyId* id , a2dCanvasObjectFlagsMask mask )
01898 :a2dWalker_LayerGroup( id, mask )
01899 {
01900 Initialize();
01901 }
01902
01903 a2dWalker_AllowedObjects::a2dWalker_AllowedObjects( const a2dPropertyIdList& idList, a2dCanvasObjectFlagsMask mask )
01904 :a2dWalker_LayerGroup( idList, mask )
01905 {
01906 Initialize();
01907 }
01908
01909 a2dWalker_AllowedObjects::~a2dWalker_AllowedObjects()
01910 {
01911 }
01912
01913 void a2dWalker_AllowedObjects::Initialize()
01914 {
01915 a2dWalker_LayerGroup::Initialize();
01916 m_asString = false;
01917
01918
01919
01920
01921
01922
01923
01924
01925
01926 }
01927
01928 bool a2dWalker_AllowedObjects::Start( a2dCanvasObject* object )
01929 {
01930 a2dWalker_SetSpecificFlagsCanvasObjects setflags( a2dCanvasOFlags::BIN );
01931 setflags.Start( object, false );
01932
01933 m_CVGwriter.WriteCvgStartDocument( m_strstream );
01934
01935 m_CVGwriter.WriteStartElementAttributes( wxT("o") );
01936 m_CVGwriter.WriteAttribute( wxT("classname"), wxT("a2dCanvasObject") );
01937 m_CVGwriter.WriteEndAttributes();
01938
01939 object->Walker( NULL, *this );
01940
01941 m_CVGwriter.WriteEndElement();
01942
01943 m_CVGwriter.WriteCvgEndDocument();
01944
01945 return m_result;
01946 }
01947
01948 bool a2dWalker_AllowedObjects::WalkTask( wxObject* parent, wxObject* object, a2dWalkEvent event )
01949 {
01950 if ( m_currentDepth > m_depth )
01951 SetStopWalking( true );
01952 else
01953 SetStopWalking( false );
01954
01955 if ( event == a2dWalker_a2dCanvasObjectStart )
01956 {
01957 a2dCanvasObject* parentobj = wxDynamicCast( parent, a2dCanvasObject );
01958 a2dCanvasObject* obj = wxDynamicCast( object, a2dCanvasObject );
01959 if ( obj && parentobj && !obj->GetIgnoreLayer() && !obj->GetBin() && ObjectOke( obj ) )
01960 {
01961 bool hasLayer = m_groupA.InGroup( obj->GetLayer() );
01962 if ( hasLayer && ( !m_selectedOnlyA || (m_selectedOnlyA && obj->GetSelected())) )
01963 {
01964
01965 if ( ClassOfObjectOke( obj ) )
01966 {
01967 m_result = true;
01968 if ( m_store )
01969 {
01970 if ( m_asString )
01971 {
01972 #if wxART2D_USE_CVGIO
01973 m_CVGwriter.WriteObject( obj );
01974 #endif //wxART2D_USE_CVGIO
01975 }
01976 else
01977 {
01978 a2dCanvasObject* cobj = obj->TClone( a2dObject::clone_deep );
01979 cobj->SetLayer( m_target );
01980 cobj->SetBin( true );
01981 parentobj->Prepend( cobj );
01982 }
01983 }
01984 }
01985 }
01986 }
01987 }
01988
01989 if ( m_currentDepth <= m_depth )
01990 SetStopWalking( false );
01991
01992 if ( event == a2dWalker_a2dCanvasObjectPostChild )
01993 return false;
01994
01995 return true;
01996 }
01997
01998
01999
02000
02001
02002 a2dWalkerIOHandlerWithContext::a2dWalkerIOHandlerWithContext( a2dIterC& ic )
02003 : a2dWalkerIOHandler()
02004 {
02005 m_context = ⁣
02006 Initialize();
02007 }
02008
02009 a2dWalkerIOHandlerWithContext::~a2dWalkerIOHandlerWithContext()
02010 {
02011 }
02012
02013 void a2dWalkerIOHandlerWithContext::Initialize()
02014 {
02015 }
02016
02017
02018 bool a2dWalkerIOHandlerWithContext::Start( a2dCanvasObject* object )
02019 {
02020 a2dWalker_SetBoolProperty setp( PROPID_Check, false );
02021 setp.Start( object );
02022
02023 SetDepthFirst( false );
02024 m_result = true;
02025 m_context->SetClipStatus( _ON );
02026 m_context->SetRenderChildDerived( false );
02027 object->WalkerWithContext( *m_context, NULL, *this );
02028 return m_result;
02029 }
02030
02031
02032
02033
02034
02035 a2dWalker_RenderLayers::a2dWalker_RenderLayers( a2dIterC& ic )
02036 :a2dWalkerIOHandlerWithContext( ic )
02037 {
02038
02039 }
02040
02041 a2dWalker_RenderLayers::~a2dWalker_RenderLayers()
02042 {
02043
02044 }
02045
02046 bool a2dWalker_RenderLayers::WalkTask( a2dIterC& ic, wxObject* parent, wxObject* object, a2dWalkEvent event )
02047 {
02048 if ( event == a2dWalker_a2dCanvasObjectStart )
02049 {
02050 a2dCanvasObject* parentobj = (a2dCanvasObject*) parent;
02051 a2dCanvasObject* canobj = (a2dCanvasObject*) object;
02052 OVERLAP clipparent = ic.GetParentClipStatus();
02053 OVERLAP childclip = _IN;
02054
02055 childclip = canobj->GetClipStatus( ic, clipparent );
02056 ic.SetClipStatus( childclip );
02057
02058 {
02059 Render( ic, canobj, childclip );
02060 }
02061 }
02062 if ( event == a2dWalker_a2dCanvasObjectPostChild )
02063 return false;
02064
02065 return true;
02066 }
02067
02068 void a2dWalker_RenderLayers::Render( a2dIterC& ic, a2dCanvasObject* canobj, OVERLAP clipparent )
02069 {
02070 wxUint16 layer = canobj->GetLayer();
02071
02072 if ( canobj->GetRelease( ) )
02073 return;
02074
02075 if ( !ic.FilterObject( canobj ) )
02076 {
02077 ic.EndFilterObject( canobj );
02078 return;
02079 }
02080
02081
02082
02083
02084
02085
02086
02087
02088
02089
02090
02091
02092 if ( !canobj->GetFlag( a2dCanvasOFlags::NoRenderCanvasObject) && canobj->GetBbox().GetWidth() && canobj->GetBbox().GetHeight() )
02093 {
02094 a2dBoundingBox absarea = canobj->GetBbox();
02095 if ( !ic.GetTransform().IsIdentity())
02096 absarea.MapBbox( ic.GetTransform() );
02097
02098 double size = wxMax( absarea.GetWidth(), absarea.GetHeight() );
02099 if ( ic.GetDrawer2D()->GetPrimitiveThreshold() != 0
02100 && size < ic.GetDrawer2D()->DeviceToWorldXRel( ic.GetDrawer2D()->GetPrimitiveThreshold() ) )
02101 {
02102 if ( ic.GetDrawer2D()->GetThresholdDrawRectangle() )
02103 {
02104 wxRect absareadev = canobj->GetAbsoluteArea( ic, 0 );
02105 ic.GetDrawer2D()->DrawRoundedRectangle( canobj->GetBbox().GetMinX(), canobj->GetBbox().GetMinY(),
02106 canobj->GetBbox().GetWidth(), canobj->GetBbox().GetHeight(),0);
02107
02108 if ( canobj->GetHighLight() )
02109 canobj->DrawHighLighted( ic );
02110 }
02111 ic.EndFilterObject( canobj );
02112 return;
02113 }
02114 }
02115
02116
02117 {
02118
02119
02120
02121 a2dIterCU cu( ic, canobj );
02122
02123
02124
02125
02126
02127
02128
02129 bool fillset = false;
02130 bool strokeset = false;
02131 bool viewSpecific = false;
02132
02133 a2dLayers* layers = canobj->GetCanvasDocument()->GetLayerSetup();
02134
02135 if ( layers )
02136 {
02137 if ( !fillset )
02138 ic.GetDrawer2D()->SetDrawerFill( layers->GetFill(layer) );
02139 if ( !strokeset )
02140 ic.GetDrawer2D()->SetDrawerStroke( layers->GetStroke(layer) );
02141 }
02142 else
02143 {
02144 if ( !fillset )
02145 ic.GetDrawer2D()->SetDrawerFill( *a2dBLACK_FILL );
02146 if ( !strokeset )
02147 ic.GetDrawer2D()->SetDrawerStroke( *a2dBLACK_STROKE );
02148 }
02149
02150
02151
02152
02153
02154
02155
02156
02157 if ( ic.GetLayer() == layer || ic.GetLayer() == wxLAYER_ALL || canobj->GetIgnoreLayer() )
02158 {
02159
02160
02161
02162
02163
02164 canobj->CallDoRender( ic, clipparent );
02165 }
02166 }
02167
02168 if ( canobj->GetHighLight() )
02169 canobj->DrawHighLighted( ic );
02170
02171 ic.EndFilterObject( canobj );
02172 }
02173
02174