0026886: Visualization, TKV3d - eliminate global variables
[occt.git] / src / AIS / AIS_InteractiveContext_1.cxx
1 // Created on: 1997-01-29
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1997-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 <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
19 #include <AIS_GlobalStatus.hxx>
20 #include <AIS_InteractiveContext.hxx>
21 #include <AIS_InteractiveObject.hxx>
22 #include <AIS_LocalContext.hxx>
23 #include <AIS_MapIteratorOfMapOfInteractive.hxx>
24 #include <AIS_MapOfInteractive.hxx>
25 #include <AIS_Selection.hxx>
26 #include <AIS_Shape.hxx>
27 #include <AIS_StatusOfDetection.hxx>
28 #include <AIS_StatusOfPick.hxx>
29 #include <Aspect_Grid.hxx>
30 #include <Prs3d_BasicAspect.hxx>
31 #include <Prs3d_LineAspect.hxx>
32 #include <Prs3d_Presentation.hxx>
33 #include <Quantity_Color.hxx>
34 #include <SelectBasics_SensitiveEntity.hxx>
35 #include <SelectMgr_EntityOwner.hxx>
36 #include <SelectMgr_Filter.hxx>
37 #include <SelectMgr_OrFilter.hxx>
38 #include <SelectMgr_Selection.hxx>
39 #include <SelectMgr_SelectionManager.hxx>
40 #include <Standard_Transient.hxx>
41 #include <StdSelect_BRepOwner.hxx>
42 #include <StdSelect_ViewerSelector3d.hxx>
43 #include <TCollection_AsciiString.hxx>
44 #include <TCollection_ExtendedString.hxx>
45 #include <TColStd_ListIteratorOfListOfInteger.hxx>
46 #include <TopLoc_Location.hxx>
47 #include <V3d_AmbientLight.hxx>
48 #include <V3d_DirectionalLight.hxx>
49 #include <V3d_Light.hxx>
50 #include <V3d_PositionalLight.hxx>
51 #include <V3d_SpotLight.hxx>
52 #include <V3d_View.hxx>
53 #include <V3d_Viewer.hxx>
54
55 typedef NCollection_DataMap<Handle(AIS_InteractiveObject), NCollection_Handle<SelectMgr_SequenceOfOwner> > AIS_MapOfObjSelectedOwners;
56
57 namespace
58 {
59   TopoDS_Shape AIS_myDummyShape;
60 }
61
62 //=======================================================================
63 //function : highlightWithColor
64 //purpose  :
65 //=======================================================================
66 void AIS_InteractiveContext::highlightWithColor (const Handle(SelectMgr_EntityOwner)& theOwner,
67                                                  const Quantity_NameOfColor theColor,
68                                                  const Handle(V3d_Viewer)& theViewer)
69 {
70   const Handle(AIS_InteractiveObject) anObj =
71     Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
72   if (anObj.IsNull())
73     return;
74   const Standard_Integer aHiMode = anObj->HasHilightMode() ? anObj->HilightMode() : 0;
75
76   myMainPM->BeginImmediateDraw();
77   theOwner->HilightWithColor (myMainPM, theColor, aHiMode);
78   myMainPM->EndImmediateDraw (theViewer.IsNull() ? myMainVwr : theViewer);
79 }
80
81 //=======================================================================
82 //function : highlightSelected
83 //purpose  :
84 //=======================================================================
85 void AIS_InteractiveContext::highlightSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
86                                                 const Quantity_NameOfColor theSelColor)
87 {
88   const Handle(AIS_InteractiveObject) anObj =
89     Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
90   if (anObj.IsNull())
91     return;
92   const Standard_Integer aHiMode = anObj->HasHilightMode() ? anObj->HilightMode() : 0;
93
94   if (!theOwner->IsAutoHilight())
95   {
96     SelectMgr_SequenceOfOwner aSeq;
97     for (mySelection->Init(); mySelection->More(); mySelection->Next())
98     {
99       const Handle(SelectMgr_EntityOwner) aSelOwnr =
100         Handle(SelectMgr_EntityOwner)::DownCast (mySelection->Value());
101       if (aSelOwnr->Selectable() != anObj)
102         continue;
103       aSeq.Append (aSelOwnr);
104     }
105     anObj->HilightSelected (myMainPM, aSeq);
106   }
107   else
108   {
109     theOwner->HilightWithColor (myMainPM, theSelColor, aHiMode);
110   }
111 }
112
113 //=======================================================================
114 //function : unhighlightSelected
115 //purpose  :
116 //=======================================================================
117 void AIS_InteractiveContext::unhighlightSelected (const Standard_Boolean theIsToHilightSubIntensity)
118 {
119   NCollection_IndexedMap<Handle(AIS_InteractiveObject)> anObjToClear;
120   for (mySelection->Init(); mySelection->More(); mySelection->Next())
121   {
122     const Handle(SelectMgr_EntityOwner) anOwner =
123       Handle(SelectMgr_EntityOwner)::DownCast (mySelection->Value());
124     if (anOwner.IsNull() || !anOwner->HasSelectable())
125       continue;
126
127     const Handle(AIS_InteractiveObject) anInteractive =
128       Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
129     if (anOwner->IsAutoHilight())
130     {
131       const Standard_Integer aHiMode = anInteractive->HasHilightMode() ? anInteractive->HilightMode() : 0;
132       anOwner->Unhilight (myMainPM, aHiMode);
133       if (theIsToHilightSubIntensity)
134       {
135         if (myObjects.IsBound (anInteractive) && myObjects (anInteractive)->IsSubIntensityOn())
136         {
137           anOwner->HilightWithColor (myMainPM, mySubIntensity, aHiMode);
138         }
139       }
140     }
141     else
142     {
143       if (!anObjToClear.Contains (anInteractive))
144         anObjToClear.Add (anInteractive);
145     }
146     anOwner->State (0);
147     if (anOwner == anInteractive->GlobalSelOwner())
148     {
149       myObjects.ChangeFind (anInteractive)->SetHilightStatus (Standard_False);
150     }
151   }
152   for (NCollection_IndexedMap<Handle(AIS_InteractiveObject)>::Iterator anIter (anObjToClear); anIter.More(); anIter.Next())
153   {
154     const Handle(AIS_InteractiveObject)& anObj = anIter.Value();
155     const Standard_Integer aHiMode = anObj->HasHilightMode() ? anObj->HilightMode() : 0;
156     myMainPM->Unhighlight (anObj, aHiMode);
157     anObj->ClearSelected();
158   }
159 }
160
161 //=======================================================================
162 //function : MoveTo
163 //purpose  :
164 //=======================================================================
165 AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer  theXPix,
166                                                       const Standard_Integer  theYPix,
167                                                       const Handle(V3d_View)& theView,
168                                                       const Standard_Boolean  theToRedrawOnUpdate)
169 {
170   if (HasOpenedContext())
171   {
172     myWasLastMain = Standard_True;
173     return myLocalContexts (myCurLocalIndex)->MoveTo (theXPix, theYPix, theView, theToRedrawOnUpdate);
174   }
175
176   myAISCurDetected = 0;
177   myAISDetectedSeq.Clear();
178
179   if (theView->Viewer() != myMainVwr)
180   {
181     return AIS_SOD_Error;
182   }
183
184   // preliminaires
185   myLastPicked  = myLastinMain;
186   myWasLastMain = Standard_True;
187   AIS_StatusOfDetection aStatus        = AIS_SOD_Nothing;
188   Standard_Boolean      toUpdateViewer = Standard_False;
189
190   myFilters->SetDisabledObjects (theView->View()->HiddenObjects());
191   myMainSel->Pick (theXPix, theYPix, theView);
192
193   // filling of myAISDetectedSeq sequence storing information about detected AIS objects
194   // (the objects must be AIS_Shapes)
195   const Standard_Integer aDetectedNb = myMainSel->NbPicked();
196   Standard_Integer aNewDetected = 0;
197   for (Standard_Integer aDetIter = 1; aDetIter <= aDetectedNb; ++aDetIter)
198   {
199     Handle(SelectMgr_EntityOwner) anOwner = myMainSel->Picked (aDetIter);
200     if (anOwner.IsNull()
201      || !myFilters->IsOk (anOwner))
202     {
203       continue;
204     }
205
206     if (aNewDetected < 1)
207     {
208       aNewDetected = aDetIter;
209     }
210     Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
211     if (!anObj.IsNull())
212     {
213       myAISDetectedSeq.Append (anObj);
214     }
215   }
216
217   if (aNewDetected >= 1)
218   {
219     // does nothing if previously detected object is equal to the current one
220     Handle(SelectMgr_EntityOwner) aNewPickedOwner = myMainSel->Picked (aNewDetected);
221     if (aNewPickedOwner == myLastPicked)
222     {
223       return myLastPicked->IsSelected()
224            ? AIS_SOD_Selected
225            : AIS_SOD_OnlyOneDetected;
226     }
227  
228     // Previously detected object is unhilighted if it is not selected or hilighted 
229     // with selection color if it is selected. Such highlighting with selection color 
230     // is needed only if myToHilightSelected flag is true. In this case previously detected
231     // object has been already highlighted with myHilightColor during previous MoveTo() 
232     // method call. As result it is necessary to rehighligt it with mySelectionColor.
233     if (!myLastPicked.IsNull() && myLastPicked->HasSelectable())
234     {
235       myMainPM->ClearImmediateDraw();
236       const Handle(AIS_InteractiveObject) aLastPickedAIS = Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
237       const Standard_Integer aHiMod = aLastPickedAIS->HasHilightMode() ? aLastPickedAIS->HilightMode() : 0;
238       if (!myLastPicked->IsSelected())
239       {
240         myLastPicked->Unhilight (myMainPM, aHiMod);
241         toUpdateViewer = Standard_True;
242       }
243       else if (myToHilightSelected)
244       {
245         highlightWithColor (aNewPickedOwner, mySelectionColor, theView->Viewer());
246         toUpdateViewer = Standard_True;
247       }
248     }
249
250     // initialize myLastPicked field with currently detected object
251     myLastPicked = aNewPickedOwner;
252     myLastinMain = myLastPicked;
253
254     // highlight detected object if it is not selected or myToHilightSelected flag is true
255     if (myLastPicked->HasSelectable())
256     {
257       if (!myLastPicked->IsSelected() || myToHilightSelected)
258       {
259         highlightWithColor (myLastPicked, myHilightColor, theView->Viewer());
260         toUpdateViewer = Standard_True;
261       }
262
263       aStatus = myLastPicked->IsSelected()
264               ? AIS_SOD_Selected
265               : AIS_SOD_OnlyOneDetected;
266     }
267   }
268   else
269   {
270     // previously detected object is unhilighted if it is not selected or hilighted
271     // with selection color if it is selected
272     aStatus = AIS_SOD_Nothing;
273     if (!myLastPicked.IsNull() && myLastPicked->HasSelectable())
274     {
275       myMainPM->ClearImmediateDraw();
276       const Handle(AIS_InteractiveObject) aLastPickedAIS = Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
277       Standard_Integer aHiMod = aLastPickedAIS->HasHilightMode() ? aLastPickedAIS->HilightMode() : 0;
278       if (!myLastPicked->IsSelected())
279       {
280         if (myLastPicked->IsAutoHilight())
281         {
282           myLastPicked->Unhilight (myMainPM, aHiMod);
283         }
284         toUpdateViewer = Standard_True;
285       }
286       else if (myToHilightSelected)
287       {
288         highlightSelected (myLastPicked, mySelectionColor);
289         toUpdateViewer = Standard_True;
290       }
291     }
292
293     myLastinMain.Nullify();
294     myLastPicked.Nullify();
295   }
296
297   if (toUpdateViewer
298    && theToRedrawOnUpdate)
299   {
300     theView->Viewer()->Update();
301   }
302
303   mylastmoveview = theView;
304   return aStatus;
305 }
306
307 //=======================================================================
308 //function : AddSelect
309 //purpose  : 
310 //=======================================================================
311 AIS_StatusOfPick AIS_InteractiveContext::AddSelect (const Handle(Standard_Transient)& theObject)
312 {
313   if (HasOpenedContext())
314   {
315     return myLocalContexts(myCurLocalIndex)->AddSelect (theObject);
316   }
317   mySelection->AddSelect (theObject);
318
319   Standard_Integer aSelNum = NbSelected();
320   return (aSelNum == 0) ? AIS_SOP_NothingSelected
321                         : (aSelNum == 1) ? AIS_SOP_OneSelected
322                                          : AIS_SOP_SeveralSelected;
323 }
324
325 //=======================================================================
326 //function : Select
327 //purpose  : 
328 //=======================================================================
329 AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Integer  theXPMin,
330                                                  const Standard_Integer  theYPMin,
331                                                  const Standard_Integer  theXPMax,
332                                                  const Standard_Integer  theYPMax,
333                                                  const Handle(V3d_View)& theView,
334                                                  const Standard_Boolean  toUpdateViewer)
335 {
336   // all objects detected by the selector are taken, previous current objects are emptied,
337   // new objects are put...
338
339   if (HasOpenedContext())
340   {
341     return myLocalContexts(myCurLocalIndex)->Select (theXPMin, theYPMin,
342                                                      theXPMax, theYPMax,
343                                                      theView, toUpdateViewer);
344   }
345
346   ClearSelected (Standard_False);
347
348   Handle(StdSelect_ViewerSelector3d) aSelector;
349
350   if (theView->Viewer() == myMainVwr)
351   {
352     aSelector = myMainSel;
353     myWasLastMain = Standard_True;
354   }
355
356   aSelector->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView);
357
358   for (aSelector->Init(); aSelector->More(); aSelector->Next())
359   {
360     const Handle(SelectMgr_EntityOwner)& aCurOwner = aSelector->Picked();
361     if (aCurOwner.IsNull() || !aCurOwner->HasSelectable() || !myFilters->IsOk (aCurOwner))
362       continue;
363
364     mySelection->Select (aCurOwner);
365     aCurOwner->State (1);
366   }
367
368   HilightSelected (toUpdateViewer);
369
370   Standard_Integer aSelNum = NbSelected();
371
372   return (aSelNum == 0) ? AIS_SOP_NothingSelected
373                         : (aSelNum == 1) ? AIS_SOP_OneSelected
374                                          : AIS_SOP_SeveralSelected;
375   
376 }
377
378 //=======================================================================
379 //function : Select
380 //purpose  : Selection by polyline
381 //=======================================================================
382 AIS_StatusOfPick AIS_InteractiveContext::Select (const TColgp_Array1OfPnt2d& thePolyline,
383                                                  const Handle(V3d_View)&     theView,
384                                                  const Standard_Boolean      toUpdateViewer)
385 {
386   // all objects detected by the selector are taken, previous current objects are emptied,
387   // new objects are put...
388
389   if (HasOpenedContext())
390   {
391     return myLocalContexts(myCurLocalIndex)->Select (thePolyline, theView, toUpdateViewer);
392   }
393
394   ClearSelected (Standard_False);
395
396   Handle(StdSelect_ViewerSelector3d) aSelector;
397
398   if (theView->Viewer() == myMainVwr)
399   {
400     aSelector = myMainSel;
401     myWasLastMain = Standard_True;
402   }
403
404   aSelector->Pick (thePolyline, theView);
405
406   for (aSelector->Init(); aSelector->More(); aSelector->Next())
407   {
408     const Handle(SelectMgr_EntityOwner) anOwner = aSelector->Picked();
409     if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner))
410       continue;
411
412     mySelection->Select (anOwner);
413     anOwner->State (1);
414   }
415
416   HilightSelected (toUpdateViewer);
417
418   Standard_Integer aSelNum = NbSelected();
419
420   return (aSelNum == 0) ? AIS_SOP_NothingSelected
421                         : (aSelNum == 1) ? AIS_SOP_OneSelected
422                                          : AIS_SOP_SeveralSelected;
423   
424 }
425
426 //=======================================================================
427 //function : Select
428 //purpose  : 
429 //=======================================================================
430 AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Boolean toUpdateViewer)
431 {
432   if (HasOpenedContext())
433   {
434     if(myWasLastMain)
435     {
436       return myLocalContexts(myCurLocalIndex)->Select (toUpdateViewer);
437     }
438     else
439     {
440       myLocalContexts(myCurLocalIndex)->SetSelected (Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable()), toUpdateViewer);
441       return AIS_SOP_OneSelected;
442     }
443   }
444
445   myMainPM->ClearImmediateDraw();
446   if (myWasLastMain && !myLastinMain.IsNull())
447   {
448     if(!myLastinMain->IsSelected())
449     {
450       SetSelected (myLastinMain, Standard_False);
451       if(toUpdateViewer)
452       {
453         UpdateCurrentViewer();
454       }
455     }
456   }
457   else
458   {
459     unhighlightSelected (Standard_True);
460
461     mySelection->Select();
462     if (toUpdateViewer && myWasLastMain)
463     {
464         UpdateCurrentViewer();
465     }
466   }
467
468   Standard_Integer aSelNum = NbSelected();
469
470   return (aSelNum == 0) ? AIS_SOP_NothingSelected
471                         : (aSelNum == 1) ? AIS_SOP_OneSelected
472                                          : AIS_SOP_SeveralSelected;
473 }
474
475 //=======================================================================
476 //function : ShiftSelect
477 //purpose  : 
478 //=======================================================================
479 AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Boolean toUpdateViewer)
480 {
481   if (HasOpenedContext())
482   {
483     if(myWasLastMain)
484     {
485       return myLocalContexts (myCurLocalIndex)->ShiftSelect (toUpdateViewer);
486     }
487     else
488     {
489       myLocalContexts (myCurLocalIndex)->AddOrRemoveSelected (myLastPicked, toUpdateViewer);
490
491       Standard_Integer aSelNum = NbSelected();
492       return (aSelNum == 0) ? AIS_SOP_NothingSelected
493                             : (aSelNum == 1) ? AIS_SOP_OneSelected
494                                              : AIS_SOP_SeveralSelected;
495     }
496   }
497
498   myMainPM->ClearImmediateDraw();
499   if (myWasLastMain && !myLastinMain.IsNull())
500   {
501     AddOrRemoveSelected (myLastinMain, toUpdateViewer);
502   }
503
504   Standard_Integer aSelNum = NbSelected();
505
506   return (aSelNum == 0) ? AIS_SOP_NothingSelected
507                         : (aSelNum == 1) ? AIS_SOP_OneSelected
508                         : AIS_SOP_SeveralSelected;
509 }
510
511 //=======================================================================
512 //function : ShiftSelect
513 //purpose  : 
514 //=======================================================================
515 AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Integer theXPMin,
516                                                       const Standard_Integer theYPMin,
517                                                       const Standard_Integer theXPMax,
518                                                       const Standard_Integer theYPMax,
519                                                       const Handle(V3d_View)& theView,
520                                                       const Standard_Boolean toUpdateViewer)
521 {
522   if (HasOpenedContext())
523   {
524     return myLocalContexts(myCurLocalIndex)->ShiftSelect (theXPMin, theYPMin, theXPMax, theYPMax,
525                                                           theView, toUpdateViewer);
526   }
527
528   UnhilightSelected (Standard_False);
529
530   Handle(StdSelect_ViewerSelector3d) aSelector;
531   if (theView->Viewer() == myMainVwr)
532   {
533     aSelector = myMainSel;
534     myWasLastMain = Standard_True;
535   }
536   else
537   {
538     return AIS_SOP_NothingSelected;
539   }
540
541   aSelector->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView);
542   for (aSelector->Init(); aSelector->More(); aSelector->Next())
543   {
544     const Handle(SelectMgr_EntityOwner) anOwner = aSelector->Picked();
545     if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner))
546       continue;
547
548     AIS_SelectStatus aSelStatus = mySelection->Select (anOwner);
549     Standard_Integer aState = (aSelStatus == AIS_SS_Added) ? 1 : 0;
550     anOwner->State (aState);
551   }
552
553   HilightSelected (toUpdateViewer);
554
555   Standard_Integer aSelNum = NbSelected();
556
557   return (aSelNum == 0) ? AIS_SOP_NothingSelected
558                         : (aSelNum == 1) ? AIS_SOP_OneSelected
559                                          : AIS_SOP_SeveralSelected;
560
561 }
562
563 //=======================================================================
564 //function : ShiftSelect
565 //purpose  : 
566 //=======================================================================
567 AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const TColgp_Array1OfPnt2d& thePolyline,
568                                                       const Handle(V3d_View)& theView,
569                                                       const Standard_Boolean toUpdateViewer)
570 {
571   if (HasOpenedContext())
572   {
573     return myLocalContexts(myCurLocalIndex)->ShiftSelect (thePolyline, theView, toUpdateViewer);
574   }
575
576   UnhilightSelected (Standard_False);
577
578   Handle(StdSelect_ViewerSelector3d) aSelector;
579
580   if (theView->Viewer() == myMainVwr)
581   {
582     aSelector= myMainSel;
583     myWasLastMain = Standard_True;
584   }
585   else
586   {
587     return AIS_SOP_NothingSelected;
588   }
589
590   aSelector->Pick (thePolyline, theView);
591
592   for (aSelector->Init(); aSelector->More(); aSelector->Next())
593   {
594     const Handle(SelectMgr_EntityOwner) anOwner = aSelector->Picked();
595     if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner))
596       continue;
597
598     AIS_SelectStatus aSelStatus = mySelection->Select (anOwner);
599     Standard_Integer aState = (aSelStatus == AIS_SS_Added) ? 1 : 0;
600     anOwner->State (aState);
601   }
602
603   HilightSelected (toUpdateViewer);
604
605   Standard_Integer aSelNum = NbSelected();
606
607   return (aSelNum == 0) ? AIS_SOP_NothingSelected
608                         : (aSelNum == 1) ? AIS_SOP_OneSelected
609                                          : AIS_SOP_SeveralSelected;
610 }
611
612 //=======================================================================
613 //function : SetCurrentObject
614 //purpose  : OBSOLETE, please use SetSelected() instead
615 //TODO     : Remove in process of local context deletion
616 //=======================================================================
617 void AIS_InteractiveContext::SetCurrentObject (const Handle(AIS_InteractiveObject)& theObject,
618                                                const Standard_Boolean theToUpdateViewer)
619 {
620   if (HasOpenedContext())
621     return;
622
623   SetSelected (theObject, theToUpdateViewer);
624 }
625
626 //=======================================================================
627 //function : AddOrRemoveCurrentObject
628 //purpose  : OBSOLETE, please use AddOrRemoveSelected() instead
629 //TODO     : Remove in process of local context deletion
630 //=======================================================================
631 void AIS_InteractiveContext::AddOrRemoveCurrentObject (const Handle(AIS_InteractiveObject)& theObj,
632                                                        const Standard_Boolean theIsToUpdateViewer)
633 {
634   if (HasOpenedContext())
635     return;
636
637   AddOrRemoveSelected (theObj, theIsToUpdateViewer);
638 }
639 //=======================================================================
640 //function : UpdateCurrent
641 //purpose  : OBSOLETE, please use UpdateSelected() instead
642 //TODO     : Remove in process of local context deletion
643 //=======================================================================
644 void AIS_InteractiveContext::UpdateCurrent()
645 {
646   UpdateSelected();
647 }
648
649 //=======================================================================
650 //function : IsCurrent
651 //purpose  : OBSOLETE, please use IsSelected() instead
652 //TODO     : Remove in process of local context deletion
653 //=======================================================================
654 Standard_Boolean AIS_InteractiveContext::IsCurrent (const Handle(AIS_InteractiveObject)& theObject) const
655 {
656   return IsSelected (theObject);
657 }
658
659 //=======================================================================
660 //function : InitCurrent
661 //purpose  : OBSOLETE, please use InitSelected() instead
662 //TODO     : Remove in process of local context deletion
663 //=======================================================================
664 void AIS_InteractiveContext::InitCurrent()
665 {
666   if (HasOpenedContext())
667     return;
668
669   InitSelected();
670 }
671
672 //=======================================================================
673 //function : MoreCurrent
674 //purpose  : OBSOLETE, please use MoreSelected() instead
675 //TODO     : Remove in process of local context deletion
676 //=======================================================================
677 Standard_Boolean AIS_InteractiveContext::MoreCurrent() const 
678 {
679   return !HasOpenedContext() && MoreSelected();
680 }
681
682 //=======================================================================
683 //function : NextCurrent
684 //purpose  : OBSOLETE, please use NextSelected() instead
685 //TODO     : Remove in process of local context deletion
686 //=======================================================================
687 void AIS_InteractiveContext::NextCurrent()
688 {
689   if (HasOpenedContext())
690     return;
691
692   NextSelected();
693 }
694
695 //=======================================================================
696 //function : Current
697 //purpose  : OBSOLETE, please use SelectedInteractive() instead
698 //TODO     : Remove in process of local context deletion
699 //=======================================================================
700 Handle(AIS_InteractiveObject) AIS_InteractiveContext::Current() const 
701 {
702   return HasOpenedContext() ? NULL : SelectedInteractive();
703 }
704
705 //=======================================================================
706 //function : NbCurrents
707 //purpose  : OBSOLETE, please use NbSelected() instead
708 //TODO     : Remove in process of local context deletion
709 //=======================================================================
710 Standard_Integer AIS_InteractiveContext::NbCurrents()
711 {
712   return HasOpenedContext() ? -1 : NbSelected();
713 }
714
715 //=======================================================================
716 //function : HilightCurrents
717 //purpose  : OBSOLETE, please use HilightSelected() instead
718 //TODO     : Remove in process of local context deletion
719 //=======================================================================
720 void AIS_InteractiveContext::HilightCurrents (const Standard_Boolean theToUpdateViewer)
721 {
722   if (HasOpenedContext())
723     return;
724
725   HilightSelected (theToUpdateViewer);
726 }
727
728 //=======================================================================
729 //function : UnhilightCurrents
730 //purpose  : OBSOLETE, please use UnhilightSelected() instead
731 //TODO     : Remove in process of local context deletion
732 //=======================================================================
733 void AIS_InteractiveContext::UnhilightCurrents (const Standard_Boolean theToUpdateViewer)
734 {
735   if (HasOpenedContext())
736     return;
737
738   UnhilightSelected (theToUpdateViewer);
739 }
740
741 //=======================================================================
742 //function : ClearCurrents
743 //purpose  : OBSOLETE, please use ClearCurrents() instead
744 //TODO     : Remove in process of local context deletion
745 //=======================================================================
746 void AIS_InteractiveContext::ClearCurrents(const Standard_Boolean theToUpdateViewer)
747 {
748   if (HasOpenedContext())
749     return;
750
751   ClearSelected (theToUpdateViewer);
752 }
753
754
755 //=======================================================================
756 //function : HilightSelected
757 //purpose  :
758 //=======================================================================
759 void AIS_InteractiveContext::HilightSelected (const Standard_Boolean theToUpdateViewer)
760 {
761   if (HasOpenedContext())
762   {
763     return myLocalContexts (myCurLocalIndex)->HilightPicked (theToUpdateViewer);
764   }
765
766   // In case of selection without using local context
767   myMainPM->ClearImmediateDraw();
768   AIS_MapOfObjSelectedOwners anObjOwnerMap;
769   for (mySelection->Init(); mySelection->More(); mySelection->Next())
770   {
771     const Handle(SelectMgr_EntityOwner) anOwner =
772       Handle(SelectMgr_EntityOwner)::DownCast (mySelection->Value());
773     if (!anOwner.IsNull() && anOwner->HasSelectable())
774     {
775       const Handle(AIS_InteractiveObject) anObj =
776         Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
777       if (anOwner == anObj->GlobalSelOwner())
778       {
779         Handle(AIS_GlobalStatus)& aState = myObjects.ChangeFind (anObj);
780         aState->SetHilightStatus (Standard_True);
781         aState->SetHilightColor (mySelectionColor);
782       }
783       anOwner->State (1);
784       if (!anOwner->IsAutoHilight())
785       {
786         NCollection_Handle<SelectMgr_SequenceOfOwner> aSeq;
787         if (anObjOwnerMap.Find (anObj, aSeq))
788         {
789           aSeq->Append (anOwner);
790         }
791         else
792         {
793           aSeq = new SelectMgr_SequenceOfOwner();
794           aSeq->Append (anOwner);
795           anObjOwnerMap.Bind (anObj, aSeq);
796         }
797       }
798       else
799       {
800         const Standard_Integer aHiMode = anObj->HasHilightMode() ? anObj->HilightMode() : 0;
801         anOwner->HilightWithColor (myMainPM, mySelectionColor, aHiMode);
802       }
803     }
804   }
805
806   if (!anObjOwnerMap.IsEmpty())
807   {
808     for (AIS_MapOfObjSelectedOwners::Iterator anIter (anObjOwnerMap); anIter.More(); anIter.Next())
809     {
810       anIter.Key()->HilightSelected (myMainPM, *anIter.Value());
811     }
812     anObjOwnerMap.Clear();
813   }
814
815   if (theToUpdateViewer)
816     UpdateCurrentViewer();
817 }
818
819 //=======================================================================
820 //function : UnhilightSelected
821 //purpose  :
822 //=======================================================================
823 void AIS_InteractiveContext::UnhilightSelected (const Standard_Boolean theToUpdateViewer)
824 {
825   if (HasOpenedContext())
826   {
827     return myLocalContexts (myCurLocalIndex)->UnhilightPicked (theToUpdateViewer);
828   }
829
830   for (mySelection->Init(); mySelection->More(); mySelection->Next())
831   {
832     const Handle(SelectMgr_EntityOwner) anOwner =
833       Handle(SelectMgr_EntityOwner)::DownCast (mySelection->Value());
834     if (!anOwner.IsNull() && anOwner->HasSelectable())
835     {
836       const Handle(AIS_InteractiveObject) anObj =
837         Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
838       if (anOwner == anObj->GlobalSelOwner())
839       {
840         myObjects.ChangeFind (anObj)->SetHilightStatus (Standard_False);
841       }
842       anOwner->State (0);
843       const Standard_Integer aHiMode = anObj->HasHilightMode() ? anObj->HasHilightMode() : 0;
844       anOwner->Unhilight (myMainPM, aHiMode);
845     }
846   }
847
848   if (theToUpdateViewer)
849     UpdateCurrentViewer();
850 }
851
852
853 //=======================================================================
854 //function : ClearSelected
855 //purpose  :
856 //=======================================================================
857 void AIS_InteractiveContext::ClearSelected (const Standard_Boolean theToUpdateViewer)
858 {
859   if (HasOpenedContext())
860     return myLocalContexts (myCurLocalIndex)->ClearSelected (theToUpdateViewer);
861
862   if (NbSelected() == 0)
863     return;
864
865   unhighlightSelected();
866
867   mySelection->Select();
868   myMainPM->ClearImmediateDraw();
869
870   if (theToUpdateViewer)
871     UpdateCurrentViewer();
872 }
873
874 //=======================================================================
875 //function : UpdateSelected
876 //purpose  :
877 //=======================================================================
878 void AIS_InteractiveContext::UpdateSelected (const Standard_Boolean theToUpdateViewer)
879 {
880   if (HasOpenedContext())
881   {
882     return myLocalContexts(myCurLocalIndex)->UpdateSelected (theToUpdateViewer);
883   }
884
885   HilightSelected (theToUpdateViewer);
886 }
887
888 //=======================================================================
889 //function : SetSelected
890 //purpose  : Sets the whole object as selected and highlights it with selection color
891 //=======================================================================
892 void AIS_InteractiveContext::SetSelected (const Handle(AIS_InteractiveObject)& theObject,
893                                           const Standard_Boolean theToUpdateViewer)
894 {
895   if(HasOpenedContext())
896   {
897     return myLocalContexts (myCurLocalIndex)->SetSelected (theObject, theToUpdateViewer);
898   }
899
900   if (theObject.IsNull())
901     return;
902   if(!myObjects.IsBound (theObject))
903     Display (theObject, Standard_False);
904   if (theObject->HasSelection (0))
905     return;
906
907   if (NbSelected() == 1 && myObjects (theObject)->IsHilighted())
908   {
909     Quantity_NameOfColor aHiCol;
910     Standard_Boolean hasHiCol = Standard_False;
911     if (IsHilighted (theObject, hasHiCol, aHiCol))
912     {
913       if (hasHiCol && aHiCol!= mySelectionColor)
914       {
915         HilightWithColor (theObject, mySelectionColor, theToUpdateViewer);
916       }
917     }
918     return;
919   }
920
921   for (mySelection->Init(); mySelection->More(); mySelection->Next())
922   {
923     const Handle(SelectMgr_EntityOwner) anOwner =
924       Handle(SelectMgr_EntityOwner)::DownCast (mySelection->Value());
925     if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner))
926       continue;
927
928     Handle(AIS_InteractiveObject) aSelectable =
929       Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
930     Unhilight (aSelectable, Standard_False);
931     anOwner->State (0);
932     if (anOwner == aSelectable->GlobalSelOwner())
933     {
934       myObjects.ChangeFind (aSelectable)->SetHilightStatus (Standard_False);
935     }
936   }
937
938   // added to avoid untimely viewer update...
939   const Handle(SelectMgr_Selection)& aSel = theObject->Selection (0);
940   if (aSel->IsEmpty())
941     return;
942   aSel->Init();
943   Handle(SelectMgr_EntityOwner) anOwner =
944     Handle(SelectMgr_EntityOwner)::DownCast (aSel->Sensitive()->BaseSensitive()->OwnerId());
945   mySelection->ClearAndSelect (anOwner);
946   anOwner->State (1);
947   if (anOwner == theObject->GlobalSelOwner())
948   {
949     Handle(AIS_GlobalStatus)& aState = myObjects.ChangeFind (theObject);
950     aState->SetHilightStatus (Standard_True);
951     aState->SetHilightColor (mySelectionColor);
952   }
953   Quantity_NameOfColor aHiCol;
954   Standard_Boolean hasHiCol = Standard_False;
955   if (IsHilighted (theObject, hasHiCol, aHiCol))
956   {
957     if (hasHiCol && aHiCol!= mySelectionColor)
958     {
959       HilightWithColor (theObject, mySelectionColor, Standard_False);
960     }
961   }
962   else
963   {
964     HilightWithColor (theObject, mySelectionColor, Standard_False);
965   }
966
967   if (theToUpdateViewer)
968     UpdateCurrentViewer();
969 }
970
971 //=======================================================================
972 //function : SetSelected
973 //purpose  : Sets the whole object as selected and highlights it with selection color
974 //=======================================================================
975 void AIS_InteractiveContext::SetSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
976                                           const Standard_Boolean theToUpdateViewer)
977 {
978   if (theOwner.IsNull() || !theOwner->HasSelectable() || !myFilters->IsOk (theOwner))
979     return;
980
981   const Handle(AIS_InteractiveObject) anObject =
982     Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
983
984   if (NbSelected() == 1 && theOwner->IsSelected())
985   {
986     Quantity_NameOfColor aCustomColor;
987     Standard_Boolean isCustomColorSet;
988     if (IsHilighted (theOwner, isCustomColorSet, aCustomColor))
989     {
990       if (isCustomColorSet && aCustomColor != mySelectionColor)
991       {
992         const Standard_Integer aHiMode = anObject->HasHilightMode() ? anObject->HilightMode() : 0;
993         theOwner->HilightWithColor (myMainPM, mySelectionColor, aHiMode);
994       }
995     }
996     return;
997   }
998
999   if (!myObjects.IsBound (anObject))
1000     Display (anObject, Standard_False);
1001
1002   unhighlightSelected();
1003
1004   mySelection->ClearAndSelect (theOwner);
1005   theOwner->State (1);
1006   Quantity_NameOfColor aCustomColor;
1007   Standard_Boolean isCustomColorSet;
1008   if (!IsHilighted (theOwner, isCustomColorSet, aCustomColor) || (isCustomColorSet && aCustomColor!= mySelectionColor))
1009   {
1010     highlightSelected (theOwner, mySelectionColor);
1011   }
1012
1013   if (theOwner == anObject->GlobalSelOwner())
1014   {
1015     Handle(AIS_GlobalStatus)& aState = myObjects.ChangeFind (anObject);
1016     aState->SetHilightStatus (Standard_True);
1017     aState->SetHilightColor (mySelectionColor);
1018   }
1019
1020   if (theToUpdateViewer)
1021     UpdateCurrentViewer();
1022 }
1023
1024 //=======================================================================
1025 //function : AddOrRemoveSelected
1026 //purpose  : Adds or removes current object from AIS selection and highlights/unhighlights it.
1027 //           Since this method makes sence only for neutral point selection of a whole object,
1028 //           if 0 selection of the object is empty this method simply does nothing.
1029 //=======================================================================
1030 void AIS_InteractiveContext::AddOrRemoveSelected (const Handle(AIS_InteractiveObject)& theObject,
1031                                                   const Standard_Boolean theToUpdateViewer)
1032 {
1033   if (theObject.IsNull())
1034     return;
1035
1036   if (HasOpenedContext())
1037     return myLocalContexts (myCurLocalIndex)->AddOrRemoveSelected (theObject, theToUpdateViewer);
1038
1039   const Standard_Integer aGlobalSelMode = theObject->GlobalSelectionMode();
1040   if (!myObjects.IsBound (theObject) || !theObject->HasSelection (aGlobalSelMode))
1041     return;
1042
1043   if (!theObject->HasInteractiveContext())
1044     theObject->SetContext (this);
1045
1046   const Handle(SelectMgr_EntityOwner) anOwner = theObject->GlobalSelOwner();
1047
1048   if (anOwner.IsNull() || !anOwner->HasSelectable())
1049     return;
1050
1051   AddOrRemoveSelected (anOwner, theToUpdateViewer);
1052 }
1053 //=======================================================================
1054 //function : AddOrRemoveSelected
1055 //purpose  : 
1056 //=======================================================================
1057
1058 void AIS_InteractiveContext::AddOrRemoveSelected (const TopoDS_Shape& aShap,
1059                                             const Standard_Boolean updateviewer)
1060
1061   if(!HasOpenedContext()) {
1062 #ifdef OCCT_DEBUG
1063     cout<<" Attempt to remove a selected shape with no opened local context"<<endl;
1064 #endif
1065     return;
1066   }
1067   
1068   myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected(aShap,updateviewer);
1069   if(updateviewer) UpdateCurrentViewer();
1070   
1071 }
1072
1073 //=======================================================================
1074 //function : AddOrRemoveSelected
1075 //purpose  : Allows to highlight or unhighlight the owner given depending on
1076 //           its selection status
1077 //=======================================================================
1078 void AIS_InteractiveContext::AddOrRemoveSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
1079                                                   const Standard_Boolean theToUpdateViewer)
1080 {
1081   if (HasOpenedContext())
1082     return myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected (theOwner, theToUpdateViewer);
1083
1084   if (theOwner.IsNull() || !theOwner->HasSelectable())
1085     return;
1086
1087   AIS_SelectStatus aSelStat = mySelection->Select (theOwner);
1088
1089   Standard_Integer aState = aSelStat == AIS_SS_Added ?  1 : 0;
1090   theOwner->State (aState);
1091   const Handle(AIS_InteractiveObject) anObj =
1092     Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
1093   const Standard_Boolean isGlobal = anObj->GlobalSelOwner() == theOwner;
1094   Handle(AIS_GlobalStatus)& aStatus = myObjects.ChangeFind (anObj);
1095   const Standard_Integer aHiMode = anObj->HasHilightMode() ? anObj->HilightMode() : 0;
1096   if (aState == 1)
1097   {
1098     highlightSelected (theOwner, mySelectionColor);
1099     if (isGlobal)
1100     {
1101       aStatus->SetHilightStatus (Standard_True);
1102       aStatus->SetHilightColor (mySelectionColor);
1103     }
1104   }
1105   else
1106   {
1107     if (theOwner->IsAutoHilight())
1108       theOwner->Unhilight (myMainPM, aHiMode);
1109     else
1110       anObj->ClearSelected();
1111     aStatus->SetHilightStatus (Standard_False);
1112     aStatus->SetHilightColor (Quantity_NOC_WHITE);
1113   }
1114
1115   if (theToUpdateViewer)
1116     UpdateCurrentViewer();
1117 }
1118
1119
1120 //=======================================================================
1121 //function : IsSelected
1122 //purpose  :
1123 //=======================================================================
1124 Standard_Boolean AIS_InteractiveContext::IsSelected (const Handle(AIS_InteractiveObject)& theObj) const
1125 {
1126   if(HasOpenedContext())
1127     return myLocalContexts(myCurLocalIndex)->IsSelected (theObj);
1128
1129   if (theObj.IsNull() || !myObjects.IsBound (theObj))
1130     return Standard_False;
1131
1132   const Standard_Integer aGlobalSelMode = theObj->GlobalSelectionMode();
1133   const TColStd_ListOfInteger& anActivatedModes = myObjects (theObj)->SelectionModes();
1134   Standard_Boolean isGlobalModeActivated = Standard_False;
1135   for (TColStd_ListIteratorOfListOfInteger aModeIter (anActivatedModes); aModeIter.More(); aModeIter.Next())
1136   {
1137     if (aModeIter.Value() == aGlobalSelMode)
1138     {
1139       isGlobalModeActivated = Standard_True;
1140       break;
1141     }
1142   }
1143   if (!theObj->HasSelection (aGlobalSelMode) || !isGlobalModeActivated || theObj->GlobalSelOwner().IsNull())
1144     return Standard_False;
1145
1146   return theObj->GlobalSelOwner()->State() == 1;
1147 }
1148
1149 //=======================================================================
1150 //function : IsSelected
1151 //purpose  : Returns true is the owner given is selected
1152 //=======================================================================
1153 Standard_Boolean AIS_InteractiveContext::IsSelected (const Handle(SelectMgr_EntityOwner)& theOwner) const
1154 {
1155   if (HasOpenedContext())
1156     return myLocalContexts(myCurLocalIndex)->IsSelected (theOwner);
1157
1158   if (theOwner.IsNull())
1159     return Standard_False;
1160
1161   return theOwner->IsSelected();
1162 }
1163
1164 //=======================================================================
1165 //function : InitSelected
1166 //purpose  :
1167 //=======================================================================
1168 void AIS_InteractiveContext::InitSelected()
1169 {
1170   if (HasOpenedContext())
1171   {
1172     myLocalContexts (myCurLocalIndex)->InitSelected();
1173     return;
1174   }
1175
1176   mySelection->Init();
1177 }
1178
1179 //=======================================================================
1180 //function : MoreSelected
1181 //purpose  :
1182 //=======================================================================
1183 Standard_Boolean AIS_InteractiveContext::MoreSelected() const
1184 {
1185   if (HasOpenedContext())
1186     return myLocalContexts (myCurLocalIndex)->MoreSelected();
1187
1188   return mySelection->More();
1189 }
1190
1191 //=======================================================================
1192 //function : NextSelected
1193 //purpose  :
1194 //=======================================================================
1195 void AIS_InteractiveContext::NextSelected()
1196 {
1197   if(HasOpenedContext())
1198   {
1199     return myLocalContexts (myCurLocalIndex)->NextSelected();
1200     return;
1201   }
1202
1203   mySelection->Next();
1204 }
1205
1206 //=======================================================================
1207 //function : HasSelectedShape
1208 //purpose  :
1209 //=======================================================================
1210 Standard_Boolean AIS_InteractiveContext::HasSelectedShape() const
1211 {
1212   if(HasOpenedContext())
1213   {
1214     return myLocalContexts(myCurLocalIndex)->HasSelectedShape();
1215   }
1216
1217   Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (SelectedInteractive());
1218   return !aShape.IsNull();
1219 }
1220
1221 //=======================================================================
1222 //function : SelectedShape
1223 //purpose  :
1224 //=======================================================================
1225 TopoDS_Shape AIS_InteractiveContext::SelectedShape() const
1226 {
1227   if (HasOpenedContext())
1228   {
1229     return myLocalContexts (myCurLocalIndex)->SelectedShape();
1230   }
1231
1232   if (mySelection->Extent() == 0)
1233     return TopoDS_Shape();
1234
1235   const Handle(StdSelect_BRepOwner) anOwner =
1236     Handle(StdSelect_BRepOwner)::DownCast (mySelection->Value());
1237   if (!anOwner->HasSelectable())
1238     return TopoDS_Shape();
1239
1240   return anOwner->Shape().Located (anOwner->Location() * anOwner->Shape().Location());
1241 }
1242
1243 //=======================================================================
1244 //function : SelectedInteractive
1245 //purpose  :
1246 //=======================================================================
1247 Handle(AIS_InteractiveObject) AIS_InteractiveContext::SelectedInteractive() const 
1248 {
1249   if (HasOpenedContext())
1250   {
1251     return myLocalContexts(myCurLocalIndex)->SelectedInteractive();
1252   }
1253
1254   const Handle(SelectMgr_EntityOwner) anOwner =
1255     Handle(SelectMgr_EntityOwner)::DownCast (mySelection->Value());
1256   if (anOwner.IsNull() || !anOwner->HasSelectable())
1257     return NULL;
1258
1259   return Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
1260 }
1261 //=======================================================================
1262 //function : SelectedOwner
1263 //purpose  :
1264 //=======================================================================
1265 Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::SelectedOwner() const
1266 {
1267   if(HasOpenedContext())
1268   {
1269     return myLocalContexts(myCurLocalIndex)->SelectedOwner();
1270   }
1271
1272   return mySelection->Extent() > 0 ?
1273     Handle(SelectMgr_EntityOwner)::DownCast (mySelection->Value()) : NULL;
1274 }
1275
1276 //=======================================================================
1277 //function : EntityOwners
1278 //purpose  : 
1279 //=======================================================================
1280 void AIS_InteractiveContext::EntityOwners(Handle(SelectMgr_IndexedMapOfOwner)& theOwners,
1281                                           const Handle(AIS_InteractiveObject)& theIObj,
1282                                           const Standard_Integer theMode) const 
1283 {
1284   if ( theIObj.IsNull() )
1285       return;
1286
1287   TColStd_ListOfInteger aModes;
1288   if ( theMode == -1 )
1289     ActivatedModes( theIObj, aModes );
1290   else
1291     aModes.Append( theMode );
1292
1293   if (theOwners.IsNull())
1294     theOwners = new SelectMgr_IndexedMapOfOwner();
1295
1296   TColStd_ListIteratorOfListOfInteger anItr( aModes );
1297   for (; anItr.More(); anItr.Next() )
1298   {
1299     int aMode = anItr.Value();
1300     if ( !theIObj->HasSelection( aMode ) )
1301       continue;
1302
1303     Handle(SelectMgr_Selection) aSel = theIObj->Selection(aMode);
1304
1305     for ( aSel->Init(); aSel->More(); aSel->Next() )
1306     {
1307       Handle(SelectBasics_SensitiveEntity) aEntity = aSel->Sensitive()->BaseSensitive();
1308       if ( aEntity.IsNull() )
1309         continue;
1310
1311       Handle(SelectMgr_EntityOwner) aOwner =
1312         Handle(SelectMgr_EntityOwner)::DownCast(aEntity->OwnerId());
1313       if ( !aOwner.IsNull() )
1314         theOwners->Add( aOwner );
1315     }
1316   }
1317 }
1318
1319 //=======================================================================
1320 //function : NbSelected
1321 //purpose  :
1322 //=======================================================================
1323 Standard_Integer AIS_InteractiveContext::NbSelected()
1324 {
1325   Standard_Integer aNbSelected = 0;
1326   for (InitSelected(); MoreSelected(); NextSelected())
1327   {
1328     aNbSelected++;
1329   }
1330
1331   return aNbSelected;
1332 }
1333
1334 //=======================================================================
1335 //function : HasApplicative
1336 //purpose  :
1337 //=======================================================================
1338   Standard_Boolean AIS_InteractiveContext::HasApplicative() const 
1339 {
1340   return SelectedInteractive()->HasOwner();
1341 }
1342
1343 //=======================================================================
1344 //function : Applicative
1345 //purpose  :
1346 //=======================================================================
1347 Handle(Standard_Transient) AIS_InteractiveContext::Applicative() const 
1348 {
1349   return SelectedInteractive()->GetOwner();
1350 }
1351
1352 //==================================================
1353 // Function: HasDetected
1354 // Purpose :
1355 //==================================================
1356 Standard_Boolean AIS_InteractiveContext::HasDetected() const
1357 {
1358   if(HasOpenedContext())
1359     return myLocalContexts(myCurLocalIndex)->HasDetected();
1360
1361   return !myLastPicked.IsNull();
1362 }
1363
1364 //=======================================================================
1365 //function : HasDetectedShape
1366 //purpose  : 
1367 //=======================================================================
1368
1369 Standard_Boolean AIS_InteractiveContext::HasDetectedShape() const 
1370 {
1371   if(HasOpenedContext())
1372     return myLocalContexts(myCurLocalIndex)->HasDetectedShape();
1373   return Standard_False;
1374 }
1375
1376 //=======================================================================
1377 //function : DetectedShape
1378 //purpose  : 
1379 //=======================================================================
1380
1381 const TopoDS_Shape&
1382 AIS_InteractiveContext::DetectedShape() const
1383 {
1384   return myLocalContexts(myCurLocalIndex)->DetectedShape();
1385 }                                           
1386
1387 //=======================================================================
1388 //function : DetectedInteractive
1389 //purpose  :
1390 //=======================================================================
1391 Handle(AIS_InteractiveObject) AIS_InteractiveContext::DetectedInteractive() const
1392 {
1393   if (HasOpenedContext())
1394     return myLocalContexts(myCurLocalIndex)->DetectedInteractive();
1395
1396   return Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
1397 }
1398
1399
1400 Standard_Boolean AIS_InteractiveContext::HasNextDetected() const 
1401 {
1402   if(!HasOpenedContext())
1403     return Standard_False; // temporaire
1404   else
1405     return myLocalContexts(myCurLocalIndex)->HasNextDetected();
1406   
1407 }
1408
1409
1410 //=======================================================================
1411 //function : DetectedOwner
1412 //purpose  : 
1413 //=======================================================================
1414 Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::DetectedOwner() const
1415 {
1416   if (HasOpenedContext())
1417     return myLocalContexts(myCurLocalIndex)->DetectedOwner();
1418
1419   return myLastPicked;
1420 }
1421
1422 //=======================================================================
1423 //function : HilightNextDetected
1424 //purpose  :
1425 //=======================================================================
1426 Standard_Integer AIS_InteractiveContext::HilightNextDetected (const Handle(V3d_View)& theView,
1427                                                               const Standard_Boolean  theToRedrawImmediate)
1428 {
1429   return HasOpenedContext()
1430        ? myLocalContexts (myCurLocalIndex)->HilightNextDetected (theView, theToRedrawImmediate)
1431        : 0;
1432     
1433 }
1434
1435 //=======================================================================
1436 //function : HilightNextDetected
1437 //purpose  :
1438 //=======================================================================
1439 Standard_Integer AIS_InteractiveContext::HilightPreviousDetected (const Handle(V3d_View)& theView,
1440                                                                   const Standard_Boolean  theToRedrawImmediate)
1441 {
1442   return HasOpenedContext()
1443        ? myLocalContexts (myCurLocalIndex)->HilightPreviousDetected (theView, theToRedrawImmediate)
1444        : 0;
1445     
1446 }
1447
1448 //=======================================================================
1449 //function : InitDetected
1450 //purpose  :
1451 //=======================================================================
1452 void AIS_InteractiveContext::InitDetected()
1453 {
1454   if (HasOpenedContext())
1455   {
1456     myLocalContexts(myCurLocalIndex)->InitDetected();
1457     return;
1458   }
1459
1460   if(myAISDetectedSeq.Length() != 0)
1461   {
1462     myAISCurDetected = 1;
1463   }
1464 }
1465
1466 //=======================================================================
1467 //function : MoreDetected
1468 //purpose  :
1469 //=======================================================================
1470 Standard_Boolean AIS_InteractiveContext::MoreDetected() const
1471 {
1472   if (HasOpenedContext())
1473   {
1474     return myLocalContexts(myCurLocalIndex)->MoreDetected();
1475   }
1476
1477   return (myAISCurDetected > 0 && myAISCurDetected <= myAISDetectedSeq.Length()) ?
1478           Standard_True : Standard_False;
1479 }
1480
1481 //=======================================================================
1482 //function : NextDetected
1483 //purpose  :
1484 //=======================================================================
1485 void AIS_InteractiveContext::NextDetected()
1486 {
1487   if(HasOpenedContext())
1488   {
1489     myLocalContexts(myCurLocalIndex)->NextDetected();
1490     return;
1491   }
1492
1493   myAISCurDetected++;
1494 }
1495
1496 //=======================================================================
1497 //function : DetectedCurrentShape
1498 //purpose  :
1499 //=======================================================================
1500 const TopoDS_Shape& AIS_InteractiveContext::DetectedCurrentShape() const
1501 {
1502   if (HasOpenedContext())
1503   {
1504     return myLocalContexts(myCurLocalIndex)->DetectedCurrentShape();
1505   }
1506
1507   Handle(AIS_Shape) aCurrentShape = Handle(AIS_Shape)::DownCast (DetectedCurrentObject());
1508
1509   if (aCurrentShape.IsNull())
1510   {
1511     return AIS_myDummyShape;
1512   }
1513
1514   return aCurrentShape->Shape();
1515 }
1516
1517 //=======================================================================
1518 //function : DetectedCurrentObject
1519 //purpose  :
1520 //=======================================================================
1521 Handle(AIS_InteractiveObject) AIS_InteractiveContext::DetectedCurrentObject() const
1522 {
1523   if (HasOpenedContext())
1524   {
1525     return myLocalContexts(myCurLocalIndex)->DetectedCurrentObject();
1526   }
1527
1528   return MoreDetected() ? myAISDetectedSeq(myAISCurDetected) : NULL;
1529 }
1530
1531 //=======================================================================
1532 //function : FirstSelectedObject
1533 //purpose  :
1534 //=======================================================================
1535 Handle(AIS_InteractiveObject) AIS_InteractiveContext::FirstSelectedObject()
1536 {
1537   Handle(AIS_InteractiveObject) anObject;
1538
1539   if (HasOpenedContext())
1540     return anObject;
1541
1542   InitSelected();
1543   if (MoreSelected())
1544   {
1545     return SelectedInteractive();
1546   }
1547   return anObject;
1548 }
1549
1550 //=======================================================================
1551 //function : RedrawImmediate
1552 //purpose  : Redisplays immediate strucures of the viewer given according to their visibility
1553 //=======================================================================
1554 void AIS_InteractiveContext::RedrawImmediate (const Handle(V3d_Viewer)& theViewer)
1555 {
1556   myMainPM->RedrawImmediate (theViewer);
1557 }