0026462: Visualization - selection does not adapt to line width change
[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 static Standard_Integer FindIndex (const SelectMgr_SequenceOfSelector& theSelectorsSeq,
32                                    const Handle(SelectMgr_ViewerSelector)& theSelector)
33 {
34   Standard_Integer aFoundIdx = 0;
35
36   for (Standard_Integer anIdx = 1; anIdx <= theSelectorsSeq.Length() && aFoundIdx==0; anIdx++)
37   {
38     if (theSelector == theSelectorsSeq.Value (anIdx))
39       aFoundIdx = anIdx;
40   }
41
42   return aFoundIdx;
43 }
44
45 //==================================================
46 // Function: Create
47 // Purpose :
48 //==================================================
49 SelectMgr_SelectionManager::SelectMgr_SelectionManager() {}
50
51 //==================================================
52 // Function: Add
53 // Purpose :
54 //==================================================
55 void SelectMgr_SelectionManager::Add (const Handle(SelectMgr_ViewerSelector)& theSelector)
56 {
57   mySelectors.Add (theSelector);
58 }
59
60 //==================================================
61 // Function: Remove
62 // Purpose :
63 //==================================================
64 void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_ViewerSelector)& theSelector)
65 {
66   for (SelectMgr_DataMapIteratorOfDataMapOfObjectSelectors aSelIter (myLocal); aSelIter.More(); aSelIter.Next())
67   {
68     SelectMgr_SequenceOfSelector& theSelectors = myLocal.ChangeFind (aSelIter.Key());
69     Standard_Integer aRank = FindIndex (theSelectors, theSelector);
70     if (aRank != 0 && aRank <= theSelectors.Length())
71       theSelectors.Remove (aRank);
72   }
73
74   if (mySelectors.Contains (theSelector))
75     mySelectors.Remove (theSelector);
76 }
77
78 //==================================================
79 // Function: Contains
80 // Purpose :
81 //==================================================
82 Standard_Boolean SelectMgr_SelectionManager::Contains (const Handle(SelectMgr_ViewerSelector)& theSelector) const
83 {
84   return mySelectors.Contains (theSelector);
85 }
86
87 //==================================================
88 // Function: Contains
89 // Purpose :
90 //==================================================
91 Standard_Boolean SelectMgr_SelectionManager::Contains (const Handle(SelectMgr_SelectableObject)& theObject) const
92 {
93   if (myGlobal.Contains (theObject))
94     return Standard_True;
95
96   if (myLocal.IsBound (theObject))
97     return Standard_True;
98
99   return Standard_False;
100 }
101
102 //==================================================
103 // Function: Load
104 // Purpose :
105 //==================================================
106 void SelectMgr_SelectionManager::Load (const Handle(SelectMgr_SelectableObject)& theObject,
107                                        const Standard_Integer theMode)
108 {
109   if (myGlobal.Contains(theObject))
110     return;
111
112   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
113   {
114     Load (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode);
115   }
116
117   if (!theObject->HasOwnPresentations())
118     return;
119
120   myGlobal.Add(theObject);
121   for (TColStd_MapIteratorOfMapOfTransient aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
122   {
123     Handle(SelectMgr_ViewerSelector) aSelector =
124       Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorsIter.Key());
125     if (!aSelector->Contains (theObject) && theObject->HasOwnPresentations())
126     {
127       aSelector->AddSelectableObject (theObject);
128     }
129   }
130   if (theMode != -1)
131     loadMode (theObject, theMode);
132 }
133
134
135 //==================================================
136 // Function: Load
137 // Purpose :
138 //==================================================
139 void SelectMgr_SelectionManager::Load (const Handle(SelectMgr_SelectableObject)& theObject,
140                                        const Handle(SelectMgr_ViewerSelector)& theSelector,
141                                        const Standard_Integer theMode)
142 {
143   if (!mySelectors.Contains (theSelector))
144   {
145     mySelectors.Add (theSelector);
146   }
147
148   if (theMode != -1)
149     loadMode (theObject, theMode, theSelector);
150
151   if (theObject->HasOwnPresentations())
152     theSelector->AddSelectableObject (theObject);
153
154   if (myLocal.IsBound (theObject))
155   {
156     SelectMgr_SequenceOfSelector& aSelectors = myLocal.ChangeFind (theObject);
157     if (FindIndex (aSelectors, theSelector) == 0)
158     {
159         aSelectors.Append (theSelector);
160     }
161   }
162   else
163   {
164     if (!myGlobal.Contains (theObject))
165     {
166       if (theObject->HasOwnPresentations())
167       {
168         SelectMgr_SequenceOfSelector aSelectors;
169         aSelectors.Append (theSelector);
170         myLocal.Bind (theObject, aSelectors);
171       }
172       else
173       {
174         for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
175         {
176           Load (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theSelector, theMode);
177         }
178       }
179     }
180   }
181 }
182
183
184 //==================================================
185 // Function: Remove
186 // Purpose :
187 //==================================================
188 void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_SelectableObject)& theObject)
189 {
190   if (myGlobal.Contains (theObject))
191   {
192     for (TColStd_MapIteratorOfMapOfTransient aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
193     {
194       Handle(SelectMgr_ViewerSelector) aCurSelector =
195         Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorsIter.Key());
196
197       if (!aCurSelector->Contains (theObject))
198         continue;
199
200       for (theObject->Init(); theObject->More(); theObject->Next())
201       {
202         aCurSelector->RemoveSelectionOfObject (theObject, theObject->CurrentSelection());
203         theObject->CurrentSelection()->UpdateBVHStatus (SelectMgr_TBU_Remove);
204       }
205       aCurSelector->RemoveSelectableObject (theObject);
206     }
207
208     myGlobal.Remove (theObject);
209   }
210   else if (myLocal.IsBound (theObject))
211   {
212     SelectMgr_SequenceOfSelector& aSelectors = myLocal.ChangeFind (theObject);
213     for (Standard_Integer aSelectorsIdx = 1; aSelectorsIdx <= aSelectors.Length(); aSelectorsIdx++)
214     {
215       Handle(SelectMgr_ViewerSelector) aCurSelector =
216         Handle(SelectMgr_ViewerSelector)::DownCast (aSelectors (aSelectorsIdx));
217       if (!aCurSelector->Contains (theObject))
218         continue;
219
220       for (theObject->Init(); theObject->More(); theObject->Next())
221       {
222         aCurSelector->RemoveSelectionOfObject (theObject, theObject->CurrentSelection());
223         theObject->CurrentSelection()->UpdateBVHStatus (SelectMgr_TBU_Remove);
224       }
225       aCurSelector->RemoveSelectableObject (theObject);
226     }
227
228     myLocal.UnBind (theObject);
229   }
230   else if (!theObject->HasOwnPresentations())
231   {
232     for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
233     {
234       Remove (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()));
235     }
236   }
237
238   theObject->ClearSelections();
239 }
240
241 //==================================================
242 // Function: Remove
243 // Purpose :
244 //==================================================
245 void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_SelectableObject)& theObject,
246                                          const Handle(SelectMgr_ViewerSelector)& theSelector)
247 {
248   if (!theSelector->Contains (theObject))
249     return;
250
251   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
252   {
253     Remove (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theSelector);
254   }
255
256   if (!theObject->HasOwnPresentations())
257     return;
258
259   for (theObject->Init(); theObject->More(); theObject->Next())
260   {
261     theSelector->RemoveSelectionOfObject (theObject, theObject->CurrentSelection());
262     theObject->CurrentSelection()->UpdateBVHStatus (SelectMgr_TBU_Remove);
263   }
264
265   theSelector->RemoveSelectableObject (theObject);
266
267   if (myLocal.IsBound (theObject))
268   {
269     SelectMgr_SequenceOfSelector& aSelectors = myLocal.ChangeFind (theObject);
270     for (Standard_Integer aSelectorIdx = 1; aSelectorIdx <= aSelectors.Length(); aSelectorIdx++)
271     {
272       if (aSelectors (aSelectorIdx) == theSelector)
273       {
274         aSelectors.Remove (aSelectorIdx);
275         break;
276       }
277     }
278
279     if (aSelectors.IsEmpty())
280     {
281       myLocal.UnBind (theObject);
282     }
283   }
284 }
285
286 //==================================================
287 // Function: Activate
288 // Purpose :
289 //==================================================
290 void SelectMgr_SelectionManager::Activate (const Handle(SelectMgr_SelectableObject)& theObject,
291                                            const Standard_Integer theMode,
292                                            const Handle(SelectMgr_ViewerSelector)& theSelector)
293 {
294   if (theMode == -1)
295     return;
296
297   if (!theSelector.IsNull() && !mySelectors.Contains (theSelector))
298     return;
299
300   if (!theObject->HasOwnPresentations())
301   {
302     for (PrsMgr_ListOfPresentableObjectsIter anChildIter (theObject->Children()); anChildIter.More(); anChildIter.Next())
303     {
304       Activate (Handle(SelectMgr_SelectableObject)::DownCast (anChildIter.Value()), theMode, theSelector);
305     }
306
307     return;
308   }
309
310   Standard_Boolean isComputed = Standard_False;
311   if (theObject->HasSelection (theMode))
312   {
313     isComputed = theObject->Selection (theMode)->IsEmpty() ? 0 : 1;
314   }
315
316   if (!isComputed)
317     loadMode (theObject, theMode);
318
319   if (theSelector.IsNull())
320   {
321     if (myGlobal.Contains (theObject))
322     {
323       for (TColStd_MapIteratorOfMapOfTransient aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
324       {
325         Handle(SelectMgr_ViewerSelector) aCurSelector =
326           Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorsIter.Key());
327         Activate (theObject, theMode, aCurSelector);
328       }
329     }
330     else if (myLocal.IsBound (theObject))
331     {
332       SelectMgr_SequenceOfSelector& theSelectors = myLocal.ChangeFind (theObject);
333       for (Standard_Integer aSelectorIdx = 1; aSelectorIdx <= theSelectors.Length(); aSelectorIdx++)
334       {
335         Handle(SelectMgr_ViewerSelector) aCurSelector =
336           Handle(SelectMgr_ViewerSelector)::DownCast (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     Standard_Integer aSelMode = aSelection->Mode();
693
694     for (TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
695     {
696       Handle(SelectMgr_ViewerSelector) aCurSelector (Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorIter.Key()));
697       if (aCurSelector->Status (aSelection) == SelectMgr_SOS_Activated)
698       {
699           ClearSelectionStructures (theObject, aSelMode, aCurSelector);
700           theObject->RecomputePrimitives(aSelMode);
701           RestoreSelectionStructures (theObject, aSelMode, aCurSelector);
702       }
703     }
704     aSelection->UpdateStatus (SelectMgr_TOU_None);
705     aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
706   }
707 }
708
709 //=======================================================================
710 //function : Update
711 //purpose  : Selections are recalculated if they are flagged
712 //           "TO RECALCULATE" and activated in one of selectors.
713 //           If ForceUpdate = True, and they are "TO RECALCULATE"
714 //           This is done without caring for the state of activation.
715 //=======================================================================
716 void SelectMgr_SelectionManager::Update (const Handle(SelectMgr_SelectableObject)& theObject,
717                                          const Standard_Boolean theIsForce)
718 {
719   for (PrsMgr_ListOfPresentableObjectsIter aChildIter (theObject->Children()); aChildIter.More(); aChildIter.Next())
720   {
721     Update (Handle(SelectMgr_SelectableObject)::DownCast (aChildIter.Value()), theIsForce);
722   }
723
724   if (!theObject->HasOwnPresentations())
725     return;
726
727   for (theObject->Init(); theObject->More(); theObject->Next())
728   {
729     const Handle(SelectMgr_Selection)& aSelection = theObject->CurrentSelection();
730     if (theIsForce)
731     {
732       switch (aSelection->UpdateStatus())
733       {
734       case SelectMgr_TOU_Full:
735         ClearSelectionStructures (theObject, aSelection->Mode());
736         theObject->RecomputePrimitives (aSelection->Mode()); // no break on purpose...
737         RestoreSelectionStructures (theObject, aSelection->Mode());
738       case SelectMgr_TOU_Partial:
739         theObject->UpdateTransformations (aSelection);
740         rebuildSelectionStructures();
741         break;
742       default:
743         break;
744       }
745       aSelection->UpdateStatus (SelectMgr_TOU_None);
746       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
747     }
748
749     for (TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
750     {
751       Handle(SelectMgr_ViewerSelector) aSelector (Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorIter.Key()));
752       Update (theObject, aSelector, Standard_False);
753     }
754   }
755 }
756
757 //==================================================
758 // Function: Update
759 // Purpose : Attention, it is required to know what is done...
760 //==================================================
761 void SelectMgr_SelectionManager::Update (const Handle(SelectMgr_SelectableObject)& theObject,
762                                          const Handle(SelectMgr_ViewerSelector)& theSelector,
763                                          const Standard_Boolean theIsForce)
764 {
765   if (!mySelectors.Contains (theSelector))
766     return;
767
768   Standard_Boolean isKnown = myGlobal.Contains (theObject);
769   if (!isKnown)
770     isKnown = (myLocal.IsBound (theObject) && (FindIndex (myLocal.Find (theObject), theSelector) != 0));
771   if (!isKnown)
772     return;
773
774   for (PrsMgr_ListOfPresentableObjectsIter aChildIter (theObject->Children()); aChildIter.More(); aChildIter.Next())
775   {
776     Update (Handle(SelectMgr_SelectableObject)::DownCast (aChildIter.Value()), theSelector, theIsForce);
777   }
778
779   if (!theObject->HasOwnPresentations())
780     return;
781
782   for (theObject->Init(); theObject->More(); theObject->Next())
783   {
784     const Handle(SelectMgr_Selection)& aSelection = theObject->CurrentSelection();
785     if (theIsForce)
786     {
787       switch (aSelection->UpdateStatus())
788       {
789       case SelectMgr_TOU_Full:
790         ClearSelectionStructures (theObject, aSelection->Mode());
791         theObject->RecomputePrimitives (aSelection->Mode());
792         RestoreSelectionStructures (theObject, aSelection->Mode());
793       case SelectMgr_TOU_Partial:
794         theObject->UpdateTransformations (aSelection);
795         rebuildSelectionStructures();
796         break;
797       default:
798         break;
799       }
800       aSelection->UpdateStatus (SelectMgr_TOU_None);
801       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
802     }
803
804     if (theSelector->Status (aSelection) == SelectMgr_SOS_Activated)
805     {
806       switch (aSelection->UpdateStatus())
807       {
808       case SelectMgr_TOU_Full:
809         ClearSelectionStructures (theObject, aSelection->Mode(), theSelector);
810         theObject->RecomputePrimitives (aSelection->Mode());
811         RestoreSelectionStructures (theObject, aSelection->Mode(), theSelector);
812       case SelectMgr_TOU_Partial:
813         if (theObject->HasTransformation())
814         {
815           theObject->UpdateTransformations (aSelection);
816           theSelector->RebuildObjectsTree();
817         }
818         break;
819       default:
820         break;
821       }
822
823       aSelection->UpdateStatus(SelectMgr_TOU_None);
824       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
825     }
826   }
827 }
828
829 //==================================================
830 // Function: loadMode
831 // Purpose : Private Method
832 //==================================================
833 void SelectMgr_SelectionManager::loadMode (const Handle(SelectMgr_SelectableObject)& theObject,
834                                            const Standard_Integer theMode,
835                                            const Handle(SelectMgr_ViewerSelector)& theSelector)
836 {
837   if (theMode == -1)
838     return;
839
840   if (!theObject->HasSelection (theMode))
841   {
842     Handle(SelectMgr_Selection) aNewSel = new SelectMgr_Selection (theMode);
843     theObject->AddSelection (aNewSel, theMode);
844     if (theSelector.IsNull())
845     {
846       if (myGlobal.Contains (theObject))
847       {
848         TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors);
849         for ( ; aSelectorIter.More(); aSelectorIter.Next())
850         {
851           Handle(SelectMgr_ViewerSelector) aSelector =
852             Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorIter.Key());
853           aSelector->AddSelectionToObject (theObject, aNewSel);
854           aNewSel->UpdateBVHStatus (SelectMgr_TBU_None);
855         }
856       }
857       else if (myLocal.IsBound (theObject))
858       {
859         const SelectMgr_SequenceOfSelector& aSelectors = myLocal (theObject);
860         for (Standard_Integer aSelectorIdx = 1; aSelectorIdx <= aSelectors.Length(); ++aSelectorIdx)
861         {
862           aSelectors (aSelectorIdx)->AddSelectionToObject (theObject, aNewSel);
863           aNewSel->UpdateBVHStatus (SelectMgr_TBU_None);
864         }
865       }
866     }
867     else
868     {
869       theSelector->AddSelectionToObject (theObject, aNewSel);
870       aNewSel->UpdateBVHStatus (SelectMgr_TBU_None);
871     }
872   }
873   else if (theObject->Selection (theMode)->IsEmpty())
874   {
875     if (theObject->Selection (theMode)->BVHUpdateStatus() == SelectMgr_TBU_Remove)
876     {
877       Handle(SelectMgr_Selection) aNewSel = new SelectMgr_Selection (theMode);
878       theObject->AddSelection (aNewSel, theMode);
879       theObject->Selection (theMode)->UpdateBVHStatus (SelectMgr_TBU_Remove);
880       theObject->Selection (theMode)->SetSelectionState (SelectMgr_SOS_Deactivated);
881     }
882   }
883 }
884
885 //=======================================================================
886 //function : SetUpdateMode
887 //purpose  :
888 //=======================================================================
889 void SelectMgr_SelectionManager::SetUpdateMode (const Handle(SelectMgr_SelectableObject)& theObject,
890                                                 const SelectMgr_TypeOfUpdate theType)
891 {
892   for (theObject->Init(); theObject->More(); theObject->Next())
893     theObject->CurrentSelection()->UpdateStatus (theType);
894 }
895
896 //=======================================================================
897 //function : SetUpdateMode
898 //purpose  :
899 //=======================================================================
900 void SelectMgr_SelectionManager::SetUpdateMode (const Handle(SelectMgr_SelectableObject)& theObject,
901                                                 const Standard_Integer theMode,
902                                                 const SelectMgr_TypeOfUpdate theType)
903 {
904   if (theObject->HasSelection (theMode))
905     theObject->Selection (theMode)->UpdateStatus (theType);
906 }
907
908 //=======================================================================
909 //function : SetSelectionSensitivity
910 //purpose  : Allows to manage sensitivity of a particular selection of interactive object theObject and
911 //           changes previous sensitivity value of all sensitive entities in selection with theMode
912 //           to the given theNewSensitivity.
913 //=======================================================================
914 void SelectMgr_SelectionManager::SetSelectionSensitivity (const Handle(SelectMgr_SelectableObject)& theObject,
915                                                           const Standard_Integer theMode,
916                                                           const Standard_Integer theNewSens)
917 {
918   Standard_ASSERT_RAISE (theNewSens > 0,
919     "Error! Selection sensitivity have positive value.");
920
921   if (theObject.IsNull() || !theObject->HasSelection (theMode))
922     return;
923
924   Handle(SelectMgr_Selection) aSel = theObject->Selection (theMode);
925   const Standard_Integer aPrevSens = aSel->Sensitivity();
926   aSel->SetSensitivity (theNewSens);
927
928   if (!(myGlobal.Contains (theObject) || myLocal.IsBound (theObject)))
929     return;
930
931   if (myGlobal.Contains (theObject))
932   {
933     for (TColStd_MapIteratorOfMapOfTransient aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
934     {
935       Handle(SelectMgr_ViewerSelector) aSelector = Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorsIter.Key());
936       if (aSelector->Contains (theObject))
937       {
938         aSelector->myTolerances.Decrement (aPrevSens);
939         aSelector->myTolerances.Add (theNewSens);
940         aSelector->myToUpdateTolerance = Standard_True;
941       }
942     }
943   }
944   if (myLocal.IsBound (theObject))
945   {
946     const SelectMgr_SequenceOfSelector& aSelectors = myLocal (theObject);
947     for (SelectMgr_SequenceOfSelector::Iterator aLocalIter (aSelectors); aLocalIter.More(); aLocalIter.Next())
948     {
949       Handle(SelectMgr_ViewerSelector)& aCurSel = aLocalIter.ChangeValue();
950       aCurSel->myTolerances.Decrement (aPrevSens);
951       aCurSel->myTolerances.Add (theNewSens);
952       aCurSel->myToUpdateTolerance = Standard_True;
953     }
954   }
955 }