/**************************************************************************** ** ** Definition of QTable widget class ** ** Created : 000607 ** ** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. ** ** This file is part of the table module of the Qt GUI Toolkit. ** ** This file may be distributed under the terms of the Q Public License ** as defined by Trolltech AS of Norway and appearing in the file ** LICENSE.QPL included in the packaging of this file. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** Licensees holding valid Qt Enterprise Edition licenses may use this ** file in accordance with the Qt Commercial License Agreement provided ** with the Software. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for ** information about Qt Commercial License Agreements. ** See http://www.trolltech.com/qpl/ for QPL licensing information. ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef QTCOMPAT_QCOMBOTABLEITEM_H #define QTCOMPAT_QCOMBOTABLEITEM_H #include "qtable.h" #include "qstringlist.h" class QComboBox; class QWidget; class QPainter; #define QM_EXPORT_TABLE Q_EXPORT /*US #ifndef QT_H #include "qscrollview.h" #include "qpixmap.h" #include "qptrvector.h" #include "qheader.h" #include "qmemarray.h" #include "qptrlist.h" #include "qguardedptr.h" #include "qshared.h" #include "qintdict.h" #include "qstringlist.h" #endif // QT_H #ifndef QT_NO_TABLE #if !defined( QT_MODULE_TABLE ) || defined( QT_LICENSE_PROFESSIONAL ) || defined( QT_INTERNAL_TABLE ) #define QM_EXPORT_TABLE #ifndef QM_TEMPLATE_EXTERN_TABLE # define QM_TEMPLATE_EXTERN_TABLE #endif #else #define QM_EXPORT_TABLE Q_EXPORT #define QM_TEMPLATE_EXTERN_TABLE Q_TEMPLATE_EXTERN #endif class QTableHeader; class QValidator; class QTable; class QPaintEvent; class QTimer; class QResizeEvent; class QComboBox; class QCheckBox; class QDragObject; struct QTablePrivate; struct QTableHeaderPrivate; class QM_EXPORT_TABLE QTableSelection { public: QTableSelection(); QTableSelection( int start_row, int start_col, int end_row, int end_col ); void init( int row, int col ); void expandTo( int row, int col ); bool operator==( const QTableSelection &s ) const; bool operator!=( const QTableSelection &s ) const { return !(operator==(s)); } int topRow() const { return tRow; } int bottomRow() const { return bRow; } int leftCol() const { return lCol; } int rightCol() const { return rCol; } int anchorRow() const { return aRow; } int anchorCol() const { return aCol; } int numRows() const; int numCols() const; bool isActive() const { return active; } bool isEmpty() const { return numRows() == 0; } private: uint active : 1; uint inited : 1; int tRow, lCol, bRow, rCol; int aRow, aCol; }; #define Q_DEFINED_QTABLE_SELECTION #include "qwinexport.h" class QM_EXPORT_TABLE QTableItem : public Qt { friend class QTable; public: enum EditType { Never, OnTyping, WhenCurrent, Always }; QTableItem( QTable *table, EditType et ); QTableItem( QTable *table, EditType et, const QString &text ); QTableItem( QTable *table, EditType et, const QString &text, const QPixmap &p ); virtual ~QTableItem(); virtual QPixmap pixmap() const; virtual QString text() const; virtual void setPixmap( const QPixmap &p ); virtual void setText( const QString &t ); QTable *table() const { return t; } virtual int alignment() const; virtual void setWordWrap( bool b ); bool wordWrap() const; EditType editType() const; virtual QWidget *createEditor() const; virtual void setContentFromEditor( QWidget *w ); virtual void setReplaceable( bool ); bool isReplaceable() const; virtual QString key() const; virtual QSize sizeHint() const; virtual void setSpan( int rs, int cs ); int rowSpan() const; int colSpan() const; virtual void setRow( int r ); virtual void setCol( int c ); int row() const; int col() const; virtual void paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected ); void updateEditor( int oldRow, int oldCol ); virtual void setEnabled( bool b ); bool isEnabled() const; virtual int rtti() const; static int RTTI; private: QString txt; QPixmap pix; QTable *t; EditType edType; uint wordwrap : 1; uint tcha : 1; uint enabled : 1; int rw, cl; int rowspan, colspan; #if (QT_VERSION >= 0x040000) #error "Add a setAlignment() function in 4.0 (but no d pointer)" #endif }; #define Q_DEFINED_QTABLE_ITEM #include "qwinexport.h" */ class QM_EXPORT_TABLE QComboTableItem : public QTableItem { public: QComboTableItem( QTable *table, const QStringList &list, bool editable = FALSE ); virtual QWidget *createEditor() const; virtual void setContentFromEditor( QWidget *w ); virtual void paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected ); virtual void setCurrentItem( int i ); virtual void setCurrentItem( const QString &i ); int currentItem() const; QString currentText() const; int count() const; #if !defined(Q_NO_USING_KEYWORD) //using QTableItem::text; #endif QString text( int i ) const; virtual void setEditable( bool b ); bool isEditable() const; virtual void setStringList( const QStringList &l ); int rtti() const; static int RTTI; QSize sizeHint() const; private: QComboBox *cb; QStringList entries; int current; bool edit; static QComboBox *fakeCombo; }; /*US class QM_EXPORT_TABLE QCheckTableItem : public QTableItem { public: QCheckTableItem( QTable *table, const QString &txt ); void setText( const QString &t ); virtual QWidget *createEditor() const; virtual void setContentFromEditor( QWidget *w ); virtual void paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected ); virtual void setChecked( bool b ); bool isChecked() const; int rtti() const; static int RTTI; QSize sizeHint() const; private: QCheckBox *cb; bool checked; }; class QM_EXPORT_TABLE QTable : public QScrollView { Q_OBJECT Q_ENUMS( SelectionMode FocusStyle ) Q_PROPERTY( int numRows READ numRows WRITE setNumRows ) Q_PROPERTY( int numCols READ numCols WRITE setNumCols ) Q_PROPERTY( bool showGrid READ showGrid WRITE setShowGrid ) Q_PROPERTY( bool rowMovingEnabled READ rowMovingEnabled WRITE setRowMovingEnabled ) Q_PROPERTY( bool columnMovingEnabled READ columnMovingEnabled WRITE setColumnMovingEnabled ) Q_PROPERTY( bool readOnly READ isReadOnly WRITE setReadOnly ) Q_PROPERTY( bool sorting READ sorting WRITE setSorting ) Q_PROPERTY( SelectionMode selectionMode READ selectionMode WRITE setSelectionMode ) Q_PROPERTY( FocusStyle focusStyle READ focusStyle WRITE setFocusStyle ) Q_PROPERTY( int numSelections READ numSelections ) friend class QTableHeader; friend class QComboTableItem; friend class QCheckTableItem; friend class QTableItem; public: QTable( QWidget* parent=0, const char* name=0 ); QTable( int numRows, int numCols, QWidget* parent=0, const char* name=0 ); ~QTable(); QHeader *horizontalHeader() const; QHeader *verticalHeader() const; enum SelectionMode { Single, Multi, SingleRow, MultiRow, NoSelection }; virtual void setSelectionMode( SelectionMode mode ); SelectionMode selectionMode() const; virtual void setItem( int row, int col, QTableItem *item ); virtual void setText( int row, int col, const QString &text ); virtual void setPixmap( int row, int col, const QPixmap &pix ); virtual QTableItem *item( int row, int col ) const; virtual QString text( int row, int col ) const; virtual QPixmap pixmap( int row, int col ) const; virtual void clearCell( int row, int col ); virtual QRect cellGeometry( int row, int col ) const; virtual int columnWidth( int col ) const; virtual int rowHeight( int row ) const; virtual int columnPos( int col ) const; virtual int rowPos( int row ) const; virtual int columnAt( int x ) const; virtual int rowAt( int y ) const; virtual int numRows() const; virtual int numCols() const; void updateCell( int row, int col ); bool eventFilter( QObject * o, QEvent * ); int currentRow() const { return curRow; } int currentColumn() const { return curCol; } void ensureCellVisible( int row, int col ); bool isSelected( int row, int col ) const; bool isRowSelected( int row, bool full = FALSE ) const; bool isColumnSelected( int col, bool full = FALSE ) const; int numSelections() const; QTableSelection selection( int num ) const; virtual int addSelection( const QTableSelection &s ); virtual void removeSelection( const QTableSelection &s ); virtual void removeSelection( int num ); virtual int currentSelection() const; void selectCells( int start_row, int start_col, int end_row, int end_col ); void selectRow( int row ); void selectColumn( int col ); bool showGrid() const; bool columnMovingEnabled() const; bool rowMovingEnabled() const; virtual void sortColumn( int col, bool ascending = TRUE, bool wholeRows = FALSE ); bool sorting() const; virtual void takeItem( QTableItem *i ); virtual void setCellWidget( int row, int col, QWidget *e ); virtual QWidget *cellWidget( int row, int col ) const; virtual void clearCellWidget( int row, int col ); virtual QRect cellRect( int row, int col ) const; virtual void paintCell( QPainter *p, int row, int col, const QRect &cr, bool selected ); virtual void paintCell( QPainter *p, int row, int col, const QRect &cr, bool selected, const QColorGroup &cg ); virtual void paintFocus( QPainter *p, const QRect &r ); QSize sizeHint() const; bool isReadOnly() const; bool isRowReadOnly( int row ) const; bool isColumnReadOnly( int col ) const; void setEnabled( bool b ); void repaintSelections(); enum FocusStyle { FollowStyle, SpreadSheet }; virtual void setFocusStyle( FocusStyle fs ); FocusStyle focusStyle() const; void updateHeaderStates(); public slots: virtual void setNumRows( int r ); virtual void setNumCols( int r ); virtual void setShowGrid( bool b ); virtual void hideRow( int row ); virtual void hideColumn( int col ); virtual void showRow( int row ); virtual void showColumn( int col ); virtual void setColumnWidth( int col, int w ); virtual void setRowHeight( int row, int h ); virtual void adjustColumn( int col ); virtual void adjustRow( int row ); virtual void setColumnStretchable( int col, bool stretch ); virtual void setRowStretchable( int row, bool stretch ); bool isColumnStretchable( int col ) const; bool isRowStretchable( int row ) const; virtual void setSorting( bool b ); virtual void swapRows( int row1, int row2, bool swapHeader = FALSE ); virtual void swapColumns( int col1, int col2, bool swapHeader = FALSE ); virtual void swapCells( int row1, int col1, int row2, int col2 ); virtual void setLeftMargin( int m ); virtual void setTopMargin( int m ); virtual void setCurrentCell( int row, int col ); void clearSelection( bool repaint = TRUE ); virtual void setColumnMovingEnabled( bool b ); virtual void setRowMovingEnabled( bool b ); virtual void setReadOnly( bool b ); virtual void setRowReadOnly( int row, bool ro ); virtual void setColumnReadOnly( int col, bool ro ); virtual void setDragEnabled( bool b ); bool dragEnabled() const; virtual void insertRows( int row, int count = 1 ); virtual void insertColumns( int col, int count = 1 ); virtual void removeRow( int row ); virtual void removeRows( const QMemArray &rows ); virtual void removeColumn( int col ); virtual void removeColumns( const QMemArray &cols ); virtual void editCell( int row, int col, bool replace = FALSE ); void setRowLabels( const QStringList &labels ); void setColumnLabels( const QStringList &labels ); protected: enum EditMode { NotEditing, Editing, Replacing }; void drawContents( QPainter *p, int cx, int cy, int cw, int ch ); void contentsMousePressEvent( QMouseEvent* ); void contentsMouseMoveEvent( QMouseEvent* ); void contentsMouseDoubleClickEvent( QMouseEvent* ); void contentsMouseReleaseEvent( QMouseEvent* ); void contentsContextMenuEvent( QContextMenuEvent * e ); void keyPressEvent( QKeyEvent* ); void focusInEvent( QFocusEvent* ); void focusOutEvent( QFocusEvent* ); void viewportResizeEvent( QResizeEvent * ); void showEvent( QShowEvent *e ); void paintEvent( QPaintEvent *e ); void setEditMode( EditMode mode, int row, int col ); #ifndef QT_NO_DRAGANDDROP virtual void contentsDragEnterEvent( QDragEnterEvent *e ); virtual void contentsDragMoveEvent( QDragMoveEvent *e ); virtual void contentsDragLeaveEvent( QDragLeaveEvent *e ); virtual void contentsDropEvent( QDropEvent *e ); virtual QDragObject *dragObject(); virtual void startDrag(); #endif virtual void paintEmptyArea( QPainter *p, int cx, int cy, int cw, int ch ); virtual void activateNextCell(); virtual QWidget *createEditor( int row, int col, bool initFromCell ) const; virtual void setCellContentFromEditor( int row, int col ); virtual QWidget *beginEdit( int row, int col, bool replace ); virtual void endEdit( int row, int col, bool accept, bool replace ); virtual void resizeData( int len ); virtual void insertWidget( int row, int col, QWidget *w ); int indexOf( int row, int col ) const; void windowActivationChange( bool ); bool isEditing() const; EditMode editMode() const; int currEditRow() const; int currEditCol() const; protected slots: virtual void columnWidthChanged( int col ); virtual void rowHeightChanged( int row ); virtual void columnIndexChanged( int section, int fromIndex, int toIndex ); virtual void rowIndexChanged( int section, int fromIndex, int toIndex ); virtual void columnClicked( int col ); signals: void currentChanged( int row, int col ); void clicked( int row, int col, int button, const QPoint &mousePos ); void doubleClicked( int row, int col, int button, const QPoint &mousePos ); void pressed( int row, int col, int button, const QPoint &mousePos ); void selectionChanged(); void valueChanged( int row, int col ); void contextMenuRequested( int row, int col, const QPoint &pos ); #ifndef QT_NO_DRAGANDDROP void dropped( QDropEvent *e ); #endif private slots: void doAutoScroll(); void doValueChanged(); void updateGeometriesSlot(); private: void contentsMousePressEventEx( QMouseEvent* ); void drawContents( QPainter* ); void updateGeometries(); void repaintSelections( QTableSelection *oldSelection, QTableSelection *newSelection, bool updateVertical = TRUE, bool updateHorizontal = TRUE ); QRect rangeGeometry( int topRow, int leftCol, int bottomRow, int rightCol, bool &optimize ); void fixRow( int &row, int y ); void fixCol( int &col, int x ); void init( int numRows, int numCols ); QSize tableSize() const; void repaintCell( int row, int col ); void contentsToViewport2( int x, int y, int& vx, int& vy ); QPoint contentsToViewport2( const QPoint &p ); void viewportToContents2( int vx, int vy, int& x, int& y ); QPoint viewportToContents2( const QPoint &p ); void updateRowWidgets( int row ); void updateColWidgets( int col ); bool isSelected( int row, int col, bool includeCurrent ) const; void setCurrentCell( int row, int col, bool updateSelections ); void fixCell( int &row, int &col, int key ); void delayedUpdateGeometries(); struct TableWidget { TableWidget( QWidget *w, int r, int c ) : wid( w ), row( r ), col ( c ) {} QWidget *wid; int row, col; }; void saveContents( QPtrVector &tmp, QPtrVector &tmp2 ); void updateHeaderAndResizeContents( QTableHeader *header, int num, int colRow, int width, bool &updateBefore ); void restoreContents( QPtrVector &tmp, QPtrVector &tmp2 ); void finishContentsResze( bool updateBefore ); private: QPtrVector contents; QPtrVector widgets; int curRow; int curCol; QTableHeader *leftHeader, *topHeader; EditMode edMode; int editCol, editRow; QPtrList selections; QTableSelection *currentSel; QTimer *autoScrollTimer; int lastSortCol; bool sGrid : 1; bool mRows : 1; bool mCols : 1; bool asc : 1; bool doSort : 1; bool mousePressed : 1; bool readOnly : 1; bool shouldClearSelection : 1; bool dEnabled : 1; bool context_menu : 1; bool drawActiveSelection : 1; bool was_visible : 1; SelectionMode selMode; int pressedRow, pressedCol; QTablePrivate *d; QIntDict roRows; QIntDict roCols; int startDragRow; int startDragCol; QPoint dragStartPos; int oldCurrentRow, oldCurrentCol; QWidget *unused_topLeftCorner; //### remove in 4.0 FocusStyle focusStl; QSize unused_cachedSizeHint; // ### remove in 4.0 #if defined(Q_DISABLE_COPY) QTable( const QTable & ); QTable &operator=( const QTable & ); #endif }; #define Q_DEFINED_QTABLE #include "qwinexport.h" #endif // QT_NO_TABLE */ #endif // QTCOMPAT_QCOMBOTABLEITEM_H