Salome HOME
SPlot2d_Viewer connected to Plot2d_ViewManager
[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   QObject( 0 ),
48   SUIT_Selector( mgr ),
49   myViewer( viewer )
50 {
51   if ( myViewer )
52     connect( myViewer, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
53 }
54
55 SalomeApp_VTKSelector
56 ::~SalomeApp_VTKSelector()
57 {
58 }
59
60 SVTK_Viewer* 
61 SalomeApp_VTKSelector
62 ::viewer() const
63 {
64   return myViewer;
65 }
66
67 QString
68 SalomeApp_VTKSelector
69 ::type() const
70
71   return SVTK_Viewer::Type(); 
72 }
73
74 void
75 SalomeApp_VTKSelector
76 ::onSelectionChanged()
77 {
78   selectionChanged();
79 }
80
81 void
82 SalomeApp_VTKSelector
83 ::getSelection( SUIT_DataOwnerPtrList& aList ) const
84 {
85   if(myViewer){
86     if(SUIT_ViewManager* aViewMgr = myViewer->getViewManager()){
87       if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewMgr->getActiveView())){
88         if(SVTK_Selector* aSelector = aView->GetSelector()){
89           Selection_Mode aMode = aSelector->SelectionMode();
90           const SALOME_ListIO& aListIO = aSelector->StoredIObjects();
91           SALOME_ListIteratorOfListIO anIter(aListIO);
92           for(; anIter.More(); anIter.Next()){
93             Handle(SALOME_InteractiveObject) anIO = anIter.Value();
94             if(anIO->hasEntry()){
95               TColStd_IndexedMapOfInteger anIds;
96               aSelector->GetIndex(anIO,anIds);
97               SALOME_Actor* anActor = aSelector->GetActor(anIO);
98               aList.append(new SalomeApp_SVTKDataOwner(anIO,anIds,aMode,anActor));
99               if(MYDEBUG) MESSAGE("VTKSelector::getSelection - "<<anIO->getEntry());
100             }
101           }
102         }
103       }
104     }
105   }
106 }
107
108 void 
109 SalomeApp_VTKSelector
110 ::setSelection( const SUIT_DataOwnerPtrList& theList )
111 {
112   if(myViewer){
113     if(SUIT_ViewManager* aViewMgr = myViewer->getViewManager()){
114       if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewMgr->getActiveView())){
115         if(SVTK_Selector* aSelector = aView->GetSelector()){
116           SALOME_ListIO anAppendList;
117           const SALOME_ListIO& aStoredList = aSelector->StoredIObjects();
118           SUIT_DataOwnerPtrList::const_iterator anIter = theList.begin();
119           for(; anIter != theList.end(); ++anIter){
120             const SUIT_DataOwner* aDataOwner = (*anIter).get();
121             if(const SalomeApp_SVTKDataOwner* anOwner = dynamic_cast<const SalomeApp_SVTKDataOwner*>(aDataOwner)){
122               aSelector->SetSelectionMode(anOwner->GetMode());
123               Handle(SALOME_InteractiveObject) anIO = anOwner->IO();
124               aSelector->AddIObject(anIO);
125               anAppendList.Append(anIO);
126               aSelector->AddOrRemoveIndex(anIO,anOwner->GetIds(),false);
127               if(MYDEBUG) MESSAGE("VTKSelector::setSelection - SVTKDataOwner - "<<anIO->getEntry());
128             }else if(const SalomeApp_DataOwner* anOwner = dynamic_cast<const SalomeApp_DataOwner*>(aDataOwner)){
129               Handle(SALOME_InteractiveObject) anIO = 
130                 new SALOME_InteractiveObject(anOwner->entry().latin1(),"");
131               aSelector->AddIObject(anIO);
132               anAppendList.Append(anIO);
133               if(MYDEBUG) MESSAGE("VTKSelector::setSelection - DataOwner - "<<anIO->getEntry());
134             }
135           }
136           // To remove IOs, which is not selected.
137           QMap< QString, Handle( SALOME_InteractiveObject )> toRemove;
138           SALOME_ListIteratorOfListIO anIt( aStoredList );
139           for( ; anIt.More(); anIt.Next() )
140             if( !anIt.Value().IsNull() )
141               toRemove[ anIt.Value()->getEntry() ] = anIt.Value();
142
143           anIt = SALOME_ListIteratorOfListIO(anAppendList);
144           for( ; anIt.More(); anIt.Next() )
145             toRemove.remove( anIt.Value()->getEntry() );
146
147           QMap< QString, Handle( SALOME_InteractiveObject )>::const_iterator RIt = toRemove.begin(),
148                                                                              REnd = toRemove.end();
149           for( ; RIt!=REnd; RIt++ )
150             aSelector->RemoveIObject( RIt.data() );
151           
152           aView->onSelectionChanged();
153         }
154       }
155     }
156   }
157 }