kdeui
kxmlguibuilder.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kapplication.h"
00022 #include "kxmlguibuilder.h"
00023 #include "kmenubar.h"
00024 #include "kpopupmenu.h"
00025 #include "ktoolbar.h"
00026 #include "kstatusbar.h"
00027 #include "kmainwindow.h"
00028 #include "kaction.h"
00029 #include "kglobalsettings.h"
00030 #include <klocale.h>
00031 #include <kiconloader.h>
00032 #include <kdebug.h>
00033 #include <qobjectlist.h>
00034
00035 class KXMLGUIBuilderPrivate
00036 {
00037 public:
00038 KXMLGUIBuilderPrivate() {
00039 }
00040 ~KXMLGUIBuilderPrivate() {
00041 }
00042
00043 QWidget *m_widget;
00044
00045 QString tagMainWindow;
00046 QString tagMenuBar;
00047 QString tagMenu;
00048 QString tagToolBar;
00049 QString tagStatusBar;
00050
00051 QString tagSeparator;
00052 QString tagTearOffHandle;
00053 QString tagMenuTitle;
00054
00055 QString attrName;
00056 QString attrLineSeparator;
00057
00058 QString attrText1;
00059 QString attrText2;
00060 QString attrContext;
00061
00062 QString attrIcon;
00063
00064 KInstance *m_instance;
00065 KXMLGUIClient *m_client;
00066 };
00067
00068 KXMLGUIBuilder::KXMLGUIBuilder( QWidget *widget )
00069 {
00070 d = new KXMLGUIBuilderPrivate;
00071 d->m_widget = widget;
00072
00073 d->tagMainWindow = QString::fromLatin1( "mainwindow" );
00074 d->tagMenuBar = QString::fromLatin1( "menubar" );
00075 d->tagMenu = QString::fromLatin1( "menu" );
00076 d->tagToolBar = QString::fromLatin1( "toolbar" );
00077 d->tagStatusBar = QString::fromLatin1( "statusbar" );
00078
00079 d->tagSeparator = QString::fromLatin1( "separator" );
00080 d->tagTearOffHandle = QString::fromLatin1( "tearoffhandle" );
00081 d->tagMenuTitle = QString::fromLatin1( "title" );
00082
00083 d->attrName = QString::fromLatin1( "name" );
00084 d->attrLineSeparator = QString::fromLatin1( "lineseparator" );
00085
00086 d->attrText1 = QString::fromLatin1( "text" );
00087 d->attrText2 = QString::fromLatin1( "Text" );
00088 d->attrContext = QString::fromLatin1( "context" );
00089
00090 d->attrIcon = QString::fromLatin1( "icon" );
00091
00092 d->m_instance = 0;
00093 d->m_client = 0;
00094 }
00095
00096 KXMLGUIBuilder::~KXMLGUIBuilder()
00097 {
00098 delete d;
00099 }
00100
00101 QWidget *KXMLGUIBuilder::widget()
00102 {
00103 return d->m_widget;
00104 }
00105
00106 QStringList KXMLGUIBuilder::containerTags() const
00107 {
00108 QStringList res;
00109 res << d->tagMenu << d->tagToolBar << d->tagMainWindow << d->tagMenuBar << d->tagStatusBar;
00110
00111 return res;
00112 }
00113
00114 QWidget *KXMLGUIBuilder::createContainer( QWidget *parent, int index, const QDomElement &element, int &id )
00115 {
00116 id = -1;
00117 if ( element.tagName().lower() == d->tagMainWindow )
00118 {
00119 KMainWindow *mainwindow = 0;
00120 if ( ::qt_cast<KMainWindow *>( d->m_widget ) )
00121 mainwindow = static_cast<KMainWindow *>(d->m_widget);
00122
00123 return mainwindow;
00124 }
00125
00126 if ( element.tagName().lower() == d->tagMenuBar )
00127 {
00128 KMenuBar *bar;
00129
00130 if ( ::qt_cast<KMainWindow *>( d->m_widget ) )
00131 bar = static_cast<KMainWindow *>(d->m_widget)->menuBar();
00132 else
00133 bar = new KMenuBar( d->m_widget );
00134
00135 bar->show();
00136 return bar;
00137 }
00138
00139 if ( element.tagName().lower() == d->tagMenu )
00140 {
00141
00142
00143
00144
00145
00146
00147 QWidget* p = parent;
00148 while ( p && !::qt_cast<KMainWindow *>( p ) )
00149 p = p->parentWidget();
00150
00151 QCString name = element.attribute( d->attrName ).utf8();
00152
00153 if (!kapp->authorizeKAction(name))
00154 return 0;
00155
00156 KPopupMenu *popup = new KPopupMenu( p, name);
00157
00158 QString i18nText;
00159 QDomElement textElem = element.namedItem( d->attrText1 ).toElement();
00160 if ( textElem.isNull() )
00161 textElem = element.namedItem( d->attrText2 ).toElement();
00162 QCString text = textElem.text().utf8();
00163 QCString context = textElem.attribute(d->attrContext).utf8();
00164
00165 if ( text.isEmpty() )
00166 i18nText = i18n( "No text!" );
00167 else if ( context.isEmpty() )
00168 i18nText = i18n( text );
00169 else
00170 i18nText = i18n( context, text );
00171
00172 QString icon = element.attribute( d->attrIcon );
00173 QIconSet pix;
00174
00175 if ( !icon.isEmpty() )
00176 {
00177 KInstance *instance = d->m_instance;
00178 if ( !instance )
00179 instance = KGlobal::instance();
00180
00181 pix = SmallIconSet( icon, 16, instance );
00182 }
00183
00184 if ( parent && ::qt_cast<KMenuBar *>( parent ) )
00185 {
00186 if ( !icon.isEmpty() )
00187 id = static_cast<KMenuBar *>(parent)->insertItem( pix, i18nText, popup, -1, index );
00188 else
00189 id = static_cast<KMenuBar *>(parent)->insertItem( i18nText, popup, -1, index );
00190 }
00191 else if ( parent && ::qt_cast<QPopupMenu *>( parent ) )
00192 {
00193 if ( !icon.isEmpty() )
00194 id = static_cast<QPopupMenu *>(parent)->insertItem( pix, i18nText, popup, -1, index );
00195 else
00196 id = static_cast<QPopupMenu *>(parent)->insertItem( i18nText, popup, -1, index );
00197 }
00198
00199 return popup;
00200 }
00201
00202 if ( element.tagName().lower() == d->tagToolBar )
00203 {
00204 bool honor = (element.attribute( d->attrName ) == "mainToolBar");
00205
00206 QCString name = element.attribute( d->attrName ).utf8();
00207
00208 KToolBar *bar = static_cast<KToolBar*>(d->m_widget->child( name, "KToolBar" ));
00209 if( !bar )
00210 {
00211 bar = new KToolBar( d->m_widget, name, honor, false );
00212 }
00213
00214 if ( ::qt_cast<KMainWindow *>( d->m_widget ) )
00215 {
00216 if ( d->m_client && !d->m_client->xmlFile().isEmpty() )
00217 bar->setXMLGUIClient( d->m_client );
00218 }
00219
00220 bar->loadState( element );
00221
00222 return bar;
00223 }
00224
00225 if ( element.tagName().lower() == d->tagStatusBar )
00226 {
00227 if ( ::qt_cast<KMainWindow *>( d->m_widget ) )
00228 {
00229 KMainWindow *mainWin = static_cast<KMainWindow *>(d->m_widget);
00230 mainWin->statusBar()->show();
00231 return mainWin->statusBar();
00232 }
00233 KStatusBar *bar = new KStatusBar( d->m_widget );
00234 return bar;
00235 }
00236
00237 return 0L;
00238 }
00239
00240 void KXMLGUIBuilder::removeContainer( QWidget *container, QWidget *parent, QDomElement &element, int id )
00241 {
00242
00243
00244 if ( ::qt_cast<QPopupMenu *>( container ) )
00245 {
00246 if ( parent )
00247 {
00248 if ( ::qt_cast<KMenuBar *>( parent ) )
00249 static_cast<KMenuBar *>(parent)->removeItem( id );
00250 else if ( ::qt_cast<QPopupMenu *>( parent ) )
00251 static_cast<QPopupMenu *>(parent)->removeItem( id );
00252 }
00253
00254 delete container;
00255 }
00256 else if ( ::qt_cast<KToolBar *>( container ) )
00257 {
00258 KToolBar *tb = static_cast<KToolBar *>( container );
00259
00260 tb->saveState( element );
00261 delete tb;
00262 }
00263 else if ( ::qt_cast<KMenuBar *>( container ) )
00264 {
00265 KMenuBar *mb = static_cast<KMenuBar *>( container );
00266 mb->hide();
00267
00268
00269
00270
00271 }
00272 else if ( ::qt_cast<KStatusBar *>( container ) )
00273 {
00274 if ( ::qt_cast<KMainWindow *>( d->m_widget ) )
00275 container->hide();
00276 else
00277 delete static_cast<KStatusBar *>(container);
00278 }
00279 else
00280 kdWarning() << "Unhandled container to remove : " << container->className() << endl;
00281 }
00282
00283 QStringList KXMLGUIBuilder::customTags() const
00284 {
00285 QStringList res;
00286 res << d->tagSeparator << d->tagTearOffHandle << d->tagMenuTitle;
00287 return res;
00288 }
00289
00290 int KXMLGUIBuilder::createCustomElement( QWidget *parent, int index, const QDomElement &element )
00291 {
00292 if ( element.tagName().lower() == d->tagSeparator )
00293 {
00294 if ( ::qt_cast<QPopupMenu *>( parent ) )
00295 {
00296
00297 QPopupMenu *menu = static_cast<QPopupMenu *>(parent);
00298 int count = menu->count();
00299 if (count)
00300 {
00301 int previousId = -1;
00302 if ((index == -1) || (index > count))
00303 previousId = menu->idAt(count-1);
00304 else if (index > 0)
00305 previousId = menu->idAt(index-1);
00306 if (previousId != -1)
00307 {
00308 if (menu->text(previousId).isEmpty() &&
00309 !menu->iconSet(previousId) &&
00310 !menu->pixmap(previousId))
00311 return 0;
00312 }
00313 }
00314
00315 if(count == 0)
00316 return 0;
00317 else
00318 return menu->insertSeparator( index );
00319 }
00320 else if ( ::qt_cast<QMenuBar *>( parent ) )
00321 return static_cast<QMenuBar *>(parent)->insertSeparator( index );
00322 else if ( ::qt_cast<KToolBar *>( parent ) )
00323 {
00324 KToolBar *bar = static_cast<KToolBar *>( parent );
00325
00326 bool isLineSep = true;
00327
00328 QDomNamedNodeMap attributes = element.attributes();
00329 unsigned int i = 0;
00330 for (; i < attributes.length(); i++ )
00331 {
00332 QDomAttr attr = attributes.item( i ).toAttr();
00333
00334 if ( attr.name().lower() == d->attrLineSeparator &&
00335 attr.value().lower() == QString::fromLatin1("false") )
00336 {
00337 isLineSep = false;
00338 break;
00339 }
00340 }
00341
00342 int id = KAction::getToolButtonID();
00343
00344 if ( isLineSep )
00345 bar->insertLineSeparator( index, id );
00346 else
00347 bar->insertSeparator( index, id );
00348
00349 return id;
00350 }
00351 }
00352 else if ( element.tagName().lower() == d->tagTearOffHandle )
00353 {
00354 if ( ::qt_cast<QPopupMenu *>( parent ) && KGlobalSettings::insertTearOffHandle())
00355 return static_cast<QPopupMenu *>(parent)->insertTearOffHandle( -1, index );
00356 }
00357 else if ( element.tagName().lower() == d->tagMenuTitle )
00358 {
00359 if ( ::qt_cast<KPopupMenu *>( parent ) )
00360 {
00361 QString i18nText;
00362 QCString text = element.text().utf8();
00363
00364 if ( text.isEmpty() )
00365 i18nText = i18n( "No text!" );
00366 else
00367 i18nText = i18n( text );
00368
00369 QString icon = element.attribute( d->attrIcon );
00370 QPixmap pix;
00371
00372 if ( !icon.isEmpty() )
00373 {
00374 KInstance *instance = d->m_instance;
00375 if ( !instance )
00376 instance = KGlobal::instance();
00377
00378 pix = SmallIcon( icon, instance );
00379 }
00380
00381 if ( !icon.isEmpty() )
00382 return static_cast<KPopupMenu *>(parent)->insertTitle( pix, i18nText, -1, index );
00383 else
00384 return static_cast<KPopupMenu *>(parent)->insertTitle( i18nText, -1, index );
00385 }
00386 }
00387 return 0;
00388 }
00389
00390 void KXMLGUIBuilder::removeCustomElement( QWidget *parent, int id )
00391 {
00392 if ( ::qt_cast<QPopupMenu *>( parent ) )
00393 static_cast<QPopupMenu *>(parent)->removeItem( id );
00394 else if ( ::qt_cast<QMenuBar *>( parent ) )
00395 static_cast<QMenuBar *>(parent)->removeItem( id );
00396 else if ( ::qt_cast<KToolBar *>( parent ) )
00397 static_cast<KToolBar *>(parent)->removeItemDelayed( id );
00398 }
00399
00400 KXMLGUIClient *KXMLGUIBuilder::builderClient() const
00401 {
00402 return d->m_client;
00403 }
00404
00405 void KXMLGUIBuilder::setBuilderClient( KXMLGUIClient *client )
00406 {
00407 d->m_client = client;
00408 if ( client )
00409 setBuilderInstance( client->instance() );
00410 }
00411
00412 KInstance *KXMLGUIBuilder::builderInstance() const
00413 {
00414 return d->m_instance;
00415 }
00416
00417 void KXMLGUIBuilder::setBuilderInstance( KInstance *instance )
00418 {
00419 d->m_instance = instance;
00420 }
00421
00422 void KXMLGUIBuilder::finalizeGUI( KXMLGUIClient * )
00423 {
00424 if ( !d->m_widget || !::qt_cast<KMainWindow *>( d->m_widget ) )
00425 return;
00426 #if 0
00427 KToolBar *toolbar = 0;
00428 QListIterator<KToolBar> it( ( (KMainWindow*)d->m_widget )->toolBarIterator() );
00429 while ( ( toolbar = it.current() ) ) {
00430 kdDebug() << "KXMLGUIBuilder::finalizeGUI toolbar=" << (void*)toolbar << endl;
00431 ++it;
00432 toolbar->positionYourself();
00433 }
00434 #else
00435 static_cast<KMainWindow *>(d->m_widget)->finalizeGUI( false );
00436 #endif
00437 }
00438
00439 void KXMLGUIBuilder::virtual_hook( int, void* )
00440 { }
00441