e05c201518278eb9ec19f6a3b6e869477045c21f
[occt.git] / src / AIS / AIS_InteractiveContext_2.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_DataMapIteratorOfDataMapOfILC.hxx>
19 #include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
20 #include <AIS_GlobalStatus.hxx>
21 #include <AIS_InteractiveContext.hxx>
22 #include <AIS_InteractiveObject.hxx>
23 #include <AIS_LocalContext.hxx>
24 #include <AIS_Selection.hxx>
25 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
26 #include <Graphic3d_MapOfStructure.hxx>
27 #include <Graphic3d_Structure.hxx>
28 #include <Graphic3d_StructureManager.hxx>
29 #include <Prs3d_BasicAspect.hxx>
30 #include <Prs3d_LineAspect.hxx>
31 #include <Quantity_Color.hxx>
32 #include <SelectMgr_EntityOwner.hxx>
33 #include <SelectMgr_Filter.hxx>
34 #include <SelectMgr_OrFilter.hxx>
35 #include <SelectMgr_SelectionManager.hxx>
36 #include <Standard_Transient.hxx>
37 #include <StdSelect_ViewerSelector3d.hxx>
38 #include <TCollection_AsciiString.hxx>
39 #include <TCollection_ExtendedString.hxx>
40 #include <TColStd_ListIteratorOfListOfInteger.hxx>
41 #include <TopLoc_Location.hxx>
42 #include <TopoDS_Shape.hxx>
43 #include <V3d_View.hxx>
44 #include <V3d_Viewer.hxx>
45
46 //=======================================================================
47 //function : OpenLocalContext
48 //purpose  : 
49 //=======================================================================
50 Standard_Integer AIS_InteractiveContext::
51 OpenLocalContext(const Standard_Boolean UseDisplayedObjects, 
52                  const Standard_Boolean AllowShapeDecomposition, 
53                  const Standard_Boolean AcceptEraseOfTemporary,
54                  const Standard_Boolean /*BothViewers*/)
55 {
56
57   // the entities eventually detected just before the context was opened are unhighlighted...
58   if(!IsSelected(myLastPicked)){
59     if(!myLastPicked.IsNull()){
60       const Handle(AIS_InteractiveObject) aLastPickedAIS =
61         Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
62       Standard_Integer HiMod = aLastPickedAIS->HasHilightMode()?aLastPickedAIS->HilightMode():0;
63       unhighlightGlobal (aLastPickedAIS, HiMod);
64     }}
65   
66   if(!mylastmoveview.IsNull()){
67     if(myCurLocalIndex>0)
68       myLocalContexts(myCurLocalIndex)->UnhilightLastDetected(mylastmoveview);
69   }
70   
71   // entities connected to dynamic selection at neutral point are set to 0.
72   
73   myLastinMain.Nullify();
74   myLastPicked.Nullify();
75   myWasLastMain = Standard_True;
76
77   Standard_DISABLE_DEPRECATION_WARNINGS
78   myCurLocalIndex = HighestIndex() + 1;
79   Standard_ENABLE_DEPRECATION_WARNINGS
80   
81   Handle(AIS_LocalContext) NewLocal= new AIS_LocalContext(this,myCurLocalIndex,
82                                                           UseDisplayedObjects,
83                                                           AllowShapeDecomposition,
84                                                           AcceptEraseOfTemporary);
85   // the AIS_LocalContext bind itself to myLocalContexts
86   // because procedures performed in AIS_LocalContext constructor
87   // already may access myLocalContexts(myCurLocalIndex) (like methods AIS_LocalContext::IsSelected()).
88
89 #ifdef OCCT_DEBUG
90   cout<<"\tOpen Local Context No "<<myCurLocalIndex<<endl;
91   if(UseDisplayedObjects){
92     cout<<"\t\tObjects from Neutral Point loaded"<<endl;
93     if(AllowShapeDecomposition)
94       cout<<"\t\tDecomposition Authorized for Loaded Shapes"<<endl;
95     else
96       cout<<"\t\tNo Decomposition Authorized for Loaded Shapes"<<endl;
97   }
98   else
99     cout<<"\t\tNo Objects Were Loaded "<<endl;
100 #endif
101   return myCurLocalIndex;
102 }
103
104 //=======================================================================
105 //function : CloseLocalContext
106 //purpose  : 
107 //=======================================================================
108
109 void AIS_InteractiveContext::CloseLocalContext(const Standard_Integer Index,
110                                                const Standard_Boolean updateviewer)
111 {
112
113  Standard_Boolean debugmode(Standard_False);
114 #ifdef OCCT_DEBUG
115  debugmode = Standard_True;
116 #endif
117  
118  Standard_Integer GoodIndex = (Index ==-1) ? myCurLocalIndex : Index;
119
120  if(debugmode) cout<<"Call to CloseLocalContext - Index  "<<GoodIndex<<endl;
121  if(!HasOpenedContext()){
122    if(debugmode) cout<<"\t But No Local Context is opened"<<endl;
123    return;
124  }
125  if(!myLocalContexts.IsBound(GoodIndex)) {
126    if(debugmode) cout<<" Attempt to Close a non-existent Local Context"<<endl;
127    return;
128  }
129  
130  // the only open local context is closed...
131  if(myLocalContexts.Extent()==1 && GoodIndex == myCurLocalIndex){
132    
133    myLocalContexts(myCurLocalIndex)->Terminate( updateviewer );
134    myLocalContexts.UnBind(myCurLocalIndex);
135    myCurLocalIndex = 0;
136
137    ResetOriginalState(Standard_False);
138    if(debugmode)
139      cout<<"No More Opened Local Context "<<endl;
140  }
141  
142  // Otherwise the local context will be still open after the current is closed
143  else{
144    Handle(StdSelect_ViewerSelector3d) VS = myLocalContexts(GoodIndex)->MainSelector();
145    myLocalContexts(GoodIndex)->Terminate();
146    myLocalContexts.UnBind(GoodIndex);
147    // the current is closed...
148    if(GoodIndex==myCurLocalIndex){
149      Standard_DISABLE_DEPRECATION_WARNINGS
150      myCurLocalIndex = HighestIndex();
151      Standard_ENABLE_DEPRECATION_WARNINGS
152    }
153    else if(debugmode)
154      cout<<"a No Current Local Context WasClosed"<<endl;
155
156    // restore activated selections of current local context
157    myLocalContexts (myCurLocalIndex)->RestoreActivatedModes();
158
159    if(debugmode) cout<<"Index Of CurrentLocalContext:"<<myCurLocalIndex<<endl;
160    
161  }
162    
163  
164  if(updateviewer) myMainVwr->Update();
165 }
166
167 //=======================================================================
168 //function : CloseAllContexts
169 //purpose  : 
170 //=======================================================================
171 Standard_DISABLE_DEPRECATION_WARNINGS
172 void AIS_InteractiveContext::CloseAllContexts(const Standard_Boolean updateviewer)
173 {
174   while(!myLocalContexts.IsEmpty()){
175     CloseLocalContext(myCurLocalIndex,Standard_False);
176   }
177
178   ResetOriginalState(Standard_False);
179
180   if(updateviewer) myMainVwr->Update();
181 }
182 Standard_ENABLE_DEPRECATION_WARNINGS
183
184 //=======================================================================
185 //function : IndexOfCurrentLocal
186 //purpose  : 
187 //=======================================================================
188
189 Standard_Integer AIS_InteractiveContext::IndexOfCurrentLocal() const
190 {
191   return myCurLocalIndex;
192 }
193
194 //=======================================================================
195 //function : ClearLocalContext
196 //purpose  : 
197 //=======================================================================
198
199 void AIS_InteractiveContext::ClearLocalContext(const AIS_ClearMode aMode)
200 {
201   if (!HasOpenedContext()) return;
202   myLocalContexts(myCurLocalIndex)->Clear(aMode);
203
204 }
205
206 //=======================================================================
207 //function : HighestIndex
208 //purpose  : 
209 //=======================================================================
210
211 Standard_Integer AIS_InteractiveContext::HighestIndex() const
212 {
213   AIS_DataMapIteratorOfDataMapOfILC It(myLocalContexts);
214   Standard_Integer HiInd = 0;
215   for(;It.More();It.Next())
216     HiInd = (It.Key()>HiInd) ? It.Key() : HiInd;
217   return HiInd;
218
219 }
220
221
222 //=======================================================================
223 //function : Activate
224 //purpose  : 
225 //=======================================================================
226
227 void AIS_InteractiveContext::
228 Activate(const Handle(AIS_InteractiveObject)& anIObj, 
229          const Standard_Integer aMode,
230          const Standard_Boolean theIsForce)
231 {
232   if(!HasOpenedContext()){
233     if(!myObjects.IsBound(anIObj)) return;
234     const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
235     if(STAT->GraphicStatus()==AIS_DS_Displayed || theIsForce)
236       mgrSelector->Activate(anIObj,aMode,myMainSel);
237     STAT ->AddSelectionMode(aMode);
238   }
239   else{
240    myLocalContexts(myCurLocalIndex)->ActivateMode(anIObj,aMode);
241   }
242 }
243
244 // ============================================================================
245 // function : Activate
246 // purpose  :
247 // ============================================================================
248 void AIS_InteractiveContext::Activate (const Standard_Integer theMode,
249                                        const Standard_Boolean theIsForce)
250 {
251   AIS_ListOfInteractive aDisplayedObjects;
252   DisplayedObjects (aDisplayedObjects);
253
254   for (AIS_ListIteratorOfListOfInteractive anIter (aDisplayedObjects); anIter.More(); anIter.Next())
255   {
256     Load (anIter.Value(), -1, Standard_True);
257     Activate (anIter.Value(), theMode, theIsForce);
258   }
259
260 }
261
262 //=======================================================================
263 //function : LocalSelector
264 //purpose  : 
265 //=======================================================================
266 Handle( StdSelect_ViewerSelector3d ) AIS_InteractiveContext::LocalSelector() const
267 {
268   if( !HasOpenedContext() )
269       return Handle( StdSelect_ViewerSelector3d )();
270   else
271       return myLocalContexts( myCurLocalIndex )->MainSelector();
272 }
273
274
275 //=======================================================================
276 //function : DeActivate
277 //purpose  : 
278 //=======================================================================
279 void AIS_InteractiveContext::
280 Deactivate(const Handle(AIS_InteractiveObject)& anIObj)
281 {
282   if(!HasOpenedContext()){
283     if(!myObjects.IsBound(anIObj)) return;
284     TColStd_ListIteratorOfListOfInteger ItL;
285     for(ItL.Initialize(myObjects(anIObj)->SelectionModes());
286         ItL.More();
287         ItL.Next()){
288       if(myObjects(anIObj)->GraphicStatus() == AIS_DS_Displayed)
289         mgrSelector->Deactivate(anIObj,ItL.Value(),myMainSel);
290     }
291     myObjects(anIObj)->ClearSelectionModes();
292   }
293   else{
294     const Handle(AIS_LocalContext)& LC = myLocalContexts(myCurLocalIndex);
295     LC->Deactivate(anIObj);
296   }
297 }
298
299 //=======================================================================
300 //function : Deactivate
301 //purpose  : 
302 //=======================================================================
303
304 void AIS_InteractiveContext::Deactivate(const Handle(AIS_InteractiveObject)& anIObj, 
305            const Standard_Integer aMode)
306 {
307   if(!HasOpenedContext()){
308     if(!myObjects.IsBound(anIObj)) return;
309     const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
310
311     if(STAT->GraphicStatus() == AIS_DS_Displayed)
312       mgrSelector->Deactivate(anIObj,aMode,myMainSel);
313     STAT->RemoveSelectionMode(aMode);
314   }
315   else{
316    myLocalContexts(myCurLocalIndex)->DeactivateMode(anIObj,aMode);
317   }
318 }
319
320 // ============================================================================
321 // function : Deactivate
322 // purpose  :
323 // ============================================================================
324 void AIS_InteractiveContext::Deactivate (const Standard_Integer theMode)
325 {
326   AIS_ListOfInteractive aDisplayedObjects;
327   DisplayedObjects (aDisplayedObjects);
328
329   for (AIS_ListIteratorOfListOfInteractive anIter (aDisplayedObjects); anIter.More(); anIter.Next())
330   {
331     Deactivate (anIter.Value(), theMode);
332   }
333 }
334
335 // ============================================================================
336 // function : Deactivate
337 // purpose  :
338 // ============================================================================
339 void AIS_InteractiveContext::Deactivate()
340 {
341   AIS_ListOfInteractive aDisplayedObjects;
342   DisplayedObjects (aDisplayedObjects);
343
344   for (AIS_ListIteratorOfListOfInteractive anIter (aDisplayedObjects); anIter.More(); anIter.Next())
345   {
346     Deactivate (anIter.Value());
347   }
348 }
349
350 //=======================================================================
351 //function : ActivatedModes
352 //purpose  : 
353 //=======================================================================
354
355 void AIS_InteractiveContext::
356 ActivatedModes(const Handle(AIS_InteractiveObject)& anIObj, 
357                TColStd_ListOfInteger& theList) const 
358 {
359   TColStd_ListIteratorOfListOfInteger ItL;
360   if(!HasOpenedContext()){
361     if(myObjects.IsBound(anIObj)){
362       for(ItL.Initialize(myObjects(anIObj)->SelectionModes());
363           ItL.More();
364           ItL.Next())
365         theList.Append(ItL.Value());
366       
367     }
368   }
369   else{
370     if(myLocalContexts(myCurLocalIndex)->IsIn(anIObj)){
371       for(ItL.Initialize(myLocalContexts(myCurLocalIndex)->SelectionModes(anIObj));
372           ItL.More();
373           ItL.Next())
374         theList.Append(ItL.Value());
375     }
376   }
377 }
378
379 //=======================================================================
380 //function : SetShapeDecomposition
381 //purpose  : 
382 //=======================================================================
383
384 void AIS_InteractiveContext::SetShapeDecomposition(const Handle(AIS_InteractiveObject)& anIObj,
385                                                    const Standard_Boolean StdModeSensitive)
386 {
387   if(!HasOpenedContext()) return;
388   myLocalContexts(myCurLocalIndex)->SetShapeDecomposition(anIObj,StdModeSensitive);
389 }
390
391 //=======================================================================
392 //function : SetTemporaryAttributes
393 //purpose  : 
394 //=======================================================================
395
396 void AIS_InteractiveContext::
397 SetTemporaryAttributes(const Handle(AIS_InteractiveObject)& /*anObj*/,
398                        const Handle(Prs3d_Drawer)& /*aDrawer*/,
399                        const Standard_Boolean /*updateviewer*/)
400 {
401 }
402
403 //=======================================================================
404 //function : SubIntensityOn
405 //purpose  : 
406 //=======================================================================
407 void AIS_InteractiveContext::
408 SubIntensityOn(const Handle(AIS_InteractiveObject)& anIObj,
409                const Standard_Boolean updateviewer)
410 {
411   if(!HasOpenedContext())
412   {
413     turnOnSubintensity (anIObj);
414   }
415   else
416   {
417     turnOnSubintensity (anIObj, -1, Standard_False);
418     myLocalContexts(myCurLocalIndex)->SubIntensityOn (anIObj);
419   }
420
421   if (updateviewer)
422     myMainVwr->Update();
423 }
424 //=======================================================================
425 //function : SubIntensityOff
426 //purpose  : 
427 //=======================================================================
428
429 void AIS_InteractiveContext::
430 SubIntensityOff(const Handle(AIS_InteractiveObject)& anIObj,
431                 const Standard_Boolean updateviewer)
432 {
433   if(!HasOpenedContext()){
434     if(!myObjects.IsBound(anIObj))
435       return;
436     const Handle(AIS_GlobalStatus)& GB=myObjects(anIObj);
437     if(!GB->IsSubIntensityOn())
438       return;
439     GB->SubIntensityOff();
440     Standard_Boolean UpdMain(Standard_False);
441     
442     if(GB->GraphicStatus() == AIS_DS_Displayed)
443     {
444       myMainPM->Unhighlight (anIObj, GB->DisplayMode());
445       UpdMain = Standard_True;
446     }
447     
448     Standard_Integer DM,HM,SM;
449     GetDefModes(anIObj,DM,HM,SM);
450     if(IsSelected(anIObj))
451       highlightSelected (anIObj->GlobalSelOwner());
452     
453     if(updateviewer){
454       if(UpdMain)
455         myMainVwr->Update();
456     }
457   }
458   else {
459     const Handle(Graphic3d_HighlightStyle)& anObjSelStyle =
460       getSelStyle (anIObj);
461     if(myObjects.IsBound(anIObj)){
462       const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
463       STAT->SubIntensityOff();
464       myMainPM->Unhighlight (anIObj, STAT->DisplayMode());
465       if (STAT->IsHilighted())
466         HilightWithColor (anIObj, anObjSelStyle, Standard_False);
467     }
468     else
469       myLocalContexts(myCurLocalIndex)->SubIntensityOff(anIObj);
470     if (IsSelected(anIObj))
471       HilightWithColor (anIObj, anObjSelStyle, Standard_False);
472     
473     if(updateviewer) myMainVwr->Update();
474   }
475 }
476
477 //=======================================================================
478 //function : SubIntensityOn
479 //purpose  : ALL THE DISPLAYED OBJECTS HAVE SUBINTENSITY...
480 //=======================================================================
481 void AIS_InteractiveContext::SubIntensityOn (const Standard_Boolean theIsToUpdateViewer)
482 {
483   if (!HasOpenedContext())
484     return;
485
486   turnOnSubintensity();
487
488   if (theIsToUpdateViewer)
489     myMainVwr->Update();
490 }
491
492 //=======================================================================
493 //function : SubIntensityOff
494 //purpose  : 
495 //=======================================================================
496 void AIS_InteractiveContext::SubIntensityOff(const Standard_Boolean updateviewer)
497 {
498   if(!HasOpenedContext()) return;
499
500   AIS_DataMapIteratorOfDataMapOfIOStatus It (myObjects);
501   for(;It.More();It.Next()){
502     const Handle(AIS_GlobalStatus)& STAT = It.Value();
503     if(STAT->IsSubIntensityOn())
504       STAT->SubIntensityOff();
505     myMainPM->Unhighlight (It.Key());
506   }
507
508   if(updateviewer) myMainVwr->Update();
509 }
510
511 //=======================================================================
512 //function : AddFilter
513 //purpose  : 
514 //=======================================================================
515 void AIS_InteractiveContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
516 {
517   if(HasOpenedContext())
518     myLocalContexts(myCurLocalIndex)->AddFilter(aFilter);
519   else
520     myFilters->Add(aFilter);
521 }
522
523 //=======================================================================
524 //function : ActivateStandardMode
525 //purpose  : 
526 //=======================================================================
527 void AIS_InteractiveContext::ActivateStandardMode(const TopAbs_ShapeEnum aStandardActivation)
528 {
529   if(!HasOpenedContext()) return;
530   myLocalContexts(myCurLocalIndex)->ActivateStandardMode (aStandardActivation);
531 }
532
533 //=======================================================================
534 //function : DeActivateStandardMode
535 //purpose  : 
536 //=======================================================================
537 void AIS_InteractiveContext::DeactivateStandardMode(const TopAbs_ShapeEnum aStandardActivation)
538 {
539   if(!HasOpenedContext()) return;
540   myLocalContexts(myCurLocalIndex)->DeactivateStandardMode (aStandardActivation);
541 }
542
543 //=======================================================================
544 //function : RemoveFilter
545 //purpose  : 
546 //=======================================================================
547 void AIS_InteractiveContext::RemoveFilter(const Handle(SelectMgr_Filter)& aFilter)
548 {
549   if(HasOpenedContext())
550     myLocalContexts(myCurLocalIndex)->RemoveFilter (aFilter);
551   else
552     myFilters->Remove(aFilter);
553 }
554
555 //=======================================================================
556 //function : RemoveFilters
557 //purpose  : 
558 //=======================================================================
559
560 void AIS_InteractiveContext::RemoveFilters()
561 {
562   if(!HasOpenedContext())
563     myFilters->Clear();
564   else
565     myLocalContexts(myCurLocalIndex)->Clear(AIS_CM_Filters);
566 }
567
568 //=======================================================================
569 //function : ActivatedStandardModes
570 //purpose  : 
571 //=======================================================================
572 const TColStd_ListOfInteger& AIS_InteractiveContext::ActivatedStandardModes() const 
573 {
574   return myLocalContexts(myCurLocalIndex)->StandardModes();
575 }
576
577 //=======================================================================
578 //function : Filters
579 //purpose  : 
580 //=======================================================================
581 const SelectMgr_ListOfFilter& AIS_InteractiveContext::Filters() const 
582 {
583   if(HasOpenedContext())
584     return myLocalContexts(myCurLocalIndex)->ListOfFilter();
585   return myFilters->StoredFilters();
586 }
587
588 //=======================================================================
589 //function : DisplayActiveSensitive
590 //purpose  : 
591 //=======================================================================
592 void AIS_InteractiveContext::DisplayActiveSensitive(const Handle(V3d_View)& aviou)
593 {
594   if(HasOpenedContext())
595     myLocalContexts(myCurLocalIndex)->DisplaySensitive(aviou);
596   else
597     myMainSel->DisplaySensitive(aviou);
598 }
599 //=======================================================================
600 //function : DisplayActiveSensitive
601 //purpose  : 
602 //=======================================================================
603
604 void AIS_InteractiveContext::DisplayActiveSensitive(const Handle(AIS_InteractiveObject)& anIObj,
605                                                     const Handle(V3d_View)& aviou)
606 {
607   TColStd_ListIteratorOfListOfInteger It;
608   Handle(StdSelect_ViewerSelector3d) VS;
609   if(HasOpenedContext()){
610     const Handle(AIS_LocalContext)& LC = myLocalContexts(myCurLocalIndex);
611     if(!LC->IsIn(anIObj)) return;
612     It.Initialize(LC->SelectionModes(anIObj));
613     VS = LC->MainSelector();
614   }
615   else{
616     if(!myObjects.IsBound(anIObj)) return;
617     It.Initialize(myObjects(anIObj)->SelectionModes());
618     VS = myMainSel;
619   }
620   
621   
622   for(;It.More();It.Next()){
623     const Handle(SelectMgr_Selection)& Sel = anIObj->Selection(It.Value());
624     VS->DisplaySensitive(Sel,anIObj->Transformation(), aviou,Standard_False);
625   }  
626   
627 }
628
629 //=======================================================================
630 //function : ClearActiveSensitive
631 //purpose  : 
632 //=======================================================================
633 void AIS_InteractiveContext::ClearActiveSensitive(const Handle(V3d_View)& aviou)
634 {
635   
636   if(HasOpenedContext())
637     myLocalContexts(myCurLocalIndex)->ClearSensitive(aviou);
638   else
639     myMainSel->ClearSensitive(aviou);
640 }
641
642 //=======================================================================
643 //function : SetAutomaticHilight
644 //purpose  : 
645 //=======================================================================
646 void  AIS_InteractiveContext::SetAutomaticHilight(const Standard_Boolean aStatus)
647 {
648
649   if(HasOpenedContext())
650     myLocalContexts(myCurLocalIndex)->SetAutomaticHilight(aStatus);
651 }
652
653 //=======================================================================
654 //function : AutomaticHilight
655 //purpose  : 
656 //=======================================================================
657 Standard_Boolean AIS_InteractiveContext::AutomaticHilight() const 
658 {
659   if(HasOpenedContext())
660     return myLocalContexts(myCurLocalIndex)->AutomaticHilight();
661   return Standard_True;
662 }
663
664 //=======================================================================
665 //function : UseDisplayedObjects
666 //purpose  : 
667 //=======================================================================
668
669 void AIS_InteractiveContext::UseDisplayedObjects()
670 {
671   if(HasOpenedContext())
672     myLocalContexts(myCurLocalIndex)->LoadContextObjects();
673 }
674
675 //=======================================================================
676 //function : NotUseDisplayedObjects
677 //purpose  : 
678 //=======================================================================
679
680 void AIS_InteractiveContext::NotUseDisplayedObjects()
681 {
682   if(HasOpenedContext())
683     myLocalContexts(myCurLocalIndex)->UnloadContextObjects();
684 }
685
686
687
688
689 //=======================================================================
690 //function : PurgeDisplay
691 //purpose  : 
692 //=======================================================================
693
694 Standard_Integer AIS_InteractiveContext::PurgeDisplay()
695 {
696   if(HasOpenedContext()) return 0;
697   
698   Standard_Integer NbStr = PurgeViewer(myMainVwr);
699   myMainVwr->Update();
700   return NbStr;
701
702 }
703
704
705 //=======================================================================
706 //function : PurgeViewer
707 //purpose  : 
708 //=======================================================================
709 Standard_Integer AIS_InteractiveContext::PurgeViewer(const Handle(V3d_Viewer)& Vwr)
710 {
711   Handle(Graphic3d_StructureManager) GSM = Vwr->StructureManager();
712   Standard_Integer NbCleared(0);
713   Graphic3d_MapOfStructure SOS;
714   GSM->DisplayedStructures(SOS);
715
716   Handle(Graphic3d_Structure) G;
717   for(Graphic3d_MapIteratorOfMapOfStructure It(SOS); It.More();It.Next()){
718     G = It.Key();
719     Standard_Address Add = G->Owner();
720     if(Add==NULL){
721       G->Erase();
722       G->Clear();// it means that it is not referenced as a presentation of InterfactiveObject...
723       NbCleared++;
724     }
725     Handle(AIS_InteractiveObject) IO = (AIS_InteractiveObject*)Add;
726     if(!myObjects.IsBound(IO)){
727       G->Erase();
728       NbCleared++;
729     }
730   }
731   return NbCleared;
732 }
733
734 //=======================================================================
735 //function : IsImmediateModeOn
736 //purpose  :
737 //=======================================================================
738
739 Standard_Boolean AIS_InteractiveContext::IsImmediateModeOn()  const 
740 {
741   if(!HasOpenedContext()) return Standard_False;
742   return myLocalContexts(myCurLocalIndex)->IsImmediateModeOn();
743 }
744
745 //=======================================================================
746 //function : BeginImmediateDraw
747 //purpose  :
748 //=======================================================================
749
750 Standard_Boolean AIS_InteractiveContext::BeginImmediateDraw()
751 {
752   return HasOpenedContext()
753       && myLocalContexts (myCurLocalIndex)->BeginImmediateDraw();
754 }
755
756 //=======================================================================
757 //function : ImmediateAdd
758 //purpose  :
759 //=======================================================================
760
761 Standard_Boolean AIS_InteractiveContext::ImmediateAdd (const Handle(AIS_InteractiveObject)& theObj,
762                                                        const Standard_Integer               theMode)
763 {
764   return HasOpenedContext()
765       && myLocalContexts (myCurLocalIndex)->ImmediateAdd (theObj, theMode);
766 }
767
768 //=======================================================================
769 //function : EndImmediateDraw
770 //purpose  :
771 //=======================================================================
772
773 Standard_Boolean AIS_InteractiveContext::EndImmediateDraw (const Handle(V3d_View)& theView)
774 {
775   return HasOpenedContext()
776       && myLocalContexts (myCurLocalIndex)->EndImmediateDraw (theView->Viewer());
777 }
778
779 //=======================================================================
780 //function : EndImmediateDraw
781 //purpose  :
782 //=======================================================================
783
784 Standard_Boolean AIS_InteractiveContext::EndImmediateDraw()
785 {
786   if (!HasOpenedContext())
787   {
788     return Standard_False;
789   }
790
791   return myLocalContexts (myCurLocalIndex)->EndImmediateDraw (myMainVwr);
792 }
793
794
795 //=======================================================================
796 //function : ResetOriginalState
797 //purpose  : 
798 //=======================================================================
799
800 void AIS_InteractiveContext::ResetOriginalState(const Standard_Boolean updateviewer)
801 {
802   Standard_Boolean upd_main(Standard_False);
803   TColStd_ListIteratorOfListOfInteger itl;
804   myMainSel->ResetSelectionActivationStatus();
805
806   for (AIS_DataMapIteratorOfDataMapOfIOStatus it(myObjects);it.More();it.Next()){
807     const Handle(AIS_InteractiveObject)& iobj = it.Key();
808     const Handle(AIS_GlobalStatus)& STAT = it.Value();
809     switch(STAT->GraphicStatus()){
810     case AIS_DS_Displayed:{
811       upd_main = Standard_True;
812       
813       // part display...
814       myMainPM->Display (iobj, STAT->DisplayMode());
815       if(STAT->IsHilighted())
816       {
817         const Handle(Graphic3d_HighlightStyle)& aStyle = STAT->HilightStyle();
818         if (!aStyle.IsNull() && getSelStyle (iobj) != aStyle)
819           HilightWithColor(iobj,aStyle,Standard_False);
820       }
821       //part selection
822       for(itl.Initialize(STAT->SelectionModes());itl.More();itl.Next()){
823         if(itl.Value()!=-1)
824           mgrSelector->Activate(iobj,itl.Value(),myMainSel);
825       }
826       break; 
827     }
828     case AIS_DS_Erased:{
829       EraseGlobal(iobj,Standard_False);
830       break;
831     }
832     default:
833       break;
834     }
835   }
836   if(updateviewer){
837     if(upd_main) 
838       myMainVwr->Update();
839   }
840 }
841
842 //=======================================================================
843 //function : SetZDetection
844 //purpose  : 
845 //=======================================================================
846 void  AIS_InteractiveContext::SetZDetection(const Standard_Boolean aStatus)
847 {
848   myZDetectionFlag = aStatus;
849 }
850
851 //=======================================================================
852 //function : ZDetection 
853 //purpose  : 
854 //=======================================================================
855 Standard_Boolean AIS_InteractiveContext::ZDetection() const 
856 {
857   return myZDetectionFlag;
858 }