00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
#ifndef VTK_TRAVERSAL_H_
00017
# define VTK_TRAVERSAL_H_
00018
# include "vtkExtensionsHybridConfigure.h"
00019
# include "vtkExtensionsTypes.h"
00020
00021
# include "vtkDataObject.h"
00022
# include "vtkSource.h"
00023
00024 # define VTK_TRAVERSAL_DISCONNECTED 0x01
00025 # define VTK_TRAVERSAL_PRECEDING 0x02
00026 # define VTK_TRAVERSAL_FOLLOWING 0x04
00027 # define VTK_TRAVERSAL_CONTAINS 0x08
00028 # define VTK_TRAVERSAL_CONTAINED_BY 0x10
00029 # define VTK_TRAVERSAL_IMPLEMENTATION_SPECIFIC 0x20
00030
00031
class vtkCollection;
00032
class vtkDataObjectCollection;
00033
00034
VTK_EXTENSIONS_NAMESPACE_BEGIN
00035
00036
class vtkProcessObjectCollection;
00037
00038
VTK_EXTENSIONS_HYBRID_NESTED_NAMESPACE_BEGIN
00039
00048 class VTK_EXTENSIONS_HYBRID_EXPORT vtkTraversal
00049 {
00050
public:
00051 static vtkTraversal* New (
void) {
return new vtkTraversal; }
00052
00053 vtkTraversal (
void);
00054
00055 vtkTraversal (
vtkProcessObject* a);
00056
virtual ~vtkTraversal();
00057
00058
00059
void UpdateTop (
vtkProcessObject* aNode);
00060
00061
void UpdateTop (
void);
00062
00064
vtkProcessObject* InitTraversal (
vtkProcessObject* aNode);
00065
00067
vtkProcessObject* InitTraversal (
void);
00068
00069
vtkProcessObject* TraverseUp (
void);
00070
00071
vtkProcessObject* TraverseForward (
int& depth);
00072
00073
vtkProcessObject* TraverseForward (
void);
00074
00075
vtkProcessObject* TraverseBackward (
void);
00076
00077
vtkProcessObject* Find (
vtkProcessObject* node);
00078
00079
vtkProcessObject* FindByType (
const char* classname);
00080
vtkProcessObject* FindBySupertype (
const char* superclassname);
00081
00082
public:
00084
static vtkProcessObject* GetInputSource (
vtkDataObject* o);
00085
00087
static vtkDataObject* GetFirstInput (
vtkProcessObject* o);
00088
00090
static vtkDataObject* GetParent (
vtkDataObject* o);
00091
00093
static vtkProcessObject* GetParent (
vtkProcessObject* o);
00094
00095
00097
static vtkCollection*
00098 GetConsumers (
vtkDataObject* parent,
vtkCollection** = 0);
00099
00101
static vtkDataObjectCollection*
00102 GetOutputs (
vtkProcessObject* parent,
vtkDataObjectCollection** = 0);
00103
00105
static vtkDataObjectCollection*
00106 GetChildren (
vtkDataObject* parent,
vtkDataObjectCollection** = 0);
00107
00109
static vtkCollection*
00110 GetConsumers (
vtkProcessObject* parent,
vtkCollection** = 0);
00111
00113
static vtkProcessObjectCollection*
00114 GetChildren (
vtkProcessObject* parent,
vtkProcessObjectCollection** = 0);
00115
00116
static int GetNumberOfChildren (
vtkDataObject* parent,
00117
vtkDataObjectCollection** = 0);
00118
00119
static int GetNumberOfChildren (
vtkProcessObject* parent,
00120
vtkProcessObjectCollection** = 0);
00121
00122
00123
static vtkObject* GetFirstConsumer (
vtkDataObject* o);
00124
static vtkProcessObject* GetFirstProcessObject (
vtkDataObject* o);
00125
static vtkDataObject* GetFirstOutput (
vtkProcessObject* o);
00126
00127
static vtkDataObject* GetFirstChild (
vtkDataObject* o);
00128
static vtkObject* GetFirstConsumer (
vtkProcessObject* o);
00129
static vtkProcessObject* GetFirstChild (
vtkProcessObject* o);
00130
00131
static vtkObject* GetLastConsumer (
vtkDataObject* o);
00132
static vtkProcessObject* GetLastProcessObject (
vtkDataObject* o);
00133
static vtkDataObject* GetLastOutput (
vtkProcessObject* o);
00134
00135
static vtkDataObject* GetLastChild (
vtkDataObject* o);
00136
static vtkObject* GetLastConsumer (
vtkProcessObject* o);
00137
static vtkProcessObject* GetLastChild (
vtkProcessObject* o);
00138
00139
static vtkDataObject* GetNextSibling (
vtkDataObject* o);
00140
static vtkProcessObject* GetNextSibling (
vtkProcessObject* o);
00141
static vtkDataObject* GetPreviousSibling (
vtkDataObject* o);
00142
static vtkProcessObject* GetPreviousSibling (
vtkProcessObject*);
00143
00144
static vtkDataObject* GetTop (
vtkDataObject* o);
00145
static vtkProcessObject* GetTop (
vtkProcessObject* o);
00146
00160
static vtkProcessObject* Splice (
vtkProcessObject* newNode,
00161
vtkProcessObject* refNode);
00162
00172
static vtkProcessObject* Replace (
vtkProcessObject* newNode,
00173
vtkProcessObject* oldNode);
00174
00181
static vtkProcessObject* Remove (
vtkProcessObject* oldNode);
00182
00194
static vtkSource* Append (
vtkSource* newNode,
00195
vtkProcessObject* refNode);
00196
00197
static vtkBoolType HasChildren (
vtkDataObject* o);
00198
static vtkBoolType HasChildren (
vtkProcessObject* o);
00199
00200 static unsigned short ComparePosition (
vtkProcessObject* o) {
return 0; }
00201
00202 static vtkBoolType IsSame (
vtkProcessObject* o) {
return false;}
00203 static vtkBoolType IsEqual (
vtkProcessObject* o) {
return false;}
00204
00205
protected:
00206 vtkProcessObject* Top;
00207 vtkProcessObject* Current;
00208
00209
00210 typedef vtkTraversal
Self;
00211
00212
00216
static int GetConsumerIndex (
vtkDataObject* o,
00217
vtkObject* consumer);
00218
00222
static int GetOutputIndex (
vtkProcessObject* o,
00223
vtkDataObject* output);
00224
00233
static int SetNthInput (
vtkProcessObject* node,
00234
int index,
00235
vtkDataObject* input);
00236
00241
static vtkBoolType IsSelfOrAncestor (
vtkProcessObject* node,
00242
vtkProcessObject* child);
00243
00244
private:
00250 vtkTraversal (
const vtkTraversal&);
00251
void operator= (
const vtkTraversal&);
00253 };
00254
00255
00256
inline int
00257 vtkTraversal::GetConsumerIndex (
vtkDataObject* aDataObject,
00258
vtkObject* aConsumer)
00259 {
00260
if (aConsumer != NULL && aDataObject != NULL)
00261 {
00262
int n;
00263
00264
if ((n = aDataObject->
GetNumberOfConsumers()) > 0)
00265
for (
int i=0; i<n; i++)
00266
if (aDataObject->
GetConsumer(i) == aConsumer)
00267
return i;
00268 }
00269
00270
return -1;
00271 }
00272
00273
inline int
00274 vtkTraversal::GetOutputIndex (
vtkProcessObject* aProcessObject,
00275
vtkDataObject* aOutput)
00276 {
00277
vtkSource* source;
00278
00279
if ( aOutput != NULL &&
00280 (source = vtkSource::SafeDownCast(aProcessObject)) != NULL )
00281 {
00282
int n;
00283
00284
if ((n = source->GetNumberOfOutputs()) > 0)
00285
for (
int i=0; i<n; i++)
00286
if ((source->GetOutputs())[i] == aOutput)
00287
return i;
00288 }
00289
00290
return -1;
00291 }
00292
00293
inline int
00294 vtkTraversal::SetNthInput (
vtkProcessObject* aProcessObject,
00295
int aIndex,
00296
vtkDataObject* aInput)
00297 {
00298
vtkDataObject** input;
00299
00300
if ( (aProcessObject == NULL) ||
00301 (aIndex < 0) ||
00302 (aIndex >= aProcessObject->
GetNumberOfInputs()) )
00303
return VTK_ERROR;
00304
00305
if (*(input = &((aProcessObject->
GetInputs())[aIndex])) == aInput)
00306
return VTK_OK;
00307
00308
if (*input != NULL)
00309 {
00310 (*input)->RemoveConsumer(aProcessObject);
00311 (*input)->UnRegister(aProcessObject);
00312 *input = NULL;
00313 }
00314
00315
if (aInput != NULL)
00316 {
00317 aInput->
AddConsumer(aProcessObject);
00318 aInput->
Register(aProcessObject);
00319 *input = aInput;
00320 }
00321
00322 aProcessObject->
Modified();
00323
00324
return VTK_OK;
00325 }
00326
00327
inline vtkBoolType
00328 vtkTraversal::IsSelfOrAncestor (
vtkProcessObject* aNode,
00329
vtkProcessObject* aChild)
00330 {
00331
if (aNode == aChild)
00332 {
00333
return VTK_TRUE;
00334 }
00335
00336
00337
if (!Self::HasChildren(aChild))
00338 {
00339
return VTK_FALSE;
00340 }
00341
00342
vtkProcessObject* parentNode = Self::GetParent(aNode);
00343
00344
while (parentNode != NULL)
00345 {
00346
if (parentNode == aChild)
00347 {
00348
return VTK_TRUE;
00349 }
00350 parentNode = Self::GetParent(parentNode);
00351 }
00352
00353
return VTK_FALSE;
00354 }
00355
00356
00357
vtkProcessObject*
00358 vtkTraversal::GetInputSource (
vtkDataObject* aInput)
00359 {
00360
if (aInput == NULL)
00361
return NULL;
00362
00363
00364
return aInput->
GetSource();
00365 }
00366
00367
vtkDataObject*
00368 vtkTraversal::GetFirstInput (
vtkProcessObject* aProcessObject)
00369 {
00370
if (aProcessObject == NULL || aProcessObject->
GetNumberOfInputs() < 1)
00371
return NULL;
00372
00373
if (aProcessObject->
GetNumberOfInputs() > 1)
00374 vtkGenericWarningMacro(<<
"vtkTraversal does not handle > 1 inputs.");
00375
00376
00377
return (aProcessObject->
GetInputs())[0];
00378 }
00379
00380
00381
vtkDataObject*
00382 vtkTraversal::GetParent (
vtkDataObject* aDataObject)
00383 {
00384
vtkProcessObject* source;
00385
00386
00387
if ((source = Self::GetInputSource(aDataObject)) != NULL)
00388
00389
return Self::GetFirstInput(source);
00390
00391
return NULL;
00392 }
00393
00394
vtkProcessObject*
00395 vtkTraversal::GetParent (
vtkProcessObject* aProcessObject)
00396 {
00397
vtkDataObject* dataObject;
00398
00399
00400
if ((dataObject = Self::GetFirstInput(aProcessObject)) != NULL)
00401
00402
return Self::GetInputSource(dataObject);
00403
00404
return NULL;
00405 }
00406
00407
00408
vtkObject*
00409 vtkTraversal::GetFirstConsumer (
vtkDataObject* aDataObject)
00410 {
00411
vtkObject* o = NULL;
00412
int n, i = 0;
00413
00414
if (aDataObject != NULL && (n = aDataObject->
GetNumberOfConsumers()) > 0)
00415
while (i < n && (o = aDataObject->
GetConsumer(i)) == NULL) i++;
00416
00417
return o;
00418 }
00419
00420
vtkProcessObject*
00421 vtkTraversal::GetFirstProcessObject (
vtkDataObject* aDataObject)
00422 {
00423
vtkProcessObject* o = NULL;
00424
int n, i = 0;
00425
00426
if (aDataObject != NULL && (n = aDataObject->
GetNumberOfConsumers()) > 0)
00427
while ( i < n &&
00428 (o = vtkProcessObject::SafeDownCast(aDataObject->
GetConsumer(i)))
00429 == NULL) i++;
00430
00431
return o;
00432 }
00433
00434
vtkDataObject*
00435 vtkTraversal::GetFirstOutput (
vtkProcessObject* aProcessObject)
00436 {
00437
vtkDataObject* result = NULL;
00438
vtkSource* source;
00439
00440
if ((source = vtkSource::SafeDownCast(aProcessObject)) != NULL)
00441 {
00442
int n, i = 0;
00443
00444
if (source != NULL && (n = source->
GetNumberOfOutputs()) > 0)
00445
while (i < n && (result = (source->
GetOutputs())[i]) == NULL) i++;
00446 }
00447
00448
return result;
00449 }
00450
00451
00452
vtkDataObject*
00453 vtkTraversal::GetFirstChild (
vtkDataObject* aDataObject)
00454 {
00455
vtkDataObject* result = NULL;
00456
vtkProcessObject* processObject;
00457
00458
if ((processObject = Self::GetFirstProcessObject(aDataObject)) != NULL)
00459
while ( processObject != NULL &&
00460 (result = Self::GetFirstOutput(processObject)) == NULL )
00461 processObject = Self::GetNextSibling(processObject);
00462
00463
return result;
00464 }
00465
00466
vtkObject*
00467 vtkTraversal::GetFirstConsumer (
vtkProcessObject* aProcessObject)
00468 {
00469
vtkObject* result = NULL;
00470
vtkDataObject* output;
00471
00472
if ((output = Self::GetFirstOutput(aProcessObject)) != NULL)
00473
while (output != NULL && (result = Self::GetFirstConsumer(output)) == NULL)
00474 output = Self::GetNextSibling(output);
00475
00476
return result;
00477 }
00478
00479
vtkProcessObject*
00480 vtkTraversal::GetFirstChild (
vtkProcessObject* aProcessObject)
00481 {
00482
vtkProcessObject* result = NULL;
00483
vtkDataObject* output;
00484
00485
if ((output = Self::GetFirstOutput(aProcessObject)) != NULL)
00486
while (output!=NULL && (result = Self::GetFirstProcessObject(output))==NULL)
00487 output = Self::GetNextSibling(output);
00488
00489
return result;
00490 }
00491
00492
00493
vtkObject*
00494 vtkTraversal::GetLastConsumer (
vtkDataObject* aDataObject)
00495 {
00496
vtkObject* o = NULL;
00497
int n;
00498
00499
if (aDataObject != NULL && (n = aDataObject->
GetNumberOfConsumers()) > 0)
00500
while (n > 0 && (o = aDataObject->
GetConsumer(n-1)) == NULL) n--;
00501
00502
return o;
00503 }
00504
00505
vtkProcessObject*
00506 vtkTraversal::GetLastProcessObject (
vtkDataObject* aDataObject)
00507 {
00508
vtkProcessObject* o = NULL;
00509
int n;
00510
00511
if (aDataObject != NULL && (n = aDataObject->
GetNumberOfConsumers()) > 0)
00512
while ( n > 0 &&
00513 (o = vtkProcessObject::SafeDownCast(aDataObject->
GetConsumer(n-1)))
00514 == NULL ) n--;
00515
00516
return o;
00517 }
00518
00519
vtkDataObject*
00520 vtkTraversal::GetLastOutput (
vtkProcessObject* aProcessObject)
00521 {
00522
vtkDataObject* result = NULL;
00523
vtkSource* source;
00524
00525
if ((source = vtkSource::SafeDownCast(aProcessObject)) != NULL)
00526 {
00527
int n;
00528
00529
if (source != NULL && (n = source->
GetNumberOfOutputs()) > 0)
00530
while (n > 0 && (result = (source->
GetOutputs())[n-1]) == NULL) n--;
00531 }
00532
00533
return result;
00534 }
00535
00536
00537
vtkDataObject*
00538 vtkTraversal::GetLastChild (
vtkDataObject* aDataObject)
00539 {
00540
vtkDataObject* result = NULL;
00541
vtkProcessObject* processObject;
00542
00543
if ((processObject = Self::GetLastProcessObject(aDataObject)) != NULL)
00544
while ( processObject != NULL &&
00545 (result = Self::GetLastOutput(processObject)) == NULL )
00546 processObject = Self::GetPreviousSibling(processObject);
00547
00548
return result;
00549 }
00550
00551
vtkObject*
00552 vtkTraversal::GetLastConsumer (
vtkProcessObject* aProcessObject)
00553 {
00554
vtkObject* result = NULL;
00555
vtkDataObject* output;
00556
00557
if ((output = Self::GetLastOutput(aProcessObject)) != NULL)
00558
while (output != NULL && (result = Self::GetLastConsumer(output)) == NULL)
00559 output = Self::GetPreviousSibling(output);
00560
00561
return result;
00562 }
00563
00564
vtkProcessObject*
00565 vtkTraversal::GetLastChild (
vtkProcessObject* aProcessObject)
00566 {
00567
vtkProcessObject* result = NULL;
00568
vtkDataObject* output;
00569
00570
if ((output = Self::GetLastOutput(aProcessObject)) != NULL)
00571
while (output!=NULL && (result = Self::GetLastProcessObject(output))==NULL)
00572 output = Self::GetPreviousSibling(output);
00573
00574
return result;
00575 }
00576
00577
00578
vtkDataObject*
00579 vtkTraversal::GetNextSibling (
vtkDataObject* aDataObject)
00580 {
00581
vtkDataObject* result = NULL;
00582
vtkSource* up;
00583
int i;
00584
00585
if ((up = vtkSource::SafeDownCast(Self::GetInputSource(aDataObject))) != NULL)
00586
if ((i = Self::GetOutputIndex(up, aDataObject) + 1) > 0)
00587
while ( i < up->
GetNumberOfOutputs() &&
00588 (result = (up->
GetOutputs())[i]) == NULL )
00589 i++;
00590
00591
return result;
00592 }
00593
00594
vtkProcessObject*
00595 vtkTraversal::GetNextSibling (
vtkProcessObject* aProcessObject)
00596 {
00597
vtkProcessObject* result = NULL;
00598
vtkDataObject* up;
00599
int i;
00600
00601
if ((up = Self::GetFirstInput(aProcessObject)) != NULL)
00602
if ((i = Self::GetConsumerIndex(up, aProcessObject) + 1) > 0)
00603
while ( i < up->
GetNumberOfConsumers() &&
00604 (result=vtkProcessObject::SafeDownCast(up->
GetConsumer(i)))==NULL)
00605 i++;
00606
00607
return result;
00608 }
00609
00610
vtkDataObject*
00611 vtkTraversal::GetPreviousSibling (
vtkDataObject* aDataObject)
00612 {
00613
vtkDataObject* result = NULL;
00614
vtkSource* up;
00615
int i;
00616
00617
if ((up = vtkSource::SafeDownCast(Self::GetInputSource(aDataObject))) != NULL)
00618
if ((i = Self::GetOutputIndex(up, aDataObject) - 1) >= 0)
00619
while ( i >= 0 &&
00620 (result = (up->
GetOutputs())[i]) == NULL )
00621 i--;
00622
00623
return result;
00624 }
00625
00626
vtkProcessObject*
00627 vtkTraversal::GetPreviousSibling (
vtkProcessObject* aProcessObject)
00628 {
00629
vtkProcessObject* result = NULL;
00630
vtkDataObject* up;
00631
int i;
00632
00633
if ((up = Self::GetFirstInput(aProcessObject)) != NULL)
00634
if ((i = Self::GetConsumerIndex(up,aProcessObject) - 1) >= 0)
00635
while ( i >= 0 &&
00636 (result=vtkProcessObject::SafeDownCast(up->
GetConsumer(i)))==NULL)
00637 i--;
00638
00639
return result;
00640 }
00641
00642
00643
vtkDataObject*
00644 vtkTraversal::GetTop (
vtkDataObject* aDataObject)
00645 {
00646
vtkDataObject* child = aDataObject;
00647
vtkDataObject* parent;
00648
00649
while ((parent = Self::GetParent(child)) != NULL) child = parent;
00650
00651
return child;
00652 }
00653
00654
vtkProcessObject*
00655 vtkTraversal::GetTop (
vtkProcessObject* aProcessObject)
00656 {
00657
vtkProcessObject* child = aProcessObject;
00658
vtkProcessObject* parent;
00659
00660
while ((parent = Self::GetParent(child)) != NULL) child = parent;
00661
00662
return child;
00663 }
00664
00665
00666
inline void
00667 vtkTraversal::UpdateTop (
vtkProcessObject* aNode)
00668 {
00669 this->
Top = Self::GetTop(aNode);
00670 this->
Current = aNode;
00671 }
00672
00673
inline void
00674 vtkTraversal::UpdateTop (
void)
00675 {
00676 this->
Top = Self::GetTop(this->Top);
00677 }
00678
00679
inline vtkProcessObject*
00680 vtkTraversal::InitTraversal (
vtkProcessObject* aNode)
00681 {
00682
return (this->
Current = aNode);
00683 }
00684
00685
inline vtkProcessObject*
00686 vtkTraversal::InitTraversal (
void)
00687 {
00688
return (this->
Current = this->
Top);
00689 }
00690
00691
inline vtkProcessObject*
00692 vtkTraversal::TraverseUp (
void)
00693 {
00694
if (this->
Current != NULL) this->
Current = Self::GetParent(this->Current);
00695
00696
return this->
Current;
00697 }
00698
00699
inline vtkProcessObject*
00700 vtkTraversal::TraverseForward (
int& aDepth)
00701 {
00702
vtkProcessObject* ptr;
00703
00704
00705
if ((ptr = Self::GetFirstChild(this->Current)) != NULL)
00706 {
00707 this->
Current = ptr;
00708 aDepth++;
00709
00710
return this->
Current;
00711 }
00712
00713
vtkProcessObject* child;
00714
00715
00716
if ((ptr =
vtkTraversal::GetNextSibling(this->Current)) != NULL)
00717 {
00718 this->
Current = ptr;
00719
00720
return this->
Current;
00721 }
00722
00723
00724
while ((this->
Current != NULL) && (ptr == NULL))
00725 {
00726 this->
Current = Self::GetParent(this->Current);
00727 ptr =
vtkTraversal::GetNextSibling(this->Current);
00728 aDepth--;
00729 }
00730
if (this->
Current != NULL)
00731 {
00732 this->
Current = ptr;
00733 }
00734
00735
return this->
Current;
00736 }
00737
00738
inline vtkProcessObject*
00739 vtkTraversal::TraverseForward (
void)
00740 {
00741
int d;
00742
00743
return this->
TraverseForward(d);
00744 }
00745
00746
inline vtkProcessObject*
00747 vtkTraversal::TraverseBackward (
void)
00748 {
00749
vtkProcessObject* ptr;
00750
00751
00752
if ((ptr = Self::GetPreviousSibling(this->Current)) != NULL)
00753 {
00754
while ((ptr = Self::GetFirstChild(this->Current = ptr)) != NULL)
00755 {
00756
while ((ptr = Self::GetNextSibling(this->Current = ptr)) != NULL)
00757 {
00758
if ( Self::GetNextSibling(this->Current = ptr) == NULL &&
00759 (ptr = Self::GetFirstChild(this->Current)) != NULL )
00760 {
00761 this->
Current = ptr;
00762 }
00763 }
00764 }
00765 }
00766
else
00767 {
00768 this->
Current = Self::GetParent(this->Current);
00769 }
00770
00771
return this->
Current;
00772 }
00773
00774
inline vtkProcessObject*
00775 vtkTraversal::Find (
vtkProcessObject* aTarget)
00776 {
00777
if (aTarget != NULL)
00778 {
00779
for (
vtkProcessObject* node = this->
InitTraversal();
00780 node != NULL;
00781 node = this->
TraverseForward() )
00782
if (node == aTarget)
00783
return node;
00784 }
00785
00786
return NULL;
00787 }
00788
00789
inline vtkProcessObject*
00790 vtkTraversal::FindByType (
const char* aName)
00791 {
00792
if (aName != NULL && aName[0] !=
'\0')
00793 {
00794
for (
vtkProcessObject* node = this->
InitTraversal();
00795 node != NULL;
00796 node = this->
TraverseForward() )
00797
if (strcmp(node->
GetClassName(), aName) == 0)
00798
return node;
00799 }
00800
00801
return NULL;
00802 }
00803
00804
inline vtkProcessObject*
00805 vtkTraversal::FindBySupertype (
const char* aName)
00806 {
00807
if (aName != NULL && aName[0] !=
'\0')
00808 {
00809
for (
vtkProcessObject* node = this->
InitTraversal();
00810 node != NULL;
00811 node = this->
TraverseForward() )
00812
if (node->
IsA(aName) == 1)
00813
return node;
00814 }
00815
00816
return NULL;
00817 }
00818
00819
#if 0
00820
00821
inline int
00822 vtkTraversal::InsertBefore (
vtkProcessObject* aInsertion,
00823
vtkProcessObject* aReference)
00824 {
00825
if (aInsertion == NULL)
00826 {
00827 vtkGenericWarningMacro(<<
"NULL pointer to child to be inserted.");
00828
return VTK_ERROR;
00829 }
00830
00831
if (aReference == NULL)
00832 {
00833 vtkGenericWarningMacro(<<
"NULL pointer to insertion reference child.");
00834
return VTK_ERROR;
00835 }
00836
00837
vtkProcessObject* refParent;
00838
00839
if ((refParent = Self::GetParent(aReference)) == NULL)
00840 {
00841 vtkGenericWarningMacro(<<
"Insertion reference child is parentless.");
00842
return VTK_ERROR;
00843 }
00844
00845
00846
if (Self::IsSelfOrAncestor(refParent, aInsertion))
00847 {
00848 vtkGenericWarningMacro(<<
"Bad request to insert ancestor as child.");
00849
return VTK_ERROR;
00850 }
00851
00852
vtkProcessObject* oldParent;
00853
00854
00855
00856
00857
00858
00859
00860
00861
if ((oldParent = Self::GetParent(aInsertion)) != NULL)
00862 {
00863
vtkProcessObject* tmpNode;
00864
int origChildCount, newChildCount;
00865
00866 origChildCount = Self::GetNumberOfChildren(refParent);
00867
00868
00869 Self::RemoveChild(oldParent, aInsertion, tmpNode);
00870
00871 newChildCount = Self::GetNumberOfChildren(refParent);
00872
00873
00874
00875
00876
00877
00878
if ((refPos != 0) && (origChildCount != newChildCount))
00879 {
00880
00881
00882
00883
00884
00885
if (aReference == Self::ChildAt(refParent, refPos - 1))
00886 {
00887 refPos--;
00888 }
00889 }
00890 }
00891
00892
return this->InsertChildAt(aInsertion, refPos);
00893 }
00894
#endif
00895
00896
VTK_EXTENSIONS_HYBRID_NAMESPACE_END
00897
00898
#endif
00899
00900
00901
00902