summaryrefslogtreecommitdiffstats
path: root/kdict/applet/kdictapplet.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdict/applet/kdictapplet.cpp')
-rw-r--r--kdict/applet/kdictapplet.cpp405
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"