1 /*
2     This file is part of the KDE project
3     SPDX-FileCopyrightText: 1999 Simon Hausmann <hausmann@kde.org>
4     SPDX-FileCopyrightText: 1999-2005 David Faure <faure@kde.org>
5 
6    SPDX-License-Identifier: LGPL-2.0-or-later
7 */
8 
9 #include "part.h"
10 #include "part_p.h"
11 
12 #include "kparts_logging.h"
13 #include "partactivateevent.h"
14 
15 #if KPARTS_BUILD_DEPRECATED_SINCE(5, 72)
16 #include "partselectevent.h"
17 #endif
18 
19 #include "guiactivateevent.h"
20 #include "partmanager.h"
21 
22 #include <KIconLoader>
23 #include <KXMLGUIFactory>
24 
25 using namespace KParts;
26 
Part(QObject * parent)27 Part::Part(QObject *parent)
28     : QObject(parent)
29     , PartBase(*new PartPrivate(this))
30 {
31     PartBase::setPartObject(this);
32 }
33 
Part(PartPrivate & dd,QObject * parent)34 Part::Part(PartPrivate &dd, QObject *parent)
35     : QObject(parent)
36     , PartBase(dd)
37 {
38     PartBase::setPartObject(this);
39 }
40 
~Part()41 Part::~Part()
42 {
43     Q_D(Part);
44 
45     // qCDebug(KPARTSLOG) << this;
46 
47     if (d->m_widget) {
48         // We need to disconnect first, to avoid calling it !
49         disconnect(d->m_widget.data(), &QWidget::destroyed, this, &Part::slotWidgetDestroyed);
50     }
51 
52     if (d->m_manager) {
53         d->m_manager->removePart(this);
54     }
55 
56     if (d->m_widget && d->m_autoDeleteWidget) {
57         // qCDebug(KPARTSLOG) << "deleting widget" << d->m_widget << d->m_widget->objectName();
58         delete static_cast<QWidget *>(d->m_widget);
59     }
60 
61     delete d->m_iconLoader;
62 }
63 
64 #if KPARTS_BUILD_DEPRECATED_SINCE(5, 77)
embed(QWidget * parentWidget)65 void Part::embed(QWidget *parentWidget)
66 {
67     if (widget()) {
68         widget()->setParent(parentWidget, Qt::WindowFlags());
69         widget()->setGeometry(0, 0, widget()->width(), widget()->height());
70         widget()->show();
71     }
72 }
73 #endif
74 
widget()75 QWidget *Part::widget()
76 {
77     Q_D(Part);
78 
79     return d->m_widget;
80 }
81 
setAutoDeleteWidget(bool autoDeleteWidget)82 void Part::setAutoDeleteWidget(bool autoDeleteWidget)
83 {
84     Q_D(Part);
85     d->m_autoDeleteWidget = autoDeleteWidget;
86 }
87 
setAutoDeletePart(bool autoDeletePart)88 void Part::setAutoDeletePart(bool autoDeletePart)
89 {
90     Q_D(Part);
91     d->m_autoDeletePart = autoDeletePart;
92 }
93 
94 #if KPARTS_BUILD_DEPRECATED_SINCE(5, 82)
iconLoader()95 KIconLoader *Part::iconLoader()
96 {
97     Q_D(Part);
98 
99     if (!d->m_iconLoader) {
100         d->m_iconLoader = new KIconLoader(componentName());
101     }
102     return d->m_iconLoader;
103 }
104 #endif
105 
metaData() const106 KPluginMetaData Part::metaData() const
107 {
108     Q_D(const Part);
109 
110     return d->m_metaData;
111 }
112 
setManager(PartManager * manager)113 void Part::setManager(PartManager *manager)
114 {
115     Q_D(Part);
116 
117     d->m_manager = manager;
118 }
119 
manager() const120 PartManager *Part::manager() const
121 {
122     Q_D(const Part);
123 
124     return d->m_manager;
125 }
126 
hitTest(QWidget * widget,const QPoint &)127 Part *Part::hitTest(QWidget *widget, const QPoint &)
128 {
129     Q_D(Part);
130 
131     if ((QWidget *)d->m_widget != widget) {
132         return nullptr;
133     }
134 
135     return this;
136 }
137 
setWidget(QWidget * widget)138 void Part::setWidget(QWidget *widget)
139 {
140     Q_D(Part);
141     d->m_widget = widget;
142     connect(d->m_widget.data(), &QWidget::destroyed, this, &Part::slotWidgetDestroyed, Qt::UniqueConnection);
143 }
144 
145 #if KPARTS_BUILD_DEPRECATED_SINCE(5, 72)
setSelectable(bool selectable)146 void Part::setSelectable(bool selectable)
147 {
148     Q_D(Part);
149 
150     d->m_bSelectable = selectable;
151 }
152 
isSelectable() const153 bool Part::isSelectable() const
154 {
155     Q_D(const Part);
156 
157     return d->m_bSelectable;
158 }
159 #endif
160 
customEvent(QEvent * ev)161 void Part::customEvent(QEvent *ev)
162 {
163     if (PartActivateEvent::test(ev)) {
164         partActivateEvent(static_cast<PartActivateEvent *>(ev));
165         return;
166     }
167 
168 #if KPARTS_BUILD_DEPRECATED_SINCE(5, 72)
169     if (PartSelectEvent::test(ev)) {
170         partSelectEvent(static_cast<PartSelectEvent *>(ev));
171         return;
172     }
173 #endif
174 
175     if (GUIActivateEvent::test(ev)) {
176         guiActivateEvent(static_cast<GUIActivateEvent *>(ev));
177         return;
178     }
179 
180     QObject::customEvent(ev);
181 }
182 
partActivateEvent(PartActivateEvent *)183 void Part::partActivateEvent(PartActivateEvent *)
184 {
185 }
186 
187 #if KPARTS_BUILD_DEPRECATED_SINCE(5, 72)
partSelectEvent(PartSelectEvent *)188 void Part::partSelectEvent(PartSelectEvent *)
189 {
190 }
191 #endif
192 
guiActivateEvent(GUIActivateEvent *)193 void Part::guiActivateEvent(GUIActivateEvent *)
194 {
195 }
196 
hostContainer(const QString & containerName)197 QWidget *Part::hostContainer(const QString &containerName)
198 {
199     if (!factory()) {
200         return nullptr;
201     }
202 
203     return factory()->container(containerName, this);
204 }
205 
slotWidgetDestroyed()206 void Part::slotWidgetDestroyed()
207 {
208     Q_D(Part);
209 
210     d->m_widget = nullptr;
211     if (d->m_autoDeletePart) {
212         // qCDebug(KPARTSLOG) << "deleting part" << objectName();
213         this->deleteLater();
214     }
215 }
216 
loadPlugins()217 void Part::loadPlugins()
218 {
219     Q_D(Part);
220 
221     PartBase::loadPlugins(this, this, d->m_metaData.pluginId());
222 }
223 
setMetaData(const KPluginMetaData & metaData)224 void Part::setMetaData(const KPluginMetaData &metaData)
225 {
226     Q_D(Part);
227 
228     d->m_metaData = metaData;
229 #if KPARTS_BUILD_DEPRECATED_SINCE(5, 77)
230     QT_WARNING_PUSH
231     QT_WARNING_DISABLE_CLANG("-Wdeprecated-declarations")
232     QT_WARNING_DISABLE_GCC("-Wdeprecated-declarations")
233     d->PartBasePrivate::setComponentData(KAboutData::fromPluginMetaData(metaData));
234 
235     // backward-compatible registration, usage deprecated
236 #if KCOREADDONS_BUILD_DEPRECATED_SINCE(5, 76)
237     KAboutData::registerPluginData(d->componentData());
238 #endif
239     QT_WARNING_POP
240 #endif
241 
242     KXMLGUIClient::setComponentName(metaData.pluginId(), metaData.name());
243 }
244 
245 #include "moc_part.cpp"
246