Salome HOME
Join modifications from BR_Dev_For_4_0 tag V4_1_1.
[modules/gui.git] / src / QDS / QDS_Table.cxx
1 // Copyright (C) 2005  CEA/DEN, EDF R&D, OPEN CASCADE, PRINCIPIA R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
7 //
8 // This library is distributed in the hope that it will be useful
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "QDS_Table.h"
21
22 #include "QDS_LineEdit.h"
23
24 class QDS_Table::DeleteFilter : public QObject
25 {
26 public:
27   DeleteFilter( QObject* = 0 );
28   virtual ~DeleteFilter();
29
30   virtual bool eventFilter( QObject*, QEvent* );
31 };
32
33 QDS_Table::DeleteFilter::DeleteFilter( QObject* parent )
34 : QObject( parent )
35 {
36 }
37
38 QDS_Table::DeleteFilter::~DeleteFilter()
39 {
40 }
41
42 bool QDS_Table::DeleteFilter::eventFilter( QObject* o, QEvent* e )
43 {
44   if ( e->type() == QEvent::DeferredDelete )
45     return true;
46   else
47     return false;
48 }
49
50 QDS_Table::QDS_Table( QWidget* parent, const char* name )
51 : QtxTable( parent, name ),
52 myHorEdit( 0 ),
53 myVerEdit( 0 ),
54 myTableEdit( 0 ),
55 myKeepEdits( false )
56 {
57 }
58
59 QDS_Table::QDS_Table( int r, int c, QWidget* parent, const char* name )
60 : QtxTable( r, c, parent, name ),
61 myHorEdit( 0 ),
62 myVerEdit( 0 ),
63 myTableEdit( 0 ),
64 myKeepEdits( false )
65 {
66   myRowEdit.resize( r );
67   myColEdit.resize( c );
68 }
69
70 QDS_Table::~QDS_Table()
71 {
72 }
73
74 QDS_Datum* QDS_Table::horizontalHeaderEditor() const
75 {
76   return myHorEdit;
77 }
78
79 QDS_Datum* QDS_Table::verticalHeaderEditor() const
80 {
81   return myVerEdit;
82 }
83
84 QDS_Datum* QDS_Table::headerEditor( const Orientation o ) const
85 {
86   return o == Horizontal ? myHorEdit : myVerEdit;
87 }
88
89 void QDS_Table::setVerticalHeaderEditor( QDS_Datum* dat )
90 {
91   setHeaderEditor( Vertical, dat );
92 }
93
94 void QDS_Table::setHorizontalHeaderEditor( QDS_Datum* dat )
95 {
96   setHeaderEditor( Horizontal, dat );
97 }
98
99 void QDS_Table::setHeaderEditor( QDS_Datum* dat )
100 {
101   setHeaderEditor( Vertical, dat );
102   setHeaderEditor( Horizontal, dat );
103 }
104
105 void QDS_Table::setHeaderEditor( const Orientation o, QDS_Datum* dat )
106 {
107   if ( headerEditor( o ) == dat )
108     return;
109
110   if ( isHeaderEditing() )
111     endEditHeader();
112
113   if ( o == Horizontal )
114     myHorEdit = dat;
115   else
116     myVerEdit = dat;
117
118   initEditor( dat );
119 }
120
121 QDS_Datum* QDS_Table::tableEditor() const
122 {
123   return myTableEdit;
124 }
125
126 QDS_Datum* QDS_Table::rowEditor( const int row ) const
127 {
128   if ( row < 0 || row >= (int)myRowEdit.size() )
129     return 0;
130
131   return myRowEdit.at( row );
132 }
133
134 QDS_Datum* QDS_Table::columnEditor( const int col ) const
135 {
136   if ( col < 0 || col >= (int)myColEdit.size() )
137     return 0;
138
139   return myColEdit.at( col );
140 }
141
142 QDS_Datum* QDS_Table::cellEditor( const int row, const int col ) const
143 {
144   if ( !myCellEdit.contains( row ) )
145     return 0;
146
147   const DatumMap& map = myCellEdit[row];
148   return map.contains( col ) ? map[col] : 0;
149 }
150
151 void QDS_Table::setTableEditor( QDS_Datum* dat )
152 {
153   if ( tableEditor() == dat )
154     return;
155
156   if ( isEditing() && !cellEditor( currEditRow(), currEditCol() ) &&
157        !columnEditor( currEditCol() ) && !rowEditor( currEditRow() ) )
158     endEdit( currEditRow(), currEditCol(), false, false );
159
160   myTableEdit = dat;
161   initEditor( dat );
162 }
163
164 void QDS_Table::setRowEditor( const int row, QDS_Datum* dat )
165 {
166   if ( row < 0 || row >= (int)myRowEdit.size() || rowEditor( row ) == dat )
167     return;
168
169   if ( isEditing() && row == currEditRow()&&
170        !cellEditor( currEditRow(), currEditCol() ) )
171     endEdit( currEditRow(), currEditCol(), false, false );
172
173   myRowEdit.insert( row, dat );
174   initEditor( dat );
175 }
176
177 void QDS_Table::setColumnEditor( const int col, QDS_Datum* dat )
178 {
179   if ( col < 0 || col >= (int)myColEdit.size() || columnEditor( col ) == dat )
180     return;
181
182   if ( isEditing() && col == currEditCol()&&
183        !cellEditor( currEditRow(), currEditCol() ) )
184     endEdit( currEditRow(), currEditCol(), false, false );
185
186   myColEdit.insert( col, dat );
187   initEditor( dat );
188 }
189
190 void QDS_Table::setCellEditor( const int row, const int col, QDS_Datum* dat )
191 {
192   if ( row < 0 || row >= numRows() || col < 0 || col >= numCols() || cellEditor( row, col ) == dat )
193     return;
194
195   if ( isEditing() && currEditRow() == row && currEditCol() == col && actualCellEditor( row, col ) != dat )
196     endEdit( currEditRow(), currEditCol(), false, false );
197
198   if ( !myCellEdit.contains( row ) )
199     myCellEdit.insert( row, DatumMap() );
200
201   myCellEdit[row].insert( col, dat );
202   initEditor( dat );
203 }
204
205 QDS_Datum* QDS_Table::actualCellEditor( const int row, const int col ) const
206 {
207   QDS_Datum* dat = cellEditor( row, col );
208   if ( !dat )
209     dat = columnEditor( col );
210   if ( !dat )
211     dat = rowEditor( row );
212   if ( !dat )
213     dat = tableEditor();
214   return dat;
215 }
216
217 void QDS_Table::setNumRows( int r )
218 {
219   int old = numRows();
220   QtxTable::setNumRows( r );
221
222   if ( isKeepEditors() )
223     myRowEdit.resize( QMAX( (int)myRowEdit.size(), r ) );
224   else
225   {
226     myRowEdit.resize( r );
227     for ( int i = r + 1; i <= old; i++ )
228       myCellEdit.remove( i );
229   }
230 }
231
232 void QDS_Table::setNumCols( int c )
233 {
234   int old = numCols();
235   QtxTable::setNumCols( c );
236
237   if ( isKeepEditors() )
238     myColEdit.resize( QMAX( (int)myColEdit.size(), c ) );
239   else
240   {
241     myColEdit.resize( c );
242     for ( CellMap::Iterator it = myCellEdit.begin(); it != myCellEdit.end(); ++it )
243     {
244       DatumMap& map = it.data();
245       for ( int i = c + 1; i <= old; i++ )
246         map.remove( i );
247     }
248   }
249 }
250
251 void QDS_Table::clearCellWidget( int row, int col )
252 {
253   QDS_Datum* dat = actualCellEditor( row, col );
254   if ( dat )
255     dat->hide();
256
257   QtxTable::clearCellWidget( row, col );
258 }
259
260 bool QDS_Table::isKeepEditors() const
261 {
262   return myKeepEdits;
263 }
264
265 void QDS_Table::setKeepEditors( const bool on )
266 {
267   myKeepEdits = on;
268 }
269
270 QWidget* QDS_Table::createHeaderEditor( QHeader* header, const int sect, const bool init )
271 {
272   if ( !header )
273     return 0;
274
275   QDS_Datum* dat = headerEditor( header->orientation() );
276   QWidget* wid = dat ? dat->widget( QDS::Control ) : 0;
277   if ( wid )
278   {
279     if ( init )
280       dat->setStringValue( header->label( sect ) );
281     else
282       dat->clear();
283     dat->setProperty( "Selection", true );
284   }
285   else
286     wid = QtxTable::createHeaderEditor( header, sect, init );
287
288   return wid;
289 }
290
291 QWidget* QDS_Table::createEditor( int row, int col, bool init ) const
292 {
293   QDS_Datum* dat = actualCellEditor( row, col );
294   QWidget* wid = dat ? dat->widget( QDS::Control ) : 0;
295   if ( wid )
296   {
297     if ( init )
298       dat->setStringValue( text( row, col ) );
299     else
300       dat->clear();
301     dat->setProperty( "Selection", true );
302   }
303   else
304     wid = QtxTable::createEditor( row, col, init );
305
306   return wid;
307 }
308
309 void QDS_Table::endEdit( int row, int col, bool accept, bool )
310 {
311   QtxTable::endEdit( row, col, accept, true );
312 }
313
314 void QDS_Table::setCellContentFromEditor( int row, int col )
315 {
316   QDS_Datum* dat = actualCellEditor( row, col );
317   if ( dat )
318     setText( row, col, dat->stringValue() );
319   else
320     QtxTable::setCellContentFromEditor( row, col );
321 }
322
323 void QDS_Table::setHeaderContentFromEditor( QHeader* header, const int sect, QWidget* editor )
324 {
325   if ( !header )
326     return;
327
328   QDS_Datum* dat = headerEditor( header->orientation() );
329   if ( dat )
330     header->setLabel( sect, dat->stringValue() );
331   else
332     QtxTable::setHeaderContentFromEditor( header, sect, editor );
333 }
334
335 void QDS_Table::initEditor( QDS_Datum* dat )
336 {
337   if ( !dat )
338     return;
339
340   dat->hide();
341
342   static QGuardedPtr<DeleteFilter> _filter = 0;
343   if ( !_filter )
344     _filter = new DeleteFilter( 0 );
345
346   if ( dat->widget( QDS::Control ) )
347     dat->widget( QDS::Control )->installEventFilter( _filter );
348 }