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