kdeui Library API Documentation

ktoolbarhandler.cpp

00001 /* This file is part of the KDE libraries
00002    Copyright (C) 2002 Simon Hausmann <hausmann@kde.org>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License version 2 as published by the Free Software Foundation.
00007 
00008    This library is distributed in the hope that it will be useful,
00009    but WITHOUT ANY WARRANTY; without even the implied warranty of
00010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011    Library General Public License for more details.
00012 
00013    You should have received a copy of the GNU Library General Public License
00014    along with this library; see the file COPYING.LIB.  If not, write to
00015    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00016    Boston, MA 02111-1307, USA.
00017 */
00018 
00019 #include "ktoolbarhandler.h"
00020 
00021 #include <qpopupmenu.h>
00022 #include <kapplication.h>
00023 #include <ktoolbar.h>
00024 #include <kmainwindow.h>
00025 #include <klocale.h>
00026 #include <kaction.h>
00027 #include <assert.h>
00028 
00029 namespace
00030 {
00031     const char *actionListName = "show_menu_and_toolbar_actionlist";
00032 
00033     const char *guiDescription = ""
00034         "<!DOCTYPE kpartgui><kpartgui name=\"StandardToolBarMenuHandler\">"
00035         "<MenuBar>"
00036         "    <Menu name=\"settings\">"
00037         "        <ActionList name=\"%1\" />"
00038         "    </Menu>"
00039         "</MenuBar>"
00040         "</kpartgui>";
00041 
00042     const char *resourceFileName = "barhandler.rc";
00043 
00044     class BarActionBuilder
00045     {
00046     public:
00047         BarActionBuilder( KActionCollection *actionCollection, KMainWindow *mainWindow, QPtrList<KToolBar> &oldToolBarList )
00048             : m_actionCollection( actionCollection ), m_mainWindow( mainWindow ), m_needsRebuild( false )
00049         {
00050             QPtrList<QDockWindow> dockWindows = m_mainWindow->dockWindows();
00051             QPtrListIterator<QDockWindow> dockWindowIt( dockWindows );
00052             for ( ; dockWindowIt.current(); ++dockWindowIt ) {
00053 
00054                 KToolBar *toolBar = dynamic_cast<KToolBar *>( dockWindowIt.current() );
00055                 if ( !toolBar )
00056                     continue;
00057 
00058                 if ( oldToolBarList.findRef( toolBar ) == -1 )
00059                     m_needsRebuild = true;
00060 
00061                 m_toolBars.append( toolBar );
00062             }
00063 
00064             if ( !m_needsRebuild )
00065                 m_needsRebuild = ( oldToolBarList.count() != m_toolBars.count() );
00066         }
00067 
00068         bool needsRebuild() const { return m_needsRebuild; }
00069 
00070         QPtrList<KAction> create()
00071         {
00072             if ( !m_needsRebuild )
00073                 return QPtrList<KAction>();
00074 
00075             QPtrListIterator<KToolBar> toolBarIt( m_toolBars );
00076             for ( ; toolBarIt.current(); ++toolBarIt ) 
00077                 handleToolBar( toolBarIt.current() );
00078 
00079             QPtrList<KAction> actions;
00080 
00081             if ( m_toolBarActions.count() == 0 )
00082                 return actions;
00083 
00084             if ( m_toolBarActions.count() == 1 ) {
00085                 m_toolBarActions.getFirst()->setText( i18n( "Show Toolbar" ) );
00086                 return m_toolBarActions;
00087             }
00088 
00089             KActionMenu *menuAction = new KActionMenu( i18n( "Toolbars" ), m_actionCollection, "toolbars_submenu_action" );
00090 
00091             QPtrListIterator<KAction> actionIt( m_toolBarActions );
00092             for ( ; actionIt.current(); ++actionIt )
00093                 menuAction->insert( actionIt.current() );
00094 
00095             actions.append( menuAction );
00096             return actions;
00097         }
00098 
00099         const QPtrList<KToolBar> &toolBars() const { return m_toolBars; }
00100 
00101     private:
00102         void handleToolBar( KToolBar *toolBar )
00103         {
00104             KAction *action = new KToggleToolBarAction( toolBar,
00105                                                         i18n( "Show %1" ).arg( toolBar->label() ),
00106                                                         m_actionCollection, 
00107                                                         toolBar->name() );
00108 
00109             m_toolBarActions.append( action );
00110         }
00111 
00112         KActionCollection *m_actionCollection;
00113         KMainWindow *m_mainWindow;
00114 
00115         QPtrList<KToolBar> m_toolBars; 
00116         QPtrList<KAction> m_toolBarActions;
00117 
00118         bool m_needsRebuild : 1;
00119     };
00120 }
00121 
00122 using namespace KDEPrivate;
00123 
00124 ToolBarHandler::ToolBarHandler( KMainWindow *mainWindow, const char *name )
00125     : QObject( mainWindow, name ), KXMLGUIClient( mainWindow )
00126 {
00127     init( mainWindow );
00128 }
00129 
00130 ToolBarHandler::ToolBarHandler( KMainWindow *mainWindow, QObject *parent, const char *name ) 
00131     : QObject( parent, name ), KXMLGUIClient( mainWindow )  
00132 { 
00133     init( mainWindow ); 
00134 }
00135 
00136 ToolBarHandler::~ToolBarHandler()
00137 {
00138     m_actions.setAutoDelete( true );
00139     m_actions.clear();
00140 }
00141 
00142 KAction *ToolBarHandler::toolBarMenuAction()
00143 {
00144     assert( m_actions.count() == 1 );
00145     return m_actions.getFirst();
00146 }
00147 
00148 void ToolBarHandler::setupActions()
00149 {
00150     if ( !factory() || !m_mainWindow )
00151         return;
00152 
00153     BarActionBuilder builder( actionCollection(), m_mainWindow, m_toolBars );
00154 
00155     if ( !builder.needsRebuild() ) 
00156         return;
00157 
00158     unplugActionList( actionListName );
00159 
00160     m_actions.setAutoDelete( true );
00161     m_actions.clear();
00162     m_actions.setAutoDelete( false );
00163 
00164     m_actions = builder.create();
00165 
00166     /*
00167     for (  QPtrListIterator<KToolBar> toolBarIt( m_toolBars );
00168            toolBarIt.current(); ++toolBarIt )
00169         toolBarIt.current()->disconnect( this );
00170         */
00171 
00172     m_toolBars = builder.toolBars();
00173 
00174     /*
00175     for (  QPtrListIterator<KToolBar> toolBarIt( m_toolBars );
00176            toolBarIt.current(); ++toolBarIt )
00177         connect( toolBarIt.current(), SIGNAL( destroyed() ),
00178                  this, SLOT( setupActions() ) );
00179                  */
00180 
00181     if (kapp && kapp->authorizeKAction("options_show_toolbar"))
00182     plugActionList( actionListName, m_actions );
00183 
00184     connectToActionContainers();
00185 }
00186 
00187 void ToolBarHandler::clientAdded( KXMLGUIClient *client )
00188 {
00189     if ( client == this )
00190         setupActions();
00191 }
00192 
00193 void ToolBarHandler::init( KMainWindow *mainWindow )
00194 {
00195     d = 0;
00196     m_mainWindow = mainWindow;
00197 
00198     connect( m_mainWindow->guiFactory(), SIGNAL( clientAdded( KXMLGUIClient * ) ),
00199              this, SLOT( clientAdded( KXMLGUIClient * ) ) );
00200 
00201     /* re-use an existing resource file if it exists. can happen if the user launches the
00202      * toolbar editor */
00203     /*
00204     setXMLFile( resourceFileName );
00205     */
00206 
00207     if ( domDocument().documentElement().isNull() ) {
00208 
00209         QString completeDescription = QString::fromLatin1( guiDescription )
00210             .arg( actionListName );
00211 
00212         setXML( completeDescription, false /*merge*/ );
00213     }
00214 }
00215 
00216 void ToolBarHandler::connectToActionContainers()
00217 {
00218     QPtrListIterator<KAction> actionIt( m_actions );
00219     for ( ; actionIt.current(); ++actionIt ) 
00220         connectToActionContainer( actionIt.current() );
00221 }
00222 
00223 void ToolBarHandler::connectToActionContainer( KAction *action )
00224 {
00225     uint containerCount = action->containerCount();
00226     for ( uint i = 0; i < containerCount; ++i )
00227         connectToActionContainer( action->container( i ) );
00228 }
00229 
00230 void ToolBarHandler::connectToActionContainer( QWidget *container )
00231 {
00232     QPopupMenu *popupMenu = dynamic_cast<QPopupMenu *>( container );
00233     if ( !popupMenu )
00234         return;
00235 
00236     connect( popupMenu, SIGNAL( aboutToShow() ),
00237              this, SLOT( setupActions() ) );
00238 }
00239 
00240 #include "ktoolbarhandler.moc"
00241 
00242 /* vim: et sw=4 ts=4
00243  */
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.4.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Sun Feb 27 22:15:05 2005 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2001