diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e5a802..897f97d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,111 +1,110 @@ cmake_minimum_required(VERSION 3.5) set(PIM_VERSION "5.12.40") project(libksieve VERSION ${PIM_VERSION}) set(KF5_MIN_VERSION "5.63.0") find_package(ECM ${KF5_MIN_VERSION} CONFIG REQUIRED) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) if (POLICY CMP0053) cmake_policy(SET CMP0053 NEW) endif() set(LIBRARY_NAMELINK) include(KDEInstallDirs) include(KDECMakeSettings) include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE) include(GenerateExportHeader) include(ECMGenerateHeaders) include(ECMGeneratePriFile) include(ECMSetupVersion) include(FeatureSummary) include(ECMQtDeclareLoggingCategory) include(ECMAddTests) set(LIBKSIEVE_LIB_VERSION ${PIM_VERSION}) set(QT_REQUIRED_VERSION "5.11.0") set(KMIME_LIB_VERSION "5.12.40") set(IDENTITYMANAGEMENT_LIB_VERSION "5.12.40") set(KMAILTRANSPORT_LIB_VERSION "5.12.40") set(KPIMTEXTEDIT_LIB_VERSION "5.12.40") set(LIBKDEPIM_LIB_VERSION "5.12.40") set(PIMCOMMON_LIB_VERSION "5.12.40") set(KIMAP_LIB_VERSION "5.12.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) set(CMAKE_CXX_STANDARD 14) # 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_MIN_VERSION} CONFIG REQUIRED) find_package(KF5DocTools ${KF5_MIN_VERSION} CONFIG REQUIRED) find_package(KF5KIO ${KF5_MIN_VERSION} CONFIG REQUIRED) find_package(KF5IconThemes ${KF5_MIN_VERSION} CONFIG REQUIRED) find_package(KF5PimCommon ${PIMCOMMON_LIB_VERSION} CONFIG REQUIRED) find_package(KF5Libkdepim ${LIBKDEPIM_LIB_VERSION} CONFIG REQUIRED) find_package(KF5NewStuff ${KF5_MIN_VERSION} CONFIG REQUIRED) -find_package(KF5WindowSystem ${KF5_MIN_VERSION} CONFIG REQUIRED) find_package(KF5Archive ${KF5_MIN_VERSION} CONFIG REQUIRED) find_package(KF5SyntaxHighlighting ${KF5_MIN_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) 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 ########### if (EXISTS "${CMAKE_SOURCE_DIR}/.git") add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x060000) endif() add_definitions(-DQT_NO_FOREACH) ########### 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_LOGGINGCATEGORIESDIR}) feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/src/ksieveui/CMakeLists.txt b/src/ksieveui/CMakeLists.txt index 5341806..8d9344f 100644 --- a/src/ksieveui/CMakeLists.txt +++ b/src/ksieveui/CMakeLists.txt @@ -1,384 +1,383 @@ if(KDEPIM_ENTERPRISE_BUILD) set(USE_GRAPHICAL_SIEVE_EDITOR true) else() set(USE_GRAPHICAL_SIEVE_EDITOR false) endif() configure_file(settings/sieve-editor.kcfg.cmake ${CMAKE_CURRENT_BINARY_DIR}/sieve-editor.kcfg) if(BUILD_TESTING) add_subdirectory(editor/tests) add_subdirectory(managescriptsjob/autotests) add_subdirectory(editor/autotests) add_subdirectory(autocreatescripts/tests) add_subdirectory(scriptsparsing/tests) add_subdirectory(scriptsparsing/autotests) add_subdirectory(vacation/autotests) add_subdirectory(sievescriptdebugger/autotests) add_subdirectory(sievescriptdebugger/tests) add_subdirectory(autocreatescripts/autotests/) add_subdirectory(editor/webengine/findbar/autotests/) add_subdirectory(editor/webengine/autotests/) add_subdirectory(util/autotests/) add_subdirectory(sieveimapinstance/autotests) add_subdirectory(widgets/autotests) endif() set(ksieveui_vacation_LIB_SRCS vacation/vacationmaillineedit.cpp vacation/vacationhelperjob.cpp vacation/vacationeditwidget.cpp vacation/multiimapvacationdialog.cpp vacation/vacationpagewidget.cpp vacation/vacationwarningwidget.cpp vacation/vacationscriptextractor.cpp vacation/vacationutils.cpp vacation/vacationcreatescriptjob.cpp vacation/vacationcheckjob.cpp vacation/multiimapvacationmanager.cpp vacation/vacationmanager.cpp vacation/vacationmailactionwidget.cpp vacation/legacy/vacationutils.cpp vacation/legacy/vacationscriptextractor.cpp ) set(ksieveui_webpageeditor_LIB_SRCS editor/webengine/sieveeditorwebengineview.cpp editor/webengine/sieveeditorhelphtmlwidget.cpp editor/webengine/sieveeditorloadprogressindicator.cpp editor/webengine/findbar/findbarbase.cpp editor/webengine/findbar/findbarwebengineview.cpp ) set(ksieveui_editor_LIB_SRCS ${ksieveui_webpageeditor_LIB_SRCS} editor/sieveeditorwidget.cpp editor/sievetextedit.cpp editor/sieveeditor.cpp editor/sievelinenumberarea.cpp editor/sieveinfowidget.cpp editor/sieveeditortextmodewidget.cpp editor/sieveeditorabstractwidget.cpp editor/warningwidget/sieveeditorwarning.cpp editor/warningwidget/sieveeditorparsingmissingfeaturewarning.cpp editor/sieveeditortabwidget.cpp editor/sieveeditorutil.cpp editor/sieveeditormenubar.cpp editor/sievetexteditorspellcheckdecorator.cpp editor/sievetexteditwidget.cpp editor/sievepurposemenuwidget.cpp ) set(ksieveui_autocreatescripts_LIB_SRCS autocreatescripts/sieveeditorgraphicalmodewidgetabstract.cpp autocreatescripts/sievescriptparsingerrordialog.cpp autocreatescripts/sieveeditorgraphicalmodewidget.cpp autocreatescripts/autocreatescriptdialog.cpp autocreatescripts/sieveconditionwidgetlister.cpp autocreatescripts/sievescriptlistbox.cpp autocreatescripts/sievescriptdescriptiondialog.cpp autocreatescripts/sieveactionwidgetlister.cpp autocreatescripts/sievescriptpage.cpp autocreatescripts/sievescriptblockwidget.cpp autocreatescripts/sievescripttabwidget.cpp autocreatescripts/autocreatescriptutil.cpp autocreatescripts/sieveincludewidget.cpp autocreatescripts/sieveforeverypartwidget.cpp autocreatescripts/sievewidgetpageabstract.cpp autocreatescripts/sieveglobalvariablewidget.cpp autocreatescripts/sieveactions/sieveactionlist.cpp autocreatescripts/sieveactions/sieveaction.cpp autocreatescripts/sieveactions/sieveactiondiscard.cpp autocreatescripts/sieveactions/sieveactionstop.cpp autocreatescripts/sieveactions/sieveactionsetflags.cpp autocreatescripts/sieveactions/sieveactionaddflags.cpp autocreatescripts/sieveactions/sieveactionfileinto.cpp autocreatescripts/sieveactions/sieveactionreject.cpp autocreatescripts/sieveactions/sieveactionkeep.cpp autocreatescripts/sieveactions/sieveactionredirect.cpp autocreatescripts/sieveactions/sieveactionabstractflags.cpp autocreatescripts/sieveactions/sieveactionremoveflags.cpp autocreatescripts/sieveactions/sieveactionnotify.cpp autocreatescripts/sieveactions/sieveactionabstracteditheader.cpp autocreatescripts/sieveactions/sieveactiondeleteheader.cpp autocreatescripts/sieveactions/sieveactionaddheader.cpp autocreatescripts/sieveactions/sieveactionvacation.cpp autocreatescripts/sieveactions/sieveactionenclose.cpp autocreatescripts/sieveactions/sieveactionreplace.cpp autocreatescripts/sieveactions/sieveactionextracttext.cpp autocreatescripts/sieveactions/sieveactionbreak.cpp autocreatescripts/sieveactions/sieveactionconvert.cpp autocreatescripts/sieveactions/sieveactionsetvariable.cpp autocreatescripts/sieveactions/sieveactionreturn.cpp autocreatescripts/sieveactions/sieveactionereject.cpp autocreatescripts/sieveactions/widgets/selectflagswidget.cpp autocreatescripts/sieveactions/widgets/addresslineedit.cpp autocreatescripts/sieveactions/widgets/selectaddheaderpositioncombobox.cpp autocreatescripts/sieveactions/widgets/selectimportancecombobox.cpp autocreatescripts/sieveactions/widgets/multilineedit.cpp autocreatescripts/sieveactions/widgets/selectvacationcombobox.cpp autocreatescripts/sieveactions/widgets/selectvariablemodifiercombobox.cpp autocreatescripts/commonwidgets/selectconvertparameterwidget.cpp autocreatescripts/commonwidgets/selectmatchtypecombobox.cpp autocreatescripts/commonwidgets/selectmimetypecombobox.cpp autocreatescripts/commonwidgets/sievehelpbutton.cpp autocreatescripts/sieveconditions/sievecondition.cpp autocreatescripts/sieveconditions/sieveconditionheader.cpp autocreatescripts/sieveconditions/sieveconditionlist.cpp autocreatescripts/sieveconditions/sieveconditionaddress.cpp autocreatescripts/sieveconditions/sieveconditionsize.cpp autocreatescripts/sieveconditions/sieveconditionenvelope.cpp autocreatescripts/sieveconditions/sieveconditionexists.cpp autocreatescripts/sieveconditions/sieveconditiontrue.cpp autocreatescripts/sieveconditions/sieveconditionbody.cpp autocreatescripts/sieveconditions/sieveconditiondate.cpp autocreatescripts/sieveconditions/sieveconditioncurrentdate.cpp autocreatescripts/sieveconditions/sieveconditionmailboxexists.cpp autocreatescripts/sieveconditions/sieveconditionspamtest.cpp autocreatescripts/sieveconditions/sieveconditionvirustest.cpp autocreatescripts/sieveconditions/sieveconditionihave.cpp autocreatescripts/sieveconditions/sieveconditionfalse.cpp autocreatescripts/sieveconditions/sieveconditionenvironment.cpp autocreatescripts/sieveconditions/sieveconditionhasflag.cpp autocreatescripts/sieveconditions/sieveconditionmetadata.cpp autocreatescripts/sieveconditions/sieveconditionconvert.cpp autocreatescripts/sieveconditions/sieveconditionmetadataexists.cpp autocreatescripts/sieveconditions/sieveconditionservermetadata.cpp autocreatescripts/sieveconditions/sieveconditionservermetadataexists.cpp autocreatescripts/sieveconditions/widgets/selectdatewidget.cpp autocreatescripts/sieveconditions/widgets/selectaddresspartcombobox.cpp autocreatescripts/sieveconditions/widgets/selectheadertypecombobox.cpp autocreatescripts/sieveconditions/widgets/selectbodytypewidget.cpp autocreatescripts/sieveconditions/widgets/selectrelationalmatchtype.cpp autocreatescripts/sieveconditions/widgets/selectcomparatorcombobox.cpp autocreatescripts/sieveconditions/widgets/selectmimecombobox.cpp autocreatescripts/sieveconditions/widgets/selectsizetypecombobox.cpp autocreatescripts/sieveconditions/widgets/selectsizewidget.cpp autocreatescripts/sieveconditions/widgets/sievedatespinbox.cpp autocreatescripts/sieveconditions/widgets/regexpeditorlineedit.cpp ) set(ksieveui_scriptsparsing_LIB_SRCS scriptsparsing/xmlprintingscriptbuilder.cpp scriptsparsing/parsingresultdialog.cpp scriptsparsing/parsingutil.cpp ) set(ksieveui_sievescriptdebugger_LIB_SRCS sievescriptdebugger/sievescriptdebuggerdialog.cpp sievescriptdebugger/sievescriptdebuggerwidget.cpp sievescriptdebugger/sievescriptdebuggerfrontendwidget.cpp sievescriptdebugger/sievescriptdebuggerwarning.cpp sievescriptdebugger/sievescriptdebuggertextedit.cpp sievescriptdebugger/sievescriptdebuggerresulteditor.cpp ) set(ksieveui_managescriptjob_LIB_SRCS managescriptsjob/checkkolabkep14supportjob.cpp managescriptsjob/generateglobalscriptjob.cpp managescriptsjob/parseuserscriptjob.cpp managescriptsjob/renamescriptjob.cpp managescriptsjob/checkscriptjob.cpp ) set(ksieveui_sieveimapinstance_LIB_SRCS sieveimapinstance/sieveimapinstance.cpp sieveimapinstance/sieveimapinstanceinterface.cpp sieveimapinstance/sieveimapinstanceinterfacemanager.cpp ) set(ksieveui_sieveutil_LIB_SRCS util/util.cpp util/abstractakonadiimapsettinginterface.cpp util/akonadiimapsettinginterface.cpp util/sieveimapaccountsettings.cpp ) set(ksieveui_widgets_SRCS widgets/custommanagesievewidget.cpp widgets/sievetreewidgetitem.cpp widgets/managesievetreeview.cpp widgets/managesievewidget.cpp widgets/abstractmoveimapfolderwidget.cpp widgets/abstractregexpeditorlineedit.cpp widgets/abstractselectemaillineedit.cpp widgets/lineeditvalidator.cpp widgets/includefilelineedit.cpp widgets/moveimapfolderwidget.cpp ) set(ksieveui_LIB_SRCS managesievescriptsdialog.cpp debug/sievedebugdialog.cpp templates/sievetemplatewidget.cpp templates/sievedefaulttemplate.cpp templates/sievetemplateeditdialog.cpp ${ksieveui_widgets_SRCS} ${ksieveui_sieveutil_LIB_SRCS} ${ksieveui_sieveimapinstance_LIB_SRCS} ${ksieveui_scriptsparsing_LIB_SRCS} ${ksieveui_vacation_LIB_SRCS} ${ksieveui_editor_LIB_SRCS} ${ksieveui_autocreatescripts_LIB_SRCS} ${ksieveui_sievescriptdebugger_LIB_SRCS} ${ksieveui_managescriptjob_LIB_SRCS} ) ecm_qt_declare_logging_category(ksieveui_LIB_SRCS HEADER libksieve_debug.h IDENTIFIER LIBKSIEVE_LOG CATEGORY_NAME org.kde.pim.libksieve) kconfig_add_kcfg_files(ksieveui_LIB_SRCS settings/sieve-vacation.kcfgc settings/sieve-editor.kcfgc) add_library(KF5KSieveUi ${ksieveui_LIB_SRCS}) generate_export_header(KF5KSieveUi BASE_NAME ksieveui) add_library(KF5::KSieveUi ALIAS KF5KSieveUi) target_link_libraries(KF5KSieveUi PUBLIC KF5::KManageSieve KF5::KSieve KF5::PimCommon PRIVATE KF5::Libkdepim KF5::Archive KF5::Mime KF5::IconThemes KF5::IdentityManagement KF5::MailTransport KF5::KIOWidgets KF5::NewStuff - KF5::WindowSystem Qt5::WebEngineWidgets KF5::PimTextEdit KF5::I18n KF5::SonnetUi Qt5::PrintSupport KF5::SyntaxHighlighting ) set_target_properties(KF5KSieveUi PROPERTIES VERSION ${LIBKSIEVE_VERSION_STRING} SOVERSION ${LIBKSIEVE_SOVERSION} EXPORT_NAME KSieveUi ) target_include_directories(KF5KSieveUi INTERFACE "$") target_include_directories(KF5KSieveUi PUBLIC "$") ecm_generate_headers(ksieveui_CamelCase_HEADERS HEADER_NAMES ManageSieveScriptsDialog REQUIRED_HEADERS ksieveui_HEADERS PREFIX KSieveUi ) ecm_generate_headers(ksieveui_Camelcaseutil_HEADERS HEADER_NAMES Util SieveImapAccountSettings SieveImapPasswordProvider REQUIRED_HEADERS ksieveui_util_HEADERS PREFIX KSieveUi RELATIVE util ) ecm_generate_headers(ksieveui_Camelcaseimapinstance_HEADERS HEADER_NAMES SieveImapInstance SieveImapInstanceInterface SieveImapInstanceInterfaceManager REQUIRED_HEADERS ksieveui_imapinstance_HEADERS PREFIX KSieveUi RELATIVE sieveimapinstance ) ecm_generate_headers(ksieveui_Camelmanagescriptsjob_HEADERS HEADER_NAMES RenameScriptJob CheckScriptJob REQUIRED_HEADERS ksieveui_managescriptsjob_HEADERS PREFIX KSieveUi RELATIVE managescriptsjob ) ecm_generate_headers(ksieveui_Camelcaseeditor_HEADERS HEADER_NAMES SieveEditor SieveEditorWidget REQUIRED_HEADERS ksieveui_editor_HEADERS PREFIX KSieveUi RELATIVE editor ) ecm_generate_headers(ksieveui_Camelcasevacation_HEADERS HEADER_NAMES VacationManager MultiImapVacationManager MultiImapVacationDialog REQUIRED_HEADERS ksieveui_vacation_HEADERS PREFIX KSieveUi RELATIVE vacation ) ecm_generate_headers(ksieveui_Camelcasedebug_HEADERS HEADER_NAMES SieveDebugDialog REQUIRED_HEADERS ksieveui_debug_HEADERS PREFIX KSieveUi RELATIVE debug ) ecm_generate_headers(ksieveui_Camelcasewidgets_HEADERS HEADER_NAMES ManageSieveWidget SieveTreeWidgetItem ManageSieveTreeView AbstractMoveImapFolderWidget AbstractRegexpEditorLineEdit AbstractSelectEmailLineEdit REQUIRED_HEADERS ksieveui_widgets_HEADERS PREFIX KSieveUi RELATIVE widgets ) ecm_generate_pri_file(BASE_NAME KSieveUi LIB_NAME KF5KSieveUi DEPS "KManageSieve KSieve PimCommon" FILENAME_VAR PRI_FILENAME ) install(TARGETS KF5KSieveUi EXPORT KF5KSieveTargets ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) install(FILES ${ksieveui_Camelcaseimapinstance_HEADERS} ${ksieveui_Camelcasewidgets_HEADERS} ${ksieveui_Camelcasedebug_HEADERS} ${ksieveui_Camelcasevacation_HEADERS} ${ksieveui_CamelCase_HEADERS} ${ksieveui_Camelcaseeditor_HEADERS} ${ksieveui_Camelcaseutil_HEADERS} ${ksieveui_Camelmanagescriptsjob_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/KSieveUi COMPONENT Devel ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ksieveui_export.h ${ksieveui_imapinstance_HEADERS} ${ksieveui_widgets_HEADERS} ${ksieveui_debug_HEADERS} ${ksieveui_vacation_HEADERS} ${ksieveui_HEADERS} ${ksieveui_editor_HEADERS} ${ksieveui_util_HEADERS} ${ksieveui_managescriptsjob_HEADERS} util/util_p.h DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/ksieveui COMPONENT Devel ) install(FILES ${PRI_FILENAME} DESTINATION ${ECM_MKSPECS_INSTALL_DIR} ) install(FILES data/ksieve_script.knsrc DESTINATION ${KDE_INSTALL_KNSRCDIR} ) install(DIRECTORY data/scripts/ DESTINATION ${KDE_INSTALL_DATADIR}/sieve/scripts/ ) diff --git a/src/ksieveui/autocreatescripts/sievescriptlistbox.cpp b/src/ksieveui/autocreatescripts/sievescriptlistbox.cpp index f29b103..8923c58 100644 --- a/src/ksieveui/autocreatescripts/sievescriptlistbox.cpp +++ b/src/ksieveui/autocreatescripts/sievescriptlistbox.cpp @@ -1,559 +1,550 @@ /* Copyright (C) 2013-2019 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 "sievescriptlistbox.h" #include "sievescriptdescriptiondialog.h" #include "sieveglobalvariablewidget.h" #include "sieveforeverypartwidget.h" #include "sievescriptpage.h" #include "sieveincludewidget.h" #include "sieveeditorgraphicalmodewidget.h" #include #include #include #include #include #include -#include #include #include #include #include #include "libksieve_debug.h" namespace { inline const QString defaultScriptName() { return QStringLiteral("SCRIPTNAME: "); } } using namespace KSieveUi; SieveScriptListItem::SieveScriptListItem(const QString &text, QListWidget *parent) : QListWidgetItem(text, parent) { } SieveScriptListItem::~SieveScriptListItem() { } void SieveScriptListItem::setDescription(const QString &desc) { mDescription = desc; } QString SieveScriptListItem::description() const { return mDescription; } SieveScriptPage *SieveScriptListItem::scriptPage() const { return mScriptPage; } void SieveScriptListItem::setScriptPage(SieveScriptPage *page) { mScriptPage = page; } QString SieveScriptListItem::generatedScript(QStringList &required) const { QString script; if (!mDescription.trimmed().isEmpty()) { const QVector commentList = mDescription.splitRef(QLatin1Char('\n')); for (const QStringRef &str : commentList) { if (str.isEmpty()) { script += QLatin1Char('\n'); } else { script += QLatin1Char('#') + str + QLatin1Char('\n'); } } } if (mScriptPage) { mScriptPage->generatedScript(script, required); } return script; } SieveScriptListBox::SieveScriptListBox(const QString &title, QWidget *parent) : QGroupBox(title, parent) { QVBoxLayout *layout = new QVBoxLayout(this); mSieveListScript = new QListWidget(this); layout->addWidget(mSieveListScript); //----------- the first row of buttons QWidget *hb = new QWidget(this); QHBoxLayout *hbHBoxLayout = new QHBoxLayout(hb); hbHBoxLayout->setContentsMargins(0, 0, 0, 0); hbHBoxLayout->setSpacing(4); mBtnTop = new QPushButton(hb); hbHBoxLayout->addWidget(mBtnTop); mBtnTop->setIcon(QIcon::fromTheme(QStringLiteral("go-top"))); - mBtnTop->setIconSize(QSize(KIconLoader::SizeSmall, KIconLoader::SizeSmall)); mBtnTop->setMinimumSize(mBtnTop->sizeHint() * 1.2); mBtnUp = new QPushButton(hb); hbHBoxLayout->addWidget(mBtnUp); mBtnUp->setAutoRepeat(true); mBtnUp->setIcon(QIcon::fromTheme(QStringLiteral("go-up"))); - mBtnUp->setIconSize(QSize(KIconLoader::SizeSmall, KIconLoader::SizeSmall)); mBtnUp->setMinimumSize(mBtnUp->sizeHint() * 1.2); mBtnDown = new QPushButton(hb); hbHBoxLayout->addWidget(mBtnDown); mBtnDown->setAutoRepeat(true); mBtnDown->setIcon(QIcon::fromTheme(QStringLiteral("go-down"))); - mBtnDown->setIconSize(QSize(KIconLoader::SizeSmall, KIconLoader::SizeSmall)); mBtnDown->setMinimumSize(mBtnDown->sizeHint() * 1.2); mBtnBottom = new QPushButton(hb); hbHBoxLayout->addWidget(mBtnBottom); mBtnBottom->setIcon(QIcon::fromTheme(QStringLiteral("go-bottom"))); - mBtnBottom->setIconSize(QSize(KIconLoader::SizeSmall, KIconLoader::SizeSmall)); mBtnBottom->setMinimumSize(mBtnBottom->sizeHint() * 1.2); mBtnUp->setToolTip(i18nc("Move selected filter up.", "Up")); mBtnDown->setToolTip(i18nc("Move selected filter down.", "Down")); mBtnTop->setToolTip(i18nc("Move selected filter to the top.", "Top")); mBtnBottom->setToolTip(i18nc("Move selected filter to the bottom.", "Bottom")); layout->addWidget(hb); hb = new QWidget(this); hbHBoxLayout = new QHBoxLayout(hb); hbHBoxLayout->setContentsMargins(0, 0, 0, 0); hbHBoxLayout->setSpacing(4); mBtnNew = new QPushButton(hb); hbHBoxLayout->addWidget(mBtnNew); mBtnNew->setIcon(QIcon::fromTheme(QStringLiteral("document-new"))); - mBtnNew->setIconSize(QSize(KIconLoader::SizeSmall, KIconLoader::SizeSmall)); mBtnNew->setToolTip(i18n("New Script")); mBtnNew->setMinimumSize(mBtnNew->sizeHint() * 1.2); mBtnDelete = new QPushButton(hb); hbHBoxLayout->addWidget(mBtnDelete); mBtnDelete->setIcon(QIcon::fromTheme(QStringLiteral("edit-delete"))); - mBtnDelete->setIconSize(QSize(KIconLoader::SizeSmall, KIconLoader::SizeSmall)); mBtnDelete->setToolTip(i18n("Delete Script")); mBtnDelete->setMinimumSize(mBtnDelete->sizeHint() * 1.2); mBtnRename = new QPushButton(hb); mBtnRename->setToolTip(i18n("Rename Script")); mBtnRename->setIcon(QIcon::fromTheme(QStringLiteral("edit-rename"))); - mBtnRename->setIconSize(QSize(KIconLoader::SizeSmall, KIconLoader::SizeSmall)); mBtnRename->setMinimumSize(mBtnRename->sizeHint() * 1.2); hbHBoxLayout->addWidget(mBtnRename); mBtnDescription = new QPushButton(hb); mBtnDescription->setToolTip(i18n("Edit Script Description")); mBtnDescription->setIcon(QIcon::fromTheme(QStringLiteral("edit-comment"))); - mBtnDescription->setIconSize(QSize(KIconLoader::SizeSmall, KIconLoader::SizeSmall)); mBtnDescription->setMinimumSize(mBtnDescription->sizeHint() * 1.2); hbHBoxLayout->addWidget(mBtnDescription); layout->addWidget(hb); connect(mBtnNew, &QPushButton::clicked, this, &SieveScriptListBox::slotNew); connect(mBtnDelete, &QPushButton::clicked, this, &SieveScriptListBox::slotDelete); connect(mBtnRename, &QPushButton::clicked, this, &SieveScriptListBox::slotRename); connect(mBtnDescription, &QPushButton::clicked, this, &SieveScriptListBox::slotEditDescription); connect(mBtnUp, &QPushButton::clicked, this, &SieveScriptListBox::slotUp); connect(mBtnDown, &QPushButton::clicked, this, &SieveScriptListBox::slotDown); connect(mBtnTop, &QPushButton::clicked, this, &SieveScriptListBox::slotTop); connect(mBtnBottom, &QPushButton::clicked, this, &SieveScriptListBox::slotBottom); connect(mSieveListScript, &QListWidget::itemSelectionChanged, this, &SieveScriptListBox::updateButtons); connect(mSieveListScript, &QListWidget::itemActivated, this, &SieveScriptListBox::slotItemActived); connect(mSieveListScript, &QListWidget::itemDoubleClicked, this, &SieveScriptListBox::slotEditDescription); updateButtons(); } SieveScriptListBox::~SieveScriptListBox() { } void SieveScriptListBox::setSieveEditorGraphicalModeWidget(SieveEditorGraphicalModeWidget *graphicalModeWidget) { mSieveGraphicalModeWidget = graphicalModeWidget; } void SieveScriptListBox::slotItemActived(QListWidgetItem *item) { if (item) { SieveScriptListItem *itemScript = static_cast(item); Q_EMIT activatePage(itemScript->scriptPage()); } } void SieveScriptListBox::updateButtons() { const int currentIndex = mSieveListScript->currentRow(); const bool theFirst = (currentIndex == 0); const int numberOfElement(mSieveListScript->count()); const bool theLast = (currentIndex >= numberOfElement - 1); const QList lst = mSieveListScript->selectedItems(); mBtnDelete->setEnabled(!lst.isEmpty()); mBtnRename->setEnabled(lst.count() == 1); mBtnDescription->setEnabled(lst.count() == 1); mBtnBottom->setEnabled(!lst.isEmpty() && !theLast); mBtnTop->setEnabled(!lst.isEmpty() && !theFirst); mBtnDown->setEnabled(!lst.isEmpty() && !theLast); mBtnUp->setEnabled(!lst.isEmpty() && !theFirst); } SieveScriptPage *SieveScriptListBox::createNewScript(const QString &newName, const QString &description) { SieveScriptListItem *item = new SieveScriptListItem(newName, mSieveListScript); item->setDescription(description); SieveScriptPage *page = new SieveScriptPage(mSieveGraphicalModeWidget); page->setListOfIncludeFile(mSieveGraphicalModeWidget->listOfIncludeFile()); item->setScriptPage(page); Q_EMIT addNewPage(page); Q_EMIT enableButtonOk(true); mSieveListScript->setCurrentItem(item); updateButtons(); return page; } void SieveScriptListBox::slotNew() { const QString newName = QInputDialog::getText(this, i18n("New Script"), i18n("Add new name:")); if (!newName.trimmed().isEmpty()) { createNewScript(newName); Q_EMIT valueChanged(); } } void SieveScriptListBox::slotDelete() { QListWidgetItem *item = mSieveListScript->currentItem(); if (item) { if (KMessageBox::warningYesNo(this, i18n("Do you want to delete \"%1\" script?", item->text()), i18n("Delete script")) == KMessageBox::Yes) { SieveScriptListItem *itemScript = static_cast(item); Q_EMIT removePage(itemScript->scriptPage()); delete item; Q_EMIT enableButtonOk(mSieveListScript->count() > 0); updateButtons(); Q_EMIT valueChanged(); } } } void SieveScriptListBox::slotRename() { QListWidgetItem *item = mSieveListScript->currentItem(); if (item) { QString newName = QInputDialog::getText(this, i18n("Rename"), i18n("Add new name:"), QLineEdit::Normal, item->text()); newName = newName.trimmed(); if (!newName.isEmpty()) { item->setText(newName); Q_EMIT valueChanged(); } } } void SieveScriptListBox::slotEditDescription() { QListWidgetItem *item = mSieveListScript->currentItem(); if (item) { SieveScriptListItem *sieveItem = static_cast(item); QPointer dlg = new SieveScriptDescriptionDialog(this); dlg->setDescription(sieveItem->description()); if (dlg->exec()) { sieveItem->setDescription(dlg->description()); Q_EMIT valueChanged(); } delete dlg; } } void SieveScriptListBox::slotTop() { QListWidgetItem *item = mSieveListScript->currentItem(); if (item) { const int currentIndex = mSieveListScript->currentRow(); if (currentIndex != 0) { item = mSieveListScript->takeItem(currentIndex); mSieveListScript->insertItem(0, item); mSieveListScript->setCurrentItem(item); Q_EMIT valueChanged(); } } } void SieveScriptListBox::slotBottom() { QListWidgetItem *item = mSieveListScript->currentItem(); if (item) { const int currentIndex = mSieveListScript->currentRow(); if (currentIndex != mSieveListScript->count() - 1) { item = mSieveListScript->takeItem(currentIndex); mSieveListScript->insertItem(mSieveListScript->count(), item); mSieveListScript->setCurrentItem(item); Q_EMIT valueChanged(); } } } void SieveScriptListBox::slotDown() { QListWidgetItem *item = mSieveListScript->currentItem(); if (item) { const int currentIndex = mSieveListScript->currentRow(); if (currentIndex < mSieveListScript->count() - 1) { item = mSieveListScript->takeItem(currentIndex); mSieveListScript->insertItem(currentIndex + 1, item); mSieveListScript->setCurrentItem(item); Q_EMIT valueChanged(); } } } void SieveScriptListBox::slotUp() { QListWidgetItem *item = mSieveListScript->currentItem(); if (item) { const int currentIndex = mSieveListScript->currentRow(); if (currentIndex >= 1) { item = mSieveListScript->takeItem(currentIndex); mSieveListScript->insertItem(currentIndex - 1, item); mSieveListScript->setCurrentItem(item); Q_EMIT valueChanged(); } } } QString SieveScriptListBox::generatedScript(QString &requireModules) const { QString resultScript; QStringList lstRequires; const int numberOfScripts(mSieveListScript->count()); for (int i = 0; i < numberOfScripts; ++i) { SieveScriptListItem *item = static_cast(mSieveListScript->item(i)); if (i != 0) { resultScript += QLatin1String("\n\n"); } resultScript += QLatin1Char('#') + defaultScriptName() + item->text() + QLatin1Char('\n'); resultScript += item->generatedScript(lstRequires); } if (!resultScript.isEmpty()) { resultScript += QLatin1Char('\n'); } QStringList endRequires; for (const QString &r : qAsConst(lstRequires)) { if (!endRequires.contains(r)) { endRequires.append(r); requireModules += QStringLiteral("require \"%1\";\n").arg(r); } } return resultScript; } void SieveScriptListBox::clear() { mScriptNumber = 0; Q_EMIT enableButtonOk(false); //Clear tabpage mSieveListScript->clear(); updateButtons(); } void SieveScriptListBox::loadScript(const QString &doc, QString &error) { clear(); QXmlStreamReader streamReader(doc); if (streamReader.readNextStartElement()) { if (streamReader.name() == QLatin1String("script")) { SieveScriptPage *currentPage = nullptr; ParseSieveScriptTypeBlock typeBlock = TypeUnknown; loadBlock(streamReader, currentPage, typeBlock, error); } } } void SieveScriptListBox::loadBlock(QXmlStreamReader &n, SieveScriptPage *currentPage, ParseSieveScriptTypeBlock typeBlock, QString &error) { QString scriptName; QString comment; bool hasCreatedAIfBlock = false; bool previousElementWasAComment = false; while (n.readNextStartElement()) { const QStringRef tagName = n.name(); //qDebug() <<"SieveScriptListBox::loadBlock tagName " << tagName; if (tagName == QLatin1String("control")) { previousElementWasAComment = false; //Create a new page when before it was "onlyactions" if (typeBlock == TypeBlockAction) { currentPage = nullptr; } if (n.attributes().hasAttribute(QLatin1String("name"))) { const QString controlType = n.attributes().value(QLatin1String("name")).toString(); //qCDebug(LIBKSIEVE_LOG)<<" controlType"<blockIfWidget()->loadScript(n, false, error); } else if (controlType == QLatin1String("elsif")) { typeBlock = TypeBlockElsif; if (!currentPage) { qCDebug(LIBKSIEVE_LOG) << " script is not correct missing if block"; currentPage = createNewScript(scriptName.isEmpty() ? createUniqName() : scriptName, comment); } SieveScriptBlockWidget *blockWidget = currentPage->addScriptBlock(KSieveUi::SieveWidgetPageAbstract::BlockElsIf); if (blockWidget) { blockWidget->loadScript(n, false, error); } } else if (controlType == QLatin1String("else")) { typeBlock = TypeBlockElse; if (!currentPage) { currentPage = createNewScript(scriptName.isEmpty() ? createUniqName() : scriptName, comment); qCDebug(LIBKSIEVE_LOG) << " script is not correct missing if block"; } SieveScriptBlockWidget *blockWidget = currentPage->addScriptBlock(KSieveUi::SieveWidgetPageAbstract::BlockElse); if (blockWidget) { blockWidget->loadScript(n, false, error); } //We are sure that we can't have another elsif currentPage = nullptr; } else if (controlType == QLatin1String("foreverypart")) { typeBlock = TypeBlockForeachBlock; if (!currentPage) { currentPage = createNewScript(scriptName.isEmpty() ? createUniqName() : scriptName, comment); comment.clear(); } if (currentPage->forEveryPartWidget()) { currentPage->forEveryPartWidget()->loadScript(n, error); } else { error += i18n("forEveryPart is not supported by your server") + QLatin1Char('\n'); } //TODO verify it. #ifdef QDOMELEMENT_FIXME QDomNode block = e.firstChildElement(QStringLiteral("block")).firstChild(); loadBlock(block, currentPage, typeBlock, error); #endif } else if (controlType == QLatin1String("require")) { n.skipCurrentElement(); //Nothing. autogenerated } else { qCDebug(LIBKSIEVE_LOG) << " unknown controlType :" << controlType; } } } else if (tagName == QLatin1String("comment")) { previousElementWasAComment = true; #ifdef FIXME_COMMENT if (e.hasAttribute(QStringLiteral("hash"))) { //TODO } else if (e.hasAttribute(QStringLiteral("bracket"))) { //TODO } #endif QString str(n.readElementText()); if (str.contains(defaultScriptName())) { scriptName = str.remove(defaultScriptName()); } else { if (!comment.isEmpty()) { comment += QLatin1Char('\n'); } comment += str; } //qDebug() << " COMMENT " << comment; } else if (tagName == QLatin1String("action")) { previousElementWasAComment = false; if (n.attributes().hasAttribute(QLatin1String("name"))) { const QString actionName = n.attributes().value(QLatin1String("name")).toString(); if (actionName == QLatin1String("include")) { if (!currentPage || (typeBlock == TypeBlockIf) || (typeBlock == TypeBlockElse) || (typeBlock == TypeBlockElsif)) { currentPage = createNewScript(scriptName.isEmpty() ? createUniqName() : scriptName, comment); comment.clear(); } typeBlock = TypeBlockInclude; if (currentPage->includeWidget()) { currentPage->includeWidget()->loadScript(n, error); } else { qCDebug(LIBKSIEVE_LOG) << " include not supported"; } } else if (actionName == QLatin1String("global")) { if (!currentPage || (typeBlock == TypeBlockIf) || (typeBlock == TypeBlockElse) || (typeBlock == TypeBlockElsif)) { currentPage = createNewScript(scriptName.isEmpty() ? createUniqName() : scriptName, comment); comment.clear(); } typeBlock = TypeBlockGlobal; if (currentPage->globalVariableWidget()) { currentPage->globalVariableWidget()->loadScript(n, error); } else { qCDebug(LIBKSIEVE_LOG) << " globalVariable not supported"; } } else if (actionName == QLatin1String("set") && (typeBlock == TypeBlockGlobal)) { //FIXME global not global variable. if (currentPage->globalVariableWidget()) { const SieveGlobalVariableActionWidget::VariableElement var = currentPage->globalVariableWidget()->loadSetVariable(n, error); if (var.isValid()) { qCDebug(LIBKSIEVE_LOG) << "It's not a global variable"; if ((typeBlock == TypeBlockIf) || (typeBlock == TypeBlockElse) || (typeBlock == TypeBlockElsif)) { currentPage = createNewScript(scriptName.isEmpty() ? createUniqName() : scriptName, comment); } typeBlock = TypeBlockAction; comment.clear(); currentPage->blockIfWidget()->loadLocalVariable(var); } } else { qCDebug(LIBKSIEVE_LOG) << " set not supported"; } } else { if (!currentPage || (typeBlock == TypeBlockIf) || (typeBlock == TypeBlockElse) || (typeBlock == TypeBlockElsif)) { currentPage = createNewScript(scriptName.isEmpty() ? createUniqName() : scriptName, comment); } typeBlock = TypeBlockAction; comment.clear(); currentPage->blockIfWidget()->loadScript(n, true, error); } } } else if (tagName == QLatin1String("crlf")) { //If it was a comment previously you will create a \n if (previousElementWasAComment) { comment += QLatin1Char('\n'); } n.skipCurrentElement(); } else { qCDebug(LIBKSIEVE_LOG) << " unknown tagname" << tagName; } } } QString SieveScriptListBox::createUniqName() { const QString pattern = i18n("Script part %1", mScriptNumber); ++mScriptNumber; return pattern; } diff --git a/src/ksieveui/managesievescriptsdialog.cpp b/src/ksieveui/managesievescriptsdialog.cpp index 150696d..7d492af 100644 --- a/src/ksieveui/managesievescriptsdialog.cpp +++ b/src/ksieveui/managesievescriptsdialog.cpp @@ -1,290 +1,286 @@ /* Copyright (C) 2013-2019 Laurent Montel This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2, as published by the Free Software Foundation. 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 "managesievescriptsdialog.h" #include "widgets/custommanagesievewidget.h" #include "widgets/managesievetreeview.h" #include "editor/sievetextedit.h" #include "editor/sieveeditor.h" #include "widgets/sievetreewidgetitem.h" #include "managescriptsjob/checkscriptjob.h" #include "util/sieveimapaccountsettings.h" #include -#include -#include #include #include #include #include #include "libksieve_debug.h" #include #include #include #include #include #include #include using namespace KSieveUi; class KSieveUi::ManageSieveScriptsDialogPrivate { public: ManageSieveScriptsDialogPrivate() : mSieveEditor(nullptr) , mNewScript(nullptr) , mEditScript(nullptr) , mDeleteScript(nullptr) , mDeactivateScript(nullptr) , mIsNewScript(false) , mWasActive(false) { } CustomManageSieveWidget *mTreeView = nullptr; SieveEditor *mSieveEditor = nullptr; QUrl mCurrentURL; QStringList mCurrentCapabilities; QStringList mListOfIncludeFile; KSieveUi::SieveImapAccountSettings mSieveImapAccountSettings; QPushButton *mNewScript = nullptr; QPushButton *mEditScript = nullptr; QPushButton *mDeleteScript = nullptr; QPushButton *mDeactivateScript = nullptr; bool mIsNewScript : 1; bool mWasActive : 1; }; ManageSieveScriptsDialog::ManageSieveScriptsDialog(SieveImapPasswordProvider *passwordProvider, QWidget *parent) : QDialog(parent) , d(new KSieveUi::ManageSieveScriptsDialogPrivate) { setWindowTitle(i18n("Manage Sieve Scripts")); setModal(false); setAttribute(Qt::WA_GroupLeader); setAttribute(Qt::WA_DeleteOnClose); - KWindowSystem::setIcons(winId(), qApp->windowIcon().pixmap(IconSize(KIconLoader::Desktop), IconSize(KIconLoader::Desktop)), - qApp->windowIcon().pixmap(IconSize(KIconLoader::Small), IconSize(KIconLoader::Small))); QVBoxLayout *mainLayout = new QVBoxLayout(this); QFrame *frame = new QFrame; mainLayout->addWidget(frame); QVBoxLayout *vlay = new QVBoxLayout(frame); vlay->setSpacing(0); vlay->setContentsMargins(0, 0, 0, 0); d->mTreeView = new CustomManageSieveWidget(passwordProvider, frame); connect(d->mTreeView, &CustomManageSieveWidget::editScript, this, &ManageSieveScriptsDialog::slotEditScript); connect(d->mTreeView, &CustomManageSieveWidget::newScript, this, &ManageSieveScriptsDialog::slotNewScript); connect(d->mTreeView, &CustomManageSieveWidget::updateButtons, this, &ManageSieveScriptsDialog::slotUpdateButtons); vlay->addWidget(d->mTreeView); QHBoxLayout *buttonLayout = new QHBoxLayout; vlay->addLayout(buttonLayout); d->mNewScript = new QPushButton(i18nc("create a new sieve script", "New...")); connect(d->mNewScript, &QPushButton::clicked, d->mTreeView, &CustomManageSieveWidget::slotNewScript); buttonLayout->addWidget(d->mNewScript); d->mEditScript = new QPushButton(i18n("Edit...")); connect(d->mEditScript, &QPushButton::clicked, d->mTreeView, &CustomManageSieveWidget::slotEditScript); buttonLayout->addWidget(d->mEditScript); d->mDeleteScript = new QPushButton(i18n("Delete")); connect(d->mDeleteScript, &QPushButton::clicked, d->mTreeView, &CustomManageSieveWidget::slotDeleteScript); buttonLayout->addWidget(d->mDeleteScript); d->mDeactivateScript = new QPushButton(i18n("Deactivate")); connect(d->mDeactivateScript, &QPushButton::clicked, d->mTreeView, &CustomManageSieveWidget::slotDeactivateScript); buttonLayout->addWidget(d->mDeactivateScript); QPushButton *close = new QPushButton; KGuiItem::assign(close, KStandardGuiItem::close()); connect(close, &QPushButton::clicked, this, &ManageSieveScriptsDialog::accept); buttonLayout->addWidget(close); KConfigGroup group(KSharedConfig::openConfig(), "ManageSieveScriptsDialog"); const QSize size = group.readEntry("Size", QSize()); if (size.isValid()) { resize(size); } else { resize(sizeHint().width(), sizeHint().height()); } d->mTreeView->slotRefresh(); } ManageSieveScriptsDialog::~ManageSieveScriptsDialog() { KConfigGroup group(KSharedConfig::openConfig(), "ManageSieveScriptsDialog"); group.writeEntry("Size", size()); // prevent QTreeWidget signals triggered by it's desctructor from calling our slots d->mTreeView->disconnect(this); delete d; } void ManageSieveScriptsDialog::hideEvent(QHideEvent *event) { if (!event->spontaneous()) { Q_EMIT finished(); } } void ManageSieveScriptsDialog::slotUpdateButtons(QTreeWidgetItem *item) { Q_UNUSED(item); bool newScriptAction; bool editScriptAction; bool deleteScriptAction; bool desactivateScriptAction; d->mTreeView->enableDisableActions(newScriptAction, editScriptAction, deleteScriptAction, desactivateScriptAction); d->mNewScript->setEnabled(newScriptAction); d->mEditScript->setEnabled(editScriptAction); d->mDeleteScript->setEnabled(deleteScriptAction); d->mDeactivateScript->setEnabled(desactivateScriptAction); } void ManageSieveScriptsDialog::slotEditScript(const ManageSieveWidget::ScriptInfo &info) { d->mCurrentURL = info.currentUrl; d->mCurrentCapabilities = info.currentCapabilities; d->mListOfIncludeFile = info.scriptList; d->mIsNewScript = false; d->mSieveImapAccountSettings = info.sieveImapAccountSettings; KManageSieve::SieveJob *job = KManageSieve::SieveJob::get(info.currentUrl); connect(job, &KManageSieve::SieveJob::result, this, &ManageSieveScriptsDialog::slotGetResult); } void ManageSieveScriptsDialog::slotNewScript(const ManageSieveWidget::ScriptInfo &info) { d->mCurrentCapabilities = info.currentCapabilities; d->mSieveImapAccountSettings = info.sieveImapAccountSettings; d->mCurrentURL = info.currentUrl; d->mListOfIncludeFile = info.scriptList; d->mIsNewScript = true; slotGetResult(nullptr, true, QString(), false); } void ManageSieveScriptsDialog::slotGetResult(KManageSieve::SieveJob *job, bool success, const QString &script, bool isActive) { if (!success) { KMessageBox::error(this, i18n("Retrieving the script failed.\n" "The server responded:\n%1", job->errorString()), i18n("Sieve Error")); return; } if (d->mSieveEditor) { return; } disableManagerScriptsDialog(true); d->mSieveEditor = new SieveEditor; d->mSieveEditor->show(); d->mSieveEditor->setScriptName(d->mCurrentURL.fileName()); d->mSieveEditor->setSieveCapabilities(d->mCurrentCapabilities); d->mSieveEditor->setScript(script, true); /*clear undo/redo*/ d->mSieveEditor->setSieveImapAccountSettings(d->mSieveImapAccountSettings); d->mSieveEditor->setListOfIncludeFile(d->mListOfIncludeFile); connect(d->mSieveEditor, &SieveEditor::okClicked, this, &ManageSieveScriptsDialog::slotSieveEditorOkClicked); connect(d->mSieveEditor, &SieveEditor::cancelClicked, this, &ManageSieveScriptsDialog::slotSieveEditorCancelClicked); connect(d->mSieveEditor, &SieveEditor::checkSyntax, this, &ManageSieveScriptsDialog::slotSieveEditorCheckSyntaxClicked); d->mWasActive = isActive; d->mSieveEditor->setModified(false); } void ManageSieveScriptsDialog::slotSieveEditorCheckSyntaxClicked() { if (!d->mSieveEditor) { return; } const QString script = d->mSieveEditor->script(); if (script.isEmpty()) { return; } d->mSieveEditor->addNormalMessage(i18n("Uploading script to server for checking it, please wait...")); KSieveUi::CheckScriptJob *checkScriptJob = new KSieveUi::CheckScriptJob(this); connect(checkScriptJob, &CheckScriptJob::finished, this, &ManageSieveScriptsDialog::slotCheckScriptFinished); checkScriptJob->setIsActive(d->mWasActive); checkScriptJob->setOriginalScript(d->mSieveEditor->originalScript()); checkScriptJob->setCurrentScript(script); checkScriptJob->setUrl(d->mCurrentURL); checkScriptJob->start(); } void ManageSieveScriptsDialog::slotSieveEditorOkClicked() { disableManagerScriptsDialog(false); if (!d->mSieveEditor) { return; } KManageSieve::SieveJob *job = KManageSieve::SieveJob::put(d->mCurrentURL, d->mSieveEditor->script(), d->mWasActive, d->mWasActive); connect(job, &KManageSieve::SieveJob::result, this, &ManageSieveScriptsDialog::slotPutResult); } void ManageSieveScriptsDialog::slotSieveEditorCancelClicked() { disableManagerScriptsDialog(false); if (d->mSieveEditor) { d->mSieveEditor->deleteLater(); d->mSieveEditor = nullptr; } d->mCurrentURL = QUrl(); if (d->mIsNewScript) { d->mTreeView->slotRefresh(); } } void ManageSieveScriptsDialog::slotCheckScriptFinished(const QString &errorMsg, bool success) { if (success) { d->mSieveEditor->addOkMessage(errorMsg); } else { d->mSieveEditor->addFailedMessage(errorMsg); } d->mSieveEditor->resultDone(); } void ManageSieveScriptsDialog::slotPutResult(KManageSieve::SieveJob *job, bool success) { if (success) { KMessageBox::information(this, i18n("The Sieve script was successfully uploaded."), i18n("Sieve Script Upload")); d->mSieveEditor->deleteLater(); d->mSieveEditor = nullptr; d->mCurrentURL = QUrl(); } else { //Don't add parent otherwise when there is an error it will parent to ManageSieveScriptsDialog and not editor KMessageBox::error(nullptr, i18n("Uploading the Sieve script failed.\n" "The server responded:\n%1", job->errorString()), i18n("Sieve Error")); if (d->mSieveEditor) { d->mSieveEditor->show(); } } } void ManageSieveScriptsDialog::disableManagerScriptsDialog(bool disable) { setDisabled(disable); } diff --git a/src/ksieveui/vacation/autotests/CMakeLists.txt b/src/ksieveui/vacation/autotests/CMakeLists.txt index ae77563..a85e46d 100644 --- a/src/ksieveui/vacation/autotests/CMakeLists.txt +++ b/src/ksieveui/vacation/autotests/CMakeLists.txt @@ -1,36 +1,35 @@ set( EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR} ) macro( add_vacation_test _source ) set( _test ${_source}test.cpp ../${_source}.cpp ../legacy/vacationutils.cpp ../legacy/vacationscriptextractor.cpp ../vacationscriptextractor.cpp ../vacationutils.cpp ../vacationeditwidget.cpp ../vacationmailactionwidget.cpp ../../autocreatescripts/autocreatescriptutil.cpp ) configure_file(../../settings/sieve-editor.kcfg.cmake ${CMAKE_CURRENT_BINARY_DIR}/sieve-editor.kcfg) kconfig_add_kcfg_files(_test ../../settings/sieve-vacation.kcfgc ../../settings/sieve-editor.kcfgc) get_filename_component(_name ${_source}test NAME_WE) ecm_qt_declare_logging_category(_test HEADER libksieve_debug.h IDENTIFIER LIBKSIEVE_LOG CATEGORY_NAME org.kde.pim.libksieve) add_executable(${_name} ${_test}) add_test(NAME vacation-${_name} COMMAND ${_name}) ecm_mark_as_test(vacation-${_name}) add_definitions(-DVACATIONTESTDATADIR="${CMAKE_CURRENT_SOURCE_DIR}/data/") target_link_libraries(${_name} KF5::KSieveUi Qt5::Test KF5::IdentityManagement KF5::Mime KF5::I18n KF5::IconThemes - KF5::WindowSystem KF5::MailTransport ) endmacro() add_vacation_test(vacationutils) add_vacation_test(vacationeditwidget) add_vacation_test(vacationmailactionwidget) diff --git a/src/ksieveui/vacation/multiimapvacationdialog.cpp b/src/ksieveui/vacation/multiimapvacationdialog.cpp index a621032..5cd7b38 100644 --- a/src/ksieveui/vacation/multiimapvacationdialog.cpp +++ b/src/ksieveui/vacation/multiimapvacationdialog.cpp @@ -1,237 +1,231 @@ /* Copyright (C) 2013-2019 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 "multiimapvacationdialog.h" #include "vacationpagewidget.h" #include "multiimapvacationmanager.h" #include #include -#include #include #include -#include #include #include #include #include #include #include #include #include using namespace KSieveUi; class KSieveUi::MultiImapVacationDialogPrivate { public: MultiImapVacationDialogPrivate() { } QVector mListCreateJob; QTabWidget *mTabWidget = nullptr; QStackedWidget *mStackedWidget = nullptr; MultiImapVacationManager *mVacationManager = nullptr; }; MultiImapVacationDialog::MultiImapVacationDialog(MultiImapVacationManager *manager, QWidget *parent) : QDialog(parent) , d(new KSieveUi::MultiImapVacationDialogPrivate) { d->mVacationManager = manager; setWindowTitle(i18n("Configure \"Out of Office\" Replies")); - - KWindowSystem::setIcons(winId(), qApp->windowIcon().pixmap(IconSize(KIconLoader::Desktop), IconSize(KIconLoader::Desktop)), - qApp->windowIcon().pixmap(IconSize(KIconLoader::Small), IconSize(KIconLoader::Small))); - init(); readConfig(); } MultiImapVacationDialog::~MultiImapVacationDialog() { writeConfig(); delete d; } void MultiImapVacationDialog::switchToServerNamePage(const QString &serverName) { const int nbTab(d->mTabWidget->count()); for (int i = 0; i < nbTab; ++i) { if (d->mTabWidget->tabText(i) == serverName) { d->mTabWidget->setCurrentIndex(i); break; } } } void MultiImapVacationDialog::reject() { bool canCloseDialog = true; for (int i = 0; i < d->mTabWidget->count(); ++i) { VacationPageWidget *vacationPage = qobject_cast(d->mTabWidget->widget(i)); if (vacationPage) { if (vacationPage->wasChanged()) { if (KMessageBox::questionYesNo( this, i18nc("@info", "Do you really want to cancel?"), i18nc("@title:window", "Confirmation")) == KMessageBox::Yes) { QDialog::reject(); // Discard current changes } canCloseDialog = false; break; } } } if (canCloseDialog) { QDialog::reject(); } } QVector MultiImapVacationDialog::listCreateJob() const { return d->mListCreateJob; } void MultiImapVacationDialog::init() { d->mStackedWidget = new QStackedWidget; QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->addWidget(d->mStackedWidget); d->mTabWidget = new QTabWidget; d->mStackedWidget->addWidget(d->mTabWidget); QWidget *w = new QWidget; QVBoxLayout *vbox = new QVBoxLayout; w->setLayout(vbox); QLabel *lab = new QLabel(i18n("KMail's Out of Office Reply functionality relies on " "server-side filtering. You have not yet configured an " "IMAP server for this. " "You can do this on the \"Filtering\" tab of the IMAP " "account configuration.")); lab->setWordWrap(true); lab->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter); QFont font = lab->font(); font.setBold(true); font.setPointSize(font.pointSize() + 2); lab->setFont(font); vbox->addWidget(lab); lab->setWordWrap(true); d->mStackedWidget->addWidget(w); d->mStackedWidget->setCurrentIndex(0); bool foundOneImap = false; QDialogButtonBox *buttonBox = nullptr; const QMap list = d->mVacationManager->serverList(); QMapIterator i(list); while (i.hasNext()) { i.next(); createPage(i.key(), i.value()); foundOneImap = true; } if (foundOneImap) { buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::RestoreDefaults, this); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, &QDialogButtonBox::accepted, this, &MultiImapVacationDialog::slotOkClicked); connect(buttonBox, &QDialogButtonBox::rejected, this, &MultiImapVacationDialog::slotCanceled); connect(buttonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::clicked, this, &MultiImapVacationDialog::slotDefaultClicked); } else { //Empty d->mStackedWidget->setCurrentIndex(1); buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, this); connect(buttonBox, &QDialogButtonBox::accepted, this, &MultiImapVacationDialog::slotOkClicked); connect(buttonBox, &QDialogButtonBox::rejected, this, &MultiImapVacationDialog::slotCanceled); } mainLayout->addWidget(buttonBox); if (d->mTabWidget->count() <= 1) { d->mTabWidget->tabBar()->hide(); } } void MultiImapVacationDialog::slotCanceled() { Q_EMIT cancelClicked(); } void MultiImapVacationDialog::createPage(const QString &serverName, const KSieveUi::Util::AccountInfo &info) { VacationPageWidget *page = new VacationPageWidget; page->setServerUrl(info.sieveUrl); page->setServerName(serverName); page->setVacationManager(d->mVacationManager); page->setSieveImapAccountSettings(info.sieveImapAccountSettings); d->mTabWidget->addTab(page, serverName + QStringLiteral(" (%1)").arg(info.sieveUrl.userName())); } void MultiImapVacationDialog::readConfig() { KConfigGroup group(KSharedConfig::openConfig(), "MultiImapVacationDialog"); const QSize size = group.readEntry("Size", QSize()); if (size.isValid()) { resize(size); } else { resize(sizeHint().width(), sizeHint().height()); } } void MultiImapVacationDialog::writeConfig() { KConfigGroup group(KSharedConfig::openConfig(), "MultiImapVacationDialog"); group.writeEntry("Size", size()); } void MultiImapVacationDialog::slotOkClicked() { bool errorFound = false; qDeleteAll(d->mListCreateJob); d->mListCreateJob.clear(); for (int i = 0; i < d->mTabWidget->count(); ++i) { VacationPageWidget *vacationPage = qobject_cast(d->mTabWidget->widget(i)); if (vacationPage) { VacationCreateScriptJob *job = vacationPage->writeScript(errorFound); if (job && !errorFound) { d->mListCreateJob.append(job); } if (errorFound) { //Clean up job qDeleteAll(d->mListCreateJob); d->mListCreateJob.clear(); break; } } } if (!errorFound) { Q_EMIT okClicked(); } } void MultiImapVacationDialog::slotDefaultClicked() { for (int i = 0; i < d->mTabWidget->count(); ++i) { VacationPageWidget *vacationPage = qobject_cast(d->mTabWidget->widget(i)); if (vacationPage) { vacationPage->setDefault(); } } }