|
|
|
/*
|
|
|
|
kopeteballoon.cpp - Nice Balloon
|
|
|
|
|
|
|
|
Copyright (c) 2002 by Duncan Mac-Vicar Prett <duncan@kde.org>
|
|
|
|
|
|
|
|
Kopete (c) 2002-2005 by the Kopete developers <kopete-devel@kde.org>
|
|
|
|
|
|
|
|
Portions of this code based on Kim Applet code
|
|
|
|
Copyright (c) 2000-2002 by Malte Starostik <malte@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. *
|
|
|
|
* *
|
|
|
|
*************************************************************************
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <tqpointarray.h>
|
|
|
|
#include <tqpushbutton.h>
|
|
|
|
#include <tqtooltip.h>
|
|
|
|
#include <tqlayout.h>
|
|
|
|
#include <tqtimer.h>
|
|
|
|
|
|
|
|
#include <kdeversion.h>
|
|
|
|
#include <kglobalsettings.h>
|
|
|
|
|
|
|
|
#include <kapplication.h>
|
|
|
|
#include <kdialog.h>
|
|
|
|
#include <klocale.h>
|
|
|
|
#include <kstandarddirs.h>
|
|
|
|
#include <kprotocolinfo.h>
|
|
|
|
#include <kurl.h>
|
|
|
|
#include <krun.h>
|
|
|
|
|
|
|
|
#include "kopeteballoon.h"
|
|
|
|
#include "systemtray.h"
|
|
|
|
#include "kopeteprefs.h"
|
|
|
|
|
|
|
|
KopeteActiveLabel::KopeteActiveLabel( TQWidget *parent, const char *name )
|
|
|
|
: KActiveLabel( parent, name )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
KopeteActiveLabel::KopeteActiveLabel( const TQString& text, TQWidget *parent,
|
|
|
|
const char *name ) : KActiveLabel( text, parent, name )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void KopeteActiveLabel::openLink( const TQString& link )
|
|
|
|
{
|
|
|
|
KURL url( link );
|
|
|
|
TQString protocol = url.protocol();
|
|
|
|
|
|
|
|
if ( protocol == "mailto" )
|
|
|
|
kapp->invokeMailer(url);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( KProtocolInfo::protocolClass( protocol ) == ":internet" ) // http, ftp, etc.
|
|
|
|
new KRun( url, this );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
KopeteBalloon::KopeteBalloon(const TQString &text, const TQString &pix)
|
|
|
|
: TQWidget(0L, "KopeteBalloon", WStyle_StaysOnTop | WStyle_Customize |
|
|
|
|
WStyle_NoBorder | WStyle_Tool | WX11BypassWM)
|
|
|
|
{
|
|
|
|
setCaption("");
|
|
|
|
|
|
|
|
TQVBoxLayout *BalloonLayout = new TQVBoxLayout(this, 22,
|
|
|
|
KDialog::spacingHint(), "BalloonLayout");
|
|
|
|
|
|
|
|
// BEGIN Layout1
|
|
|
|
TQHBoxLayout *Layout1 = new TQHBoxLayout(BalloonLayout,
|
|
|
|
KDialog::spacingHint(), "Layout1");
|
|
|
|
//TQLabel *mCaption = new TQLabel(text, this, "mCaption");
|
|
|
|
KopeteActiveLabel *mCaption = new KopeteActiveLabel(text, this, "mCaption");
|
|
|
|
mCaption->setPalette(TQToolTip::palette());
|
|
|
|
mCaption->tqsetSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Minimum );
|
|
|
|
|
|
|
|
if (!pix.isEmpty())
|
|
|
|
{
|
|
|
|
TQLabel *mImage = new TQLabel(this, "mImage");
|
|
|
|
mImage->setScaledContents(FALSE);
|
|
|
|
mImage->setPixmap(locate("data", pix));
|
|
|
|
|
|
|
|
Layout1->addWidget(mImage);
|
|
|
|
}
|
|
|
|
Layout1->addWidget(mCaption);
|
|
|
|
// END Layout1
|
|
|
|
|
|
|
|
|
|
|
|
// BEGIN Layout2
|
|
|
|
TQHBoxLayout *Layout2 = new TQHBoxLayout(BalloonLayout,
|
|
|
|
KDialog::spacingHint(), "Layout2");
|
|
|
|
TQPushButton *mViewButton = new TQPushButton(i18n("to view", "View"), this,
|
|
|
|
"mViewButton");
|
|
|
|
TQPushButton *mIgnoreButton = new TQPushButton(i18n("Ignore"), this,
|
|
|
|
"mIgnoreButton");
|
|
|
|
|
|
|
|
Layout2->addStretch();
|
|
|
|
Layout2->addWidget(mViewButton);
|
|
|
|
Layout2->addWidget(mIgnoreButton);
|
|
|
|
Layout2->addStretch();
|
|
|
|
// END Layout2
|
|
|
|
|
|
|
|
setPalette(TQToolTip::palette());
|
|
|
|
setAutoMask(TRUE);
|
|
|
|
|
|
|
|
connect(mViewButton, TQT_SIGNAL(clicked()),
|
|
|
|
this, TQT_SIGNAL(signalButtonClicked()));
|
|
|
|
connect(mViewButton, TQT_SIGNAL(clicked()),
|
|
|
|
this, TQT_SLOT(deleteLater()));
|
|
|
|
connect(mIgnoreButton, TQT_SIGNAL(clicked()),
|
|
|
|
this, TQT_SIGNAL(signalIgnoreButtonClicked()));
|
|
|
|
connect(mIgnoreButton, TQT_SIGNAL(clicked()),
|
|
|
|
this, TQT_SLOT(deleteLater()));
|
|
|
|
connect(mCaption, TQT_SIGNAL(linkClicked(const TQString &)),
|
|
|
|
this, TQT_SIGNAL(signalIgnoreButtonClicked()));
|
|
|
|
connect(mCaption, TQT_SIGNAL(linkClicked(const TQString &)),
|
|
|
|
this, TQT_SLOT(deleteLater()));
|
|
|
|
|
|
|
|
KopetePrefs *p = KopetePrefs::prefs();
|
|
|
|
// Autoclose balloon
|
|
|
|
if (p->balloonClose())
|
|
|
|
TQTimer::singleShot( p->balloonCloseDelay() * 1000, this, TQT_SIGNAL( signalTimeout( ) ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KopeteBalloon::setAnchor(const TQPoint &anchor)
|
|
|
|
{
|
|
|
|
mAnchor = anchor;
|
|
|
|
updateMask();
|
|
|
|
}
|
|
|
|
|
|
|
|
void KopeteBalloon::updateMask()
|
|
|
|
{
|
|
|
|
TQRegion mask(10, 10, width() - 20, height() - 20);
|
|
|
|
|
|
|
|
TQPoint corners[8] = {
|
|
|
|
TQPoint(width() - 50, 10),
|
|
|
|
TQPoint(10, 10),
|
|
|
|
TQPoint(10, height() - 50),
|
|
|
|
TQPoint(width() - 50, height() - 50),
|
|
|
|
TQPoint(width() - 10, 10),
|
|
|
|
TQPoint(10, 10),
|
|
|
|
TQPoint(10, height() - 10),
|
|
|
|
TQPoint(width() - 10, height() - 10)
|
|
|
|
};
|
|
|
|
|
|
|
|
for (int i = 0; i < 4; ++i)
|
|
|
|
{
|
|
|
|
TQPointArray corner;
|
|
|
|
corner.makeArc(corners[i].x(), corners[i].y(), 40, 40,
|
|
|
|
i * 16 * 90, 16 * 90);
|
|
|
|
corner.resize(corner.size() + 1);
|
|
|
|
corner.setPoint(corner.size() - 1, corners[i + 4]);
|
|
|
|
mask -= corner;
|
|
|
|
}
|
|
|
|
|
|
|
|
// get screen-tqgeometry for screen our anchor is on
|
|
|
|
// (tqgeometry can differ from screen to screen!
|
|
|
|
TQRect deskRect = KGlobalSettings::desktopGeometry(mAnchor);
|
|
|
|
|
|
|
|
bool bottom = (mAnchor.y() + height()) > ((deskRect.y() + deskRect.height()-48));
|
|
|
|
bool right = (mAnchor.x() + width()) > ((deskRect.x() + deskRect.width()-48));
|
|
|
|
|
|
|
|
TQPointArray arrow(4);
|
|
|
|
arrow.setPoint(0, TQPoint(right ? width() : 0, bottom ? height() : 0));
|
|
|
|
arrow.setPoint(1, TQPoint(right ? width() - 10 : 10,
|
|
|
|
bottom ? height() - 30 : 30));
|
|
|
|
arrow.setPoint(2, TQPoint(right ? width() - 30 : 30,
|
|
|
|
bottom ? height() - 10 : 10));
|
|
|
|
arrow.setPoint(3, arrow[0]);
|
|
|
|
mask += arrow;
|
|
|
|
setMask(mask);
|
|
|
|
|
|
|
|
move( right ? mAnchor.x() - width() : ( mAnchor.x() < 0 ? 0 : mAnchor.x() ),
|
|
|
|
bottom ? mAnchor.y() - height() : ( mAnchor.y() < 0 ? 0 : mAnchor.y() ) );
|
|
|
|
|
|
|
|
//kdDebug(14000) << k_funcinfo << "finalpos: x=" << x() << ", y=" << y() << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "kopeteballoon.moc"
|
|
|
|
// vim: set noet ts=4 sts=4 sw=4:
|