0024023: Revamp the OCCT Handle -- downcast (automatic)
[occt.git] / src / SelectMgr / SelectMgr_SelectionManager.cxx
1 // Created on: 1995-02-13
2 // Created by: Mister rmi
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <SelectMgr_SelectionManager.ixx>
18 #include <SelectMgr_ViewerSelector.hxx>
19 #include <SelectMgr_Selection.hxx>
20 #include <SelectMgr_SequenceOfSelector.hxx>
21 #include <TColStd_MapIteratorOfMapOfTransient.hxx>
22 #include <TColStd_MapIteratorOfMapOfTransient.hxx>
23 #include <TCollection_AsciiString.hxx>
24 #include <TColStd_ListOfInteger.hxx>
25 #include <TColStd_ListIteratorOfListOfInteger.hxx>
26 #include <SelectMgr_DataMapIteratorOfDataMapOfObjectSelectors.hxx>
27 #include <OSD_Environment.hxx>
28 #include <SelectMgr_SelectableObject.hxx>
29
30 static Standard_Integer FindIndex (const SelectMgr_SequenceOfSelector& theSelectorsSeq,
31                                    const Handle(SelectMgr_ViewerSelector)& theSelector)
32 {
33   Standard_Integer aFoundIdx = 0;
34
35   for (Standard_Integer anIdx = 1; anIdx <= theSelectorsSeq.Length() && aFoundIdx==0; anIdx++)
36   {
37     if (theSelector == theSelectorsSeq.Value (anIdx))
38       aFoundIdx = anIdx;
39   }
40
41   return aFoundIdx;
42 }
43
44 //==================================================
45 // Function: Create
46 // Purpose :
47 //==================================================
48 SelectMgr_SelectionManager::SelectMgr_SelectionManager() {}
49
50 //==================================================
51 // Function: Add
52 // Purpose :
53 //==================================================
54 void SelectMgr_SelectionManager::Add (const Handle(SelectMgr_ViewerSelector)& theSelector)
55 {
56   mySelectors.Add (theSelector);
57 }
58
59 //==================================================
60 // Function: Remove
61 // Purpose :
62 //==================================================
63 void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_ViewerSelector)& theSelector)
64 {
65   for (SelectMgr_DataMapIteratorOfDataMapOfObjectSelectors aSelIter (myLocal); aSelIter.More(); aSelIter.Next())
66   {
67     SelectMgr_SequenceOfSelector& theSelectors = myLocal.ChangeFind (aSelIter.Key());
68     Standard_Integer aRank = FindIndex (theSelectors, theSelector);
69     if (aRank != 0 && aRank <= theSelectors.Length())
70       theSelectors.Remove (aRank);
71   }
72
73   if (mySelectors.Contains (theSelector))
74     mySelectors.Remove (theSelector);
75 }
76
77 //==================================================
78 // Function: Contains
79 // Purpose :
80 //==================================================
81 Standard_Boolean SelectMgr_SelectionManager::Contains (const Handle(SelectMgr_ViewerSelector)& theSelector) const
82 {
83   return mySelectors.Contains (theSelector);
84 }
85
86 //==================================================
87 // Function: Contains
88 // Purpose :
89 //==================================================
90 Standard_Boolean SelectMgr_SelectionManager::Contains (const Handle(SelectMgr_SelectableObject)& theObject) const
91 {
92   if (myGlobal.Contains (theObject))
93     return Standard_True;
94
95   if (myLocal.IsBound (theObject))
96     return Standard_True;
97
98   return Standard_False;
99 }
100
101 //==================================================
102 // Function: Load
103 // Purpose :
104 //==================================================
105 void SelectMgr_SelectionManager::Load (const Handle(SelectMgr_SelectableObject)& theObject,
106                                        const Standard_Integer theMode)
107 {
108   if (myGlobal.Contains(theObject))
109     return;
110
111   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
112   {
113     Load (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode);
114   }
115
116   if (!theObject->HasOwnPresentations())
117     return;
118
119   myGlobal.Add(theObject);
120   for (TColStd_MapIteratorOfMapOfTransient aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
121   {
122     Handle(SelectMgr_ViewerSelector) aSelector =
123       Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorsIter.Key());
124     if (!aSelector->Contains (theObject) && theObject->HasOwnPresentations())
125     {
126       aSelector->AddSelectableObject (theObject);
127     }
128   }
129   if (theMode != -1)
130     loadMode (theObject, theMode);
131 }
132
133
134 //==================================================
135 // Function: Load
136 // Purpose :
137 //==================================================
138 void SelectMgr_SelectionManager::Load (const Handle(SelectMgr_SelectableObject)& theObject,
139                                        const Handle(SelectMgr_ViewerSelector)& theSelector,
140                                        const Standard_Integer theMode)
141 {
142   if (!mySelectors.Contains (theSelector))
143   {
144     mySelectors.Add (theSelector);
145   }
146
147   if (theMode != -1)
148     loadMode (theObject, theMode, theSelector);
149
150   if (theObject->HasOwnPresentations())
151     theSelector->AddSelectableObject (theObject);
152
153   if (myLocal.IsBound (theObject))
154   {
155     SelectMgr_SequenceOfSelector& aSelectors = myLocal.ChangeFind (theObject);
156     if (FindIndex (aSelectors, theSelector) == 0)
157     {
158         aSelectors.Append (theSelector);
159     }
160   }
161   else
162   {
163     if (!myGlobal.Contains (theObject))
164     {
165       if (theObject->HasOwnPresentations())
166       {
167         SelectMgr_SequenceOfSelector aSelectors;
168         aSelectors.Append (theSelector);
169         myLocal.Bind (theObject, aSelectors);
170       }
171       else
172       {
173         for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
174         {
175           Load (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theSelector, theMode);
176         }
177       }
178     }
179   }
180 }
181
182
183 //==================================================
184 // Function: Remove
185 // Purpose :
186 //==================================================
187 void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_SelectableObject)& theObject)
188 {
189   if (myGlobal.Contains (theObject))
190   {
191     for (TColStd_MapIteratorOfMapOfTransient aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
192     {
193       Handle(SelectMgr_ViewerSelector) aCurSelector =
194         Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorsIter.Key());
195
196       if (!aCurSelector->Contains (theObject))
197         continue;
198
199       for (theObject->Init(); theObject->More(); theObject->Next())
200       {
201         aCurSelector->RemoveSelectionOfObject (theObject, theObject->CurrentSelection());
202         theObject->CurrentSelection()->UpdateBVHStatus (SelectMgr_TBU_Remove);
203       }
204       aCurSelector->RemoveSelectableObject (theObject);
205     }
206
207     myGlobal.Remove (theObject);
208   }
209   else if (myLocal.IsBound (theObject))
210   {
211     SelectMgr_SequenceOfSelector& aSelectors = myLocal.ChangeFind (theObject);
212     for (Standard_Integer aSelectorsIdx = 1; aSelectorsIdx <= aSelectors.Length(); aSelectorsIdx++)
213     {
214       Handle(SelectMgr_ViewerSelector) aCurSelector =
215         Handle(SelectMgr_ViewerSelector)::DownCast (aSelectors (aSelectorsIdx));
216       if (!aCurSelector->Contains (theObject))
217         continue;
218
219       for (theObject->Init(); theObject->More(); theObject->Next())
220       {
221         aCurSelector->RemoveSelectionOfObject (theObject, theObject->CurrentSelection());
222         theObject->CurrentSelection()->UpdateBVHStatus (SelectMgr_TBU_Remove);
223       }
224       aCurSelector->RemoveSelectableObject (theObject);
225     }
226
227     myLocal.UnBind (theObject);
228   }
229   else if (!theObject->HasOwnPresentations())
230   {
231     for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
232     {
233       Remove (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()));
234     }
235   }
236
237   theObject->ClearSelections();
238 }
239
240 //==================================================
241 // Function: Remove
242 // Purpose :
243 //==================================================
244 void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_SelectableObject)& theObject,
245                                          const Handle(SelectMgr_ViewerSelector)& theSelector)
246 {
247   if (!theSelector->Contains (theObject))
248     return;
249
250   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
251   {
252     Remove (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theSelector);
253   }
254
255   if (!theObject->HasOwnPresentations())
256     return;
257
258   for (theObject->Init(); theObject->More(); theObject->Next())
259   {
260     theSelector->RemoveSelectionOfObject (theObject, theObject->CurrentSelection());
261     theObject->CurrentSelection()->UpdateBVHStatus (SelectMgr_TBU_Remove);
262   }
263
264   theSelector->RemoveSelectableObject (theObject);
265
266   if (myLocal.IsBound (theObject))
267   {
268     SelectMgr_SequenceOfSelector& aSelectors = myLocal.ChangeFind (theObject);
269     for (Standard_Integer aSelectorIdx = 1; aSelectorIdx <= aSelectors.Length(); aSelectorIdx++)
270     {
271       if (aSelectors (aSelectorIdx) == theSelector)
272       {
273         aSelectors.Remove (aSelectorIdx);
274         break;
275       }
276     }
277
278     if (aSelectors.IsEmpty())
279     {
280       myLocal.UnBind (theObject);
281     }
282   }
283 }
284
285 //==================================================
286 // Function: Activate
287 // Purpose :
288 //==================================================
289 void SelectMgr_SelectionManager::Activate (const Handle(SelectMgr_SelectableObject)& theObject,
290                                            const Standard_Integer theMode,
291                                            const Handle(SelectMgr_ViewerSelector)& theSelector)
292 {
293   if (theMode == -1)
294     return;
295
296   if (!theSelector.IsNull() && !mySelectors.Contains (theSelector))
297     return;
298
299   if (!theObject->HasOwnPresentations())
300   {
301     for (PrsMgr_ListOfPresentableObjectsIter anChildIter (theObject->Children()); anChildIter.More(); anChildIter.Next())
302     {
303       Activate (Handle(SelectMgr_SelectableObject)::DownCast (anChildIter.Value()), theMode, theSelector);
304     }
305
306     return;
307   }
308
309   Standard_Boolean isComputed = Standard_False;
310   if (theObject->HasSelection (theMode))
311   {
312     isComputed = theObject->Selection (theMode)->IsEmpty() ? 0 : 1;
313   }
314
315   if (!isComputed)
316     loadMode (theObject, theMode);
317
318   if (theSelector.IsNull())
319   {
320     if (myGlobal.Contains (theObject))
321     {
322       for (TColStd_MapIteratorOfMapOfTransient aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
323       {
324         Handle(SelectMgr_ViewerSelector) aCurSelector =
325           Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorsIter.Key());
326         Activate (theObject, theMode, aCurSelector);
327       }
328     }
329     else if (myLocal.IsBound (theObject))
330     {
331       SelectMgr_SequenceOfSelector& theSelectors = myLocal.ChangeFind (theObject);
332       for (Standard_Integer aSelectorIdx = 1; aSelectorIdx <= theSelectors.Length(); aSelectorIdx++)
333       {
334         Handle(SelectMgr_ViewerSelector) aCurSelector =
335           Handle(SelectMgr_ViewerSelector)::DownCast (theSelectors (aSelectorIdx));
336         Activate (theObject, theMode, aCurSelector);
337       }
338     }
339   }
340
341   const Handle(SelectMgr_Selection)& aSelection = theObject->Selection (theMode);
342
343   switch (aSelection->UpdateStatus())
344   {
345   case SelectMgr_TOU_Full:
346     if (theObject->HasSelection (theMode))
347       theSelector->RemoveSelectionOfObject (theObject, aSelection);
348     theObject->RecomputePrimitives (theMode);
349   case SelectMgr_TOU_Partial:
350     if(theObject->HasTransformation())
351       theObject->UpdateTransformations (aSelection);
352     theSelector->RebuildObjectsTree();
353     break;
354   default:
355     break;
356   }
357   aSelection->UpdateStatus(SelectMgr_TOU_None);
358
359   switch (aSelection->BVHUpdateStatus())
360   {
361   case SelectMgr_TBU_Add:
362   case SelectMgr_TBU_Renew:
363     theSelector->AddSelectionToObject (theObject, aSelection);
364     break;
365   case SelectMgr_TBU_Remove:
366     if (aSelection->GetSelectionState() == SelectMgr_SOS_Deactivated)
367       theSelector->AddSelectionToObject (theObject, aSelection);
368     break;
369   default:
370     break;
371   }
372   aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
373
374   if (myGlobal.Contains (theObject))
375   {
376     if (theMode != 0 && theSelector->IsActive (theObject, 0))
377     {
378       theSelector->Deactivate (theObject->Selection (0));
379     }
380     theSelector->Activate (theObject->Selection (theMode));
381   }
382   else
383   {
384     if (myLocal.IsBound (theObject))
385     {
386       if (FindIndex (myLocal.Find (theObject), theSelector) == 0)
387         (myLocal.ChangeFind (theObject)).Append (theSelector);
388       theSelector->Activate (theObject->Selection (theMode));
389     }
390   }
391 }
392
393 //==================================================
394 // Function: Deactivate
395 // Purpose :
396 //==================================================
397 void SelectMgr_SelectionManager::Deactivate (const Handle(SelectMgr_SelectableObject)& theObject,
398                                              const Standard_Integer theMode,
399                                              const Handle(SelectMgr_ViewerSelector)& theSelector)
400 {
401
402   if (!theObject->HasOwnPresentations())
403   {
404     for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
405     {
406       Deactivate (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector);
407     }
408
409     return;
410   }
411
412   Standard_Boolean isInGlobal = myGlobal.Contains (theObject);
413   Standard_Boolean hasSelection = theMode == -1 ? Standard_True : theObject->HasSelection (theMode);
414
415   if (theSelector.IsNull())
416   {
417     Handle(SelectMgr_ViewerSelector) aSelector;
418     for (TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
419     {
420       aSelector = Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorIter.Key());
421       if (isInGlobal || myLocal.IsBound (theObject))
422       {
423         if (theMode == -1)
424         {
425           for (theObject->Init(); theObject->More(); theObject->Next())
426           {
427             aSelector->Deactivate (theObject->CurrentSelection());
428           }
429         }
430         else
431         {
432           if (hasSelection)
433             aSelector->Deactivate (theObject->Selection (theMode));
434         }
435       }
436     }
437   }
438   else
439   {
440     if (theMode == -1)
441     {
442       for (theObject->Init(); theObject->More(); theObject->Next())
443       {
444         theSelector->Deactivate (theObject->CurrentSelection());
445       }
446     }
447     else
448       if (hasSelection)
449         theSelector->Deactivate (theObject->Selection (theMode));
450   }
451 }
452
453 //=======================================================================
454 //function : IsActivated
455 //purpose  :
456 //=======================================================================
457 Standard_Boolean SelectMgr_SelectionManager::IsActivated (const Handle(SelectMgr_SelectableObject)& theObject,
458                                                           const Standard_Integer theMode,
459                                                           const Handle(SelectMgr_ViewerSelector)& theSelector) const
460 {
461   if (!theObject->HasOwnPresentations())
462   {
463     for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
464     {
465       if (IsActivated (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector))
466         return Standard_True;
467     }
468
469     return Standard_False;
470   }
471
472   if (!(myGlobal.Contains (theObject) || myLocal.IsBound (theObject)))
473     return Standard_False;
474
475   if (theMode == -1 && theSelector.IsNull())
476   {
477     for (theObject->Init(); theObject->More(); theObject->Next())
478     {
479       if (IsActivated (theObject, theObject->CurrentSelection()->Mode()))
480         return Standard_True;
481     }
482
483     return Standard_False;
484   }
485
486   if (!theObject->HasSelection (theMode))
487     return Standard_False;
488
489   const Handle(SelectMgr_Selection)& aSelection = theObject->Selection (theMode);
490   if (theSelector.IsNull())
491   {
492     for (TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
493     {
494       Handle(SelectMgr_ViewerSelector) aSelector (Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorIter.Key()));
495       if (aSelector->Status (aSelection) == SelectMgr_SOS_Activated)
496         return Standard_True;
497     }
498   }
499   else
500   {
501     return theSelector->Status (aSelection) == SelectMgr_SOS_Activated;
502   }
503
504   return Standard_False;
505 }
506
507 //=======================================================================
508 //function : ClearSelectionStructures
509 //purpose  : Removes sensitive entities from all viewer selectors
510 //           after method Clear() was called to the selection they belonged to
511 //           or it was recomputed somehow
512 //=======================================================================
513 void SelectMgr_SelectionManager::ClearSelectionStructures (const Handle(SelectMgr_SelectableObject)& theObj,
514                                                            const Standard_Integer theMode,
515                                                            const Handle(SelectMgr_ViewerSelector)& theSelector)
516 {
517   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObj->Children()); anChildrenIter.More(); anChildrenIter.Next())
518   {
519     ClearSelectionStructures (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector);
520   }
521
522   if (!theObj->HasOwnPresentations())
523     return;
524
525   if (theSelector.IsNull())
526   {
527     if (!(myGlobal.Contains (theObj) || myLocal.IsBound(theObj)))
528       return;
529
530     TColStd_MapIteratorOfMapOfTransient aSelectorsIter (mySelectors);
531     Handle(SelectMgr_ViewerSelector) aSelector;
532     for( ; aSelectorsIter.More(); aSelectorsIter.Next())
533     {
534       aSelector = Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorsIter.Key());
535       ClearSelectionStructures (theObj, theMode, aSelector);
536     }
537   }
538   else
539   {
540     if (!(myGlobal.Contains (theObj) || myLocal.IsBound (theObj)))
541       return;
542
543     if (theMode != -1)
544     {
545       if (theObj->HasSelection (theMode))
546       {
547         const Handle(SelectMgr_Selection)& aSelection = theObj->Selection (theMode);
548         if (theObj->HasSelection (theMode))
549         {
550           theSelector->RemoveSelectionOfObject (theObj, aSelection);
551           aSelection->UpdateBVHStatus (SelectMgr_TBU_Add);
552         }
553       }
554     }
555     else
556     {
557       for (theObj->Init(); theObj->More(); theObj->Next())
558       {
559         const Handle(SelectMgr_Selection)& aSelection = theObj->CurrentSelection();
560         theSelector->RemoveSelectionOfObject (theObj, aSelection);
561         aSelection->UpdateBVHStatus (SelectMgr_TBU_Add);
562       }
563     }
564     theSelector->RebuildObjectsTree();
565   }
566 }
567
568 //=======================================================================
569 //function : RestoreSelectionStructuress
570 //purpose  : Re-adds newely calculated sensitive  entities of recomputed selection
571 //           defined by mode theMode to all viewer selectors contained that selection.
572 //=======================================================================
573 void SelectMgr_SelectionManager::RestoreSelectionStructures (const Handle(SelectMgr_SelectableObject)& theObj,
574                                                              const Standard_Integer theMode,
575                                                              const Handle(SelectMgr_ViewerSelector)& theSelector)
576 {
577   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObj->Children()); anChildrenIter.More(); anChildrenIter.Next())
578   {
579     RestoreSelectionStructures (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector);
580   }
581
582   if (!theObj->HasOwnPresentations())
583     return;
584
585   if (theSelector.IsNull())
586   {
587     if (!(myGlobal.Contains (theObj) || myLocal.IsBound(theObj)))
588       return;
589
590     TColStd_MapIteratorOfMapOfTransient aSelectorsIter (mySelectors);
591     Handle(SelectMgr_ViewerSelector) aSelector;
592     for( ; aSelectorsIter.More(); aSelectorsIter.Next())
593     {
594       aSelector = Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorsIter.Key());
595       RestoreSelectionStructures (theObj, theMode, aSelector);
596     }
597   }
598   else
599   {
600     if (!(myGlobal.Contains (theObj) || myLocal.IsBound (theObj)))
601       return;
602
603     if (theMode != -1)
604     {
605       if (theObj->HasSelection (theMode))
606       {
607         const Handle(SelectMgr_Selection)& aSelection = theObj->Selection (theMode);
608         if (theObj->HasSelection (theMode))
609         {
610           theSelector->AddSelectionToObject (theObj, aSelection);
611           aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
612         }
613       }
614     }
615     else
616     {
617       for (theObj->Init(); theObj->More(); theObj->Next())
618       {
619         const Handle(SelectMgr_Selection)& aSelection = theObj->CurrentSelection();
620         theSelector->AddSelectionToObject (theObj, aSelection);
621         aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
622       }
623     }
624     theSelector->RebuildObjectsTree();
625   }
626 }
627
628 //=======================================================================
629 //function : rebuildSelectionStructures
630 //purpose  : Internal function that marks 1st level BVH of object theObj
631 //           as outdated
632 //=======================================================================
633 void SelectMgr_SelectionManager::rebuildSelectionStructures (const Handle(SelectMgr_ViewerSelector)& theSelector)
634 {
635   if (theSelector.IsNull())
636   {
637     Handle(SelectMgr_ViewerSelector) aSelector;
638     for(TColStd_MapIteratorOfMapOfTransient aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
639     {
640       aSelector = Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorsIter.Key());
641       rebuildSelectionStructures (aSelector);
642     }
643   }
644   else
645   {
646     theSelector->RebuildObjectsTree();
647   }
648 }
649
650 //==================================================
651 // Function: Update
652 // Purpose :
653 //==================================================
654 void SelectMgr_SelectionManager::RecomputeSelection (const Handle(SelectMgr_SelectableObject)& theObject,
655                                                      const Standard_Boolean theIsForce,
656                                                      const Standard_Integer theMode)
657 {
658   if (theIsForce)
659   {
660     if (theMode == -1)
661     {
662       ClearSelectionStructures (theObject);
663       theObject->RecomputePrimitives();
664       theObject->UpdateTransformation();
665       RestoreSelectionStructures (theObject);
666     }
667     else if (theObject->HasSelection (theMode))
668     {
669       ClearSelectionStructures (theObject, theMode);
670       theObject->RecomputePrimitives (theMode);
671       theObject->UpdateTransformation();
672       RestoreSelectionStructures (theObject, theMode);
673     }
674     return;
675   }
676
677   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
678   {
679     RecomputeSelection (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theIsForce, theMode);
680   }
681
682   if (!theObject->HasOwnPresentations())
683     return;
684
685   if (!(myGlobal.Contains (theObject) || myLocal.IsBound (theObject)))
686     return;
687
688   for(theObject->Init(); theObject->More(); theObject->Next())
689   {
690     const Handle(SelectMgr_Selection)& aSelection = theObject->CurrentSelection();
691     Standard_Integer aSelMode = aSelection->Mode();
692
693     for (TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
694     {
695       Handle(SelectMgr_ViewerSelector) aCurSelector (Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorIter.Key()));
696       if (aCurSelector->Status (aSelection) == SelectMgr_SOS_Activated)
697       {
698           ClearSelectionStructures (theObject, aSelMode, aCurSelector);
699           theObject->RecomputePrimitives(aSelMode);
700           RestoreSelectionStructures (theObject, aSelMode, aCurSelector);
701       }
702     }
703     aSelection->UpdateStatus (SelectMgr_TOU_None);
704     aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
705   }
706 }
707
708 //=======================================================================
709 //function : Update
710 //purpose  : Selections are recalculated if they are flagged
711 //           "TO RECALCULATE" and activated in one of selectors.
712 //           If ForceUpdate = True, and they are "TO RECALCULATE"
713 //           This is done without caring for the state of activation.
714 //=======================================================================
715 void SelectMgr_SelectionManager::Update (const Handle(SelectMgr_SelectableObject)& theObject,
716                                          const Standard_Boolean theIsForce)
717 {
718   for (PrsMgr_ListOfPresentableObjectsIter aChildIter (theObject->Children()); aChildIter.More(); aChildIter.Next())
719   {
720     Update (Handle(SelectMgr_SelectableObject)::DownCast (aChildIter.Value()), theIsForce);
721   }
722
723   if (!theObject->HasOwnPresentations())
724     return;
725
726   for (theObject->Init(); theObject->More(); theObject->Next())
727   {
728     const Handle(SelectMgr_Selection)& aSelection = theObject->CurrentSelection();
729     if (theIsForce)
730     {
731       switch (aSelection->UpdateStatus())
732       {
733       case SelectMgr_TOU_Full:
734         ClearSelectionStructures (theObject, aSelection->Mode());
735         theObject->RecomputePrimitives (aSelection->Mode()); // no break on purpose...
736         RestoreSelectionStructures (theObject, aSelection->Mode());
737       case SelectMgr_TOU_Partial:
738         theObject->UpdateTransformations (aSelection);
739         rebuildSelectionStructures();
740         break;
741       default:
742         break;
743       }
744       aSelection->UpdateStatus (SelectMgr_TOU_None);
745       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
746     }
747
748     for (TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
749     {
750       Handle(SelectMgr_ViewerSelector) aSelector (Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorIter.Key()));
751       Update (theObject, aSelector, Standard_False);
752     }
753   }
754 }
755
756 //==================================================
757 // Function: Update
758 // Purpose : Attention, it is required to know what is done...
759 //==================================================
760 void SelectMgr_SelectionManager::Update (const Handle(SelectMgr_SelectableObject)& theObject,
761                                          const Handle(SelectMgr_ViewerSelector)& theSelector,
762                                          const Standard_Boolean theIsForce)
763 {
764   if (!mySelectors.Contains (theSelector))
765     return;
766
767   Standard_Boolean isKnown = myGlobal.Contains (theObject);
768   if (!isKnown)
769     isKnown = (myLocal.IsBound (theObject) && (FindIndex (myLocal.Find (theObject), theSelector) != 0));
770   if (!isKnown)
771     return;
772
773   for (PrsMgr_ListOfPresentableObjectsIter aChildIter (theObject->Children()); aChildIter.More(); aChildIter.Next())
774   {
775     Update (Handle(SelectMgr_SelectableObject)::DownCast (aChildIter.Value()), theSelector, theIsForce);
776   }
777
778   if (!theObject->HasOwnPresentations())
779     return;
780
781   for (theObject->Init(); theObject->More(); theObject->Next())
782   {
783     const Handle(SelectMgr_Selection)& aSelection = theObject->CurrentSelection();
784     if (theIsForce)
785     {
786       switch (aSelection->UpdateStatus())
787       {
788       case SelectMgr_TOU_Full:
789         ClearSelectionStructures (theObject, aSelection->Mode());
790         theObject->RecomputePrimitives (aSelection->Mode());
791         RestoreSelectionStructures (theObject, aSelection->Mode());
792       case SelectMgr_TOU_Partial:
793         theObject->UpdateTransformations (aSelection);
794         rebuildSelectionStructures();
795         break;
796       default:
797         break;
798       }
799       aSelection->UpdateStatus (SelectMgr_TOU_None);
800       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
801     }
802
803     if (theSelector->Status (aSelection) == SelectMgr_SOS_Activated)
804     {
805       switch (aSelection->UpdateStatus())
806       {
807       case SelectMgr_TOU_Full:
808         ClearSelectionStructures (theObject, aSelection->Mode(), theSelector);
809         theObject->RecomputePrimitives (aSelection->Mode());
810         RestoreSelectionStructures (theObject, aSelection->Mode(), theSelector);
811       case SelectMgr_TOU_Partial:
812         if (theObject->HasTransformation())
813         {
814           theObject->UpdateTransformations (aSelection);
815           theSelector->RebuildObjectsTree();
816         }
817         break;
818       default:
819         break;
820       }
821
822       aSelection->UpdateStatus(SelectMgr_TOU_None);
823       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
824     }
825   }
826 }
827
828 //==================================================
829 // Function: loadMode
830 // Purpose : Private Method
831 //==================================================
832 void SelectMgr_SelectionManager::loadMode (const Handle(SelectMgr_SelectableObject)& theObject,
833                                            const Standard_Integer theMode,
834                                            const Handle(SelectMgr_ViewerSelector)& theSelector)
835 {
836   if (theMode == -1)
837     return;
838
839   if (!theObject->HasSelection (theMode))
840   {
841     Handle(SelectMgr_Selection) aNewSel = new SelectMgr_Selection (theMode);
842     theObject->AddSelection (aNewSel, theMode);
843     if (theSelector.IsNull())
844     {
845       if (myGlobal.Contains (theObject))
846       {
847         TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors);
848         for ( ; aSelectorIter.More(); aSelectorIter.Next())
849         {
850           Handle(SelectMgr_ViewerSelector) aSelector =
851             Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorIter.Key());
852           aSelector->AddSelectionToObject (theObject, aNewSel);
853           aNewSel->UpdateBVHStatus (SelectMgr_TBU_None);
854         }
855       }
856       else if (myLocal.IsBound (theObject))
857       {
858         const SelectMgr_SequenceOfSelector& aSelectors = myLocal (theObject);
859         for (Standard_Integer aSelectorIdx = 1; aSelectorIdx <= aSelectors.Length(); ++aSelectorIdx)
860         {
861           aSelectors (aSelectorIdx)->AddSelectionToObject (theObject, aNewSel);
862           aNewSel->UpdateBVHStatus (SelectMgr_TBU_None);
863         }
864       }
865     }
866     else
867     {
868       theSelector->AddSelectionToObject (theObject, aNewSel);
869       aNewSel->UpdateBVHStatus (SelectMgr_TBU_None);
870     }
871   }
872   else if (theObject->Selection (theMode)->IsEmpty())
873   {
874     if (theObject->Selection (theMode)->BVHUpdateStatus() == SelectMgr_TBU_Remove)
875     {
876       Handle(SelectMgr_Selection) aNewSel = new SelectMgr_Selection (theMode);
877       theObject->AddSelection (aNewSel, theMode);
878       theObject->Selection (theMode)->UpdateBVHStatus (SelectMgr_TBU_Remove);
879       theObject->Selection (theMode)->SetSelectionState (SelectMgr_SOS_Deactivated);
880     }
881   }
882 }
883
884 //=======================================================================
885 //function : SetUpdateMode
886 //purpose  :
887 //=======================================================================
888 void SelectMgr_SelectionManager::SetUpdateMode (const Handle(SelectMgr_SelectableObject)& theObject,
889                                                 const SelectMgr_TypeOfUpdate theType)
890 {
891   for (theObject->Init(); theObject->More(); theObject->Next())
892     theObject->CurrentSelection()->UpdateStatus (theType);
893 }
894
895 //=======================================================================
896 //function : SetUpdateMode
897 //purpose  :
898 //=======================================================================
899 void SelectMgr_SelectionManager::SetUpdateMode (const Handle(SelectMgr_SelectableObject)& theObject,
900                                                 const Standard_Integer theMode,
901                                                 const SelectMgr_TypeOfUpdate theType)
902 {
903   if (theObject->HasSelection (theMode))
904     theObject->Selection (theMode)->UpdateStatus (theType);
905 }
906