diff options
Diffstat (limited to 'tqtinterface/qt4/src/widgets/tqscrollview.cpp')
-rw-r--r-- | tqtinterface/qt4/src/widgets/tqscrollview.cpp | 2854 |
1 files changed, 0 insertions, 2854 deletions
diff --git a/tqtinterface/qt4/src/widgets/tqscrollview.cpp b/tqtinterface/qt4/src/widgets/tqscrollview.cpp deleted file mode 100644 index f2dbfd6..0000000 --- a/tqtinterface/qt4/src/widgets/tqscrollview.cpp +++ /dev/null @@ -1,2854 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQScrollView class -** -** Created : 950524 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the widgets module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqwidget.h" -#ifndef TQT_NO_SCROLLVIEW -#include "tqscrollbar.h" -#include "tqobjectlist.h" -#include "tqpainter.h" -#include "tqpixmap.h" -#include "tqcursor.h" -#include "tqfocusdata.h" -#include "tqscrollview.h" -#include "tqptrdict.h" -#include "tqapplication.h" -#include "tqtimer.h" -#include "tqstyle.h" -#include "tqlistview.h" -#ifdef TQ_WS_MAC -# include "tqt_mac.h" -#endif - -static const int coord_limit = 4000; -static const int autoscroll_margin = 16; -static const int initialScrollTime = 30; -static const int initialScrollAccel = 5; - -struct TQSVChildRec { - TQSVChildRec(TQWidget* c, int xx, int yy) : - child(c), - x(xx), y(yy) - { - } - - void hideOrShow(TQScrollView* sv, TQWidget* clipped_viewport); - void moveTo(TQScrollView* sv, int xx, int yy, TQWidget* clipped_viewport) - { - if ( x != xx || y != yy ) { - x = xx; - y = yy; - hideOrShow(sv,clipped_viewport); - } - } - TQWidget* child; - int x, y; -}; - -void TQSVChildRec::hideOrShow(TQScrollView* sv, TQWidget* clipped_viewport) -{ - if ( clipped_viewport ) { - if ( x+child->width() < sv->contentsX()+clipped_viewport->x() - || x > sv->contentsX()+clipped_viewport->width() - || y+child->height() < sv->contentsY()+clipped_viewport->y() - || y > sv->contentsY()+clipped_viewport->height() ) { - child->move(clipped_viewport->width(), - clipped_viewport->height()); - } else { - child->move(x-sv->contentsX()-clipped_viewport->x(), - y-sv->contentsY()-clipped_viewport->y()); - } - } else { - child->move(x-sv->contentsX(), y-sv->contentsY()); - } -} - -class TQViewportWidget : public TQWidget -{ - TQ_OBJECT - -public: - TQViewportWidget( TQScrollView* parent=0, const char* name=0, WFlags f = 0 ) - : TQWidget( parent, name, f ) {} -}; - -class TQClipperWidget : public TQWidget -{ - TQ_OBJECT - -public: - TQClipperWidget( TQWidget * parent=0, const char * name=0, WFlags f=0 ) - : TQWidget ( parent,name,f) {} -}; - -#include "tqscrollview.tqmoc" - -class TQScrollViewData { -public: - TQScrollViewData(TQScrollView* parent, int vpwflags) : - hbar( new TQScrollBar( Qt::Horizontal, parent, "qt_hbar" ) ), - vbar( new TQScrollBar( Qt::Vertical, parent, "qt_vbar" ) ), - viewport( new TQViewportWidget( parent, "qt_viewport", (WFlags)vpwflags ) ), - clipped_viewport( 0 ), - flags( vpwflags ), - vx( 0 ), vy( 0 ), vwidth( 1 ), vheight( 1 ), -#ifndef TQT_NO_DRAGANDDROP - autoscroll_timer( parent, "scrollview autoscroll timer" ), - drag_autoscroll( TRUE ), -#endif - scrollbar_timer( parent, "scrollview scrollbar timer" ), - inresize( FALSE ), use_cached_size_hint( TRUE ) - { - l_marg = r_marg = t_marg = b_marg = 0; - viewport->polish(); - viewport->setBackgroundMode( TQt::PaletteDark ); - viewport->setBackgroundOrigin( TQWidget::WidgetOrigin ); - vMode = TQScrollView::Auto; - hMode = TQScrollView::Auto; - corner = 0; - defaultCorner = new TQWidget( parent, "qt_default_corner" ); - defaultCorner->hide(); - vbar->setSteps( 20, 1/*set later*/ ); - hbar->setSteps( 20, 1/*set later*/ ); - policy = TQScrollView::Default; - signal_choke = FALSE; - static_bg = FALSE; - fake_scroll = FALSE; - hbarPressed = FALSE; - vbarPressed = FALSE; - } - ~TQScrollViewData(); - - TQSVChildRec* rec(TQWidget* w) { return childDict.find(w); } - TQSVChildRec* ancestorRec(TQWidget* w); - TQSVChildRec* addChildRec(TQWidget* w, int x, int y ) - { - TQSVChildRec *r = new TQSVChildRec(w,x,y); - tqchildren.append(r); - childDict.insert(w, r); - return r; - } - void deleteChildRec(TQSVChildRec* r) - { - childDict.remove(r->child); - tqchildren.removeRef(r); - delete r; - } - - void hideOrShowAll(TQScrollView* sv, bool isScroll = FALSE ); - void moveAllBy(int dx, int dy); - bool anyVisibleChildren(); - void autoMove(TQScrollView* sv); - void autoResize(TQScrollView* sv); - void autoRetqsizeHint(TQScrollView* sv); - void viewportResized( int w, int h ); - - TQScrollBar* hbar; - TQScrollBar* vbar; - bool hbarPressed; - bool vbarPressed; - TQViewportWidget* viewport; - TQClipperWidget* clipped_viewport; - int flags; - TQPtrList<TQSVChildRec> tqchildren; - TQPtrDict<TQSVChildRec> childDict; - TQWidget* corner, *defaultCorner; - int vx, vy, vwidth, vheight; // for drawContents-style usage - int l_marg, r_marg, t_marg, b_marg; - TQScrollView::ResizePolicy policy; - TQScrollView::ScrollBarMode vMode; - TQScrollView::ScrollBarMode hMode; -#ifndef TQT_NO_DRAGANDDROP - TQPoint cpDragStart; - TQTimer autoscroll_timer; - int autoscroll_time; - int autoscroll_accel; - bool drag_autoscroll; -#endif - TQTimer scrollbar_timer; - - uint static_bg : 1; - uint fake_scroll : 1; - - // This variable allows ensureVisible to move the contents then - // update both the sliders. Otherwise, updating the sliders would - // cause two image scrolls, creating ugly flashing. - // - uint signal_choke : 1; - - // This variables indicates in updateScrollBars() that we are - // in a resizeEvent() and thus don't want to flash scrollbars - uint inresize : 1; - uint use_cached_size_hint : 1; - TQSize cachedSizeHint; - - inline int contentsX() const { return -vx; } - inline int contentsY() const { return -vy; } - inline int contentsWidth() const { return vwidth; } -}; - -inline TQScrollViewData::~TQScrollViewData() -{ - tqchildren.setAutoDelete( TRUE ); -} - -TQSVChildRec* TQScrollViewData::ancestorRec(TQWidget* w) -{ - if ( clipped_viewport ) { - while (w->parentWidget() != clipped_viewport) { - w = w->parentWidget(); - if (!w) return 0; - } - } else { - while (w->parentWidget() != viewport) { - w = w->parentWidget(); - if (!w) return 0; - } - } - return rec(w); -} - -void TQScrollViewData::hideOrShowAll(TQScrollView* sv, bool isScroll ) -{ - if ( !clipped_viewport ) - return; - if ( clipped_viewport->x() <= 0 - && clipped_viewport->y() <= 0 - && clipped_viewport->width()+clipped_viewport->x() >= - viewport->width() - && clipped_viewport->height()+clipped_viewport->y() >= - viewport->height() ) { - // clipped_viewport still covers viewport - if( static_bg ) - clipped_viewport->tqrepaint( TRUE ); - else if ( ( !isScroll && !clipped_viewport->testWFlags( TQt::WStaticContents) ) - || static_bg ) - TQApplication::postEvent( clipped_viewport, - new TQPaintEvent( clipped_viewport->clipRegion(), - !clipped_viewport->testWFlags(TQt::WResizeNoErase) ) ); - } else { - // Re-center - int nx = ( viewport->width() - clipped_viewport->width() ) / 2; - int ny = ( viewport->height() - clipped_viewport->height() ) / 2; - clipped_viewport->move(nx,ny); - clipped_viewport->update(); - } - for (TQSVChildRec *r = tqchildren.first(); r; r=tqchildren.next()) { - r->hideOrShow(sv, clipped_viewport); - } -} - -void TQScrollViewData::moveAllBy(int dx, int dy) -{ - if ( clipped_viewport && !static_bg ) { - clipped_viewport->move( clipped_viewport->x()+dx, - clipped_viewport->y()+dy ); - } else { - for (TQSVChildRec *r = tqchildren.first(); r; r=tqchildren.next()) { - r->child->move(r->child->x()+dx,r->child->y()+dy); - } - if ( static_bg ) - viewport->tqrepaint( TRUE ); - } -} - -bool TQScrollViewData::anyVisibleChildren() -{ - for (TQSVChildRec *r = tqchildren.first(); r; r=tqchildren.next()) { - if (r->child->isVisible()) return TRUE; - } - return FALSE; -} - -void TQScrollViewData::autoMove(TQScrollView* sv) -{ - if ( policy == TQScrollView::AutoOne ) { - TQSVChildRec* r = tqchildren.first(); - if (r) - sv->setContentsPos(-r->child->x(),-r->child->y()); - } -} - -void TQScrollViewData::autoResize(TQScrollView* sv) -{ - if ( policy == TQScrollView::AutoOne ) { - TQSVChildRec* r = tqchildren.first(); - if (r) - sv->resizeContents(r->child->width(),r->child->height()); - } -} - -void TQScrollViewData::autoRetqsizeHint(TQScrollView* sv) -{ - if ( policy == TQScrollView::AutoOne ) { - TQSVChildRec* r = tqchildren.first(); - if (r) { - TQSize s = r->child->tqsizeHint(); - if ( s.isValid() ) - r->child->resize(s); - } - } else if ( policy == TQScrollView::AutoOneFit ) { - TQSVChildRec* r = tqchildren.first(); - if (r) { - TQSize sh = r->child->tqsizeHint(); - sh = sh.boundedTo( r->child->tqmaximumSize() ); - sv->resizeContents( sh.width(), sh.height() ); - } - } -} - -void TQScrollViewData::viewportResized( int w, int h ) -{ - if ( policy == TQScrollView::AutoOneFit ) { - TQSVChildRec* r = tqchildren.first(); - if (r) { - TQSize sh = r->child->tqsizeHint(); - sh = sh.boundedTo( r->child->tqmaximumSize() ); - r->child->resize( TQMAX(w,sh.width()), TQMAX(h,sh.height()) ); - } - - } -} - - -/*! - \class TQScrollView tqscrollview.h - \brief The TQScrollView widget provides a scrolling area with on-demand scroll bars. - - \ingroup abstractwidgets - \mainclass - - The TQScrollView is a large canvas - potentially larger than the - coordinate system normally supported by the underlying window - system. This is important because it is quite easy to go beyond - these limitations (e.g. many web pages are more than 32000 pixels - high). Additionally, the TQScrollView can have TQWidgets positioned - on it that scroll around with the drawn content. These sub-widgets - can also have positions outside the normal coordinate range (but - they are still limited in size). - - To provide content for the widget, inherit from TQScrollView, - reimplement drawContents() and use resizeContents() to set the - size of the viewed area. Use addChild() and moveChild() to - position widgets on the view. - - To use TQScrollView effectively it is important to understand its - widget structure in the three styles of use: a single large child - widget, a large panning area with some widgets and a large panning - area with many widgets. - - \section1 Using One Big Widget - - \img qscrollview-vp2.png - - The first, simplest usage of TQScrollView (depicted above), is - appropriate for scrolling areas that are never more than about - 4000 pixels in either dimension (this is about the maximum - reliable size on X11 servers). In this usage, you just make one - large child in the TQScrollView. The child should be a child of the - viewport() of the scrollview and be added with addChild(): - \code - TQScrollView* sv = new TQScrollView(...); - TQVBox* big_box = new TQVBox(sv->viewport()); - sv->addChild(big_box); - \endcode - You can go on to add arbitrary child widgets to the single child - in the scrollview as you would with any widget: - \code - TQLabel* child1 = new TQLabel("CHILD", big_box); - TQLabel* child2 = new TQLabel("CHILD", big_box); - TQLabel* child3 = new TQLabel("CHILD", big_box); - ... - \endcode - - Here the TQScrollView has four tqchildren: the viewport(), the - verticalScrollBar(), the horizontalScrollBar() and a small - cornerWidget(). The viewport() has one child: the big TQVBox. The - TQVBox has the three TQLabel objects as child widgets. When the view - is scrolled, the TQVBox is moved; its tqchildren move with it as - child widgets normally do. - - \section1 Using a Very Big View with Some Widgets - - \img qscrollview-vp.png - - The second usage of TQScrollView (depicted above) is appropriate - when few, if any, widgets are on a very large scrolling area that - is potentially larger than 4000 pixels in either dimension. In - this usage you call resizeContents() to set the size of the area - and reimplement drawContents() to paint the contents. You may also - add some widgets by making them tqchildren of the viewport() and - adding them with addChild() (this is the same as the process for - the single large widget in the previous example): - \code - TQScrollView* sv = new TQScrollView(...); - TQLabel* child1 = new TQLabel("CHILD", sv->viewport()); - sv->addChild(child1); - TQLabel* child2 = new TQLabel("CHILD", sv->viewport()); - sv->addChild(child2); - TQLabel* child3 = new TQLabel("CHILD", sv->viewport()); - sv->addChild(child3); - \endcode - Here, the TQScrollView has the same four tqchildren: the viewport(), - the verticalScrollBar(), the horizontalScrollBar() and a small - cornerWidget(). The viewport() has the three TQLabel objects as - child widgets. When the view is scrolled, the scrollview moves the - child widgets individually. - - \section1 Using a Very Big View with Many Widgets - - \target enableclipper - \img qscrollview-cl.png - - The final usage of TQScrollView (depicted above) is appropriate - when many widgets are on a very large scrolling area that is - potentially larger than 4000 pixels in either dimension. In this - usage you call resizeContents() to set the size of the area and - reimplement drawContents() to paint the contents. You then call - enableClipper(TRUE) and add widgets, again by making them tqchildren - of the viewport(), and adding them with addChild(): - \code - TQScrollView* sv = new TQScrollView(...); - sv->enableClipper(TRUE); - TQLabel* child1 = new TQLabel("CHILD", sv->viewport()); - sv->addChild(child1); - TQLabel* child2 = new TQLabel("CHILD", sv->viewport()); - sv->addChild(child2); - TQLabel* child3 = new TQLabel("CHILD", sv->viewport()); - sv->addChild(child3); - \endcode - - Here, the TQScrollView has four tqchildren: the clipper() (not the - viewport() this time), the verticalScrollBar(), the - horizontalScrollBar() and a small cornerWidget(). The clipper() - has one child: the viewport(). The viewport() has the same three - labels as child widgets. When the view is scrolled the viewport() - is moved; its tqchildren move with it as child widgets normally do. - - \target allviews - \section1 Details Relevant for All Views - - Normally you will use the first or third method if you want any - child widgets in the view. - - Note that the widget you see in the scrolled area is the - viewport() widget, not the TQScrollView itself. So to turn mouse - tracking on, for example, use viewport()->setMouseTracking(TRUE). - - To enable drag-and-drop, you would setAcceptDrops(TRUE) on the - TQScrollView (because drag-and-drop events propagate to the - parent). But to work out the logical position in the view, you - would need to map the drop co-ordinate from being relative to the - TQScrollView to being relative to the contents; use the function - viewportToContents() for this. - - To handle mouse events on the scrolling area, subclass scrollview - as you would subclass other widgets, but rather than - reimplementing mousePressEvent(), reimplement - contentsMousePressEvent() instead. The contents specific event - handlers provide translated events in the coordinate system of the - scrollview. If you reimplement mousePressEvent(), you'll get - called only when part of the TQScrollView is clicked: and the only - such part is the "corner" (if you don't set a cornerWidget()) and - the frame; everything else is covered up by the viewport, clipper - or scroll bars. - - When you construct a TQScrollView, some of the widget flags apply - to the viewport() instead of being sent to the TQWidget constructor - for the TQScrollView. This applies to \c WNoAutoErase, \c - WStaticContents, and \c WPaintClever. See \l TQt::WidgetFlags for - documentation about these flags. Here are some examples: - - \list - - \i An image-manipulation widget would use \c - WNoAutoErase|WStaticContents because the widget draws all pixels - itself, and when its size increases, it only needs a paint event - for the new part because the old part remains unchanged. - - \i A scrolling game widget in which the background scrolls as the - characters move might use \c WNoAutoErase (in addition to \c - WStaticContents) so that the window system background does not - flash in and out during scrolling. - - \i A word processing widget might use \c WNoAutoErase and tqrepaint - itself line by line to get a less-flickery resizing. If the widget - is in a mode in which no text justification can take place, it - might use \c WStaticContents too, so that it would only get a - tqrepaint for the newly visible parts. - - \endlist - - Child widgets may be moved using addChild() or moveChild(). Use - childX() and childY() to get the position of a child widget. - - A widget may be placed in the corner between the vertical and - horizontal scrollbars with setCornerWidget(). You can get access - to the scrollbars using horizontalScrollBar() and - verticalScrollBar(), and to the viewport with viewport(). The - scroll view can be scrolled using scrollBy(), ensureVisible(), - setContentsPos() or center(). - - The visible area is given by visibleWidth() and visibleHeight(), - and the contents area by contentsWidth() and contentsHeight(). The - contents may be repainted using one of the repaintContents() or - updateContents() functions. - - Coordinate conversion is provided by contentsToViewport() and - viewportToContents(). - - The contentsMoving() signal is emitted just before the contents - are moved to a new position. - - \warning TQScrollView currently does not erase the background when - resized, i.e. you must always clear the background manually in - scrollview subclasses. This will change in a future version of TQt - and we recommend specifying the WNoAutoErase flag explicitly. - - <img src=qscrollview-m.png> <img src=qscrollview-w.png> -*/ - - -/*! - \enum TQScrollView::ResizePolicy - - This enum type is used to control a TQScrollView's reaction to - resize events. - - \value Default the TQScrollView selects one of the other settings - automatically when it has to. In this version of TQt, TQScrollView - changes to \c Manual if you resize the contents with - resizeContents() and to \c AutoOne if a child is added. - - \value Manual the contents stays the size set by resizeContents(). - - \value AutoOne if there is only one child widget the contents stays - the size of that widget. Otherwise the behavior is undefined. - - \value AutoOneFit if there is only one child widget the contents stays - the size of that widget's tqsizeHint(). If the scrollview is resized - larger than the child's tqsizeHint(), the child will be resized to - fit. If there is more than one child, the behavior is undefined. - -*/ -//#### The widget will be resized to its tqsizeHint() when a LayoutHint event -//#### is received - -/*! - Constructs a TQScrollView called \a name with parent \a parent and - widget flags \a f. - - The widget flags \c WStaticContents, \c WNoAutoErase and \c - WPaintClever are propagated to the viewport() widget. The other - widget flags are propagated to the parent constructor as usual. -*/ - -TQScrollView::TQScrollView( TQWidget *parent, const char *name, WFlags f ) : - TQFrame( parent, name, f & (~TQt::WStaticContents) & (~TQt::WResizeNoErase) ) -{ - WFlags flags = (WFlags)(TQt::WResizeNoErase | (f&TQt::WPaintClever) | (f&WRepaintNoErase) | (f&TQt::WStaticContents)); - d = new TQScrollViewData( this, flags ); - -#ifndef TQT_NO_DRAGANDDROP - connect( &d->autoscroll_timer, TQT_SIGNAL( timeout() ), - this, TQT_SLOT( doDragAutoScroll() ) ); -#endif - - connect( d->hbar, TQT_SIGNAL( valueChanged(int) ), - this, TQT_SLOT( hslide(int) ) ); - connect( d->vbar, TQT_SIGNAL( valueChanged(int) ), - this, TQT_SLOT( vslide(int) ) ); - - connect( d->hbar, TQT_SIGNAL(sliderPressed()), this, TQT_SLOT(hbarIsPressed()) ); - connect( d->hbar, TQT_SIGNAL(sliderReleased()), this, TQT_SLOT(hbarIsReleased()) ); - connect( d->vbar, TQT_SIGNAL(sliderPressed()), this, TQT_SLOT(vbarIsPressed()) ); - connect( d->vbar, TQT_SIGNAL(sliderReleased()), this, TQT_SLOT(vbarIsReleased()) ); - - - d->viewport->installEventFilter( this ); - - connect( &d->scrollbar_timer, TQT_SIGNAL( timeout() ), - this, TQT_SLOT( updateScrollBars() ) ); - - setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken ); - setLineWidth( tqstyle().tqpixelMetric(TQStyle::PM_DefaultFrameWidth, this) ); - tqsetSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Expanding ) ); -} - - -/*! - Destroys the TQScrollView. Any tqchildren added with addChild() will - be deleted. -*/ -TQScrollView::~TQScrollView() -{ - // Be careful not to get all those useless events... - if ( d->clipped_viewport ) - d->clipped_viewport->removeEventFilter( this ); - else - d->viewport->removeEventFilter( this ); - - // order is important - // ~TQWidget may cause a WM_ERASEBKGND on Windows - delete d->vbar; - d->vbar = 0; - delete d->hbar; - d->hbar = 0; - delete d->viewport; - d->viewport = 0; - delete d; - d = 0; -} - -/*! - \fn void TQScrollView::horizontalSliderPressed() - - This signal is emitted whenever the user presses the horizontal slider. -*/ -/*! - \fn void TQScrollView::horizontalSliderReleased() - - This signal is emitted whenever the user releases the horizontal slider. -*/ -/*! - \fn void TQScrollView::verticalSliderPressed() - - This signal is emitted whenever the user presses the vertical slider. -*/ -/*! - \fn void TQScrollView::verticalSliderReleased() - - This signal is emitted whenever the user releases the vertical slider. -*/ -void TQScrollView::hbarIsPressed() -{ - d->hbarPressed = TRUE; - emit( horizontalSliderPressed() ); -} - -void TQScrollView::hbarIsReleased() -{ - d->hbarPressed = FALSE; - emit( horizontalSliderReleased() ); -} - -/*! - Returns TRUE if horizontal slider is pressed by user; otherwise returns FALSE. -*/ -bool TQScrollView::isHorizontalSliderPressed() -{ - return d->hbarPressed; -} - -void TQScrollView::vbarIsPressed() -{ - d->vbarPressed = TRUE; - emit( verticalSliderPressed() ); -} - -void TQScrollView::vbarIsReleased() -{ - d->vbarPressed = FALSE; - emit( verticalSliderReleased() ); -} - -/*! - Returns TRUE if vertical slider is pressed by user; otherwise returns FALSE. -*/ -bool TQScrollView::isVerticalSliderPressed() -{ - return d->vbarPressed; -} - -/*! - \reimp -*/ -void TQScrollView::styleChange( TQStyle& old ) -{ - TQWidget::styleChange( old ); - updateScrollBars(); - d->cachedSizeHint = TQSize(); -} - -/*! - \reimp -*/ -void TQScrollView::fontChange( const TQFont &old ) -{ - TQWidget::fontChange( old ); - updateScrollBars(); - d->cachedSizeHint = TQSize(); -} - -void TQScrollView::hslide( int pos ) -{ - if ( !d->signal_choke ) { - moveContents( -pos, -d->contentsY() ); - TQApplication::syncX(); - } -} - -void TQScrollView::vslide( int pos ) -{ - if ( !d->signal_choke ) { - moveContents( -d->contentsX(), -pos ); - TQApplication::syncX(); - } -} - -/*! - Called when the horizontal scroll bar tqgeometry changes. This is - provided as a protected function so that subclasses can do - interesting things such as providing extra buttons in some of the - space normally used by the scroll bars. - - The default implementation simply gives all the space to \a hbar. - The new tqgeometry is given by \a x, \a y, \a w and \a h. - - \sa setVBarGeometry() -*/ -void TQScrollView::setHBarGeometry(TQScrollBar& hbar, - int x, int y, int w, int h) -{ - hbar.setGeometry( x, y, w, h ); -} - -/*! - Called when the vertical scroll bar tqgeometry changes. This is - provided as a protected function so that subclasses can do - interesting things such as providing extra buttons in some of the - space normally used by the scroll bars. - - The default implementation simply gives all the space to \a vbar. - The new tqgeometry is given by \a x, \a y, \a w and \a h. - - \sa setHBarGeometry() -*/ -void TQScrollView::setVBarGeometry( TQScrollBar& vbar, - int x, int y, int w, int h) -{ - vbar.setGeometry( x, y, w, h ); -} - - -/*! - Returns the viewport size for size (\a x, \a y). - - The viewport size depends on \a (x, y) (the size of the contents), - the size of this widget and the modes of the horizontal and - vertical scroll bars. - - This function permits widgets that can trade vertical and - horizontal space for each other to control scroll bar appearance - better. For example, a word processor or web browser can control - the width of the right margin accurately, whether or not there - needs to be a vertical scroll bar. -*/ - -TQSize TQScrollView::viewportSize( int x, int y ) const -{ - int fw = frameWidth(); - int lmarg = fw+d->l_marg; - int rmarg = fw+d->r_marg; - int tmarg = fw+d->t_marg; - int bmarg = fw+d->b_marg; - - int w = width(); - int h = height(); - - bool needh, needv; - bool showh, showv; - int hsbExt = horizontalScrollBar()->tqsizeHint().height(); - int vsbExt = verticalScrollBar()->tqsizeHint().width(); - - if ( d->policy != AutoOne || d->anyVisibleChildren() ) { - // Do we definitely need the scrollbar? - needh = w-lmarg-rmarg < x; - needv = h-tmarg-bmarg < y; - - // Do we intend to show the scrollbar? - if (d->hMode == AlwaysOn) - showh = TRUE; - else if (d->hMode == AlwaysOff) - showh = FALSE; - else - showh = needh; - - if (d->vMode == AlwaysOn) - showv = TRUE; - else if (d->vMode == AlwaysOff) - showv = FALSE; - else - showv = needv; - - // Given other scrollbar will be shown, NOW do we need one? - if ( showh && h-vsbExt-tmarg-bmarg < y ) { - if (d->vMode == Auto) - showv=TRUE; - } - if ( showv && w-hsbExt-lmarg-rmarg < x ) { - if (d->hMode == Auto) - showh=TRUE; - } - } else { - // Scrollbars not needed, only show scrollbar that are always on. - showh = d->hMode == AlwaysOn; - showv = d->vMode == AlwaysOn; - } - - return TQSize( w-lmarg-rmarg - (showv ? vsbExt : 0), - h-tmarg-bmarg - (showh ? hsbExt : 0) ); -} - - -/*! - Updates scroll bars: all possibilities are considered. You should - never need to call this in your code. -*/ -void TQScrollView::updateScrollBars() -{ - if(!horizontalScrollBar() && !verticalScrollBar()) - return; - - // I support this should use viewportSize()... but it needs - // so many of the temporary variables from viewportSize. hm. - int fw = frameWidth(); - int lmarg = fw+d->l_marg; - int rmarg = fw+d->r_marg; - int tmarg = fw+d->t_marg; - int bmarg = fw+d->b_marg; - - int w = width(); - int h = height(); - - int portw, porth; - - bool needh; - bool needv; - bool showh; - bool showv; - bool showc = FALSE; - - int hsbExt = horizontalScrollBar()->tqsizeHint().height(); - int vsbExt = verticalScrollBar()->tqsizeHint().width(); - - TQSize oldVisibleSize( visibleWidth(), visibleHeight() ); - - if ( d->policy != AutoOne || d->anyVisibleChildren() ) { - // Do we definitely need the scrollbar? - needh = w-lmarg-rmarg < d->contentsWidth(); - if ( d->inresize ) - needh = !horizontalScrollBar()->isHidden(); - needv = h-tmarg-bmarg < contentsHeight(); - - // Do we intend to show the scrollbar? - if (d->hMode == AlwaysOn) - showh = TRUE; - else if (d->hMode == AlwaysOff) - showh = FALSE; - else - showh = needh; - - if (d->vMode == AlwaysOn) - showv = TRUE; - else if (d->vMode == AlwaysOff) - showv = FALSE; - else - showv = needv; - -#ifdef TQ_WS_MAC - bool mac_need_scroll = FALSE; - if(!parentWidget()) { - mac_need_scroll = TRUE; - } else { - TQWidget *tlw = tqtopLevelWidget(); - TQPoint tlw_br = TQPoint(tlw->width(), tlw->height()), - my_br = posInWindow(this) + TQPoint(w, h); - if(my_br.x() >= tlw_br.x() - 3 && my_br.y() >= tlw_br.y() - 3) - mac_need_scroll = TRUE; - } - if(mac_need_scroll) { - WindowAttributes attr; - GetWindowAttributes((WindowPtr)handle(), &attr); - mac_need_scroll = (attr & kWindowResizableAttribute); - } - if(mac_need_scroll) { - showc = TRUE; - if(d->vMode == Auto) - showv = TRUE; - if(d->hMode == Auto) - showh = TRUE; - } -#endif - - // Given other scrollbar will be shown, NOW do we need one? - if ( showh && h-vsbExt-tmarg-bmarg < contentsHeight() ) { - needv=TRUE; - if (d->vMode == Auto) - showv=TRUE; - } - if ( showv && !d->inresize && w-hsbExt-lmarg-rmarg < d->contentsWidth() ) { - needh=TRUE; - if (d->hMode == Auto) - showh=TRUE; - } - } else { - // Scrollbars not needed, only show scrollbar that are always on. - needh = needv = FALSE; - showh = d->hMode == AlwaysOn; - showv = d->vMode == AlwaysOn; - } - - bool sc = d->signal_choke; - d->signal_choke=TRUE; - - // Hide unneeded scrollbar, calculate viewport size - if ( showh ) { - porth=h-hsbExt-tmarg-bmarg; - } else { - if (!needh) - d->hbar->setValue(0); - d->hbar->hide(); - porth=h-tmarg-bmarg; - } - if ( showv ) { - portw=w-vsbExt-lmarg-rmarg; - } else { - if (!needv) - d->vbar->setValue(0); - d->vbar->hide(); - portw=w-lmarg-rmarg; - } - - // Configure scrollbars that we will show - if ( needv ) { - d->vbar->setRange( 0, contentsHeight()-porth ); - d->vbar->setSteps( TQScrollView::d->vbar->lineStep(), porth ); - } else { - d->vbar->setRange( 0, 0 ); - } - if ( needh ) { - d->hbar->setRange( 0, TQMAX(0, d->contentsWidth()-portw) ); - d->hbar->setSteps( TQScrollView::d->hbar->lineStep(), portw ); - } else { - d->hbar->setRange( 0, 0 ); - } - - // Position the scrollbars, viewport and corner widget. - int bottom; - bool reverse = TQApplication::reverseLayout(); - int xoffset = ( reverse && (showv || cornerWidget() )) ? vsbExt : 0; - int xpos = reverse ? 0 : w - vsbExt; - bool frameContentsOnly = - tqstyle().tqstyleHint(TQStyle::SH_ScrollView_FrameOnlyAroundContents); - - if( ! frameContentsOnly ) { - if ( reverse ) - xpos += fw; - else - xpos -= fw; - } - if ( showh ) { - int right = ( showc || showv || cornerWidget() ) ? w-vsbExt : w; - if ( ! frameContentsOnly ) - setHBarGeometry( *d->hbar, fw + xoffset, h-hsbExt-fw, - right-fw-fw, hsbExt ); - else - setHBarGeometry( *d->hbar, 0 + xoffset, h-hsbExt, right, - hsbExt ); - bottom=h-hsbExt; - } else { - bottom=h; - } - if ( showv ) { - clipper()->setGeometry( lmarg + xoffset, tmarg, - w-vsbExt-lmarg-rmarg, - bottom-tmarg-bmarg ); - d->viewportResized( w-vsbExt-lmarg-rmarg, bottom-tmarg-bmarg ); - if ( ! frameContentsOnly ) - changeFrameRect(TQRect(0, 0, w, h) ); - else - changeFrameRect(TQRect(xoffset, 0, w-vsbExt, bottom)); - if (showc || cornerWidget()) { - if ( ! frameContentsOnly ) - setVBarGeometry( *d->vbar, xpos, - fw, vsbExt, - h-hsbExt-fw-fw ); - else - setVBarGeometry( *d->vbar, xpos, 0, - vsbExt, - h-hsbExt ); - } - else { - if ( ! frameContentsOnly ) - setVBarGeometry( *d->vbar, xpos, - fw, vsbExt, - bottom-fw-fw ); - else - setVBarGeometry( *d->vbar, xpos, 0, - vsbExt, bottom ); - } - } else { - if ( ! frameContentsOnly ) - changeFrameRect(TQRect(0, 0, w, h)); - else - changeFrameRect(TQRect(0, 0, w, bottom)); - clipper()->setGeometry( lmarg, tmarg, - w-lmarg-rmarg, bottom-tmarg-bmarg ); - d->viewportResized( w-lmarg-rmarg, bottom-tmarg-bmarg ); - } - - TQWidget *corner = d->corner; - if ( !d->corner ) - corner = d->defaultCorner; - if ( ! frameContentsOnly ) - corner->setGeometry( xpos, - h-hsbExt-fw, - vsbExt, - hsbExt ); - else - corner->setGeometry( xpos, - h-hsbExt, - vsbExt, - hsbExt ); - - d->signal_choke=sc; - - if ( d->contentsX()+visibleWidth() > d->contentsWidth() ) { - int x; -#if 0 - if ( reverse ) - x =TQMIN(0,d->contentsWidth()-visibleWidth()); - else -#endif - x =TQMAX(0,d->contentsWidth()-visibleWidth()); - d->hbar->setValue(x); - // Do it even if it is recursive - moveContents( -x, -d->contentsY() ); - } - if ( d->contentsY()+visibleHeight() > contentsHeight() ) { - int y=TQMAX(0,contentsHeight()-visibleHeight()); - d->vbar->setValue(y); - // Do it even if it is recursive - moveContents( -d->contentsX(), -y ); - } - - // Finally, show the scroll bars - if ( showh && ( d->hbar->isHidden() || !d->hbar->isVisible() ) ) - d->hbar->show(); - if ( showv && ( d->vbar->isHidden() || !d->vbar->isVisible() ) ) - d->vbar->show(); - - d->signal_choke=TRUE; - d->vbar->setValue( d->contentsY() ); - d->hbar->setValue( d->contentsX() ); - d->signal_choke=FALSE; - - TQSize newVisibleSize( visibleWidth(), visibleHeight() ); - if ( d->clipped_viewport && oldVisibleSize != newVisibleSize ) { - TQResizeEvent e( newVisibleSize, oldVisibleSize ); - viewportResizeEvent( &e ); - } -} - - -/*! - \reimp -*/ -void TQScrollView::show() -{ - if ( isVisible() ) - return; - TQWidget::show(); - updateScrollBars(); - d->hideOrShowAll(this); -} - -/*! - \reimp - */ -void TQScrollView::resize( int w, int h ) -{ - TQWidget::resize( w, h ); -} - -/*! - \reimp -*/ -void TQScrollView::resize( const TQSize& s ) -{ - resize( s.width(), s.height() ); -} - -/*! - \reimp -*/ -void TQScrollView::resizeEvent( TQResizeEvent* event ) -{ - TQFrame::resizeEvent( event ); - -#if 0 - if ( TQApplication::reverseLayout() ) { - d->fake_scroll = TRUE; - scrollBy( -event->size().width() + event->oldSize().width(), 0 ); - d->fake_scroll = FALSE; - } -#endif - - bool inresize = d->inresize; - d->inresize = TRUE; - updateScrollBars(); - d->inresize = inresize; - d->scrollbar_timer.start( 0, TRUE ); - - d->hideOrShowAll(this); -} - - - -/*! - \reimp -*/ -void TQScrollView::mousePressEvent( TQMouseEvent * e) //#### remove for 4.0 -{ - e->ignore(); -} - -/*! - \reimp -*/ -void TQScrollView::mouseReleaseEvent( TQMouseEvent *e ) //#### remove for 4.0 -{ - e->ignore(); -} - - -/*! - \reimp -*/ -void TQScrollView::mouseDoubleClickEvent( TQMouseEvent *e ) //#### remove for 4.0 -{ - e->ignore(); -} - -/*! - \reimp -*/ -void TQScrollView::mouseMoveEvent( TQMouseEvent *e ) //#### remove for 4.0 -{ - e->ignore(); -} - -/*! - \reimp -*/ -#ifndef TQT_NO_WHEELEVENT -void TQScrollView::wheelEvent( TQWheelEvent *e ) -{ - TQWheelEvent ce( viewport()->mapFromGlobal( e->globalPos() ), - e->globalPos(), e->delta(), e->state(), e->orientation()); - viewportWheelEvent(&ce); - if ( !ce.isAccepted() ) { - if ( e->orientation() == Qt::Horizontal && horizontalScrollBar() && horizontalScrollBar()->isEnabled() ) - TQApplication::sendEvent( horizontalScrollBar(), e); - else if (e->orientation() == Qt::Vertical && verticalScrollBar() && verticalScrollBar()->isEnabled() ) - TQApplication::sendEvent( verticalScrollBar(), e); - } else { - e->accept(); - } -} -#endif - -/*! - \reimp -*/ -void TQScrollView::contextMenuEvent( TQContextMenuEvent *e ) -{ - if ( e->reason() != TQContextMenuEvent::Keyboard ) { - e->ignore(); - return; - } - - TQContextMenuEvent ce( e->reason(), viewport()->mapFromGlobal( e->globalPos() ), - e->globalPos(), e->state() ); - viewportContextMenuEvent( &ce ); - if ( ce.isAccepted() ) - e->accept(); - else - e->ignore(); -} - -TQScrollView::ScrollBarMode TQScrollView::vScrollBarMode() const -{ - return d->vMode; -} - - -/*! - \enum TQScrollView::ScrollBarMode - - This enum type describes the various modes of TQScrollView's scroll - bars. - - \value Auto TQScrollView shows a scroll bar when the content is - too large to fit and not otherwise. This is the default. - - \value AlwaysOff TQScrollView never shows a scroll bar. - - \value AlwaysOn TQScrollView always shows a scroll bar. - - (The modes for the horizontal and vertical scroll bars are - independent.) -*/ - - -/*! - \property TQScrollView::vScrollBarMode - \brief the mode for the vertical scroll bar - - The default mode is \c TQScrollView::Auto. - - \sa hScrollBarMode -*/ -void TQScrollView::setVScrollBarMode( ScrollBarMode mode ) -{ - if (d->vMode != mode) { - d->vMode = mode; - updateScrollBars(); - } -} - - -/*! - \property TQScrollView::hScrollBarMode - \brief the mode for the horizontal scroll bar - - The default mode is \c TQScrollView::Auto. - - \sa vScrollBarMode -*/ -TQScrollView::ScrollBarMode TQScrollView::hScrollBarMode() const -{ - return d->hMode; -} - -void TQScrollView::setHScrollBarMode( ScrollBarMode mode ) -{ - if (d->hMode != mode) { - d->hMode = mode; - updateScrollBars(); - } -} - - -/*! - Returns the widget in the corner between the two scroll bars. - - By default, no corner widget is present. -*/ -TQWidget* TQScrollView::cornerWidget() const -{ - return d->corner; -} - -/*! - Sets the widget in the \a corner between the two scroll bars. - - You will probably also want to set at least one of the scroll bar - modes to \c AlwaysOn. - - Passing 0 shows no widget in the corner. - - Any previous \a corner widget is hidden. - - You may call setCornerWidget() with the same widget at different - times. - - All widgets set here will be deleted by the TQScrollView when it is - destroyed unless you separately reparent the widget after setting - some other corner widget (or 0). - - Any \e newly set widget should have no current parent. - - By default, no corner widget is present. - - \sa setVScrollBarMode(), setHScrollBarMode() -*/ -void TQScrollView::setCornerWidget(TQWidget* corner) -{ - TQWidget* oldcorner = d->corner; - if (oldcorner != corner) { - if (oldcorner) oldcorner->hide(); - d->corner = corner; - - if ( corner && corner->parentWidget() != this ) { - // #### No clean way to get current WFlags - corner->reparent( this, (((TQScrollView*)corner))->getWFlags(), - TQPoint(0,0), FALSE ); - } - - updateScrollBars(); - if ( corner ) corner->show(); - } -} - - -void TQScrollView::setResizePolicy( ResizePolicy r ) -{ - d->policy = r; -} - -/*! - \property TQScrollView::resizePolicy - \brief the resize policy - - The default is \c Default. - - \sa ResizePolicy -*/ -TQScrollView::ResizePolicy TQScrollView::resizePolicy() const -{ - return d->policy; -} - -/*! - \reimp -*/ -void TQScrollView::setEnabled( bool enable ) -{ - TQFrame::setEnabled( enable ); -} - -/*! - Removes the \a child widget from the scrolled area. Note that this - happens automatically if the \a child is deleted. -*/ -void TQScrollView::removeChild(TQWidget* child) -{ - if ( !d || !child ) // First check in case we are destructing - return; - - TQSVChildRec *r = d->rec(child); - if ( r ) d->deleteChildRec( r ); -} - -/*! - \reimp -*/ -void TQScrollView::removeChild(TQObject* child) -{ - TQFrame::removeChild(child); -} - -/*! - Inserts the widget, \a child, into the scrolled area positioned at - (\a x, \a y). The position defaults to (0, 0). If the child is - already in the view, it is just moved. - - You may want to call enableClipper(TRUE) if you add a large number - of widgets. -*/ -void TQScrollView::addChild(TQWidget* child, int x, int y) -{ - if ( !child ) { -#if defined(TQT_CHECK_NULL) - qWarning( "TQScrollView::addChild(): Cannot add null child" ); -#endif - return; - } - child->polish(); - child->setBackgroundOrigin(WidgetOrigin); - - if ( child->parentWidget() == viewport() ) { - // May already be there - TQSVChildRec *r = d->rec(child); - if (r) { - r->moveTo(this,x,y,d->clipped_viewport); - if ( d->policy > Manual ) { - d->autoRetqsizeHint(this); - d->autoResize(this); // #### better to just deal with this one widget! - } - return; - } - } - - if ( d->tqchildren.isEmpty() && d->policy != Manual ) { - if ( d->policy == Default ) - setResizePolicy( AutoOne ); - child->installEventFilter( this ); - } else if ( d->policy == AutoOne ) { - child->removeEventFilter( this ); //#### ????? - setResizePolicy( Manual ); - } - if ( child->parentWidget() != viewport() ) { - child->reparent( viewport(), 0, TQPoint(0,0), FALSE ); - } - d->addChildRec(child,x,y)->hideOrShow(this, d->clipped_viewport); - - if ( d->policy > Manual ) { - d->autoRetqsizeHint(this); - d->autoResize(this); // #### better to just deal with this one widget! - } -} - -/*! - Repositions the \a child widget to (\a x, \a y). This function is - the same as addChild(). -*/ -void TQScrollView::moveChild(TQWidget* child, int x, int y) -{ - addChild(child,x,y); -} - -/*! - Returns the X position of the given \a child widget. Use this - rather than TQWidget::x() for widgets added to the view. - - This function returns 0 if \a child has not been added to the view. -*/ -int TQScrollView::childX(TQWidget* child) -{ - TQSVChildRec *r = d->rec(child); - return r ? r->x : 0; -} - -/*! - Returns the Y position of the given \a child widget. Use this - rather than TQWidget::y() for widgets added to the view. - - This function returns 0 if \a child has not been added to the view. -*/ -int TQScrollView::childY(TQWidget* child) -{ - TQSVChildRec *r = d->rec(child); - return r ? r->y : 0; -} - -/*! \fn bool TQScrollView::childIsVisible(TQWidget*) - \obsolete - - Returns TRUE if \a child is visible. This is equivalent - to child->isVisible(). -*/ - -/*! \fn void TQScrollView::showChild(TQWidget* child, bool y) - \obsolete - - Sets the visibility of \a child. Equivalent to - TQWidget::show() or TQWidget::hide(). -*/ - -/*! - This event filter ensures the scroll bars are updated when a - single contents widget is resized, shown, hidden or destroyed; it - passes mouse events to the TQScrollView. The event is in \a e and - the object is in \a obj. -*/ - -bool TQScrollView::eventFilter( TQObject *obj, TQEvent *e ) -{ - if ( !d ) - return FALSE; // we are destructing - if ( TQT_BASE_OBJECT(obj) == TQT_BASE_OBJECT(d->viewport) || TQT_BASE_OBJECT(obj) == TQT_BASE_OBJECT(d->clipped_viewport) ) { - switch ( e->type() ) { - /* Forward many events to viewport...() functions */ - case TQEvent::Paint: - viewportPaintEvent( (TQPaintEvent*)e ); - break; - case TQEvent::Resize: - if ( !d->clipped_viewport ) - viewportResizeEvent( (TQResizeEvent *)e ); - break; - case TQEvent::MouseButtonPress: - viewportMousePressEvent( (TQMouseEvent*)e ); - if ( ((TQMouseEvent*)e)->isAccepted() ) - return TRUE; - break; - case TQEvent::MouseButtonRelease: - viewportMouseReleaseEvent( (TQMouseEvent*)e ); - if ( ((TQMouseEvent*)e)->isAccepted() ) - return TRUE; - break; - case TQEvent::MouseButtonDblClick: - viewportMouseDoubleClickEvent( (TQMouseEvent*)e ); - if ( ((TQMouseEvent*)e)->isAccepted() ) - return TRUE; - break; - case TQEvent::MouseMove: - viewportMouseMoveEvent( (TQMouseEvent*)e ); - if ( ((TQMouseEvent*)e)->isAccepted() ) - return TRUE; - break; -#ifndef TQT_NO_DRAGANDDROP - case TQEvent::DragEnter: - viewportDragEnterEvent( (TQDragEnterEvent*)e ); - break; - case TQEvent::DragMove: { - if ( d->drag_autoscroll ) { - TQPoint vp = ((TQDragMoveEvent*) e)->pos(); - TQRect inside_margin( autoscroll_margin, autoscroll_margin, - visibleWidth() - autoscroll_margin * 2, - visibleHeight() - autoscroll_margin * 2 ); - if ( !inside_margin.contains( vp ) ) { - startDragAutoScroll(); - // Keep sending move events - ( (TQDragMoveEvent*)e )->accept( TQRect(0,0,0,0) ); - } - } - viewportDragMoveEvent( (TQDragMoveEvent*)e ); - } break; - case TQEvent::DragLeave: - stopDragAutoScroll(); - viewportDragLeaveEvent( (TQDragLeaveEvent*)e ); - break; - case TQEvent::Drop: - stopDragAutoScroll(); - viewportDropEvent( (TQDropEvent*)e ); - break; -#endif // TQT_NO_DRAGANDDROP - case TQEvent::ContextMenu: - viewportContextMenuEvent( (TQContextMenuEvent*)e ); - if ( ((TQContextMenuEvent*)e)->isAccepted() ) - return TRUE; - break; - case TQEvent::ChildRemoved: - removeChild((TQWidget*)((TQChildEvent*)e)->child()); - break; - case TQEvent::LayoutHint: - d->autoRetqsizeHint(this); - break; - case TQEvent::WindowActivate: - case TQEvent::WindowDeactivate: - return TRUE; - default: - break; - } - } else if ( d && d->rec((TQWidget*)obj) ) { // must be a child - if ( e->type() == TQEvent::Resize ) - d->autoResize(this); - else if ( e->type() == TQEvent::Move ) - d->autoMove(this); - } - return TQFrame::eventFilter( obj, e ); // always continue with standard event processing -} - -/*! - This event handler is called whenever the TQScrollView receives a - mousePressEvent(): the press position in \a e is translated to be a point - on the contents. -*/ -void TQScrollView::contentsMousePressEvent( TQMouseEvent* e ) -{ - e->ignore(); -} - -/*! - This event handler is called whenever the TQScrollView receives a - mouseReleaseEvent(): the release position in \a e is translated to be a - point on the contents. -*/ -void TQScrollView::contentsMouseReleaseEvent( TQMouseEvent* e ) -{ - e->ignore(); -} - -/*! - This event handler is called whenever the TQScrollView receives a - mouseDoubleClickEvent(): the click position in \a e is translated to be a - point on the contents. - - The default implementation generates a normal mouse press event. -*/ -void TQScrollView::contentsMouseDoubleClickEvent( TQMouseEvent* e ) -{ - contentsMousePressEvent(e); // try mouse press event -} - -/*! - This event handler is called whenever the TQScrollView receives a - mouseMoveEvent(): the mouse position in \a e is translated to be a point - on the contents. -*/ -void TQScrollView::contentsMouseMoveEvent( TQMouseEvent* e ) -{ - e->ignore(); -} - -#ifndef TQT_NO_DRAGANDDROP - -/*! - This event handler is called whenever the TQScrollView receives a - dragEnterEvent(): the drag position is translated to be a point - on the contents. -*/ -void TQScrollView::contentsDragEnterEvent( TQDragEnterEvent * ) -{ -} - -/*! - This event handler is called whenever the TQScrollView receives a - dragMoveEvent(): the drag position is translated to be a point on - the contents. -*/ -void TQScrollView::contentsDragMoveEvent( TQDragMoveEvent * ) -{ -} - -/*! - This event handler is called whenever the TQScrollView receives a - dragLeaveEvent(): the drag position is translated to be a point - on the contents. -*/ -void TQScrollView::contentsDragLeaveEvent( TQDragLeaveEvent * ) -{ -} - -/*! - This event handler is called whenever the TQScrollView receives a - dropEvent(): the drop position is translated to be a point on the - contents. -*/ -void TQScrollView::contentsDropEvent( TQDropEvent * ) -{ -} - -#endif // TQT_NO_DRAGANDDROP - -/*! - This event handler is called whenever the TQScrollView receives a - wheelEvent() in \a{e}: the mouse position is translated to be a - point on the contents. -*/ -#ifndef TQT_NO_WHEELEVENT -void TQScrollView::contentsWheelEvent( TQWheelEvent * e ) -{ - e->ignore(); -} -#endif -/*! - This event handler is called whenever the TQScrollView receives a - contextMenuEvent() in \a{e}: the mouse position is translated to - be a point on the contents. -*/ -void TQScrollView::contentsContextMenuEvent( TQContextMenuEvent *e ) -{ - e->ignore(); -} - -/*! - This is a low-level painting routine that draws the viewport - contents. Reimplement this if drawContents() is too high-level - (for example, if you don't want to open a TQPainter on the - viewport). The paint event is passed in \a pe. -*/ -void TQScrollView::viewportPaintEvent( TQPaintEvent* pe ) -{ - TQWidget* vp = viewport(); - - TQPainter p(vp); - TQRect r = pe->rect(); - - if ( d->clipped_viewport ) { - TQRect rr( - -d->clipped_viewport->x(), -d->clipped_viewport->y(), - d->viewport->width(), d->viewport->height() - ); - r &= rr; - if ( r.isValid() ) { - int ex = r.x() + d->clipped_viewport->x() + d->contentsX(); - int ey = r.y() + d->clipped_viewport->y() + d->contentsY(); - int ew = r.width(); - int eh = r.height(); - drawContentsOffset(&p, - d->contentsX()+d->clipped_viewport->x(), - d->contentsY()+d->clipped_viewport->y(), - ex, ey, ew, eh); - } - } else { - r &= d->viewport->rect(); - int ex = r.x() + d->contentsX(); - int ey = r.y() + d->contentsY(); - int ew = r.width(); - int eh = r.height(); - drawContentsOffset(&p, d->contentsX(), d->contentsY(), ex, ey, ew, eh); - } -} - - -/*! - To provide simple processing of events on the contents, this - function receives all resize events sent to the viewport. - - \sa TQWidget::resizeEvent() -*/ -void TQScrollView::viewportResizeEvent( TQResizeEvent* ) -{ -} - -/*! \internal - - To provide simple processing of events on the contents, this - function receives all mouse press events sent to the viewport, - translates the event and calls contentsMousePressEvent(). - - \sa contentsMousePressEvent(), TQWidget::mousePressEvent() -*/ -void TQScrollView::viewportMousePressEvent( TQMouseEvent* e ) -{ - TQMouseEvent ce(e->type(), viewportToContents(e->pos()), - e->globalPos(), e->button(), e->state()); - contentsMousePressEvent(&ce); - if ( !ce.isAccepted() ) - e->ignore(); -} - -/*!\internal - - To provide simple processing of events on the contents, this function - receives all mouse release events sent to the viewport, translates - the event and calls contentsMouseReleaseEvent(). - - \sa TQWidget::mouseReleaseEvent() -*/ -void TQScrollView::viewportMouseReleaseEvent( TQMouseEvent* e ) -{ - TQMouseEvent ce(e->type(), viewportToContents(e->pos()), - e->globalPos(), e->button(), e->state()); - contentsMouseReleaseEvent(&ce); - if ( !ce.isAccepted() ) - e->ignore(); -} - -/*!\internal - - To provide simple processing of events on the contents, this function - receives all mouse double click events sent to the viewport, - translates the event and calls contentsMouseDoubleClickEvent(). - - \sa TQWidget::mouseDoubleClickEvent() -*/ -void TQScrollView::viewportMouseDoubleClickEvent( TQMouseEvent* e ) -{ - TQMouseEvent ce(e->type(), viewportToContents(e->pos()), - e->globalPos(), e->button(), e->state()); - contentsMouseDoubleClickEvent(&ce); - if ( !ce.isAccepted() ) - e->ignore(); -} - -/*!\internal - - To provide simple processing of events on the contents, this function - receives all mouse move events sent to the viewport, translates the - event and calls contentsMouseMoveEvent(). - - \sa TQWidget::mouseMoveEvent() -*/ -void TQScrollView::viewportMouseMoveEvent( TQMouseEvent* e ) -{ - TQMouseEvent ce(e->type(), viewportToContents(e->pos()), - e->globalPos(), e->button(), e->state()); - contentsMouseMoveEvent(&ce); - if ( !ce.isAccepted() ) - e->ignore(); -} - -#ifndef TQT_NO_DRAGANDDROP - -/*!\internal - - To provide simple processing of events on the contents, this function - receives all drag enter events sent to the viewport, translates the - event and calls contentsDragEnterEvent(). - - \sa TQWidget::dragEnterEvent() -*/ -void TQScrollView::viewportDragEnterEvent( TQDragEnterEvent* e ) -{ - e->setPoint(viewportToContents(e->pos())); - contentsDragEnterEvent(e); - e->setPoint(contentsToViewport(e->pos())); -} - -/*!\internal - - To provide simple processing of events on the contents, this function - receives all drag move events sent to the viewport, translates the - event and calls contentsDragMoveEvent(). - - \sa TQWidget::dragMoveEvent() -*/ -void TQScrollView::viewportDragMoveEvent( TQDragMoveEvent* e ) -{ - e->setPoint(viewportToContents(e->pos())); - contentsDragMoveEvent(e); - e->setPoint(contentsToViewport(e->pos())); -} - -/*!\internal - - To provide simple processing of events on the contents, this function - receives all drag leave events sent to the viewport and calls - contentsDragLeaveEvent(). - - \sa TQWidget::dragLeaveEvent() -*/ -void TQScrollView::viewportDragLeaveEvent( TQDragLeaveEvent* e ) -{ - contentsDragLeaveEvent(e); -} - -/*!\internal - - To provide simple processing of events on the contents, this function - receives all drop events sent to the viewport, translates the event - and calls contentsDropEvent(). - - \sa TQWidget::dropEvent() -*/ -void TQScrollView::viewportDropEvent( TQDropEvent* e ) -{ - e->setPoint(viewportToContents(e->pos())); - contentsDropEvent(e); - e->setPoint(contentsToViewport(e->pos())); -} - -#endif // TQT_NO_DRAGANDDROP - -/*!\internal - - To provide simple processing of events on the contents, this function - receives all wheel events sent to the viewport, translates the - event and calls contentsWheelEvent(). - - \sa TQWidget::wheelEvent() -*/ -#ifndef TQT_NO_WHEELEVENT -void TQScrollView::viewportWheelEvent( TQWheelEvent* e ) -{ - /* - Different than standard mouse events, because wheel events might - be sent to the focus widget if the widget-under-mouse doesn't want - the event itself. - */ - TQWheelEvent ce( viewportToContents(e->pos()), - e->globalPos(), e->delta(), e->state(), e->orientation()); - contentsWheelEvent(&ce); - if ( ce.isAccepted() ) - e->accept(); - else - e->ignore(); -} -#endif - -/*! \internal - - To provide simple processing of events on the contents, this function - receives all context menu events sent to the viewport, translates the - event and calls contentsContextMenuEvent(). -*/ -void TQScrollView::viewportContextMenuEvent( TQContextMenuEvent *e ) -{ - TQContextMenuEvent ce(e->reason(), viewportToContents(e->pos()), e->globalPos(), e->state() ); - contentsContextMenuEvent( &ce ); - if ( ce.isAccepted() ) - e->accept(); - else - e->ignore(); -} - -/*! - Returns the component horizontal scroll bar. It is made available - to allow accelerators, autoscrolling, etc. - - It should not be used for other purposes. - - This function never returns 0. -*/ -TQScrollBar* TQScrollView::horizontalScrollBar() const -{ - return d->hbar; -} - -/*! - Returns the component vertical scroll bar. It is made available to - allow accelerators, autoscrolling, etc. - - It should not be used for other purposes. - - This function never returns 0. -*/ -TQScrollBar* TQScrollView::verticalScrollBar() const { - return d->vbar; -} - - -/*! - Scrolls the content so that the point \a (x, y) is visible with at - least 50-pixel margins (if possible, otherwise centered). -*/ -void TQScrollView::ensureVisible( int x, int y ) -{ - ensureVisible(x, y, 50, 50); -} - -/*! - \overload - - Scrolls the content so that the point \a (x, y) is visible with at - least the \a xmargin and \a ymargin margins (if possible, - otherwise centered). -*/ -void TQScrollView::ensureVisible( int x, int y, int xmargin, int ymargin ) -{ - int pw=visibleWidth(); - int ph=visibleHeight(); - - int cx=-d->contentsX(); - int cy=-d->contentsY(); - int cw=d->contentsWidth(); - int ch=contentsHeight(); - - if ( pw < xmargin*2 ) - xmargin=pw/2; - if ( ph < ymargin*2 ) - ymargin=ph/2; - - if ( cw <= pw ) { - xmargin=0; - cx=0; - } - if ( ch <= ph ) { - ymargin=0; - cy=0; - } - - if ( x < -cx+xmargin ) - cx = -x+xmargin; - else if ( x >= -cx+pw-xmargin ) - cx = -x+pw-xmargin; - - if ( y < -cy+ymargin ) - cy = -y+ymargin; - else if ( y >= -cy+ph-ymargin ) - cy = -y+ph-ymargin; - - if ( cx > 0 ) - cx=0; - else if ( cx < pw-cw && cw>pw ) - cx=pw-cw; - - if ( cy > 0 ) - cy=0; - else if ( cy < ph-ch && ch>ph ) - cy=ph-ch; - - setContentsPos( -cx, -cy ); -} - -/*! - Scrolls the content so that the point \a (x, y) is in the top-left - corner. -*/ -void TQScrollView::setContentsPos( int x, int y ) -{ -#if 0 - // bounds checking... - if ( TQApplication::reverseLayout() ) - if ( x > d->contentsWidth() - visibleWidth() ) x = d->contentsWidth() - visibleWidth(); - else -#endif - if ( x < 0 ) x = 0; - if ( y < 0 ) y = 0; - // Choke signal handling while we update BOTH sliders. - d->signal_choke=TRUE; - moveContents( -x, -y ); - d->vbar->setValue( y ); - d->hbar->setValue( x ); - d->signal_choke=FALSE; -} - -/*! - Scrolls the content by \a dx to the left and \a dy upwards. -*/ -void TQScrollView::scrollBy( int dx, int dy ) -{ - setContentsPos( TQMAX( d->contentsX()+dx, 0 ), TQMAX( d->contentsY()+dy, 0 ) ); -} - -/*! - Scrolls the content so that the point \a (x, y) is in the center - of visible area. -*/ -void TQScrollView::center( int x, int y ) -{ - ensureVisible( x, y, 32000, 32000 ); -} - -/*! - \overload - - Scrolls the content so that the point \a (x, y) is visible with - the \a xmargin and \a ymargin margins (as fractions of visible - the area). - - For example: - \list - \i Margin 0.0 allows (x, y) to be on the edge of the visible area. - \i Margin 0.5 ensures that (x, y) is in middle 50% of the visible area. - \i Margin 1.0 ensures that (x, y) is in the center of the the visible area. - \endlist -*/ -void TQScrollView::center( int x, int y, float xmargin, float ymargin ) -{ - int pw=visibleWidth(); - int ph=visibleHeight(); - ensureVisible( x, y, int( xmargin/2.0*pw+0.5 ), int( ymargin/2.0*ph+0.5 ) ); -} - - -/*! - \fn void TQScrollView::contentsMoving(int x, int y) - - This signal is emitted just before the contents are moved to - position \a (x, y). - - \sa contentsX(), contentsY() -*/ - -/*! - Moves the contents by \a (x, y). -*/ -void TQScrollView::moveContents(int x, int y) -{ - if ( -x+visibleWidth() > d->contentsWidth() ) -#if 0 - if( TQApplication::reverseLayout() ) - x=TQMAX(0,-d->contentsWidth()+visibleWidth()); - else -#endif - x=TQMIN(0,-d->contentsWidth()+visibleWidth()); - if ( -y+visibleHeight() > contentsHeight() ) - y=TQMIN(0,-contentsHeight()+visibleHeight()); - - int dx = x - d->vx; - int dy = y - d->vy; - - if (!dx && !dy) - return; // Nothing to do - - emit contentsMoving( -x, -y ); - - d->vx = x; - d->vy = y; - - if ( d->clipped_viewport || d->static_bg ) { - // Cheap move (usually) - d->moveAllBy(dx,dy); - } else if ( /*dx && dy ||*/ - ( TQABS(dy) * 5 > visibleHeight() * 4 ) || - ( TQABS(dx) * 5 > visibleWidth() * 4 ) - ) - { - // Big move - if ( viewport()->isUpdatesEnabled() ) - viewport()->update(); - d->moveAllBy(dx,dy); - } else if ( !d->fake_scroll || d->contentsWidth() > visibleWidth() ) { - // Small move - clipper()->scroll(dx,dy); - } - d->hideOrShowAll(this, TRUE ); -} - -#if (TQT_VERSION-0 >= 0x040000) -#if defined(TQ_CC_GNU) -#warning "Should rename contents{X,Y,Width,Height} to viewport{...}" -#endif -// Because it's the viewport rectangle that is "moving", not the contents. -#endif - -/*! - \property TQScrollView::contentsX - \brief the X coordinate of the contents that are at the left edge of - the viewport. -*/ -int TQScrollView::contentsX() const -{ - return d->contentsX(); -} - -/*! - \property TQScrollView::contentsY - \brief the Y coordinate of the contents that are at the top edge of - the viewport. -*/ -int TQScrollView::contentsY() const -{ - return d->contentsY(); -} - -/*! - \property TQScrollView::contentsWidth - \brief the width of the contents area -*/ -int TQScrollView::contentsWidth() const -{ - return d->contentsWidth(); -} - -/*! - \property TQScrollView::contentsHeight - \brief the height of the contents area -*/ -int TQScrollView::contentsHeight() const -{ - return d->vheight; -} - -/*! - Sets the size of the contents area to \a w pixels wide and \a h - pixels high and updates the viewport accordingly. -*/ -void TQScrollView::resizeContents( int w, int h ) -{ - int ow = d->vwidth; - int oh = d->vheight; - d->vwidth = w; - d->vheight = h; - - d->scrollbar_timer.start( 0, TRUE ); - - if ( d->tqchildren.isEmpty() && d->policy == Default ) - setResizePolicy( Manual ); - - if ( ow > w ) { - // Swap - int t=w; - w=ow; - ow=t; - } - // Refresh area ow..w - if ( ow < visibleWidth() && w >= 0 ) { - if ( ow < 0 ) - ow = 0; - if ( w > visibleWidth() ) - w = visibleWidth(); - clipper()->update( d->contentsX()+ow, 0, w-ow, visibleHeight() ); - } - - if ( oh > h ) { - // Swap - int t=h; - h=oh; - oh=t; - } - // Refresh area oh..h - if ( oh < visibleHeight() && h >= 0 ) { - if ( oh < 0 ) - oh = 0; - if ( h > visibleHeight() ) - h = visibleHeight(); - clipper()->update( 0, d->contentsY()+oh, visibleWidth(), h-oh); - } -} - -/*! - Calls update() on a rectangle defined by \a x, \a y, \a w, \a h, - translated appropriately. If the rectangle is not visible, nothing - is repainted. - - \sa repaintContents() -*/ -void TQScrollView::updateContents( int x, int y, int w, int h ) -{ - if ( testWState((TQt::WidgetState)(TQt::WState_Visible|TQt::WState_BlockUpdates)) != TQt::WState_Visible ) - return; - - TQWidget* vp = viewport(); - - // Translate - x -= d->contentsX(); - y -= d->contentsY(); - - // Clip to TQCOORD space - if ( x < 0 ) { - w += x; - x = 0; - } - if ( y < 0 ) { - h += y; - y = 0; - } - - if ( w < 0 || h < 0 ) - return; - if ( x > visibleWidth() || y > visibleHeight() ) - return; - - if ( w > visibleWidth() ) - w = visibleWidth(); - if ( h > visibleHeight() ) - h = visibleHeight(); - - if ( d->clipped_viewport ) { - // Translate clipper() to viewport() - x -= d->clipped_viewport->x(); - y -= d->clipped_viewport->y(); - } - - vp->update( x, y, w, h ); -} - -/*! - \overload - - Updates the contents in rectangle \a r -*/ -void TQScrollView::updateContents( const TQRect& r ) -{ - updateContents(r.x(), r.y(), r.width(), r.height()); -} - -/*! - \overload -*/ -void TQScrollView::updateContents() -{ - updateContents( d->contentsX(), d->contentsY(), visibleWidth(), visibleHeight() ); -} - -/*! - \overload - - Repaints the contents of rectangle \a r. If \a erase is TRUE the - background is cleared using the background color. -*/ -void TQScrollView::repaintContents( const TQRect& r, bool erase ) -{ - repaintContents(r.x(), r.y(), r.width(), r.height(), erase); -} - - -/*! - \overload - - Repaints the contents. If \a erase is TRUE the background is - cleared using the background color. -*/ -void TQScrollView::repaintContents( bool erase ) -{ - repaintContents( d->contentsX(), d->contentsY(), visibleWidth(), visibleHeight(), erase ); -} - - -/*! - Calls tqrepaint() on a rectangle defined by \a x, \a y, \a w, \a h, - translated appropriately. If the rectangle is not visible, nothing - is repainted. If \a erase is TRUE the background is cleared using - the background color. - - \sa updateContents() -*/ -void TQScrollView::repaintContents( int x, int y, int w, int h, bool erase ) -{ - if ( testWState((TQt::WidgetState)(TQt::WState_Visible|TQt::WState_BlockUpdates)) != TQt::WState_Visible ) - return; - - TQWidget* vp = viewport(); - - // Translate logical to clipper() - x -= d->contentsX(); - y -= d->contentsY(); - - // Clip to TQCOORD space - if ( x < 0 ) { - w += x; - x = 0; - } - if ( y < 0 ) { - h += y; - y = 0; - } - - if ( w < 0 || h < 0 ) - return; - if ( w > visibleWidth() ) - w = visibleWidth(); - if ( h > visibleHeight() ) - h = visibleHeight(); - - if ( d->clipped_viewport ) { - // Translate clipper() to viewport() - x -= d->clipped_viewport->x(); - y -= d->clipped_viewport->y(); - } - - vp->tqrepaint( x, y, w, h, erase ); -} - - -/*! - For backward-compatibility only. It is easier to use - drawContents(TQPainter*,int,int,int,int). - - The default implementation translates the painter appropriately - and calls drawContents(TQPainter*,int,int,int,int). See - drawContents() for an explanation of the parameters \a p, \a - offsetx, \a offsety, \a clipx, \a clipy, \a clipw and \a cliph. -*/ -void TQScrollView::drawContentsOffset(TQPainter* p, int offsetx, int offsety, int clipx, int clipy, int clipw, int cliph) -{ - p->translate(-offsetx,-offsety); - drawContents(p, clipx, clipy, clipw, cliph); -} - -/*! - \fn void TQScrollView::drawContents(TQPainter* p, int clipx, int clipy, int clipw, int cliph) - - Reimplement this function if you are viewing a drawing area rather - than a widget. - - The function should draw the rectangle (\a clipx, \a clipy, \a - clipw, \a cliph) of the contents using painter \a p. The clip - rectangle is in the scrollview's coordinates. - - For example: - \code - { - // Fill a 40000 by 50000 rectangle at (100000,150000) - - // Calculate the coordinates... - int x1 = 100000, y1 = 150000; - int x2 = x1+40000-1, y2 = y1+50000-1; - - // Clip the coordinates so X/Windows will not have problems... - if (x1 < clipx) x1=clipx; - if (y1 < clipy) y1=clipy; - if (x2 > clipx+clipw-1) x2=clipx+clipw-1; - if (y2 > clipy+cliph-1) y2=clipy+cliph-1; - - // Paint using the small coordinates... - if ( x2 >= x1 && y2 >= y1 ) - p->fillRect(x1, y1, x2-x1+1, y2-y1+1, red); - } - \endcode - - The clip rectangle and translation of the painter \a p is already - set appropriately. -*/ -void TQScrollView::drawContents(TQPainter*, int, int, int, int) -{ -} - - -/*! - \reimp -*/ -void TQScrollView::frameChanged() -{ - // slight ugle-hack - the listview header needs readjusting when - // changing the frame - if (TQListView *lv = ::tqqt_cast<TQListView *>(this)) - lv->triggerUpdate(); - TQFrame::frameChanged(); - updateScrollBars(); -} - - -/*! - Returns the viewport widget of the scrollview. This is the widget - containing the contents widget or which is the drawing area. -*/ -TQWidget* TQScrollView::viewport() const -{ - if ( d->clipped_viewport ) - return d->clipped_viewport; - return d->viewport; -} - -/*! - Returns the clipper widget. Contents in the scrollview are - ultimately clipped to be inside the clipper widget. - - You should not need to use this function. - - \sa visibleWidth(), visibleHeight() -*/ -TQWidget* TQScrollView::clipper() const -{ - return d->viewport; -} - -/*! - \property TQScrollView::visibleWidth - \brief the horizontal amount of the content that is visible -*/ -int TQScrollView::visibleWidth() const -{ - return clipper()->width(); -} - -/*! - \property TQScrollView::visibleHeight - \brief the vertical amount of the content that is visible -*/ -int TQScrollView::visibleHeight() const -{ - return clipper()->height(); -} - - -void TQScrollView::changeFrameRect(const TQRect& r) -{ - TQRect oldr = frameRect(); - if (oldr != r) { - TQRect cr = contentsRect(); - TQRegion fr( frameRect() ); - fr = fr.subtract( contentsRect() ); - setFrameRect( r ); - if ( isVisible() ) { - cr = cr.intersect( contentsRect() ); - fr = fr.unite( frameRect() ); - fr = fr.subtract( cr ); - if ( !fr.isEmpty() ) - TQApplication::postEvent( this, new TQPaintEvent( fr, FALSE ) ); - } - } -} - - -/*! - Sets the margins around the scrolling area to \a left, \a top, \a - right and \a bottom. This is useful for applications such as - spreadsheets with "locked" rows and columns. The marginal space is - \e inside the frameRect() and is left blank; reimplement - drawFrame() or put widgets in the unused area. - - By default all margins are zero. - - \sa frameChanged() -*/ -void TQScrollView::setMargins(int left, int top, int right, int bottom) -{ - if ( left == d->l_marg && - top == d->t_marg && - right == d->r_marg && - bottom == d->b_marg ) - return; - - d->l_marg = left; - d->t_marg = top; - d->r_marg = right; - d->b_marg = bottom; - updateScrollBars(); -} - - -/*! - Returns the left margin. - - \sa setMargins() -*/ -int TQScrollView::leftMargin() const -{ - return d->l_marg; -} - - -/*! - Returns the top margin. - - \sa setMargins() -*/ -int TQScrollView::topMargin() const -{ - return d->t_marg; -} - - -/*! - Returns the right margin. - - \sa setMargins() -*/ -int TQScrollView::rightMargin() const -{ - return d->r_marg; -} - - -/*! - Returns the bottom margin. - - \sa setMargins() -*/ -int TQScrollView::bottomMargin() const -{ - return d->b_marg; -} - -/*! - \reimp -*/ -bool TQScrollView::focusNextPrevChild( bool next ) -{ - // Makes sure that the new focus widget is on-screen, if - // necessary by scrolling the scroll view. - - // first set things up for the scan - TQFocusData *f = focusData(); - TQWidget *startingPoint = f->home(); - TQWidget *candidate = 0; - TQWidget *w = next ? f->next() : f->prev(); - TQSVChildRec *r; - extern bool qt_tab_all_widgets; - uint focus_flag = qt_tab_all_widgets ? Qt::TabFocus : Qt::StrongFocus; - - // then scan for a possible focus widget candidate - while( !candidate && w != startingPoint ) { - if ( w != startingPoint && - (w->focusPolicy() & focus_flag) == focus_flag - && w->isEnabled() &&!w->focusProxy() && w->isVisible() ) - candidate = w; - w = next ? f->next() : f->prev(); - } - - // if we could not find one, maybe super or parentWidget() can? - if ( !candidate ) - return TQFrame::focusNextPrevChild( next ); - - // we've found one. - r = d->ancestorRec( candidate ); - if ( r && ( r->child == candidate || - candidate->isVisibleTo( r->child ) ) ) { - TQPoint cp = r->child->mapToGlobal(TQPoint(0,0)); - TQPoint cr = candidate->mapToGlobal(TQPoint(0,0)) - cp; - ensureVisible( r->x+cr.x()+candidate->width()/2, - r->y+cr.y()+candidate->height()/2, - candidate->width()/2, - candidate->height()/2 ); - } - - candidate->setFocus(); - return TRUE; -} - - - -/*! - When a large numbers of child widgets are in a scrollview, - especially if they are close together, the scrolling performance - can suffer greatly. If \a y is TRUE the scrollview will use an - extra widget to group child widgets. - - Note that you may only call enableClipper() prior to adding - widgets. - - For a full discussion, see this class's \link #enableclipper - detailed description\endlink. -*/ -void TQScrollView::enableClipper(bool y) -{ - if ( !d->clipped_viewport == !y ) - return; - if ( d->tqchildren.count() ) - qFatal("May only call TQScrollView::enableClipper() before adding widgets"); - if ( y ) { - d->clipped_viewport = new TQClipperWidget(clipper(), "qt_clipped_viewport", (WFlags)d->flags); - d->clipped_viewport->setGeometry(-coord_limit/2,-coord_limit/2, - coord_limit,coord_limit); - d->clipped_viewport->setBackgroundMode( d->viewport->backgroundMode() ); - d->viewport->setBackgroundMode(TQt::NoBackground); // no exposures for this - d->viewport->removeEventFilter( this ); - d->clipped_viewport->installEventFilter( this ); - d->clipped_viewport->show(); - } else { - delete d->clipped_viewport; - d->clipped_viewport = 0; - } -} - -/*! - Sets the scrollview to have a static background if \a y is TRUE, - or a scrolling background if \a y is FALSE. By default, the - background is scrolling. - - Be aware that this mode is quite slow, as a full tqrepaint of the - visible area has to be triggered on every contents move. - - \sa hasStaticBackground() -*/ -void TQScrollView::setStaticBackground(bool y) -{ - d->static_bg = y; -} - -/*! - Returns TRUE if TQScrollView uses a static background; otherwise - returns FALSE. - - \sa setStaticBackground() -*/ -bool TQScrollView::hasStaticBackground() const -{ - return d->static_bg; -} - -/*! - \overload - - Returns the point \a p translated to a point on the viewport() - widget. -*/ -TQPoint TQScrollView::contentsToViewport( const TQPoint& p ) const -{ - if ( d->clipped_viewport ) { - return TQPoint( p.x() - d->contentsX() - d->clipped_viewport->x(), - p.y() - d->contentsY() - d->clipped_viewport->y() ); - } else { - return TQPoint( p.x() - d->contentsX(), - p.y() - d->contentsY() ); - } -} - -/*! - \overload - - Returns the point on the viewport \a vp translated to a point in - the contents. -*/ -TQPoint TQScrollView::viewportToContents( const TQPoint& vp ) const -{ - if ( d->clipped_viewport ) { - return TQPoint( vp.x() + d->contentsX() + d->clipped_viewport->x(), - vp.y() + d->contentsY() + d->clipped_viewport->y() ); - } else { - return TQPoint( vp.x() + d->contentsX(), - vp.y() + d->contentsY() ); - } -} - - -/*! - Translates a point (\a x, \a y) in the contents to a point (\a vx, - \a vy) on the viewport() widget. -*/ -void TQScrollView::contentsToViewport( int x, int y, int& vx, int& vy ) const -{ - const TQPoint v = contentsToViewport(TQPoint(x,y)); - vx = v.x(); - vy = v.y(); -} - -/*! - Translates a point (\a vx, \a vy) on the viewport() widget to a - point (\a x, \a y) in the contents. -*/ -void TQScrollView::viewportToContents( int vx, int vy, int& x, int& y ) const -{ - const TQPoint c = viewportToContents(TQPoint(vx,vy)); - x = c.x(); - y = c.y(); -} - -/*! - \reimp -*/ -TQSize TQScrollView::tqsizeHint() const -{ - if ( d->use_cached_size_hint && d->cachedSizeHint.isValid() ) - return d->cachedSizeHint; - - constPolish(); - int f = 2 * frameWidth(); - int h = fontMetrics().height(); - TQSize sz( f, f ); - if ( d->policy > Manual ) { - TQSVChildRec *r = d->tqchildren.first(); - if ( r ) { - TQSize cs = r->child->tqsizeHint(); - if ( cs.isValid() ) - sz += cs.boundedTo( r->child->tqmaximumSize() ); - else - sz += r->child->size(); - } - } else { - sz += TQSize( d->contentsWidth(), contentsHeight() ); - } - if (d->vMode == AlwaysOn) - sz.setWidth(sz.width() + d->vbar->tqsizeHint().width()); - if (d->hMode == AlwaysOn) - sz.setHeight(sz.height() + d->hbar->tqsizeHint().height()); - return sz.expandedTo( TQSize(12 * h, 8 * h) ) - .boundedTo( TQSize(36 * h, 24 * h) ); -} - - -/*! - \reimp -*/ -TQSize TQScrollView::tqminimumSizeHint() const -{ - int h = fontMetrics().height(); - if ( h < 10 ) - h = 10; - int f = 2 * frameWidth(); - return TQSize( (6 * h) + f, (4 * h) + f ); -} - - -/*! - \reimp - - (Implemented to get rid of a compiler warning.) -*/ -void TQScrollView::drawContents( TQPainter * ) -{ -} - -#ifndef TQT_NO_DRAGANDDROP - -/*! - \internal -*/ -void TQScrollView::startDragAutoScroll() -{ - if ( !d->autoscroll_timer.isActive() ) { - d->autoscroll_time = initialScrollTime; - d->autoscroll_accel = initialScrollAccel; - d->autoscroll_timer.start( d->autoscroll_time ); - } -} - - -/*! - \internal -*/ -void TQScrollView::stopDragAutoScroll() -{ - d->autoscroll_timer.stop(); -} - - -/*! - \internal -*/ -void TQScrollView::doDragAutoScroll() -{ - TQPoint p = d->viewport->mapFromGlobal( TQCursor::pos() ); - - if ( d->autoscroll_accel-- <= 0 && d->autoscroll_time ) { - d->autoscroll_accel = initialScrollAccel; - d->autoscroll_time--; - d->autoscroll_timer.start( d->autoscroll_time ); - } - int l = TQMAX( 1, ( initialScrollTime- d->autoscroll_time ) ); - - int dx = 0, dy = 0; - if ( p.y() < autoscroll_margin ) { - dy = -l; - } else if ( p.y() > visibleHeight() - autoscroll_margin ) { - dy = +l; - } - if ( p.x() < autoscroll_margin ) { - dx = -l; - } else if ( p.x() > visibleWidth() - autoscroll_margin ) { - dx = +l; - } - if ( dx || dy ) { - scrollBy(dx,dy); - } else { - stopDragAutoScroll(); - } -} - - -/*! - \property TQScrollView::dragAutoScroll - \brief whether autoscrolling in drag move events is enabled - - If this property is set to TRUE (the default), the TQScrollView - automatically scrolls the contents in drag move events if the user - moves the cursor close to a border of the view. Of course this - works only if the viewport accepts drops. Specifying FALSE - disables this autoscroll feature. - - \warning Enabling this property might not be enough to - effectively turn on autoscrolling. If you put a custom widget in - the TQScrollView, you might need to call TQDragEvent::ignore() on - the event in the dragEnterEvent() and dragMoveEvent() - reimplementations. -*/ - -void TQScrollView::setDragAutoScroll( bool b ) -{ - d->drag_autoscroll = b; -} - -bool TQScrollView::dragAutoScroll() const -{ - return d->drag_autoscroll; -} - -#endif // TQT_NO_DRAGANDDROP - -/*!\internal - */ -void TQScrollView::setCachedSizeHint( const TQSize &sh ) const -{ - if ( isVisible() && !d->cachedSizeHint.isValid() ) - d->cachedSizeHint = sh; -} - -/*!\internal - */ -void TQScrollView::disableSizeHintCaching() -{ - d->use_cached_size_hint = FALSE; -} - -/*!\internal - */ -TQSize TQScrollView::cachedSizeHint() const -{ - return d->use_cached_size_hint ? d->cachedSizeHint : TQSize(); -} - -#endif // TQT_NO_SCROLLVIEW |