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