File indexing completed on 2024-05-12 05:21:24

0001 /*
0002   This file is part of KOrganizer.
0003 
0004   SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
0005   SPDX-FileCopyrightText: 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
0006 
0007   SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0008 */
0009 
0010 #include "kodialogmanager.h"
0011 #include "calendarview.h"
0012 #include "dialog/filtereditdialog.h"
0013 #include "dialog/searchdialog.h"
0014 #include "prefs/koprefs.h"
0015 
0016 #include <CalendarSupport/ArchiveDialog>
0017 #include <PimCommon/PimUtil>
0018 
0019 #include <IncidenceEditor/IncidenceDialog>
0020 #include <IncidenceEditor/IncidenceDialogFactory>
0021 
0022 #include <Akonadi/CalendarUtils>
0023 #include <Akonadi/Item>
0024 #include <Akonadi/TagManagementDialog>
0025 
0026 #include <KCalendarCore/Visitor>
0027 
0028 #include <KCMultiDialog>
0029 #include <KPluginMetaData>
0030 #include <QPushButton>
0031 
0032 using namespace KOrg;
0033 
0034 // FIXME: Handle KOEventViewerDialogs in dialog manager.
0035 
0036 class KODialogManager::DialogManagerVisitor : public KCalendarCore::Visitor
0037 {
0038 public:
0039     DialogManagerVisitor() = default;
0040 
0041     bool act(KCalendarCore::IncidenceBase::Ptr &incidence, KODialogManager *manager)
0042     {
0043         mDialogManager = manager;
0044         return incidence->accept(*this, incidence);
0045     }
0046 
0047 protected:
0048     KODialogManager *mDialogManager = nullptr;
0049 };
0050 
0051 KODialogManager::KODialogManager(CalendarView *mainView)
0052     : QObject()
0053     , mMainView(mainView)
0054 {
0055 }
0056 
0057 KODialogManager::~KODialogManager()
0058 {
0059     delete mOptionsDialog;
0060     delete mSearchDialog;
0061     delete mArchiveDialog;
0062     delete mFilterEditDialog;
0063     delete mCategoryEditDialog;
0064 }
0065 
0066 void KODialogManager::showOptionsDialog()
0067 {
0068     if (!mOptionsDialog) {
0069         mOptionsDialog = new KCMultiDialog(mMainView);
0070         connect(mOptionsDialog, qOverload<>(&KCMultiDialog::configCommitted), mMainView, &CalendarView::updateConfig);
0071         const QList<KPluginMetaData> availablePlugins = KPluginMetaData::findPlugins(QStringLiteral("pim6/kcms/korganizer"));
0072         for (const KPluginMetaData &metaData : availablePlugins) {
0073             mOptionsDialog->addModule(metaData);
0074         }
0075     }
0076 
0077     mOptionsDialog->show();
0078     mOptionsDialog->raise();
0079 }
0080 
0081 void KODialogManager::showCategoryEditDialog()
0082 {
0083     createCategoryEditor();
0084     mCategoryEditDialog->exec();
0085 }
0086 
0087 void KODialogManager::showSearchDialog()
0088 {
0089     if (!mSearchDialog) {
0090         mSearchDialog = new SearchDialog(mMainView);
0091         connect(mMainView->calendar().data(), &Akonadi::ETMCalendar::calendarChanged, mSearchDialog, &SearchDialog::updateView);
0092         connect(mSearchDialog, &SearchDialog::showIncidenceSignal, mMainView, qOverload<const Akonadi::Item &>(&CalendarView::showIncidence));
0093         connect(mSearchDialog, &SearchDialog::editIncidenceSignal, mMainView, [this](const Akonadi::Item &i) {
0094             mMainView->editIncidence(i);
0095         });
0096         connect(mSearchDialog, &SearchDialog::deleteIncidenceSignal, mMainView, [this](const Akonadi::Item &i) {
0097             mMainView->deleteIncidence(i, false);
0098         });
0099     }
0100     // make sure the widget is on top again
0101     mSearchDialog->show();
0102     mSearchDialog->raise();
0103 }
0104 
0105 void KODialogManager::showArchiveDialog()
0106 {
0107     if (!mArchiveDialog) {
0108         mArchiveDialog = new CalendarSupport::ArchiveDialog(mMainView->calendar(), mMainView->incidenceChanger());
0109         connect(mArchiveDialog, &CalendarSupport::ArchiveDialog::eventsDeleted, mMainView, qOverload<>(&CalendarView::updateView));
0110         connect(mArchiveDialog, &CalendarSupport::ArchiveDialog::autoArchivingSettingsModified, mMainView, &CalendarView::slotAutoArchivingSettingsModified);
0111     }
0112     mArchiveDialog->show();
0113     mArchiveDialog->raise();
0114 
0115     // Workaround.
0116     QApplication::restoreOverrideCursor();
0117 }
0118 
0119 void KODialogManager::showFilterEditDialog(QList<KCalendarCore::CalFilter *> *filters)
0120 {
0121     createCategoryEditor();
0122     if (!mFilterEditDialog) {
0123         mFilterEditDialog = new FilterEditDialog(filters, mMainView);
0124         connect(mFilterEditDialog, &FilterEditDialog::filterChanged, mMainView, &CalendarView::updateFilter);
0125         connect(mFilterEditDialog, &FilterEditDialog::editCategories, mCategoryEditDialog.data(), &QWidget::show);
0126     }
0127     mFilterEditDialog->show();
0128     mFilterEditDialog->raise();
0129 }
0130 
0131 IncidenceEditorNG::IncidenceDialog *KODialogManager::createDialog(const Akonadi::Item &item)
0132 {
0133     const KCalendarCore::Incidence::Ptr incidence = Akonadi::CalendarUtils::incidence(item);
0134     if (!incidence) {
0135         return nullptr;
0136     }
0137 
0138     IncidenceEditorNG::IncidenceDialog *dialog = IncidenceEditorNG::IncidenceDialogFactory::create(
0139         /*needs initial saving=*/false,
0140         incidence->type(),
0141         mMainView->incidenceChanger(),
0142         mMainView);
0143 
0144     return dialog;
0145 }
0146 
0147 void KODialogManager::connectTypeAhead(IncidenceEditorNG::IncidenceDialog *dialog, KOEventView *view)
0148 {
0149     if (dialog && view) {
0150         view->setTypeAheadReceiver(dialog->typeAheadReceiver());
0151     }
0152 }
0153 
0154 void KODialogManager::updateSearchDialog()
0155 {
0156     if (mSearchDialog) {
0157         mSearchDialog->updateView();
0158     }
0159 }
0160 
0161 void KODialogManager::createCategoryEditor()
0162 {
0163     if (!mCategoryEditDialog) {
0164         mCategoryEditDialog = new Akonadi::TagManagementDialog(mMainView);
0165         QDialogButtonBox *buttons = mCategoryEditDialog->buttons();
0166         if (buttons) {
0167             buttons->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help);
0168             connect(buttons->button(QDialogButtonBox::Help), &QPushButton::clicked, this, &KODialogManager::slotHelp);
0169         }
0170         mCategoryEditDialog->setModal(true);
0171     }
0172 }
0173 
0174 void KODialogManager::slotHelp()
0175 {
0176     PimCommon::Util::invokeHelp(QStringLiteral("korganizer/categories-view.html"));
0177 }
0178 
0179 #include "moc_kodialogmanager.cpp"