You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/kmdi/kmdiguiclient.cpp

321 lines
10 KiB

/* This file is part of the KDE libraries
Copyright (C) 2003 Joseph Wenninger <jowenn@kde.org>
based on ktoolbarhandler.cpp: Copyright (C) 2002 Simon Hausmann <hausmann@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "kmdiguiclient.h"
#include "kmdiguiclient.moc"
#include <qpopupmenu.h>
#include <kapplication.h>
#include <kconfig.h>
#include <ktoolbar.h>
#include <kmainwindow.h>
#include <klocale.h>
#include <kaction.h>
#include <qstring.h>
#include <assert.h>
#include <kdebug.h>
#include <kdockwidget.h>
#include <kdeversion.h>
#include "kmdimainfrm.h"
#include "kmditoolviewaccessor.h"
#include "kmditoolviewaccessor_p.h"
namespace
{
const char *actionListName = "show_kmdi_document_tool_view_actions";
const char *guiDescription = ""
"<!DOCTYPE kpartgui><kpartgui name=\"KMDIViewActions\">"
"<MenuBar>"
" <Menu name=\"view\">"
" <ActionList name=\"%1\" />"
" </Menu>"
"</MenuBar>"
"</kpartgui>";
const char *resourceFileName = "kmdiviewactions.rc";
}
using namespace KMDIPrivate;
ToggleToolViewAction::ToggleToolViewAction( const QString& text, const KShortcut& cut, KDockWidget *dw, KMdiMainFrm *mdiMainFrm,
QObject* parent, const char* name )
: KToggleAction( text, cut, parent, name ), m_dw( dw ), m_mdiMainFrm( mdiMainFrm )
{
if ( m_dw )
{
connect( this, SIGNAL( toggled( bool ) ), this, SLOT( slotToggled( bool ) ) );
connect( m_dw->dockManager(), SIGNAL( change() ), this, SLOT( anDWChanged() ) );
connect( m_dw, SIGNAL( destroyed() ), this, SLOT( slotWidgetDestroyed() ) );
setChecked( m_dw->mayBeHide() );
}
}
ToggleToolViewAction::~ToggleToolViewAction()
{
unplugAll();
}
void ToggleToolViewAction::anDWChanged()
{
if ( isChecked() && m_dw->mayBeShow() )
setChecked( false );
else if ( ( !isChecked() ) && m_dw->mayBeHide() )
setChecked( true );
else if ( isChecked() && ( m_dw->parentDockTabGroup() &&
( ( static_cast<KDockWidget*>( m_dw->parentDockTabGroup() ->
parent() ->qt_cast( "KDockWidget" ) ) ) ->mayBeShow() ) ) )
setChecked( false );
}
void ToggleToolViewAction::slotToggled( bool t )
{
// m_mw->mainDock->setDockSite( KDockWidget::DockCorner );
if ( ( !t ) && m_dw->mayBeHide() )
m_dw->undock();
else
if ( t && m_dw->mayBeShow() )
m_mdiMainFrm->makeDockVisible( m_dw );
// m_mw->mainDock->setDockSite( KDockWidget::DockNone );
}
void ToggleToolViewAction::slotWidgetDestroyed()
{
disconnect( m_dw->dockManager(), SIGNAL( change() ), this, SLOT( anDWChanged() ) );
disconnect( this, SIGNAL( toggled( bool ) ), 0, 0 );
unplugAll();
deleteLater();
}
KMDIGUIClient::KMDIGUIClient( KMdiMainFrm* mdiMainFrm, bool showMDIModeAction, const char* name ) : QObject( mdiMainFrm, name ),
KXMLGUIClient( mdiMainFrm )
{
m_mdiMode = KMdi::ChildframeMode;
m_mdiMainFrm = mdiMainFrm;
connect( mdiMainFrm->guiFactory(), SIGNAL( clientAdded( KXMLGUIClient * ) ),
this, SLOT( clientAdded( KXMLGUIClient * ) ) );
/* re-use an existing resource file if it exists. can happen if the user launches the
* toolbar editor */
/*
setXMLFile( resourceFileName );
*/
if ( domDocument().documentElement().isNull() )
{
QString completeDescription = QString::fromLatin1( guiDescription )
.arg( actionListName );
setXML( completeDescription, false /*merge*/ );
}
if ( actionCollection() ->kaccel() == 0 )
actionCollection() ->setWidget( mdiMainFrm );
m_toolMenu = new KActionMenu( i18n( "Tool &Views" ), actionCollection(), "kmdi_toolview_menu" );
if ( showMDIModeAction )
{
m_mdiModeAction = new KSelectAction( i18n( "MDI Mode" ), 0, actionCollection() );
QStringList modes;
modes << i18n( "&Toplevel Mode" ) << i18n( "C&hildframe Mode" ) << i18n( "Ta&b Page Mode" ) << i18n( "I&DEAl Mode" );
m_mdiModeAction->setItems( modes );
connect( m_mdiModeAction, SIGNAL( activated( int ) ), this, SLOT( changeViewMode( int ) ) );
}
else
m_mdiModeAction = 0;
connect( m_mdiMainFrm, SIGNAL( mdiModeHasBeenChangedTo( KMdi::MdiMode ) ),
this, SLOT( mdiModeHasBeenChangedTo( KMdi::MdiMode ) ) );
m_gotoToolDockMenu = new KActionMenu( i18n( "Tool &Docks" ), actionCollection(), "kmdi_tooldock_menu" );
m_gotoToolDockMenu->insert( new KAction( i18n( "Switch Top Dock" ), ALT + CTRL + SHIFT + Key_T, this, SIGNAL( toggleTop() ),
actionCollection(), "kmdi_activate_top" ) );
m_gotoToolDockMenu->insert( new KAction( i18n( "Switch Left Dock" ), ALT + CTRL + SHIFT + Key_L, this, SIGNAL( toggleLeft() ),
actionCollection(), "kmdi_activate_left" ) );
m_gotoToolDockMenu->insert( new KAction( i18n( "Switch Right Dock" ), ALT + CTRL + SHIFT + Key_R, this, SIGNAL( toggleRight() ),
actionCollection(), "kmdi_activate_right" ) );
m_gotoToolDockMenu->insert( new KAction( i18n( "Switch Bottom Dock" ), ALT + CTRL + SHIFT + Key_B, this, SIGNAL( toggleBottom() ),
actionCollection(), "kmdi_activate_bottom" ) );
m_gotoToolDockMenu->insert( new KActionSeparator( actionCollection(), "kmdi_goto_menu_separator" ) );
m_gotoToolDockMenu->insert( new KAction( i18n( "Previous Tool View" ), ALT + CTRL + Key_Left, m_mdiMainFrm, SLOT( prevToolViewInDock() ),
actionCollection(), "kmdi_prev_toolview" ) );
m_gotoToolDockMenu->insert( new KAction( i18n( "Next Tool View" ), ALT + CTRL + Key_Right, m_mdiMainFrm, SLOT( nextToolViewInDock() ),
actionCollection(), "kmdi_next_toolview" ) );
actionCollection() ->readShortcutSettings( "Shortcuts", kapp->config() );
}
KMDIGUIClient::~KMDIGUIClient()
{
// actionCollection()->writeShortcutSettings( "KMDI Shortcuts", kapp->config() );
for ( uint i = 0;i < m_toolViewActions.count();i++ )
disconnect( m_toolViewActions.at( i ), 0, this, 0 );
m_toolViewActions.setAutoDelete( false );
m_toolViewActions.clear();
m_documentViewActions.setAutoDelete( false );
m_documentViewActions.clear();
}
void KMDIGUIClient::changeViewMode( int id )
{
switch ( id )
{
case 0:
m_mdiMainFrm->switchToToplevelMode();
break;
case 1:
m_mdiMainFrm->switchToChildframeMode();
break;
case 2:
m_mdiMainFrm->switchToTabPageMode();
break;
case 3:
m_mdiMainFrm->switchToIDEAlMode();
break;
default:
Q_ASSERT( 0 );
}
}
void KMDIGUIClient::setupActions()
{
if ( !factory() || !m_mdiMainFrm )
return ;
// BarActionBuilder builder( actionCollection(), m_mainWindow, m_toolBars );
// if ( !builder.needsRebuild() )
// return;
unplugActionList( actionListName );
// m_actions.setAutoDelete( true );
// m_actions.clear();
// m_actions.setAutoDelete( false );
// m_actions = builder.create();
// m_toolBars = builder.toolBars();
// m_toolViewActions.append(new KAction( "TESTKMDIGUICLIENT", QString::null, 0,
// this, SLOT(blah()),actionCollection(),"nothing"));
QPtrList<KAction> addList;
if ( m_toolViewActions.count() < 3 )
for ( uint i = 0;i < m_toolViewActions.count();i++ )
addList.append( m_toolViewActions.at( i ) );
else
addList.append( m_toolMenu );
if ( m_mdiMode == KMdi::IDEAlMode )
addList.append( m_gotoToolDockMenu );
if ( m_mdiModeAction )
addList.append( m_mdiModeAction );
kdDebug( 760 ) << "KMDIGUIClient::setupActions: plugActionList" << endl;
plugActionList( actionListName, addList );
// connectToActionContainers();
}
void KMDIGUIClient::addToolView( KMdiToolViewAccessor* mtva )
{
kdDebug( 760 ) << "*****void KMDIGUIClient::addToolView(KMdiToolViewAccessor* mtva)*****" << endl;
// kdDebug()<<"name: "<<mtva->wrappedWidget()->name()<<endl;
QString aname = QString( "kmdi_toolview_" ) + mtva->wrappedWidget() ->name();
// try to read the action shortcut
KShortcut sc;
KConfig *cfg = kapp->config();
QString _grp = cfg->group();
cfg->setGroup( "Shortcuts" );
// if ( cfg->hasKey( aname ) )
sc = KShortcut( cfg->readEntry( aname, "" ) );
cfg->setGroup( _grp );
KAction *a = new ToggleToolViewAction( i18n( "Show %1" ).arg( mtva->wrappedWidget() ->caption() ),
/*QString::null*/sc, dynamic_cast<KDockWidget*>( mtva->wrapperWidget() ),
m_mdiMainFrm, actionCollection(), aname.latin1() );
#if KDE_IS_VERSION(3,2,90)
( ( ToggleToolViewAction* ) a ) ->setCheckedState( i18n( "Hide %1" ).arg( mtva->wrappedWidget() ->caption() ) );
#endif
connect( a, SIGNAL( destroyed( QObject* ) ), this, SLOT( actionDeleted( QObject* ) ) );
m_toolViewActions.append( a );
m_toolMenu->insert( a );
mtva->d->action = a;
setupActions();
}
void KMDIGUIClient::actionDeleted( QObject* a )
{
m_toolViewActions.remove( static_cast<KAction*>( a ) );
/* if (!m_toolMenu.isNull()) m_toolMenu->remove(static_cast<KAction*>(a));*/
setupActions();
}
void KMDIGUIClient::clientAdded( KXMLGUIClient *client )
{
if ( client == this )
setupActions();
}
void KMDIGUIClient::mdiModeHasBeenChangedTo( KMdi::MdiMode mode )
{
kdDebug( 760 ) << "KMDIGUIClient::mdiModeHasBennChangeTo" << endl;
m_mdiMode = mode;
if ( m_mdiModeAction )
{
switch ( mode )
{
case KMdi::ToplevelMode:
m_mdiModeAction->setCurrentItem( 0 );
break;
case KMdi::ChildframeMode:
m_mdiModeAction->setCurrentItem( 1 );
break;
case KMdi::TabPageMode:
m_mdiModeAction->setCurrentItem( 2 );
break;
case KMdi::IDEAlMode:
m_mdiModeAction->setCurrentItem( 3 );
break;
default:
Q_ASSERT( 0 );
}
}
setupActions();
}
// kate: space-indent off; tab-width 4; replace-tabs off; indent-mode csands;