0026209: Visualization - provide a method to fit view to the specific bounding box
[occt.git] / src / AIS / AIS_LocalContext.cxx
1 // Created on: 1997-01-17
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 //Modified by ROB : Traque des UpdateConversion intempestifs.
18
19 #include <AIS_LocalContext.ixx>
20 #include <SelectMgr_OrFilter.hxx>
21 #include <SelectMgr_CompositionFilter.hxx>
22 #include <AIS_LocalStatus.hxx>
23 #include <AIS_Shape.hxx>
24 #include <TColStd_ListIteratorOfListOfInteger.hxx>
25 #include <AIS_ListIteratorOfListOfInteractive.hxx>
26 #include <AIS_ListOfInteractive.hxx>
27 #include <AIS_DataMapIteratorOfDataMapOfSelStat.hxx>
28 #include <TopAbs_ShapeEnum.hxx>
29 #include <Graphic3d_Structure.hxx>
30 #include <Prs3d_LineAspect.hxx>
31 #include <Prs3d_PlaneAspect.hxx>
32 #include <Prs3d_PointAspect.hxx>
33 #include <Prs3d_Presentation.hxx>
34 #include <Aspect_TypeOfMarker.hxx>
35 #include <StdSelect_ShapeTypeFilter.hxx>
36 #include <StdSelect_ViewerSelector3d.hxx>
37 #include <AIS_Selection.hxx>
38 #include <V3d_Viewer.hxx>
39 #include <V3d_View.hxx>
40 #include <Visual3d_View.hxx>
41
42 #include <stdio.h>
43
44 static TCollection_AsciiString AIS_Local_SelName(const Standard_Address address,
45                                                  const Standard_Integer anIndex)
46 {
47 //  TCollection_AsciiString SelName;
48   char string[100];
49   sprintf(string,"%p_%d", address, anIndex);    // works under any system 
50   TCollection_AsciiString SelName(string);
51   return SelName;
52 }
53
54
55 //=======================================================================
56 //function : AIS_LocalContext
57 //purpose  : 
58 //=======================================================================
59
60
61 AIS_LocalContext::AIS_LocalContext(){}
62
63 AIS_LocalContext::AIS_LocalContext(const Handle(AIS_InteractiveContext)& aCtx,
64                                    const Standard_Integer Index,
65                                    const Standard_Boolean LoadDisplayed,
66                                    const Standard_Boolean AcceptStandardModes,
67                                    const Standard_Boolean AcceptEraseOfTemp,
68                                    const Standard_Boolean /*BothViewers*/):
69 myCTX(aCtx),
70 myLoadDisplayed(LoadDisplayed),
71 myAcceptStdMode(AcceptStandardModes),
72 myAcceptErase(AcceptEraseOfTemp),
73 mySM(aCtx->SelectionManager()),
74 myMainVS(aCtx->MainSelector()),
75 myFilters(new SelectMgr_OrFilter()),
76 myAutoHilight(Standard_True),
77 myMapOfOwner (new SelectMgr_IndexedMapOfOwner()),
78 mylastindex(0),
79 mylastgood(0),
80 myCurDetected(0),
81 myAISCurDetected(0)
82
83 {
84   // bind self to AIS_InteractiveContext::myLocalContexts. Further, the
85   // constructor executes logic that implies that the context is already
86   // created and mapped.
87   aCtx->myLocalContexts.Bind (Index, this);
88
89   myMainVS->ResetSelectionActivationStatus();
90   myMainPM = aCtx->MainPrsMgr();
91   mySelName = AIS_Local_SelName(this, Index);
92   AIS_Selection::CreateSelection(mySelName.ToCString());
93
94   mySM->Add(myMainVS);
95   if(myLoadDisplayed) LoadContextObjects();
96   Process();
97
98 }
99
100
101 //=======================================================================
102 //function : SetContext
103 //purpose  : 
104 //=======================================================================
105
106 void AIS_LocalContext::SetContext(const Handle(AIS_InteractiveContext)& aCtx)
107 {  myCTX = aCtx;}
108
109 //=======================================================================
110 //function : Display
111 //purpose  : 
112 //=======================================================================
113
114 Standard_Boolean AIS_LocalContext::Display(const Handle(AIS_InteractiveObject)& anInteractive,
115                                            const Standard_Integer WhichMode,
116                                            const Standard_Boolean AllowShapeDecomposition,
117                                            const Standard_Integer ActivationMode)
118 {
119   if(myActiveObjects.IsBound(anInteractive)){
120     const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
121     
122     if(STAT->DisplayMode() == -1){
123       if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
124         myMainPM->Display(anInteractive,WhichMode);
125       if(STAT->IsTemporary())
126         STAT->SetDisplayMode(WhichMode);
127     }
128     else if(STAT->DisplayMode()!=WhichMode && STAT->IsTemporary()){
129       myMainPM->Erase(anInteractive,STAT->DisplayMode());
130       STAT->SetDisplayMode(WhichMode);
131       if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
132         myMainPM->Display(anInteractive,WhichMode);
133     }
134     
135     if(ActivationMode!=-1){
136       if(!STAT->IsActivated(ActivationMode)){
137         STAT->ClearSelectionModes();
138         mySM->Load(anInteractive,myMainVS);
139         STAT->AddSelectionMode(ActivationMode);
140         mySM->Activate(anInteractive,ActivationMode,myMainVS);
141       }
142     }
143   }
144   else {
145     Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
146     
147     if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
148       Att->SetDecomposition(Standard_True);
149     else 
150       Att->SetDecomposition(Standard_False);
151     // status temporary or not
152     if(myCTX->DisplayStatus(anInteractive) == AIS_DS_None ||
153        myCTX->DisplayStatus(anInteractive) == AIS_DS_Temporary)
154       Att->SetTemporary(Standard_True);
155     else
156       Att->SetTemporary(Standard_False); 
157
158
159     
160     if(!myCTX->IsDisplayed(anInteractive,WhichMode)){
161       
162       //storing information....
163       Att->SetDisplayMode(WhichMode);
164       if (ActivationMode!=-1)
165         Att->AddSelectionMode(ActivationMode);
166       Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
167       Att->SetHilightMode(HiMod);
168
169       if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
170         myMainPM->Display(anInteractive,WhichMode);
171       
172       if(ActivationMode!=-1){
173         mySM->Load(anInteractive,myMainVS);
174         mySM->Activate(anInteractive,ActivationMode,myMainVS);
175       }
176     }
177     else{
178       Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
179       Att->SetHilightMode(HiMod);
180     }
181     myActiveObjects.Bind(anInteractive,Att);
182   }  
183   Process(anInteractive);
184
185   
186   
187
188   return Standard_True;
189 }
190
191 //=======================================================================
192 //function : Load
193 //purpose  : 
194 //=======================================================================
195
196 Standard_Boolean AIS_LocalContext::
197 Load(const Handle(AIS_InteractiveObject)& anInteractive,
198      const Standard_Boolean AllowShapeDecomposition,
199      const Standard_Integer ActivationMode)
200 {
201   if (myActiveObjects.IsBound (anInteractive))
202   {
203     if (anInteractive->HasSelection (ActivationMode))
204     {
205       const Handle(SelectMgr_Selection)& aSel = anInteractive->Selection (ActivationMode);
206       if (aSel->GetSelectionState() != SelectMgr_SOS_Activated)
207       {
208         if (!myMainVS->Contains (anInteractive))
209         {
210           mySM->Load (anInteractive, myMainVS);
211         }
212         mySM->Activate (anInteractive, ActivationMode, myMainVS);
213         return Standard_True;
214       }
215     }
216     return Standard_False;
217   }
218
219   Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
220   
221   if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
222     Att->SetDecomposition(Standard_True);
223   else 
224     Att->SetDecomposition(Standard_False);
225   
226   if(!myCTX->IsDisplayed(anInteractive))
227     Att->SetTemporary(Standard_True);
228   else
229     Att->SetTemporary(Standard_False);
230   Att->SetDisplayMode(-1);
231   
232   //storing information....
233   if(ActivationMode!=-1)
234     Att->AddSelectionMode(ActivationMode);
235   Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode():0;
236   Att->SetHilightMode(HiMod);
237   //Action
238   
239   mySM->Load(anInteractive,myMainVS);
240   if(ActivationMode != -1){
241     mySM->Activate(anInteractive,ActivationMode,myMainVS);
242   }
243   myActiveObjects.Bind(anInteractive,Att);
244   Process(anInteractive);
245   return Standard_True;
246 }
247
248 //=======================================================================
249 //function : ClearPrs
250 //purpose  : 
251 //=======================================================================
252
253 Standard_Boolean AIS_LocalContext::
254 ClearPrs(const Handle(AIS_InteractiveObject)& anInteractive,
255          const Standard_Integer aMode)
256 {
257   if(!myActiveObjects.IsBound(anInteractive))
258     return Standard_False;
259
260   Standard_Boolean jobdone(Standard_False);
261   const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
262   
263   //Display step
264   if(STAT->IsSubIntensityOn()) {
265     STAT->SubIntensityOff();
266     if(STAT->HilightMode()==aMode)
267       myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
268   }
269   myMainPM->Clear(anInteractive,aMode); // correction connexions 23/09/97
270   jobdone = Standard_True;
271   if(STAT->DisplayMode()==aMode)
272     STAT->SetDisplayMode(-1);
273   return jobdone;
274 }
275 //=======================================================================
276 //function : Erase
277 //purpose  : 
278 //=======================================================================
279
280 Standard_Boolean AIS_LocalContext::
281 Erase(const Handle(AIS_InteractiveObject)& anInteractive)
282 {
283   if(!myActiveObjects.IsBound(anInteractive))
284     return Standard_False;
285   const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
286   
287   //Display step
288   if(STAT->IsSubIntensityOn()) {
289     STAT->SubIntensityOff();
290     myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
291   }
292
293   Standard_Boolean status(Standard_False);
294
295   if(STAT->DisplayMode()!=-1) {
296     if(IsSelected(anInteractive))
297       AddOrRemoveSelected(anInteractive);
298     if(myMainPM->IsHighlighted(anInteractive,STAT->HilightMode()))
299       myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
300     myMainPM->SetVisibility (anInteractive, STAT->DisplayMode(), Standard_False);
301     STAT->SetDisplayMode(-1);
302     status = Standard_True;
303   }
304   if(STAT->IsTemporary()){
305     if(myMainPM->IsDisplayed(anInteractive,STAT->HilightMode()))
306       myMainPM->SetVisibility (anInteractive, STAT->HilightMode(), Standard_False);
307   }
308
309   // Deactivate selectable entities of interactive object
310   if (mySM->Contains (anInteractive))
311   {
312     TColStd_ListIteratorOfListOfInteger aModeIter (STAT->SelectionModes());
313     for (; aModeIter.More(); aModeIter.Next())
314     {
315       mySM->Deactivate (anInteractive, aModeIter.Value(), myMainVS);
316     }
317   }
318
319   ClearOutdatedSelection (anInteractive, Standard_True);
320
321   return status;
322 }
323
324
325 //=======================================================================
326 //function : SetShapeDecomposition
327 //purpose  : 
328 //=======================================================================
329
330 void AIS_LocalContext::SetShapeDecomposition(const Handle(AIS_InteractiveObject)& aStoredObject, 
331                                                 const Standard_Boolean aStatus)
332 {
333   if(!myActiveObjects.IsBound(aStoredObject)) return;
334   
335   if(aStatus == myActiveObjects(aStoredObject)->Decomposed()) 
336     return;
337   
338   myActiveObjects(aStoredObject)->SetDecomposition(aStatus);
339
340   Process(aStoredObject);
341 }
342
343 //=======================================================================
344 //function : Clear
345 //purpose  : 
346 //=======================================================================
347
348 void AIS_LocalContext::Clear(const AIS_ClearMode aType)
349 {
350   switch (aType){
351   case AIS_CM_All:
352     {
353       ClearObjects();
354       myFilters->Clear();
355       while(!myListOfStandardMode.IsEmpty())
356         DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
357       break;
358     }
359   case AIS_CM_Interactive:
360     ClearObjects();
361     break;
362   case AIS_CM_Filters:
363     myFilters->Clear();
364     break;
365   case AIS_CM_StandardModes:
366     {
367       while(!myListOfStandardMode.IsEmpty())
368         DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
369       break;
370     }
371   case AIS_CM_TemporaryShapePrs:
372     ClearDetected();
373   }
374 }
375 //=======================================================================
376 //function : ActivateMode
377 //purpose  : 
378 //=======================================================================
379
380 void AIS_LocalContext::ActivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
381                                        const Standard_Integer aMode)
382 {
383   if(!myActiveObjects.IsBound(aSelectable)) return;
384 //  if(myActiveObjects(aSelectable)->SelectionMode()!=aMode)
385 //    mySM->Deactivate(aSelectable,aMode,myMainVS);
386   if(aMode != -1){
387     myActiveObjects(aSelectable)->AddSelectionMode(aMode);
388     mySM->Activate(aSelectable,aMode,myMainVS);
389   }
390 }
391 //=======================================================================
392 //function : ActivateMode
393 //purpose  : 
394 //=======================================================================
395
396 void AIS_LocalContext::DeactivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
397                                          const Standard_Integer aMode)
398 {
399   if(!myActiveObjects.IsBound(aSelectable)) return;
400   
401   if(aMode==-1) return;
402   
403   myActiveObjects(aSelectable)->RemoveSelectionMode(aMode);
404   mySM->Deactivate(aSelectable,aMode,myMainVS);
405 }
406 //=======================================================================
407 //function : ActivateMode
408 //purpose  : 
409 //=======================================================================
410
411 void AIS_LocalContext::Deactivate(const Handle(AIS_InteractiveObject)& aSelectable)
412 {
413   if(!myActiveObjects.IsBound(aSelectable)) return;
414   
415   mySM->Deactivate(aSelectable, -1, myMainVS);
416   myActiveObjects(aSelectable)->ClearSelectionModes();
417 }
418
419 //=======================================================================
420 //function : Remove
421 //purpose  : 
422 //=======================================================================
423
424 Standard_Boolean AIS_LocalContext::Remove(const Handle(AIS_InteractiveObject)& aSelectable)
425 {
426   if(!myActiveObjects.IsBound (aSelectable))
427   {
428     return Standard_False;
429   }
430
431   if (IsSelected (aSelectable))
432   {
433     AddOrRemoveSelected (aSelectable, Standard_False);
434   }
435
436   const Handle(AIS_LocalStatus)& Att = myActiveObjects (aSelectable);
437
438   TColStd_ListIteratorOfListOfInteger It;
439
440   // Deactivate standard modes
441   if (Att->Decomposed())
442   {
443     for (It.Initialize (myListOfStandardMode); It.More(); It.Next())
444     {
445       mySM->Deactivate (aSelectable, It.Value(), myMainVS);
446     }
447   }
448
449   // If object or temporary presentations
450   if (Att->IsTemporary())
451   {
452     if (Att->IsSubIntensityOn())
453     {
454       myMainPM->Unhighlight (aSelectable, Att->HilightMode());
455     }
456
457     myMainPM->Erase (aSelectable, Att->DisplayMode());
458     myMainPM->Clear (aSelectable, Att->DisplayMode());
459     if (myMainPM->IsDisplayed (aSelectable, Att->HilightMode()))
460     {
461       myMainPM->Erase (aSelectable, Att->HilightMode());
462     }
463   }
464   // If subintensity used
465   else if (Att->IsSubIntensityOn())
466   {
467     myCTX->SubIntensityOff (aSelectable);
468   }
469
470   // Deactivate stored selection modes
471   for (It.Initialize (Att->SelectionModes()); It.More(); It.Next())
472   {
473     mySM->Deactivate (aSelectable, It.Value(), myMainVS);
474   }
475
476   // Remove the interactive object from selection manager
477   if (mySM->Contains (aSelectable))
478   {
479     mySM->Remove (aSelectable);
480   }
481   ClearOutdatedSelection (aSelectable, Standard_True);
482
483   // This should be done at the very end because most methods use
484   // myActiveObjects even during clean-up
485   myActiveObjects.UnBind (aSelectable);
486   return Standard_True;
487 }
488
489 //=======================================================================
490 //function : ActivateStandardMode
491 //purpose  : 
492 //=======================================================================
493
494 void AIS_LocalContext::ActivateStandardMode(const TopAbs_ShapeEnum aType)
495 {
496   
497   //check if it is not in the list
498   TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
499   for(;It.More();It.Next())
500     if(It.Value()==aType)  return;
501   Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
502   
503
504   // create a hidden filter answering ok to the type except for :
505   // if the type is shape...
506   // if the filters already impact at the type <aType>
507   if(aType != TopAbs_SHAPE){
508     if(myStdFilters[IMode].IsNull())
509       myStdFilters[IMode] = new StdSelect_ShapeTypeFilter(aType);
510     if(!HasFilters(aType))
511       myFilters->Add(myStdFilters[IMode]);
512   }
513   
514   // the mode is activated for all objects of type Shape 
515   // accepting the decomposition in standard mode.
516   myListOfStandardMode.Append(IMode);
517   
518   AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
519
520   for(;ItM.More();ItM.Next()){
521     if(ItM.Value()->Decomposed())
522       myCTX->SelectionManager()->Activate(ItM.Key(),
523                                           IMode,
524                                           myMainVS);
525   }
526   
527 }
528
529 //=======================================================================
530 //function : DeActivateStandardMode
531 //purpose  : 
532 //=======================================================================
533
534 void AIS_LocalContext::DeactivateStandardMode(const TopAbs_ShapeEnum aType)
535 {
536   TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
537   Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
538   for(;It.More();It.Next())
539     if(It.Value()==IMode) {
540       AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
541       
542       for(;ItM.More();ItM.Next()){
543         if(ItM.Value()->Decomposed()){
544           myCTX->SelectionManager()->Deactivate(ItM.Key(),
545                                                 IMode,
546                                                 myMainVS);
547           ItM.Value()->RemoveSelectionMode(IMode);
548         }
549       }
550       myListOfStandardMode.Remove(It);
551       if(myFilters->IsIn(myStdFilters[IMode]))
552         myFilters->Remove(myStdFilters[IMode]);
553       return;
554     }   
555 }
556
557 //=======================================================================
558 //function : AddFilter
559 //purpose  : 
560 //=======================================================================
561
562 void AIS_LocalContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
563 {
564   // it is checked if the filter impacts at the type of active sub-shape 
565   // for which a filter of type has been already implemented...
566
567   TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
568   
569   for(;It.More();It.Next()){
570     if(aFilter->ActsOn(AIS_Shape::SelectionType(It.Value())))
571       if(myFilters->IsIn(myStdFilters[It.Value()]))
572         myFilters->Remove(myStdFilters[It.Value()]);
573   } 
574   myFilters->Add(aFilter);
575 }
576
577 //=======================================================================
578 //function : RemoveFilter
579 //purpose  : 
580 //=======================================================================
581
582 void AIS_LocalContext::RemoveFilter(const Handle(SelectMgr_Filter)& aFilter)
583 {
584   if(myFilters->IsIn(aFilter)) myFilters->Remove(aFilter);
585   
586   // it is checked if the filter for type standard is active.
587   // if yes, it is checked there are still similarities among the
588   // remaining filters...
589   //     otherwise, the standard filter is restored to
590   //     continu selecting active modes...
591   TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
592   TopAbs_ShapeEnum SE;
593   for(;It.More();It.Next()){
594     SE = AIS_Shape::SelectionType(It.Value());
595     if(aFilter->ActsOn(SE))
596       if(!HasFilters(SE))
597         myFilters->Add(myStdFilters[It.Value()]);
598   }
599 }
600
601 //=======================================================================
602 //function : Terminate
603 //purpose  :
604 //=======================================================================
605
606 void AIS_LocalContext::Terminate (const Standard_Boolean theToUpdate)
607 {
608   ClearDetected();
609   Clear();
610   myMapOfOwner->Clear();
611   
612   mylastindex=0;
613   // clear the selector...
614   myMainVS->Clear();
615   
616
617   AIS_Selection::SetCurrentSelection(mySelName.ToCString());
618   Handle(AIS_Selection) S = AIS_Selection::CurrentSelection();
619   Handle(Standard_Transient) Tr;
620   for(S->Init();S->More();S->Next()){
621     Tr = S->Value();
622     (*((Handle(SelectMgr_EntityOwner)*)&Tr))->SetSelected (Standard_False);
623   }
624
625       
626   AIS_Selection::Select();
627   AIS_Selection::Remove(mySelName.ToCString());
628
629   Handle(V3d_Viewer) aViewer = myCTX->CurrentViewer();
630   for (aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews())
631   {
632     Handle(V3d_View) aView = aViewer->ActiveView();
633     aView->View()->ClearImmediate();
634   }
635
636   Handle(V3d_View) aDummyView;
637   myMainVS->ClearSensitive (aDummyView);
638
639   if (theToUpdate)
640   {
641     myCTX->UpdateCurrentViewer();
642   }
643 }
644
645
646 //=======================================================================
647 //function : SubIntensity
648 //purpose  : 
649 //=======================================================================
650
651 void AIS_LocalContext::SubIntensityOn(const Handle(AIS_InteractiveObject)& anObject)
652 {
653   if(!myActiveObjects.IsBound(anObject)) return;
654   
655   const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
656
657   if(Att->IsTemporary()) 
658     myMainPM->Color(anObject,myCTX->SubIntensityColor(),Att->DisplayMode());
659   
660   Att->SubIntensityOn();
661 }
662 //=======================================================================
663 //function : SubIntensity
664 //purpose  : 
665 //=======================================================================
666
667 void AIS_LocalContext::SubIntensityOff(const Handle(AIS_InteractiveObject)& anObject)
668 {
669   if(!myActiveObjects.IsBound(anObject)) return;
670   
671   const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
672
673   if(Att->IsTemporary()) 
674     myMainPM->Unhighlight(anObject);
675   Att->SubIntensityOff();
676 }
677
678
679 //=======================================================================
680 //function : Hilight
681 //purpose  : 
682 //=======================================================================
683
684 void AIS_LocalContext::Hilight(const  Handle(AIS_InteractiveObject)& anObject)
685 {
686   if(!myActiveObjects.IsBound(anObject)){
687     Standard_Integer HiMod = anObject->HasHilightMode()? anObject->HilightMode() : 0; 
688     Handle(AIS_LocalStatus) Att = new AIS_LocalStatus(Standard_True,
689                                                       Standard_False,
690                                                       -1,-1,HiMod);
691     myActiveObjects.Bind(anObject,Att);
692     
693   }
694   const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
695   myMainPM->Color(anObject,myCTX->HilightColor(),Att->HilightMode());
696   Att->SubIntensityOn();
697 }
698 //=======================================================================
699 //function : Hilight
700 //purpose  : 
701 //=======================================================================
702
703 void AIS_LocalContext::Hilight(const  Handle(AIS_InteractiveObject)& anObject,
704                                const Quantity_NameOfColor Col)
705 {
706   if(!myActiveObjects.IsBound(anObject)){
707     Standard_Integer HiMod = anObject->HasHilightMode()? anObject->HilightMode() : 0; 
708     Handle(AIS_LocalStatus) Att = new AIS_LocalStatus(Standard_True,
709                                                       Standard_False,
710                                                       -1,-1,HiMod);
711     myActiveObjects.Bind(anObject,Att);
712     
713   }
714   const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
715   myMainPM->Color(anObject,Col,Att->HilightMode());
716   Att->SubIntensityOn();
717   Att->SetHilightColor(Col);
718 }
719
720 //=======================================================================
721 //function : Unhilight
722 //purpose  : 
723 //=======================================================================
724
725 void AIS_LocalContext::Unhilight(const Handle(AIS_InteractiveObject)& anObject)
726 {
727   if(!myActiveObjects.IsBound(anObject)) return;
728   
729   // chieck if by hazard the object is somewhere else...
730   Standard_Integer Indx;
731   Standard_Boolean IsSomeWhereElse  = 
732     myCTX->IsInLocal(anObject,Indx) && Indx != myCTX->IndexOfCurrentLocal();
733   
734   const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
735   myMainPM->Unhighlight(anObject,Att->HilightMode());
736   if(Att->IsTemporary() && Att->DisplayMode()==-1)
737     if(!IsSomeWhereElse)
738       myMainPM->SetVisibility (anObject, Att->HilightMode(), Standard_False);
739
740   Att->SubIntensityOff();
741   Att->SetHilightColor(Quantity_NOC_WHITE);
742 }
743
744
745 //=======================================================================
746 //function : IsIn
747 //purpose  : 
748 //=======================================================================
749
750 Standard_Boolean AIS_LocalContext::
751 IsIn(const Handle(AIS_InteractiveObject)& anObject) const 
752 {
753   return myActiveObjects.IsBound(anObject);
754 }
755
756 //=======================================================================
757 //function : IsHilighted
758 //purpose  : 
759 //=======================================================================
760
761 Standard_Boolean AIS_LocalContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject) const 
762 {
763   if(!myActiveObjects.IsBound(anObject)) return Standard_False;
764   return myActiveObjects(anObject)->IsSubIntensityOn();
765 }
766
767 Standard_Boolean AIS_LocalContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject,
768                                                Standard_Boolean& WithColor,
769                                                Quantity_NameOfColor& HiCol) const 
770 {
771   if(!myActiveObjects.IsBound(anObject)) return Standard_False;
772   if( myActiveObjects(anObject)->IsSubIntensityOn()){
773     HiCol = myActiveObjects(anObject)->HilightColor();
774     if(HiCol==Quantity_NOC_WHITE)
775       WithColor = Standard_True;
776     else
777       WithColor = Standard_False;
778     return Standard_True;
779   }
780   return Standard_False;
781 }
782
783
784 void AIS_LocalContext::SetDisplayPriority(const Handle(AIS_InteractiveObject)& anObject,
785                                           const Standard_Integer Prior)
786 {
787   if(!myActiveObjects.IsBound(anObject)) return;
788   const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anObject);
789   if(STAT->DisplayMode()==-1) return;
790   myMainPM->SetDisplayPriority(anObject,STAT->DisplayMode(),Prior);
791   if(STAT->IsSubIntensityOn())
792     myMainPM->SetDisplayPriority(anObject,STAT->HilightMode(),Prior);
793   
794   
795 }
796
797 //=======================================================================
798 //function : DisplayedObjects
799 //purpose  : 
800 //=======================================================================
801 Standard_Integer AIS_LocalContext::DisplayedObjects(TColStd_MapOfTransient& theMap) const
802 {
803   Standard_Integer NbDisp(0);
804   for(AIS_DataMapIteratorOfDataMapOfSelStat it(myActiveObjects);it.More();it.Next()){
805     const Handle(SelectMgr_SelectableObject)& SO = it.Key();
806     if(!theMap.Contains(SO))
807       if(it.Value()->DisplayMode()!=-1){
808         theMap.Add(SO);
809         NbDisp++;
810       }
811   }
812   return NbDisp;
813 }
814
815
816 //=======================================================================
817 //function : IsDisplayed
818 //purpose  : 
819 //=======================================================================
820
821 Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject) const 
822 {
823   if(!myActiveObjects.IsBound(anObject)) return Standard_False;
824   return (myActiveObjects(anObject)->DisplayMode()!=-1);
825 }
826
827 //=======================================================================
828 //function : IsDisplayed
829 //purpose  : 
830 //=======================================================================
831
832 Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject,
833                                                   const Standard_Integer aMode) const 
834 {
835   if(!myActiveObjects.IsBound(anObject)) return Standard_False;
836   return (myActiveObjects(anObject)->DisplayMode()==aMode);
837 }
838
839 //=======================================================================
840 //function : SelectionModes
841 //purpose  : 
842 //=======================================================================
843
844 const TColStd_ListOfInteger& AIS_LocalContext::
845 SelectionModes(const Handle(AIS_InteractiveObject)& anObject) const 
846 {
847   return myActiveObjects(anObject)->SelectionModes(); 
848 }
849
850 //=======================================================================
851 //function : Status
852 //purpose  : 
853 //=======================================================================
854
855 TCollection_AsciiString AIS_LocalContext::Status() const 
856 {
857   TCollection_AsciiString t;
858   return t;
859 }
860
861 const Handle(AIS_LocalStatus)& AIS_LocalContext::Status(const Handle(AIS_InteractiveObject)& anObject) const 
862 {
863   return myActiveObjects(anObject);
864 }
865
866 //=======================================================================
867 //function : LoadContextObjects
868 //purpose  : 
869 //=======================================================================
870
871 void AIS_LocalContext::LoadContextObjects()
872 {
873   AIS_ListIteratorOfListOfInteractive It;
874   if(myLoadDisplayed) {
875     AIS_ListOfInteractive LL;
876     myCTX->DisplayedObjects(LL,Standard_True);
877     Handle(AIS_LocalStatus) Att;
878     for (It.Initialize(LL);It.More();It.Next()){
879       const Handle(AIS_InteractiveObject)& anObj = It.Value();
880       Att= new AIS_LocalStatus();
881       Att->SetDecomposition((anObj->AcceptShapeDecomposition() && myAcceptStdMode));
882       Att->SetTemporary(Standard_False);
883       Att->SetHilightMode(anObj->HasHilightMode()? anObj->HilightMode(): 0);
884       for (anObj->Init(); anObj->More(); anObj->Next())
885       {
886         const Handle(SelectMgr_Selection)& aSel = anObj->CurrentSelection();
887         aSel->SetSelectionState (SelectMgr_SOS_Deactivated);
888       }
889       myActiveObjects.Bind(anObj,Att);
890     }
891   }
892 }
893
894 void AIS_LocalContext::UnloadContextObjects()
895 {
896   AIS_ListIteratorOfListOfInteractive It;
897   if(myLoadDisplayed) 
898   {
899     AIS_ListOfInteractive LL;
900     myCTX->DisplayedObjects(LL,Standard_True);
901     
902     for (It.Initialize(LL);It.More();It.Next())
903     {
904       myActiveObjects.UnBind(It.Value());
905     }
906   }
907 }
908 //=======================================================================
909 //function : Process
910 //purpose  : 
911 //=======================================================================
912
913 void AIS_LocalContext::Process(const Handle(SelectMgr_SelectableObject)& anObject)
914
915   if(!myActiveObjects.IsBound(anObject)) return;
916   if(myActiveObjects(anObject)->Decomposed())
917     ActivateStandardModes(anObject);
918   else
919     {
920       TColStd_ListIteratorOfListOfInteger It(myActiveObjects(anObject)->SelectionModes());
921       for(;It.More();It.Next())
922         myCTX->SelectionManager()->Activate(anObject,It.Value(),myMainVS);
923     }
924 }
925
926 //=======================================================================
927 //function : Process
928 //purpose  : 
929 //=======================================================================
930
931 void AIS_LocalContext::Process()
932
933
934   myMainVS->Clear();
935   
936   AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
937   
938   for(;It.More();It.Next()){
939     myCTX->SelectionManager()->Load(It.Key(),myMainVS);
940     if(It.Value()->Decomposed()) 
941       ActivateStandardModes(It.Key());
942     else if( myCTX->GetAutoActivateSelection() )
943     {
944       It.Value()->AddSelectionMode(0);
945       myCTX->SelectionManager()->Activate(It.Key(),0,myMainVS);
946     }
947   }
948
949 }
950
951 //=======================================================================
952 //function : ActivateModes
953 //purpose  : 
954 //=======================================================================
955
956 void AIS_LocalContext::ActivateStandardModes(const Handle(SelectMgr_SelectableObject)& anObject)
957
958   if(!myActiveObjects.IsBound(anObject)) return;
959   
960   TColStd_ListIteratorOfListOfInteger itl (myListOfStandardMode);
961
962   const Handle(AIS_LocalStatus)&  LS = myActiveObjects(anObject);
963   if(LS->Decomposed()){
964     for(;itl.More();itl.Next()){
965       myCTX->SelectionManager()->Activate(anObject,itl.Value(),myMainVS);
966       LS->AddSelectionMode(itl.Value());
967     }
968   }
969 }
970
971
972 //=======================================================================
973 //function : ClearObjects
974 //purpose  : 
975 //=======================================================================
976
977 void AIS_LocalContext::ClearObjects()
978 {
979   AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
980   for(;It.More();It.Next())
981     {
982       Handle(AIS_InteractiveObject) SO =
983         Handle(AIS_InteractiveObject)::DownCast(It.Key());
984       
985       const Handle(AIS_LocalStatus)& CurAtt = It.Value();
986       //TColStd_ListIteratorOfListOfInteger ItL;
987       // if object is temporary the presentations managed by myMainPM are removed
988       AIS_DisplayStatus TheDS = myCTX->DisplayStatus(SO);
989       
990       if(TheDS != AIS_DS_Displayed){
991         if(myMainPM->IsDisplayed(SO,CurAtt->DisplayMode())){
992           if(CurAtt->IsSubIntensityOn()&&
993              myMainPM->IsHighlighted(SO,CurAtt->HilightMode()))
994             myMainPM->Unhighlight(SO,CurAtt->HilightMode());
995           myMainPM->Erase(SO,CurAtt->DisplayMode());
996         }
997         
998         if(CurAtt->IsTemporary()){
999           myMainPM->Erase(SO,CurAtt->DisplayMode());}
1000 //        myMainPM->Clear(SO,CurAtt->DisplayMode());}
1001       }
1002       else {
1003         if (CurAtt->IsSubIntensityOn()){
1004           myCTX->SubIntensityOff(Handle(AIS_InteractiveObject)::DownCast(SO));}
1005         Standard_Integer DiMo = SO->HasDisplayMode()?
1006           SO->DisplayMode():myCTX->DisplayMode();
1007         if(CurAtt->DisplayMode()!=-1 &&
1008            CurAtt->DisplayMode()!= DiMo)
1009           myMainPM->Erase(SO,CurAtt->DisplayMode());
1010       }
1011       
1012       TColStd_ListIteratorOfListOfInteger aSelModeIter (CurAtt->SelectionModes());
1013       for ( ; aSelModeIter.More(); aSelModeIter.Next())
1014       {
1015         Standard_Integer aSelMode = aSelModeIter.Value();
1016         mySM->Deactivate (SO, aSelMode, myMainVS);
1017       }
1018
1019     }
1020   ClearSelected( Standard_False );
1021
1022   // Clear selection structures for temporary objects, created in local context
1023   for (AIS_DataMapIteratorOfDataMapOfSelStat anIter (myActiveObjects); anIter.More(); anIter.Next())
1024   {
1025     if (anIter.Value()->IsTemporary())
1026     {
1027       mySM->Remove (anIter.Key(), myMainVS);
1028     }
1029   }
1030
1031   myActiveObjects.Clear();
1032 }
1033
1034
1035 Standard_Boolean AIS_LocalContext::IsDecompositionOn() const 
1036 {return !myListOfStandardMode.IsEmpty();}
1037
1038
1039
1040
1041 //=======================================================================
1042 //function : HasAlreadyFilters
1043 //purpose  : 
1044 //=======================================================================
1045
1046 Standard_Boolean AIS_LocalContext::
1047 HasFilters(const TopAbs_ShapeEnum aType) const 
1048 {
1049   return myFilters->ActsOn(aType);
1050 }
1051
1052 void AIS_LocalContext::ClearDetected()
1053 {
1054   for(Standard_Integer I=1;I<=myMapOfOwner->Extent();I++)
1055   {
1056     if(!myMapOfOwner->FindKey (I).IsNull())
1057     {
1058       if(myMapOfOwner->FindKey (I)->IsHilighted(myMainPM))
1059         myMapOfOwner->FindKey (I)->Unhilight(myMainPM);
1060       else
1061       {
1062         const Handle(SelectMgr_SelectableObject)& SO = 
1063           myMapOfOwner->FindKey (I)->Selectable();
1064         if(myActiveObjects.IsBound(SO))
1065         {
1066           const Handle(AIS_LocalStatus)& Att = myActiveObjects(SO);
1067
1068           if(Att->IsTemporary() &&
1069              Att->DisplayMode()==-1 && 
1070              Att->SelectionModes().IsEmpty())
1071           {
1072             myMapOfOwner->FindKey (I)->Clear(myMainPM);
1073           }
1074         }
1075       }
1076     }
1077   }
1078 }
1079
1080 //=======================================================================
1081 //function : BeginImmediateDraw
1082 //purpose  :
1083 //=======================================================================
1084 Standard_Boolean AIS_LocalContext::BeginImmediateDraw()
1085 {
1086   if (myMainPM->IsImmediateModeOn())
1087   {
1088     myMainPM->BeginImmediateDraw();
1089     return Standard_True;
1090   }
1091   return Standard_False;
1092 }
1093
1094 //=======================================================================
1095 //function : ImmediateAdd
1096 //purpose  :
1097 //=======================================================================
1098 Standard_Boolean AIS_LocalContext::ImmediateAdd (const Handle(AIS_InteractiveObject)& theObj,
1099                                                  const Standard_Integer               theMode)
1100 {
1101   if (!myMainPM->IsImmediateModeOn())
1102   {
1103     return Standard_False;
1104   }
1105
1106   myMainPM->AddToImmediateList (myMainPM->Presentation (theObj, theMode)->Presentation());
1107   return Standard_True;
1108 }
1109
1110 //=======================================================================
1111 //function : EndImmediateDraw
1112 //purpose  :
1113 //=======================================================================
1114 Standard_Boolean AIS_LocalContext::EndImmediateDraw (const Handle(V3d_View)& theView)
1115 {
1116   if (!myMainPM->IsImmediateModeOn())
1117   {
1118     return Standard_False;
1119   }
1120
1121   myMainPM->EndImmediateDraw (theView);
1122   return Standard_True;
1123 }
1124
1125 // =======================================================================
1126 // function : ClearImmediateDraw
1127 // purpose  :
1128 // =======================================================================
1129 void AIS_LocalContext::ClearImmediateDraw()
1130 {
1131   myMainPM->ClearImmediateDraw();
1132 }
1133
1134 //=======================================================================
1135 //function : IsImmediateModeOn
1136 //purpose  :
1137 //=======================================================================
1138 Standard_Boolean AIS_LocalContext::IsImmediateModeOn() const
1139 {
1140   return myMainPM->IsImmediateModeOn();
1141 }
1142
1143 void AIS_LocalContext::SetPixelTolerance(const Standard_Real aPrecision) {
1144
1145   myMainVS->SetPixelTolerance(aPrecision);
1146 }
1147
1148 Standard_Real AIS_LocalContext::PixelTolerance() const {
1149
1150   return myMainVS->PixelTolerance();
1151 }