37#include <QtXml/QDomElement>
38#include <QtCore/QObject>
39#include <QtCore/QMutableStringListIterator>
40#include "kmenumenuhandler_p.h"
45class KXMLGUIBuilderPrivate
48 KXMLGUIBuilderPrivate() : m_client(0L) {}
49 ~KXMLGUIBuilderPrivate() { }
53 QString tagMainWindow;
60 QString tagTearOffHandle;
64 QString attrLineSeparator;
75 KMenuMenuHandler *m_menumenuhandler;
80 : d( new KXMLGUIBuilderPrivate )
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" );
90 d->tagSeparator = QLatin1String(
"separator" );
91 d->tagTearOffHandle = QLatin1String(
"tearoffhandle" );
92 d->tagMenuTitle = QLatin1String(
"title" );
94 d->attrName = QLatin1String(
"name" );
95 d->attrLineSeparator = QLatin1String(
"lineseparator" );
97 d->attrText1 = QLatin1String(
"text" );
98 d->attrText2 = QLatin1String(
"Text" );
99 d->attrContext = QLatin1String(
"context" );
101 d->attrIcon = QLatin1String(
"icon" );
103 d->m_menumenuhandler=
new KMenuMenuHandler(
this);
108 delete d->m_menumenuhandler;
120 res << d->tagMenu << d->tagToolBar << d->tagMainWindow << d->tagMenuBar << d->tagStatusBar;
129 if (element.attribute(
"deleted").toLower() ==
"true") {
133 const QString tagName = element.tagName().toLower();
134 if ( tagName == d->tagMainWindow ) {
135 KMainWindow *mainwindow = qobject_cast<KMainWindow*>( d->m_widget );
139 if ( tagName == d->tagMenuBar ) {
140 KMainWindow *mainWin = qobject_cast<KMainWindow*>( d->m_widget );
150 if ( tagName == d->tagMenu ) {
161 while ( p && !qobject_cast<QMainWindow*>( p ) )
162 p = p->parentWidget();
164 QByteArray name = element.attribute( d->attrName ).toUtf8();
170 popup->setObjectName(name);
172 d->m_menumenuhandler->insertKMenu(popup);
175 QDomElement textElem = element.namedItem( d->attrText1 ).toElement();
176 if ( textElem.isNull() )
177 textElem = element.namedItem( d->attrText2 ).toElement();
178 const QByteArray text = textElem.text().toUtf8();
179 const QByteArray context = textElem.attribute(d->attrContext).toUtf8();
181 if ( text.isEmpty() )
182 i18nText =
i18n(
"No text" );
183 else if ( context.isEmpty() )
184 i18nText =
i18n( text );
186 i18nText =
i18nc( context, text );
188 const QString icon = element.attribute( d->attrIcon );
190 if (!icon.isEmpty()) {
195 QAction* act = popup->menuAction();
196 if ( !icon.isEmpty() )
198 act->setText(i18nText);
199 if (index == -1 || index >= parent->actions().count())
200 parent->addAction(act);
202 parent->insertAction(parent->actions().value(index), act);
203 containerAction = act;
204 containerAction->setObjectName( name );
210 if ( tagName == d->tagToolBar ) {
211 QByteArray name = element.attribute( d->attrName ).toUtf8();
216 bar =
new KToolBar(name, d->m_widget,
false);
219 if ( qobject_cast<KMainWindow*>( d->m_widget ) )
221 if ( d->m_client && !d->m_client->
xmlFile().isEmpty() )
230 if ( tagName == d->tagStatusBar ) {
231 KMainWindow *mainWin = qobject_cast<KMainWindow *>(d->m_widget);
247 if ( qobject_cast<QMenu*>( container ) )
250 parent->removeAction( containerAction );
255 else if ( qobject_cast<KToolBar*>( container ) )
262 else if ( qobject_cast<KMenuBar*>( container ) )
271 else if ( qobject_cast<KStatusBar*>( container ) )
273 if ( qobject_cast<KMainWindow*>( d->m_widget ) )
279 kWarning() <<
"Unhandled container to remove : " << container->metaObject()->className();
285 res << d->tagSeparator << d->tagTearOffHandle << d->tagMenuTitle;
292 if (index > 0 && index < parent->actions().count())
293 before = parent->actions().at(index);
295 const QString tagName = element.tagName().toLower();
296 if (tagName == d->tagSeparator)
298 if (
QMenu *menu = qobject_cast<QMenu*>( parent ) )
302 return menu->insertSeparator( before );
304 else if (
QMenuBar* bar = qobject_cast<QMenuBar*>( parent ) )
307 separatorAction->setSeparator(
true);
308 bar->insertAction( before, separatorAction );
309 return separatorAction;
311 else if (
KToolBar *bar = qobject_cast<KToolBar*>( parent ) )
334 return bar->insertSeparator( before );
337 else if (tagName == d->tagTearOffHandle)
339 static_cast<QMenu *
>(parent)->setTearOffEnabled(
true);
341 else if (tagName == d->tagMenuTitle)
343 if (
KMenu* m = qobject_cast<KMenu*>( parent ) )
346 QByteArray text = element.text().toUtf8();
348 if ( text.isEmpty() )
349 i18nText =
i18n(
"No text" );
351 i18nText =
i18n( text );
353 QString icon = element.attribute( d->attrIcon );
356 if ( !icon.isEmpty() )
361 if ( !icon.isEmpty() ) {
362 return m->addTitle( pix, i18nText, before );
364 return m->addTitle( i18nText, before );
370 blank->setVisible(
false);
371 parent->insertAction(before, blank);
377 parent->removeAction(action);
387 d->m_client = client;
394 return d->m_componentData;
399 d->m_componentData = componentData;
404 KXmlGuiWindow* window = qobject_cast<KXmlGuiWindow*>(d->m_widget);
409 QListIterator<KToolBar> it( ( (
KMainWindow*)d->m_widget )->toolBarIterator() );
410 while ( ( toolbar = it.current() ) ) {
411 kDebug(260) <<
"KXMLGUIBuilder::finalizeGUI toolbar=" << (
void*)toolbar;
413 toolbar->positionYourself();
A wrapper around QIcon that provides KDE icon features.
KDE top level main window
KStatusBar * statusBar()
Returns a pointer to the status bar.
KMenuBar * menuBar()
Returns a pointer to the menu bar.
KXMLGUIClient * builderClient() const
virtual QAction * createCustomElement(QWidget *parent, int index, const QDomElement &element)
void setBuilderComponentData(const KComponentData &componentData)
virtual void finalizeGUI(KXMLGUIClient *client)
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.
virtual QStringList customTags() const
virtual void virtual_hook(int id, void *data)
virtual void removeCustomElement(QWidget *parent, QAction *action)
virtual QStringList containerTags() const
void setBuilderClient(KXMLGUIClient *client)
KXMLGUIBuilder(QWidget *widget)
virtual ~KXMLGUIBuilder()
KComponentData builderComponentData() const
virtual void removeContainer(QWidget *container, QWidget *parent, QDomElement &element, QAction *containerAction)
Removes the given (and previously via createContainer ) created container.
A KXMLGUIClient can be used with KXMLGUIFactory to create a GUI from actions and an XML document,...
virtual QString xmlFile() const
This will return the name of the XML file as set by setXMLFile().
virtual KComponentData componentData() const
KDE top level main window with predefined action layout
virtual void finalizeGUI(KXMLGUIClient *client)
QString i18n(const char *text)
QString i18nc(const char *ctxt, const char *text)
bool authorizeKAction(const QString &action)