96465d811b104e522430551cfa175231db9d9e03
[occt.git] / src / SelectMgr / SelectMgr_SelectionManager.cxx
1 // Created on: 1995-02-13
2 // Created by: Mister rmi
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <SelectMgr_SelectionManager.ixx>
18 #include <SelectMgr_ViewerSelector.hxx>
19 #include <SelectMgr_Selection.hxx>
20 #include <SelectMgr_SequenceOfSelector.hxx>
21 #include <TColStd_MapIteratorOfMapOfTransient.hxx>
22 #include <TColStd_MapIteratorOfMapOfTransient.hxx>
23 #include <TCollection_AsciiString.hxx>
24 #include <TColStd_ListOfInteger.hxx>
25 #include <TColStd_ListIteratorOfListOfInteger.hxx>
26 #include <SelectMgr_DataMapIteratorOfDataMapOfObjectSelectors.hxx>
27 #include <OSD_Environment.hxx>
28
29
30 static Standard_Boolean SelectDebugModeOnSM()
31 {
32   static Standard_Integer isDebugMode( -1 );
33   if ( isDebugMode < 0 ) {
34     isDebugMode = 1;
35     OSD_Environment selectdb("SELECTIONDEBUG");
36     if ( selectdb.Value().IsEmpty() )
37       isDebugMode = 0;
38   }                       
39   return ( isDebugMode != 0 );
40 }
41
42 static Standard_Integer SMSearch(const SelectMgr_SequenceOfSelector& seq,
43                                  const Handle(SelectMgr_ViewerSelector)& theSel)
44 {
45   Standard_Integer ifound=0;
46   for (Standard_Integer i=1;i<=seq.Length()&& ifound==0;i++)
47   {if(theSel==seq.Value(i)) ifound=i;}
48   return ifound;
49
50
51
52 //==================================================
53 // Function: Create
54 // Purpose :
55 //==================================================
56
57 SelectMgr_SelectionManager::SelectMgr_SelectionManager()
58 {}
59
60
61 //==================================================
62 // Function: Add
63 // Purpose :
64 //==================================================
65 void SelectMgr_SelectionManager::
66 Add (const Handle(SelectMgr_ViewerSelector)& aViewSel)
67 {
68   myselectors.Add(aViewSel);
69 }
70
71
72
73 //==================================================
74 // Function: Remove
75 // Purpose :
76 //==================================================
77 void SelectMgr_SelectionManager::
78 Remove (const Handle(SelectMgr_ViewerSelector)& aViewSel)
79 {
80   SelectMgr_DataMapIteratorOfDataMapOfObjectSelectors It(mylocal);
81   for(;It.More();It.Next())
82   {
83     SelectMgr_SequenceOfSelector& theviews =mylocal.ChangeFind(It.Key());
84     Standard_Integer rank = SMSearch(theviews,aViewSel);
85     if(rank!=0 && rank<=theviews.Length()) theviews.Remove(rank);
86   }
87   if(myselectors.Contains(aViewSel)) myselectors.Remove(aViewSel);
88 }
89
90 //==================================================
91 // Function: Contains
92 // Purpose :
93 //==================================================
94 Standard_Boolean SelectMgr_SelectionManager::
95 Contains (const Handle(SelectMgr_ViewerSelector)& aViewSel) const
96 {return myselectors.Contains(aViewSel);}
97
98 //==================================================
99 // Function: Contains
100 // Purpose :
101 //==================================================
102 Standard_Boolean SelectMgr_SelectionManager::
103 Contains (const Handle(SelectMgr_SelectableObject)& aSelObj) const
104 {if (myglobal.Contains(aSelObj)) return Standard_True;
105 if (mylocal.IsBound(aSelObj)) return Standard_True;
106 return Standard_False;
107 }
108
109
110
111 //==================================================
112 // Function: Load
113 // Purpose :
114 //==================================================
115
116 void SelectMgr_SelectionManager::
117 Load (const Handle(SelectMgr_SelectableObject)& anObject,
118       const Standard_Integer amode)
119 {
120   if(!myglobal.Contains(anObject))
121     myglobal.Add(anObject);
122   if(amode!=-1) 
123     LoadMode (anObject,amode);
124 }
125
126
127 //==================================================
128 // Function: Load
129 // Purpose :
130 //==================================================
131 void SelectMgr_SelectionManager::
132 Load (const Handle(SelectMgr_SelectableObject)& anObject,
133       const Handle(SelectMgr_ViewerSelector)& aview,      
134       const Standard_Integer amode)
135 {
136   if(!myselectors.Contains(aview)) myselectors.Add(aview);
137   if(amode!=-1)
138     LoadMode (anObject,amode);
139
140
141   if (mylocal.IsBound(anObject)){
142     SelectMgr_SequenceOfSelector& theviews = mylocal.ChangeFind(anObject);
143     if (SMSearch(theviews,aview)==0) theviews.Append(aview);
144   }
145   else {
146     if(!myglobal.Contains(anObject)){
147       SelectMgr_SequenceOfSelector newviews;
148       newviews.Append(aview);
149       mylocal.Bind(anObject,newviews);
150     }
151   }
152 }
153
154
155 //==================================================
156 // Function: Remove
157 // Purpose :
158 //==================================================
159
160 void SelectMgr_SelectionManager::
161 Remove(const Handle(SelectMgr_SelectableObject)& anObject)
162 {
163
164   if(myglobal.Contains(anObject)) {
165     TColStd_MapIteratorOfMapOfTransient It(myselectors);
166     for(;It.More();It.Next())
167     {
168       Handle(SelectMgr_ViewerSelector) curview = 
169         Handle(SelectMgr_ViewerSelector)::DownCast(It.Key());
170       if(curview->Contains(anObject)){
171         for(anObject->Init();anObject->More();anObject->Next())
172         {
173           curview->Remove(anObject->CurrentSelection());
174         }
175
176       }
177     }
178     myglobal.Remove(anObject);
179   }
180
181   else if(mylocal.IsBound(anObject)) {
182     SelectMgr_SequenceOfSelector& seq = mylocal.ChangeFind (anObject);
183     for (Standard_Integer i=1;i<=seq.Length();i++) {
184       Handle(SelectMgr_ViewerSelector) curview =
185         Handle(SelectMgr_ViewerSelector)::DownCast(seq(i));
186       if(curview->Contains(anObject)){
187         for(anObject->Init();anObject->More();anObject->Next())
188         {
189           curview->Remove(anObject->CurrentSelection());
190         }
191       }
192
193     }
194     mylocal.UnBind(anObject);
195   }
196 }
197
198 //==================================================
199 // Function: Remove
200 // Purpose :
201 //==================================================
202
203 void SelectMgr_SelectionManager::
204 Remove(const Handle(SelectMgr_SelectableObject)& anObject,
205        const Handle(SelectMgr_ViewerSelector)& aVS)
206 {
207   if(aVS->Contains(anObject)) {
208     for(anObject->Init();anObject->More();anObject->Next()){
209       aVS->Remove(anObject->CurrentSelection());
210     }
211
212
213     if(mylocal.IsBound(anObject)) {
214       SelectMgr_SequenceOfSelector& seq = mylocal.ChangeFind (anObject);
215       Standard_Boolean NotFound (Standard_True);
216       for (Standard_Integer i=1;i<=seq.Length()&&NotFound;i++) {
217         if(seq(i)== aVS){
218           seq.Remove(i);
219           NotFound =Standard_False;
220         }
221       }
222       if(seq.IsEmpty())
223         mylocal.UnBind(anObject);
224     }
225   }
226 }
227
228 //==================================================
229 // Function: Activate
230 // Purpose :
231 //==================================================
232
233 void SelectMgr_SelectionManager::
234 Activate(const Handle(SelectMgr_SelectableObject)& anObject,
235          const Standard_Integer aMode,
236          const Standard_Boolean AutomaticProj)
237 {
238   if(aMode==-1) return;
239   //  Standard_Boolean global = Standard_False;
240   if(!anObject->HasSelection(aMode)) LoadMode(anObject,aMode);
241
242
243   if(myglobal.Contains(anObject)) {
244     TColStd_MapIteratorOfMapOfTransient It(myselectors);
245
246     for(;It.More();It.Next()){
247       Handle(SelectMgr_ViewerSelector) curview = 
248         Handle(SelectMgr_ViewerSelector)::DownCast(It.Key());
249       Activate(anObject,aMode,curview,AutomaticProj);
250     }
251   }
252
253   else if(mylocal.IsBound(anObject)) {
254     SelectMgr_SequenceOfSelector& seq = mylocal.ChangeFind (anObject);
255     for (Standard_Integer i=1;i<=seq.Length();i++) {
256       Handle(SelectMgr_ViewerSelector) curview =
257         Handle(SelectMgr_ViewerSelector)::DownCast(seq(i));
258       // ATTENTION : si la selection est a remettre a jour, on le fait la ....      
259       const Handle(SelectMgr_Selection)& Sel = anObject->Selection(aMode);
260
261       switch(Sel->UpdateStatus()){
262       case SelectMgr_TOU_Full:
263         anObject->UpdateSelection(aMode); // pas de break expres...
264       case SelectMgr_TOU_Partial:
265         {
266           if(anObject->HasLocation())
267             anObject->UpdateLocation(Sel);
268           Sel->UpdateStatus(SelectMgr_TOU_None);
269           break;
270         }
271       default:
272         break;
273       }
274
275       curview->Activate(Sel,AutomaticProj);
276     }
277   }
278 }
279
280
281 //==================================================
282 // Function: Activate
283 // Purpose :
284 //==================================================
285
286 void SelectMgr_SelectionManager::
287 Activate(const Handle(SelectMgr_SelectableObject)& anObject,
288          const Standard_Integer aMode,
289          const Handle(SelectMgr_ViewerSelector)& aViewSel,
290          const Standard_Boolean AutomaticProj)
291 {
292   if(aMode==-1) return;
293
294   if(!myselectors.Contains(aViewSel)) return;
295
296   if (!anObject->HasSelection(aMode)) LoadMode(anObject,aMode);
297
298   const Handle(SelectMgr_Selection)& Sel = anObject->Selection(aMode);
299
300   switch(Sel->UpdateStatus()){
301   case SelectMgr_TOU_Full:
302     anObject->UpdateSelection(aMode); 
303   case SelectMgr_TOU_Partial:
304     {
305       if(anObject->HasLocation())
306         anObject->UpdateLocation(Sel);
307       break;
308     }
309   default:
310     break;
311   }
312   Sel->UpdateStatus(SelectMgr_TOU_None);
313
314   if  (myglobal.Contains(anObject)) 
315     aViewSel->Activate (anObject->Selection(aMode));
316
317   else {
318     if (mylocal.IsBound(anObject)) {
319       if (SMSearch(mylocal.Find(anObject),aViewSel)==0)
320         (mylocal.ChangeFind (anObject)).Append(aViewSel);
321       aViewSel->Activate (anObject->Selection(aMode),AutomaticProj);
322     }
323   }
324 }
325
326 //==================================================
327 // Function: Deactivate
328 // Purpose :
329 //==================================================
330
331 void SelectMgr_SelectionManager::
332 Deactivate(const Handle(SelectMgr_SelectableObject)& anObject)
333 {
334   Standard_Boolean global = Standard_False;
335   if(myglobal.Contains(anObject)) global = Standard_True;
336   TColStd_MapIteratorOfMapOfTransient It(myselectors);
337   Handle(SelectMgr_ViewerSelector) curview; 
338   for(;It.More();It.Next()){
339     curview = Handle(SelectMgr_ViewerSelector)::DownCast(It.Key());
340     if (global || mylocal.IsBound (anObject)) {
341       for (anObject->Init();anObject->More();anObject->Next())
342       {curview->Deactivate(anObject->CurrentSelection());}  
343
344     }
345
346   }
347 }
348
349 //==================================================
350 // Function: Deactivate
351 // Purpose :
352 //==================================================
353
354 void SelectMgr_SelectionManager::
355 Deactivate(const Handle(SelectMgr_SelectableObject)& anObject,
356            const Standard_Integer amode)
357
358 {
359   Standard_Boolean global = Standard_False;
360   if(myglobal.Contains(anObject)) global = Standard_True;
361   TColStd_MapIteratorOfMapOfTransient It(myselectors);
362   Handle(SelectMgr_ViewerSelector) curview;
363   for(;It.More();It.Next()){
364     curview = Handle(SelectMgr_ViewerSelector)::DownCast(It.Key());
365     if (global || mylocal.IsBound(anObject)) {
366       if(anObject->HasSelection(amode))
367         curview->Deactivate(anObject->Selection(amode));
368
369     }
370   }
371 }
372
373 //==================================================
374 // Function: Deactivate
375 // Purpose :
376 //==================================================
377
378 void SelectMgr_SelectionManager::
379 Deactivate(const Handle(SelectMgr_SelectableObject)& anObject,
380            const Standard_Integer aMode,
381            const Handle(SelectMgr_ViewerSelector)& aViewSel)
382 {
383   if(myselectors.Contains(aViewSel))
384   {
385     if(myglobal.Contains(anObject)|| mylocal.IsBound(anObject)) 
386       if(anObject->HasSelection(aMode))
387         aViewSel->Deactivate (anObject->Selection(aMode));
388   }  
389
390 }
391 //==================================================
392 // Function: Deactivate
393 // Purpose :
394 //==================================================
395
396 void SelectMgr_SelectionManager::
397 Deactivate(const Handle(SelectMgr_SelectableObject)& anObject,
398            const Handle(SelectMgr_ViewerSelector)& aViewSel)
399
400 {
401   if(myselectors.Contains(aViewSel))
402   {
403     if(myglobal.Contains(anObject)|| mylocal.IsBound(anObject)) {
404       for (anObject->Init();anObject->More();anObject->Next())
405       {aViewSel->Deactivate(anObject->CurrentSelection());}}  
406
407   }  
408
409 }
410
411
412 //==================================================
413 // Function: Sleep
414 // Purpose :
415 //==================================================
416 void SelectMgr_SelectionManager::
417 Sleep (const Handle(SelectMgr_ViewerSelector)& aViewSel)
418 {
419   if (myselectors.Contains(aViewSel))
420     aViewSel->Sleep();
421 }
422
423 void SelectMgr_SelectionManager::
424 Sleep (const Handle(SelectMgr_SelectableObject)& anObject)
425 {
426
427   if(myglobal.Contains(anObject)){
428     for( TColStd_MapIteratorOfMapOfTransient It(myselectors);
429       It.More();It.Next())
430       Handle(SelectMgr_ViewerSelector)::DownCast(It.Key())->Sleep(anObject);
431   }
432   else if(mylocal.IsBound(anObject)){
433     const SelectMgr_SequenceOfSelector & VSeq = mylocal(anObject);
434     for (Standard_Integer I=1;I<=VSeq.Length();I++)
435       VSeq(I)->Sleep(anObject);
436   }
437
438
439 }
440
441 //=======================================================================
442 //function : Sleep
443 //purpose  : 
444 //=======================================================================
445 void SelectMgr_SelectionManager::
446 Sleep(const Handle(SelectMgr_SelectableObject)& anObject,
447       const Handle(SelectMgr_ViewerSelector)& aViewSel)
448 {
449   if(!myselectors.Contains(aViewSel)) return;
450
451   if(!myglobal.Contains(anObject)){
452     if(!mylocal.IsBound(anObject))
453       return;
454     if(SMSearch(mylocal(anObject),aViewSel)==0)
455       return;
456   }
457   aViewSel->Sleep(anObject);
458 }
459
460
461
462 //==================================================
463 // Function: Awake
464 // Purpose :
465 //==================================================
466 void SelectMgr_SelectionManager::
467 Awake (const Handle(SelectMgr_ViewerSelector)& aViewSel,
468        const Standard_Boolean AutomaticProj)
469 {
470   if (myselectors.Contains(aViewSel))
471     aViewSel->Awake(AutomaticProj);
472 }
473
474
475 //=======================================================================
476 //function : Awake
477 //purpose  : 
478 //=======================================================================
479 void SelectMgr_SelectionManager::Awake (const Handle(SelectMgr_SelectableObject)& anObject,
480                                         const Standard_Boolean AutomaticProj)
481 {
482   if(myglobal.Contains(anObject)){
483     for( TColStd_MapIteratorOfMapOfTransient It(myselectors);
484       It.More();It.Next())
485       Handle(SelectMgr_ViewerSelector)::DownCast( It.Key())->Awake(anObject,AutomaticProj);
486   }
487   else if(mylocal.IsBound(anObject)){
488     const SelectMgr_SequenceOfSelector & VSeq = mylocal(anObject);
489     for (Standard_Integer I=1;I<=VSeq.Length();I++)
490       VSeq(I)->Awake(anObject,AutomaticProj);
491   }
492 }
493
494 //=======================================================================
495 //function : Awake
496 //purpose  : 
497 //=======================================================================
498 void SelectMgr_SelectionManager::Awake (const Handle(SelectMgr_SelectableObject)& anObject,
499                                         const Handle(SelectMgr_ViewerSelector)& aViewSel,
500                                         const Standard_Boolean AutomaticProj)
501 {
502   if(!myselectors.Contains(aViewSel)) return;
503
504   if(!myglobal.Contains(anObject)){
505     if(!mylocal.IsBound(anObject))
506       return;
507     if(SMSearch(mylocal(anObject),aViewSel)==0)
508       return;
509   }
510   aViewSel->Awake(anObject,AutomaticProj);
511
512 }
513
514
515 //=======================================================================
516 //function : IsActivated
517 //purpose  : 
518 //=======================================================================
519 Standard_Boolean SelectMgr_SelectionManager::IsActivated(const Handle(SelectMgr_SelectableObject)& anObject) const
520 {
521   for(anObject->Init();anObject->More();anObject->Next()){
522     if(IsActivated(anObject,anObject->CurrentSelection()->Mode()))
523       return Standard_True;
524   }
525   return Standard_False;
526 }
527 //=======================================================================
528 //function : IsActivated
529 //purpose  : 
530 //=======================================================================
531 Standard_Boolean SelectMgr_SelectionManager::IsActivated(const Handle(SelectMgr_SelectableObject)& anObject,
532                                                          const Standard_Integer aMode) const
533 {
534   if(!anObject->HasSelection(aMode)) return Standard_False;
535   if (!(myglobal.Contains(anObject) || mylocal.IsBound(anObject))) 
536     return Standard_False;
537
538   Handle(Standard_Transient) Tr;
539   const Handle(SelectMgr_Selection)& Sel = anObject->Selection(aMode);
540   for(TColStd_MapIteratorOfMapOfTransient It(myselectors);It.More();It.Next()){
541     Tr = It.Key();
542     Handle(SelectMgr_ViewerSelector) VS = *((Handle(SelectMgr_ViewerSelector)*)&Tr);
543     if(VS->Status(Sel)==SelectMgr_SOS_Activated)
544       return Standard_True;
545   }
546   return Standard_False;
547
548 }
549
550 //=======================================================================
551 //function : IsActivated
552 //purpose  : 
553 //=======================================================================
554 Standard_Boolean SelectMgr_SelectionManager::IsActivated(const Handle(SelectMgr_SelectableObject)& anObject,
555                                                          const Handle(SelectMgr_ViewerSelector)& VS,
556                                                          const Standard_Integer aMode) const
557 {
558   if(!anObject->HasSelection(aMode))                               
559     return Standard_False;
560   if(!myselectors.Contains(VS))                                   
561     return Standard_False;
562   if (!(myglobal.Contains(anObject) || mylocal.IsBound(anObject))) 
563     return Standard_False;
564   const Handle(SelectMgr_Selection)& Sel = anObject->Selection(aMode);
565   return (VS->Status(Sel)==SelectMgr_SOS_Activated);
566 }
567
568 //==================================================
569 // Function: Update
570 // Purpose :
571 //==================================================
572 void SelectMgr_SelectionManager::
573 RecomputeSelection (const Handle(SelectMgr_SelectableObject)& anObject,
574                     const Standard_Boolean ForceUpdate,
575                     const Standard_Integer aMode)
576 {
577   if( SelectDebugModeOnSM() ) cout<<"===>SelectMgr_SelectionManager::Update"<<endl;
578
579   if(ForceUpdate){
580     if( SelectDebugModeOnSM() ) cout<<"\t Global Recalculation of selections"<<endl;
581     if(aMode==-1){
582       anObject->UpdateSelection();
583       anObject->UpdateLocation();
584     }
585     else if(anObject->HasSelection(aMode)){
586       anObject->UpdateSelection(aMode);
587       anObject->UpdateLocation();
588     }
589     return;
590   }
591   // objet is not known to SMgr.
592   if (!(myglobal.Contains(anObject) || mylocal.IsBound(anObject))){
593     if( SelectDebugModeOnSM() ) {cout<<"\t Object not loaded in the SelectionManager"<<endl;
594     cout<<"\t eventual selections are flagged"<<endl;}
595     if( aMode == -1 ){
596       for(anObject->Init();anObject->More();anObject->Next()){
597         if( SelectDebugModeOnSM() ) cout<<"\t\t Mode "<<anObject->CurrentSelection()->Mode()<<"  ";
598         anObject->CurrentSelection()->UpdateStatus(SelectMgr_TOU_Full);
599       }
600       if( SelectDebugModeOnSM() )  
601         cout << endl;
602     }
603     else if (anObject->HasSelection(aMode))
604       anObject->Selection(aMode)->UpdateStatus(SelectMgr_TOU_Full);
605   }
606
607   // recalculate whatever is required
608   // and set flag on top...
609   else{
610     TColStd_MapIteratorOfMapOfTransient It;
611     Handle(Standard_Transient) Tr;
612     Standard_Boolean Found;
613     // object selections are parsed
614
615     for(anObject->Init();anObject->More();anObject->Next()){
616       const Handle(SelectMgr_Selection)& Sel = anObject->CurrentSelection();
617       Sel->UpdateStatus(SelectMgr_TOU_Full);
618       Standard_Integer curmode = Sel->Mode();
619       Found = Standard_False;
620
621       // parsing of selections ...
622       for(It.Initialize(myselectors);It.More();It.Next()){
623         Tr = It.Key();
624         Handle(SelectMgr_ViewerSelector) VS = *((Handle(SelectMgr_ViewerSelector)*)&Tr);
625         if(VS->Status(Sel)==SelectMgr_SOS_Activated){
626           Found  = Standard_True;
627           switch(Sel->UpdateStatus()){
628     case SelectMgr_TOU_Full:
629       anObject->UpdateSelection(curmode); // no break on purpose...
630     case SelectMgr_TOU_Partial:
631       anObject->UpdateLocation(Sel);
632       break;
633     default:
634       break;
635           }
636           if(Found){
637             VS->Convert(Sel);
638             Sel->UpdateStatus(SelectMgr_TOU_None);
639           }
640         }
641       }
642     }
643   }
644 }
645
646 //=======================================================================
647 //function : Update
648 //purpose  : Selections are recalculated if they are flagged
649 //           "TO RECALCULATE" and activated in one of selectors.
650 //           If ForceUpdate = True, and they are "TO RECALCULATE"
651 //           This is done without caring for the state of activation.
652 //=======================================================================
653 void SelectMgr_SelectionManager::Update(const Handle(SelectMgr_SelectableObject)& anObject,
654                                         const Standard_Boolean ForceUpdate)
655 {
656   Standard_Boolean wasrecomputed;
657
658   for(anObject->Init();anObject->More();anObject->Next()){
659     const Handle(SelectMgr_Selection)& Sel = anObject->CurrentSelection();
660     wasrecomputed = Standard_False;
661     if(ForceUpdate){
662       switch(Sel->UpdateStatus()){
663       case SelectMgr_TOU_Full:
664         anObject->UpdateSelection(Sel->Mode()); // no break on purpose...
665       case SelectMgr_TOU_Partial:
666         anObject->UpdateLocation(Sel);
667         wasrecomputed = Standard_True;
668         break;
669       default:
670         break;
671       }
672       Sel->UpdateStatus(SelectMgr_TOU_None);
673     }
674
675     // it is checked which selectors are concerned by the selection
676     // to redo projections if necessary.
677     Handle(Standard_Transient) Tr;
678     for(TColStd_MapIteratorOfMapOfTransient It(myselectors);It.More();It.Next()){
679       Tr = It.Key();
680       Handle(SelectMgr_ViewerSelector) VS = *((Handle(SelectMgr_ViewerSelector)*)&Tr);
681       if(VS->Status(Sel)==SelectMgr_SOS_Activated)
682         switch(Sel->UpdateStatus()){
683   case SelectMgr_TOU_Full:
684     anObject->UpdateSelection(Sel->Mode()); // no break on purpose...
685   case SelectMgr_TOU_Partial:
686     anObject->UpdateLocation(Sel);
687     wasrecomputed = Standard_True;
688     break;
689   default:
690     break;
691       }
692       if(wasrecomputed)
693         VS->Convert(Sel);
694       Sel->UpdateStatus(SelectMgr_TOU_None);
695     }
696   }
697 }
698
699
700 //==================================================
701 // Function: Update
702 // Purpose : Attention, it is required to know what is done...
703 //==================================================
704 void SelectMgr_SelectionManager::
705 Update(const Handle(SelectMgr_SelectableObject)& anObject,
706        const Handle(SelectMgr_ViewerSelector)& aViewSel,
707        const Standard_Boolean ForceUpdate)
708
709   if( SelectDebugModeOnSM() ) cout<<"==>SelectMgr_SelectionManager::Update(obj,VS)"<<endl;
710   if(!myselectors.Contains(aViewSel)) return;
711
712   Standard_Boolean okay = myglobal.Contains(anObject);
713   if(!okay)
714     okay = (mylocal.IsBound(anObject) && (SMSearch(mylocal.Find(anObject),aViewSel)!=0)) ;
715   if(!okay) return;
716
717
718   // 
719   Standard_Boolean wasrecomputed;
720   for(anObject->Init();anObject->More();anObject->Next()){
721     const Handle(SelectMgr_Selection)& Sel = anObject->CurrentSelection();
722     wasrecomputed = Standard_False;
723     if(ForceUpdate){
724       switch(Sel->UpdateStatus()){
725       case SelectMgr_TOU_Full:
726         anObject->UpdateSelection(Sel->Mode()); //  no break on purpose...
727       case SelectMgr_TOU_Partial:
728         anObject->UpdateLocation(Sel);
729         wasrecomputed = Standard_True;
730         break;
731       default:
732         break;
733       }
734       Sel->UpdateStatus(SelectMgr_TOU_None);
735     }
736
737     if(aViewSel->Status(Sel) == SelectMgr_SOS_Activated){
738       switch(Sel->UpdateStatus()){
739       case SelectMgr_TOU_Full:
740         anObject->UpdateSelection(Sel->Mode());
741       case SelectMgr_TOU_Partial:
742         if(anObject->HasLocation())
743           anObject->UpdateLocation(Sel);
744         wasrecomputed = Standard_True;
745         break;
746       default:
747         break;
748       }
749       if(wasrecomputed)
750         aViewSel->Convert(Sel);
751       Sel->UpdateStatus(SelectMgr_TOU_None);
752     }
753   }
754 }
755
756 //==================================================
757 // Function: Status
758 // Purpose :
759 //==================================================
760 TCollection_AsciiString SelectMgr_SelectionManager::
761 Status() const{
762   TCollection_AsciiString theMgrStatus("\t\t\tStatus of the SelectManager :;\n\t\t\t============================\n");
763
764   TCollection_AsciiString nbview (myselectors.Extent()),nbglobal(myglobal.Extent());
765
766   theMgrStatus +=             "\t Number of ViewerSelectors: ";
767   theMgrStatus += nbview +  "\n\t Number of global objects : " + nbglobal+"\n";
768   theMgrStatus = theMgrStatus+"\t Number of local objects  : " + TCollection_AsciiString (mylocal.Extent())+"  \n";
769
770   return theMgrStatus;
771 }
772
773 //==================================================
774 // Function: Status
775 // Purpose :
776 //==================================================
777
778
779 TCollection_AsciiString SelectMgr_SelectionManager::
780 Status(const Handle(SelectMgr_SelectableObject)& anObject) const
781 {
782   TCollection_AsciiString TheStatus("\t\tStatus of object:");
783
784   if(myglobal.Contains(anObject))
785   {TheStatus += "GLOBAL (available for all viewers in the SelectionManager)\n";}
786   else if (mylocal.IsBound(anObject))TheStatus +="LOCAL:\n\t\t"; 
787   TColStd_MapIteratorOfMapOfTransient It(myselectors);
788   Standard_Integer iv = 0;
789   //  Standard_Boolean FirstTime=Standard_True;
790   for(;It.More();It.Next()){
791     const Handle(SelectMgr_ViewerSelector)& curview = 
792       Handle(SelectMgr_ViewerSelector)::DownCast(It.Key());  
793     iv++;
794     TheStatus = TheStatus + "status in the ViewerSelector :"+TCollection_AsciiString(iv)+"\n\t\t";
795     TheStatus+=curview->Status(anObject);
796     TheStatus+="\n\t\t----------------------\n\t\t";
797   }
798
799   return TheStatus;
800
801 }
802
803 //==================================================
804 // Function: LoadMode
805 // Purpose : Private Method
806 //==================================================
807
808
809 void SelectMgr_SelectionManager
810 ::LoadMode (const Handle(SelectMgr_SelectableObject)& anObject,
811             const Standard_Integer amode)
812 {
813   if(amode==-1) return;
814   if(!anObject->HasSelection(amode))
815   {
816     Handle(SelectMgr_Selection) NewSel = new SelectMgr_Selection(amode); 
817     anObject->AddSelection (NewSel,amode);
818   }
819 }
820
821
822 //=======================================================================
823 //function : SetUpdateMode
824 //purpose  : 
825 //=======================================================================
826
827 void SelectMgr_SelectionManager::
828 SetUpdateMode(const Handle(SelectMgr_SelectableObject)& anObject,
829               const SelectMgr_TypeOfUpdate aType)
830 {
831   for(anObject->Init();anObject->More();anObject->Next())
832     anObject->CurrentSelection()->UpdateStatus(aType);
833
834 }
835
836 void SelectMgr_SelectionManager::
837 SetUpdateMode(const Handle(SelectMgr_SelectableObject)& anObject,
838               const Standard_Integer aMode,
839               const SelectMgr_TypeOfUpdate aType)
840 {
841   if(anObject->HasSelection(aMode))
842     anObject->Selection(aMode)->UpdateStatus(aType);
843 }
844