ktoolbarhandler.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
00168
00169
00170
00171
00172 m_toolBars = builder.toolBars();
00173
00174
00175
00176
00177
00178
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
00202
00203
00204
00205
00206
00207 if ( domDocument().documentElement().isNull() ) {
00208
00209 QString completeDescription = QString::fromLatin1( guiDescription )
00210 .arg( actionListName );
00211
00212 setXML( completeDescription, false );
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
00243
This file is part of the documentation for kdelibs Version 3.1.5.