/*********************************************************************************** * Spell Check: Plasmoid for fast spell checking. * Copyright (C) 2008 - 2010 Michal Dutkiewicz aka Emdek * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***********************************************************************************/ #include "SpellCheck.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include K_EXPORT_PLASMA_APPLET(spellcheck, SpellCheck) SpellCheck::SpellCheck(QObject *parent, const QVariantList &args) : Plasma::Applet(parent, args), m_textEdit(NULL), m_spellingDialog(NULL), m_dictionaryComboBox(NULL), m_dragTimer(0) { KGlobal::locale()->insertCatalog("spellcheck"); setAspectRatioMode(Plasma::ConstrainedSquare); setAcceptDrops(true); const int iconSize = KIconLoader::SizeSmallMedium; resize(iconSize, iconSize); } SpellCheck::~SpellCheck() { delete m_spellingDialog; } void SpellCheck::init() { Plasma::IconWidget *icon = new Plasma::IconWidget(KIcon("tools-check-spelling"), QString(), this); registerAsDragHandle(icon); QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); layout->addItem(icon); Plasma::ToolTipManager::self()->setContent(this, Plasma::ToolTipContent(i18n("Spell Checking"), i18n("Check spelling of clipboard contents."), icon->icon().pixmap(IconSize(KIconLoader::Desktop)))); connect(this, SIGNAL(activate()), this, SLOT(toggleDialog())); connect(icon, SIGNAL(clicked()), this, SLOT(toggleDialog())); } void SpellCheck::dragEnterEvent(QGraphicsSceneDragDropEvent *event) { if (!m_spellingDialog || !m_spellingDialog->isVisible()) { m_dragTimer = startTimer(500); } Plasma::Applet::dragEnterEvent(event); } void SpellCheck::dragLeaveEvent(QGraphicsSceneDragDropEvent *event) { if (m_dragTimer) { killTimer(m_dragTimer); m_dragTimer = 0; } Plasma::Applet::dragLeaveEvent(event); } void SpellCheck::dropEvent(QGraphicsSceneDragDropEvent *event) { if (m_dragTimer) { killTimer(m_dragTimer); m_dragTimer = 0; } if (!KUrl::List::canDecode(event->mimeData())) { if (event->mimeData()->hasText()) { if (!m_spellingDialog || !m_spellingDialog->isVisible()) { toggleDialog(false); } m_textEdit->setText(event->mimeData()->text()); event->accept(); } else { event->ignore(); } return; } if (!m_spellingDialog || !m_spellingDialog->isVisible()) { toggleDialog(false); m_textEdit->clear(); } KUrl::List droppedUrls = KUrl::List::fromMimeData(event->mimeData()); QTextCursor cursor = m_textEdit->textCursor(); for (int i = 0; i < droppedUrls.count(); ++i) { QFile file(droppedUrls.at(i).toLocalFile()); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream contents(file.readAll()); contents.setAutoDetectUnicode(true); cursor.insertText(contents.readAll()); } file.close(); } event->accept(); } void SpellCheck::mousePressEvent(QGraphicsSceneMouseEvent *event) { Applet::mousePressEvent(event); if (event->button() == Qt::MiddleButton) { event->accept(); } } void SpellCheck::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { Applet::mouseReleaseEvent(event); if (event->button() == Qt::MiddleButton) { toggleDialog(true, false); } } void SpellCheck::timerEvent(QTimerEvent *event) { if (event->timerId() == m_dragTimer) { if (!m_spellingDialog || !m_spellingDialog->isVisible()) { toggleDialog(false); } killTimer(m_dragTimer); m_dragTimer = 0; } } void SpellCheck::configChanged() { if (m_spellingDialog) { m_spellingDialog->resize(config().readEntry("dialogSize", m_spellingDialog->size())); } if (m_textEdit) { setLanguage(config().readEntry("dictionary", m_textEdit->highlighter()->currentLanguage())); } } void SpellCheck::toggleDialog(bool pasteText, bool preferSelection) { if (!m_spellingDialog) { m_spellingDialog = new Plasma::Dialog(); KWindowSystem::setState(m_spellingDialog->effectiveWinId(), NET::SkipTaskbar|NET::SkipPager); m_spellingDialog->setFocusPolicy(Qt::NoFocus); m_spellingDialog->setWindowTitle(i18n("Spell checking")); m_spellingDialog->setWindowIcon(KIcon("tools-check-spelling")); m_spellingDialog->setResizeHandleCorners(Plasma::Dialog::All); m_textEdit = new KTextEdit(m_spellingDialog); m_textEdit->enableFindReplace(false); m_textEdit->setCheckSpellingEnabled(true); m_textEdit->createHighlighter(); m_dictionaryComboBox = new KSpellDictionaryComboBox(m_spellingDialog); m_dictionaryComboBox->setToolTip(i18n("Language")); KAction *copyAction = new KAction(KIcon("edit-copy"), i18n("Copy"), m_spellingDialog); KAction *closeAction = new KAction(KIcon("dialog-close"), i18n("Close"), m_spellingDialog); QToolButton *copyButton = new QToolButton(m_spellingDialog); copyButton->setDefaultAction(copyAction); QToolButton *closeButton = new QToolButton(m_spellingDialog); closeButton->setDefaultAction(closeAction); QHBoxLayout *horizontalLayout = new QHBoxLayout; horizontalLayout->addWidget(m_dictionaryComboBox); horizontalLayout->addWidget(copyButton); horizontalLayout->addWidget(closeButton); QVBoxLayout *verticalLayout = new QVBoxLayout(m_spellingDialog); verticalLayout->setSpacing(0); verticalLayout->setMargin(0); verticalLayout->addWidget(m_textEdit); verticalLayout->addLayout(horizontalLayout); configChanged(); connect(m_spellingDialog, SIGNAL(dialogResized()), this, SLOT(dialogResized())); connect(copyAction, SIGNAL(triggered()), this, SLOT(copyToClipboard())); connect(closeAction, SIGNAL(triggered()), this, SLOT(toggleDialog())); connect(m_textEdit, SIGNAL(languageChanged(QString)), this, SLOT(setLanguage(QString))); connect(m_dictionaryComboBox, SIGNAL(dictionaryChanged(QString)), this, SLOT(setLanguage(QString))); } if (m_spellingDialog->isVisible()) { m_spellingDialog->animatedHide(Plasma::locationToInverseDirection(location())); m_textEdit->clear(); } else { m_spellingDialog->move(popupPosition(m_spellingDialog->sizeHint())); m_spellingDialog->animatedShow(Plasma::locationToDirection(location())); if (pasteText) { m_textEdit->setText((!preferSelection || QApplication::clipboard()->text(QClipboard::Selection).isEmpty()) ? QApplication::clipboard()->text(QClipboard::Clipboard) : QApplication::clipboard()->text(QClipboard::Selection)); } m_textEdit->setFocus(); } } void SpellCheck::dialogResized() { if (!m_spellingDialog) { return; } config().writeEntry("dialogSize", m_spellingDialog->size()); emit configNeedsSaving(); } void SpellCheck::copyToClipboard() { if (!m_textEdit) { return; } if (!m_textEdit->textCursor().selectedText().isEmpty()) { QApplication::clipboard()->setText(m_textEdit->textCursor().selectedText()); } else { QApplication::clipboard()->setText(m_textEdit->toPlainText()); } } void SpellCheck::setLanguage(const QString &language) { if (language != m_textEdit->spellCheckingLanguage()) { m_textEdit->setSpellCheckingLanguage(language); } m_dictionaryComboBox->setCurrentByDictionary(language); config().writeEntry("dictionary", language); emit configNeedsSaving(); } #include "moc_SpellCheck.cpp"