Salome HOME
SMH: Fix for compilation with correct CASCADE
[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 int OB_ListView::addColumn( const QString& label, int width )
51 {
52   int res = QListView::addColumn( label, width );
53
54   updateHeader();
55
56   return res;
57 }
58
59 int OB_ListView::addColumn( const QIconSet& iconset, const QString& label, int width )
60 {
61   int res = QListView::addColumn( iconset, label, width );
62
63   updateHeader();
64
65   return res;
66 }
67
68 QDragObject* OB_ListView::dragObject()
69 {
70   myItems.clear();
71
72   for ( QListViewItemIterator it( this ); it.current(); ++it )
73     if ( it.current()->isSelected() )
74       myItems.append( it.current() );
75
76   return new QTextDrag( "", this );
77 }
78
79 void OB_ListView::dragEnterEvent( QDragEnterEvent* e )
80 {
81   e->accept();
82 }
83
84 void OB_ListView::dragMoveEvent( QDragMoveEvent* e )
85 {
86   QListViewItem* item = dropItem( e );
87
88   if ( isDropAccepted( item ) )
89   {
90     setCurrentItem( item );
91     e->accept( true );
92   }
93   else
94     e->accept( false );
95 }
96
97 void OB_ListView::dropEvent( QDropEvent* e )
98 {
99   QListViewItem* item = dropItem( e );
100   if ( isDropAccepted( item ) )
101   {
102     e->accept();
103     emit dropped( myItems, item, e->action() );
104   }
105   myItems.clear();
106 }
107
108 QListViewItem* OB_ListView::dropItem( QDropEvent* e ) const
109 {
110   QListViewItem* item = 0;
111   if ( e )
112     item = itemAt( QPoint( e->pos().x() - viewport()->x(), e->pos().y() - viewport()->y() ) );
113
114   return item;
115 }
116
117 SUIT_DataObject* OB_ListView::dataObject( QListViewItem* item ) const
118 {
119   if ( !item )
120     return 0;
121
122   SUIT_DataObject* obj = 0;
123
124   if ( dynamic_cast<OB_ListItem*>( item ) )
125     obj = dynamic_cast<OB_ListItem*>( item )->dataObject();
126   else if ( dynamic_cast<OB_CheckListItem*>( item ) )
127     obj = dynamic_cast<OB_CheckListItem*>( item )->dataObject();
128
129   return obj;
130 }
131
132 bool OB_ListView::isDropAccepted( QListViewItem* item ) const
133 {
134   bool res = true;
135
136   for ( QPtrListIterator<QListViewItem> it( myItems ); it.current() && res; ++it )
137     res = res && isDropAccepted( it.current(), item );
138
139   return res;
140 }
141
142 bool OB_ListView::isDropAccepted( QListViewItem* drag, QListViewItem* drop ) const
143 {
144   SUIT_DataObject* dragObj = dataObject( drag );
145   SUIT_DataObject* dropObj = dataObject( drop );
146
147   if ( !dragObj || !dropObj )
148     return false;
149
150   return dropObj->isDropAccepted( dragObj );
151 }
152
153 void OB_ListView::updateHeader()
154 {
155
156 }