summaryrefslogtreecommitdiffstats
path: root/src/attic/qttableview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/attic/qttableview.cpp')
-rw-r--r--src/attic/qttableview.cpp2272
1 files changed, 0 insertions, 2272 deletions
diff --git a/src/attic/qttableview.cpp b/src/attic/qttableview.cpp
deleted file mode 100644
index ea55a9ff6..000000000
--- a/src/attic/qttableview.cpp
+++ /dev/null
@@ -1,2272 +0,0 @@
-/**********************************************************************
-**
-** Implementation of TQtTableView class
-**
-** Created : 941115
-**
-** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
-**
-** This file contains a class moved out of the TQt GUI Toolkit API. It
-** may be used, distributed and modified without limitation.
-**
-**********************************************************************/
-
-#include "qttableview.h"
-#ifndef TQT_NO_QTTABLEVIEW
-#include "ntqscrollbar.h"
-#include "ntqpainter.h"
-#include "ntqdrawutil.h"
-#include <limits.h>
-
-enum ScrollBarDirtyFlags {
- verGeometry = 0x01,
- verSteps = 0x02,
- verRange = 0x04,
- verValue = 0x08,
- horGeometry = 0x10,
- horSteps = 0x20,
- horRange = 0x40,
- horValue = 0x80,
- verMask = 0x0F,
- horMask = 0xF0
-};
-
-
-#define HSBEXT horizontalScrollBar()->sizeHint().height()
-#define VSBEXT verticalScrollBar()->sizeHint().width()
-
-
-class TQCornerSquare : public TQWidget // internal class
-{
-public:
- TQCornerSquare( TQWidget *, const char* = 0 );
- void paintEvent( TQPaintEvent * );
-};
-
-TQCornerSquare::TQCornerSquare( TQWidget *parent, const char *name )
- : TQWidget( parent, name )
-{
-}
-
-void TQCornerSquare::paintEvent( TQPaintEvent * )
-{
-}
-
-
-// NOT REVISED
-/*
- \class TQtTableView qttableview.h
- \brief The TQtTableView class provides an abstract base for tables.
-
- \obsolete
-
- A table view consists of a number of abstract cells organized in rows
- and columns, and a visible part called a view. The cells are identified
- with a row index and a column index. The top-left cell is in row 0,
- column 0.
-
- The behavior of the widget can be finely tuned using
- setTableFlags(); a typical subclass will consist of little more than a
- call to setTableFlags(), some table content manipulation and an
- implementation of paintCell(). Subclasses that need cells with
- variable width or height must reimplement cellHeight() and/or
- cellWidth(). Use updateTableSize() to tell TQtTableView when the
- width or height has changed.
-
- When you read this documentation, it is important to understand the
- distinctions among the four pixel coordinate systems involved.
-
- \list 1
- \i The \e cell coordinates. (0,0) is the top-left corner of a cell.
- Cell coordinates are used by functions such as paintCell().
-
- \i The \e table coordinates. (0,0) is the top-left corner of the cell at
- row 0 and column 0. These coordinates are absolute; that is, they are
- independent of what part of the table is visible at the moment. They are
- used by functions such as setXOffset() or maxYOffset().
-
- \i The \e widget coordinates. (0,0) is the top-left corner of the widget,
- \e including the frame. They are used by functions such as repaint().
-
- \i The \e view coordinates. (0,0) is the top-left corner of the view, \e
- excluding the frame. This is the least-used coordinate system; it is used by
- functions such as viewWidth(). \endlist
-
- It is rather unfortunate that we have to use four different
- coordinate systems, but there was no alternative to provide a flexible and
- powerful base class.
-
- Note: The row,column indices are always given in that order,
- i.e., first the vertical (row), then the horizontal (column). This is
- the opposite order of all pixel operations, which take first the
- horizontal (x) and then the vertical (y).
-
- <img src=qtablevw-m.png> <img src=qtablevw-w.png>
-
- \warning the functions setNumRows(), setNumCols(), setCellHeight(),
- setCellWidth(), setTableFlags() and clearTableFlags() may cause
- virtual functions such as cellWidth() and cellHeight() to be called,
- even if autoUpdate() is FALSE. This may cause errors if relevant
- state variables are not initialized.
-
- \warning Experience has shown that use of this widget tends to cause
- more bugs than expected and our analysis indicates that the widget's
- very flexibility is the problem. If TQScrollView or TQListBox can
- easily be made to do the job you need, we recommend subclassing
- those widgets rather than TQtTableView. In addition, TQScrollView makes
- it easy to have child widgets inside tables, which TQtTableView
- doesn't support at all.
-
- \sa TQScrollView
- \link guibooks.html#fowler GUI Design Handbook: Table\endlink
-*/
-
-
-/*
- Constructs a table view. The \a parent, \a name and \f arguments
- are passed to the TQFrame constructor.
-
- The \link setTableFlags() table flags\endlink are all cleared (set to 0).
- Set \c Tbl_autoVScrollBar or \c Tbl_autoHScrollBar to get automatic scroll
- bars and \c Tbl_clipCellPainting to get safe clipping.
-
- The \link setCellHeight() cell height\endlink and \link setCellWidth()
- cell width\endlink are set to 0.
-
- Frame line shapes (TQFrame::HLink and TQFrame::VLine) are disallowed;
- see TQFrame::setFrameStyle().
-
- Note that the \a f argument is \e not \link setTableFlags() table
- flags \endlink but rather \link TQWidget::TQWidget() widget
- flags. \endlink
-
-*/
-
-TQtTableView::TQtTableView( TQWidget *parent, const char *name, WFlags f )
- : TQFrame( parent, name, f )
-{
- nRows = nCols = 0; // zero rows/cols
- xCellOffs = yCellOffs = 0; // zero offset
- xCellDelta = yCellDelta = 0; // zero cell offset
- xOffs = yOffs = 0; // zero total pixel offset
- cellH = cellW = 0; // user defined cell size
- tFlags = 0;
- vScrollBar = hScrollBar = 0; // no scroll bars
- cornerSquare = 0;
- sbDirty = 0;
- eraseInPaint = FALSE;
- verSliding = FALSE;
- verSnappingOff = FALSE;
- horSliding = FALSE;
- horSnappingOff = FALSE;
- coveringCornerSquare = FALSE;
- inSbUpdate = FALSE;
-}
-
-/*
- Destroys the table view.
-*/
-
-TQtTableView::~TQtTableView()
-{
- delete vScrollBar;
- delete hScrollBar;
- delete cornerSquare;
-}
-
-
-/*
- \internal
- Reimplements TQWidget::setBackgroundColor() for binary compatibility.
- \sa setPalette()
-*/
-
-void TQtTableView::setBackgroundColor( const TQColor &c )
-{
- TQWidget::setBackgroundColor( c );
-}
-
-/*\reimp
-*/
-
-void TQtTableView::setPalette( const TQPalette &p )
-{
- TQWidget::setPalette( p );
-}
-
-/*\reimp
-*/
-
-void TQtTableView::show()
-{
- showOrHideScrollBars();
- TQWidget::show();
-}
-
-
-/*
- \overload void TQtTableView::repaint( bool erase )
- Repaints the entire view.
-*/
-
-/*
- Repaints the table view directly by calling paintEvent() directly
- unless updates are disabled.
-
- Erases the view area \a (x,y,w,h) if \a erase is TRUE. Parameters \a
- (x,y) are in \e widget coordinates.
-
- If \a w is negative, it is replaced with <code>width() - x</code>.
- If \a h is negative, it is replaced with <code>height() - y</code>.
-
- Doing a repaint() usually is faster than doing an update(), but
- calling update() many times in a row will generate a single paint
- event.
-
- At present, TQtTableView is the only widget that reimplements \link
- TQWidget::repaint() repaint()\endlink. It does this because by
- clearing and then repainting one cell at at time, it can make the
- screen flicker less than it would otherwise. */
-
-void TQtTableView::repaint( int x, int y, int w, int h, bool erase )
-{
- if ( !isVisible() || testWState(WState_BlockUpdates) )
- return;
- if ( w < 0 )
- w = width() - x;
- if ( h < 0 )
- h = height() - y;
- TQRect r( x, y, w, h );
- if ( r.isEmpty() )
- return; // nothing to do
- TQPaintEvent e( r );
- if ( erase && backgroundMode() != NoBackground )
- eraseInPaint = TRUE; // erase when painting
- paintEvent( &e );
- eraseInPaint = FALSE;
-}
-
-/*
- \overload void TQtTableView::repaint( const TQRect &r, bool erase )
- Replaints rectangle \a r. If \a erase is TRUE draws the background
- using the palette's background.
-*/
-
-
-/*
- \fn int TQtTableView::numRows() const
- Returns the number of rows in the table.
- \sa numCols(), setNumRows()
-*/
-
-/*
- Sets the number of rows of the table to \a rows (must be non-negative).
- Does not change topCell().
-
- The table repaints itself automatically if autoUpdate() is set.
-
- \sa numCols(), setNumCols(), numRows()
-*/
-
-void TQtTableView::setNumRows( int rows )
-{
- if ( rows < 0 ) {
-#if defined(QT_CHECK_RANGE)
- tqWarning( "TQtTableView::setNumRows: (%s) Negative argument %d.",
- name( "unnamed" ), rows );
-#endif
- return;
- }
- if ( nRows == rows )
- return;
-
- if ( autoUpdate() && isVisible() ) {
- int oldLastVisible = lastRowVisible();
- int oldTopCell = topCell();
- nRows = rows;
- if ( autoUpdate() && isVisible() &&
- ( oldLastVisible != lastRowVisible() || oldTopCell != topCell() ) )
- repaint( oldTopCell != topCell() );
- } else {
- // Be more careful - if destructing, bad things might happen.
- nRows = rows;
- }
- updateScrollBars( verRange );
- updateFrameSize();
-}
-
-/*
- \fn int TQtTableView::numCols() const
- Returns the number of columns in the table.
- \sa numRows(), setNumCols()
-*/
-
-/*
- Sets the number of columns of the table to \a cols (must be non-negative).
- Does not change leftCell().
-
- The table repaints itself automatically if autoUpdate() is set.
-
- \sa numCols(), numRows(), setNumRows()
-*/
-
-void TQtTableView::setNumCols( int cols )
-{
- if ( cols < 0 ) {
-#if defined(QT_CHECK_RANGE)
- tqWarning( "TQtTableView::setNumCols: (%s) Negative argument %d.",
- name( "unnamed" ), cols );
-#endif
- return;
- }
- if ( nCols == cols )
- return;
- int oldCols = nCols;
- nCols = cols;
- if ( autoUpdate() && isVisible() ) {
- int maxCol = lastColVisible();
- if ( maxCol >= oldCols || maxCol >= nCols )
- repaint();
- }
- updateScrollBars( horRange );
- updateFrameSize();
-}
-
-
-/*
- \fn int TQtTableView::topCell() const
- Returns the index of the first row in the table that is visible in
- the view. The index of the first row is 0.
- \sa leftCell(), setTopCell()
-*/
-
-/*
- Scrolls the table so that \a row becomes the top row.
- The index of the very first row is 0.
- \sa setYOffset(), setTopLeftCell(), setLeftCell()
-*/
-
-void TQtTableView::setTopCell( int row )
-{
- setTopLeftCell( row, -1 );
- return;
-}
-
-/*
- \fn int TQtTableView::leftCell() const
- Returns the index of the first column in the table that is visible in
- the view. The index of the very leftmost column is 0.
- \sa topCell(), setLeftCell()
-*/
-
-/*
- Scrolls the table so that \a col becomes the leftmost
- column. The index of the leftmost column is 0.
- \sa setXOffset(), setTopLeftCell(), setTopCell()
-*/
-
-void TQtTableView::setLeftCell( int col )
-{
- setTopLeftCell( -1, col );
- return;
-}
-
-/*
- Scrolls the table so that the cell at row \a row and colum \a
- col becomes the top-left cell in the view. The cell at the extreme
- top left of the table is at position (0,0).
- \sa setLeftCell(), setTopCell(), setOffset()
-*/
-
-void TQtTableView::setTopLeftCell( int row, int col )
-{
- int newX = xOffs;
- int newY = yOffs;
-
- if ( col >= 0 ) {
- if ( cellW ) {
- newX = col*cellW;
- if ( newX > maxXOffset() )
- newX = maxXOffset();
- } else {
- newX = 0;
- while ( col )
- newX += cellWidth( --col ); // optimize using current! ###
- }
- }
- if ( row >= 0 ) {
- if ( cellH ) {
- newY = row*cellH;
- if ( newY > maxYOffset() )
- newY = maxYOffset();
- } else {
- newY = 0;
- while ( row )
- newY += cellHeight( --row ); // optimize using current! ###
- }
- }
- setOffset( newX, newY );
-}
-
-
-/*
- \fn int TQtTableView::xOffset() const
-
- Returns the x coordinate in \e table coordinates of the pixel that is
- currently on the left edge of the view.
-
- \sa setXOffset(), yOffset(), leftCell() */
-
-/*
- Scrolls the table so that \a x becomes the leftmost pixel in the view.
- The \a x parameter is in \e table coordinates.
-
- The interaction with \link setTableFlags() Tbl_snapToHGrid
- \endlink is tricky.
-
- \sa xOffset(), setYOffset(), setOffset(), setLeftCell()
-*/
-
-void TQtTableView::setXOffset( int x )
-{
- setOffset( x, yOffset() );
-}
-
-/*
- \fn int TQtTableView::yOffset() const
-
- Returns the y coordinate in \e table coordinates of the pixel that is
- currently on the top edge of the view.
-
- \sa setYOffset(), xOffset(), topCell()
-*/
-
-
-/*
- Scrolls the table so that \a y becomes the top pixel in the view.
- The \a y parameter is in \e table coordinates.
-
- The interaction with \link setTableFlags() Tbl_snapToVGrid
- \endlink is tricky.
-
- \sa yOffset(), setXOffset(), setOffset(), setTopCell()
-*/
-
-void TQtTableView::setYOffset( int y )
-{
- setOffset( xOffset(), y );
-}
-
-/*
- Scrolls the table so that \a (x,y) becomes the top-left pixel
- in the view. Parameters \a (x,y) are in \e table coordinates.
-
- The interaction with \link setTableFlags() Tbl_snapTo*Grid \endlink
- is tricky. If \a updateScrBars is TRUE, the scroll bars are
- updated.
-
- \sa xOffset(), yOffset(), setXOffset(), setYOffset(), setTopLeftCell()
-*/
-
-void TQtTableView::setOffset( int x, int y, bool updateScrBars )
-{
- if ( (!testTableFlags(Tbl_snapToHGrid) || xCellDelta == 0) &&
- (!testTableFlags(Tbl_snapToVGrid) || yCellDelta == 0) &&
- (x == xOffs && y == yOffs) )
- return;
-
- if ( x < 0 )
- x = 0;
- if ( y < 0 )
- y = 0;
-
- if ( cellW ) {
- if ( x > maxXOffset() )
- x = maxXOffset();
- xCellOffs = x / cellW;
- if ( !testTableFlags(Tbl_snapToHGrid) ) {
- xCellDelta = (short)(x % cellW);
- } else {
- x = xCellOffs*cellW;
- xCellDelta = 0;
- }
- } else {
- int xn=0, xcd=0, col = 0;
- while ( col < nCols-1 && x >= xn+(xcd=cellWidth(col)) ) {
- xn += xcd;
- col++;
- }
- xCellOffs = col;
- if ( testTableFlags(Tbl_snapToHGrid) ) {
- xCellDelta = 0;
- x = xn;
- } else {
- xCellDelta = (short)(x-xn);
- }
- }
- if ( cellH ) {
- if ( y > maxYOffset() )
- y = maxYOffset();
- yCellOffs = y / cellH;
- if ( !testTableFlags(Tbl_snapToVGrid) ) {
- yCellDelta = (short)(y % cellH);
- } else {
- y = yCellOffs*cellH;
- yCellDelta = 0;
- }
- } else {
- int yn=0, yrd=0, row=0;
- while ( row < nRows-1 && y >= yn+(yrd=cellHeight(row)) ) {
- yn += yrd;
- row++;
- }
- yCellOffs = row;
- if ( testTableFlags(Tbl_snapToVGrid) ) {
- yCellDelta = 0;
- y = yn;
- } else {
- yCellDelta = (short)(y-yn);
- }
- }
- int dx = (x - xOffs);
- int dy = (y - yOffs);
- xOffs = x;
- yOffs = y;
- if ( autoUpdate() && isVisible() )
- scroll( dx, dy );
- if ( updateScrBars )
- updateScrollBars( verValue | horValue );
-}
-
-
-/*
- \overload int TQtTableView::cellWidth() const
-
- Returns the column width in pixels. Returns 0 if the columns have
- variable widths.
-
- \sa setCellWidth(), cellHeight()
-*/
-
-/*
- Returns the width of column \a col in pixels.
-
- This function is virtual and must be reimplemented by subclasses that
- have variable cell widths. Note that if the total table width
- changes, updateTableSize() must be called.
-
- \sa setCellWidth(), cellHeight(), totalWidth(), updateTableSize()
-*/
-
-int TQtTableView::cellWidth( int )
-{
- return cellW;
-}
-
-
-/*
- Sets the width in pixels of the table cells to \a cellWidth.
-
- Setting it to 0 means that the column width is variable. When
- set to 0 (this is the default) TQtTableView calls the virtual function
- cellWidth() to get the width.
-
- \sa cellWidth(), setCellHeight(), totalWidth(), numCols()
-*/
-
-void TQtTableView::setCellWidth( int cellWidth )
-{
- if ( cellW == cellWidth )
- return;
-#if defined(QT_CHECK_RANGE)
- if ( cellWidth < 0 || cellWidth > SHRT_MAX ) {
- tqWarning( "TQtTableView::setCellWidth: (%s) Argument out of range (%d)",
- name( "unnamed" ), cellWidth );
- return;
- }
-#endif
- cellW = (short)cellWidth;
-
- updateScrollBars( horSteps | horRange );
- if ( autoUpdate() && isVisible() )
- repaint();
-
-}
-
-/*
- \overload int TQtTableView::cellHeight() const
-
- Returns the row height, in pixels. Returns 0 if the rows have
- variable heights.
-
- \sa setCellHeight(), cellWidth()
-*/
-
-
-/*
- Returns the height of row \a row in pixels.
-
- This function is virtual and must be reimplemented by subclasses that
- have variable cell heights. Note that if the total table height
- changes, updateTableSize() must be called.
-
- \sa setCellHeight(), cellWidth(), totalHeight()
-*/
-
-int TQtTableView::cellHeight( int )
-{
- return cellH;
-}
-
-/*
- Sets the height in pixels of the table cells to \a cellHeight.
-
- Setting it to 0 means that the row height is variable. When set
- to 0 (this is the default), TQtTableView calls the virtual function
- cellHeight() to get the height.
-
- \sa cellHeight(), setCellWidth(), totalHeight(), numRows()
-*/
-
-void TQtTableView::setCellHeight( int cellHeight )
-{
- if ( cellH == cellHeight )
- return;
-#if defined(QT_CHECK_RANGE)
- if ( cellHeight < 0 || cellHeight > SHRT_MAX ) {
- tqWarning( "TQtTableView::setCellHeight: (%s) Argument out of range (%d)",
- name( "unnamed" ), cellHeight );
- return;
- }
-#endif
- cellH = (short)cellHeight;
- if ( autoUpdate() && isVisible() )
- repaint();
- updateScrollBars( verSteps | verRange );
-}
-
-
-/*
- Returns the total width of the table in pixels.
-
- This function is virtual and should be reimplemented by subclasses that
- have variable cell widths and a non-trivial cellWidth() function, or a
- large number of columns in the table.
-
- The default implementation may be slow for very wide tables.
-
- \sa cellWidth(), totalHeight() */
-
-int TQtTableView::totalWidth()
-{
- if ( cellW ) {
- return cellW*nCols;
- } else {
- int tw = 0;
- for( int i = 0 ; i < nCols ; i++ )
- tw += cellWidth( i );
- return tw;
- }
-}
-
-/*
- Returns the total height of the table in pixels.
-
- This function is virtual and should be reimplemented by subclasses that
- have variable cell heights and a non-trivial cellHeight() function, or a
- large number of rows in the table.
-
- The default implementation may be slow for very tall tables.
-
- \sa cellHeight(), totalWidth()
-*/
-
-int TQtTableView::totalHeight()
-{
- if ( cellH ) {
- return cellH*nRows;
- } else {
- int th = 0;
- for( int i = 0 ; i < nRows ; i++ )
- th += cellHeight( i );
- return th;
- }
-}
-
-
-/*
- \fn uint TQtTableView::tableFlags() const
-
- Returns the union of the table flags that are currently set.
-
- \sa setTableFlags(), clearTableFlags(), testTableFlags()
-*/
-
-/*
- \fn bool TQtTableView::testTableFlags( uint f ) const
-
- Returns TRUE if any of the table flags in \a f are currently set,
- otherwise FALSE.
-
- \sa setTableFlags(), clearTableFlags(), tableFlags()
-*/
-
-/*
- Sets the table flags to \a f.
-
- If a flag setting changes the appearance of the table, the table is
- repainted if - and only if - autoUpdate() is TRUE.
-
- The table flags are mostly single bits, though there are some multibit
- flags for convenience. Here is a complete list:
-
- <dl compact>
- <dt> Tbl_vScrollBar <dd> - The table has a vertical scroll bar.
- <dt> Tbl_hScrollBar <dd> - The table has a horizontal scroll bar.
- <dt> Tbl_autoVScrollBar <dd> - The table has a vertical scroll bar if
- - and only if - the table is taller than the view.
- <dt> Tbl_autoHScrollBar <dd> The table has a horizontal scroll bar if
- - and only if - the table is wider than the view.
- <dt> Tbl_autoScrollBars <dd> - The union of the previous two flags.
- <dt> Tbl_clipCellPainting <dd> - The table uses TQPainter::setClipRect() to
- make sure that paintCell() will not draw outside the cell
- boundaries.
- <dt> Tbl_cutCellsV <dd> - The table will never show part of a
- cell at the bottom of the table; if there is not space for all of
- a cell, the space is left blank.
- <dt> Tbl_cutCellsH <dd> - The table will never show part of a
- cell at the right side of the table; if there is not space for all of
- a cell, the space is left blank.
- <dt> Tbl_cutCells <dd> - The union of the previous two flags.
- <dt> Tbl_scrollLastHCell <dd> - When the user scrolls horizontally,
- let him/her scroll the last cell left until it is at the left
- edge of the view. If this flag is not set, the user can only scroll
- to the point where the last cell is completely visible.
- <dt> Tbl_scrollLastVCell <dd> - When the user scrolls vertically, let
- him/her scroll the last cell up until it is at the top edge of
- the view. If this flag is not set, the user can only scroll to the
- point where the last cell is completely visible.
- <dt> Tbl_scrollLastCell <dd> - The union of the previous two flags.
- <dt> Tbl_smoothHScrolling <dd> - The table scrolls as smoothly as
- possible when the user scrolls horizontally. When this flag is not
- set, scrolling is done one cell at a time.
- <dt> Tbl_smoothVScrolling <dd> - The table scrolls as smoothly as
- possible when scrolling vertically. When this flag is not set,
- scrolling is done one cell at a time.
- <dt> Tbl_smoothScrolling <dd> - The union of the previous two flags.
- <dt> Tbl_snapToHGrid <dd> - Except when the user is actually scrolling,
- the leftmost column shown snaps to the leftmost edge of the view.
- <dt> Tbl_snapToVGrid <dd> - Except when the user is actually
- scrolling, the top row snaps to the top edge of the view.
- <dt> Tbl_snapToGrid <dd> - The union of the previous two flags.
- </dl>
-
- You can specify more than one flag at a time using bitwise OR.
-
- Example:
- \code
- setTableFlags( Tbl_smoothScrolling | Tbl_autoScrollBars );
- \endcode
-
- \warning The cutCells options (\c Tbl_cutCells, \c Tbl_cutCellsH and
- Tbl_cutCellsV) may cause painting problems when scrollbars are
- enabled. Do not combine cutCells and scrollbars.
-
-
- \sa clearTableFlags(), testTableFlags(), tableFlags()
-*/
-
-void TQtTableView::setTableFlags( uint f )
-{
- f = (f ^ tFlags) & f; // clear flags already set
- tFlags |= f;
-
- bool updateOn = autoUpdate();
- setAutoUpdate( FALSE );
-
- uint repaintMask = Tbl_cutCellsV | Tbl_cutCellsH;
-
- if ( f & Tbl_vScrollBar ) {
- setVerScrollBar( TRUE );
- }
- if ( f & Tbl_hScrollBar ) {
- setHorScrollBar( TRUE );
- }
- if ( f & Tbl_autoVScrollBar ) {
- updateScrollBars( verRange );
- }
- if ( f & Tbl_autoHScrollBar ) {
- updateScrollBars( horRange );
- }
- if ( f & Tbl_scrollLastHCell ) {
- updateScrollBars( horRange );
- }
- if ( f & Tbl_scrollLastVCell ) {
- updateScrollBars( verRange );
- }
- if ( f & Tbl_snapToHGrid ) {
- updateScrollBars( horRange );
- }
- if ( f & Tbl_snapToVGrid ) {
- updateScrollBars( verRange );
- }
- if ( f & Tbl_snapToGrid ) { // Note: checks for 2 flags
- if ( (f & Tbl_snapToHGrid) != 0 && xCellDelta != 0 || //have to scroll?
- (f & Tbl_snapToVGrid) != 0 && yCellDelta != 0 ) {
- snapToGrid( (f & Tbl_snapToHGrid) != 0, // do snapping
- (f & Tbl_snapToVGrid) != 0 );
- repaintMask |= Tbl_snapToGrid; // repaint table
- }
- }
-
- if ( updateOn ) {
- setAutoUpdate( TRUE );
- updateScrollBars();
- if ( isVisible() && (f & repaintMask) )
- repaint();
- }
-
-}
-
-/*
- Clears the \link setTableFlags() table flags\endlink that are set
- in \a f.
-
- Example (clears a single flag):
- \code
- clearTableFlags( Tbl_snapToGrid );
- \endcode
-
- The default argument clears all flags.
-
- \sa setTableFlags(), testTableFlags(), tableFlags()
-*/
-
-void TQtTableView::clearTableFlags( uint f )
-{
- f = (f ^ ~tFlags) & f; // clear flags that are already 0
- tFlags &= ~f;
-
- bool updateOn = autoUpdate();
- setAutoUpdate( FALSE );
-
- uint repaintMask = Tbl_cutCellsV | Tbl_cutCellsH;
-
- if ( f & Tbl_vScrollBar ) {
- setVerScrollBar( FALSE );
- }
- if ( f & Tbl_hScrollBar ) {
- setHorScrollBar( FALSE );
- }
- if ( f & Tbl_scrollLastHCell ) {
- int maxX = maxXOffset();
- if ( xOffs > maxX ) {
- setOffset( maxX, yOffs );
- repaintMask |= Tbl_scrollLastHCell;
- }
- updateScrollBars( horRange );
- }
- if ( f & Tbl_scrollLastVCell ) {
- int maxY = maxYOffset();
- if ( yOffs > maxY ) {
- setOffset( xOffs, maxY );
- repaintMask |= Tbl_scrollLastVCell;
- }
- updateScrollBars( verRange );
- }
- if ( f & Tbl_smoothScrolling ) { // Note: checks for 2 flags
- if ((f & Tbl_smoothHScrolling) != 0 && xCellDelta != 0 ||//must scroll?
- (f & Tbl_smoothVScrolling) != 0 && yCellDelta != 0 ) {
- snapToGrid( (f & Tbl_smoothHScrolling) != 0, // do snapping
- (f & Tbl_smoothVScrolling) != 0 );
- repaintMask |= Tbl_smoothScrolling; // repaint table
- }
- }
- if ( f & Tbl_snapToHGrid ) {
- updateScrollBars( horRange );
- }
- if ( f & Tbl_snapToVGrid ) {
- updateScrollBars( verRange );
- }
- if ( updateOn ) {
- setAutoUpdate( TRUE );
- updateScrollBars(); // returns immediately if nothing to do
- if ( isVisible() && (f & repaintMask) )
- repaint();
- }
-
-}
-
-
-/*
- \fn bool TQtTableView::autoUpdate() const
-
- Returns TRUE if the view updates itself automatically whenever it
- is changed in some way.
-
- \sa setAutoUpdate()
-*/
-
-/*
- Sets the auto-update option of the table view to \a enable.
-
- If \a enable is TRUE (this is the default), the view updates itself
- automatically whenever it has changed in some way (for example, when a
- \link setTableFlags() flag\endlink is changed).
-
- If \a enable is FALSE, the view does NOT repaint itself or update
- its internal state variables when it is changed. This can be
- useful to avoid flicker during large changes and is singularly
- useless otherwise. Disable auto-update, do the changes, re-enable
- auto-update and call repaint().
-
- \warning Do not leave the view in this state for a long time
- (i.e., between events). If, for example, the user interacts with the
- view when auto-update is off, strange things can happen.
-
- Setting auto-update to TRUE does not repaint the view; you must call
- repaint() to do this.
-
- \sa autoUpdate(), repaint()
-*/
-
-void TQtTableView::setAutoUpdate( bool enable )
-{
- if ( isUpdatesEnabled() == enable )
- return;
- setUpdatesEnabled( enable );
- if ( enable ) {
- showOrHideScrollBars();
- updateScrollBars();
- }
-}
-
-
-/*
- Repaints the cell at row \a row, column \a col if it is inside the view.
-
- If \a erase is TRUE, the relevant part of the view is cleared to the
- background color/pixmap before the contents are repainted.
-
- \sa isVisible()
-*/
-
-void TQtTableView::updateCell( int row, int col, bool erase )
-{
- int xPos, yPos;
- if ( !colXPos( col, &xPos ) )
- return;
- if ( !rowYPos( row, &yPos ) )
- return;
- TQRect uR = TQRect( xPos, yPos,
- cellW ? cellW : cellWidth(col),
- cellH ? cellH : cellHeight(row) );
- repaint( uR.intersect(viewRect()), erase );
-}
-
-
-/*
- \fn TQRect TQtTableView::cellUpdateRect() const
-
- This function should be called only from the paintCell() function in
- subclasses. It returns the portion of a cell that actually needs to be
- updated in \e cell coordinates. This is useful only for non-trivial
- paintCell().
-
-*/
-
-/*
- Returns the rectangle that is the actual table, excluding any
- frame, in \e widget coordinates.
-*/
-
-TQRect TQtTableView::viewRect() const
-{
- return TQRect( frameWidth(), frameWidth(), viewWidth(), viewHeight() );
-}
-
-
-/*
- Returns the index of the last (bottom) row in the view.
- The index of the first row is 0.
-
- If no rows are visible it returns -1. This can happen if the
- view is too small for the first row and Tbl_cutCellsV is set.
-
- \sa lastColVisible()
-*/
-
-int TQtTableView::lastRowVisible() const
-{
- int cellMaxY;
- int row = findRawRow( maxViewY(), &cellMaxY );
- if ( row == -1 || row >= nRows ) { // maxViewY() past end?
- row = nRows - 1; // yes: return last row
- } else {
- if ( testTableFlags(Tbl_cutCellsV) && cellMaxY > maxViewY() ) {
- if ( row == yCellOffs ) // cut by right margin?
- return -1; // yes, nothing in the view
- else
- row = row - 1; // cut by margin, one back
- }
- }
- return row;
-}
-
-/*
- Returns the index of the last (right) column in the view.
- The index of the first column is 0.
-
- If no columns are visible it returns -1. This can happen if the
- view is too narrow for the first column and Tbl_cutCellsH is set.
-
- \sa lastRowVisible()
-*/
-
-int TQtTableView::lastColVisible() const
-{
- int cellMaxX;
- int col = findRawCol( maxViewX(), &cellMaxX );
- if ( col == -1 || col >= nCols ) { // maxViewX() past end?
- col = nCols - 1; // yes: return last col
- } else {
- if ( testTableFlags(Tbl_cutCellsH) && cellMaxX > maxViewX() ) {
- if ( col == xCellOffs ) // cut by bottom margin?
- return -1; // yes, nothing in the view
- else
- col = col - 1; // cell by margin, one back
- }
- }
- return col;
-}
-
-/*
- Returns TRUE if \a row is at least partially visible.
- \sa colIsVisible()
-*/
-
-bool TQtTableView::rowIsVisible( int row ) const
-{
- return rowYPos( row, 0 );
-}
-
-/*
- Returns TRUE if \a col is at least partially visible.
- \sa rowIsVisible()
-*/
-
-bool TQtTableView::colIsVisible( int col ) const
-{
- return colXPos( col, 0 );
-}
-
-
-/*
- \internal
- Called when both scroll bars are active at the same time. Covers the
- bottom left corner between the two scroll bars with an empty widget.
-*/
-
-void TQtTableView::coverCornerSquare( bool enable )
-{
- coveringCornerSquare = enable;
- if ( !cornerSquare && enable ) {
- cornerSquare = new TQCornerSquare( this );
- TQ_CHECK_PTR( cornerSquare );
- cornerSquare->setGeometry( maxViewX() + frameWidth() + 1,
- maxViewY() + frameWidth() + 1,
- VSBEXT,
- HSBEXT);
- }
- if ( autoUpdate() && cornerSquare ) {
- if ( enable )
- cornerSquare->show();
- else
- cornerSquare->hide();
- }
-}
-
-
-/*
- \internal
- Scroll the view to a position such that:
-
- If \a horizontal is TRUE, the leftmost column shown fits snugly
- with the left edge of the view.
-
- If \a vertical is TRUE, the top row shown fits snugly with the top
- of the view.
-
- You can achieve the same effect automatically by setting any of the
- \link setTableFlags() Tbl_snapTo*Grid \endlink table flags.
-*/
-
-void TQtTableView::snapToGrid( bool horizontal, bool vertical )
-{
- int newXCell = -1;
- int newYCell = -1;
- if ( horizontal && xCellDelta != 0 ) {
- int w = cellW ? cellW : cellWidth( xCellOffs );
- if ( xCellDelta >= w/2 )
- newXCell = xCellOffs + 1;
- else
- newXCell = xCellOffs;
- }
- if ( vertical && yCellDelta != 0 ) {
- int h = cellH ? cellH : cellHeight( yCellOffs );
- if ( yCellDelta >= h/2 )
- newYCell = yCellOffs + 1;
- else
- newYCell = yCellOffs;
- }
- setTopLeftCell( newYCell, newXCell ); //row,column
-}
-
-/*
- \internal
- This internal slot is connected to the horizontal scroll bar's
- TQScrollBar::valueChanged() signal.
-
- Moves the table horizontally to offset \a val without updating the
- scroll bar.
-*/
-
-void TQtTableView::horSbValue( int val )
-{
- if ( horSliding ) {
- horSliding = FALSE;
- if ( horSnappingOff ) {
- horSnappingOff = FALSE;
- tFlags |= Tbl_snapToHGrid;
- }
- }
- setOffset( val, yOffs, FALSE );
-}
-
-/*
- \internal
- This internal slot is connected to the horizontal scroll bar's
- TQScrollBar::sliderMoved() signal.
-
- Scrolls the table smoothly horizontally even if \c Tbl_snapToHGrid is set.
-*/
-
-void TQtTableView::horSbSliding( int val )
-{
- if ( testTableFlags(Tbl_snapToHGrid) &&
- testTableFlags(Tbl_smoothHScrolling) ) {
- tFlags &= ~Tbl_snapToHGrid; // turn off snapping while sliding
- setOffset( val, yOffs, FALSE );
- tFlags |= Tbl_snapToHGrid; // turn on snapping again
- } else {
- setOffset( val, yOffs, FALSE );
- }
-}
-
-/*
- \internal
- This internal slot is connected to the horizontal scroll bar's
- TQScrollBar::sliderReleased() signal.
-*/
-
-void TQtTableView::horSbSlidingDone( )
-{
- if ( testTableFlags(Tbl_snapToHGrid) &&
- testTableFlags(Tbl_smoothHScrolling) )
- snapToGrid( TRUE, FALSE );
-}
-
-/*
- \internal
- This internal slot is connected to the vertical scroll bar's
- TQScrollBar::valueChanged() signal.
-
- Moves the table vertically to offset \a val without updating the
- scroll bar.
-*/
-
-void TQtTableView::verSbValue( int val )
-{
- if ( verSliding ) {
- verSliding = FALSE;
- if ( verSnappingOff ) {
- verSnappingOff = FALSE;
- tFlags |= Tbl_snapToVGrid;
- }
- }
- setOffset( xOffs, val, FALSE );
-}
-
-/*
- \internal
- This internal slot is connected to the vertical scroll bar's
- TQScrollBar::sliderMoved() signal.
-
- Scrolls the table smoothly vertically even if \c Tbl_snapToVGrid is set.
-*/
-
-void TQtTableView::verSbSliding( int val )
-{
- if ( testTableFlags(Tbl_snapToVGrid) &&
- testTableFlags(Tbl_smoothVScrolling) ) {
- tFlags &= ~Tbl_snapToVGrid; // turn off snapping while sliding
- setOffset( xOffs, val, FALSE );
- tFlags |= Tbl_snapToVGrid; // turn on snapping again
- } else {
- setOffset( xOffs, val, FALSE );
- }
-}
-
-/*
- \internal
- This internal slot is connected to the vertical scroll bar's
- TQScrollBar::sliderReleased() signal.
-*/
-
-void TQtTableView::verSbSlidingDone( )
-{
- if ( testTableFlags(Tbl_snapToVGrid) &&
- testTableFlags(Tbl_smoothVScrolling) )
- snapToGrid( FALSE, TRUE );
-}
-
-
-/*
- This virtual function is called before painting of table cells
- is started. It can be reimplemented by subclasses that want to
- to set up the painter in a special way and that do not want to
- do so for each cell.
-*/
-
-void TQtTableView::setupPainter( TQPainter * )
-{
-}
-
-/*
- \fn void TQtTableView::paintCell( TQPainter *p, int row, int col )
-
- This pure virtual function is called to paint the single cell at \a
- (row,col) using \a p, which is open when paintCell() is called and
- must remain open.
-
- The coordinate system is \link TQPainter::translate() translated \endlink
- so that the origin is at the top-left corner of the cell to be
- painted, i.e. \e cell coordinates. Do not scale or shear the coordinate
- system (or if you do, restore the transformation matrix before you
- return).
-
- The painter is not clipped by default and for maximum efficiency. For safety,
- call setTableFlags(Tbl_clipCellPainting) to enable clipping.
-
- \sa paintEvent(), setTableFlags() */
-
-
-/*
- Handles paint events, \a e, for the table view.
-
- Calls paintCell() for the cells that needs to be repainted.
-*/
-
-void TQtTableView::paintEvent( TQPaintEvent *e )
-{
- TQRect updateR = e->rect(); // update rectangle
- if ( sbDirty ) {
- bool e = eraseInPaint;
- updateScrollBars();
- eraseInPaint = e;
- }
-
- TQPainter paint( this );
-
- if ( !contentsRect().contains( updateR, TRUE ) ) {// update frame ?
- drawFrame( &paint );
- if ( updateR.left() < frameWidth() ) //###
- updateR.setLeft( frameWidth() );
- if ( updateR.top() < frameWidth() )
- updateR.setTop( frameWidth() );
- }
-
- int maxWX = maxViewX();
- int maxWY = maxViewY();
- if ( updateR.right() > maxWX )
- updateR.setRight( maxWX );
- if ( updateR.bottom() > maxWY )
- updateR.setBottom( maxWY );
-
- setupPainter( &paint ); // prepare for painting table
-
- int firstRow = findRow( updateR.y() );
- int firstCol = findCol( updateR.x() );
- int xStart, yStart;
- if ( !colXPos( firstCol, &xStart ) || !rowYPos( firstRow, &yStart ) ) {
- paint.eraseRect( updateR ); // erase area outside cells but in view
- return;
- }
- int maxX = updateR.right();
- int maxY = updateR.bottom();
- int row = firstRow;
- int col;
- int yPos = yStart;
- int xPos = maxX+1; // in case the while() is empty
- int nextX;
- int nextY;
- TQRect winR = viewRect();
- TQRect cellR;
- TQRect cellUR;
-#ifndef TQT_NO_TRANSFORMATIONS
- TQWMatrix matrix;
-#endif
-
- while ( yPos <= maxY && row < nRows ) {
- nextY = yPos + (cellH ? cellH : cellHeight( row ));
- if ( testTableFlags( Tbl_cutCellsV ) && nextY > ( maxWY + 1 ) )
- break;
- col = firstCol;
- xPos = xStart;
- while ( xPos <= maxX && col < nCols ) {
- nextX = xPos + (cellW ? cellW : cellWidth( col ));
- if ( testTableFlags( Tbl_cutCellsH ) && nextX > ( maxWX + 1 ) )
- break;
-
- cellR.setRect( xPos, yPos, cellW ? cellW : cellWidth(col),
- cellH ? cellH : cellHeight(row) );
- cellUR = cellR.intersect( updateR );
- if ( cellUR.isValid() ) {
- cellUpdateR = cellUR;
- cellUpdateR.moveBy( -xPos, -yPos ); // cell coordinates
- if ( eraseInPaint )
- paint.eraseRect( cellUR );
-
-#ifndef TQT_NO_TRANSFORMATIONS
- matrix.translate( xPos, yPos );
- paint.setWorldMatrix( matrix );
- if ( testTableFlags(Tbl_clipCellPainting) ||
- frameWidth() > 0 && !winR.contains( cellR ) ) { //##arnt
- paint.setClipRect( cellUR );
- paintCell( &paint, row, col );
- paint.setClipping( FALSE );
- } else {
- paintCell( &paint, row, col );
- }
- matrix.reset();
- paint.setWorldMatrix( matrix );
-#else
- paint.translate( xPos, yPos );
- if ( testTableFlags(Tbl_clipCellPainting) ||
- frameWidth() > 0 && !winR.contains( cellR ) ) { //##arnt
- paint.setClipRect( cellUR );
- paintCell( &paint, row, col );
- paint.setClipping( FALSE );
- } else {
- paintCell( &paint, row, col );
- }
- paint.translate( -xPos, -yPos );
-#endif
- }
- col++;
- xPos = nextX;
- }
- row++;
- yPos = nextY;
- }
-
- // while painting we have to erase any areas in the view that
- // are not covered by cells but are covered by the paint event
- // rectangle these must be erased. We know that xPos is the last
- // x pixel updated + 1 and that yPos is the last y pixel updated + 1.
-
- // Note that this needs to be done regardless whether we do
- // eraseInPaint or not. Reason: a subclass may implement
- // flicker-freeness and encourage the use of repaint(FALSE).
- // The subclass, however, cannot draw all pixels, just those
- // inside the cells. So TQtTableView is reponsible for all pixels
- // outside the cells.
-
- TQRect viewR = viewRect();
- const TQColorGroup g = colorGroup();
-
- if ( xPos <= maxX ) {
- TQRect r = viewR;
- r.setLeft( xPos );
- r.setBottom( yPos<maxY?yPos:maxY );
- if ( inherits( "TQMultiLineEdit" ) )
- paint.fillRect( r.intersect( updateR ), g.base() );
- else
- paint.eraseRect( r.intersect( updateR ) );
- }
- if ( yPos <= maxY ) {
- TQRect r = viewR;
- r.setTop( yPos );
- if ( inherits( "TQMultiLineEdit" ) )
- paint.fillRect( r.intersect( updateR ), g.base() );
- else
- paint.eraseRect( r.intersect( updateR ) );
- }
-}
-
-/*\reimp
-*/
-void TQtTableView::resizeEvent( TQResizeEvent * )
-{
- updateScrollBars( horValue | verValue | horSteps | horGeometry | horRange |
- verSteps | verGeometry | verRange );
- showOrHideScrollBars();
- updateFrameSize();
- int maxX = TQMIN( xOffs, maxXOffset() ); // ### can be slow
- int maxY = TQMIN( yOffs, maxYOffset() );
- setOffset( maxX, maxY );
-}
-
-
-/*
- Redraws all visible cells in the table view.
-*/
-
-void TQtTableView::updateView()
-{
- repaint( viewRect() );
-}
-
-/*
- Returns a pointer to the vertical scroll bar mainly so you can
- connect() to its signals. Note that the scroll bar works in pixel
- values; use findRow() to translate to cell numbers.
-*/
-
-TQScrollBar *TQtTableView::verticalScrollBar() const
-{
- TQtTableView *that = (TQtTableView*)this; // semantic const
- if ( !vScrollBar ) {
- TQScrollBar *sb = new TQScrollBar( TQScrollBar::Vertical, that );
-#ifndef TQT_NO_CURSOR
- sb->setCursor( arrowCursor );
-#endif
- sb->resize( sb->sizeHint() ); // height is irrelevant
- TQ_CHECK_PTR(sb);
- sb->setTracking( FALSE );
- sb->setFocusPolicy( NoFocus );
- connect( sb, SIGNAL(valueChanged(int)),
- SLOT(verSbValue(int)));
- connect( sb, SIGNAL(sliderMoved(int)),
- SLOT(verSbSliding(int)));
- connect( sb, SIGNAL(sliderReleased()),
- SLOT(verSbSlidingDone()));
- sb->hide();
- that->vScrollBar = sb;
- return sb;
- }
- return vScrollBar;
-}
-
-/*
- Returns a pointer to the horizontal scroll bar mainly so you can
- connect() to its signals. Note that the scroll bar works in pixel
- values; use findCol() to translate to cell numbers.
-*/
-
-TQScrollBar *TQtTableView::horizontalScrollBar() const
-{
- TQtTableView *that = (TQtTableView*)this; // semantic const
- if ( !hScrollBar ) {
- TQScrollBar *sb = new TQScrollBar( TQScrollBar::Horizontal, that );
-#ifndef TQT_NO_CURSOR
- sb->setCursor( arrowCursor );
-#endif
- sb->resize( sb->sizeHint() ); // width is irrelevant
- sb->setFocusPolicy( NoFocus );
- TQ_CHECK_PTR(sb);
- sb->setTracking( FALSE );
- connect( sb, SIGNAL(valueChanged(int)),
- SLOT(horSbValue(int)));
- connect( sb, SIGNAL(sliderMoved(int)),
- SLOT(horSbSliding(int)));
- connect( sb, SIGNAL(sliderReleased()),
- SLOT(horSbSlidingDone()));
- sb->hide();
- that->hScrollBar = sb;
- return sb;
- }
- return hScrollBar;
-}
-
-/*
- Enables or disables the horizontal scroll bar, as required by
- setAutoUpdate() and the \link setTableFlags() table flags\endlink.
-*/
-
-void TQtTableView::setHorScrollBar( bool on, bool update )
-{
- if ( on ) {
- tFlags |= Tbl_hScrollBar;
- horizontalScrollBar(); // created
- if ( update )
- updateScrollBars( horMask | verMask );
- else
- sbDirty = sbDirty | (horMask | verMask);
- if ( testTableFlags( Tbl_vScrollBar ) )
- coverCornerSquare( TRUE );
- if ( autoUpdate() )
- sbDirty = sbDirty | horMask;
- } else {
- tFlags &= ~Tbl_hScrollBar;
- if ( !hScrollBar )
- return;
- coverCornerSquare( FALSE );
- bool hideScrollBar = autoUpdate() && hScrollBar->isVisible();
- if ( hideScrollBar )
- hScrollBar->hide();
- if ( update )
- updateScrollBars( verMask );
- else
- sbDirty = sbDirty | verMask;
- if ( hideScrollBar && isVisible() )
- repaint( hScrollBar->x(), hScrollBar->y(),
- width() - hScrollBar->x(), hScrollBar->height() );
- }
- if ( update )
- updateFrameSize();
-}
-
-
-/*
- Enables or disables the vertical scroll bar, as required by
- setAutoUpdate() and the \link setTableFlags() table flags\endlink.
-*/
-
-void TQtTableView::setVerScrollBar( bool on, bool update )
-{
- if ( on ) {
- tFlags |= Tbl_vScrollBar;
- verticalScrollBar(); // created
- if ( update )
- updateScrollBars( verMask | horMask );
- else
- sbDirty = sbDirty | (horMask | verMask);
- if ( testTableFlags( Tbl_hScrollBar ) )
- coverCornerSquare( TRUE );
- if ( autoUpdate() )
- sbDirty = sbDirty | verMask;
- } else {
- tFlags &= ~Tbl_vScrollBar;
- if ( !vScrollBar )
- return;
- coverCornerSquare( FALSE );
- bool hideScrollBar = autoUpdate() && vScrollBar->isVisible();
- if ( hideScrollBar )
- vScrollBar->hide();
- if ( update )
- updateScrollBars( horMask );
- else
- sbDirty = sbDirty | horMask;
- if ( hideScrollBar && isVisible() )
- repaint( vScrollBar->x(), vScrollBar->y(),
- vScrollBar->width(), height() - vScrollBar->y() );
- }
- if ( update )
- updateFrameSize();
-}
-
-
-
-
-int TQtTableView::findRawRow( int yPos, int *cellMaxY, int *cellMinY,
- bool goOutsideView ) const
-{
- int r = -1;
- if ( nRows == 0 )
- return r;
- if ( goOutsideView || yPos >= minViewY() && yPos <= maxViewY() ) {
- if ( yPos < minViewY() ) {
-#if defined(QT_CHECK_RANGE)
- tqWarning( "TQtTableView::findRawRow: (%s) internal error: "
- "yPos < minViewY() && goOutsideView "
- "not supported. (%d,%d)",
- name( "unnamed" ), yPos, yOffs );
-#endif
- return -1;
- }
- if ( cellH ) { // uniform cell height
- r = (yPos - minViewY() + yCellDelta)/cellH; // cell offs from top
- if ( cellMaxY )
- *cellMaxY = (r + 1)*cellH + minViewY() - yCellDelta - 1;
- if ( cellMinY )
- *cellMinY = r*cellH + minViewY() - yCellDelta;
- r += yCellOffs; // absolute cell index
- } else { // variable cell height
- TQtTableView *tw = (TQtTableView *)this;
- r = yCellOffs;
- int h = minViewY() - yCellDelta; //##arnt3
- int oldH = h;
- Q_ASSERT( r < nRows );
- while ( r < nRows ) {
- oldH = h;
- h += tw->cellHeight( r ); // Start of next cell
- if ( yPos < h )
- break;
- r++;
- }
- if ( cellMaxY )
- *cellMaxY = h - 1;
- if ( cellMinY )
- *cellMinY = oldH;
- }
- }
- return r;
-
-}
-
-
-int TQtTableView::findRawCol( int xPos, int *cellMaxX, int *cellMinX ,
- bool goOutsideView ) const
-{
- int c = -1;
- if ( nCols == 0 )
- return c;
- if ( goOutsideView || xPos >= minViewX() && xPos <= maxViewX() ) {
- if ( xPos < minViewX() ) {
-#if defined(QT_CHECK_RANGE)
- tqWarning( "TQtTableView::findRawCol: (%s) internal error: "
- "xPos < minViewX() && goOutsideView "
- "not supported. (%d,%d)",
- name( "unnamed" ), xPos, xOffs );
-#endif
- return -1;
- }
- if ( cellW ) { // uniform cell width
- c = (xPos - minViewX() + xCellDelta)/cellW; //cell offs from left
- if ( cellMaxX )
- *cellMaxX = (c + 1)*cellW + minViewX() - xCellDelta - 1;
- if ( cellMinX )
- *cellMinX = c*cellW + minViewX() - xCellDelta;
- c += xCellOffs; // absolute cell index
- } else { // variable cell width
- TQtTableView *tw = (TQtTableView *)this;
- c = xCellOffs;
- int w = minViewX() - xCellDelta; //##arnt3
- int oldW = w;
- Q_ASSERT( c < nCols );
- while ( c < nCols ) {
- oldW = w;
- w += tw->cellWidth( c ); // Start of next cell
- if ( xPos < w )
- break;
- c++;
- }
- if ( cellMaxX )
- *cellMaxX = w - 1;
- if ( cellMinX )
- *cellMinX = oldW;
- }
- }
- return c;
-}
-
-
-/*
- Returns the index of the row at position \a yPos, where \a yPos is in
- \e widget coordinates. Returns -1 if \a yPos is outside the valid
- range.
-
- \sa findCol(), rowYPos()
-*/
-
-int TQtTableView::findRow( int yPos ) const
-{
- int cellMaxY;
- int row = findRawRow( yPos, &cellMaxY );
- if ( testTableFlags(Tbl_cutCellsV) && cellMaxY > maxViewY() )
- row = - 1; // cell cut by bottom margin
- if ( row >= nRows )
- row = -1;
- return row;
-}
-
-
-/*
- Returns the index of the column at position \a xPos, where \a xPos is
- in \e widget coordinates. Returns -1 if \a xPos is outside the valid
- range.
-
- \sa findRow(), colXPos()
-*/
-
-int TQtTableView::findCol( int xPos ) const
-{
- int cellMaxX;
- int col = findRawCol( xPos, &cellMaxX );
- if ( testTableFlags(Tbl_cutCellsH) && cellMaxX > maxViewX() )
- col = - 1; // cell cut by right margin
- if ( col >= nCols )
- col = -1;
- return col;
-}
-
-
-/*
- Computes the position in the widget of row \a row.
-
- Returns TRUE and stores the result in \a *yPos (in \e widget
- coordinates) if the row is visible. Returns FALSE and does not modify
- \a *yPos if \a row is invisible or invalid.
-
- \sa colXPos(), findRow()
-*/
-
-bool TQtTableView::rowYPos( int row, int *yPos ) const
-{
- int y;
- if ( row >= yCellOffs ) {
- if ( cellH ) {
- int lastVisible = lastRowVisible();
- if ( row > lastVisible || lastVisible == -1 )
- return FALSE;
- y = (row - yCellOffs)*cellH + minViewY() - yCellDelta;
- } else {
- //##arnt3
- y = minViewY() - yCellDelta; // y of leftmost cell in view
- int r = yCellOffs;
- TQtTableView *tw = (TQtTableView *)this;
- int maxY = maxViewY();
- while ( r < row && y <= maxY )
- y += tw->cellHeight( r++ );
- if ( y > maxY )
- return FALSE;
-
- }
- } else {
- return FALSE;
- }
- if ( yPos )
- *yPos = y;
- return TRUE;
-}
-
-
-/*
- Computes the position in the widget of column \a col.
-
- Returns TRUE and stores the result in \a *xPos (in \e widget
- coordinates) if the column is visible. Returns FALSE and does not
- modify \a *xPos if \a col is invisible or invalid.
-
- \sa rowYPos(), findCol()
-*/
-
-bool TQtTableView::colXPos( int col, int *xPos ) const
-{
- int x;
- if ( col >= xCellOffs ) {
- if ( cellW ) {
- int lastVisible = lastColVisible();
- if ( col > lastVisible || lastVisible == -1 )
- return FALSE;
- x = (col - xCellOffs)*cellW + minViewX() - xCellDelta;
- } else {
- //##arnt3
- x = minViewX() - xCellDelta; // x of uppermost cell in view
- int c = xCellOffs;
- TQtTableView *tw = (TQtTableView *)this;
- int maxX = maxViewX();
- while ( c < col && x <= maxX )
- x += tw->cellWidth( c++ );
- if ( x > maxX )
- return FALSE;
- }
- } else {
- return FALSE;
- }
- if ( xPos )
- *xPos = x;
- return TRUE;
-}
-
-
-/*
- Moves the visible area of the table right by \a xPixels and
- down by \a yPixels pixels. Both may be negative.
-
- \warning You might find that TQScrollView offers a higher-level of
- functionality than using TQtTableView and this function.
-
- This function is \e not the same as TQWidget::scroll(); in particular,
- the signs of \a xPixels and \a yPixels have the reverse semantics.
-
- \sa setXOffset(), setYOffset(), setOffset(), setTopCell(),
- setLeftCell()
-*/
-
-void TQtTableView::scroll( int xPixels, int yPixels )
-{
- TQWidget::scroll( -xPixels, -yPixels, contentsRect() );
-}
-
-
-/*
- Returns the leftmost pixel of the table view in \e view
- coordinates. This excludes the frame and any header.
-
- \sa maxViewY(), viewWidth(), contentsRect()
-*/
-
-int TQtTableView::minViewX() const
-{
- return frameWidth();
-}
-
-
-/*
- Returns the top pixel of the table view in \e view
- coordinates. This excludes the frame and any header.
-
- \sa maxViewX(), viewHeight(), contentsRect()
-*/
-
-int TQtTableView::minViewY() const
-{
- return frameWidth();
-}
-
-
-/*
- Returns the rightmost pixel of the table view in \e view
- coordinates. This excludes the frame and any scroll bar, but
- includes blank pixels to the right of the visible table data.
-
- \sa maxViewY(), viewWidth(), contentsRect()
-*/
-
-int TQtTableView::maxViewX() const
-{
- return width() - 1 - frameWidth()
- - (tFlags & Tbl_vScrollBar ? VSBEXT
- : 0);
-}
-
-
-/*
- Returns the bottom pixel of the table view in \e view
- coordinates. This excludes the frame and any scroll bar, but
- includes blank pixels below the visible table data.
-
- \sa maxViewX(), viewHeight(), contentsRect()
-*/
-
-int TQtTableView::maxViewY() const
-{
- return height() - 1 - frameWidth()
- - (tFlags & Tbl_hScrollBar ? HSBEXT
- : 0);
-}
-
-
-/*
- Returns the width of the table view, as such, in \e view
- coordinates. This does not include any header, scroll bar or frame,
- but it does include background pixels to the right of the table data.
-
- \sa minViewX() maxViewX(), viewHeight(), contentsRect() viewRect()
-*/
-
-int TQtTableView::viewWidth() const
-{
- return maxViewX() - minViewX() + 1;
-}
-
-
-/*
- Returns the height of the table view, as such, in \e view
- coordinates. This does not include any header, scroll bar or frame,
- but it does include background pixels below the table data.
-
- \sa minViewY() maxViewY() viewWidth() contentsRect() viewRect()
-*/
-
-int TQtTableView::viewHeight() const
-{
- return maxViewY() - minViewY() + 1;
-}
-
-
-void TQtTableView::doAutoScrollBars()
-{
- int viewW = width() - frameWidth() - minViewX();
- int viewH = height() - frameWidth() - minViewY();
- bool vScrollOn = testTableFlags(Tbl_vScrollBar);
- bool hScrollOn = testTableFlags(Tbl_hScrollBar);
- int w = 0;
- int h = 0;
- int i;
-
- if ( testTableFlags(Tbl_autoHScrollBar) ) {
- if ( cellW ) {
- w = cellW*nCols;
- } else {
- i = 0;
- while ( i < nCols && w <= viewW )
- w += cellWidth( i++ );
- }
- if ( w > viewW )
- hScrollOn = TRUE;
- else
- hScrollOn = FALSE;
- }
-
- if ( testTableFlags(Tbl_autoVScrollBar) ) {
- if ( cellH ) {
- h = cellH*nRows;
- } else {
- i = 0;
- while ( i < nRows && h <= viewH )
- h += cellHeight( i++ );
- }
-
- if ( h > viewH )
- vScrollOn = TRUE;
- else
- vScrollOn = FALSE;
- }
-
- if ( testTableFlags(Tbl_autoHScrollBar) && vScrollOn && !hScrollOn )
- if ( w > viewW - VSBEXT )
- hScrollOn = TRUE;
-
- if ( testTableFlags(Tbl_autoVScrollBar) && hScrollOn && !vScrollOn )
- if ( h > viewH - HSBEXT )
- vScrollOn = TRUE;
-
- setHorScrollBar( hScrollOn, FALSE );
- setVerScrollBar( vScrollOn, FALSE );
- updateFrameSize();
-}
-
-
-/*
- \fn void TQtTableView::updateScrollBars()
-
- Updates the scroll bars' contents and presence to match the table's
- state. Generally, you should not need to call this.
-
- \sa setTableFlags()
-*/
-
-/*
- Updates the scroll bars' contents and presence to match the table's
- state \c or \a f.
-
- \sa setTableFlags()
-*/
-
-void TQtTableView::updateScrollBars( uint f )
-{
- sbDirty = sbDirty | f;
- if ( inSbUpdate )
- return;
- inSbUpdate = TRUE;
-
- if ( testTableFlags(Tbl_autoHScrollBar) && (sbDirty & horRange) ||
- testTableFlags(Tbl_autoVScrollBar) && (sbDirty & verRange) )
- // if range change and auto
- doAutoScrollBars(); // turn scroll bars on/off if needed
-
- if ( !autoUpdate() ) {
- inSbUpdate = FALSE;
- return;
- }
- if ( yOffset() > 0 && testTableFlags( Tbl_autoVScrollBar ) &&
- !testTableFlags( Tbl_vScrollBar ) ) {
- setYOffset( 0 );
- }
- if ( xOffset() > 0 && testTableFlags( Tbl_autoHScrollBar ) &&
- !testTableFlags( Tbl_hScrollBar ) ) {
- setXOffset( 0 );
- }
- if ( !isVisible() ) {
- inSbUpdate = FALSE;
- return;
- }
-
- if ( testTableFlags(Tbl_hScrollBar) && (sbDirty & horMask) != 0 ) {
- if ( sbDirty & horGeometry )
- hScrollBar->setGeometry( 0,height() - HSBEXT,
- viewWidth() + frameWidth()*2,
- HSBEXT);
-
- if ( sbDirty & horSteps ) {
- if ( cellW )
- hScrollBar->setSteps( TQMIN(cellW,viewWidth()/2), viewWidth() );
- else
- hScrollBar->setSteps( 16, viewWidth() );
- }
-
- if ( sbDirty & horRange )
- hScrollBar->setRange( 0, maxXOffset() );
-
- if ( sbDirty & horValue )
- hScrollBar->setValue( xOffs );
-
- // show scrollbar only when it has a sane geometry
- if ( !hScrollBar->isVisible() )
- hScrollBar->show();
- }
-
- if ( testTableFlags(Tbl_vScrollBar) && (sbDirty & verMask) != 0 ) {
- if ( sbDirty & verGeometry )
- vScrollBar->setGeometry( width() - VSBEXT, 0,
- VSBEXT,
- viewHeight() + frameWidth()*2 );
-
- if ( sbDirty & verSteps ) {
- if ( cellH )
- vScrollBar->setSteps( TQMIN(cellH,viewHeight()/2), viewHeight() );
- else
- vScrollBar->setSteps( 16, viewHeight() ); // fttb! ###
- }
-
- if ( sbDirty & verRange )
- vScrollBar->setRange( 0, maxYOffset() );
-
- if ( sbDirty & verValue )
- vScrollBar->setValue( yOffs );
-
- // show scrollbar only when it has a sane geometry
- if ( !vScrollBar->isVisible() )
- vScrollBar->show();
- }
- if ( coveringCornerSquare &&
- ( (sbDirty & verGeometry ) || (sbDirty & horGeometry)) )
- cornerSquare->move( maxViewX() + frameWidth() + 1,
- maxViewY() + frameWidth() + 1 );
-
- sbDirty = 0;
- inSbUpdate = FALSE;
-}
-
-
-void TQtTableView::updateFrameSize()
-{
- int rw = width() - ( testTableFlags(Tbl_vScrollBar) ?
- VSBEXT : 0 );
- int rh = height() - ( testTableFlags(Tbl_hScrollBar) ?
- HSBEXT : 0 );
- if ( rw < 0 )
- rw = 0;
- if ( rh < 0 )
- rh = 0;
-
- if ( autoUpdate() ) {
- int fh = frameRect().height();
- int fw = frameRect().width();
- setFrameRect( TQRect(0,0,rw,rh) );
-
- if ( rw != fw )
- update( TQMIN(fw,rw) - frameWidth() - 2, 0, frameWidth()+4, rh );
- if ( rh != fh )
- update( 0, TQMIN(fh,rh) - frameWidth() - 2, rw, frameWidth()+4 );
- }
-}
-
-
-/*
- Returns the maximum horizontal offset within the table of the
- view's left edge in \e table coordinates.
-
- This is used mainly to set the horizontal scroll bar's range.
-
- \sa maxColOffset(), maxYOffset(), totalWidth()
-*/
-
-int TQtTableView::maxXOffset()
-{
- int tw = totalWidth();
- int maxOffs;
- if ( testTableFlags(Tbl_scrollLastHCell) ) {
- if ( nCols != 1)
- maxOffs = tw - ( cellW ? cellW : cellWidth( nCols - 1 ) );
- else
- maxOffs = tw - viewWidth();
- } else {
- if ( testTableFlags(Tbl_snapToHGrid) ) {
- if ( cellW ) {
- maxOffs = tw - (viewWidth()/cellW)*cellW;
- } else {
- int goal = tw - viewWidth();
- int pos = tw;
- int nextCol = nCols - 1;
- int nextCellWidth = cellWidth( nextCol );
- while( nextCol > 0 && pos > goal + nextCellWidth ) {
- pos -= nextCellWidth;
- nextCellWidth = cellWidth( --nextCol );
- }
- if ( goal + nextCellWidth == pos )
- maxOffs = goal;
- else if ( goal < pos )
- maxOffs = pos;
- else
- maxOffs = 0;
- }
- } else {
- maxOffs = tw - viewWidth();
- }
- }
- return maxOffs > 0 ? maxOffs : 0;
-}
-
-
-/*
- Returns the maximum vertical offset within the table of the
- view's top edge in \e table coordinates.
-
- This is used mainly to set the vertical scroll bar's range.
-
- \sa maxRowOffset(), maxXOffset(), totalHeight()
-*/
-
-int TQtTableView::maxYOffset()
-{
- int th = totalHeight();
- int maxOffs;
- if ( testTableFlags(Tbl_scrollLastVCell) ) {
- if ( nRows != 1)
- maxOffs = th - ( cellH ? cellH : cellHeight( nRows - 1 ) );
- else
- maxOffs = th - viewHeight();
- } else {
- if ( testTableFlags(Tbl_snapToVGrid) ) {
- if ( cellH ) {
- maxOffs = th - (viewHeight()/cellH)*cellH;
- } else {
- int goal = th - viewHeight();
- int pos = th;
- int nextRow = nRows - 1;
- int nextCellHeight = cellHeight( nextRow );
- while( nextRow > 0 && pos > goal + nextCellHeight ) {
- pos -= nextCellHeight;
- nextCellHeight = cellHeight( --nextRow );
- }
- if ( goal + nextCellHeight == pos )
- maxOffs = goal;
- else if ( goal < pos )
- maxOffs = pos;
- else
- maxOffs = 0;
- }
- } else {
- maxOffs = th - viewHeight();
- }
- }
- return maxOffs > 0 ? maxOffs : 0;
-}
-
-
-/*
- Returns the index of the last column, which may be at the left edge
- of the view.
-
- Depending on the \link setTableFlags() Tbl_scrollLastHCell\endlink flag,
- this may or may not be the last column.
-
- \sa maxXOffset(), maxRowOffset()
-*/
-
-int TQtTableView::maxColOffset()
-{
- int mx = maxXOffset();
- if ( cellW )
- return mx/cellW;
- else {
- int xcd=0, col=0;
- while ( col < nCols && mx > (xcd=cellWidth(col)) ) {
- mx -= xcd;
- col++;
- }
- return col;
- }
-}
-
-
-/*
- Returns the index of the last row, which may be at the top edge of
- the view.
-
- Depending on the \link setTableFlags() Tbl_scrollLastVCell\endlink flag,
- this may or may not be the last row.
-
- \sa maxYOffset(), maxColOffset()
-*/
-
-int TQtTableView::maxRowOffset()
-{
- int my = maxYOffset();
- if ( cellH )
- return my/cellH;
- else {
- int ycd=0, row=0;
- while ( row < nRows && my > (ycd=cellHeight(row)) ) {
- my -= ycd;
- row++;
- }
- return row;
- }
-}
-
-
-void TQtTableView::showOrHideScrollBars()
-{
- if ( !autoUpdate() )
- return;
- if ( vScrollBar ) {
- if ( testTableFlags(Tbl_vScrollBar) ) {
- if ( !vScrollBar->isVisible() )
- sbDirty = sbDirty | verMask;
- } else {
- if ( vScrollBar->isVisible() )
- vScrollBar->hide();
- }
- }
- if ( hScrollBar ) {
- if ( testTableFlags(Tbl_hScrollBar) ) {
- if ( !hScrollBar->isVisible() )
- sbDirty = sbDirty | horMask;
- } else {
- if ( hScrollBar->isVisible() )
- hScrollBar->hide();
- }
- }
- if ( cornerSquare ) {
- if ( testTableFlags(Tbl_hScrollBar) &&
- testTableFlags(Tbl_vScrollBar) ) {
- if ( !cornerSquare->isVisible() )
- cornerSquare->show();
- } else {
- if ( cornerSquare->isVisible() )
- cornerSquare->hide();
- }
- }
-}
-
-
-/*
- Updates the scroll bars and internal state.
-
- Call this function when the table view's total size is changed;
- typically because the result of cellHeight() or cellWidth() have changed.
-
- This function does not repaint the widget.
-*/
-
-void TQtTableView::updateTableSize()
-{
- bool updateOn = autoUpdate();
- setAutoUpdate( FALSE );
- int xofs = xOffset();
- xOffs++; //so that setOffset will not return immediately
- setOffset(xofs,yOffset(),FALSE); //to calculate internal state correctly
- setAutoUpdate(updateOn);
-
- updateScrollBars( horSteps | horRange |
- verSteps | verRange );
- showOrHideScrollBars();
-}
-
-
-#endif