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"