diff --git a/CMakeLists.txt b/CMakeLists.txt index a1fbffd..9691537 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,117 +1,118 @@ cmake_minimum_required(VERSION 3.0) 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(PIMCOMMON_LIB_VERSION "5.9.43") 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) + +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 +) + 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_NARROWING_CONVERSIONS_IN_CONNECT) add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x060000) ########### 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/ksieveui/CMakeLists.txt b/src/ksieveui/CMakeLists.txt index 94829b3..484d146 100644 --- a/src/ksieveui/CMakeLists.txt +++ b/src/ksieveui/CMakeLists.txt @@ -1,386 +1,384 @@ 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 ) -if (KF5_USE_PURPOSE) - target_link_libraries(KF5KSieveUi PRIVATE KF5::Purpose KF5::PurposeWidgets) -endif() 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_CONFDIR} ) install(DIRECTORY data/scripts/ DESTINATION ${KDE_INSTALL_DATADIR}/sieve/scripts/ ) diff --git a/src/ksieveui/editor/sieveeditorwidget.cpp b/src/ksieveui/editor/sieveeditorwidget.cpp index 31ac181..738428d 100644 --- a/src/ksieveui/editor/sieveeditorwidget.cpp +++ b/src/ksieveui/editor/sieveeditorwidget.cpp @@ -1,790 +1,750 @@ /* 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 "sievepurposemenuwidget.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 -#ifdef KF5_USE_PURPOSE -#include -#include -#include -#endif +#include #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 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 + + SievePurposeMenuWidget *purposeMenu = new SievePurposeMenuWidget(this, this); + if (purposeMenu->menu()) { + mShareAction = new QAction(i18n("Share..."), this); + mShareAction->setMenu(purposeMenu->menu()); + mShareAction->setIcon(QIcon::fromTheme(QStringLiteral("document-share"))); + //purposeMenu->setEditorWidget(this); + toolbar->addAction(mShareAction); + } else { + delete purposeMenu; + } 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 { {QUrl::fromLocalFile(mTemporaryShareFile->fileName()).toString()} } }, - { 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 dfb75fd..8a1eba3 100644 --- a/src/ksieveui/editor/sieveeditorwidget.h +++ b/src/ksieveui/editor/sieveeditorwidget.h @@ -1,161 +1,149 @@ /* 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 -#ifdef KF5_USE_PURPOSE -namespace Purpose { -class Menu; -} -#endif 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 diff --git a/src/ksieveui/editor/sievepurposemenuwidget.cpp b/src/ksieveui/editor/sievepurposemenuwidget.cpp new file mode 100644 index 0000000..f6946f4 --- /dev/null +++ b/src/ksieveui/editor/sievepurposemenuwidget.cpp @@ -0,0 +1,45 @@ +/* + Copyright (C) 2013-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 "sievepurposemenuwidget.h" + +#include + +using namespace KSieveUi; +SievePurposeMenuWidget::SievePurposeMenuWidget(QWidget *parentWidget, QObject *parent) + : PimCommon::PurposeMenuWidget(parentWidget, parent) +{ + +} + +SievePurposeMenuWidget::~SievePurposeMenuWidget() +{ +} + +QByteArray SievePurposeMenuWidget::text() +{ + if (mSieveEditorWidget) { + return mSieveEditorWidget->script().toUtf8(); + } + return {}; +} + +void SievePurposeMenuWidget::setEditorWidget(SieveEditorWidget *editor) +{ + mSieveEditorWidget = editor; +} diff --git a/src/ksieveui/editor/sievepurposemenuwidget.h b/src/ksieveui/editor/sievepurposemenuwidget.h new file mode 100644 index 0000000..eac3409 --- /dev/null +++ b/src/ksieveui/editor/sievepurposemenuwidget.h @@ -0,0 +1,40 @@ +/* + Copyright (C) 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 SIEVEPURPOSEMENUWIDGET_H +#define SIEVEPURPOSEMENUWIDGET_H + +#include +namespace KSieveUi { +class SieveEditorWidget; +class SievePurposeMenuWidget : public PimCommon::PurposeMenuWidget +{ + Q_OBJECT +public: + explicit SievePurposeMenuWidget(QWidget *parentWidget, QObject *parent = nullptr); + ~SievePurposeMenuWidget() override; + + QByteArray text() override; + void setEditorWidget(SieveEditorWidget *editor); +private: + SieveEditorWidget *mSieveEditorWidget = nullptr; +}; +} + +#endif // SIEVEPURPOSEMENUWIDGET_H