d82f767c21c73cf6ec38608637e440e9040f2223
[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 #include <AIS_InteractiveContext.jxx>
18 #include <SelectMgr_EntityOwner.hxx>
19 #include <StdSelect_ViewerSelector3d.hxx>
20 #include <AIS_Selection.hxx>
21 #include <AIS_StatusOfDetection.hxx>
22 #include <AIS_StatusOfPick.hxx>
23
24 #include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
25 #include <AIS_LocalContext.hxx>
26 #include <AIS_GlobalStatus.hxx>
27 #include <AIS_Shape.hxx>
28
29 #include <Aspect_Grid.hxx>
30
31 #include <V3d_Light.hxx>
32 #include <V3d_PositionalLight.hxx>
33 #include <V3d_SpotLight.hxx>
34 #include <V3d_DirectionalLight.hxx>
35 #include <V3d_AmbientLight.hxx>
36 #include <Visual3d_View.hxx>
37
38 #include <TColStd_ListIteratorOfListOfInteger.hxx>
39 #include <SelectMgr_Selection.hxx>
40 #include <SelectBasics_SensitiveEntity.hxx>
41
42 #include <Prs3d_Presentation.hxx>
43
44 #include <AIS_MapOfInteractive.hxx>
45 #include <AIS_MapIteratorOfMapOfInteractive.hxx>
46
47 //=======================================================================
48 //function : MoveTo
49 //purpose  :
50 //=======================================================================
51 AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer  theXPix,
52                                                       const Standard_Integer  theYPix,
53                                                       const Handle(V3d_View)& theView,
54                                                       const Standard_Boolean  theToRedrawOnUpdate)
55 {
56   if (HasOpenedContext())
57   {
58     myWasLastMain = Standard_True;
59     return myLocalContexts (myCurLocalIndex)->MoveTo (theXPix, theYPix, theView, theToRedrawOnUpdate);
60   }
61
62   myAISCurDetected = 0;
63   myAISDetectedSeq.Clear();
64
65   if (theView->Viewer() != myMainVwr)
66   {
67     return AIS_SOD_Error;
68   }
69
70   // preliminaires
71   myLastPicked  = myLastinMain;
72   myWasLastMain = Standard_True;
73   AIS_StatusOfDetection aStatus        = AIS_SOD_Nothing;
74   Standard_Boolean      toUpdateViewer = Standard_False;
75
76   myFilters->SetDisabledObjects (theView->View()->HiddenObjects());
77   myMainSel->Pick (theXPix, theYPix, theView);
78
79   // filling of myAISDetectedSeq sequence storing information about detected AIS objects
80   // (the objects must be AIS_Shapes)
81   const Standard_Integer aDetectedNb = myMainSel->NbPicked();
82   Standard_Integer aNewDetected = 0;
83   for (Standard_Integer aDetIter = 1; aDetIter <= aDetectedNb; ++aDetIter)
84   {
85     Handle(SelectMgr_EntityOwner) anOwner = myMainSel->Picked (aDetIter);
86     if (anOwner.IsNull()
87      || !myFilters->IsOk (anOwner))
88     {
89       continue;
90     }
91
92     if (aNewDetected < 1)
93     {
94       aNewDetected = aDetIter;
95     }
96     Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
97     if (!anObj.IsNull())
98     {
99       myAISDetectedSeq.Append (anObj);
100     }
101   }
102
103   if (aNewDetected >= 1)
104   {
105     // does nothing if previously detected object is equal to the current one
106     Handle(SelectMgr_EntityOwner) aNewPickedOwner = myMainSel->Picked (aNewDetected);
107     if (aNewPickedOwner->Selectable() == myLastPicked)
108     {
109       return myLastPicked->State() == 1
110            ? AIS_SOD_Selected
111            : AIS_SOD_OnlyOneDetected;
112     }
113  
114     // Previously detected object is unhilighted if it is not selected or hilighted 
115     // with selection color if it is selected. Such highlighting with selection color 
116     // is needed only if myToHilightSelected flag is true. In this case previously detected
117     // object has been already highlighted with myHilightColor during previous MoveTo() 
118     // method call. As result it is necessary to rehighligt it with mySelectionColor.
119     if (!myLastPicked.IsNull())
120     {
121       const Standard_Integer aHiMod = myLastPicked->HasHilightMode() ? myLastPicked->HilightMode() : 0;
122       if (myLastPicked->State() != 1)
123       {
124         myMainPM->Unhighlight (myLastPicked, aHiMod);
125         toUpdateViewer = Standard_True;
126       }
127       else if (myToHilightSelected)
128       {
129         myMainPM->Color (myLastPicked, mySelectionColor, aHiMod);
130         toUpdateViewer = Standard_True;
131       }
132     }
133
134     // initialize myLastPicked field with currently detected object
135     myLastPicked = Handle(AIS_InteractiveObject)::DownCast (aNewPickedOwner->Selectable());
136     myLastinMain = myLastPicked;
137
138     // highlight detected object if it is not selected or myToHilightSelected flag is true
139     if (!myLastPicked.IsNull())
140     {
141       if (myLastPicked->State() != 1 || myToHilightSelected)
142       {
143         const Standard_Integer aHiMod = myLastPicked->HasHilightMode() ? myLastPicked->HilightMode() : 0;
144         myMainPM->Color (myLastPicked, myHilightColor, aHiMod);
145         toUpdateViewer = Standard_True;
146       }
147
148       aStatus = myLastPicked->State() == 1
149               ? AIS_SOD_Selected
150               : AIS_SOD_OnlyOneDetected;
151     }
152   }
153   else 
154   {
155     // previously detected object is unhilighted if it is not selected or hilighted
156     // with selection color if it is selected
157     aStatus = AIS_SOD_Nothing;
158     if (!myLastPicked.IsNull())
159     {
160       Standard_Integer aHiMod = myLastPicked->HasHilightMode() ? myLastPicked->HilightMode() : 0;
161       if (myLastPicked->State() != 1)
162       {
163         myMainPM->Unhighlight (myLastPicked, aHiMod);
164         toUpdateViewer = Standard_True;
165       }
166       else if (myToHilightSelected)
167       {
168         myMainPM->Color (myLastPicked, mySelectionColor, aHiMod);
169         toUpdateViewer = Standard_True;
170       }
171     }
172
173     myLastinMain.Nullify();
174     myLastPicked.Nullify();
175   }
176
177   if (toUpdateViewer)
178   {
179     if (theToRedrawOnUpdate)
180     {
181       theView->Viewer()->Update();
182     }
183     else
184     {
185       theView->Viewer()->Invalidate();
186     }
187   }
188
189   mylastmoveview = theView;
190   return aStatus;
191 }
192
193 //=======================================================================
194 //function : Select
195 //purpose  : 
196 //=======================================================================
197 AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Integer  theXPMin,
198                                                  const Standard_Integer  theYPMin,
199                                                  const Standard_Integer  theXPMax,
200                                                  const Standard_Integer  theYPMax,
201                                                  const Handle(V3d_View)& theView,
202                                                  const Standard_Boolean  toUpdateViewer)
203 {
204   // all objects detected by the selector are taken, previous current objects are emptied,
205   // new objects are put...
206
207   if (HasOpenedContext())
208   {
209     return myLocalContexts(myCurLocalIndex)->Select (theXPMin, theYPMin,
210                                                      theXPMax, theYPMax,
211                                                      theView, toUpdateViewer);
212   }
213
214   ClearCurrents (Standard_False);
215
216   Handle(StdSelect_ViewerSelector3d) aSelector;
217
218   if (theView->Viewer() == myMainVwr)
219   {
220     aSelector = myMainSel;
221     myWasLastMain = Standard_True;
222   }
223
224   aSelector->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView);
225   AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
226
227   AIS_MapOfInteractive anObjectsToSelect;
228   for (aSelector->Init(); aSelector->More(); aSelector->Next())
229   {
230     Handle(AIS_InteractiveObject) anObj = 
231       Handle(AIS_InteractiveObject)::DownCast (aSelector->Picked()->Selectable());
232     if (!anObj.IsNull())
233     {
234       anObjectsToSelect.Add (anObj);
235     }
236   }
237
238   AIS_MapIteratorOfMapOfInteractive anIt (anObjectsToSelect);
239   for ( ; anIt.More(); anIt.Next())
240   {
241     AIS_Selection::Select (anIt.Key());
242     anIt.Key()->State (1);
243   }
244
245   HilightCurrents (toUpdateViewer);
246
247   Standard_Integer aSelNum = NbCurrents();
248
249   return (aSelNum == 0) ? AIS_SOP_NothingSelected
250                         : (aSelNum == 1) ? AIS_SOP_OneSelected
251                                          : AIS_SOP_SeveralSelected;
252   
253 }
254
255 //=======================================================================
256 //function : Select
257 //purpose  : Selection by polyline
258 //=======================================================================
259 AIS_StatusOfPick AIS_InteractiveContext::Select (const TColgp_Array1OfPnt2d& thePolyline,
260                                                  const Handle(V3d_View)&     theView,
261                                                  const Standard_Boolean      toUpdateViewer)
262 {
263   // all objects detected by the selector are taken, previous current objects are emptied,
264   // new objects are put...
265
266   if (HasOpenedContext())
267   {
268     return myLocalContexts(myCurLocalIndex)->Select (thePolyline, theView, toUpdateViewer);
269   }
270
271   ClearCurrents (Standard_False);
272
273   Handle(StdSelect_ViewerSelector3d) aSelector;
274
275   if (theView->Viewer() == myMainVwr)
276   {
277     aSelector = myMainSel;
278     myWasLastMain = Standard_True;
279   }
280
281   aSelector->Pick (thePolyline, theView);
282   AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
283
284   AIS_MapOfInteractive anObjectsToSelect;
285   for (aSelector->Init(); aSelector->More(); aSelector->Next())
286   {
287     Handle(AIS_InteractiveObject) anObj = 
288       Handle( AIS_InteractiveObject )::DownCast (aSelector->Picked()->Selectable());
289     if (!anObj.IsNull())
290     {
291       anObjectsToSelect.Add (anObj);
292     }
293   }
294
295   AIS_MapIteratorOfMapOfInteractive anIt (anObjectsToSelect);
296   for ( ; anIt.More(); anIt.Next())
297   {
298     AIS_Selection::Select (anIt.Key());
299     anIt.Key()->State (1);
300   }
301
302   HilightCurrents (toUpdateViewer);
303
304   Standard_Integer aSelNum = NbCurrents();
305
306   return (aSelNum == 0) ? AIS_SOP_NothingSelected
307                         : (aSelNum == 1) ? AIS_SOP_OneSelected
308                                          : AIS_SOP_SeveralSelected;
309   
310 }
311
312 //=======================================================================
313 //function : Select
314 //purpose  : 
315 //=======================================================================
316 AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Boolean toUpdateViewer)
317 {
318   if (HasOpenedContext())
319   {
320     if(myWasLastMain)
321     {
322       return myLocalContexts(myCurLocalIndex)->Select (toUpdateViewer);
323     }
324     else
325     {
326       myLocalContexts(myCurLocalIndex)->SetSelected (myLastPicked, toUpdateViewer);
327       return AIS_SOP_OneSelected;
328     }
329   }
330
331   if (myWasLastMain && !myLastinMain.IsNull())
332   {
333     if(myLastinMain->State() != 1)
334     {
335       SetCurrentObject (myLastinMain,Standard_False);
336       if(toUpdateViewer)
337       {
338         UpdateCurrentViewer();
339       }
340     }
341   }
342   else
343   {
344     AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
345     Handle(AIS_Selection) aSelection = AIS_Selection::CurrentSelection();
346     Handle(AIS_InteractiveObject) anObj;
347     for (aSelection->Init(); aSelection->More(); aSelection->Next())
348     {
349       anObj = Handle(AIS_InteractiveObject)::DownCast (aSelection->Value());
350       anObj->State (0);
351       Unhilight (anObj,Standard_False);
352       if (myObjects.IsBound (anObj) && myObjects(anObj)->IsSubIntensityOn())
353       {
354         HilightWithColor (anObj, mySubIntensity, Standard_False);
355       }
356     }
357
358     AIS_Selection::Select();
359     if (toUpdateViewer && myWasLastMain)
360     {
361         UpdateCurrentViewer();
362     }
363   }
364
365   Standard_Integer aSelNum = NbCurrents();
366
367   return (aSelNum == 0) ? AIS_SOP_NothingSelected
368                         : (aSelNum == 1) ? AIS_SOP_OneSelected
369                                          : AIS_SOP_SeveralSelected;
370 }
371
372 //=======================================================================
373 //function : ShiftSelect
374 //purpose  : 
375 //=======================================================================
376 AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Boolean toUpdateViewer)
377 {
378   if (HasOpenedContext())
379   {
380     if(myWasLastMain)
381     {
382       return myLocalContexts (myCurLocalIndex)->ShiftSelect (toUpdateViewer);
383     }
384     else
385     {
386       myLocalContexts (myCurLocalIndex)->AddOrRemoveSelected (myLastPicked, toUpdateViewer);
387
388       Standard_Integer aSelNum = NbSelected();
389       return (aSelNum == 0) ? AIS_SOP_NothingSelected
390                             : (aSelNum == 1) ? AIS_SOP_OneSelected
391                                              : AIS_SOP_SeveralSelected;
392     }
393   }
394
395   if (myWasLastMain && !myLastinMain.IsNull())
396   {
397     AddOrRemoveCurrentObject (myLastinMain, toUpdateViewer);
398   }
399
400   Standard_Integer aCurrentSelNum = NbCurrents();
401
402   return (aCurrentSelNum == 0) ? AIS_SOP_NothingSelected
403                                : (aCurrentSelNum == 1) ? AIS_SOP_OneSelected
404                                                        : AIS_SOP_SeveralSelected;
405 }
406
407 //=======================================================================
408 //function : ShiftSelect
409 //purpose  : 
410 //=======================================================================
411 AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Integer theXPMin,
412                                                       const Standard_Integer theYPMin,
413                                                       const Standard_Integer theXPMax,
414                                                       const Standard_Integer theYPMax,
415                                                       const Handle(V3d_View)& theView,
416                                                       const Standard_Boolean toUpdateViewer)
417 {
418   if (HasOpenedContext())
419   {
420     return myLocalContexts(myCurLocalIndex)->ShiftSelect (theXPMin, theYPMin, theXPMax, theYPMax,
421                                                           theView, toUpdateViewer);
422   }
423
424   UnhilightCurrents (Standard_False);
425
426   Handle(StdSelect_ViewerSelector3d) aSelector;
427   if (theView->Viewer() == myMainVwr)
428   {
429     aSelector = myMainSel;
430     myWasLastMain = Standard_True;
431   }
432   else
433   {
434     return AIS_SOP_NothingSelected;
435   }
436
437   aSelector->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView);
438   AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
439   for (aSelector->Init(); aSelector->More(); aSelector->Next())
440   {
441     Handle(AIS_InteractiveObject) anObjToSelect =  Handle(AIS_InteractiveObject)::DownCast (aSelector->Picked()->Selectable());
442     if (!anObjToSelect.IsNull())
443     {
444       AIS_SelectStatus aSelStatus = AIS_Selection::Select (anObjToSelect);
445       Standard_Integer aState = (aSelStatus == AIS_SS_Added) ? 1 : 0;
446       anObjToSelect->State (aState);
447     }
448   }
449
450   HilightCurrents (toUpdateViewer);
451
452   Standard_Integer aSelNum = NbCurrents();
453
454   return (aSelNum == 0) ? AIS_SOP_NothingSelected
455                         : (aSelNum == 1) ? AIS_SOP_OneSelected
456                                          : AIS_SOP_SeveralSelected;
457
458 }
459
460 //=======================================================================
461 //function : ShiftSelect
462 //purpose  : 
463 //=======================================================================
464 AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const TColgp_Array1OfPnt2d& thePolyline,
465                                                       const Handle(V3d_View)& theView,
466                                                       const Standard_Boolean toUpdateViewer)
467 {
468   if (HasOpenedContext())
469   {
470     return myLocalContexts(myCurLocalIndex)->ShiftSelect (thePolyline, theView, toUpdateViewer);
471   }
472
473   UnhilightCurrents (Standard_False);
474
475   Handle(StdSelect_ViewerSelector3d) aSelector;
476
477   if (theView->Viewer() == myMainVwr)
478   {
479     aSelector= myMainSel;
480     myWasLastMain = Standard_True;
481   }
482   else
483   {
484     return AIS_SOP_NothingSelected;
485   }
486
487   aSelector->Pick (thePolyline, theView);
488
489   AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
490   for (aSelector->Init(); aSelector->More(); aSelector->Next())
491   {
492     Handle(AIS_InteractiveObject) anObjToSelect = Handle(AIS_InteractiveObject)::DownCast (aSelector->Picked()->Selectable());
493     if (!anObjToSelect.IsNull())
494     {
495       AIS_SelectStatus aSelStatus = AIS_Selection::Select (anObjToSelect);
496       Standard_Integer aState = (aSelStatus == AIS_SS_Added ) ? 1 : 0;
497       anObjToSelect->State (aState);
498     }
499   }
500
501   HilightCurrents (toUpdateViewer);
502
503   Standard_Integer aSelNum = NbCurrents();
504
505   return (aSelNum == 0) ? AIS_SOP_NothingSelected
506                         : (aSelNum == 1) ? AIS_SOP_OneSelected
507                                          : AIS_SOP_SeveralSelected;
508 }
509
510 //=======================================================================
511 //function : SetCurrentObject
512 //purpose  : 
513 //=======================================================================
514 void AIS_InteractiveContext::SetCurrentObject(const Handle(AIS_InteractiveObject)& anIObj,
515                                               const Standard_Boolean updateviewer)
516 {
517   // single case processing...
518   if(NbCurrents()==1 && anIObj->State()==1){
519     Quantity_NameOfColor HiCol;
520     Standard_Boolean HasHiCol;
521     if(IsHilighted(anIObj,HasHiCol,HiCol)){
522       if(HasHiCol && HiCol!= mySelectionColor) {
523         HilightWithColor(anIObj,mySelectionColor,updateviewer);
524       }
525     }
526     return;
527   }
528
529
530   // 
531   if(!HasOpenedContext()) {
532     if(anIObj.IsNull()) return;
533     if(!myObjects.IsBound(anIObj)) 
534       Display(anIObj,Standard_False);
535     
536     AIS_Selection::SetCurrentSelection(myCurrentName.ToCString());
537     Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
538     Handle(Standard_Transient) TR;
539     Handle(AIS_InteractiveObject) IO;
540     sel->Init();
541     while (sel->More()) {
542       TR = sel->Value();
543       IO = *((Handle(AIS_InteractiveObject)*)&TR);
544       Unhilight(IO,Standard_False);
545       IO->State(0);
546       sel->Next();
547     }
548     
549     // added to avoid untimely viewer update...
550     AIS_Selection::ClearAndSelect(anIObj);
551     anIObj->State(1);
552     Quantity_NameOfColor HiCol;
553     Standard_Boolean HasHiCol;
554     if(IsHilighted(anIObj,HasHiCol,HiCol)){
555       if(HasHiCol && HiCol!= mySelectionColor) {
556           HilightWithColor(anIObj,mySelectionColor,Standard_False);
557       }
558     }
559     else{
560         HilightWithColor(anIObj,mySelectionColor,Standard_False);
561     }
562     if (updateviewer) 
563       UpdateCurrentViewer();
564   }
565   else{
566 #ifdef OCCT_DEBUG
567     cout<<"Nothing Done : Opened Local Context"<<endl;
568 #endif
569   }
570 }
571
572 //=======================================================================
573 //function : AddOrRemoveCurrentObject
574 //purpose  : 
575 //=======================================================================
576
577 void AIS_InteractiveContext::
578 AddOrRemoveCurrentObject(const Handle(AIS_InteractiveObject)& anIObj,
579                          const Standard_Boolean updateviewer)
580 {
581   if(anIObj.IsNull()) return;
582 //OCC5682 to remove an object from neutral point even if Local Context is opened (Remove method)
583   if(!HasOpenedContext() /*OCC5682*/|| myObjects.IsBound(anIObj)) {
584     
585     AIS_Selection::SetCurrentSelection(myCurrentName.ToCString());
586     Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
587
588     AIS_SelectStatus SelStat = AIS_Selection::Select(anIObj);
589     
590     Standard_Integer mod = (SelStat==AIS_SS_Added) ? 1 : 0;
591     anIObj->State(mod);
592     if(mod==1)
593       HilightWithColor(anIObj,mySelectionColor,Standard_False);
594     else 
595       Unhilight(anIObj,Standard_False);
596     
597     
598     if(updateviewer) 
599       UpdateCurrentViewer();
600   }
601   else{
602 #ifdef OCCT_DEBUG
603     cout<<"Nothing Done : Opened Local Context"<<endl;
604 #endif
605   }
606 }
607 //=======================================================================
608 //function : UpdateCurrent
609 //purpose  : 
610 //=======================================================================
611
612 void AIS_InteractiveContext::UpdateCurrent()
613 {
614   HilightCurrents();
615 }
616
617 //=======================================================================
618 //function : IsCurrent
619 //purpose  : 
620 //=======================================================================
621
622 Standard_Boolean AIS_InteractiveContext::IsCurrent(const Handle(AIS_InteractiveObject)& anIObj) const 
623 {
624
625   if (anIObj.IsNull()) return Standard_False;
626   return (anIObj->State()==1);
627   
628   //   Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
629   //   sel->Init();
630   //   while (sel->More()) {
631   //     if (anIObj == sel->Value()) return Standard_True;
632   //     sel->Next();
633   //   }
634   //   return Standard_False;
635
636 }
637
638 //=======================================================================
639 //function : InitCurrent
640 //purpose  : 
641 //=======================================================================
642
643 void AIS_InteractiveContext::InitCurrent()
644 {
645   AIS_Selection::Selection(myCurrentName.ToCString())->Init();
646 }
647
648 //=======================================================================
649 //function : MoreCurrent
650 //purpose  : 
651 //=======================================================================
652
653 Standard_Boolean AIS_InteractiveContext::MoreCurrent() const 
654 {
655   return AIS_Selection::Selection(myCurrentName.ToCString())->More();
656
657 }
658
659 //=======================================================================
660 //function : NextCurrent
661 //purpose  : 
662 //=======================================================================
663
664 void AIS_InteractiveContext::NextCurrent()
665 {
666   AIS_Selection::Selection(myCurrentName.ToCString())->Next();
667 }
668
669 //=======================================================================
670 //function : Current
671 //purpose  : 
672 //=======================================================================
673
674 Handle(AIS_InteractiveObject) AIS_InteractiveContext::Current() const 
675 {
676   Handle(Standard_Transient) TR = AIS_Selection::Selection(myCurrentName.ToCString())->Value();
677   Handle(AIS_InteractiveObject) IO = *((Handle(AIS_InteractiveObject)*)&TR);
678   return IO;
679 }
680
681 //=======================================================================
682 //function : FirstCurrentObject
683 //purpose  : 
684 //=======================================================================
685 Handle(AIS_InteractiveObject) AIS_InteractiveContext::FirstCurrentObject()  
686 {
687   Handle(AIS_InteractiveObject) IO ;
688   InitCurrent();
689   if(MoreCurrent()){
690     return Current();
691   }
692   return IO;
693 }
694
695 //=======================================================================
696 //function : NbCurrents
697 //purpose  : 
698 //=======================================================================
699 Standard_Integer AIS_InteractiveContext::NbCurrents()
700 {
701   Standard_Integer i(0);
702   for(InitCurrent();MoreCurrent();NextCurrent())
703     {i++;}
704   return i;
705 }
706
707 //=======================================================================
708 //function : HilightCurrents
709 //purpose  : 
710 //=======================================================================
711 void AIS_InteractiveContext::HilightCurrents(const Standard_Boolean updateviewer)
712 {
713   AIS_Selection::SetCurrentSelection(myCurrentName.ToCString());
714   Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
715   Handle(Standard_Transient) TR;
716   Handle(AIS_InteractiveObject) IO;
717   sel->Init();
718   while (sel->More()) {
719     TR = sel->Value();
720     IO = *((Handle(AIS_InteractiveObject)*)&TR);
721     HilightWithColor(IO,mySelectionColor,Standard_False);
722     sel->Next();
723   }
724   if(updateviewer) 
725     UpdateCurrentViewer();
726 }
727
728 //=======================================================================
729 //function : UnhilightCurrents
730 //purpose  : 
731 //=======================================================================
732
733 void AIS_InteractiveContext::UnhilightCurrents(const Standard_Boolean updateviewer)
734 {
735   AIS_Selection::SetCurrentSelection(myCurrentName.ToCString());
736   Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
737   Handle(Standard_Transient) TR;
738   Handle(AIS_InteractiveObject) IO;
739   sel->Init();
740   while (sel->More()) {
741     TR = sel->Value();
742     IO = *((Handle(AIS_InteractiveObject)*)&TR);
743     Unhilight(IO,Standard_False);
744     sel->Next();
745   }
746   if(updateviewer) 
747     UpdateCurrentViewer();
748 }
749
750 //=======================================================================
751 //function : ClearCurrents
752 //purpose  : 
753 //=======================================================================
754
755 void AIS_InteractiveContext::ClearCurrents(const Standard_Boolean updateviewer)
756 {
757   if(NbCurrents()==0) return;
758   AIS_Selection::SetCurrentSelection(myCurrentName.ToCString());
759   Handle(AIS_Selection) S = AIS_Selection::CurrentSelection();
760   Handle(Standard_Transient) Tr;
761   Handle(AIS_InteractiveObject) IO;
762   for(S->Init();S->More();S->Next()){
763     Tr = S->Value();
764     IO = (*((Handle(AIS_InteractiveObject)*)&Tr));
765     IO->State(0);
766     Unhilight(IO,Standard_False);
767   }
768   AIS_Selection::Select();
769   if(updateviewer)
770     UpdateCurrentViewer();
771 }
772
773
774 //=======================================================================
775 //function : HilightSelected
776 //purpose  : 
777 //=======================================================================
778
779 void AIS_InteractiveContext::HilightSelected(const Standard_Boolean updateviewer)
780 {
781   if(!HasOpenedContext()){
782     AIS_Selection::SetCurrentSelection(mySelectionName.ToCString());
783     Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
784     Handle(Standard_Transient) TR;
785     Handle(AIS_InteractiveObject) IO;
786     sel->Init();
787     while (sel->More()) {
788       TR = sel->Value();
789       IO = *((Handle(AIS_InteractiveObject)*)&TR);
790       HilightWithColor(IO,mySelectionColor,Standard_False);
791       sel->Next();
792     }
793   }
794   else
795     {
796       myLocalContexts(myCurLocalIndex)->HilightPicked(updateviewer);
797     }
798   if(updateviewer)
799     UpdateCurrentViewer();
800 }
801
802 //=======================================================================
803 //function : UnhilightSelected
804 //purpose  : 
805 //=======================================================================
806
807 void AIS_InteractiveContext::UnhilightSelected(const Standard_Boolean updateviewer)
808 {
809   if(!HasOpenedContext()){
810     AIS_Selection::SetCurrentSelection(mySelectionName.ToCString());
811     Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
812     Handle(Standard_Transient) TR;
813     Handle(AIS_InteractiveObject) IO;
814     sel->Init();
815     while (sel->More()) {
816       TR = sel->Value();
817       IO = *((Handle(AIS_InteractiveObject)*)&TR);
818       Unhilight(IO,Standard_False);
819       sel->Next();
820     }
821     if(updateviewer)
822       UpdateCurrentViewer();
823   }
824   else
825     {
826       myLocalContexts(myCurLocalIndex)->UnhilightPicked(updateviewer);
827     }
828 }
829
830
831 //=======================================================================
832 //function : ClearSelected
833 //purpose  : 
834 //=======================================================================
835
836 void AIS_InteractiveContext::ClearSelected(const Standard_Boolean updateviewer)
837 {
838   if(!HasOpenedContext())
839     ClearCurrents(updateviewer);
840   else 
841     myLocalContexts(myCurLocalIndex)->ClearSelected(updateviewer);
842   
843 }
844
845
846 //=======================================================================
847 //function : SetSelectedCurrent
848 //purpose  : 
849 //=======================================================================
850
851 void AIS_InteractiveContext::SetSelectedCurrent()
852 {
853
854
855 #ifdef OCCT_DEBUG
856   cout<<"Not Yet Implemented"<<endl;
857 #endif
858 }
859
860 //=======================================================================
861 //function : UpdateSelection
862 //purpose  : 
863 //=======================================================================
864
865 void AIS_InteractiveContext::UpdateSelected(const Standard_Boolean updateviewer)
866 {
867   if(!HasOpenedContext()) {
868     HilightSelected();
869 #ifndef BUG
870     return;
871 #endif
872   }
873   myLocalContexts(myCurLocalIndex)->UpdateSelected(updateviewer);
874 }
875
876 //=======================================================================
877 //function : SetCurrentObject
878 //purpose  : 
879 //=======================================================================
880 void AIS_InteractiveContext::SetSelected(const Handle(AIS_InteractiveObject)& anIObj,const Standard_Boolean updateviewer)
881 {
882   if(!HasOpenedContext()) 
883     SetCurrentObject(anIObj,updateviewer);
884   else
885     myLocalContexts(myCurLocalIndex)->SetSelected(anIObj,updateviewer);
886 }
887
888 //=======================================================================
889 //function : AddOrRemoveSelected
890 //purpose  : 
891 //=======================================================================
892
893 void AIS_InteractiveContext::AddOrRemoveSelected(const Handle(AIS_InteractiveObject)& anIObj,
894                                                  const Standard_Boolean updateviewer)
895 {
896   if(!anIObj->HasInteractiveContext()) anIObj->SetContext(this);
897   if(!HasOpenedContext())
898     AddOrRemoveCurrentObject(anIObj,updateviewer);
899   else
900     myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected(anIObj,updateviewer);
901   
902 }
903 //=======================================================================
904 //function : AddOrRemoveSelected
905 //purpose  : 
906 //=======================================================================
907
908 void AIS_InteractiveContext::AddOrRemoveSelected(const TopoDS_Shape& aShap,
909                                             const Standard_Boolean updateviewer)
910
911   if(!HasOpenedContext()) {
912 #ifdef OCCT_DEBUG
913     cout<<" Attempt to remove a selected shape with no opened local context"<<endl;
914 #endif
915     return;
916   }
917   
918   myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected(aShap,updateviewer);
919   if(updateviewer) UpdateCurrentViewer();
920   
921 }
922 //=======================================================================
923 //function : AddOrRemoveSelected
924 //purpose  : 
925 //=======================================================================
926
927 void AIS_InteractiveContext::AddOrRemoveSelected(const Handle(SelectMgr_EntityOwner)& Own,
928                                                  const Standard_Boolean updateviewer)
929
930   if(!HasOpenedContext()) {
931 #ifdef OCCT_DEBUG
932     cout<<" Attempt to remove a selected ownr with no opened local context"<<endl;
933 #endif
934     return;
935   }
936   
937   myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected(Own,Standard_False);
938   if(updateviewer) UpdateCurrentViewer();
939   
940 }
941
942
943
944 //=======================================================================
945 //function : IsSelected
946 //purpose  : 
947 //=======================================================================
948
949 Standard_Boolean AIS_InteractiveContext::
950 IsSelected(const Handle(AIS_InteractiveObject)& anIObj) const 
951 {
952   if (anIObj.IsNull()) return Standard_False;
953   
954   if(!HasOpenedContext()) 
955     return (anIObj->State()==1);
956   else 
957     return myLocalContexts(myCurLocalIndex)->IsSelected(anIObj);
958 }
959
960
961 //=======================================================================
962 //function : InitSelected
963 //purpose  : 
964 //=======================================================================
965
966 void AIS_InteractiveContext::InitSelected()
967 {
968   if(!HasOpenedContext())
969     AIS_Selection::Selection(myCurrentName.ToCString())->Init();
970   else
971     myLocalContexts(myCurLocalIndex)->InitSelected();
972 }
973
974 //=======================================================================
975 //function : MoreSelected
976 //purpose  : 
977 //=======================================================================
978
979 Standard_Boolean AIS_InteractiveContext::MoreSelected() const 
980 {
981   if(!HasOpenedContext())
982     return AIS_Selection::Selection(myCurrentName.ToCString())->More();
983   return myLocalContexts(myCurLocalIndex)->MoreSelected();
984 }
985
986 //=======================================================================
987 //function : NextSelected
988 //purpose  : 
989 //=======================================================================
990
991 void AIS_InteractiveContext::NextSelected()
992 {
993   if(!HasOpenedContext())
994     AIS_Selection::Selection(myCurrentName.ToCString())->Next();
995   else
996     myLocalContexts(myCurLocalIndex)->NextSelected();
997 }
998
999 //=======================================================================
1000 //function : HasSelectedShape
1001 //purpose  : 
1002 //=======================================================================
1003
1004 Standard_Boolean AIS_InteractiveContext::HasSelectedShape() const 
1005 {
1006   if(!HasOpenedContext()) {
1007     Handle(AIS_Shape) shape = 
1008         Handle(AIS_Shape)::DownCast(SelectedInteractive());
1009     if( !shape.IsNull() ) return Standard_True;
1010     return Standard_False;
1011   }
1012   return myLocalContexts(myCurLocalIndex)->HasSelectedShape();
1013 }
1014
1015 //=======================================================================
1016 //function : SelectedShape
1017 //purpose  : 
1018 //=======================================================================
1019
1020 TopoDS_Shape AIS_InteractiveContext::SelectedShape() const 
1021 {
1022   if (!HasOpenedContext())
1023   {
1024     TopoDS_Shape aResShape;
1025     Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (SelectedInteractive());
1026     if (!aShape.IsNull())
1027     {
1028       TopLoc_Location aLocTrsf = SelectedInteractive()->Transformation().Form() == gp_Identity ?
1029                                  TopLoc_Location() : TopLoc_Location (SelectedInteractive()->Transformation());
1030       aResShape = aShape->Shape().Located (aLocTrsf * aShape->Shape().Location());
1031     }
1032
1033     return aResShape;
1034   } 
1035   else
1036   {
1037     return myLocalContexts (myCurLocalIndex)->SelectedShape();
1038   }
1039 }
1040
1041 //=======================================================================
1042 //function : Interactive
1043 //purpose  : 
1044 //=======================================================================
1045
1046 Handle(AIS_InteractiveObject) AIS_InteractiveContext::Interactive() const 
1047 {
1048   return SelectedInteractive();
1049 }
1050
1051 Handle(AIS_InteractiveObject) AIS_InteractiveContext::SelectedInteractive() const 
1052 {
1053   if(!HasOpenedContext()){
1054     if (AIS_Selection::Selection(myCurrentName.ToCString())->Extent() == 0)
1055       return NULL;
1056     Handle(Standard_Transient) TR  =AIS_Selection::Selection(myCurrentName.ToCString())->Value();
1057     Handle(AIS_InteractiveObject) IO = *((Handle(AIS_InteractiveObject)*)&TR);
1058     return IO;}
1059   
1060   return  myLocalContexts(myCurLocalIndex)->SelectedInteractive();
1061   
1062 }
1063 //=======================================================================
1064 //function : Interactive
1065 //purpose  : 
1066 //=======================================================================
1067
1068 Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::SelectedOwner() const 
1069 {
1070   if(!HasOpenedContext()){
1071     Handle(SelectMgr_EntityOwner) Ownr;
1072     return Ownr;
1073   }
1074   return  myLocalContexts(myCurLocalIndex)->SelectedOwner();
1075   
1076 }
1077
1078 //=======================================================================
1079 //function : EntityOwners
1080 //purpose  : 
1081 //=======================================================================
1082 void AIS_InteractiveContext::EntityOwners(SelectMgr_IndexedMapOfOwner& theOwners,
1083                                           const Handle(AIS_InteractiveObject)& theIObj,
1084                                           const Standard_Integer theMode) const 
1085 {
1086   if ( theIObj.IsNull() )
1087       return;
1088
1089   TColStd_ListOfInteger aModes;
1090   if ( theMode == -1 )
1091     ActivatedModes( theIObj, aModes );
1092   else
1093     aModes.Append( theMode );
1094
1095   TColStd_ListIteratorOfListOfInteger anItr( aModes );
1096   for (; anItr.More(); anItr.Next() )
1097   {
1098     int aMode = anItr.Value();
1099     if ( !theIObj->HasSelection( aMode ) )
1100       continue;
1101
1102     Handle(SelectMgr_Selection) aSel = theIObj->Selection(aMode);
1103
1104     for ( aSel->Init(); aSel->More(); aSel->Next() )
1105     {
1106       Handle(SelectBasics_SensitiveEntity) aEntity = aSel->Sensitive()->BaseSensitive();
1107       if ( aEntity.IsNull() )
1108         continue;
1109
1110       Handle(SelectMgr_EntityOwner) aOwner =
1111         Handle(SelectMgr_EntityOwner)::DownCast(aEntity->OwnerId());
1112       if ( !aOwner.IsNull() )
1113         theOwners.Add( aOwner );
1114     }
1115   }
1116 }
1117
1118 Standard_Integer AIS_InteractiveContext::NbSelected() 
1119 {
1120   Standard_Integer i(0);
1121   for(InitSelected();MoreSelected();NextSelected())
1122     {i++;}
1123   return i;
1124 }
1125
1126 //=======================================================================
1127 //function : HasApplicative
1128 //purpose  : 
1129 //=======================================================================
1130
1131   Standard_Boolean AIS_InteractiveContext::HasApplicative() const 
1132 {
1133   return Interactive()->HasOwner();
1134 }
1135
1136 //=======================================================================
1137 //function : Applicative
1138 //purpose  : 
1139 //=======================================================================
1140
1141 Handle(Standard_Transient) AIS_InteractiveContext::Applicative() const 
1142 {
1143   return Interactive()->GetOwner();
1144 }
1145
1146
1147
1148 //==================================================
1149 // Function: 
1150 // Purpose :
1151 //==================================================
1152 Standard_Boolean AIS_InteractiveContext::HasDetected() const 
1153 {
1154   if(HasOpenedContext())
1155     return myLocalContexts(myCurLocalIndex)->HasDetected();
1156   else
1157     return !myLastPicked.IsNull();
1158 }
1159
1160 //=======================================================================
1161 //function : HasDetectedShape
1162 //purpose  : 
1163 //=======================================================================
1164
1165 Standard_Boolean AIS_InteractiveContext::HasDetectedShape() const 
1166 {
1167   if(HasOpenedContext())
1168     return myLocalContexts(myCurLocalIndex)->HasDetectedShape();
1169   return Standard_False;
1170 }
1171
1172 //=======================================================================
1173 //function : DetectedShape
1174 //purpose  : 
1175 //=======================================================================
1176
1177 const TopoDS_Shape&
1178 AIS_InteractiveContext::DetectedShape() const
1179 {
1180   return myLocalContexts(myCurLocalIndex)->DetectedShape();
1181 }                                           
1182
1183 //=======================================================================
1184 //function : DetectedInteractive
1185 //purpose  : 
1186 //=======================================================================
1187
1188 Handle(AIS_InteractiveObject) 
1189 AIS_InteractiveContext::DetectedInteractive() const 
1190 {
1191   if(HasOpenedContext())
1192     return myLocalContexts(myCurLocalIndex)->DetectedInteractive();
1193   return myLastPicked;
1194 }
1195
1196
1197 Standard_Boolean AIS_InteractiveContext::HasNextDetected() const 
1198 {
1199   if(!HasOpenedContext())
1200     return Standard_False; // temporaire
1201   else
1202     return myLocalContexts(myCurLocalIndex)->HasNextDetected();
1203   
1204 }
1205
1206
1207 //=======================================================================
1208 //function : DetectedOwner
1209 //purpose  : 
1210 //=======================================================================
1211 Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::DetectedOwner() const
1212 {
1213   if(HasOpenedContext())
1214     return myLocalContexts(myCurLocalIndex)->DetectedOwner();
1215   Handle(SelectMgr_EntityOwner) Ownr;
1216   return Ownr;
1217 }
1218
1219
1220 //=======================================================================
1221 //function : HilightNextDetected
1222 //purpose  :
1223 //=======================================================================
1224 Standard_Integer AIS_InteractiveContext::HilightNextDetected (const Handle(V3d_View)& theView,
1225                                                               const Standard_Boolean  theToRedrawImmediate)
1226 {
1227   return HasOpenedContext()
1228        ? myLocalContexts (myCurLocalIndex)->HilightNextDetected (theView, theToRedrawImmediate)
1229        : 0;
1230     
1231 }
1232
1233 //=======================================================================
1234 //function : HilightNextDetected
1235 //purpose  :
1236 //=======================================================================
1237 Standard_Integer AIS_InteractiveContext::HilightPreviousDetected (const Handle(V3d_View)& theView,
1238                                                                   const Standard_Boolean  theToRedrawImmediate)
1239 {
1240   return HasOpenedContext()
1241        ? myLocalContexts (myCurLocalIndex)->HilightPreviousDetected (theView, theToRedrawImmediate)
1242        : 0;
1243     
1244 }
1245
1246 //=======================================================================
1247 //function : InitDetected
1248 //purpose  :
1249 //=======================================================================
1250 void AIS_InteractiveContext::InitDetected()
1251 {
1252   if (HasOpenedContext())
1253   {
1254     myLocalContexts(myCurLocalIndex)->InitDetected();
1255     return;
1256   }
1257
1258   if(myAISDetectedSeq.Length() != 0)
1259   {
1260     myAISCurDetected = 1;
1261   }
1262 }
1263
1264 //=======================================================================
1265 //function : MoreDetected
1266 //purpose  :
1267 //=======================================================================
1268 Standard_Boolean AIS_InteractiveContext::MoreDetected() const
1269 {
1270   if (HasOpenedContext())
1271   {
1272     return myLocalContexts(myCurLocalIndex)->MoreDetected();
1273   }
1274
1275   return (myAISCurDetected > 0 && myAISCurDetected <= myAISDetectedSeq.Length()) ?
1276           Standard_True : Standard_False;
1277 }
1278
1279 //=======================================================================
1280 //function : NextDetected
1281 //purpose  :
1282 //=======================================================================
1283 void AIS_InteractiveContext::NextDetected()
1284 {
1285   if(HasOpenedContext())
1286   {
1287     myLocalContexts(myCurLocalIndex)->NextDetected();
1288     return;
1289   }
1290
1291   myAISCurDetected++;
1292 }
1293
1294 //=======================================================================
1295 //function : DetectedCurrentShape
1296 //purpose  :
1297 //=======================================================================
1298 const TopoDS_Shape& AIS_InteractiveContext::DetectedCurrentShape() const
1299 {
1300   if (HasOpenedContext())
1301   {
1302     return myLocalContexts(myCurLocalIndex)->DetectedCurrentShape();
1303   }
1304
1305   static TopoDS_Shape aDummyShape;
1306
1307   Handle(AIS_Shape) aCurrentShape = Handle(AIS_Shape)::DownCast (DetectedCurrentObject());
1308
1309   if (aCurrentShape.IsNull())
1310   {
1311     return aDummyShape;
1312   }
1313
1314   return aCurrentShape->Shape();
1315 }
1316
1317 //=======================================================================
1318 //function : DetectedCurrentObject
1319 //purpose  :
1320 //=======================================================================
1321 Handle(AIS_InteractiveObject) AIS_InteractiveContext::DetectedCurrentObject() const
1322 {
1323   if (HasOpenedContext())
1324   {
1325     return myLocalContexts(myCurLocalIndex)->DetectedCurrentObject();
1326   }
1327
1328   return MoreDetected() ? myAISDetectedSeq(myAISCurDetected) : NULL;
1329 }