123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383 |
- /*
- * Copyright (C) 2008 Nick Shaforostoff <shaforostoff@kde.ru>
- *
- * based on work by:
- * Copyright (C) 2007 Thomas Georgiou <TAGeorgiou@gmail.com> and Jeff Cooper <weirdsox11@gmail.com>
- *
- * 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. If not, see <http://www.gnu.org/licenses/>.
- */
- #include "dict.h"
- #include <QGraphicsProxyWidget>
- #include <QGraphicsLinearLayout>
- #include <QTimer>
- // #include <QWebView>
- #include <QTextBrowser>
- #include <KDebug>
- #include <KIcon>
- #include <KStandardDirs>
- #include <KLineEdit>
- #include <KEditListBox>
- #include <QListView>
- #include <QTreeView>
- #include <QStringListModel>
- #include <KConfigDialog>
- #include <KConfigGroup>
- #include <Plasma/Animator>
- #include <Plasma/IconWidget>
- #include <Plasma/LineEdit>
- #define AUTO_DEFINE_TIMEOUT 500
- using namespace Plasma;
- const char* translationCSS =
- "body {\n"
- "font-size: 10pt; }\n"
- "font.dict_name {\n"
- "color: blue;\n"
- "font-style: italic; }\n"
- "font.title {\n"
- "font-size: 16pt;\n"
- "font-weight: bold; }\n"
- "font.explanation {\n"
- "color: #7f7f7f;\n"
- "font-style: italic; }\n"
- "font.abbreviature {\n"
- "font-style: italic; }\n"
- "font.example {\n"
- "font-style: italic; }\n"
- "font.transcription {\n"
- "font-weight: bold; }\n";
- QStarDictApplet::QStarDictApplet(QObject *parent, const QVariantList &args)
- : Plasma::Applet(parent, args)
- , m_dictsModel(0)
- //m_flash(0)
- {
- setHasConfigurationInterface(true);
- setAspectRatioMode(Plasma::IgnoreAspectRatio);
- resize(500,200);
- }
- QStarDictApplet::~QStarDictApplet()
- {
- m_defBrowser->deleteLater();
- }
- void QStarDictApplet::init()
- {
- // KConfigGroup cg = config();
- m_wordEdit = new LineEdit(this);
- m_wordEdit->nativeWidget()->setClearButtonShown( true );
- m_wordEdit->nativeWidget()->setClickMessage(i18n("Enter word to define here"));
- m_wordEdit->show();
- Plasma::Animator::self()->animateItem(m_wordEdit, Plasma::Animator::AppearAnimation);
- // m_defBrowser = new QWebView();
- m_defBrowser = new QTextBrowser();
- m_defBrowser->document()->setDefaultStyleSheet(QLatin1String(translationCSS));
- m_defBrowserProxy = new QGraphicsProxyWidget(this);
- m_defBrowserProxy->setWidget(m_defBrowser);
- m_defBrowserProxy->hide();
- // Icon in upper-left corner
- QString iconpath = KStandardDirs::locate("icon", "oxygen/scalable/apps/accessories-dictionary.svgz");
- m_icon = new Plasma::IconWidget(this);
- m_icon->setSvg(iconpath);
- // Position lineedits
- //const int wordEditOffset = 40;
- m_icon->setPos(12,3);
- //m_wordProxyWidget->setPos(15 + wordEditOffset,7);
- //m_wordProxyWidget->show();
- // TODO m_wordEdit->setDefaultTextColor(Plasma::Theme::self()->color(Plasma::Theme::TextColor));
- // Timer for auto-define
- m_timer = new QTimer(this);
- m_timer->setInterval(AUTO_DEFINE_TIMEOUT);
- m_timer->setSingleShot(true);
- connect(m_timer, SIGNAL(timeout()), this, SLOT(define()));
- m_horLayout = new QGraphicsLinearLayout(Qt::Horizontal);
- m_horLayout->addItem(m_icon);
- m_horLayout->addItem(m_wordEdit);
- m_layout = new QGraphicsLinearLayout(Qt::Vertical);
- m_layout->addItem(m_horLayout);
- m_layout->addItem(m_defBrowserProxy);
- setLayout(m_layout);
- m_source.clear();
- dataEngine("qstardict")->connectSource(m_source, this);
- connect(m_wordEdit, SIGNAL(editingFinished()), this, SLOT(define()));
- connect(m_wordEdit->nativeWidget(), SIGNAL(textChanged(const QString&)), this, SLOT(autoDefine(const QString&)));
- dataEngine("qstardict")->connectSource("list-dictionaries", this);
- //connect(m_defEdit, SIGNAL(linkActivated(const QString&)), this, SLOT(linkDefine(const QString&)));
- // This is the fix for links/selecting text
- //QGraphicsItem::GraphicsItemFlags flags = m_defEdit->flags();
- //flags ^= QGraphicsItem::ItemIsMovable;
- // m_defEdit->setFlags(flags);
- /*m_flash = new Plasma::Flash(this);
- m_flash->setColor(Qt::gray);
- QFont fnt = qApp->font();
- fnt.setBold(true);
- m_flash->setFont(fnt);
- m_flash->setPos(25,-10);
- m_flash->resize(QSize(200,20));*/
- KConfigGroup cg = config();
- m_dicts = cg.readEntry("KnownDictionaries", QStringList());
- QStringList activeDictNames = cg.readEntry("ActiveDictionaries", QStringList());
- for (QStringList::const_iterator i = m_dicts.constBegin(); i != m_dicts.constEnd(); ++i)
- m_activeDicts[*i]=activeDictNames.contains(*i);
- }
- void QStarDictApplet::linkDefine(const QString &text)
- {
- kDebug() <<"ACTIVATED";
- m_wordEdit->setText(text);
- define();
- }
- void QStarDictApplet::dataUpdated(const QString& source, const Plasma::DataEngine::Data &data)
- {
- if (source=="list-dictionaries")
- {
- QStringList newDicts=data["dictionaries"].toStringList();
- bool changed=false;
- for (QStringList::const_iterator i = newDicts.constBegin(); i != newDicts.constEnd(); ++i)
- {
- if (!m_dicts.contains(*i))
- {
- m_dicts<<*i;
- m_activeDicts[*i]=true;
- changed=true;
- }
- }
- QStringList::iterator it = m_dicts.begin();
- while (it != m_dicts.end())
- {
- if (!newDicts.contains(*it))
- {
- it=m_dicts.erase(it);
- changed=true;
- }
- else
- ++it;
- }
- if (changed)
- configAccepted();
- // cg.writeEntry("KnownDictionaries", m_dicts);
- }
- // Q_UNUSED(source);
- /*if (m_flash) {
- m_flash->kill();
- }*/
- if (!m_source.isEmpty()) {
- m_defBrowserProxy->show();
- // TODO Phase::self()->animateItem(m_defBrowserProxy, Phase::Appear);
- }
- /* if (data.contains("gcide")) {
- QString defHeader;
- m_defList = data[QString("gcide")].toString().split("<!--PAGE START-->"); //<!--DEFINITION START-->
- for (int n = 0; n < m_defList.size(); ++n)
- {
- if (m_defList[n].contains("<!--DEFINITION START-->") && m_defList[n].contains("<!--PERIOD-->")) {
- defHeader=m_defList[n];
- } else if (m_defList[n].contains("<!--DEFINITION START-->")) {
- defHeader=m_defList.takeAt(n);
- }
- if (n < m_defList.size() && !m_defList[n].contains("<!--DEFINITION START-->"))
- m_defList[n].prepend(defHeader);
- }
- if (m_defList.size() > 1)
- m_defList.removeAt(0);
- m_i = m_defList.begin();
- m_defEdit->setHtml(*m_i);
- if (m_i != --m_defList.end())
- m_rightArrow->show();
- else
- m_rightArrow->hide();
- m_leftArrow->hide();
- } */
- if (data.contains("text")) {
- m_defBrowser->setHtml(data[QString("text")].toString());
- // m_defBrowser->setHtml(wnToHtml(data[QString("wn")].toString()));
- }
- updateGeometry();
- }
- void QStarDictApplet::define()
- {
- if (m_timer->isActive())
- m_timer->stop();
- QString newSource=m_wordEdit->text();
- QStringList dictsList;
- for (QStringList::const_iterator i = m_dicts.constBegin(); i != m_dicts.constEnd(); ++i)
- if (m_activeDicts.contains(*i) && m_activeDicts.value(*i))
- dictsList<<*i;
- if (!newSource.isEmpty() && !dictsList.isEmpty())
- newSource.prepend(dictsList.join(",")+':');
- if (newSource == m_source)
- return;
- dataEngine("qstardict")->disconnectSource(m_source, this);
- qWarning()<<"here"<<newSource;
- if (!newSource.isEmpty())
- { //get new definition
- //m_flash->flash(i18n("Looking up ") + m_word);
- m_source = newSource;
- dataEngine("qstardict")->connectSource(m_source, this);
- qWarning()<<"connectSource"<<m_source;
- }
- else
- { //make the definition box disappear
- // TODO Phase::self()->animateItem(m_defBrowserProxy, Phase::Disappear);
- m_defBrowserProxy->hide();
- }
- updateConstraints();
- }
- void QStarDictApplet::autoDefine(const QString &word)
- {
- Q_UNUSED(word)
- m_timer->start();
- }
- class CheckableStringListModel: public QStringListModel
- {
- public:
- CheckableStringListModel(QObject* parent, const QStringList& dicts, const QHash<QString,bool>& activeDicts_)
- : QStringListModel(parent)
- , activeDicts(activeDicts_)
- {
- setStringList(dicts);
- /* setHeaderData (0, Qt::Horizontal, "020", Qt::DisplayRole);
- setHeaderData (0, Qt::Vertical, "020", Qt::DisplayRole);*/
- }
- QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const
- {
- if (role!=Qt::DisplayRole)
- return QVariant();
- return i18n("Dictionary");
- }
- Qt::DropActions supportedDropActions(){return Qt::MoveAction;}
- Qt::ItemFlags flags(const QModelIndex& index) const
- {
- if (!index.isValid())
- return Qt::ItemIsEnabled | Qt::ItemIsDropEnabled;
- return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled;
- }
- bool setData (const QModelIndex& index, const QVariant& value, int role=Qt::EditRole)
- {
- if (role==Qt::CheckStateRole)
- {
- activeDicts[stringList().at(index.row())]=value.toInt()==Qt::Checked;
- return true;
- }
- else
- return QStringListModel::setData(index,value,role);
- }
- QVariant data(const QModelIndex& index, int role=Qt::EditRole) const
- {
- if (!index.isValid())
- return QVariant();
- if (role==Qt::CheckStateRole)
- return ( activeDicts.contains(stringList().at(index.row()))&&activeDicts.value(stringList().at(index.row())) )?Qt::Checked:Qt::Unchecked;
- return QStringListModel::data(index,role);
- }
- public:
- QHash<QString,bool> activeDicts;
- };
- void QStarDictApplet::createConfigurationInterface(KConfigDialog *parent)
- {
- // KConfigGroup cg = config();
- //QWidget *widget = new QWidget(parent);
- // QListView* widget=new KEditListBox(i18n("Dictionaries activation and order"),
- // KEditListBox::CustomEditor::CustomEditor(),
- // parent,
- // "dict-order",
- // false,
- // KEditListBox::UpDown);
- // QListView* widget=new QListView(parent);
- QTreeView* widget=new QTreeView(parent);
- widget->setDragEnabled(true);
- widget->setAcceptDrops(true);
- // widget->viewposrt()->setAcceptDrops(true);
- widget->setDragDropMode(QAbstractItemView::InternalMove);
- widget->setDropIndicatorShown(true);
- widget->setItemsExpandable(false);
- widget->setAllColumnsShowFocus(true);
- widget->setRootIsDecorated(false);
- delete m_dictsModel;
- m_dictsModel=new CheckableStringListModel(parent,m_dicts,m_activeDicts);
- widget->setModel(m_dictsModel);
- // parent->setButtons( KDialog::Ok | KDialog::Cancel | KDialog::Apply );
- parent->addPage(widget, parent->windowTitle(), Applet::icon());
- connect(parent, SIGNAL(applyClicked()), this, SLOT(configAccepted()));
- connect(parent, SIGNAL(okClicked()), this, SLOT(configAccepted()));
- }
- void QStarDictApplet::configAccepted()
- {
- if (m_dictsModel)
- {
- m_dicts=m_dictsModel->stringList();
- m_activeDicts=m_dictsModel->activeDicts;
- }
- KConfigGroup cg = config();
- cg.writeEntry("KnownDictionaries", m_dicts);
- QStringList activeDictNames;
- for (QStringList::const_iterator i = m_dicts.constBegin(); i != m_dicts.constEnd(); ++i)
- if (m_activeDicts.contains(*i) && m_activeDicts.value(*i))
- activeDictNames<<*i;
- cg.writeEntry("ActiveDictionaries", activeDictNames);
- define();
- emit configNeedsSaving();
- }
- #include "dict.moc"
|