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

KDEUI

  • sources
  • kde-4.14
  • kdelibs
  • 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 
43 using namespace KDEPrivate;
44 
45 class 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 
79 KXMLGUIBuilder::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 
106 KXMLGUIBuilder::~KXMLGUIBuilder()
107 {
108  delete d->m_menumenuhandler;
109  delete d;
110 }
111 
112 QWidget *KXMLGUIBuilder::widget()
113 {
114  return d->m_widget;
115 }
116 
117 QStringList 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 
125 QWidget *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 
243 void 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 
282 QStringList KXMLGUIBuilder::customTags() const
283 {
284  QStringList res;
285  res << d->tagSeparator << d->tagTearOffHandle << d->tagMenuTitle;
286  return res;
287 }
288 
289 QAction* 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 
375 void KXMLGUIBuilder::removeCustomElement( QWidget *parent, QAction* action )
376 {
377  parent->removeAction(action);
378 }
379 
380 KXMLGUIClient *KXMLGUIBuilder::builderClient() const
381 {
382  return d->m_client;
383 }
384 
385 void KXMLGUIBuilder::setBuilderClient( KXMLGUIClient *client )
386 {
387  d->m_client = client;
388  if ( client )
389  setBuilderComponentData( client->componentData() );
390 }
391 
392 KComponentData KXMLGUIBuilder::builderComponentData() const
393 {
394  return d->m_componentData;
395 }
396 
397 void KXMLGUIBuilder::setBuilderComponentData(const KComponentData &componentData)
398 {
399  d->m_componentData = componentData;
400 }
401 
402 void 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 
420 void KXMLGUIBuilder::virtual_hook( int, void* )
421 { /*BASE::virtual_hook( id, data );*/ }
422 
QAction::setText
void setText(const QString &text)
i18n
QString i18n(const char *text)
QMenuBar
QWidget
KXMLGUIBuilder::containerTags
virtual QStringList containerTags() const
Definition: kxmlguibuilder.cpp:117
kdebug.h
QAction::setSeparator
void setSeparator(bool b)
KXMLGUIClient
A KXMLGUIClient can be used with KXMLGUIFactory to create a GUI from actions and an XML document...
Definition: kxmlguiclient.h:46
kapplication.h
QByteArray
QWidget::addAction
void addAction(QAction *action)
QDomElement::attribute
QString attribute(const QString &name, const QString &defValue) const
kglobalsettings.h
KXMLGUIBuilder::setBuilderClient
void setBuilderClient(KXMLGUIClient *client)
Definition: kxmlguibuilder.cpp:385
kauthorized.h
KMenu
A menu with keyboard searching.
Definition: kmenu.h:42
QAction::setIcon
void setIcon(const QIcon &icon)
QAction::setVisible
void setVisible(bool)
QList::at
const T & at(int i) const
KMenuBar
KDE Style-able menubar.
Definition: kmenubar.h:38
kxmlguibuilder.h
QByteArray::isEmpty
bool isEmpty() const
KStandardAction::name
const char * name(StandardAction id)
This will return the internal name of a given standard action.
Definition: kstandardaction.cpp:223
QObject::metaObject
virtual const QMetaObject * metaObject() const
kiconloader.h
kstatusbar.h
kDebug
static QDebug kDebug(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
klocale.h
KStatusBar
KDE statusbar widget
Definition: kstatusbar.h:59
kxmlguiwindow.h
i18nc
QString i18nc(const char *ctxt, const char *text)
QList::value
T value(int i) const
KMainWindow::menuBar
KMenuBar * menuBar()
Returns a pointer to the menu bar.
Definition: kmainwindow.cpp:1134
QDomNode::toElement
QDomElement toElement() const
QWidget::insertAction
void insertAction(QAction *before, QAction *action)
QList::count
int count(const T &value) const
KXmlGuiWindow
KDE top level main window with predefined action layout
Definition: kxmlguiwindow.h:61
QDomElement::text
QString text() const
KMainWindow
KDE top level main window
Definition: kmainwindow.h:106
kmenu.h
KXMLGUIClient::componentData
virtual KComponentData componentData() const
Definition: kxmlguiclient.cpp:144
QObject::setObjectName
void setObjectName(const QString &name)
KXMLGUIBuilder::createCustomElement
virtual QAction * createCustomElement(QWidget *parent, int index, const QDomElement &element)
Definition: kxmlguibuilder.cpp:289
QString::isEmpty
bool isEmpty() const
kmenubar.h
KIcon
A wrapper around QIcon that provides KDE icon features.
Definition: kicon.h:40
QString
QWidget::hide
void hide()
QStringList
KXMLGUIBuilder::builderComponentData
KComponentData builderComponentData() const
Definition: kxmlguibuilder.cpp:392
kaction.h
QString::toLower
QString toLower() const
KXMLGUIBuilder::virtual_hook
virtual void virtual_hook(int id, void *data)
Definition: kxmlguibuilder.cpp:420
QMenu
QDomNode::namedItem
QDomNode namedItem(const QString &name) const
QMetaObject::className
const char * className() const
kmainwindow.h
KToolBar::addXMLGUIClient
void addXMLGUIClient(KXMLGUIClient *client)
Adds an XML gui client that uses this toolbar.
Definition: ktoolbar.cpp:864
QDomNode::isNull
bool isNull() const
KXmlGuiWindow::finalizeGUI
virtual void finalizeGUI(KXMLGUIClient *client)
Definition: kxmlguiwindow.cpp:359
ktoolbar.h
KXMLGUIBuilder::widget
QWidget * widget()
Definition: kxmlguibuilder.cpp:112
KXMLGUIBuilder::setBuilderComponentData
void setBuilderComponentData(const KComponentData &componentData)
Definition: kxmlguibuilder.cpp:397
kxmlguiclient.h
KXMLGUIBuilder::KXMLGUIBuilder
KXMLGUIBuilder(QWidget *widget)
Definition: kxmlguibuilder.cpp:79
QLatin1String
KToolBar
Floatable toolbar with auto resize.
Definition: ktoolbar.h:53
KXMLGUIBuilder::customTags
virtual QStringList customTags() const
Definition: kxmlguibuilder.cpp:282
KMainWindow::statusBar
KStatusBar * statusBar()
Returns a pointer to the status bar.
Definition: kmainwindow.cpp:1146
QWidget::parentWidget
QWidget * parentWidget() const
QAction
QWidget::removeAction
void removeAction(QAction *action)
kWarning
static QDebug kWarning(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
KToolBar::loadState
void loadState(const QDomElement &element)
Load state from an XML.
Definition: ktoolbar.cpp:900
KXMLGUIBuilder::removeCustomElement
virtual void removeCustomElement(QWidget *parent, QAction *action)
Definition: kxmlguibuilder.cpp:375
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
QListIterator
QMenu::menuAction
QAction * menuAction() const
QWidget::show
void show()
QDomElement::tagName
QString tagName() const
KXMLGUIBuilder::builderClient
KXMLGUIClient * builderClient() const
Definition: kxmlguibuilder.cpp:380
kcomponentdata.h
QWidget::actions
QList< QAction * > actions() const
KXMLGUIBuilder::finalizeGUI
virtual void finalizeGUI(KXMLGUIClient *client)
Definition: kxmlguibuilder.cpp:402
QDomElement
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
KComponentData
KAuthorized::authorizeKAction
bool authorizeKAction(const QString &action)
KXMLGUIBuilder::~KXMLGUIBuilder
virtual ~KXMLGUIBuilder()
Definition: kxmlguibuilder.cpp:106
KToolBar::saveState
void saveState(QDomElement &element) const
Save state into an XML.
Definition: ktoolbar.cpp:1008
QString::toUtf8
QByteArray toUtf8() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:24:00 by doxygen 1.8.7 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 API Reference

Skip menu "kdelibs 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

Search



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