You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
406 lines
11 KiB
406 lines
11 KiB
/* -------------------------------------------------------------
|
|
|
|
kdictapplet.h (part of The KDE Dictionary Client)
|
|
|
|
Copyright (C) 2001 Christian Gebauer <gebauer@kde.org>
|
|
|
|
The applet is loosely based on the "Run" applet included in KDE.
|
|
Copyright (c) 2000 Matthias Elter <elter@kde.org> (Artistic License)
|
|
|
|
This file is distributed under the Artistic License.
|
|
See LICENSE for details.
|
|
|
|
-------------------------------------------------------------
|
|
|
|
PopupBox helper class
|
|
DictApplet a small kicker-applet
|
|
|
|
------------------------------------------------------------- */
|
|
|
|
#include <qlabel.h>
|
|
#include <qpushbutton.h>
|
|
#include <qtimer.h>
|
|
#include <qlayout.h>
|
|
#include <qtooltip.h>
|
|
|
|
#include <kconfig.h>
|
|
#include <kcombobox.h>
|
|
#include <kiconloader.h>
|
|
#include <klocale.h>
|
|
#include <dcopclient.h>
|
|
#include <kapplication.h>
|
|
#include <kprocess.h>
|
|
|
|
#include "kdictapplet.h"
|
|
|
|
//********* PopupBox ********************************************
|
|
|
|
PopupBox::PopupBox()
|
|
: QHBox(0, 0, WStyle_Customize | WType_Popup ), popupEnabled(true)
|
|
{
|
|
}
|
|
|
|
|
|
PopupBox::~PopupBox()
|
|
{}
|
|
|
|
|
|
bool PopupBox::showBox()
|
|
{
|
|
if (!popupEnabled) // prevents that the popup is shown again immediatly
|
|
return false;
|
|
else {
|
|
show();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
void PopupBox::hideEvent(QHideEvent *)
|
|
{
|
|
emit(hidden());
|
|
popupEnabled = false;
|
|
QTimer::singleShot(100, this, SLOT(enablePopup()));
|
|
}
|
|
|
|
|
|
void PopupBox::enablePopup()
|
|
{
|
|
popupEnabled = true;
|
|
}
|
|
|
|
|
|
//********* DictApplet ********************************************
|
|
|
|
extern "C"
|
|
{
|
|
KDE_EXPORT KPanelApplet* init(QWidget *parent, const QString& configFile)
|
|
{
|
|
KGlobal::locale()->insertCatalogue("kdictapplet");
|
|
return new DictApplet(configFile, KPanelApplet::Stretch, 0, parent, "kdictapplet");
|
|
}
|
|
}
|
|
|
|
|
|
DictApplet::DictApplet(const QString& configFile, Type type, int actions, QWidget *parent, const char *name)
|
|
: KPanelApplet(configFile, type, actions, parent, name), waiting(0)
|
|
{
|
|
// first the widgets for a horizontal panel
|
|
baseWidget = new QWidget(this);
|
|
QGridLayout *baseLay = new QGridLayout(baseWidget,2,6,0,1);
|
|
|
|
textLabel = new QLabel(i18n("Dictionary:"), baseWidget);
|
|
textLabel->setBackgroundOrigin(AncestorOrigin);
|
|
QFont f(textLabel->font());
|
|
f.setPixelSize(12);
|
|
textLabel->setFont(f);
|
|
baseLay->addWidget(textLabel,0,1);
|
|
QToolTip::add(textLabel,i18n("Look up a word or phrase with Kdict"));
|
|
|
|
iconLabel = new QLabel(baseWidget);
|
|
iconLabel->setBackgroundOrigin(AncestorOrigin);
|
|
QPixmap pm = KGlobal::iconLoader()->loadIcon("kdict", KIcon::Panel, KIcon::SizeSmall, KIcon::DefaultState, 0L, true);
|
|
iconLabel->setPixmap(pm);
|
|
baseLay->addWidget(iconLabel,1,0);
|
|
iconLabel->setAlignment(Qt::AlignCenter | Qt::AlignVCenter);
|
|
iconLabel->setFixedWidth(pm.width()+4);
|
|
QToolTip::add(iconLabel,i18n("Look up a word or phrase with Kdict"));
|
|
|
|
f.setPixelSize(10);
|
|
clipboardBtn = new QPushButton(i18n("C"),baseWidget);
|
|
clipboardBtn->setBackgroundOrigin(AncestorOrigin);
|
|
clipboardBtn->setFont(f);
|
|
clipboardBtn->setFixedSize(16,16);
|
|
connect(clipboardBtn, SIGNAL(clicked()), SLOT(queryClipboard()));
|
|
baseLay->addWidget(clipboardBtn,0,3);
|
|
QToolTip::add(clipboardBtn,i18n("Define selected text"));
|
|
|
|
defineBtn = new QPushButton(i18n("D"),baseWidget);
|
|
defineBtn->setBackgroundOrigin(AncestorOrigin);
|
|
defineBtn->setFont(f);
|
|
defineBtn->setFixedSize(16,16);
|
|
defineBtn->setEnabled(false);
|
|
connect(defineBtn, SIGNAL(clicked()), SLOT(startDefine()));
|
|
baseLay->addWidget(defineBtn,0,4);
|
|
QToolTip::add(defineBtn,i18n("Define word/phrase"));
|
|
|
|
matchBtn = new QPushButton(i18n("M"),baseWidget);
|
|
matchBtn->setBackgroundOrigin(AncestorOrigin);
|
|
matchBtn->setFont(f);
|
|
matchBtn->setFixedSize(16,16);
|
|
matchBtn->setEnabled(false);
|
|
connect(matchBtn, SIGNAL(clicked()), SLOT(startMatch()));
|
|
baseLay->addWidget(matchBtn,0,5);
|
|
QToolTip::add(matchBtn,i18n("Find matching definitions"));
|
|
|
|
completionObject = new KCompletion();
|
|
|
|
internalCombo = new KHistoryCombo(baseWidget);
|
|
internalCombo->setBackgroundOrigin(AncestorOrigin);
|
|
internalCombo->setCompletionObject(completionObject);
|
|
internalCombo->setFocus();
|
|
internalCombo->clearEdit();
|
|
internalCombo->lineEdit()->installEventFilter( this );
|
|
connect(internalCombo, SIGNAL(returnPressed(const QString&)), SLOT(startQuery(const QString&)));
|
|
connect(internalCombo, SIGNAL(textChanged(const QString&)), SLOT(comboTextChanged(const QString&)));
|
|
QToolTip::add(internalCombo,i18n("Look up a word or phrase with Kdict"));
|
|
|
|
baseLay->addMultiCellWidget(internalCombo,1,1,1,5);
|
|
|
|
baseLay->setColStretch(2,1);
|
|
|
|
// widgets for a vertical panel
|
|
verticalBtn = new QPushButton(this);
|
|
connect(verticalBtn, SIGNAL(pressed()), SLOT(showExternalCombo()));
|
|
QToolTip::add(verticalBtn,i18n("Look up a word or phrase with Kdict"));
|
|
|
|
popupBox = new PopupBox();
|
|
popupBox->setFixedSize(160, 22);
|
|
connect(popupBox, SIGNAL(hidden()), SLOT(externalComboHidden()));
|
|
externalCombo = new KHistoryCombo(popupBox);
|
|
externalCombo->setCompletionObject(completionObject);
|
|
connect(externalCombo, SIGNAL(returnPressed(const QString&)), SLOT(startQuery(const QString&)));
|
|
externalCombo->setFixedSize(160, externalCombo->sizeHint().height());
|
|
|
|
connect(internalCombo, SIGNAL(completionModeChanged(KGlobalSettings::Completion)),
|
|
this, SLOT(updateCompletionMode(KGlobalSettings::Completion)));
|
|
connect(externalCombo, SIGNAL(completionModeChanged(KGlobalSettings::Completion)),
|
|
this, SLOT(updateCompletionMode(KGlobalSettings::Completion)));
|
|
|
|
// restore history and completion list
|
|
KConfig *c = config();
|
|
c->setGroup("General");
|
|
|
|
QStringList list = c->readListEntry("Completion list");
|
|
completionObject->setItems(list);
|
|
int mode = c->readNumEntry("Completion mode",
|
|
KGlobalSettings::completionMode());
|
|
internalCombo->setCompletionMode((KGlobalSettings::Completion)mode);
|
|
externalCombo->setCompletionMode((KGlobalSettings::Completion)mode);
|
|
|
|
list = c->readListEntry("History list");
|
|
internalCombo->setHistoryItems(list);
|
|
externalCombo->setHistoryItems(list);
|
|
}
|
|
|
|
|
|
DictApplet::~DictApplet()
|
|
{
|
|
// save history and completion list
|
|
KConfig *c = config();
|
|
c->setGroup("General");
|
|
|
|
QStringList list = completionObject->items();
|
|
c->writeEntry("Completion list", list);
|
|
c->writeEntry("Completion mode", (int) internalCombo->completionMode());
|
|
|
|
list = internalCombo->historyItems();
|
|
c->writeEntry("History list", list);
|
|
c->sync();
|
|
|
|
delete completionObject;
|
|
}
|
|
|
|
|
|
int DictApplet::widthForHeight(int height) const
|
|
{
|
|
if (height >= 38)
|
|
return textLabel->sizeHint().width()+55;
|
|
else
|
|
return textLabel->sizeHint().width()+25;
|
|
}
|
|
|
|
|
|
int DictApplet::heightForWidth(int width) const
|
|
{
|
|
return width;
|
|
}
|
|
|
|
|
|
void DictApplet::resizeEvent(QResizeEvent*)
|
|
{
|
|
if (orientation() == Horizontal) {
|
|
verticalBtn->hide();
|
|
baseWidget->show();
|
|
baseWidget->setFixedSize(width(),height());
|
|
|
|
if (height() < internalCombo->sizeHint().height())
|
|
internalCombo->setFixedHeight(height());
|
|
else
|
|
internalCombo->setFixedHeight(internalCombo->sizeHint().height());
|
|
|
|
if (height() >= 38) {
|
|
textLabel->show();
|
|
clipboardBtn->show();
|
|
defineBtn->show();
|
|
matchBtn->show();
|
|
iconLabel->hide();
|
|
internalCombo->setFixedWidth(width());
|
|
} else {
|
|
textLabel->hide();
|
|
clipboardBtn->hide();
|
|
defineBtn->hide();
|
|
matchBtn->hide();
|
|
iconLabel->show();
|
|
internalCombo->setFixedWidth(width()-iconLabel->width()-1);
|
|
}
|
|
|
|
baseWidget->updateGeometry();
|
|
} else { // orientation() == Vertical
|
|
verticalBtn->show();
|
|
baseWidget->hide();
|
|
verticalBtn->setFixedSize(width(),width());
|
|
|
|
KIcon::StdSizes sz = width() < 32 ? KIcon::SizeSmall : (width() < 48 ? KIcon::SizeMedium : KIcon::SizeLarge);
|
|
QPixmap pm = KGlobal::iconLoader()->loadIcon("kdict", KIcon::Panel, sz, KIcon::DefaultState, 0L, true);
|
|
verticalBtn->setPixmap(pm);
|
|
}
|
|
}
|
|
|
|
|
|
bool DictApplet::eventFilter( QObject *o, QEvent * e)
|
|
{
|
|
if (e->type() == QEvent::MouseButtonRelease)
|
|
emit requestFocus();
|
|
|
|
return KPanelApplet::eventFilter(o, e);
|
|
}
|
|
|
|
|
|
void DictApplet::sendCommand(const QCString &fun, const QString &data)
|
|
{
|
|
if (waiting > 0) {
|
|
waiting = 1;
|
|
delayedFunc = fun.copy();
|
|
delayedData = data;
|
|
return;
|
|
}
|
|
|
|
DCOPClient *client = kapp->dcopClient();
|
|
if (!client->isApplicationRegistered("kdict")) {
|
|
KApplication::startServiceByDesktopName("kdict");
|
|
waiting = 1;
|
|
delayedFunc = fun.copy();
|
|
delayedData = data;
|
|
QTimer::singleShot(100, this, SLOT(sendDelayedCommand()));
|
|
return;
|
|
} else {
|
|
QCStringList list = client->remoteObjects("kdict");
|
|
if (list.findIndex("KDictIface")==-1) {
|
|
waiting = 1;
|
|
delayedFunc = fun.copy();
|
|
delayedData = data;
|
|
QTimer::singleShot(100, this, SLOT(sendDelayedCommand()));
|
|
return;
|
|
}
|
|
}
|
|
|
|
client->send("kdict","default",fun,data);
|
|
}
|
|
|
|
|
|
void DictApplet::sendDelayedCommand()
|
|
{
|
|
if (waiting > 100) { // timeout after ten seconds
|
|
waiting = 0;
|
|
return;
|
|
}
|
|
|
|
DCOPClient *client = kapp->dcopClient();
|
|
if (!client->isApplicationRegistered("kdict")) {
|
|
waiting++;
|
|
QTimer::singleShot(100, this, SLOT(sendDelayedCommand()));
|
|
return;
|
|
} else {
|
|
QCStringList list = client->remoteObjects("kdict");
|
|
if (list.findIndex("KDictIface")==-1) {
|
|
waiting++;
|
|
QTimer::singleShot(100, this, SLOT(sendDelayedCommand()));
|
|
return;
|
|
}
|
|
}
|
|
|
|
client->send("kdict","default",delayedFunc,delayedData);
|
|
waiting = 0;
|
|
}
|
|
|
|
|
|
void DictApplet::startQuery(const QString &s)
|
|
{
|
|
QString query = s.stripWhiteSpace();
|
|
if (query.isEmpty())
|
|
return;
|
|
|
|
internalCombo->addToHistory(query);
|
|
externalCombo->addToHistory(query);
|
|
internalCombo->clearEdit();
|
|
externalCombo->clearEdit();
|
|
|
|
sendCommand("definePhrase(QString)",query);
|
|
|
|
if (orientation() == Vertical)
|
|
popupBox->hide();
|
|
}
|
|
|
|
|
|
void DictApplet::comboTextChanged(const QString &s)
|
|
{
|
|
defineBtn->setEnabled(!s.isEmpty());
|
|
matchBtn->setEnabled(!s.isEmpty());
|
|
}
|
|
|
|
|
|
void DictApplet::queryClipboard()
|
|
{
|
|
sendCommand("defineClipboardContent()",QString::null);
|
|
}
|
|
|
|
|
|
void DictApplet::startDefine()
|
|
{
|
|
startQuery(internalCombo->currentText());
|
|
}
|
|
|
|
|
|
void DictApplet::startMatch()
|
|
{
|
|
QString query = internalCombo->currentText().stripWhiteSpace();
|
|
internalCombo->addToHistory(query);
|
|
externalCombo->addToHistory(query);
|
|
internalCombo->clearEdit();
|
|
externalCombo->clearEdit();
|
|
|
|
sendCommand("matchPhrase(QString)",query);
|
|
}
|
|
|
|
|
|
void DictApplet::showExternalCombo()
|
|
{
|
|
QPoint p;
|
|
if (position() == pLeft)
|
|
p = mapToGlobal(QPoint(-popupBox->width()-1, 0));
|
|
else
|
|
p = mapToGlobal(QPoint(width()+1, 0));
|
|
popupBox->move(p);
|
|
if (popupBox->showBox())
|
|
externalCombo->setFocus();
|
|
else
|
|
verticalBtn->setDown(false);
|
|
}
|
|
|
|
|
|
void DictApplet::externalComboHidden()
|
|
{
|
|
verticalBtn->setDown(false);
|
|
}
|
|
|
|
void DictApplet::updateCompletionMode(KGlobalSettings::Completion mode)
|
|
{
|
|
internalCombo->setCompletionMode(mode);
|
|
externalCombo->setCompletionMode(mode);
|
|
}
|
|
|
|
//--------------------------------
|
|
|
|
#include "kdictapplet.moc"
|