Salome HOME
PAL10125 - by double click on reference original object becomes selected
[modules/gui.git] / src / ObjBrowser / OB_ListView.cxx
1 #include "OB_ListView.h"
2
3 #include "OB_Filter.h"
4 #include "OB_ListItem.h"
5
6 #include <SUIT_DataObject.h>
7
8 #include <qdragobject.h>
9
10 OB_ListView::OB_ListView( QWidget* parent, const char* name, WFlags f )
11 : QtxListView( parent, name, f ),
12 myFilter( 0 )
13 {
14 }
15
16 OB_ListView::OB_ListView( const int state, QWidget* parent, const char* name, WFlags f )
17 : QtxListView( state, parent, name, f ),
18 myFilter( 0 )
19 {
20 }
21
22 OB_ListView::~OB_ListView()
23 {
24   delete myFilter;
25 }
26
27 OB_Filter* OB_ListView::filter() const
28 {
29   return myFilter;
30 }
31
32 void OB_ListView::setFilter( OB_Filter* f )
33 {
34   if ( myFilter == f )
35     return;
36
37   delete myFilter;
38   myFilter = f;
39 }
40
41 bool OB_ListView::isOk( QListViewItem* item ) const
42 {
43   bool ok = true;
44   SUIT_DataObject* obj = dataObject( item );
45   if ( obj && filter() )
46     ok = filter()->isOk( obj );
47   return ok;
48 }
49
50 QDragObject* OB_ListView::dragObject()
51 {
52   myItems.clear();
53
54   for ( QListViewItemIterator it( this ); it.current(); ++it )
55     if ( it.current()->isSelected() )
56       myItems.append( it.current() );
57
58   return new QTextDrag( "", this );
59 }
60
61 void OB_ListView::dragEnterEvent( QDragEnterEvent* e )
62 {
63   e->accept();
64 }
65
66 void OB_ListView::dragMoveEvent( QDragMoveEvent* e )
67 {
68   QListViewItem* item = dropItem( e );
69
70   if ( isDropAccepted( item ) )
71   {
72     setCurrentItem( item );
73     e->accept( true );
74   }
75   else
76     e->accept( false );
77 }
78
79 void OB_ListView::dropEvent( QDropEvent* e )
80 {
81   QListViewItem* item = dropItem( e );
82   if ( isDropAccepted( item ) )
83   {
84     e->accept();
85     emit dropped( myItems, item, e->action() );
86   }
87   myItems.clear();
88 }
89
90 void OB_ListView::keyPressEvent( QKeyEvent* ke )
91 {
92   if ( ( ke->key() == Qt::Key_Plus || ke->key() == Qt::Key_Minus ) && ke->state() & ControlButton )
93   {
94     bool isOpen = ke->key() == Qt::Key_Plus;
95     for ( QListViewItemIterator it( this ); it.current(); ++it )
96       if ( it.current()->childCount() )
97         it.current()->setOpen( isOpen );
98   }
99   else
100     QtxListView::keyPressEvent( ke );
101 }
102
103 QListViewItem* OB_ListView::dropItem( QDropEvent* e ) const
104 {
105   QListViewItem* item = 0;
106   if ( e )
107     item = itemAt( QPoint( e->pos().x() - viewport()->x(), e->pos().y() - viewport()->y() ) );
108
109   return item;
110 }
111
112 SUIT_DataObject* OB_ListView::dataObject( QListViewItem* item ) const
113 {
114   if ( !item )
115     return 0;
116
117   SUIT_DataObject* obj = 0;
118
119   if ( dynamic_cast<OB_ListItem*>( item ) )
120     obj = dynamic_cast<OB_ListItem*>( item )->dataObject();
121   else if ( dynamic_cast<OB_CheckListItem*>( item ) )
122     obj = dynamic_cast<OB_CheckListItem*>( item )->dataObject();
123
124   return obj;
125 }
126
127 bool OB_ListView::isDropAccepted( QListViewItem* item ) const
128 {
129   bool res = true;
130
131   for ( QPtrListIterator<QListViewItem> it( myItems ); it.current() && res; ++it )
132     res = res && isDropAccepted( it.current(), item );
133
134   return res;
135 }
136
137 bool OB_ListView::isDropAccepted( QListViewItem* drag, QListViewItem* drop ) const
138 {
139   SUIT_DataObject* dragObj = dataObject( drag );
140   SUIT_DataObject* dropObj = dataObject( drop );
141
142   if ( !dragObj || !dropObj )
143     return false;
144
145   return dropObj->isDropAccepted( dragObj );
146 }