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