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"