Salome HOME
Bug 9193:
[modules/gui.git] / src / SalomeApp / SalomeApp_VTKSelector.cxx
1 #include "SalomeApp_VTKSelector.h"
2 #include "SalomeApp_DataOwner.h"
3
4 #include "SVTK_ViewModel.h"
5 #include "SVTK_Selector.h"
6 #include "SVTK_ViewWindow.h"
7 #include "SVTK_Functor.h"
8
9 #include "SALOME_Actor.h"
10 #include "SALOME_ListIteratorOfListIO.hxx"
11
12 #include "VTKViewer_Algorithm.h"
13
14 #include <vtkRenderer.h>
15
16 #include "utilities.h"
17
18 #ifdef _DEBUG_
19 static int MYDEBUG = 1;
20 #else
21 static int MYDEBUG = 0;
22 #endif
23
24 SalomeApp_SVTKDataOwner
25 ::SalomeApp_SVTKDataOwner( const Handle(SALOME_InteractiveObject)& theIO,
26                            const TColStd_IndexedMapOfInteger& theIds,
27                            Selection_Mode theMode,
28                            SALOME_Actor* theActor):
29   SalomeApp_DataOwner( theIO ),
30   mySelectionMode(theMode),
31   myActor(theActor)
32 {
33   myIds = theIds; // workaround - there is no constructor copy for the container
34 }
35
36 SalomeApp_SVTKDataOwner
37 ::~SalomeApp_SVTKDataOwner()
38 {
39 }
40
41 SALOME_Actor* 
42 SalomeApp_SVTKDataOwner
43 ::GetActor() const
44 {
45   return myActor.GetPointer();
46 }
47
48
49 SalomeApp_VTKSelector
50 ::SalomeApp_VTKSelector( SVTK_Viewer* viewer, 
51                          SUIT_SelectionMgr* mgr ): 
52   SUIT_Selector( mgr, viewer ),
53   myViewer( viewer )
54 {
55   if ( myViewer )
56     connect( myViewer, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
57 }
58
59 SalomeApp_VTKSelector
60 ::~SalomeApp_VTKSelector()
61 {
62 }
63
64 SVTK_Viewer* 
65 SalomeApp_VTKSelector
66 ::viewer() const
67 {
68   return myViewer;
69 }
70
71 QString
72 SalomeApp_VTKSelector
73 ::type() const
74
75   return SVTK_Viewer::Type(); 
76 }
77
78 void
79 SalomeApp_VTKSelector
80 ::onSelectionChanged()
81 {
82   selectionChanged();
83 }
84
85 void
86 SalomeApp_VTKSelector
87 ::getSelection( SUIT_DataOwnerPtrList& aList ) const
88 {
89   if(myViewer){
90     if(SUIT_ViewManager* aViewMgr = myViewer->getViewManager()){
91       if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewMgr->getActiveView())){
92         if(SVTK_Selector* aSelector = aView->GetSelector()){
93           Selection_Mode aMode = aSelector->SelectionMode();
94           const SALOME_ListIO& aListIO = aSelector->StoredIObjects();
95           SALOME_ListIteratorOfListIO anIter(aListIO);
96           for(; anIter.More(); anIter.Next()){
97             Handle(SALOME_InteractiveObject) anIO = anIter.Value();
98             if(anIO->hasEntry()){
99               TColStd_IndexedMapOfInteger anIds;
100               aSelector->GetIndex(anIO,anIds);
101               SALOME_Actor* anActor = aSelector->GetActor(anIO);
102               if( !anActor )
103                 anActor = VTK::Find<SALOME_Actor>(aView->getRenderer()->GetActors(),VTK::TIsSameIObject<SALOME_Actor>(anIO));
104
105               aList.append(new SalomeApp_SVTKDataOwner(anIO,anIds,aMode,anActor));
106               if(MYDEBUG) MESSAGE("VTKSelector::getSelection - "<<anIO->getEntry());
107             }
108           }
109         }
110       }
111     }
112   }
113 }
114
115 void 
116 SalomeApp_VTKSelector
117 ::setSelection( const SUIT_DataOwnerPtrList& theList )
118 {
119   if(myViewer){
120     if(SUIT_ViewManager* aViewMgr = myViewer->getViewManager()){
121       if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewMgr->getActiveView())){
122         if(SVTK_Selector* aSelector = aView->GetSelector()){
123           SALOME_ListIO anAppendList;
124           const SALOME_ListIO& aStoredList = aSelector->StoredIObjects();
125           SUIT_DataOwnerPtrList::const_iterator anIter = theList.begin();
126           for(; anIter != theList.end(); ++anIter){
127             const SUIT_DataOwner* aDataOwner = (*anIter).get();
128             if(const SalomeApp_SVTKDataOwner* anOwner = dynamic_cast<const SalomeApp_SVTKDataOwner*>(aDataOwner)){
129               aSelector->SetSelectionMode(anOwner->GetMode());
130               Handle(SALOME_InteractiveObject) anIO = anOwner->IO();
131
132               if( anOwner->GetActor() )
133                 aSelector->AddIObject( anOwner->GetActor() );
134               else
135                 aSelector->AddIObject(anIO);
136
137               anAppendList.Append(anIO);
138               aSelector->AddOrRemoveIndex(anIO,anOwner->GetIds(),false);
139               if(MYDEBUG) MESSAGE("VTKSelector::setSelection - SVTKDataOwner - "<<anIO->getEntry());
140             }else if(const SalomeApp_DataOwner* anOwner = dynamic_cast<const SalomeApp_DataOwner*>(aDataOwner)){
141               Handle(SALOME_InteractiveObject) anIO = 
142                 new SALOME_InteractiveObject(anOwner->entry().latin1(),"");
143               aSelector->AddIObject(anIO);
144               anAppendList.Append(anIO);
145               if(MYDEBUG) MESSAGE("VTKSelector::setSelection - DataOwner - "<<anIO->getEntry());
146             }
147           }
148           // To remove IOs, which is not selected.
149           QMap< QString, Handle( SALOME_InteractiveObject )> toRemove;
150           SALOME_ListIteratorOfListIO anIt( aStoredList );
151           for( ; anIt.More(); anIt.Next() )
152             if( !anIt.Value().IsNull() )
153               toRemove[ anIt.Value()->getEntry() ] = anIt.Value();
154
155           anIt = SALOME_ListIteratorOfListIO(anAppendList);
156           for( ; anIt.More(); anIt.Next() )
157             toRemove.remove( anIt.Value()->getEntry() );
158
159           QMap< QString, Handle( SALOME_InteractiveObject )>::const_iterator RIt = toRemove.begin(),
160                                                                              REnd = toRemove.end();
161           for( ; RIt!=REnd; RIt++ )
162             aSelector->RemoveIObject( RIt.data() );
163           
164           aView->onSelectionChanged();
165         }
166       }
167     }
168   }
169 }