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