source: trunk/include/qtable.h@ 196

Last change on this file since 196 was 164, checked in by dmik, 19 years ago

Imported table and iconview modules and a bunch of dependent examples from /vendor/trolltech/3.3.1 to the trunk.

  • Property svn:keywords set to Id
File size: 18.6 KB
Line 
1/****************************************************************************
2**
3** Definition of QTable widget class
4**
5** Created : 000607
6**
7** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
8**
9** This file is part of the table module of the Qt GUI Toolkit.
10**
11** This file may be distributed under the terms of the Q Public License
12** as defined by Trolltech AS of Norway and appearing in the file
13** LICENSE.QPL included in the packaging of this file.
14**
15** This file may be distributed and/or modified under the terms of the
16** GNU General Public License version 2 as published by the Free Software
17** Foundation and appearing in the file LICENSE.GPL included in the
18** packaging of this file.
19**
20** Licensees holding valid Qt Enterprise Edition licenses may use this
21** file in accordance with the Qt Commercial License Agreement provided
22** with the Software.
23**
24** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
25** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
26**
27** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
28** information about Qt Commercial License Agreements.
29** See http://www.trolltech.com/qpl/ for QPL licensing information.
30** See http://www.trolltech.com/gpl/ for GPL licensing information.
31**
32** Contact info@trolltech.com if any conditions of this licensing are
33** not clear to you.
34**
35**********************************************************************/
36
37#ifndef QTABLE_H
38#define QTABLE_H
39
40#ifndef QT_H
41#include "qscrollview.h"
42#include "qpixmap.h"
43#include "qptrvector.h"
44#include "qheader.h"
45#include "qmemarray.h"
46#include "qptrlist.h"
47#include "qguardedptr.h"
48#include "qshared.h"
49#include "qintdict.h"
50#include "qstringlist.h"
51#endif // QT_H
52
53
54#ifndef QT_NO_TABLE
55
56#if !defined( QT_MODULE_TABLE ) || defined( QT_LICENSE_PROFESSIONAL ) || defined( QT_INTERNAL_TABLE )
57#define QM_EXPORT_TABLE
58#ifndef QM_TEMPLATE_EXTERN_TABLE
59# define QM_TEMPLATE_EXTERN_TABLE
60#endif
61#else
62#define QM_EXPORT_TABLE Q_EXPORT
63#define QM_TEMPLATE_EXTERN_TABLE Q_TEMPLATE_EXTERN
64#endif
65
66class QTableHeader;
67class QValidator;
68class QTable;
69class QPaintEvent;
70class QTimer;
71class QResizeEvent;
72class QComboBox;
73class QCheckBox;
74class QDragObject;
75
76struct QTablePrivate;
77struct QTableHeaderPrivate;
78
79
80class QM_EXPORT_TABLE QTableSelection
81{
82public:
83 QTableSelection();
84 QTableSelection( int start_row, int start_col, int end_row, int end_col );
85 void init( int row, int col );
86 void expandTo( int row, int col );
87 bool operator==( const QTableSelection &s ) const;
88 bool operator!=( const QTableSelection &s ) const { return !(operator==(s)); }
89
90 int topRow() const { return tRow; }
91 int bottomRow() const { return bRow; }
92 int leftCol() const { return lCol; }
93 int rightCol() const { return rCol; }
94 int anchorRow() const { return aRow; }
95 int anchorCol() const { return aCol; }
96 int numRows() const;
97 int numCols() const;
98
99 bool isActive() const { return active; }
100 bool isEmpty() const { return numRows() == 0; }
101
102private:
103 uint active : 1;
104 uint inited : 1;
105 int tRow, lCol, bRow, rCol;
106 int aRow, aCol;
107};
108
109#define Q_DEFINED_QTABLE_SELECTION
110#include "qwinexport.h"
111
112class QM_EXPORT_TABLE QTableItem : public Qt
113{
114 friend class QTable;
115
116public:
117 enum EditType { Never, OnTyping, WhenCurrent, Always };
118
119 QTableItem( QTable *table, EditType et );
120 QTableItem( QTable *table, EditType et, const QString &text );
121 QTableItem( QTable *table, EditType et, const QString &text,
122 const QPixmap &p );
123 virtual ~QTableItem();
124
125 virtual QPixmap pixmap() const;
126 virtual QString text() const;
127 virtual void setPixmap( const QPixmap &p );
128 virtual void setText( const QString &t );
129 QTable *table() const { return t; }
130
131 virtual int alignment() const;
132 virtual void setWordWrap( bool b );
133 bool wordWrap() const;
134
135 EditType editType() const;
136 virtual QWidget *createEditor() const;
137 virtual void setContentFromEditor( QWidget *w );
138 virtual void setReplaceable( bool );
139 bool isReplaceable() const;
140
141 virtual QString key() const;
142 virtual QSize sizeHint() const;
143
144 virtual void setSpan( int rs, int cs );
145 int rowSpan() const;
146 int colSpan() const;
147
148 virtual void setRow( int r );
149 virtual void setCol( int c );
150 int row() const;
151 int col() const;
152
153 virtual void paint( QPainter *p, const QColorGroup &cg,
154 const QRect &cr, bool selected );
155
156 void updateEditor( int oldRow, int oldCol );
157
158 virtual void setEnabled( bool b );
159 bool isEnabled() const;
160
161 virtual int rtti() const;
162 static int RTTI;
163
164private:
165 QString txt;
166 QPixmap pix;
167 QTable *t;
168 EditType edType;
169 uint wordwrap : 1;
170 uint tcha : 1;
171 uint enabled : 1;
172 int rw, cl;
173 int rowspan, colspan;
174#if (QT_VERSION >= 0x040000)
175#error "Add a setAlignment() function in 4.0 (but no d pointer)"
176#endif
177};
178
179#define Q_DEFINED_QTABLE_ITEM
180#include "qwinexport.h"
181
182class QM_EXPORT_TABLE QComboTableItem : public QTableItem
183{
184public:
185 QComboTableItem( QTable *table, const QStringList &list, bool editable = FALSE );
186 ~QComboTableItem();
187 virtual QWidget *createEditor() const;
188 virtual void setContentFromEditor( QWidget *w );
189 virtual void paint( QPainter *p, const QColorGroup &cg,
190 const QRect &cr, bool selected );
191 virtual void setCurrentItem( int i );
192 virtual void setCurrentItem( const QString &i );
193 int currentItem() const;
194 QString currentText() const;
195 int count() const;
196#if !defined(Q_NO_USING_KEYWORD)
197 using QTableItem::text;
198#endif
199 QString text( int i ) const;
200 virtual void setEditable( bool b );
201 bool isEditable() const;
202 virtual void setStringList( const QStringList &l );
203
204 int rtti() const;
205 static int RTTI;
206
207 QSize sizeHint() const;
208
209private:
210 QComboBox *cb;
211 QStringList entries;
212 int current;
213 bool edit;
214 static QComboBox *fakeCombo;
215 static QWidget *fakeComboWidget;
216 static int fakeRef;
217
218};
219
220class QM_EXPORT_TABLE QCheckTableItem : public QTableItem
221{
222public:
223 QCheckTableItem( QTable *table, const QString &txt );
224 void setText( const QString &t );
225 virtual QWidget *createEditor() const;
226 virtual void setContentFromEditor( QWidget *w );
227 virtual void paint( QPainter *p, const QColorGroup &cg,
228 const QRect &cr, bool selected );
229 virtual void setChecked( bool b );
230 bool isChecked() const;
231
232 int rtti() const;
233 static int RTTI;
234
235 QSize sizeHint() const;
236
237private:
238 QCheckBox *cb;
239 bool checked;
240
241};
242
243class QM_EXPORT_TABLE QTable : public QScrollView
244{
245 Q_OBJECT
246 Q_ENUMS( SelectionMode FocusStyle )
247 Q_PROPERTY( int numRows READ numRows WRITE setNumRows )
248 Q_PROPERTY( int numCols READ numCols WRITE setNumCols )
249 Q_PROPERTY( bool showGrid READ showGrid WRITE setShowGrid )
250 Q_PROPERTY( bool rowMovingEnabled READ rowMovingEnabled WRITE setRowMovingEnabled )
251 Q_PROPERTY( bool columnMovingEnabled READ columnMovingEnabled WRITE setColumnMovingEnabled )
252 Q_PROPERTY( bool readOnly READ isReadOnly WRITE setReadOnly )
253 Q_PROPERTY( bool sorting READ sorting WRITE setSorting )
254 Q_PROPERTY( SelectionMode selectionMode READ selectionMode WRITE setSelectionMode )
255 Q_PROPERTY( FocusStyle focusStyle READ focusStyle WRITE setFocusStyle )
256 Q_PROPERTY( int numSelections READ numSelections )
257
258 friend class QTableHeader;
259 friend class QComboTableItem;
260 friend class QCheckTableItem;
261 friend class QTableItem;
262
263public:
264 QTable( QWidget* parent=0, const char* name=0 );
265 QTable( int numRows, int numCols,
266 QWidget* parent=0, const char* name=0 );
267 ~QTable();
268
269 QHeader *horizontalHeader() const;
270 QHeader *verticalHeader() const;
271
272 enum SelectionMode { Single, Multi, SingleRow, MultiRow, NoSelection };
273 virtual void setSelectionMode( SelectionMode mode );
274 SelectionMode selectionMode() const;
275
276 virtual void setItem( int row, int col, QTableItem *item );
277 virtual void setText( int row, int col, const QString &text );
278 virtual void setPixmap( int row, int col, const QPixmap &pix );
279 virtual QTableItem *item( int row, int col ) const;
280 virtual QString text( int row, int col ) const;
281 virtual QPixmap pixmap( int row, int col ) const;
282 virtual void clearCell( int row, int col );
283
284 virtual QRect cellGeometry( int row, int col ) const;
285 virtual int columnWidth( int col ) const;
286 virtual int rowHeight( int row ) const;
287 virtual int columnPos( int col ) const;
288 virtual int rowPos( int row ) const;
289 virtual int columnAt( int x ) const;
290 virtual int rowAt( int y ) const;
291
292 virtual int numRows() const;
293 virtual int numCols() const;
294
295 void updateCell( int row, int col );
296
297 bool eventFilter( QObject * o, QEvent * );
298
299 int currentRow() const { return curRow; }
300 int currentColumn() const { return curCol; }
301 void ensureCellVisible( int row, int col );
302
303 bool isSelected( int row, int col ) const;
304 bool isRowSelected( int row, bool full = FALSE ) const;
305 bool isColumnSelected( int col, bool full = FALSE ) const;
306 int numSelections() const;
307 QTableSelection selection( int num ) const;
308 virtual int addSelection( const QTableSelection &s );
309 virtual void removeSelection( const QTableSelection &s );
310 virtual void removeSelection( int num );
311 virtual int currentSelection() const;
312
313 void selectCells( int start_row, int start_col, int end_row, int end_col );
314 void selectRow( int row );
315 void selectColumn( int col );
316
317 bool showGrid() const;
318
319 bool columnMovingEnabled() const;
320 bool rowMovingEnabled() const;
321
322 virtual void sortColumn( int col, bool ascending = TRUE,
323 bool wholeRows = FALSE );
324 bool sorting() const;
325
326 virtual void takeItem( QTableItem *i );
327
328 virtual void setCellWidget( int row, int col, QWidget *e );
329 virtual QWidget *cellWidget( int row, int col ) const;
330 virtual void clearCellWidget( int row, int col );
331
332 virtual QRect cellRect( int row, int col ) const;
333
334 virtual void paintCell( QPainter *p, int row, int col,
335 const QRect &cr, bool selected );
336 virtual void paintCell( QPainter *p, int row, int col,
337 const QRect &cr, bool selected, const QColorGroup &cg );
338 virtual void paintFocus( QPainter *p, const QRect &r );
339 QSize sizeHint() const;
340
341 bool isReadOnly() const;
342 bool isRowReadOnly( int row ) const;
343 bool isColumnReadOnly( int col ) const;
344
345 void setEnabled( bool b );
346
347 void repaintSelections();
348
349 enum FocusStyle { FollowStyle, SpreadSheet };
350 virtual void setFocusStyle( FocusStyle fs );
351 FocusStyle focusStyle() const;
352
353 void updateHeaderStates();
354
355public slots:
356 virtual void setNumRows( int r );
357 virtual void setNumCols( int r );
358 virtual void setShowGrid( bool b );
359 virtual void hideRow( int row );
360 virtual void hideColumn( int col );
361 virtual void showRow( int row );
362 virtual void showColumn( int col );
363 bool isRowHidden( int row ) const;
364 bool isColumnHidden( int col ) const;
365
366 virtual void setColumnWidth( int col, int w );
367 virtual void setRowHeight( int row, int h );
368
369 virtual void adjustColumn( int col );
370 virtual void adjustRow( int row );
371
372 virtual void setColumnStretchable( int col, bool stretch );
373 virtual void setRowStretchable( int row, bool stretch );
374 bool isColumnStretchable( int col ) const;
375 bool isRowStretchable( int row ) const;
376 virtual void setSorting( bool b );
377 virtual void swapRows( int row1, int row2, bool swapHeader = FALSE );
378 virtual void swapColumns( int col1, int col2, bool swapHeader = FALSE );
379 virtual void swapCells( int row1, int col1, int row2, int col2 );
380
381 virtual void setLeftMargin( int m );
382 virtual void setTopMargin( int m );
383 virtual void setCurrentCell( int row, int col );
384 void clearSelection( bool repaint = TRUE );
385 virtual void setColumnMovingEnabled( bool b );
386 virtual void setRowMovingEnabled( bool b );
387
388 virtual void setReadOnly( bool b );
389 virtual void setRowReadOnly( int row, bool ro );
390 virtual void setColumnReadOnly( int col, bool ro );
391
392 virtual void setDragEnabled( bool b );
393 bool dragEnabled() const;
394
395 virtual void insertRows( int row, int count = 1 );
396 virtual void insertColumns( int col, int count = 1 );
397 virtual void removeRow( int row );
398 virtual void removeRows( const QMemArray<int> &rows );
399 virtual void removeColumn( int col );
400 virtual void removeColumns( const QMemArray<int> &cols );
401
402 virtual void editCell( int row, int col, bool replace = FALSE );
403
404 void setRowLabels( const QStringList &labels );
405 void setColumnLabels( const QStringList &labels );
406
407protected:
408 enum EditMode { NotEditing, Editing, Replacing };
409 void drawContents( QPainter *p, int cx, int cy, int cw, int ch );
410 void contentsMousePressEvent( QMouseEvent* );
411 void contentsMouseMoveEvent( QMouseEvent* );
412 void contentsMouseDoubleClickEvent( QMouseEvent* );
413 void contentsMouseReleaseEvent( QMouseEvent* );
414 void contentsContextMenuEvent( QContextMenuEvent * e );
415 void keyPressEvent( QKeyEvent* );
416 void focusInEvent( QFocusEvent* );
417 void focusOutEvent( QFocusEvent* );
418 void viewportResizeEvent( QResizeEvent * );
419 void showEvent( QShowEvent *e );
420 void paintEvent( QPaintEvent *e );
421 void setEditMode( EditMode mode, int row, int col );
422#ifndef QT_NO_DRAGANDDROP
423 virtual void contentsDragEnterEvent( QDragEnterEvent *e );
424 virtual void contentsDragMoveEvent( QDragMoveEvent *e );
425 virtual void contentsDragLeaveEvent( QDragLeaveEvent *e );
426 virtual void contentsDropEvent( QDropEvent *e );
427 virtual QDragObject *dragObject();
428 virtual void startDrag();
429#endif
430
431 virtual void paintEmptyArea( QPainter *p, int cx, int cy, int cw, int ch );
432 virtual void activateNextCell();
433 virtual QWidget *createEditor( int row, int col, bool initFromCell ) const;
434 virtual void setCellContentFromEditor( int row, int col );
435 virtual QWidget *beginEdit( int row, int col, bool replace );
436 virtual void endEdit( int row, int col, bool accept, bool replace );
437
438 virtual void resizeData( int len );
439 virtual void insertWidget( int row, int col, QWidget *w );
440 int indexOf( int row, int col ) const;
441
442 void windowActivationChange( bool );
443 bool isEditing() const;
444 EditMode editMode() const;
445 int currEditRow() const;
446 int currEditCol() const;
447
448protected slots:
449 virtual void columnWidthChanged( int col );
450 virtual void rowHeightChanged( int row );
451 virtual void columnIndexChanged( int section, int fromIndex, int toIndex );
452 virtual void rowIndexChanged( int section, int fromIndex, int toIndex );
453 virtual void columnClicked( int col );
454
455signals:
456 void currentChanged( int row, int col );
457 void clicked( int row, int col, int button, const QPoint &mousePos );
458 void doubleClicked( int row, int col, int button, const QPoint &mousePos );
459 void pressed( int row, int col, int button, const QPoint &mousePos );
460 void selectionChanged();
461 void valueChanged( int row, int col );
462 void contextMenuRequested( int row, int col, const QPoint &pos );
463#ifndef QT_NO_DRAGANDDROP
464 void dropped( QDropEvent *e );
465#endif
466
467private slots:
468 void doAutoScroll();
469 void doValueChanged();
470 void updateGeometriesSlot();
471
472private:
473 void contentsMousePressEventEx( QMouseEvent* );
474 void drawContents( QPainter* );
475 void updateGeometries();
476 void repaintSelections( QTableSelection *oldSelection,
477 QTableSelection *newSelection,
478 bool updateVertical = TRUE,
479 bool updateHorizontal = TRUE );
480 QRect rangeGeometry( int topRow, int leftCol,
481 int bottomRow, int rightCol, bool &optimize );
482 void fixRow( int &row, int y );
483 void fixCol( int &col, int x );
484
485 void init( int numRows, int numCols );
486 QSize tableSize() const;
487 void repaintCell( int row, int col );
488 void contentsToViewport2( int x, int y, int& vx, int& vy );
489 QPoint contentsToViewport2( const QPoint &p );
490 void viewportToContents2( int vx, int vy, int& x, int& y );
491 QPoint viewportToContents2( const QPoint &p );
492
493 void updateRowWidgets( int row );
494 void updateColWidgets( int col );
495 bool isSelected( int row, int col, bool includeCurrent ) const;
496 void setCurrentCell( int row, int col, bool updateSelections, bool ensureVisible = FALSE );
497 void fixCell( int &row, int &col, int key );
498 void delayedUpdateGeometries();
499 struct TableWidget
500 {
501 TableWidget( QWidget *w, int r, int c ) : wid( w ), row( r ), col ( c ) {}
502 QWidget *wid;
503 int row, col;
504 };
505 void saveContents( QPtrVector<QTableItem> &tmp,
506 QPtrVector<TableWidget> &tmp2 );
507 void updateHeaderAndResizeContents( QTableHeader *header,
508 int num, int colRow,
509 int width, bool &updateBefore );
510 void restoreContents( QPtrVector<QTableItem> &tmp,
511 QPtrVector<TableWidget> &tmp2 );
512 void finishContentsResze( bool updateBefore );
513
514private:
515 QPtrVector<QTableItem> contents;
516 QPtrVector<QWidget> widgets;
517 int curRow;
518 int curCol;
519 QTableHeader *leftHeader, *topHeader;
520 EditMode edMode;
521 int editCol, editRow;
522 QPtrList<QTableSelection> selections;
523 QTableSelection *currentSel;
524 QTimer *autoScrollTimer;
525 int lastSortCol;
526 bool sGrid : 1;
527 bool mRows : 1;
528 bool mCols : 1;
529 bool asc : 1;
530 bool doSort : 1;
531 bool unused : 1;
532 bool readOnly : 1;
533 bool shouldClearSelection : 1;
534 bool dEnabled : 1;
535 bool context_menu : 1;
536 bool drawActiveSelection : 1;
537 bool was_visible : 1;
538 SelectionMode selMode;
539 int pressedRow, pressedCol;
540 QTablePrivate *d;
541 QIntDict<int> roRows;
542 QIntDict<int> roCols;
543 int startDragRow;
544 int startDragCol;
545 QPoint dragStartPos;
546 int oldCurrentRow, oldCurrentCol;
547 QWidget *unused_topLeftCorner; //### remove in 4.0
548 FocusStyle focusStl;
549 QSize unused_cachedSizeHint; // ### remove in 4.0
550
551#if defined(Q_DISABLE_COPY)
552 QTable( const QTable & );
553 QTable &operator=( const QTable & );
554#endif
555};
556
557#define Q_DEFINED_QTABLE
558#include "qwinexport.h"
559#endif // QT_NO_TABLE
560#endif // TABLE_H
Note: See TracBrowser for help on using the repository browser.