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