diff --git a/CMakeLists.txt b/CMakeLists.txt index 85e8c42..a9af6db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,82 +1,82 @@ project( sieveeditor ) if(${CMAKE_SOURCE_DIR} STREQUAL ${sieveeditor_SOURCE_DIR}) cmake_minimum_required(VERSION 3.1) set(KF5_VERSION "5.23.0") find_package(ECM ${KF5_VERSION} REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) include(ECMInstallIcons) include(ECMOptionalAddSubdirectory) include(ECMSetupVersion) include(ECMAddTests) include(ECMMarkNonGuiExecutable) include(GenerateExportHeader) include(ECMGenerateHeaders) include(CMakePackageConfigHelpers) include(FeatureSummary) include(CheckFunctionExists) include(ECMGeneratePriFile) include(KDEInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings NO_POLICY_SCOPE) include(ECMAddAppIcon) include(ECMQtDeclareLoggingCategory) # Do NOT add quote set(KDEPIM_DEV_VERSION beta1) # add an extra space if(DEFINED KDEPIM_DEV_VERSION) set(KDEPIM_DEV_VERSION " ${KDEPIM_DEV_VERSION}") endif() set(KDEPIM_VERSION_NUMBER "5.2.80") set(KDEPIM_VERSION "${KDEPIM_VERSION_NUMBER}${KDEPIM_DEV_VERSION}") set(KMAILTRANSPORT_LIB_VERSION "5.2.80") set(KPIMTEXTEDIT_LIB_VERSION "5.2.80") set(KDEPIM_LIB_VERSION "${KDEPIM_VERSION_NUMBER}") set(KDEPIM_LIB_SOVERSION "5") set(MESSAGELIB_LIB_VERSION_LIB "5.2.91") set(PIMCOMMON_LIB_VERSION_LIB "5.2.80") - set(LIBKSIEVE_LIB_VERSION_LIB "5.2.82") + set(LIBKSIEVE_LIB_VERSION_LIB "5.2.83") set(QT_REQUIRED_VERSION "5.6.0") find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Widgets Network Test) # Find KF5 package find_package(KF5DBusAddons ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5DocTools ${KF5_VERSION} REQUIRED) find_package(KF5Crash ${KF5_VERSION} REQUIRED) # Find KdepimLibs Package find_package(KF5PimTextEdit ${KPIMTEXTEDIT_LIB_VERSION} CONFIG REQUIRED) find_package(KF5MailTransport ${KMAILTRANSPORT_LIB_VERSION} CONFIG REQUIRED) find_package(KF5MessageViewer ${MESSAGELIB_LIB_VERSION_LIB} CONFIG REQUIRED) find_package(KF5PimCommon ${PIMCOMMON_LIB_VERSION_LIB} CONFIG REQUIRED) find_package(KF5LibKSieve ${LIBKSIEVE_LIB_VERSION_LIB} CONFIG REQUIRED) include_directories(${sieveeditor_SOURCE_DIR} ${sieveeditor_BINARY_DIR}) add_definitions(-DQT_NO_URL_CAST_FROM_STRING) endif() add_definitions(-DQT_USE_QSTRINGBUILDER) add_definitions( -DQT_NO_CAST_FROM_ASCII ) add_definitions( -DQT_NO_CAST_TO_ASCII ) add_subdirectory(src) if (BUILD_TESTING) add_subdirectory(autotests) endif() install( FILES sieveeditor.categories DESTINATION ${KDE_INSTALL_CONFDIR} ) if ("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) endif() diff --git a/src/sieveeditorpagewidget.cpp b/src/sieveeditorpagewidget.cpp index 2c47672..a53e62e 100644 --- a/src/sieveeditorpagewidget.cpp +++ b/src/sieveeditorpagewidget.cpp @@ -1,364 +1,371 @@ /* Copyright (C) 2014-2016 Montel Laurent 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; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "sieveeditorpagewidget.h" #include "ksieveui/sieveeditorwidget.h" #include "sieveeditorglobalconfig.h" #include #include #include #include "sieveeditor_debug.h" #include SieveEditorPageWidget::SieveEditorPageWidget(QWidget *parent) : QWidget(parent), mWasActive(false), mIsNewScript(false) { QVBoxLayout *vbox = new QVBoxLayout; setLayout(vbox); mSieveEditorWidget = new KSieveUi::SieveEditorWidget(false); connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::valueChanged, this, &SieveEditorPageWidget::slotValueChanged); vbox->addWidget(mSieveEditorWidget); connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::checkSyntax, this, &SieveEditorPageWidget::slotCheckSyntaxClicked); connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::modeEditorChanged, this, &SieveEditorPageWidget::modeEditorChanged); connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::undoAvailable, this, &SieveEditorPageWidget::undoAvailable); connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::redoAvailable, this, &SieveEditorPageWidget::redoAvailable); connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::copyAvailable, this, &SieveEditorPageWidget::copyAvailable); connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::sieveEditorTabCurrentChanged, this, &SieveEditorPageWidget::sieveEditorTabCurrentChanged); } SieveEditorPageWidget::~SieveEditorPageWidget() { } void SieveEditorPageWidget::slotCheckSyntaxClicked() { const QString script = mSieveEditorWidget->script(); if (script.isEmpty()) { return; + } + mSieveEditorWidget->addNormalMessage(i18n("Uploading script to server for checking it, please wait...")); KManageSieve::SieveJob *job = KManageSieve::SieveJob::put(mCurrentURL, script, mWasActive, mWasActive); - job->setInteractive(false); - connect(job, &KManageSieve::SieveJob::errorMessage, this, &SieveEditorPageWidget::slotPutResultDebug); + connect(job, &KManageSieve::SieveJob::result, this, &SieveEditorPageWidget::slotPutResultDebug); } -void SieveEditorPageWidget::slotPutResultDebug(KManageSieve::SieveJob *, bool success, const QString &errorMsg) +void SieveEditorPageWidget::slotPutResultDebug(KManageSieve::SieveJob *job, bool success) { if (success) { mSieveEditorWidget->addOkMessage(i18n("No errors found.")); } else { + const QString errorMsg = job->errorString(); if (errorMsg.isEmpty()) { mSieveEditorWidget->addFailedMessage(i18n("An unknown error was encountered.")); } else { mSieveEditorWidget->addFailedMessage(errorMsg); } } //Put original script after check otherwise we will put a script even if we don't click on ok - KManageSieve::SieveJob *job = KManageSieve::SieveJob::put(mCurrentURL, mSieveEditorWidget->originalScript(), mWasActive, mWasActive); - job->setInteractive(false); + KManageSieve::SieveJob *restoreJob = KManageSieve::SieveJob::put(mCurrentURL, mSieveEditorWidget->originalScript(), mWasActive, mWasActive); mSieveEditorWidget->resultDone(); } void SieveEditorPageWidget::setIsNewScript(bool isNewScript) { mIsNewScript = isNewScript; } void SieveEditorPageWidget::loadScript(const QUrl &url, const QStringList &capabilities) { mCurrentURL = url; mSieveEditorWidget->setSieveCapabilities(capabilities); mSieveEditorWidget->setReadOnly(true); mSieveEditorWidget->wordWrap(SieveEditorGlobalConfig::self()->wrapText()); KManageSieve::SieveJob *job = KManageSieve::SieveJob::get(url); connect(job, &KManageSieve::SieveJob::result, this, &SieveEditorPageWidget::slotGetResult); } QUrl SieveEditorPageWidget::currentUrl() const { return mCurrentURL; } void SieveEditorPageWidget::slotGetResult(KManageSieve::SieveJob *, bool success, const QString &script, bool isActive) { mSieveEditorWidget->setReadOnly(false); if (!success) { return; } mSieveEditorWidget->setScriptName(mCurrentURL.fileName()); mSieveEditorWidget->setScript(script); mWasActive = isActive; mSieveEditorWidget->setModified(false); } void SieveEditorPageWidget::uploadScript(bool showInformation, bool forceSave) { if (mSieveEditorWidget->isModified() || forceSave) { KManageSieve::SieveJob *job = KManageSieve::SieveJob::put(mCurrentURL, mSieveEditorWidget->script(), mWasActive, mWasActive); job->setProperty("showuploadinformation", showInformation); connect(job, &KManageSieve::SieveJob::result, this, &SieveEditorPageWidget::slotPutResult); } } void SieveEditorPageWidget::slotPutResult(KManageSieve::SieveJob *job, bool success) { if (mIsNewScript) { Q_EMIT refreshList(); } if (success) { if (job->property("showuploadinformation").toBool()) { KMessageBox::information(this, i18n("The Sieve script was successfully uploaded."), i18n("Sieve Script Upload")); } mIsNewScript = false; mSieveEditorWidget->updateOriginalScript(); mSieveEditorWidget->setModified(false); } else { - //TODO error + const QString msg = job->errorString(); + if (msg.isEmpty()) + KMessageBox::error(Q_NULLPTR, i18n("Uploading the Sieve script failed.\n" + "The server responded:\n%1", msg, i18n("Sieve Error"))); + else { + KMessageBox::error(Q_NULLPTR, msg, i18n("Sieve Error")); + } } } bool SieveEditorPageWidget::needToSaveScript() { bool result = false; if (mIsNewScript) { const int resultQuestion = KMessageBox::warningYesNoCancel(this, i18n("Script '%1' is new. Do you want to save it?", mCurrentURL.fileName())); if (resultQuestion == KMessageBox::Yes) { uploadScript(); result = true; } else if (resultQuestion == KMessageBox::Cancel) { result = true; } } else { if (mSieveEditorWidget->isModified()) { const int resultQuestion = KMessageBox::warningYesNoCancel(this, i18n("Script '%1' was changed. Do you want to save it ?", mCurrentURL.fileName())); if (resultQuestion == KMessageBox::Yes) { uploadScript(); result = true; } else if (resultQuestion == KMessageBox::Cancel) { result = true; } } } return result; } void SieveEditorPageWidget::slotValueChanged(bool b) { Q_EMIT scriptModified(b, this); } bool SieveEditorPageWidget::isModified() const { return mSieveEditorWidget->isModified(); } void SieveEditorPageWidget::goToLine() { mSieveEditorWidget->goToLine(); } void SieveEditorPageWidget::undo() { mSieveEditorWidget->undo(); } bool SieveEditorPageWidget::isUndoAvailable() const { return mSieveEditorWidget->isUndoAvailable(); } bool SieveEditorPageWidget::isRedoAvailable() const { return mSieveEditorWidget->isRedoAvailable(); } bool SieveEditorPageWidget::hasSelection() const { return mSieveEditorWidget->hasSelection(); } void SieveEditorPageWidget::redo() { mSieveEditorWidget->redo(); } void SieveEditorPageWidget::find() { mSieveEditorWidget->find(); } void SieveEditorPageWidget::replace() { mSieveEditorWidget->replace(); } void SieveEditorPageWidget::shareScript() { mSieveEditorWidget->slotShareScript(); } void SieveEditorPageWidget::import() { mSieveEditorWidget->slotImport(); } void SieveEditorPageWidget::comment() { mSieveEditorWidget->comment(); } void SieveEditorPageWidget::uncomment() { mSieveEditorWidget->uncomment(); } void SieveEditorPageWidget::checkSpelling() { mSieveEditorWidget->checkSpelling(); } void SieveEditorPageWidget::createRulesGraphically() { mSieveEditorWidget->slotCreateRulesGraphically(); } void SieveEditorPageWidget::checkSyntax() { mSieveEditorWidget->slotCheckSyntax(); } void SieveEditorPageWidget::saveAs() { mSieveEditorWidget->slotSaveAs(); } void SieveEditorPageWidget::reverseCase() { mSieveEditorWidget->reverseCase(); } void SieveEditorPageWidget::lowerCase() { mSieveEditorWidget->lowerCase(); } void SieveEditorPageWidget::debugSieveScript() { mSieveEditorWidget->debugSieveScript(); } void SieveEditorPageWidget::upperCase() { mSieveEditorWidget->upperCase(); } void SieveEditorPageWidget::sentenceCase() { mSieveEditorWidget->sentenceCase(); } KSieveUi::SieveEditorWidget::EditorMode SieveEditorPageWidget::pageMode() const { return mSieveEditorWidget->mode(); } void SieveEditorPageWidget::paste() { mSieveEditorWidget->paste(); } void SieveEditorPageWidget::cut() { mSieveEditorWidget->cut(); } void SieveEditorPageWidget::copy() { mSieveEditorWidget->copy(); } void SieveEditorPageWidget::selectAll() { mSieveEditorWidget->selectAll(); } void SieveEditorPageWidget::zoomIn() { mSieveEditorWidget->zoomIn(); } void SieveEditorPageWidget::zoomOut() { mSieveEditorWidget->zoomOut(); } void SieveEditorPageWidget::wordWrap(bool state) { mSieveEditorWidget->wordWrap(state); } bool SieveEditorPageWidget::isWordWrap() const { return mSieveEditorWidget->isWordWrap(); } void SieveEditorPageWidget::print() { mSieveEditorWidget->print(); } void SieveEditorPageWidget::printPreview() { mSieveEditorWidget->printPreview(); } bool SieveEditorPageWidget::printSupportEnabled() const { return mSieveEditorWidget->printSupportEnabled(); } bool SieveEditorPageWidget::isTextEditor() const { return mSieveEditorWidget->isTextEditor(); } void SieveEditorPageWidget::zoomReset() { mSieveEditorWidget->zoomReset(); } void SieveEditorPageWidget::openBookmarkUrl(const QUrl &url) { mSieveEditorWidget->openBookmarkUrl(url); } QString SieveEditorPageWidget::currentHelpTitle() const { return mSieveEditorWidget->currentHelpTitle(); } QUrl SieveEditorPageWidget::currentHelpUrl() const { return mSieveEditorWidget->currentHelpUrl(); } diff --git a/src/sieveeditorpagewidget.h b/src/sieveeditorpagewidget.h index c644bc1..607f655 100644 --- a/src/sieveeditorpagewidget.h +++ b/src/sieveeditorpagewidget.h @@ -1,112 +1,112 @@ /* Copyright (C) 2014-2016 Montel Laurent 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; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef SIEVEEDITORPAGEWIDGET_H #define SIEVEEDITORPAGEWIDGET_H #include #include #include "ksieveui/sieveeditorwidget.h" namespace KManageSieve { class SieveJob; } namespace KSieveUi { class SieveEditorWidget; } class SieveEditorPageWidget : public QWidget { Q_OBJECT public: explicit SieveEditorPageWidget(QWidget *parent = Q_NULLPTR); ~SieveEditorPageWidget(); void loadScript(const QUrl &url, const QStringList &capabilities); QUrl currentUrl() const; void setIsNewScript(bool isNewScript); void uploadScript(bool showInformation = true, bool forceSave = false); bool needToSaveScript(); bool isModified() const; void goToLine(); KSieveUi::SieveEditorWidget::EditorMode pageMode() const; void find(); void replace(); void redo(); void undo(); bool isUndoAvailable() const; bool isRedoAvailable() const; void paste(); void cut(); void copy(); bool hasSelection() const; void selectAll(); void saveAs(); void checkSpelling(); void shareScript(); void import(); void createRulesGraphically(); void checkSyntax(); void comment(); void uncomment(); void lowerCase(); void upperCase(); void sentenceCase(); void reverseCase(); void zoomIn(); void zoomOut(); QString currentHelpTitle() const; QUrl currentHelpUrl() const; void openBookmarkUrl(const QUrl &url); void debugSieveScript(); void zoomReset(); void wordWrap(bool state); bool isWordWrap() const; void print(); void printPreview(); bool printSupportEnabled() const; bool isTextEditor() const; Q_SIGNALS: void refreshList(); void scriptModified(bool, SieveEditorPageWidget *); void modeEditorChanged(KSieveUi::SieveEditorWidget::EditorMode); void undoAvailable(bool); void redoAvailable(bool); void copyAvailable(bool); void sieveEditorTabCurrentChanged(); private Q_SLOTS: void slotGetResult(KManageSieve::SieveJob *, bool success, const QString &script, bool isActive); void slotCheckSyntaxClicked(); - void slotPutResultDebug(KManageSieve::SieveJob *, bool success, const QString &errorMsg); + void slotPutResultDebug(KManageSieve::SieveJob *, bool success); void slotPutResult(KManageSieve::SieveJob *, bool success); void slotValueChanged(bool b); private: void setModified(bool b); QUrl mCurrentURL; KSieveUi::SieveEditorWidget *mSieveEditorWidget; bool mWasActive; bool mIsNewScript; }; #endif // SIEVEEDITORPAGEWIDGET_H