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