summaryrefslogtreecommitdiffstats
path: root/kontact/plugins/knotes/knotetip.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kontact/plugins/knotes/knotetip.cpp')
-rw-r--r--kontact/plugins/knotes/knotetip.cpp227
1 files changed, 227 insertions, 0 deletions
diff --git a/kontact/plugins/knotes/knotetip.cpp b/kontact/plugins/knotes/knotetip.cpp
new file mode 100644
index 000000000..6e2c998d7
--- /dev/null
+++ b/kontact/plugins/knotes/knotetip.cpp
@@ -0,0 +1,227 @@
+/*
+ This file is part of the KDE project
+ Copyright (C) 2004 Michael Brade <brade@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include <qtooltip.h>
+#include <qlayout.h>
+#include <qtextedit.h>
+
+#include <kapplication.h>
+#include <kglobalsettings.h>
+
+#include "knotetip.h"
+#include "knotes_part_p.h"
+
+
+KNoteTip::KNoteTip( KIconView *parent )
+ : QFrame( 0, 0, WX11BypassWM | // this will make Seli happy >:-P
+ WStyle_Customize | WStyle_NoBorder | WStyle_Tool | WStyle_StaysOnTop ),
+ mFilter( false ),
+ mView( parent ),
+ mNoteIVI( 0 ),
+ mPreview( new QTextEdit( this ) )
+{
+ mPreview->setReadOnly( true );
+ mPreview->setHScrollBarMode( QScrollView::AlwaysOff );
+ mPreview->setVScrollBarMode( QScrollView::AlwaysOff );
+
+ QBoxLayout *layout = new QVBoxLayout( this );
+ layout->addWidget( mPreview );
+
+ setPalette( QToolTip::palette() );
+ setMargin( 1 );
+ setFrameStyle( QFrame::Plain | QFrame::Box );
+ hide();
+}
+
+KNoteTip::~KNoteTip()
+{
+ delete mPreview;
+ mPreview = 0;
+}
+
+void KNoteTip::setNote( KNotesIconViewItem *item )
+{
+ if ( mNoteIVI == item )
+ return;
+
+ mNoteIVI = item;
+
+ if ( !mNoteIVI ) {
+ killTimers();
+ if ( isVisible() ) {
+ setFilter( false );
+ hide();
+ }
+ } else {
+ KCal::Journal *journal = item->journal();
+ if ( journal->customProperty( "KNotes", "RichText" ) == "true" )
+ mPreview->setTextFormat( Qt::RichText );
+ else
+ mPreview->setTextFormat( Qt::PlainText );
+
+ QColor fg( journal->customProperty( "KNotes", "FgColor" ) );
+ QColor bg( journal->customProperty( "KNotes", "BgColor" ) );
+ setColor( fg, bg );
+
+ mPreview->setText( journal->description() );
+ mPreview->zoomTo( 8 );
+ mPreview->sync();
+
+ int w = 400;
+ int h = mPreview->heightForWidth( w );
+ while ( w > 60 && h == mPreview->heightForWidth( w - 20 ) )
+ w -= 20;
+
+ QRect desk = KGlobalSettings::desktopGeometry( mNoteIVI->rect().center() );
+ resize( w, QMIN( h, desk.height() / 2 - 20 ) );
+
+ hide();
+ killTimers();
+ setFilter( true );
+ startTimer( 600 ); // delay showing the tooltip for 0.7 sec
+ }
+}
+
+
+// protected, virtual methods
+
+void KNoteTip::resizeEvent( QResizeEvent *ev )
+{
+ QFrame::resizeEvent( ev );
+ reposition();
+}
+
+void KNoteTip::timerEvent( QTimerEvent * )
+{
+ killTimers();
+
+ if ( !isVisible() ) {
+ startTimer( 15000 ); // show the tooltip for 15 sec
+ reposition();
+ show();
+ } else {
+ setFilter( false );
+ hide();
+ }
+}
+
+bool KNoteTip::eventFilter( QObject *, QEvent *e )
+{
+ switch ( e->type() ) {
+ case QEvent::Leave:
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ case QEvent::KeyPress:
+ case QEvent::KeyRelease:
+ case QEvent::FocusIn:
+ case QEvent::FocusOut:
+ case QEvent::Wheel:
+ killTimers();
+ setFilter( false );
+ hide();
+ default:
+ break;
+ }
+
+ return false;
+}
+
+
+// private stuff
+
+void KNoteTip::setColor( const QColor &fg, const QColor &bg )
+{
+ QPalette newpalette = palette();
+ newpalette.setColor( QColorGroup::Background, bg );
+ newpalette.setColor( QColorGroup::Foreground, fg );
+ newpalette.setColor( QColorGroup::Base, bg ); // text background
+ newpalette.setColor( QColorGroup::Text, fg ); // text color
+ newpalette.setColor( QColorGroup::Button, bg );
+
+ // the shadow
+ newpalette.setColor( QColorGroup::Midlight, bg.light(110) );
+ newpalette.setColor( QColorGroup::Shadow, bg.dark(116) );
+ newpalette.setColor( QColorGroup::Light, bg.light(180) );
+ newpalette.setColor( QColorGroup::Dark, bg.dark(108) );
+ setPalette( newpalette );
+
+ // set the text color
+ mPreview->setColor( fg );
+}
+
+
+void KNoteTip::setFilter( bool enable )
+{
+ if ( enable == mFilter )
+ return;
+
+ if ( enable ) {
+ kapp->installEventFilter( this );
+ QApplication::setGlobalMouseTracking( true );
+ } else {
+ QApplication::setGlobalMouseTracking( false );
+ kapp->removeEventFilter( this );
+ }
+
+ mFilter = enable;
+}
+
+void KNoteTip::reposition()
+{
+ if ( !mNoteIVI )
+ return;
+
+ QRect rect = mNoteIVI->rect();
+ QPoint off = mView->mapToGlobal( mView->contentsToViewport( QPoint( 0, 0 ) ) );
+ rect.moveBy( off.x(), off.y() );
+
+ QPoint pos = rect.center();
+
+ // should the tooltip be shown to the left or to the right of the ivi?
+ QRect desk = KGlobalSettings::desktopGeometry( pos );
+ if ( rect.center().x() + width() > desk.right() ) {
+ // to the left
+ if ( pos.x() - width() < 0 )
+ pos.setX( 0 );
+ else
+ pos.setX( pos.x() - width() );
+ }
+
+ // should the tooltip be shown above or below the ivi ?
+ if ( rect.bottom() + height() > desk.bottom() ) {
+ // above
+ pos.setY( rect.top() - height() );
+ } else
+ pos.setY( rect.bottom() );
+
+ move( pos );
+ update();
+}