File indexing completed on 2024-05-12 05:25:41

0001 /*
0002    SPDX-FileCopyrightText: 2014-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "sieveeditorpagewidget.h"
0008 #include "sieveeditorglobalconfig.h"
0009 #include <KSieveCore/CheckScriptJob>
0010 
0011 #include <KManageSieve/SieveJob>
0012 
0013 #include <KLocalizedString>
0014 #include <KMessageBox>
0015 
0016 #include "sieveeditor_debug.h"
0017 #include <QVBoxLayout>
0018 
0019 SieveEditorPageWidget::SieveEditorPageWidget(QWidget *parent)
0020     : QWidget(parent)
0021 {
0022     auto vbox = new QVBoxLayout(this);
0023     mSieveEditorWidget = new KSieveUi::SieveEditorWidget(false);
0024     connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::valueChanged, this, &SieveEditorPageWidget::slotValueChanged);
0025     vbox->addWidget(mSieveEditorWidget);
0026     connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::checkSyntax, this, &SieveEditorPageWidget::slotCheckSyntaxClicked);
0027     connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::modeEditorChanged, this, &SieveEditorPageWidget::modeEditorChanged);
0028     connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::undoAvailable, this, &SieveEditorPageWidget::undoAvailable);
0029     connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::redoAvailable, this, &SieveEditorPageWidget::redoAvailable);
0030     connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::copyAvailable, this, &SieveEditorPageWidget::copyAvailable);
0031     connect(mSieveEditorWidget, &KSieveUi::SieveEditorWidget::sieveEditorTabCurrentChanged, this, &SieveEditorPageWidget::sieveEditorTabCurrentChanged);
0032 }
0033 
0034 SieveEditorPageWidget::~SieveEditorPageWidget() = default;
0035 
0036 void SieveEditorPageWidget::slotCheckSyntaxClicked()
0037 {
0038     const QString script = mSieveEditorWidget->script();
0039     if (script.isEmpty()) {
0040         return;
0041     }
0042     mSieveEditorWidget->addNormalMessage(i18n("Uploading script to server for checking it, please wait..."));
0043 
0044     auto checkScriptJob = new KSieveCore::CheckScriptJob(this);
0045     connect(checkScriptJob, &KSieveCore::CheckScriptJob::finished, this, &SieveEditorPageWidget::slotCheckScriptJobFinished);
0046     checkScriptJob->setUrl(mCurrentURL);
0047     checkScriptJob->setIsActive(mWasActive);
0048     checkScriptJob->setCurrentScript(script);
0049     checkScriptJob->setOriginalScript(mSieveEditorWidget->originalScript());
0050     checkScriptJob->start();
0051 }
0052 
0053 void SieveEditorPageWidget::slotCheckScriptJobFinished(const QString &errorMsg, bool success)
0054 {
0055     if (success) {
0056         mSieveEditorWidget->addOkMessage(errorMsg);
0057     } else {
0058         mSieveEditorWidget->addFailedMessage(errorMsg);
0059     }
0060     mSieveEditorWidget->resultDone();
0061 }
0062 
0063 void SieveEditorPageWidget::setIsNewScript(bool isNewScript)
0064 {
0065     mIsNewScript = isNewScript;
0066 }
0067 
0068 void SieveEditorPageWidget::loadScript(const KSieveUi::ManageSieveWidget::ScriptInfo &info)
0069 {
0070     mCurrentURL = info.currentUrl;
0071     mSieveEditorWidget->setSieveCapabilities(info.currentCapabilities);
0072     mSieveEditorWidget->setSieveImapAccountSettings(info.sieveImapAccountSettings);
0073     mSieveEditorWidget->setListOfIncludeFile(info.scriptList);
0074     mSieveEditorWidget->setReadOnly(true);
0075     mSieveEditorWidget->setWordWrap(SieveEditorGlobalConfig::self()->wrapText());
0076     KManageSieve::SieveJob *job = KManageSieve::SieveJob::get(mCurrentURL);
0077     connect(job, &KManageSieve::SieveJob::result, this, &SieveEditorPageWidget::slotGetResult);
0078 }
0079 
0080 QUrl SieveEditorPageWidget::currentUrl() const
0081 {
0082     return mCurrentURL;
0083 }
0084 
0085 void SieveEditorPageWidget::renameScriptName(const QString &newName)
0086 {
0087     mSieveEditorWidget->setScriptName(newName);
0088 }
0089 
0090 void SieveEditorPageWidget::setCurrentUrl(const QUrl &url)
0091 {
0092     mCurrentURL = url;
0093 }
0094 
0095 void SieveEditorPageWidget::slotGetResult(KManageSieve::SieveJob *, bool success, const QString &script, bool isActive)
0096 {
0097     mSieveEditorWidget->setReadOnly(false);
0098     if (!success) {
0099         return;
0100     }
0101     mSieveEditorWidget->setScriptName(mCurrentURL.fileName());
0102     mSieveEditorWidget->setScript(script, true);
0103     mWasActive = isActive;
0104     mSieveEditorWidget->setModified(false);
0105 }
0106 
0107 bool SieveEditorPageWidget::uploadScriptAndCloseTab(int index)
0108 {
0109     if (mSieveEditorWidget->isModified()) {
0110         KManageSieve::SieveJob *job = KManageSieve::SieveJob::put(mCurrentURL, mSieveEditorWidget->script(), mWasActive, mWasActive);
0111         job->setProperty("showuploadinformation", true);
0112         job->setProperty("tabIndex", index);
0113         connect(job, &KManageSieve::SieveJob::result, this, &SieveEditorPageWidget::slotPutResult);
0114         return true;
0115     }
0116     return false;
0117 }
0118 
0119 void SieveEditorPageWidget::uploadScript(bool showInformation, bool forceSave)
0120 {
0121     if (mSieveEditorWidget->isModified() || forceSave) {
0122         KManageSieve::SieveJob *job = KManageSieve::SieveJob::put(mCurrentURL, mSieveEditorWidget->script(), mWasActive, mWasActive);
0123         job->setProperty("showuploadinformation", showInformation);
0124         connect(job, &KManageSieve::SieveJob::result, this, &SieveEditorPageWidget::slotPutResult);
0125     }
0126 }
0127 
0128 void SieveEditorPageWidget::slotPutResult(KManageSieve::SieveJob *job, bool success)
0129 {
0130     if (mIsNewScript) {
0131         Q_EMIT refreshList();
0132     }
0133     if (success) {
0134         if (job->property("showuploadinformation").toBool()) {
0135             KMessageBox::information(this, i18n("The Sieve script was successfully uploaded."), i18nc("@title:window", "Sieve Script Upload"));
0136         }
0137         mIsNewScript = false;
0138         mSieveEditorWidget->updateOriginalScript();
0139         mSieveEditorWidget->setModified(false);
0140         if (job->property("tabIndex").isValid()) {
0141             const int index = job->property("tabIndex").toInt();
0142             Q_EMIT requestCloseTab(index);
0143         }
0144     } else {
0145         const QString msg = job->errorString();
0146         if (!msg.isEmpty()) {
0147             KMessageBox::error(this,
0148                                i18n("Uploading the Sieve script failed.\n"
0149                                     "The server responded:\n%1",
0150                                     msg),
0151                                i18nc("@title:window", "Sieve Error"));
0152         } else {
0153             KMessageBox::error(this,
0154                                i18n("Uploading the Sieve script failed.\n"
0155                                     "unknown reason\n"),
0156                                i18nc("@title:window", "Sieve Error"));
0157         }
0158     }
0159 }
0160 
0161 bool SieveEditorPageWidget::needToSaveScript()
0162 {
0163     bool result = false;
0164     if (mIsNewScript) {
0165         const int resultQuestion = KMessageBox::warningTwoActionsCancel(this,
0166                                                                         i18n("Script '%1' is new. Do you want to save it?", mCurrentURL.fileName()),
0167                                                                         i18nc("@title:window", "Save Script"),
0168                                                                         KStandardGuiItem::save(),
0169                                                                         KStandardGuiItem::discard());
0170         if (resultQuestion == KMessageBox::ButtonCode::PrimaryAction) {
0171             uploadScript();
0172             result = true;
0173         } else if (resultQuestion == KMessageBox::Cancel) {
0174             result = true;
0175         }
0176     } else {
0177         if (mSieveEditorWidget->isModified()) {
0178             const int resultQuestion = KMessageBox::warningTwoActionsCancel(this,
0179                                                                             i18n("Script '%1' was changed. Do you want to save it ?", mCurrentURL.fileName()),
0180                                                                             i18nc("@title:window", "Save Script"),
0181                                                                             KStandardGuiItem::save(),
0182                                                                             KStandardGuiItem::discard());
0183             if (resultQuestion == KMessageBox::ButtonCode::PrimaryAction) {
0184                 uploadScript();
0185                 result = true;
0186             } else if (resultQuestion == KMessageBox::Cancel) {
0187                 result = true;
0188             }
0189         }
0190     }
0191     return result;
0192 }
0193 
0194 void SieveEditorPageWidget::slotValueChanged(bool b)
0195 {
0196     Q_EMIT scriptModified(b, this);
0197 }
0198 
0199 bool SieveEditorPageWidget::isModified() const
0200 {
0201     return mSieveEditorWidget->isModified();
0202 }
0203 
0204 void SieveEditorPageWidget::goToLine()
0205 {
0206     mSieveEditorWidget->goToLine();
0207 }
0208 
0209 void SieveEditorPageWidget::undo()
0210 {
0211     mSieveEditorWidget->undo();
0212 }
0213 
0214 bool SieveEditorPageWidget::isUndoAvailable() const
0215 {
0216     return mSieveEditorWidget->isUndoAvailable();
0217 }
0218 
0219 bool SieveEditorPageWidget::isRedoAvailable() const
0220 {
0221     return mSieveEditorWidget->isRedoAvailable();
0222 }
0223 
0224 bool SieveEditorPageWidget::hasSelection() const
0225 {
0226     return mSieveEditorWidget->hasSelection();
0227 }
0228 
0229 void SieveEditorPageWidget::redo()
0230 {
0231     mSieveEditorWidget->redo();
0232 }
0233 
0234 void SieveEditorPageWidget::find()
0235 {
0236     mSieveEditorWidget->find();
0237 }
0238 
0239 void SieveEditorPageWidget::replace()
0240 {
0241     mSieveEditorWidget->replace();
0242 }
0243 
0244 void SieveEditorPageWidget::import()
0245 {
0246     mSieveEditorWidget->slotImport();
0247 }
0248 
0249 void SieveEditorPageWidget::comment()
0250 {
0251     mSieveEditorWidget->comment();
0252 }
0253 
0254 void SieveEditorPageWidget::uncomment()
0255 {
0256     mSieveEditorWidget->uncomment();
0257 }
0258 
0259 void SieveEditorPageWidget::checkSpelling()
0260 {
0261     mSieveEditorWidget->checkSpelling();
0262 }
0263 
0264 void SieveEditorPageWidget::createRulesGraphically()
0265 {
0266     mSieveEditorWidget->slotCreateRulesGraphically();
0267 }
0268 
0269 void SieveEditorPageWidget::checkSyntax()
0270 {
0271     mSieveEditorWidget->slotCheckSyntax();
0272 }
0273 
0274 void SieveEditorPageWidget::saveAs()
0275 {
0276     mSieveEditorWidget->slotSaveAs();
0277 }
0278 
0279 void SieveEditorPageWidget::reverseCase()
0280 {
0281     mSieveEditorWidget->reverseCase();
0282 }
0283 
0284 void SieveEditorPageWidget::lowerCase()
0285 {
0286     mSieveEditorWidget->lowerCase();
0287 }
0288 
0289 void SieveEditorPageWidget::debugSieveScript()
0290 {
0291     mSieveEditorWidget->debugSieveScript();
0292 }
0293 
0294 void SieveEditorPageWidget::upperCase()
0295 {
0296     mSieveEditorWidget->upperCase();
0297 }
0298 
0299 void SieveEditorPageWidget::sentenceCase()
0300 {
0301     mSieveEditorWidget->sentenceCase();
0302 }
0303 
0304 KSieveUi::SieveEditorWidget::EditorMode SieveEditorPageWidget::pageMode() const
0305 {
0306     return mSieveEditorWidget->mode();
0307 }
0308 
0309 void SieveEditorPageWidget::paste()
0310 {
0311     mSieveEditorWidget->paste();
0312 }
0313 
0314 void SieveEditorPageWidget::cut()
0315 {
0316     mSieveEditorWidget->cut();
0317 }
0318 
0319 void SieveEditorPageWidget::copy()
0320 {
0321     mSieveEditorWidget->copy();
0322 }
0323 
0324 void SieveEditorPageWidget::selectAll()
0325 {
0326     mSieveEditorWidget->selectAll();
0327 }
0328 
0329 void SieveEditorPageWidget::zoomIn()
0330 {
0331     mSieveEditorWidget->zoomIn();
0332 }
0333 
0334 void SieveEditorPageWidget::zoomOut()
0335 {
0336     mSieveEditorWidget->zoomOut();
0337 }
0338 
0339 QString SieveEditorPageWidget::currentText() const
0340 {
0341     return mSieveEditorWidget->script();
0342 }
0343 
0344 void SieveEditorPageWidget::setWordWrap(bool state)
0345 {
0346     mSieveEditorWidget->setWordWrap(state);
0347 }
0348 
0349 bool SieveEditorPageWidget::isWordWrap() const
0350 {
0351     return mSieveEditorWidget->isWordWrap();
0352 }
0353 
0354 void SieveEditorPageWidget::print()
0355 {
0356     mSieveEditorWidget->print();
0357 }
0358 
0359 void SieveEditorPageWidget::printPreview()
0360 {
0361     mSieveEditorWidget->printPreview();
0362 }
0363 
0364 bool SieveEditorPageWidget::printSupportEnabled() const
0365 {
0366     return mSieveEditorWidget->printSupportEnabled();
0367 }
0368 
0369 bool SieveEditorPageWidget::isTextEditor() const
0370 {
0371     return mSieveEditorWidget->isTextEditor();
0372 }
0373 
0374 void SieveEditorPageWidget::zoomReset()
0375 {
0376     mSieveEditorWidget->zoomReset();
0377 }
0378 
0379 void SieveEditorPageWidget::openBookmarkUrl(const QUrl &url)
0380 {
0381     mSieveEditorWidget->openBookmarkUrl(url);
0382 }
0383 
0384 QString SieveEditorPageWidget::currentHelpTitle() const
0385 {
0386     return mSieveEditorWidget->currentHelpTitle();
0387 }
0388 
0389 QUrl SieveEditorPageWidget::currentHelpUrl() const
0390 {
0391     return mSieveEditorWidget->currentHelpUrl();
0392 }
0393 
0394 #include "moc_sieveeditorpagewidget.cpp"