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