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

0001 /*
0002   This file is part of KOrganizer.
0003 
0004   SPDX-FileCopyrightText: 2000 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 "korganizer_part.h"
0011 #include "aboutdata.h"
0012 #include "actionmanager.h"
0013 #include "calendarview.h"
0014 #include "impl/korganizerifaceimpl.h"
0015 #include "kocore.h"
0016 
0017 #include <Akonadi/CalendarUtils>
0018 #include <KCalUtils/IncidenceFormatter>
0019 
0020 #include "korganizer_debug.h"
0021 #include <KParts/StatusBarExtension>
0022 #include <KPluginFactory>
0023 
0024 #include <QStatusBar>
0025 #include <QVBoxLayout>
0026 
0027 K_PLUGIN_FACTORY(KOrganizerFactory, registerPlugin<KOrganizerPart>();)
0028 
0029 KOrganizerPart::KOrganizerPart(QWidget *parentWidget, QObject *parent, const KPluginMetaData &data, const QVariantList &)
0030     : KParts::ReadOnlyPart(parent, data)
0031 {
0032     if (parentWidget) {
0033         mTopLevelWidget = parentWidget->topLevelWidget();
0034     } else if (parent && parent->isWidgetType()) {
0035         mTopLevelWidget = qobject_cast<QWidget *>(parent);
0036     } else {
0037         qCCritical(KORGANIZER_LOG) << "Cannot initialize the part without a top level widget.";
0038     }
0039     Q_ASSERT(mTopLevelWidget);
0040 
0041     KOCore::self()->addXMLGUIClient(mTopLevelWidget, this);
0042 
0043     // create a canvas to insert our widget
0044     auto canvas = new QWidget(parentWidget);
0045     canvas->setFocusPolicy(Qt::ClickFocus);
0046     setWidget(canvas);
0047     mView = new CalendarView(canvas);
0048 
0049     mActionManager = new ActionManager(this, mView, this, this, true);
0050     (void)new KOrganizerIfaceImpl(mActionManager, this, QStringLiteral("IfaceImpl"));
0051 
0052     mActionManager->createCalendarAkonadi();
0053     setHasDocument(false);
0054 
0055     mStatusBarExtension = new KParts::StatusBarExtension(this);
0056     setComponentName(QStringLiteral("korganizer"), i18n("KOrganizer"));
0057 
0058     auto topLayout = new QVBoxLayout(canvas);
0059     topLayout->addWidget(mView);
0060     topLayout->setContentsMargins({});
0061 
0062     connect(mView, &CalendarView::incidenceSelected, this, &KOrganizerPart::slotChangeInfo);
0063 
0064     mActionManager->init();
0065     mActionManager->readSettings();
0066 
0067     setXMLFile(QStringLiteral("korganizer_part.rc"), true);
0068     setTitle();
0069 }
0070 
0071 KOrganizerPart::~KOrganizerPart()
0072 {
0073     mActionManager->writeSettings();
0074 
0075     delete mActionManager;
0076     mActionManager = nullptr;
0077 
0078     KOCore::self()->removeXMLGUIClient(mTopLevelWidget);
0079 }
0080 
0081 void KOrganizerPart::slotChangeInfo(const Akonadi::Item &item, const QDate &date)
0082 {
0083     Q_UNUSED(date)
0084     const KCalendarCore::Incidence::Ptr incidence = Akonadi::CalendarUtils::incidence(item);
0085     if (incidence) {
0086         Q_EMIT textChanged(incidence->summary() + QLatin1StringView(" / ")
0087                            + KCalUtils::IncidenceFormatter::timeToString(incidence->dtStart().toLocalTime().time()));
0088     } else {
0089         Q_EMIT textChanged(QString());
0090     }
0091 }
0092 
0093 QWidget *KOrganizerPart::topLevelWidget()
0094 {
0095     return mView->topLevelWidget();
0096 }
0097 
0098 ActionManager *KOrganizerPart::actionManager()
0099 {
0100     return mActionManager;
0101 }
0102 
0103 void KOrganizerPart::showStatusMessage(const QString &message)
0104 {
0105     QStatusBar *statusBar = mStatusBarExtension->statusBar();
0106     if (statusBar) {
0107         statusBar->showMessage(message);
0108     }
0109 }
0110 
0111 KOrg::CalendarViewBase *KOrganizerPart::view() const
0112 {
0113     return mView;
0114 }
0115 
0116 bool KOrganizerPart::openURL(const QUrl &url, bool merge)
0117 {
0118     return mActionManager->importURL(url, merge);
0119 }
0120 
0121 bool KOrganizerPart::saveURL()
0122 {
0123     return mActionManager->saveURL();
0124 }
0125 
0126 bool KOrganizerPart::saveAsURL(const QUrl &url)
0127 {
0128     return mActionManager->saveAsURL(url);
0129 }
0130 
0131 QUrl KOrganizerPart::getCurrentURL() const
0132 {
0133     return mActionManager->url();
0134 }
0135 
0136 bool KOrganizerPart::openFile()
0137 {
0138     mActionManager->importCalendar(QUrl::fromLocalFile(localFilePath()));
0139     return true;
0140 }
0141 
0142 // FIXME: This is copied verbatim from the KOrganizer class. Move it to the common base class!
0143 void KOrganizerPart::setTitle()
0144 {
0145     //  qCDebug(KORGANIZER_LOG) <<"KOrganizer::setTitle";
0146     // FIXME: Inside kontact we want to have different titles depending on the
0147     //        type of view (calendar, to-do, journal). How can I add the filter
0148     //        name in that case?
0149     /*
0150       QString title;
0151       if ( !hasDocument() ) {
0152         title = i18n("Calendar");
0153       } else {
0154         QUrl url = mActionManager->url();
0155 
0156         if ( !url.isEmpty() ) {
0157           if ( url.isLocalFile() ) title = url.fileName();
0158           else title = url.prettyUrl();
0159         } else {
0160           title = i18n("New Calendar");
0161         }
0162 
0163         if ( mView->isReadOnly() ) {
0164           title += " [" + i18n("read-only") + ']';
0165         }
0166       }
0167 
0168       title += " - <" + mView->currentFilterName() + "> ";
0169 
0170       Q_EMIT setWindowCaption( title );*/
0171 }
0172 
0173 #include "korganizer_part.moc"
0174 
0175 #include "moc_korganizer_part.cpp"