diff options
Diffstat (limited to 'tqtinterface/qt4/src/widgets/tqwhatsthis.cpp')
-rw-r--r-- | tqtinterface/qt4/src/widgets/tqwhatsthis.cpp | 1004 |
1 files changed, 0 insertions, 1004 deletions
diff --git a/tqtinterface/qt4/src/widgets/tqwhatsthis.cpp b/tqtinterface/qt4/src/widgets/tqwhatsthis.cpp deleted file mode 100644 index a3275b2..0000000 --- a/tqtinterface/qt4/src/widgets/tqwhatsthis.cpp +++ /dev/null @@ -1,1004 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQWhatsThis class -** -** 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 "tqwhatsthis.h" -#ifndef TQT_NO_WHATSTHIS -#include "tqapplication.h" -#include "tqpaintdevicemetrics.h" -#include "tqpixmap.h" -#include "tqpainter.h" -#include "tqtimer.h" -#include "tqptrdict.h" -#include "tqtoolbutton.h" -#include "tqshared.h" -#include "tqcursor.h" -#include "tqbitmap.h" -#include "tqtooltip.h" -#include "tqsimplerichtext.h" -#include "tqstylesheet.h" -#if defined(TQT_ACCESSIBILITY_SUPPORT) -#include "tqaccessible.h" -#endif -#if defined(TQ_WS_WIN) -#include "tqt_windows.h" -#ifndef SPI_GETDROPSHADOW -#define SPI_GETDROPSHADOW 0x1024 -#endif -#endif - -/*! - \class TQWhatsThis tqwhatsthis.h - \brief The TQWhatsThis class provides a simple description of any - widget, i.e. answering the question "What's this?". - - \ingroup helpsystem - \mainclass - - "What's this?" help is part of an application's online help system - that provides users with information about functionality, usage, - background etc., in various levels of detail from short tool tips - to full text browsing help windows. - - TQWhatsThis provides a single window with an explanatory text that - pops up when the user asks "What's this?". The default way to do - this is to focus the relevant widget and press Shift+F1. The help - text appears immediately; it goes away as soon as the user does - something else. - - (Note that if there is an accelerator for Shift+F1, this mechanism - will not work.) - - To add "What's this?" text to a widget you simply call - TQWhatsThis::add() for the widget. For example, to assign text to a - menu item, call TQMenuData::setWhatsThis(); for a global - accelerator key, call TQAccel::setWhatsThis() and If you're using - actions, use TQAction::setWhatsThis(). - - The text can be either rich text or plain text. If you specify a - rich text formatted string, it will be rendered using the default - stylesheet. This makes it possible to embed images. See - TQStyleSheet::defaultSheet() for details. - - \quotefile action/application.cpp - \skipto fileOpenText - \printuntil setWhatsThis - - An alternative way to enter "What's this?" mode is to use the - ready-made tool bar tool button from - TQWhatsThis::whatsThisButton(). By invoking this context help - button (in the picture below the first one from the right) the - user switches into "What's this?" mode. If they now click on a - widget the appropriate help text is shown. The mode is left when - help is given or when the user presses Esc. - - \img whatsthis.png - - If you are using TQMainWindow you can also use the - TQMainWindow::whatsThis() slot to invoke the mode from a menu item. - - For more control you can create a dedicated TQWhatsThis object for - a special widget. By subclassing and reimplementing - TQWhatsThis::text() it is possible to have different help texts, - depending on the position of the mouse click. By reimplementing - TQWhatsThis::clicked() it is possible to have hyperlinks inside the - help texts. - - If you wish to control the "What's this?" behavior of a widget - manually see TQWidget::customWhatsThis(). - - The What's This object can be removed using TQWhatsThis::remove(), - although this is rarely necessary because it is automatically - removed when the widget is destroyed. - - \sa TQToolTip -*/ - -// a special button -class TQWhatsThisButton: public TQToolButton -{ - Q_OBJECT - TQ_OBJECT - -public: - TQWhatsThisButton( TQWidget * parent, const char * name ); - ~TQWhatsThisButton(); - -public Q_SLOTS: - void mouseReleased(); - -}; - - -class TQWhatsThat : public TQWidget -{ - Q_OBJECT - TQ_OBJECT -public: - TQWhatsThat( TQWidget* w, const TQString& txt, TQWidget* parent, const char* name ); - ~TQWhatsThat() ; - -public Q_SLOTS: - void hide(); - inline void widgetDestroyed() { widget = 0; } - -protected: - void mousePressEvent( TQMouseEvent* ); - void mouseReleaseEvent( TQMouseEvent* ); - void mouseMoveEvent( TQMouseEvent* ); - void keyPressEvent( TQKeyEvent* ); - void paintEvent( TQPaintEvent* ); - -private: - TQString text; -#ifndef TQT_NO_RICHTEXT - TQSimpleRichText* doc; -#endif - TQString anchor; - bool pressed; - TQWidget* widget; -}; - - -class TQWhatsThisPrivate: public TQObject -{ - Q_OBJECT - TQ_OBJECT -public: - - // an item for storing texts - struct WhatsThisItem: public TQShared - { - WhatsThisItem(): TQShared() { whatsthis = 0; } - ~WhatsThisItem(); - TQString s; - TQWhatsThis* whatsthis; - }; - - // the (these days pretty small) state machine - enum State { Inactive, Waiting }; - - TQWhatsThisPrivate(); - ~TQWhatsThisPrivate(); - - bool eventFilter( TQObject *, TQEvent * ); - - WhatsThisItem* newItem( TQWidget * widget ); - void add( TQWidget * widget, TQWhatsThis* special ); - void add( TQWidget * widget, const TQString& text ); - - // say it. - void say( TQWidget *, const TQString&, const TQPoint& ); - - // setup and teardown - static void setUpWhatsThis(); - - void enterWhatsThisMode(); - void leaveWhatsThisMode(); - - // variables - TQWhatsThat * whatsThat; - TQPtrDict<WhatsThisItem> * dict; - TQPtrDict<TQWidget> * tlw; - TQPtrDict<TQWhatsThisButton> * buttons; - State state; - -private Q_SLOTS: - void cleanupWidget() - { - const TQObject* o = TQT_TQOBJECT(sender()); - if ( o->isWidgetType() ) // sanity - TQWhatsThis::remove((TQWidget*)o); - } - -}; - -// static, but static the less-typing way -static TQWhatsThisPrivate * wt = 0; - -// shadowWidth not const, for XP drop-shadow-fu turns it to 0 -static int shadowWidth = 6; // also used as '5' and '6' and even '8' below -const int vMargin = 8; -const int hMargin = 12; - -// Lets TQPopupMenu destroy the TQWhatsThat. -void qWhatsThisBDH() -{ - if ( wt && wt->whatsThat ) - wt->whatsThat->hide(); -} - - -TQWhatsThat::TQWhatsThat( TQWidget* w, const TQString& txt, TQWidget* parent, const char* name ) - : TQWidget( parent, name, WType_Popup ), text( txt ), pressed( FALSE ), widget( w ) -{ - - setBackgroundMode( TQt::NoBackground ); - setPalette( TQToolTip::palette() ); - setMouseTracking( TRUE ); -#ifndef TQT_NO_CURSOR - setCursor( Qt::ArrowCursor ); -#endif - - if ( widget ) - connect( widget, TQT_SIGNAL( destroyed() ), this, TQT_SLOT( widgetDestroyed() ) ); - - - TQRect r; -#ifndef TQT_NO_RICHTEXT - doc = 0; - if ( TQStyleSheet::mightBeRichText( text ) ) { - TQFont f = TQApplication::font( this ); - doc = new TQSimpleRichText( text, f ); - doc->adjustSize(); - r.setRect( 0, 0, doc->width(), doc->height() ); - } - else -#endif - { - int sw = TQApplication::desktop()->width() / 3; - if ( sw < 200 ) - sw = 200; - else if ( sw > 300 ) - sw = 300; - - r = fontMetrics().boundingRect( 0, 0, sw, 1000, - TQt::AlignAuto + TQt::AlignTop + TQt::WordBreak + TQt::ExpandTabs, - text ); - } -#if defined(TQ_WS_WIN) - if ( (qWinVersion()&WV_NT_based) > WV_2000 ) { - BOOL shadow; - SystemParametersInfo( SPI_GETDROPSHADOW, 0, &shadow, 0 ); - shadowWidth = shadow ? 0 : 6; - } -#endif - resize( r.width() + 2*hMargin + shadowWidth, r.height() + 2*vMargin + shadowWidth ); -} - -TQWhatsThat::~TQWhatsThat() -{ - if ( wt && wt->whatsThat == this ) - wt->whatsThat = 0; -#ifndef TQT_NO_RICHTEXT - if ( doc ) - delete doc; -#endif -} - -void TQWhatsThat::hide() -{ - TQWidget::hide(); -#if defined(TQT_ACCESSIBILITY_SUPPORT) - TQAccessible::updateAccessibility( this, 0, TQAccessible::ContextHelpEnd ); -#endif -} - -void TQWhatsThat::mousePressEvent( TQMouseEvent* e ) -{ - pressed = TRUE; - if ( e->button() == Qt::LeftButton && TQT_TQRECT_OBJECT(rect()).contains( e->pos() ) ) { -#ifndef TQT_NO_RICHTEXT - if ( doc ) - anchor = doc->anchorAt( e->pos() - TQPoint( hMargin, vMargin) ); -#endif - return; - } - hide(); -} - -void TQWhatsThat::mouseReleaseEvent( TQMouseEvent* e ) -{ - if ( !pressed ) - return; -#ifndef TQT_NO_RICHTEXT - if ( e->button() == Qt::LeftButton && doc && TQT_TQRECT_OBJECT(rect()).contains( e->pos() ) ) { - TQString a = doc->anchorAt( e->pos() - TQPoint( hMargin, vMargin ) ); - TQString href; - if ( anchor == a ) - href = a; - anchor = TQString::null; - if ( widget && wt && wt->dict ) { - TQWhatsThisPrivate::WhatsThisItem * i = wt->dict->find( widget ); - if ( i && i->whatsthis && !i->whatsthis->clicked( href ) ) - return; - } - } -#endif - hide(); -} - -void TQWhatsThat::mouseMoveEvent( TQMouseEvent* e) -{ -#ifndef TQT_NO_RICHTEXT -#ifndef TQT_NO_CURSOR - if ( !doc ) - return; - TQString a = doc->anchorAt( e->pos() - TQPoint( hMargin, vMargin ) ); - if ( !a.isEmpty() ) - setCursor( Qt::PointingHandCursor ); - else - setCursor( Qt::ArrowCursor ); -#endif -#endif -} - - -void TQWhatsThat::keyPressEvent( TQKeyEvent* ) -{ - hide(); -} - - - -void TQWhatsThat::paintEvent( TQPaintEvent* ) -{ - bool drawShadow = TRUE; -#if defined(TQ_WS_WIN) - if ( (qWinVersion()&WV_NT_based) > WV_2000 ) { - BOOL shadow; - SystemParametersInfo( SPI_GETDROPSHADOW, 0, &shadow, 0 ); - drawShadow = !shadow; - } -#elif defined(TQ_WS_MACX) - drawShadow = FALSE; //never draw it on OS X we get it for free -#endif - - TQRect r = rect(); - if ( drawShadow ) - r.addCoords( 0, 0, -shadowWidth, -shadowWidth ); - TQPainter p( this); - p.setPen( tqcolorGroup().foreground() ); - p.drawRect( r ); - p.setPen( tqcolorGroup().mid() ); - p.setBrush( tqcolorGroup().brush( TQColorGroup::Background ) ); - int w = r.width(); - int h = r.height(); - p.drawRect( 1, 1, w-2, h-2 ); - if ( drawShadow ) { - p.setPen( tqcolorGroup().shadow() ); - p.drawPoint( w + 5, 6 ); - p.drawLine( w + 3, 6, w + 5, 8 ); - p.drawLine( w + 1, 6, w + 5, 10 ); - int i; - for( i=7; i < h; i += 2 ) - p.drawLine( w, i, w + 5, i + 5 ); - for( i = w - i + h; i > 6; i -= 2 ) - p.drawLine( i, h, i + 5, h + 5 ); - for( ; i > 0 ; i -= 2 ) - p.drawLine( 6, h + 6 - i, i + 5, h + 5 ); - } - p.setPen( tqcolorGroup().foreground() ); - r.addCoords( hMargin, vMargin, -hMargin, -vMargin ); - -#ifndef TQT_NO_RICHTEXT - if ( doc ) { - doc->draw( &p, r.x(), r.y(), r, tqcolorGroup(), 0 ); - } - else -#endif - { - p.drawText( r, TQt::AlignAuto + TQt::AlignTop + TQt::WordBreak + TQt::ExpandTabs, text ); - } -} - -// the item -TQWhatsThisPrivate::WhatsThisItem::~WhatsThisItem() -{ - if ( count ) - qFatal( "TQWhatsThis: Internal error (%d)", count ); - delete whatsthis; -} - - -static const char * const button_image[] = { -"16 16 3 1", -" c None", -"o c #000000", -"a c #000080", -"o aaaaa ", -"oo aaa aaa ", -"ooo aaa aaa", -"oooo aa aa", -"ooooo aa aa", -"oooooo a aaa", -"ooooooo aaa ", -"oooooooo aaa ", -"ooooooooo aaa ", -"ooooo aaa ", -"oo ooo ", -"o ooo aaa ", -" ooo aaa ", -" ooo ", -" ooo ", -" ooo "}; - -// the button class -TQWhatsThisButton::TQWhatsThisButton( TQWidget * parent, const char * name ) - : TQToolButton( parent, name ) -{ - TQPixmap p( (const char**)button_image ); - setPixmap( p ); - setToggleButton( TRUE ); - setAutoRaise( TRUE ); - setFocusPolicy( Qt::NoFocus ); - setTextLabel( tr( "What's this?" ) ); - wt->buttons->insert( (void *)this, this ); - connect( this, TQT_SIGNAL( released() ), - this, TQT_SLOT( mouseReleased() ) ); -} - - -TQWhatsThisButton::~TQWhatsThisButton() -{ - if ( wt && wt->buttons ) - wt->buttons->take( (void *)this ); -} - - -void TQWhatsThisButton::mouseReleased() -{ - if ( wt->state == TQWhatsThisPrivate::Inactive && isOn() ) { - TQWhatsThisPrivate::setUpWhatsThis(); -#ifndef TQT_NO_CURSOR - TQApplication::setOverrideCursor( Qt::WhatsThisCursor, FALSE ); -#endif - wt->state = TQWhatsThisPrivate::Waiting; - tqApp->installEventFilter( wt ); - } -} - -static void qWhatsThisPrivateCleanup() -{ - if( wt ) { - delete wt; - wt = 0; - } -} - -// the what's this manager class -TQWhatsThisPrivate::TQWhatsThisPrivate() - : TQObject( 0, "global what's this object" ) -{ - whatsThat = 0; - dict = new TQPtrDict<TQWhatsThisPrivate::WhatsThisItem>; - tlw = new TQPtrDict<TQWidget>; - wt = this; - buttons = new TQPtrDict<TQWhatsThisButton>; - state = Inactive; -} - -TQWhatsThisPrivate::~TQWhatsThisPrivate() -{ -#ifndef TQT_NO_CURSOR - if ( state == Waiting && tqApp ) - TQApplication::restoreOverrideCursor(); -#endif - // the two straight-and-simple dicts - delete tlw; - delete buttons; - - // then delete the complex one. - TQPtrDictIterator<WhatsThisItem> it( *dict ); - WhatsThisItem * i; - TQWidget * w; - while( (i=it.current()) != 0 ) { - w = (TQWidget *)it.currentKey(); - ++it; - dict->take( w ); - if ( i->deref() ) - delete i; - } - delete dict; - if ( whatsThat && !whatsThat->parentWidget() ) { - delete whatsThat; - } - // and finally lose wt - wt = 0; -} - -bool TQWhatsThisPrivate::eventFilter( TQObject * o, TQEvent * e ) -{ - switch( state ) { - case Waiting: - if ( e->type() == TQEvent::MouseButtonPress && o->isWidgetType() ) { - TQWidget * w = (TQWidget *) o; - if ( ( (TQMouseEvent*)e)->button() == Qt::RightButton ) - return FALSE; // ignore RMB - if ( w->customWhatsThis() ) - return FALSE; - TQWhatsThisPrivate::WhatsThisItem * i = 0; - TQMouseEvent* me = (TQMouseEvent*) e; - TQPoint p = me->pos(); - while( w && !i ) { - i = dict->find( w ); - if ( !i ) { - p += w->pos(); - w = w->parentWidget( TRUE ); - } - } - leaveWhatsThisMode(); - if (!i ) { -#if defined(TQT_ACCESSIBILITY_SUPPORT) - TQAccessible::updateAccessibility( this, 0, TQAccessible::ContextHelpEnd ); -#endif - return TRUE; - } - if ( i->whatsthis ) - say( w, i->whatsthis->text( p ), me->globalPos() ); - else - say( w, i->s, me->globalPos() ); - return TRUE; - } else if ( e->type() == TQEvent::MouseButtonRelease ) { - if ( ( (TQMouseEvent*)e)->button() == Qt::RightButton ) - return FALSE; // ignore RMB - return !o->isWidgetType() || !((TQWidget*)o)->customWhatsThis(); - } else if ( e->type() == TQEvent::MouseMove ) { - return !o->isWidgetType() || !((TQWidget*)o)->customWhatsThis(); - } else if ( e->type() == TQEvent::KeyPress ) { - TQKeyEvent* kev = (TQKeyEvent*)e; - - if ( kev->key() == Key_Escape ) { - leaveWhatsThisMode(); - return TRUE; - } else if ( o->isWidgetType() && ((TQWidget*)o)->customWhatsThis() ) { - return FALSE; - } else if ( kev->key() == TQt::Key_Menu || - ( kev->key() == TQt::Key_F10 && - kev->state() == ShiftButton ) ) { - // we don't react to these keys, they are used for context menus - return FALSE; - } else if ( kev->state() == kev->stateAfter() && - kev->key() != TQt::Key_Meta ) { // not a modifier key - leaveWhatsThisMode(); - } - } else if ( e->type() == TQEvent::MouseButtonDblClick ) { - return TRUE; - } - break; - case Inactive: - if ( e->type() == TQEvent::Accel && - ((TQKeyEvent *)e)->key() == TQt::Key_F1 && - o->isWidgetType() && - ((TQKeyEvent *)e)->state() == ShiftButton ) { - TQWidget * w = ((TQWidget *)o)->tqfocusWidget(); - if ( !w ) - break; - TQString s = TQWhatsThis::textFor( w, TQPoint(0,0), TRUE ); - if ( !s.isNull() ) { - say ( w, s, w->mapToGlobal( w->rect().center() ) ); - ((TQKeyEvent *)e)->accept(); - return TRUE; - } - } - break; - } - return FALSE; -} - - - -void TQWhatsThisPrivate::setUpWhatsThis() -{ - if ( !wt ) { - wt = new TQWhatsThisPrivate(); - - // It is necessary to use a post routine, because - // the destructor deletes pixmaps and other stuff that - // needs a working X connection under X11. - qAddPostRoutine( qWhatsThisPrivateCleanup ); - } -} - - -void TQWhatsThisPrivate::enterWhatsThisMode() -{ -#if defined(TQT_ACCESSIBILITY_SUPPORT) - TQAccessible::updateAccessibility( this, 0, TQAccessible::ContextHelpStart ); -#endif -} - - -void TQWhatsThisPrivate::leaveWhatsThisMode() -{ - if ( state == Waiting ) { - TQPtrDictIterator<TQWhatsThisButton> it( *(wt->buttons) ); - TQWhatsThisButton * b; - while( (b=it.current()) != 0 ) { - ++it; - b->setOn( FALSE ); - } -#ifndef TQT_NO_CURSOR - TQApplication::restoreOverrideCursor(); -#endif - state = Inactive; - tqApp->removeEventFilter( this ); - } -} - - - -void TQWhatsThisPrivate::say( TQWidget * widget, const TQString &text, const TQPoint& ppos) -{ - if ( text.isEmpty() ) - return; - // make a fresh widget, and set it up - delete whatsThat; - whatsThat = new TQWhatsThat( - widget, text, -#if defined(TQ_WS_X11) - TQT_TQWIDGET(TQApplication::desktop()->screen( widget ? - widget->x11Screen() : - TQCursor::x11Screen()) ), -#else - 0, -#endif - "automatic what's this? widget" ); - - - // okay, now to find a suitable location - - int scr = ( widget ? - TQApplication::desktop()->screenNumber( widget ) : -#if defined(TQ_WS_X11) - TQCursor::x11Screen() -#else - TQApplication::desktop()->screenNumber( ppos ) -#endif // TQ_WS_X11 - ); - TQRect screen = TQApplication::desktop()->screenGeometry( scr ); - - int x; - int w = whatsThat->width(); - int h = whatsThat->height(); - int sx = screen.x(); - int sy = screen.y(); - - // first try locating the widget immediately above/below, - // with nice tqalignment if possible. - TQPoint pos; - if ( widget ) - pos = widget->mapToGlobal( TQPoint( 0,0 ) ); - - if ( widget && w > widget->width() + 16 ) - x = pos.x() + widget->width()/2 - w/2; - else - x = ppos.x() - w/2; - - // squeeze it in if that would result in part of what's this - // being only partially visible - if ( x + w + shadowWidth > sx+screen.width() ) - x = (widget? (TQMIN(screen.width(), - pos.x() + widget->width()) - ) : screen.width() ) - - w; - - if ( x < sx ) - x = sx; - - int y; - if ( widget && h > widget->height() + 16 ) { - y = pos.y() + widget->height() + 2; // below, two pixels spacing - // what's this is above or below, wherever there's most space - if ( y + h + 10 > sy+screen.height() ) - y = pos.y() + 2 - shadowWidth - h; // above, overlap - } - y = ppos.y() + 2; - - // squeeze it in if that would result in part of what's this - // being only partially visible - if ( y + h + shadowWidth > sy+screen.height() ) - y = ( widget ? (TQMIN(screen.height(), - pos.y() + widget->height()) - ) : screen.height() ) - - h; - if ( y < sy ) - y = sy; - - whatsThat->move( x, y ); - whatsThat->show(); -} - -TQWhatsThisPrivate::WhatsThisItem* TQWhatsThisPrivate::newItem( TQWidget * widget ) -{ - WhatsThisItem * i = dict->find( (void *)widget ); - if ( i ) - TQWhatsThis::remove( widget ); - i = new WhatsThisItem; - dict->insert( (void *)widget, i ); - TQWidget * t = widget->tqtopLevelWidget(); - if ( !tlw->find( (void *)t ) ) { - tlw->insert( (void *)t, t ); - t->installEventFilter( this ); - } - connect( widget, TQT_SIGNAL(destroyed()), this, TQT_SLOT(cleanupWidget()) ); - return i; -} - -void TQWhatsThisPrivate::add( TQWidget * widget, TQWhatsThis* special ) -{ - newItem( widget )->whatsthis = special; -} - -void TQWhatsThisPrivate::add( TQWidget * widget, const TQString &text ) -{ - newItem( widget )->s = text; -} - - -// and finally the What's This class itself - -/*! - Adds \a text as "What's this" help for \a widget. If the text is - rich text formatted (i.e. it contains markup) it will be rendered - with the default stylesheet TQStyleSheet::defaultSheet(). - - The text is destroyed if the widget is later destroyed, so it need - not be explicitly removed. - - \sa remove() -*/ -void TQWhatsThis::add( TQWidget * widget, const TQString &text ) -{ - if ( text.isEmpty() ) - return; // pointless - TQWhatsThisPrivate::setUpWhatsThis(); - wt->add(widget,text); -} - - -/*! - Removes the "What's this?" help associated with the \a widget. - This happens automatically if the widget is destroyed. - - \sa add() -*/ -void TQWhatsThis::remove( TQWidget * widget ) -{ - TQWhatsThisPrivate::setUpWhatsThis(); - TQWhatsThisPrivate::WhatsThisItem * i = wt->dict->find( (void *)widget ); - if ( !i ) - return; - - wt->dict->take( (void *)widget ); - - i->deref(); - if ( !i->count ) - delete i; -} - - -/*! - Returns the what's this text for widget \a w or TQString::null if - there is no "What's this?" help for the widget. \a pos contains - the mouse position; this is useful, for example, if you've - subclassed to make the text that is displayed position dependent. - - If \a includeParents is TRUE, parent widgets are taken into - consideration as well when looking for what's this help text. - - \sa add() -*/ -TQString TQWhatsThis::textFor( TQWidget * w, const TQPoint& pos, bool includeParents ) -{ - TQWhatsThisPrivate::setUpWhatsThis(); - TQWhatsThisPrivate::WhatsThisItem * i = 0; - TQPoint p = pos; - while( w && !i ) { - i = wt->dict->find( w ); - if ( !includeParents ) - break; - if ( !i ) { - p += w->pos(); - w = w->parentWidget( TRUE ); - } - } - if (!i) - return TQString::null; - if ( i->whatsthis ) - return i->whatsthis->text( p ); - return i->s; -} - - -/*! - Creates a TQToolButton preconfigured to enter "What's this?" mode - when clicked. You will often use this with a tool bar as \a - parent: - \code - (void) TQWhatsThis::whatsThisButton( my_help_tool_bar ); - \endcode -*/ -TQToolButton * TQWhatsThis::whatsThisButton( TQWidget * parent ) -{ - TQWhatsThisPrivate::setUpWhatsThis(); - return new TQWhatsThisButton( parent, - "automatic what's this? button" ); -} - -/*! - Constructs a dynamic "What's this?" object for \a widget. The - object is deleted when the \a widget is destroyed. - - When the widget is queried by the user the text() function of this - TQWhatsThis will be called to provide the appropriate text, rather - than using the text assigned by add(). -*/ -TQWhatsThis::TQWhatsThis( TQWidget * widget) -{ - TQWhatsThisPrivate::setUpWhatsThis(); - wt->add(widget,this); -} - - -/*! - Destroys the object and frees any allocated resources. -*/ -TQWhatsThis::~TQWhatsThis() -{ -} - - -/*! - This virtual function returns the text for position \e p in the - widget that this "What's this?" object documents. If there is no - "What's this?" text for the position, TQString::null is returned. - - The default implementation returns TQString::null. -*/ -TQString TQWhatsThis::text( const TQPoint & ) -{ - return TQString::null; -} - -/*! - \fn bool TQWhatsThis::clicked( const TQString& href ) - - This virtual function is called when the user clicks inside the - "What's this?" window. \a href is the link the user clicked on, or - TQString::null if there was no link. - - If the function returns TRUE (the default), the "What's this?" - window is closed, otherwise it remains visible. - - The default implementation ignores \a href and returns TRUE. -*/ -bool TQWhatsThis::clicked( const TQString& ) -{ - return TRUE; -} - - -/*! - Enters "What's this?" mode and returns immediately. - - TQt will install a special cursor and take over mouse input until - the user clicks somewhere. It then shows any help available and - ends "What's this?" mode. Finally, TQt removes the special cursor - and help window and then restores ordinary event processing, at - which point the left mouse button is no longer pressed. - - The user can also use the Esc key to leave "What's this?" mode. - - \sa inWhatsThisMode(), leaveWhatsThisMode() -*/ - -void TQWhatsThis::enterWhatsThisMode() -{ - TQWhatsThisPrivate::setUpWhatsThis(); - if ( wt->state == TQWhatsThisPrivate::Inactive ) { - wt->enterWhatsThisMode(); -#ifndef TQT_NO_CURSOR - TQApplication::setOverrideCursor( Qt::WhatsThisCursor, FALSE ); -#endif - wt->state = TQWhatsThisPrivate::Waiting; - tqApp->installEventFilter( wt ); - } -} - - -/*! - Returns TRUE if the application is in "What's this?" mode; - otherwise returns FALSE. - - \sa enterWhatsThisMode(), leaveWhatsThisMode() -*/ -bool TQWhatsThis::inWhatsThisMode() -{ - if (!wt) - return FALSE; - return wt->state == TQWhatsThisPrivate::Waiting; -} - - -/*! - Leaves "What's this?" question mode. - - This function is used internally by widgets that support - TQWidget::customWhatsThis(); applications do not usually call it. - An example of such a widget is TQPopupMenu: menus still work - normally in "What's this?" mode but also provide help texts for - individual menu items. - - If \a text is not TQString::null, a "What's this?" help window is - displayed at the global screen position \a pos. If widget \a w is - not 0 and has its own dedicated TQWhatsThis object, this object - will receive clicked() messages when the user clicks on hyperlinks - inside the help text. - - \sa inWhatsThisMode(), enterWhatsThisMode(), TQWhatsThis::clicked() -*/ -void TQWhatsThis::leaveWhatsThisMode( const TQString& text, const TQPoint& pos, TQWidget* w ) -{ - if ( !inWhatsThisMode() ) - return; - - wt->leaveWhatsThisMode(); - if ( !text.isNull() ) - wt->say( w, text, pos ); -} - -/*! - Display \a text in a help window at the global screen position \a - pos. - - If widget \a w is not 0 and has its own dedicated TQWhatsThis - object, this object will receive clicked() messages when the user - clicks on hyperlinks inside the help text. - - \sa TQWhatsThis::clicked() -*/ -void TQWhatsThis::display( const TQString& text, const TQPoint& pos, TQWidget* w ) -{ - if ( inWhatsThisMode() ) { - leaveWhatsThisMode( text, pos, w ); - return; - } - TQWhatsThisPrivate::setUpWhatsThis(); - wt->say( w, text, pos ); -} - -/*! - Sets the font for all "What's this?" helps to \a font. -*/ -void TQWhatsThis::setFont( const TQFont &font ) -{ - TQApplication::tqsetFont( font, TRUE, "TQWhatsThat" ); -} - -#include "tqwhatsthis.tqmoc" -#endif |