diff options
Diffstat (limited to 'kdict/applet/kdictapplet.cpp')
-rw-r--r-- | kdict/applet/kdictapplet.cpp | 405 |
1 files changed, 405 insertions, 0 deletions
diff --git a/kdict/applet/kdictapplet.cpp b/kdict/applet/kdictapplet.cpp new file mode 100644 index 00000000..ad907864 --- /dev/null +++ b/kdict/applet/kdictapplet.cpp @@ -0,0 +1,405 @@ +/* ------------------------------------------------------------- + + 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" |