• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 API Reference
  • KDE Home
  • Contact Us
 

KDEUI

  • kdeui
  • xmlgui
kxmlguibuilder.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 Copyright (C) 2000 Simon Hausmann <hausmann@kde.org>
3 David Faure <faure@kde.org>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21#include "kxmlguibuilder.h"
22
23#include "kapplication.h"
24#include "kauthorized.h"
25#include "kxmlguiclient.h"
26#include "kmenubar.h"
27#include "kmenu.h"
28#include "ktoolbar.h"
29#include "kstatusbar.h"
30#include "kmainwindow.h"
31#include "kxmlguiwindow.h"
32#include "kaction.h"
33#include "kglobalsettings.h"
34#include <klocale.h>
35#include <kiconloader.h>
36#include <kdebug.h>
37#include <QtXml/QDomElement>
38#include <QtCore/QObject>
39#include <QtCore/QMutableStringListIterator>
40#include "kmenumenuhandler_p.h"
41#include <kcomponentdata.h>
42
43using namespace KDEPrivate;
44
45class KXMLGUIBuilderPrivate
46{
47 public:
48 KXMLGUIBuilderPrivate() : m_client(0L) {}
49 ~KXMLGUIBuilderPrivate() { }
50
51 QWidget *m_widget;
52
53 QString tagMainWindow;
54 QString tagMenuBar;
55 QString tagMenu;
56 QString tagToolBar;
57 QString tagStatusBar;
58
59 QString tagSeparator;
60 QString tagTearOffHandle;
61 QString tagMenuTitle;
62
63 QString attrName;
64 QString attrLineSeparator;
65
66 QString attrText1;
67 QString attrText2;
68 QString attrContext;
69
70 QString attrIcon;
71
72 KComponentData m_componentData;
73 KXMLGUIClient *m_client;
74
75 KMenuMenuHandler *m_menumenuhandler;
76};
77
78
79KXMLGUIBuilder::KXMLGUIBuilder( QWidget *widget )
80 : d( new KXMLGUIBuilderPrivate )
81{
82 d->m_widget = widget;
83
84 d->tagMainWindow = QLatin1String( "mainwindow" );
85 d->tagMenuBar = QLatin1String( "menubar" );
86 d->tagMenu = QLatin1String( "menu" );
87 d->tagToolBar = QLatin1String( "toolbar" );
88 d->tagStatusBar = QLatin1String( "statusbar" );
89
90 d->tagSeparator = QLatin1String( "separator" );
91 d->tagTearOffHandle = QLatin1String( "tearoffhandle" );
92 d->tagMenuTitle = QLatin1String( "title" );
93
94 d->attrName = QLatin1String( "name" );
95 d->attrLineSeparator = QLatin1String( "lineseparator" );
96
97 d->attrText1 = QLatin1String( "text" );
98 d->attrText2 = QLatin1String( "Text" );
99 d->attrContext = QLatin1String( "context" );
100
101 d->attrIcon = QLatin1String( "icon" );
102
103 d->m_menumenuhandler=new KMenuMenuHandler(this);
104}
105
106KXMLGUIBuilder::~KXMLGUIBuilder()
107{
108 delete d->m_menumenuhandler;
109 delete d;
110}
111
112QWidget *KXMLGUIBuilder::widget()
113{
114 return d->m_widget;
115}
116
117QStringList KXMLGUIBuilder::containerTags() const
118{
119 QStringList res;
120 res << d->tagMenu << d->tagToolBar << d->tagMainWindow << d->tagMenuBar << d->tagStatusBar;
121
122 return res;
123}
124
125QWidget *KXMLGUIBuilder::createContainer( QWidget *parent, int index, const QDomElement &element, QAction*& containerAction )
126{
127 containerAction = 0;
128
129 if (element.attribute("deleted").toLower() == "true") {
130 return 0;
131 }
132
133 const QString tagName = element.tagName().toLower();
134 if ( tagName == d->tagMainWindow ) {
135 KMainWindow *mainwindow = qobject_cast<KMainWindow*>( d->m_widget ); // could be 0
136 return mainwindow;
137 }
138
139 if ( tagName == d->tagMenuBar ) {
140 KMainWindow *mainWin = qobject_cast<KMainWindow*>( d->m_widget );
141 KMenuBar *bar = 0;
142 if (mainWin)
143 bar = mainWin->menuBar();
144 if (!bar)
145 bar = new KMenuBar( d->m_widget );
146 bar->show();
147 return bar;
148 }
149
150 if ( tagName == d->tagMenu ) {
151 // Look up to see if we are inside a mainwindow. If yes, then
152 // use it as parent widget (to get kaction to plug itself into the
153 // mainwindow). Don't use a popupmenu as parent widget, otherwise
154 // the popup won't be hidden if it is used as a standalone menu as well.
155 // And we don't want to set the parent for a standalone popupmenu,
156 // otherwise its shortcuts appear.
157 //
158 // Note: menus with a parent of 0, coming from child clients, can be
159 // leaked if the child client is deleted without a proper removeClient call, though.
160 QWidget* p = parent;
161 while ( p && !qobject_cast<QMainWindow*>( p ) )
162 p = p->parentWidget();
163
164 QByteArray name = element.attribute( d->attrName ).toUtf8();
165
166 if (!KAuthorized::authorizeKAction(name))
167 return 0;
168
169 KMenu *popup = new KMenu(p);
170 popup->setObjectName(name);
171
172 d->m_menumenuhandler->insertKMenu(popup);
173
174 QString i18nText;
175 QDomElement textElem = element.namedItem( d->attrText1 ).toElement();
176 if ( textElem.isNull() ) // try with capital T
177 textElem = element.namedItem( d->attrText2 ).toElement();
178 const QByteArray text = textElem.text().toUtf8();
179 const QByteArray context = textElem.attribute(d->attrContext).toUtf8();
180
181 if ( text.isEmpty() ) // still no luck
182 i18nText = i18n( "No text" );
183 else if ( context.isEmpty() )
184 i18nText = i18n( text );
185 else
186 i18nText = i18nc( context, text );
187
188 const QString icon = element.attribute( d->attrIcon );
189 KIcon pix;
190 if (!icon.isEmpty()) {
191 pix = KIcon( icon );
192 }
193
194 if ( parent ) {
195 QAction* act = popup->menuAction();
196 if ( !icon.isEmpty() )
197 act->setIcon(pix);
198 act->setText(i18nText);
199 if (index == -1 || index >= parent->actions().count())
200 parent->addAction(act);
201 else
202 parent->insertAction(parent->actions().value(index), act);
203 containerAction = act;
204 containerAction->setObjectName( name );
205 }
206
207 return popup;
208 }
209
210 if ( tagName == d->tagToolBar ) {
211 QByteArray name = element.attribute( d->attrName ).toUtf8();
212
213 KToolBar *bar = static_cast<KToolBar*>(d->m_widget->findChild<KToolBar*>( name ));
214 if( !bar )
215 {
216 bar = new KToolBar(name, d->m_widget, false);
217 }
218
219 if ( qobject_cast<KMainWindow*>( d->m_widget ) )
220 {
221 if ( d->m_client && !d->m_client->xmlFile().isEmpty() )
222 bar->addXMLGUIClient( d->m_client );
223 }
224
225 bar->loadState( element );
226
227 return bar;
228 }
229
230 if ( tagName == d->tagStatusBar ) {
231 KMainWindow *mainWin = qobject_cast<KMainWindow *>(d->m_widget);
232 if ( mainWin ) {
233 mainWin->statusBar()->show();
234 return mainWin->statusBar();
235 }
236 KStatusBar *bar = new KStatusBar( d->m_widget );
237 return bar;
238 }
239
240 return 0L;
241}
242
243void KXMLGUIBuilder::removeContainer( QWidget *container, QWidget *parent, QDomElement &element, QAction* containerAction )
244{
245 // Warning parent can be 0L
246
247 if ( qobject_cast<QMenu*>( container ) )
248 {
249 if ( parent ) {
250 parent->removeAction( containerAction );
251 }
252
253 delete container;
254 }
255 else if ( qobject_cast<KToolBar*>( container ) )
256 {
257 KToolBar *tb = static_cast<KToolBar *>( container );
258
259 tb->saveState( element );
260 delete tb;
261 }
262 else if ( qobject_cast<KMenuBar*>( container ) )
263 {
264 KMenuBar *mb = static_cast<KMenuBar *>( container );
265 mb->hide();
266 // Don't delete menubar - it can be reused by createContainer.
267 // If you decide that you do need to delete the menubar, make
268 // sure that QMainWindow::d->mb does not point to a deleted
269 // menubar object.
270 }
271 else if ( qobject_cast<KStatusBar*>( container ) )
272 {
273 if ( qobject_cast<KMainWindow*>( d->m_widget ) )
274 container->hide();
275 else
276 delete static_cast<KStatusBar *>(container);
277 }
278 else
279 kWarning() << "Unhandled container to remove : " << container->metaObject()->className();
280}
281
282QStringList KXMLGUIBuilder::customTags() const
283{
284 QStringList res;
285 res << d->tagSeparator << d->tagTearOffHandle << d->tagMenuTitle;
286 return res;
287}
288
289QAction* KXMLGUIBuilder::createCustomElement( QWidget *parent, int index, const QDomElement &element )
290{
291 QAction* before = 0L;
292 if (index > 0 && index < parent->actions().count())
293 before = parent->actions().at(index);
294
295 const QString tagName = element.tagName().toLower();
296 if (tagName == d->tagSeparator)
297 {
298 if ( QMenu *menu = qobject_cast<QMenu*>( parent ) )
299 {
300 // QMenu already cares for leading/trailing/repeated separators
301 // no need to check anything
302 return menu->insertSeparator( before );
303 }
304 else if ( QMenuBar* bar = qobject_cast<QMenuBar*>( parent ) )
305 {
306 QAction* separatorAction = new QAction(bar);
307 separatorAction->setSeparator(true);
308 bar->insertAction( before, separatorAction );
309 return separatorAction;
310 }
311 else if ( KToolBar *bar = qobject_cast<KToolBar*>( parent ) )
312 {
313 /* FIXME KAction port - any need to provide a replacement for lineSeparator/normal separator?
314 bool isLineSep = true;
315
316 QDomNamedNodeMap attributes = element.attributes();
317 unsigned int i = 0;
318 for (; i < attributes.length(); i++ )
319 {
320 QDomAttr attr = attributes.item( i ).toAttr();
321
322 if ( attr.name().toLower() == d->attrLineSeparator &&
323 attr.value().toLower() == QLatin1String("false") )
324 {
325 isLineSep = false;
326 break;
327 }
328 }
329
330 if ( isLineSep )
331 return bar->insertSeparator( index ? bar->actions()[index - 1] : 0L );
332 else*/
333
334 return bar->insertSeparator( before );
335 }
336 }
337 else if (tagName == d->tagTearOffHandle)
338 {
339 static_cast<QMenu *>(parent)->setTearOffEnabled(true);
340 }
341 else if (tagName == d->tagMenuTitle)
342 {
343 if ( KMenu* m = qobject_cast<KMenu*>( parent ) )
344 {
345 QString i18nText;
346 QByteArray text = element.text().toUtf8();
347
348 if ( text.isEmpty() )
349 i18nText = i18n( "No text" );
350 else
351 i18nText = i18n( text );
352
353 QString icon = element.attribute( d->attrIcon );
354 KIcon pix;
355
356 if ( !icon.isEmpty() )
357 {
358 pix = KIcon( icon );
359 }
360
361 if ( !icon.isEmpty() ) {
362 return m->addTitle( pix, i18nText, before );
363 } else {
364 return m->addTitle( i18nText, before );
365 }
366 }
367 }
368
369 QAction* blank = new QAction(parent);
370 blank->setVisible(false);
371 parent->insertAction(before, blank);
372 return blank;
373}
374
375void KXMLGUIBuilder::removeCustomElement( QWidget *parent, QAction* action )
376{
377 parent->removeAction(action);
378}
379
380KXMLGUIClient *KXMLGUIBuilder::builderClient() const
381{
382 return d->m_client;
383}
384
385void KXMLGUIBuilder::setBuilderClient( KXMLGUIClient *client )
386{
387 d->m_client = client;
388 if ( client )
389 setBuilderComponentData( client->componentData() );
390}
391
392KComponentData KXMLGUIBuilder::builderComponentData() const
393{
394 return d->m_componentData;
395}
396
397void KXMLGUIBuilder::setBuilderComponentData(const KComponentData &componentData)
398{
399 d->m_componentData = componentData;
400}
401
402void KXMLGUIBuilder::finalizeGUI( KXMLGUIClient * )
403{
404 KXmlGuiWindow* window = qobject_cast<KXmlGuiWindow*>(d->m_widget);
405 if (!window)
406 return;
407#if 0
408 KToolBar *toolbar = 0;
409 QListIterator<KToolBar> it( ( (KMainWindow*)d->m_widget )->toolBarIterator() );
410 while ( ( toolbar = it.current() ) ) {
411 kDebug(260) << "KXMLGUIBuilder::finalizeGUI toolbar=" << (void*)toolbar;
412 ++it;
413 toolbar->positionYourself();
414 }
415#else
416 window->finalizeGUI( false );
417#endif
418}
419
420void KXMLGUIBuilder::virtual_hook( int, void* )
421{ /*BASE::virtual_hook( id, data );*/ }
422
KComponentData
KIcon
A wrapper around QIcon that provides KDE icon features.
Definition: kicon.h:41
KMainWindow
KDE top level main window
Definition: kmainwindow.h:107
KMainWindow::statusBar
KStatusBar * statusBar()
Returns a pointer to the status bar.
Definition: kmainwindow.cpp:1146
KMainWindow::menuBar
KMenuBar * menuBar()
Returns a pointer to the menu bar.
Definition: kmainwindow.cpp:1134
KMenuBar
KDE Style-able menubar.
Definition: kmenubar.h:39
KMenu
A menu with keyboard searching.
Definition: kmenu.h:42
KStatusBar
KDE statusbar widget
Definition: kstatusbar.h:60
KToolBar
Floatable toolbar with auto resize.
Definition: ktoolbar.h:54
KToolBar::addXMLGUIClient
void addXMLGUIClient(KXMLGUIClient *client)
Adds an XML gui client that uses this toolbar.
Definition: ktoolbar.cpp:864
KToolBar::loadState
void loadState(const QDomElement &element)
Load state from an XML.
Definition: ktoolbar.cpp:900
KToolBar::saveState
void saveState(QDomElement &element) const
Save state into an XML.
Definition: ktoolbar.cpp:1008
KXMLGUIBuilder::builderClient
KXMLGUIClient * builderClient() const
Definition: kxmlguibuilder.cpp:380
KXMLGUIBuilder::createCustomElement
virtual QAction * createCustomElement(QWidget *parent, int index, const QDomElement &element)
Definition: kxmlguibuilder.cpp:289
KXMLGUIBuilder::widget
QWidget * widget()
Definition: kxmlguibuilder.cpp:112
KXMLGUIBuilder::setBuilderComponentData
void setBuilderComponentData(const KComponentData &componentData)
Definition: kxmlguibuilder.cpp:397
KXMLGUIBuilder::finalizeGUI
virtual void finalizeGUI(KXMLGUIClient *client)
Definition: kxmlguibuilder.cpp:402
KXMLGUIBuilder::createContainer
virtual QWidget * createContainer(QWidget *parent, int index, const QDomElement &element, QAction *&containerAction)
Creates a container (menubar/menu/toolbar/statusbar/separator/...) from an element in the XML file.
Definition: kxmlguibuilder.cpp:125
KXMLGUIBuilder::customTags
virtual QStringList customTags() const
Definition: kxmlguibuilder.cpp:282
KXMLGUIBuilder::virtual_hook
virtual void virtual_hook(int id, void *data)
Definition: kxmlguibuilder.cpp:420
KXMLGUIBuilder::removeCustomElement
virtual void removeCustomElement(QWidget *parent, QAction *action)
Definition: kxmlguibuilder.cpp:375
KXMLGUIBuilder::containerTags
virtual QStringList containerTags() const
Definition: kxmlguibuilder.cpp:117
KXMLGUIBuilder::setBuilderClient
void setBuilderClient(KXMLGUIClient *client)
Definition: kxmlguibuilder.cpp:385
KXMLGUIBuilder::KXMLGUIBuilder
KXMLGUIBuilder(QWidget *widget)
Definition: kxmlguibuilder.cpp:79
KXMLGUIBuilder::~KXMLGUIBuilder
virtual ~KXMLGUIBuilder()
Definition: kxmlguibuilder.cpp:106
KXMLGUIBuilder::builderComponentData
KComponentData builderComponentData() const
Definition: kxmlguibuilder.cpp:392
KXMLGUIBuilder::removeContainer
virtual void removeContainer(QWidget *container, QWidget *parent, QDomElement &element, QAction *containerAction)
Removes the given (and previously via createContainer ) created container.
Definition: kxmlguibuilder.cpp:243
KXMLGUIClient
A KXMLGUIClient can be used with KXMLGUIFactory to create a GUI from actions and an XML document,...
Definition: kxmlguiclient.h:47
KXMLGUIClient::componentData
virtual KComponentData componentData() const
Definition: kxmlguiclient.cpp:144
KXmlGuiWindow
KDE top level main window with predefined action layout
Definition: kxmlguiwindow.h:62
KXmlGuiWindow::finalizeGUI
virtual void finalizeGUI(KXMLGUIClient *client)
Definition: kxmlguiwindow.cpp:359
QAction
QMenuBar
QMenu
QWidget
kDebug
#define kDebug
kWarning
#define kWarning
kaction.h
kapplication.h
kauthorized.h
kcomponentdata.h
kdebug.h
kglobalsettings.h
kiconloader.h
klocale.h
i18n
QString i18n(const char *text)
i18nc
QString i18nc(const char *ctxt, const char *text)
kmainwindow.h
kmenu.h
kmenubar.h
kstatusbar.h
ktoolbar.h
kxmlguibuilder.h
kxmlguiclient.h
kxmlguiwindow.h
KAuthorized::authorizeKAction
bool authorizeKAction(const QString &action)
KDEPrivate
Definition: kcolorchoosermode.cpp:24
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDEUI

Skip menu "KDEUI"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal