diff --git a/CMakeLists.txt b/CMakeLists.txt index 39a941d..c778e3a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,119 +1,120 @@ cmake_minimum_required(VERSION 3.0) -set(PIM_VERSION "5.9.40") +set(PIM_VERSION "5.9.41") project(libksieve VERSION ${PIM_VERSION}) set(KF5_VERSION "5.50.0") find_package(ECM ${KF5_VERSION} CONFIG REQUIRED) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) if (POLICY CMP0053) cmake_policy(SET CMP0053 NEW) endif() set(LIBRARY_NAMELINK) include(GenerateExportHeader) include(ECMGenerateHeaders) include(ECMGeneratePriFile) include(CMakePackageConfigHelpers) include(ECMSetupVersion) include(FeatureSummary) include(KDEInstallDirs) include(KDECMakeSettings) include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE) include(ECMQtDeclareLoggingCategory) include(ECMAddTests) include(ECMCoverageOption) set(LIBKSIEVE_LIB_VERSION ${PIM_VERSION}) set(QT_REQUIRED_VERSION "5.9.0") set(KMIME_LIB_VERSION "5.9.40") set(IDENTITYMANAGEMENT_LIB_VERSION "5.9.40") set(KMAILTRANSPORT_LIB_VERSION "5.9.40") set(KPIMTEXTEDIT_LIB_VERSION "5.9.40") set(LIBKDEPIM_LIB_VERSION "5.9.40") set(PIMCOMMON_LIB_VERSION "5.9.40") set(KIMAP_LIB_VERSION "5.9.40") option(KDEPIM_ENTERPRISE_BUILD "Enable features specific to the enterprise branch, which are normally disabled. Also, it disables many components not needed for Kontact such as the Kolab client." FALSE) # Look for Sasl2 before anything else find_package(Sasl2) set_package_properties(Sasl2 PROPERTIES TYPE REQUIRED) find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Widgets PrintSupport WebEngine WebEngineWidgets) find_package(KF5I18n ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5DocTools ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5KIO ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5IconThemes ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5PimCommon ${PIMCOMMON_LIB_VERSION} CONFIG REQUIRED) find_package(KF5Libkdepim ${LIBKDEPIM_LIB_VERSION} CONFIG REQUIRED) find_package(KF5NewStuff ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5WindowSystem ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5Archive ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5SyntaxHighlighting ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5Mime ${KMIME_LIB_VERSION} CONFIG REQUIRED) find_package(KF5IdentityManagement ${IDENTITYMANAGEMENT_LIB_VERSION} CONFIG REQUIRED) find_package(KF5MailTransport ${KMAILTRANSPORT_LIB_VERSION} CONFIG REQUIRED) find_package(KF5PimTextEdit ${KPIMTEXTEDIT_LIB_VERSION} CONFIG REQUIRED) find_package(KF5IMAP ${KIMAP_LIB_VERSION} CONFIG REQUIRED) find_package(KF5Purpose CONFIG QUIET) set_package_properties(KF5Purpose PROPERTIES DESCRIPTION "Support for sharing file" TYPE OPTIONAL ) if (KF5Purpose_FOUND) message(STATUS "Found KF5 Purpose, filesharing enabled") set(KF5_USE_PURPOSE true) + add_definitions(-DKF5_USE_PURPOSE) else() message(STATUS "KF5 Purpose not found, filesharing disabled") endif() ecm_setup_version(PROJECT VARIABLE_PREFIX LIBKSIEVE VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/libksieve_version.h" PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5LibKSieveConfigVersion.cmake" SOVERSION 5 ) ########### Targets ########### add_definitions("-DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII") add_definitions(-DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT) add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x060000) add_definitions(-DQT_NO_URL_CAST_FROM_STRING) add_definitions(-DQT_USE_QSTRINGBUILDER) ########### CMake Config Files ########### set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5LibKSieve") configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/KF5LibKSieveConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/KF5LibKSieveConfig.cmake" INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/KF5LibKSieveConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/KF5LibKSieveConfigVersion.cmake" DESTINATION "${CMAKECONFIG_INSTALL_DIR}" COMPONENT Devel ) install(EXPORT KF5KSieveTargets DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE KF5LibKSieveTargets.cmake NAMESPACE KF5::) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libksieve_version.h DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5} COMPONENT Devel ) if(BUILD_TESTING) find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED COMPONENTS Test) add_subdirectory(autotests) endif() add_subdirectory(src) add_subdirectory(kioslave) install( FILES libksieve.categories libksieve.renamecategories DESTINATION ${KDE_INSTALL_CONFDIR} ) feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/src/config-libksieve.h.cmake b/src/config-libksieve.h.cmake index d381b6b..d7b8e56 100644 --- a/src/config-libksieve.h.cmake +++ b/src/config-libksieve.h.cmake @@ -1,5 +1,3 @@ /* The size of a `unsigned long', as computed by sizeof. */ #define SIZEOF_UNSIGNED_LONG ${SIZEOF_UNSIGNED_LONG} -#cmakedefine KF5_USE_PURPOSE 1 - diff --git a/src/ksieveui/editor/sieveeditorwidget.cpp b/src/ksieveui/editor/sieveeditorwidget.cpp index f30a350..d6ffdc2 100644 --- a/src/ksieveui/editor/sieveeditorwidget.cpp +++ b/src/ksieveui/editor/sieveeditorwidget.cpp @@ -1,730 +1,790 @@ /* Copyright (C) 2014-2018 Laurent Montel This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "sieveeditorwidget.h" #include "sieve-editor.h" #include "sieveeditortextmodewidget.h" #include "scriptsparsing/parsingutil.h" #include "autocreatescripts/sieveeditorgraphicalmodewidget.h" #include "autocreatescripts/sievescriptparsingerrordialog.h" #include "sieveeditormenubar.h" #include #include #include #include #include #include #include -#include +#include + +#ifdef KF5_USE_PURPOSE +#include +#include +#include +#endif #include #include #include #include #include #include #include "libksieve_debug.h" #include #include #include +#include using namespace KSieveUi; SieveEditorWidget::SieveEditorWidget(bool useMenuBar, QWidget *parent) : QWidget(parent) { QVBoxLayout *lay = new QVBoxLayout(this); mDebug = !qEnvironmentVariableIsEmpty("KDEPIM_DEBUGGING"); QToolBar *toolbar = new QToolBar; toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); mCheckSyntax = new QAction(i18n("Check Syntax"), this); connect(mCheckSyntax, &QAction::triggered, this, &SieveEditorWidget::slotCheckSyntax); toolbar->addAction(mCheckSyntax); mSaveAs = KStandardAction::saveAs(this, &SieveEditorWidget::slotSaveAs, this); toolbar->addAction(mSaveAs); toolbar->addAction(i18n("Import..."), this, &SieveEditorWidget::slotImport); mCreateRulesGraphically = new QAction(i18n("Create Rules Graphically..."), this); connect(mCreateRulesGraphically, &QAction::triggered, this, &SieveEditorWidget::slotCreateRulesGraphically); toolbar->addAction(mCreateRulesGraphically); mSwitchMode = new QAction(this); toolbar->addAction(mSwitchMode); connect(mSwitchMode, &QAction::triggered, this, &SieveEditorWidget::slotSwitchMode); if (mDebug) { //Not necessary to translate it. mGenerateXml = new QAction(QStringLiteral("Generate xml"), this); connect(mGenerateXml, &QAction::triggered, this, &SieveEditorWidget::slotGenerateXml); toolbar->addAction(mGenerateXml); } QStringList overlays; overlays << QStringLiteral("list-add"); - mShareScript = new QAction(QIcon(new KIconEngine(QStringLiteral("get-hot-new-stuff"), KIconLoader::global(), overlays)), i18n("Share..."), this); + mShareScript = new QAction(QIcon(new KIconEngine(QStringLiteral("get-hot-new-stuff"), KIconLoader::global(), overlays)), i18n("Share Script..."), this); connect(mShareScript, &QAction::triggered, this, &SieveEditorWidget::slotShareScript); //Add action to toolBar toolbar->addAction(mShareScript); +#ifdef KF5_USE_PURPOSE + mShareAction = new QAction(i18n("Share..."), this); + mShareMenu = new Purpose::Menu(this); + mShareMenu->model()->setPluginType(QStringLiteral("Export")); + connect(mShareMenu, &Purpose::Menu::aboutToShow, this, &SieveEditorWidget::slotInitializeShareMenu); + mShareAction->setMenu(mShareMenu); + mShareAction->setIcon( QIcon::fromTheme(QStringLiteral("document-share"))); + connect(mShareMenu, &Purpose::Menu::finished, this, &SieveEditorWidget::slotShareActionFinished); + toolbar->addAction(mShareAction); +#endif + SieveEditorMenuBar *menuBar = nullptr; if (useMenuBar) { menuBar = new SieveEditorMenuBar; connect(this, &SieveEditorWidget::changeModeEditor, menuBar, &SieveEditorMenuBar::setEditorMode); connect(menuBar, &SieveEditorMenuBar::copy, this, &SieveEditorWidget::copy); connect(menuBar, &SieveEditorMenuBar::find, this, &SieveEditorWidget::find); connect(menuBar, &SieveEditorMenuBar::replace, this, &SieveEditorWidget::replace); connect(menuBar, &SieveEditorMenuBar::undo, this, &SieveEditorWidget::undo); connect(menuBar, &SieveEditorMenuBar::redo, this, &SieveEditorWidget::redo); connect(menuBar, &SieveEditorMenuBar::paste, this, &SieveEditorWidget::paste); connect(menuBar, &SieveEditorMenuBar::cut, this, &SieveEditorWidget::cut); connect(menuBar, &SieveEditorMenuBar::selectAll, this, &SieveEditorWidget::selectAll); connect(menuBar, &SieveEditorMenuBar::gotoLine, this, &SieveEditorWidget::goToLine); connect(menuBar, &SieveEditorMenuBar::comment, this, &SieveEditorWidget::comment); connect(menuBar, &SieveEditorMenuBar::uncomment, this, &SieveEditorWidget::uncomment); connect(menuBar, &SieveEditorMenuBar::zoomIn, this, &SieveEditorWidget::zoomIn); connect(menuBar, &SieveEditorMenuBar::zoomOut, this, &SieveEditorWidget::zoomOut); connect(menuBar, &SieveEditorMenuBar::zoomReset, this, &SieveEditorWidget::zoomReset); connect(menuBar, &SieveEditorMenuBar::debugSieveScript, this, &SieveEditorWidget::debugSieveScript); connect(menuBar, &SieveEditorMenuBar::wordWrap, this, &SieveEditorWidget::wordWrap); connect(menuBar, &SieveEditorMenuBar::print, this, &SieveEditorWidget::print); connect(menuBar, &SieveEditorMenuBar::printPreview, this, &SieveEditorWidget::printPreview); connect(this, &SieveEditorWidget::copyAvailable, menuBar, &SieveEditorMenuBar::slotCopyAvailable); connect(this, &SieveEditorWidget::redoAvailable, menuBar, &SieveEditorMenuBar::slotRedoAvailable); connect(this, &SieveEditorWidget::undoAvailable, menuBar, &SieveEditorMenuBar::slotUndoAvailable); menuBar->fileMenu()->addSeparator(); menuBar->fileMenu()->addAction(mSaveAs); menuBar->fileMenu()->addSeparator(); menuBar->fileMenu()->addAction(mShareScript); menuBar->toolsMenu()->addSeparator(); +#ifdef KF5_USE_PURPOSE + menuBar->fileMenu()->addAction(mShareAction); + menuBar->toolsMenu()->addSeparator(); +#endif menuBar->toolsMenu()->addAction(mCreateRulesGraphically); menuBar->toolsMenu()->addAction(mCheckSyntax); lay->addWidget(menuBar); } lay->addWidget(toolbar); QHBoxLayout *nameLayout = new QHBoxLayout; QLabel *label = new QLabel(i18n("Script name:")); nameLayout->addWidget(label); mScriptName = new QLineEdit; mScriptName->setReadOnly(true); nameLayout->addWidget(mScriptName); lay->addLayout(nameLayout); lay->setMargin(0); mStackedWidget = new QStackedWidget; mTextModeWidget = new SieveEditorTextModeWidget; connect(mTextModeWidget, &SieveEditorTextModeWidget::valueChanged, this, &SieveEditorWidget::slotModified); if (menuBar) { menuBar->setTextModeWidget(mTextModeWidget); } mStackedWidget->addWidget(mTextModeWidget); mGraphicalModeWidget = new SieveEditorGraphicalModeWidget; connect(mGraphicalModeWidget, &SieveEditorGraphicalModeWidget::valueChanged, this, &SieveEditorWidget::slotModified); mStackedWidget->addWidget(mGraphicalModeWidget); lay->addWidget(mStackedWidget); connect(mTextModeWidget, &SieveEditorTextModeWidget::enableButtonOk, this, &SieveEditorWidget::slotEnableButtonOk); connect(mGraphicalModeWidget, &SieveEditorGraphicalModeWidget::enableButtonOk, this, &SieveEditorWidget::slotEnableButtonOk); connect(mGraphicalModeWidget, &SieveEditorGraphicalModeWidget::switchTextMode, this, &SieveEditorWidget::slotSwitchTextMode); connect(mTextModeWidget, &SieveEditorTextModeWidget::switchToGraphicalMode, this, &SieveEditorWidget::slotSwitchToGraphicalMode); connect(mTextModeWidget, &SieveEditorTextModeWidget::undoAvailable, this, &SieveEditorWidget::undoAvailable); connect(mTextModeWidget, &SieveEditorTextModeWidget::redoAvailable, this, &SieveEditorWidget::redoAvailable); connect(mTextModeWidget, &SieveEditorTextModeWidget::copyAvailable, this, &SieveEditorWidget::copyAvailable); connect(mTextModeWidget, &SieveEditorTextModeWidget::sieveEditorTabCurrentChanged, this, &SieveEditorWidget::sieveEditorTabCurrentChanged); if (KSieveUi::EditorSettings::useGraphicEditorByDefault()) { changeMode(GraphicMode); } else { changeSwitchButtonText(); } } SieveEditorWidget::~SieveEditorWidget() { +#ifdef KF5_USE_PURPOSE + delete mTemporaryShareFile; +#endif +} + +void SieveEditorWidget::slotInitializeShareMenu() +{ +#ifdef KF5_USE_PURPOSE + delete mTemporaryShareFile; + mTemporaryShareFile = new QTemporaryFile(); + mTemporaryShareFile->open(); + mTemporaryShareFile->setPermissions(QFile::ReadUser); + mTemporaryShareFile->write(script().toUtf8()); + mTemporaryShareFile->close(); + mShareMenu->model()->setInputData(QJsonObject { + { QStringLiteral("urls"), QJsonArray { {mTemporaryShareFile->fileName()} } }, + { QStringLiteral("mimeType"), { QStringLiteral("text/plain") } } + }); + mShareMenu->reload(); +#endif +} + +void SieveEditorWidget::slotShareActionFinished(const QJsonObject &output, int error, const QString &message) +{ +#ifdef KF5_USE_PURPOSE + if (error) { + KMessageBox::error(this, i18n("There was a problem sharing the document: %1", message), + i18n("Share")); + } else { + const QString url = output[QLatin1String("url")].toString(); + if (url.isEmpty()) { + KMessageBox::information(this, i18n("File was shared.")); + } else { + KMessageBox::information(this, i18n("You can find the new request at:
%1
", url), + QString(), QString(), KMessageBox::AllowLink); + } + } +#endif } void SieveEditorWidget::setReadOnly(bool b) { mTextModeWidget->setReadOnly(b); mGraphicalModeWidget->setDisabled(b); } void SieveEditorWidget::slotModified() { mModified = true; Q_EMIT valueChanged(mModified); } bool SieveEditorWidget::isModified() const { return mModified; } void SieveEditorWidget::undo() { if (mMode == TextMode) { mTextModeWidget->undo(); } } void SieveEditorWidget::redo() { if (mMode == TextMode) { mTextModeWidget->redo(); } } void SieveEditorWidget::goToLine() { if (mMode == TextMode) { mTextModeWidget->slotShowGoToLine(); } } void SieveEditorWidget::cut() { if (mMode == TextMode) { mTextModeWidget->cut(); } } void SieveEditorWidget::paste() { if (mMode == TextMode) { mTextModeWidget->paste(); } } void SieveEditorWidget::copy() { if (mMode == TextMode) { mTextModeWidget->copy(); } } void SieveEditorWidget::zoomIn() { if (mMode == TextMode) { mTextModeWidget->zoomIn(); } } bool SieveEditorWidget::isWordWrap() const { if (mMode == TextMode) { return mTextModeWidget->isWordWrap(); } return false; } void SieveEditorWidget::updateOriginalScript() { mOriginalScript = script(); } void SieveEditorWidget::print() { switch (mMode) { case TextMode: { bool wasModified = isModified(); mTextModeWidget->print(); setModified(wasModified); break; } case GraphicMode: break; case Unknown: qCDebug(LIBKSIEVE_LOG) << " Unknown mode"; break; } } void SieveEditorWidget::printPreview() { switch (mMode) { case TextMode: { bool wasModified = isModified(); mTextModeWidget->printPreview(); setModified(wasModified); break; } case GraphicMode: break; case Unknown: qCDebug(LIBKSIEVE_LOG) << " Unknown mode"; break; } } void SieveEditorWidget::wordWrap(bool state) { if (mMode == TextMode) { mTextModeWidget->wordWrap(state); } } void SieveEditorWidget::zoomReset() { if (mMode == TextMode) { mTextModeWidget->zoomReset(); } } void SieveEditorWidget::zoomOut() { if (mMode == TextMode) { mTextModeWidget->zoomOut(); } } void SieveEditorWidget::selectAll() { if (mMode == TextMode) { mTextModeWidget->selectAll(); } } void SieveEditorWidget::find() { if (mMode == TextMode) { mTextModeWidget->find(); } } void SieveEditorWidget::replace() { if (mMode == TextMode) { mTextModeWidget->replace(); } } bool SieveEditorWidget::isUndoAvailable() const { if (mMode == TextMode) { return mTextModeWidget->isUndoAvailable(); } return false; } bool SieveEditorWidget::isRedoAvailable() const { if (mMode == TextMode) { return mTextModeWidget->isRedoAvailable(); } return false; } bool SieveEditorWidget::hasSelection() const { if (mMode == TextMode) { return mTextModeWidget->hasSelection(); } return false; } void SieveEditorWidget::comment() { if (mMode == TextMode) { mTextModeWidget->comment(); } } void SieveEditorWidget::uncomment() { if (mMode == TextMode) { mTextModeWidget->uncomment(); } } SieveEditorWidget::EditorMode SieveEditorWidget::mode() const { return mMode; } void SieveEditorWidget::setModified(bool b) { if (mModified != b) { mModified = b; Q_EMIT valueChanged(mModified); } } void SieveEditorWidget::slotShareScript() { QTemporaryDir tmp; QTemporaryFile tmpFile; if (tmpFile.open()) { QTextStream out(&tmpFile); out.setCodec("UTF-8"); out << script(); tmpFile.close(); const QString sourceName = mScriptName->text(); const QString zipFileName = tmp.path() + QDir::separator() + sourceName + QLatin1String(".zip"); KZip *zip = new KZip(zipFileName); if (zip->open(QIODevice::WriteOnly)) { if (zip->addLocalFile(tmpFile.fileName(), sourceName + QLatin1String(".siv"))) { zip->close(); QPointer dialog = new KNS3::UploadDialog(QStringLiteral("ksieve_script.knsrc"), this); dialog->setUploadFile(QUrl::fromLocalFile(zipFileName)); dialog->setUploadName(sourceName); dialog->setDescription(i18nc("Default description for the source", "My Sieve Script")); dialog->exec(); delete dialog; } else { zip->close(); } } delete zip; } else { qCWarning(LIBKSIEVE_LOG) << "Impossible to open temp file"; } } void SieveEditorWidget::changeMode(EditorMode mode) { if (mode != mMode) { mMode = mode; mStackedWidget->setCurrentIndex(static_cast(mode)); const bool isTextMode = (mMode == TextMode); mCreateRulesGraphically->setEnabled(isTextMode); if (mGenerateXml) { mGenerateXml->setEnabled(isTextMode); } if (isTextMode) { mCheckSyntax->setEnabled(!mTextModeWidget->currentscript().isEmpty()); } else { mCheckSyntax->setEnabled(false); } Q_EMIT modeEditorChanged(mode); Q_EMIT changeModeEditor(isTextMode); changeSwitchButtonText(); } } void SieveEditorWidget::changeSwitchButtonText() { mSwitchMode->setText((mMode == TextMode) ? i18n("Simple Mode") : i18n("Advanced Mode")); } void SieveEditorWidget::slotEnableButtonOk(bool b) { Q_EMIT enableButtonOk(b); mSaveAs->setEnabled(b); if (mMode == TextMode) { mCheckSyntax->setEnabled(b); } else { mCheckSyntax->setEnabled(false); } } QString SieveEditorWidget::script() const { QString currentScript; switch (mMode) { case TextMode: currentScript = mTextModeWidget->script(); break; case GraphicMode: currentScript = mGraphicalModeWidget->currentscript(); break; case Unknown: qCDebug(LIBKSIEVE_LOG) << " Unknown Mode!"; break; } return currentScript; } QString SieveEditorWidget::originalScript() const { return mOriginalScript; } void SieveEditorWidget::setScript(const QString &script, bool clearUndoRedo) { mTextModeWidget->setScript(script, clearUndoRedo); //Necessary to take text from editor otherwise script has \r\n mOriginalScript = mTextModeWidget->script(); } void SieveEditorWidget::addFailedMessage(const QString &err) { addMessageEntry(err, QColor(Qt::darkRed)); } void SieveEditorWidget::addOkMessage(const QString &msg) { addMessageEntry(msg, QColor(Qt::darkGreen)); } void SieveEditorWidget::addNormalMessage(const QString &msg) { addMessageEntry(msg, palette().color(QPalette::WindowText)); } void SieveEditorWidget::addMessageEntry(const QString &errorMsg, const QColor &color) { QString msg = errorMsg; msg.replace(QLatin1Char('\n'), QStringLiteral("
")); const QString logText = QStringLiteral("%2") .arg(color.name(), msg); setDebugScript(logText); } void SieveEditorWidget::setDebugScript(const QString &debug) { mTextModeWidget->setDebugScript(debug); } void SieveEditorWidget::setScriptName(const QString &name) { mScriptName->setText(name); } void SieveEditorWidget::resultDone() { mCheckSyntax->setEnabled(true); } void SieveEditorWidget::setSieveCapabilities(const QStringList &capabilities) { mTextModeWidget->setSieveCapabilities(capabilities); mGraphicalModeWidget->setSieveCapabilities(capabilities); } void SieveEditorWidget::setSieveImapAccountSettings(const SieveImapAccountSettings &sieveImapAccountSettings) { mGraphicalModeWidget->setSieveImapAccountSettings(sieveImapAccountSettings); mTextModeWidget->setSieveImapAccountSettings(sieveImapAccountSettings); } void SieveEditorWidget::setListOfIncludeFile(const QStringList &listOfIncludeFile) { mTextModeWidget->setListOfIncludeFile(listOfIncludeFile); mGraphicalModeWidget->setListOfIncludeFile(listOfIncludeFile); } void SieveEditorWidget::slotCreateRulesGraphically() { switch (mMode) { case TextMode: mTextModeWidget->createRulesGraphically(); break; case GraphicMode: case Unknown: break; } } void SieveEditorWidget::slotCheckSyntax() { switch (mMode) { case TextMode: mCheckSyntax->setEnabled(false); Q_EMIT checkSyntax(); break; case GraphicMode: case Unknown: break; } } void SieveEditorWidget::slotGenerateXml() { switch (mMode) { case TextMode: mTextModeWidget->generateXml(); break; case GraphicMode: case Unknown: break; } } void SieveEditorWidget::checkSpelling() { switch (mMode) { case TextMode: mTextModeWidget->checkSpelling(); break; case GraphicMode: case Unknown: break; } } void SieveEditorWidget::slotSaveAs() { switch (mMode) { case TextMode: mTextModeWidget->saveAs(mScriptName->text()); break; case GraphicMode: mGraphicalModeWidget->saveAs(mScriptName->text()); break; case Unknown: qCDebug(LIBKSIEVE_LOG) << " Unknown mode"; break; } } void SieveEditorWidget::slotImport() { switch (mMode) { case TextMode: mTextModeWidget->slotImport(); break; case GraphicMode: mGraphicalModeWidget->slotImport(); break; case Unknown: qCDebug(LIBKSIEVE_LOG) << " Unknown mode"; break; } } void SieveEditorWidget::slotSwitchToGraphicalMode() { mTextModeWidget->hideEditorWarning(); changeMode(GraphicMode); } void SieveEditorWidget::slotSwitchMode() { switch (mMode) { case TextMode: { bool result = false; const QString doc = ParsingUtil::parseScript(mTextModeWidget->currentscript(), result); if (result) { QString error; mGraphicalModeWidget->loadScript(doc, error); if (!error.isEmpty()) { mTextModeWidget->setParsingEditorWarningError(mTextModeWidget->currentscript(), error); mTextModeWidget->showParsingEditorWarning(); } else { mTextModeWidget->hideEditorWarning(); changeMode(GraphicMode); } } else { mTextModeWidget->showEditorWarning(); qCDebug(LIBKSIEVE_LOG) << "Impossible to parse file"; } break; } case GraphicMode: { const QString script = mGraphicalModeWidget->currentscript(); changeMode(TextMode); mTextModeWidget->setScript(script); break; } case Unknown: qCDebug(LIBKSIEVE_LOG) << " Unknown mode"; break; } } void SieveEditorWidget::slotSwitchTextMode(const QString &script) { changeMode(TextMode); mTextModeWidget->setScript(script); } void SieveEditorWidget::reverseCase() { if (mMode == TextMode) { mTextModeWidget->reverseCase(); } } void SieveEditorWidget::lowerCase() { if (mMode == TextMode) { mTextModeWidget->lowerCase(); } } void SieveEditorWidget::debugSieveScript() { if (mMode == TextMode) { mTextModeWidget->debugSieveScript(); } } void SieveEditorWidget::upperCase() { if (mMode == TextMode) { mTextModeWidget->upperCase(); } } void SieveEditorWidget::sentenceCase() { if (mMode == TextMode) { mTextModeWidget->sentenceCase(); } } void SieveEditorWidget::openBookmarkUrl(const QUrl &url) { if (mMode == TextMode) { mTextModeWidget->openBookmarkUrl(url); } } QString SieveEditorWidget::currentHelpTitle() const { if (mMode == TextMode) { return mTextModeWidget->currentHelpTitle(); } return QString(); } QUrl SieveEditorWidget::currentHelpUrl() const { if (mMode == TextMode) { return mTextModeWidget->currentHelpUrl(); } return QUrl(); } bool SieveEditorWidget::isTextEditor() const { if (mMode == TextMode) { return mTextModeWidget->isTextEditor(); } return false; } bool SieveEditorWidget::printSupportEnabled() const { if (mMode == TextMode) { return mTextModeWidget->printSupportEnabled(); } return false; } diff --git a/src/ksieveui/editor/sieveeditorwidget.h b/src/ksieveui/editor/sieveeditorwidget.h index 1bd34d4..84ef59c 100644 --- a/src/ksieveui/editor/sieveeditorwidget.h +++ b/src/ksieveui/editor/sieveeditorwidget.h @@ -1,149 +1,159 @@ /* Copyright (C) 2014-2018 Laurent Montel This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef SIEVEEDITORWIDGET_H #define SIEVEEDITORWIDGET_H #include "ksieveui_export.h" #include - +namespace Purpose { +class Menu; +} class QStackedWidget; class QLineEdit; class QAction; +class QTemporaryFile; namespace KSieveUi { class SieveImapAccountSettings; class SieveEditorTextModeWidget; class SieveEditorGraphicalModeWidget; class KSIEVEUI_EXPORT SieveEditorWidget : public QWidget { Q_OBJECT public: explicit SieveEditorWidget(bool useMenuBar, QWidget *parent = nullptr); ~SieveEditorWidget(); enum EditorMode { Unknown = -1, TextMode = 0, GraphicMode = 1 }; void setReadOnly(bool b); Q_REQUIRED_RESULT QString script() const; Q_REQUIRED_RESULT QString originalScript() const; void setScript(const QString &script, bool clearUndoRedo = false); void setDebugScript(const QString &debug); void setScriptName(const QString &name); void resultDone(); void setSieveCapabilities(const QStringList &capabilities); void setSieveImapAccountSettings(const SieveImapAccountSettings &sieveImapAccountSettings); void setListOfIncludeFile(const QStringList &listOfIncludeFile); void addFailedMessage(const QString &err); void addOkMessage(const QString &msg); void addNormalMessage(const QString &msg); void setModified(bool b); Q_REQUIRED_RESULT bool isModified() const; Q_REQUIRED_RESULT EditorMode mode() const; Q_REQUIRED_RESULT bool isRedoAvailable() const; Q_REQUIRED_RESULT bool isUndoAvailable() const; Q_REQUIRED_RESULT bool hasSelection() const; void checkSpelling(); void import(); void lowerCase(); void upperCase(); void sentenceCase(); void reverseCase(); void zoomOut(); void zoomIn(); Q_REQUIRED_RESULT QString currentHelpTitle() const; Q_REQUIRED_RESULT QUrl currentHelpUrl() const; void openBookmarkUrl(const QUrl &url); void debugSieveScript(); void zoomReset(); bool isWordWrap() const; void updateOriginalScript(); void print(); void printPreview(); bool printSupportEnabled() const; bool isTextEditor() const; public Q_SLOTS: void find(); void replace(); void undo(); void redo(); void paste(); void copy(); void cut(); void selectAll(); void goToLine(); void slotSaveAs(); void slotImport(); void slotShareScript(); void slotCreateRulesGraphically(); void slotCheckSyntax(); void comment(); void uncomment(); void wordWrap(bool state); Q_SIGNALS: void checkSyntax(); void enableButtonOk(bool b); void valueChanged(bool b); void modeEditorChanged(KSieveUi::SieveEditorWidget::EditorMode); void undoAvailable(bool); void redoAvailable(bool); void copyAvailable(bool); void changeModeEditor(bool); void sieveEditorTabCurrentChanged(); private: void slotEnableButtonOk(bool b); void slotGenerateXml(); void slotSwitchMode(); void slotSwitchTextMode(const QString &script); void slotSwitchToGraphicalMode(); void slotModified(); void changeSwitchButtonText(); void changeMode(EditorMode mode); void addMessageEntry(const QString &errorMsg, const QColor &color); + void slotInitializeShareMenu(); + void slotShareActionFinished(const QJsonObject &output, int error, const QString &message); QString mOriginalScript; SieveEditorTextModeWidget *mTextModeWidget = nullptr; SieveEditorGraphicalModeWidget *mGraphicalModeWidget = nullptr; QStackedWidget *mStackedWidget = nullptr; QLineEdit *mScriptName = nullptr; QAction *mCheckSyntax = nullptr; QAction *mSwitchMode = nullptr; QAction *mCreateRulesGraphically = nullptr; QAction *mSaveAs = nullptr; QAction *mShareScript = nullptr; QAction *mGenerateXml = nullptr; + QAction *mShareAction = nullptr; +#ifdef KF5_USE_PURPOSE + Purpose::Menu *mShareMenu = nullptr; + QTemporaryFile *mTemporaryShareFile = nullptr; +#endif EditorMode mMode = EditorMode::TextMode; bool mModified = false; bool mDebug = false; }; } #endif // SIEVEEDITORWIDGET_H