• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kdeui

kxmlguibuilder.cpp

Go to the documentation of this file.
00001 /* This file is part of the KDE project
00002    Copyright (C) 2000 Simon Hausmann <hausmann@kde.org>
00003                       David Faure <faure@kde.org>
00004 
00005    This library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Library General Public
00007    License as published by the Free Software Foundation; either
00008    version 2 of the License, or (at your option) any later version.
00009 
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public License
00016    along with this library; see the file COPYING.LIB.  If not, write to
00017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018    Boston, MA 02110-1301, USA.
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     // Look up to see if we are inside a mainwindow. If yes, then
00142     // use it as parent widget (to get kaction to plug itself into the
00143     // mainwindow). Don't use a popupmenu as parent widget, otherwise
00144     // the popup won't be hidden if it is used as a standalone menu as well.
00145     // And we don't want to set the parent for a standalone popupmenu,
00146     // otherwise its shortcuts appear.
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() ) // try with capital T
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() ) // still no luck
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   // Warning parent can be 0L
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     // Don't delete menubar - it can be reused by createContainer.
00268     // If you decide that you do need to delete the menubar, make
00269     // sure that QMainWindow::d->mb does not point to a deleted
00270     // menubar object.
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       // Don't insert multiple separators in a row
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       // Don't insert a separator at the top of the menu
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 { /*BASE::virtual_hook( id, data );*/ }
00441 

kdeui

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

API Reference

Skip menu "API Reference"
  • dcop
  • DNSSD
  • interfaces
  • Kate
  • kconf_update
  • KDECore
  • KDED
  • kdefx
  • KDEsu
  • kdeui
  • KDocTools
  • KHTML
  • KImgIO
  • KInit
  • kio
  • kioslave
  • KJS
  • KNewStuff
  • KParts
  • KUtils
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal