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