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

0001 /*
0002    SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "sieveeditormainwidget.h"
0008 #include "sieveeditoremptytabwidgetlabel.h"
0009 #include "sieveeditorpagewidget.h"
0010 #include "sieveeditorscriptmanagerwidget.h"
0011 #include "sieveeditortabwidget.h"
0012 #include <KSieveUi/SieveEditor>
0013 
0014 #include <KColorScheme>
0015 #include <KConfigGroup>
0016 #include <KLocalizedString>
0017 #include <KMessageBox>
0018 #include <KSharedConfig>
0019 #include <QTabWidget>
0020 
0021 #include <QApplication>
0022 #include <QStackedWidget>
0023 #include <QTabBar>
0024 
0025 namespace
0026 {
0027 static const char mySieveEditorMainWidgetConfigGroupName[] = "SieveEditorMainWidget";
0028 }
0029 SieveEditorMainWidget::SieveEditorMainWidget(KActionCollection *ac, QWidget *parent)
0030     : QSplitter(parent)
0031 {
0032     mStackedWidget = new QStackedWidget(this);
0033     mStackedWidget->setObjectName(QLatin1StringView("stackedwidget"));
0034 
0035     mEditorEmptyLabel = new SieveEditorEmptyTabWidgetLabel;
0036 
0037     mTabWidget = new SieveEditorTabWidget(ac);
0038     connect(mTabWidget, &SieveEditorTabWidget::tabCloseRequestedIndex, this, &SieveEditorMainWidget::slotTabCloseRequested);
0039     connect(mTabWidget, &SieveEditorTabWidget::tabRemoveAllExclude, this, &SieveEditorMainWidget::slotTabRemoveAllExclude);
0040     connect(mTabWidget, &SieveEditorTabWidget::tabCloseAllTab, this, &SieveEditorMainWidget::slotTabCloseAllRequested);
0041 
0042     mStackedWidget->addWidget(mTabWidget);
0043     mStackedWidget->addWidget(mEditorEmptyLabel);
0044     addWidget(mStackedWidget);
0045 
0046     mScriptManagerWidget = new SieveEditorScriptManagerWidget;
0047     connect(mScriptManagerWidget, &SieveEditorScriptManagerWidget::createScriptPage, this, &SieveEditorMainWidget::slotCreateScriptPage);
0048     connect(mScriptManagerWidget, &SieveEditorScriptManagerWidget::updateButtons, this, &SieveEditorMainWidget::updateButtons);
0049     connect(mScriptManagerWidget, &SieveEditorScriptManagerWidget::scriptDeleted, this, &SieveEditorMainWidget::slotScriptDeleted);
0050     connect(mScriptManagerWidget, &SieveEditorScriptManagerWidget::serverSieveFound, this, &SieveEditorMainWidget::serverSieveFound);
0051     connect(mScriptManagerWidget, &SieveEditorScriptManagerWidget::scriptRenamed, this, &SieveEditorMainWidget::slotScriptRenamed);
0052     connect(this, &SieveEditorMainWidget::updateScriptList, mScriptManagerWidget, &SieveEditorScriptManagerWidget::slotRefreshList);
0053     addWidget(mScriptManagerWidget);
0054     setChildrenCollapsible(false);
0055     QList<int> splitterSizes;
0056     splitterSizes << 80 << 20;
0057     KConfigGroup myGroup(KSharedConfig::openStateConfig(), QLatin1StringView(mySieveEditorMainWidgetConfigGroupName));
0058     setSizes(myGroup.readEntry("mainSplitter", splitterSizes));
0059     updateStackedWidget();
0060 }
0061 
0062 SieveEditorMainWidget::~SieveEditorMainWidget()
0063 {
0064     disconnect(mScriptManagerWidget, &SieveEditorScriptManagerWidget::updateButtons, this, &SieveEditorMainWidget::updateButtons);
0065     KConfigGroup myGroup(KSharedConfig::openStateConfig(), QLatin1StringView(mySieveEditorMainWidgetConfigGroupName));
0066     myGroup.writeEntry("mainSplitter", sizes());
0067     myGroup.sync();
0068 }
0069 
0070 QWidget *SieveEditorMainWidget::hasExistingPage(const QUrl &url)
0071 {
0072     for (int i = 0; i < mTabWidget->count(); ++i) {
0073         auto page = qobject_cast<SieveEditorPageWidget *>(mTabWidget->widget(i));
0074         if (page) {
0075             if (page->currentUrl() == url) {
0076                 return page;
0077             }
0078         }
0079     }
0080     return nullptr;
0081 }
0082 
0083 void SieveEditorMainWidget::updateStackedWidget()
0084 {
0085     if (mTabWidget->count() == 0) {
0086         mStackedWidget->setCurrentWidget(mEditorEmptyLabel);
0087     } else {
0088         mStackedWidget->setCurrentWidget(mTabWidget);
0089     }
0090 }
0091 
0092 void SieveEditorMainWidget::slotScriptDeleted(const QUrl &url)
0093 {
0094     QWidget *page = hasExistingPage(url);
0095     if (page) {
0096         mTabWidget->removeTab(mTabWidget->indexOf(page));
0097         delete page;
0098     }
0099     updateStackedWidget();
0100 }
0101 
0102 void SieveEditorMainWidget::slotScriptRenamed(const QUrl &oldUrl, const QUrl &newUrl)
0103 {
0104     QWidget *page = hasExistingPage(oldUrl);
0105     if (page) {
0106         if (auto editor = qobject_cast<SieveEditorPageWidget *>(page)) {
0107             editor->setCurrentUrl(newUrl);
0108             const QString newScriptName = newUrl.fileName();
0109             mTabWidget->setTabText(mTabWidget->indexOf(page), newScriptName);
0110             editor->renameScriptName(newScriptName);
0111         }
0112     }
0113     updateStackedWidget();
0114 }
0115 
0116 void SieveEditorMainWidget::slotCreateScriptPage(const KSieveUi::ManageSieveWidget::ScriptInfo &info, bool isNewScript)
0117 {
0118     QWidget *page = hasExistingPage(info.currentUrl);
0119     if (page) {
0120         mTabWidget->setCurrentWidget(page);
0121     } else {
0122         auto editor = new SieveEditorPageWidget;
0123         connect(editor, &SieveEditorPageWidget::refreshList, this, &SieveEditorMainWidget::updateScriptList);
0124         connect(editor, &SieveEditorPageWidget::scriptModified, this, &SieveEditorMainWidget::slotScriptModified);
0125         connect(editor, &SieveEditorPageWidget::modeEditorChanged, this, &SieveEditorMainWidget::modeEditorChanged);
0126         connect(editor, &SieveEditorPageWidget::undoAvailable, this, &SieveEditorMainWidget::undoAvailable);
0127         connect(editor, &SieveEditorPageWidget::redoAvailable, this, &SieveEditorMainWidget::redoAvailable);
0128         connect(editor, &SieveEditorPageWidget::copyAvailable, this, &SieveEditorMainWidget::copyAvailable);
0129         connect(editor, &SieveEditorPageWidget::sieveEditorTabCurrentChanged, this, &SieveEditorMainWidget::sieveEditorTabCurrentChanged);
0130         connect(editor, &SieveEditorPageWidget::requestCloseTab, this, &SieveEditorMainWidget::forceCloseTab);
0131         editor->setIsNewScript(isNewScript);
0132         editor->loadScript(info);
0133         mTabWidget->addTab(editor, info.currentUrl.fileName());
0134         mTabWidget->setCurrentWidget(editor);
0135         if (isNewScript) {
0136             editor->uploadScript(false, true);
0137         }
0138         updateStackedWidget();
0139     }
0140 }
0141 
0142 void SieveEditorMainWidget::createNewScript()
0143 {
0144     mScriptManagerWidget->slotCreateNewScript();
0145 }
0146 
0147 void SieveEditorMainWidget::deleteScript()
0148 {
0149     mScriptManagerWidget->slotDeleteScript();
0150 }
0151 
0152 void SieveEditorMainWidget::updateServerList()
0153 {
0154     mScriptManagerWidget->updateServerList();
0155 }
0156 
0157 void SieveEditorMainWidget::editScript()
0158 {
0159     mScriptManagerWidget->editScript();
0160 }
0161 
0162 void SieveEditorMainWidget::desactivateScript()
0163 {
0164     mScriptManagerWidget->desactivateScript();
0165 }
0166 
0167 void SieveEditorMainWidget::refreshList()
0168 {
0169     mScriptManagerWidget->refreshList();
0170 }
0171 
0172 void SieveEditorMainWidget::uploadScript()
0173 {
0174     QWidget *w = mTabWidget->currentWidget();
0175     if (w) {
0176         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0177         if (page) {
0178             page->uploadScript();
0179         }
0180     }
0181 }
0182 
0183 bool SieveEditorMainWidget::needToSaveScript()
0184 {
0185     bool scriptSaved = false;
0186     for (int i = 0; i < mTabWidget->count(); ++i) {
0187         auto page = qobject_cast<SieveEditorPageWidget *>(mTabWidget->widget(i));
0188         if (page) {
0189             const bool result = page->needToSaveScript();
0190             if (result) {
0191                 scriptSaved = true;
0192             }
0193         }
0194     }
0195     return scriptSaved;
0196 }
0197 
0198 QTabWidget *SieveEditorMainWidget::tabWidget() const
0199 {
0200     return mTabWidget;
0201 }
0202 
0203 bool SieveEditorMainWidget::isUndoAvailable() const
0204 {
0205     QWidget *w = mTabWidget->currentWidget();
0206     if (w) {
0207         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0208         if (page) {
0209             return page->isUndoAvailable();
0210         }
0211     }
0212     return false;
0213 }
0214 
0215 bool SieveEditorMainWidget::isRedoAvailable() const
0216 {
0217     QWidget *w = mTabWidget->currentWidget();
0218     if (w) {
0219         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0220         if (page) {
0221             return page->isRedoAvailable();
0222         }
0223     }
0224     return false;
0225 }
0226 
0227 bool SieveEditorMainWidget::isWordWrap() const
0228 {
0229     QWidget *w = mTabWidget->currentWidget();
0230     if (w) {
0231         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0232         if (page) {
0233             return page->isWordWrap();
0234         }
0235     }
0236     return false;
0237 }
0238 
0239 bool SieveEditorMainWidget::hasSelection() const
0240 {
0241     QWidget *w = mTabWidget->currentWidget();
0242     if (w) {
0243         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0244         if (page) {
0245             return page->hasSelection();
0246         }
0247     }
0248     return false;
0249 }
0250 
0251 void SieveEditorMainWidget::slotSelectAll()
0252 {
0253     QWidget *w = mTabWidget->currentWidget();
0254     if (w) {
0255         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0256         if (page) {
0257             page->selectAll();
0258         }
0259     }
0260 }
0261 
0262 void SieveEditorMainWidget::slotCopy()
0263 {
0264     QWidget *w = mTabWidget->currentWidget();
0265     if (w) {
0266         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0267         if (page) {
0268             page->copy();
0269         }
0270     }
0271 }
0272 
0273 void SieveEditorMainWidget::slotPaste()
0274 {
0275     QWidget *w = mTabWidget->currentWidget();
0276     if (w) {
0277         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0278         if (page) {
0279             page->paste();
0280         }
0281     }
0282 }
0283 
0284 void SieveEditorMainWidget::slotCut()
0285 {
0286     QWidget *w = mTabWidget->currentWidget();
0287     if (w) {
0288         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0289         if (page) {
0290             page->cut();
0291         }
0292     }
0293 }
0294 
0295 void SieveEditorMainWidget::slotUndo()
0296 {
0297     QWidget *w = mTabWidget->currentWidget();
0298     if (w) {
0299         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0300         if (page) {
0301             page->undo();
0302         }
0303     }
0304 }
0305 
0306 void SieveEditorMainWidget::slotRedo()
0307 {
0308     QWidget *w = mTabWidget->currentWidget();
0309     if (w) {
0310         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0311         if (page) {
0312             page->redo();
0313         }
0314     }
0315 }
0316 
0317 void SieveEditorMainWidget::slotGoToLine()
0318 {
0319     QWidget *w = mTabWidget->currentWidget();
0320     if (w) {
0321         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0322         if (page) {
0323             page->goToLine();
0324         }
0325     }
0326 }
0327 
0328 void SieveEditorMainWidget::slotFind()
0329 {
0330     QWidget *w = mTabWidget->currentWidget();
0331     if (w) {
0332         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0333         if (page) {
0334             page->find();
0335         }
0336     }
0337 }
0338 
0339 void SieveEditorMainWidget::slotReplace()
0340 {
0341     QWidget *w = mTabWidget->currentWidget();
0342     if (w) {
0343         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0344         if (page) {
0345             page->replace();
0346         }
0347     }
0348 }
0349 
0350 QString SieveEditorMainWidget::currentText() const
0351 {
0352     QWidget *w = mTabWidget->currentWidget();
0353     if (w) {
0354         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0355         if (page) {
0356             return page->currentText();
0357         }
0358     }
0359     return {};
0360 }
0361 
0362 void SieveEditorMainWidget::slotCreateRulesGraphically()
0363 {
0364     QWidget *w = mTabWidget->currentWidget();
0365     if (w) {
0366         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0367         if (page) {
0368             page->createRulesGraphically();
0369         }
0370     }
0371 }
0372 
0373 void SieveEditorMainWidget::slotCheckSyntax()
0374 {
0375     QWidget *w = mTabWidget->currentWidget();
0376     if (w) {
0377         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0378         if (page) {
0379             page->checkSyntax();
0380         }
0381     }
0382 }
0383 
0384 void SieveEditorMainWidget::slotComment()
0385 {
0386     QWidget *w = mTabWidget->currentWidget();
0387     if (w) {
0388         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0389         if (page) {
0390             page->comment();
0391         }
0392     }
0393 }
0394 
0395 void SieveEditorMainWidget::slotUncomment()
0396 {
0397     QWidget *w = mTabWidget->currentWidget();
0398     if (w) {
0399         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0400         if (page) {
0401             page->uncomment();
0402         }
0403     }
0404 }
0405 
0406 void SieveEditorMainWidget::slotImport()
0407 {
0408     QWidget *w = mTabWidget->currentWidget();
0409     if (w) {
0410         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0411         if (page) {
0412             page->import();
0413         }
0414     }
0415 }
0416 
0417 void SieveEditorMainWidget::slotCheckSpelling()
0418 {
0419     QWidget *w = mTabWidget->currentWidget();
0420     if (w) {
0421         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0422         if (page) {
0423             page->checkSpelling();
0424         }
0425     }
0426 }
0427 
0428 void SieveEditorMainWidget::slotSaveAs()
0429 {
0430     QWidget *w = mTabWidget->currentWidget();
0431     if (w) {
0432         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0433         if (page) {
0434             page->saveAs();
0435         }
0436     }
0437 }
0438 
0439 void SieveEditorMainWidget::slotReverseCase()
0440 {
0441     QWidget *w = mTabWidget->currentWidget();
0442     if (w) {
0443         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0444         if (page) {
0445             page->reverseCase();
0446         }
0447     }
0448 }
0449 
0450 void SieveEditorMainWidget::slotDebugSieveScript()
0451 {
0452     QWidget *w = mTabWidget->currentWidget();
0453     if (w) {
0454         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0455         if (page) {
0456             page->debugSieveScript();
0457         }
0458     }
0459 }
0460 
0461 void SieveEditorMainWidget::slotUpperCase()
0462 {
0463     QWidget *w = mTabWidget->currentWidget();
0464     if (w) {
0465         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0466         if (page) {
0467             page->upperCase();
0468         }
0469     }
0470 }
0471 
0472 void SieveEditorMainWidget::slotSentenceCase()
0473 {
0474     QWidget *w = mTabWidget->currentWidget();
0475     if (w) {
0476         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0477         if (page) {
0478             page->sentenceCase();
0479         }
0480     }
0481 }
0482 
0483 void SieveEditorMainWidget::slotLowerCase()
0484 {
0485     QWidget *w = mTabWidget->currentWidget();
0486     if (w) {
0487         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0488         if (page) {
0489             page->lowerCase();
0490         }
0491     }
0492 }
0493 
0494 void SieveEditorMainWidget::slotScriptModified(bool modified, SieveEditorPageWidget *page)
0495 {
0496     const int index = mTabWidget->indexOf(page);
0497     if (index >= 0) {
0498         if (!mScriptColor.isValid()) {
0499             updatePaletteColor();
0500         }
0501         mTabWidget->tabBar()->setTabTextColor(index, modified ? mModifiedScriptColor : mScriptColor);
0502     }
0503 }
0504 
0505 void SieveEditorMainWidget::slotGeneralPaletteChanged()
0506 {
0507     updatePaletteColor();
0508     for (int i = mTabWidget->count() - 1; i >= 0; --i) {
0509         auto page = qobject_cast<SieveEditorPageWidget *>(mTabWidget->widget(i));
0510         if (page) {
0511             mTabWidget->tabBar()->setTabTextColor(i, page->isModified() ? mModifiedScriptColor : mScriptColor);
0512         }
0513     }
0514 }
0515 
0516 void SieveEditorMainWidget::slotZoomIn()
0517 {
0518     QWidget *w = mTabWidget->currentWidget();
0519     if (w) {
0520         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0521         if (page) {
0522             page->zoomIn();
0523         }
0524     }
0525 }
0526 
0527 void SieveEditorMainWidget::slotZoomOut()
0528 {
0529     QWidget *w = mTabWidget->currentWidget();
0530     if (w) {
0531         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0532         if (page) {
0533             page->zoomOut();
0534         }
0535     }
0536 }
0537 
0538 void SieveEditorMainWidget::slotZoomReset()
0539 {
0540     QWidget *w = mTabWidget->currentWidget();
0541     if (w) {
0542         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0543         if (page) {
0544             page->zoomReset();
0545         }
0546     }
0547 }
0548 
0549 void SieveEditorMainWidget::slotWordWrap(bool state)
0550 {
0551     QWidget *w = mTabWidget->currentWidget();
0552     if (w) {
0553         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0554         if (page) {
0555             page->setWordWrap(state);
0556         }
0557     }
0558 }
0559 
0560 void SieveEditorMainWidget::slotPrintPreview()
0561 {
0562     QWidget *w = mTabWidget->currentWidget();
0563     if (w) {
0564         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0565         if (page) {
0566             page->printPreview();
0567         }
0568     }
0569 }
0570 
0571 void SieveEditorMainWidget::slotPrint()
0572 {
0573     QWidget *w = mTabWidget->currentWidget();
0574     if (w) {
0575         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0576         if (page) {
0577             page->print();
0578         }
0579     }
0580 }
0581 
0582 void SieveEditorMainWidget::updatePaletteColor()
0583 {
0584     const KColorScheme scheme(QPalette::Active, KColorScheme::View);
0585     mScriptColor = scheme.foreground(KColorScheme::NormalText).color();
0586 
0587     mModifiedScriptColor = scheme.foreground(KColorScheme::NegativeText).color();
0588 }
0589 
0590 void SieveEditorMainWidget::forceCloseTab(int index)
0591 {
0592     auto page = qobject_cast<SieveEditorPageWidget *>(mTabWidget->widget(index));
0593     if (page) {
0594         mTabWidget->removeTab(index);
0595         delete page;
0596         updateStackedWidget();
0597     }
0598 }
0599 
0600 void SieveEditorMainWidget::slotTabCloseRequested(int index)
0601 {
0602     auto page = qobject_cast<SieveEditorPageWidget *>(mTabWidget->widget(index));
0603     if (page) {
0604         if (page->isModified()) {
0605             const int result = KMessageBox::questionTwoActionsCancel(this,
0606                                                                      i18n("Script was modified. Do you want to save before closing?"),
0607                                                                      i18nc("@title:window", "Close script"),
0608                                                                      KStandardGuiItem::save(),
0609                                                                      KStandardGuiItem::close(),
0610                                                                      KStandardGuiItem::cancel());
0611             if (result == KMessageBox::ButtonCode::PrimaryAction) {
0612                 if (page->uploadScriptAndCloseTab(index)) {
0613                     return;
0614                 }
0615             } else if (result == KMessageBox::Cancel) {
0616                 return;
0617             }
0618         }
0619         mTabWidget->removeTab(index);
0620         delete page;
0621     }
0622     updateStackedWidget();
0623 }
0624 
0625 void SieveEditorMainWidget::slotTabCloseAllRequested()
0626 {
0627     for (int i = mTabWidget->count() - 1; i >= 0; --i) {
0628         slotTabCloseRequested(i);
0629     }
0630 }
0631 
0632 void SieveEditorMainWidget::slotTabRemoveAllExclude(int index)
0633 {
0634     for (int i = mTabWidget->count() - 1; i >= 0; --i) {
0635         if (i == index) {
0636             continue;
0637         }
0638         slotTabCloseRequested(i);
0639     }
0640 }
0641 
0642 KSieveUi::SieveEditorWidget::EditorMode SieveEditorMainWidget::pageMode() const
0643 {
0644     QWidget *w = mTabWidget->currentWidget();
0645     if (w) {
0646         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0647         if (page) {
0648             return page->pageMode();
0649         }
0650     }
0651     return KSieveUi::SieveEditorWidget::Unknown;
0652 }
0653 
0654 void SieveEditorMainWidget::openBookmarkUrl(const QUrl &url)
0655 {
0656     QWidget *w = mTabWidget->currentWidget();
0657     if (w) {
0658         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0659         if (page) {
0660             page->openBookmarkUrl(url);
0661         }
0662     }
0663 }
0664 
0665 QString SieveEditorMainWidget::currentHelpTitle() const
0666 {
0667     QWidget *w = mTabWidget->currentWidget();
0668     if (w) {
0669         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0670         if (page) {
0671             return page->currentHelpTitle();
0672         }
0673     }
0674     return {};
0675 }
0676 
0677 QUrl SieveEditorMainWidget::currentHelpUrl() const
0678 {
0679     QWidget *w = mTabWidget->currentWidget();
0680     if (w) {
0681         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0682         if (page) {
0683             return page->currentHelpUrl();
0684         }
0685     }
0686     return {};
0687 }
0688 
0689 bool SieveEditorMainWidget::printSupportEnabled() const
0690 {
0691     QWidget *w = mTabWidget->currentWidget();
0692     if (w) {
0693         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0694         if (page) {
0695             return page->printSupportEnabled();
0696         }
0697     }
0698     return false;
0699 }
0700 
0701 bool SieveEditorMainWidget::isTextEditor() const
0702 {
0703     QWidget *w = mTabWidget->currentWidget();
0704     if (w) {
0705         auto page = qobject_cast<SieveEditorPageWidget *>(w);
0706         if (page) {
0707             return page->isTextEditor();
0708         }
0709     }
0710     return false;
0711 }
0712 
0713 bool SieveEditorMainWidget::event(QEvent *e)
0714 {
0715     if (e->type() == QEvent::ApplicationPaletteChange) {
0716         slotGeneralPaletteChanged();
0717     }
0718     return QSplitter::event(e);
0719 }
0720 
0721 #include "moc_sieveeditormainwidget.cpp"