File indexing completed on 2024-05-19 07:45:48

0001 /*
0002     This file is part of the KDE project
0003     SPDX-FileCopyrightText: 1999 Simon Hausmann <hausmann@kde.org>
0004     SPDX-FileCopyrightText: 1999-2005 David Faure <faure@kde.org>
0005 
0006    SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #include "part.h"
0010 #include "part_p.h"
0011 
0012 #include "kparts_logging.h"
0013 #include "partmanager.h"
0014 
0015 // The events have randomly generated numbers using `shuf -i1000-65535 -n 1`
0016 #include "guiactivateevent.h"
0017 #include "partactivateevent.h"
0018 
0019 #include <KXMLGUIFactory>
0020 
0021 using namespace KParts;
0022 
0023 Part::Part(QObject *parent, const KPluginMetaData &data)
0024     : Part(*new PartPrivate(this, data), parent)
0025 {
0026 }
0027 
0028 Part::Part(PartPrivate &dd, QObject *parent)
0029     : QObject(parent)
0030     , PartBase(dd)
0031 {
0032     Q_D(Part);
0033 
0034     PartBase::setPartObject(this);
0035     if (d->m_metaData.isValid()) {
0036         KXMLGUIClient::setComponentName(d->m_metaData.pluginId(), d->m_metaData.name());
0037     }
0038 }
0039 
0040 Part::~Part()
0041 {
0042     Q_D(Part);
0043 
0044     // qCDebug(KPARTSLOG) << this;
0045 
0046     if (d->m_widget) {
0047         // We need to disconnect first, to avoid calling it !
0048         disconnect(d->m_widget.data(), &QWidget::destroyed, this, &Part::slotWidgetDestroyed);
0049     }
0050 
0051     if (d->m_manager) {
0052         d->m_manager->removePart(this);
0053     }
0054 
0055     if (d->m_widget && d->m_autoDeleteWidget) {
0056         // qCDebug(KPARTSLOG) << "deleting widget" << d->m_widget << d->m_widget->objectName();
0057         delete static_cast<QWidget *>(d->m_widget);
0058     }
0059 }
0060 
0061 QWidget *Part::widget()
0062 {
0063     Q_D(Part);
0064 
0065     return d->m_widget;
0066 }
0067 
0068 void Part::setAutoDeleteWidget(bool autoDeleteWidget)
0069 {
0070     Q_D(Part);
0071     d->m_autoDeleteWidget = autoDeleteWidget;
0072 }
0073 
0074 void Part::setAutoDeletePart(bool autoDeletePart)
0075 {
0076     Q_D(Part);
0077     d->m_autoDeletePart = autoDeletePart;
0078 }
0079 
0080 KPluginMetaData Part::metaData() const
0081 {
0082     Q_D(const Part);
0083 
0084     return d->m_metaData;
0085 }
0086 
0087 void Part::setManager(PartManager *manager)
0088 {
0089     Q_D(Part);
0090 
0091     d->m_manager = manager;
0092 }
0093 
0094 PartManager *Part::manager() const
0095 {
0096     Q_D(const Part);
0097 
0098     return d->m_manager;
0099 }
0100 
0101 Part *Part::hitTest(QWidget *widget, const QPoint &)
0102 {
0103     Q_D(Part);
0104 
0105     if ((QWidget *)d->m_widget != widget) {
0106         return nullptr;
0107     }
0108 
0109     return this;
0110 }
0111 
0112 void Part::setWidget(QWidget *widget)
0113 {
0114     Q_D(Part);
0115     d->m_widget = widget;
0116     connect(d->m_widget.data(), &QWidget::destroyed, this, &Part::slotWidgetDestroyed, Qt::UniqueConnection);
0117 }
0118 
0119 void Part::customEvent(QEvent *ev)
0120 {
0121     if (PartActivateEvent::test(ev)) {
0122         partActivateEvent(static_cast<PartActivateEvent *>(ev));
0123         return;
0124     }
0125 
0126     if (GUIActivateEvent::test(ev)) {
0127         guiActivateEvent(static_cast<GUIActivateEvent *>(ev));
0128         return;
0129     }
0130 
0131     QObject::customEvent(ev);
0132 }
0133 
0134 void Part::partActivateEvent(PartActivateEvent *)
0135 {
0136 }
0137 
0138 void Part::guiActivateEvent(GUIActivateEvent *)
0139 {
0140 }
0141 
0142 QWidget *Part::hostContainer(const QString &containerName)
0143 {
0144     if (!factory()) {
0145         return nullptr;
0146     }
0147 
0148     return factory()->container(containerName, this);
0149 }
0150 
0151 void Part::slotWidgetDestroyed()
0152 {
0153     Q_D(Part);
0154 
0155     d->m_widget = nullptr;
0156     if (d->m_autoDeletePart) {
0157         // qCDebug(KPARTSLOG) << "deleting part" << objectName();
0158         this->deleteLater();
0159     }
0160 }
0161 
0162 #include "moc_part.cpp"