00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kmdiguiclient.h"
00021 #include "kmdiguiclient.moc"
00022
00023 #include <qpopupmenu.h>
00024 #include <kapplication.h>
00025 #include <ktoolbar.h>
00026 #include <kmainwindow.h>
00027 #include <klocale.h>
00028 #include <kaction.h>
00029 #include <qstring.h>
00030 #include <assert.h>
00031 #include <kdebug.h>
00032 #include <kdockwidget.h>
00033 #include "kmdimainfrm.h"
00034 #include "kmditoolviewaccessor.h"
00035 #include "kmditoolviewaccessor_p.h"
00036 namespace
00037 {
00038 const char *actionListName = "show_kmdi_document_tool_view_actions";
00039
00040 const char *guiDescription = ""
00041 "<!DOCTYPE kpartgui><kpartgui name=\"KMDIViewActions\">"
00042 "<MenuBar>"
00043 " <Menu name=\"view\">"
00044 " <ActionList name=\"%1\" />"
00045 " </Menu>"
00046 "</MenuBar>"
00047 "</kpartgui>";
00048
00049 const char *resourceFileName = "kmdiviewactions.rc";
00050
00051 }
00052
00053
00054 using namespace KMDIPrivate;
00055
00056
00057
00058 ToggleToolViewAction::ToggleToolViewAction( const QString& text, const KShortcut& cut,KDockWidget *dw, KMdiMainFrm *mdiMainFrm,
00059 QObject* parent, const char* name )
00060 :KToggleAction(text,cut,parent,name),m_dw(dw),m_mdiMainFrm(mdiMainFrm)
00061 {
00062 if (m_dw) {
00063 connect(this,SIGNAL(toggled(bool)),this,SLOT(slotToggled(bool)));
00064 connect(m_dw->dockManager(),SIGNAL(change()),this,SLOT(anDWChanged()));
00065
00066 setChecked(m_dw->mayBeHide());
00067 }
00068 }
00069
00070
00071 ToggleToolViewAction::~ToggleToolViewAction(){unplugAll();}
00072
00073 void ToggleToolViewAction::anDWChanged()
00074 {
00075 if (isChecked() && m_dw->mayBeShow()) setChecked(false);
00076 else if ((!isChecked()) && m_dw->mayBeHide()) setChecked(true);
00077 else if (isChecked() && (m_dw->parentDockTabGroup() &&
00078 ((static_cast<KDockWidget*>(m_dw->parentDockTabGroup()->
00079 parent()->qt_cast("KDockWidget")))->mayBeShow()))) setChecked(false);
00080 }
00081
00082
00083 void ToggleToolViewAction::slotToggled(bool t)
00084 {
00085
00086
00087 if ((!t) && m_dw->mayBeHide() ) m_dw->undock();
00088 else
00089 if ( t && m_dw->mayBeShow() ) m_mdiMainFrm->makeDockVisible(m_dw);
00090
00091
00092 }
00093
00094 void ToggleToolViewAction::slotWidgetDestroyed()
00095 {
00096 disconnect(m_dw->dockManager(),SIGNAL(change()),this,SLOT(anDWChanged()));
00097 disconnect(this,SIGNAL(toggled(bool)),0,0);
00098 unplugAll();
00099 deleteLater();
00100 }
00101
00102
00103 KMDIGUIClient::KMDIGUIClient(KMdiMainFrm* mdiMainFrm,bool showMDIModeAction, const char* name): QObject( mdiMainFrm,name ),
00104 KXMLGUIClient( mdiMainFrm )
00105 {
00106 m_mdiMode=KMdi::ChildframeMode;
00107 m_mdiMainFrm=mdiMainFrm;
00108 connect( mdiMainFrm->guiFactory(), SIGNAL( clientAdded( KXMLGUIClient * ) ),
00109 this, SLOT( clientAdded( KXMLGUIClient * ) ) );
00110
00111
00112
00113
00114
00115
00116
00117 if ( domDocument().documentElement().isNull() ) {
00118
00119 QString completeDescription = QString::fromLatin1( guiDescription )
00120 .arg( actionListName );
00121
00122 setXML( completeDescription, false );
00123 }
00124
00125 if (actionCollection()->kaccel()==0)
00126 actionCollection()->setWidget(mdiMainFrm);
00127 m_toolMenu=new KActionMenu(i18n("Tool &Views"),actionCollection(),"kmdi_toolview_menu");
00128 if (showMDIModeAction) {
00129 m_mdiModeAction=new KSelectAction(i18n("MDI Mode"),0,actionCollection());
00130 QStringList modes;
00131 modes<<i18n("&Toplevel Mode")<<i18n("C&hildframe Mode")<<i18n("Ta&b Page Mode")<<i18n("I&DEAL Mode");
00132 m_mdiModeAction->setItems(modes);
00133 connect(m_mdiModeAction,SIGNAL(activated(int)),this,SLOT(changeViewMode(int)));
00134 } else m_mdiModeAction=0;
00135
00136 connect(m_mdiMainFrm,SIGNAL(mdiModeHasBeenChangedTo(KMdi::MdiMode)),
00137 this,SLOT(mdiModeHasBeenChangedTo(KMdi::MdiMode)));
00138
00139 m_gotoToolDockMenu=new KActionMenu(i18n("Tool &Docks"),actionCollection(),"kmdi_tooldock_menu");
00140 m_gotoToolDockMenu->insert(new KAction(i18n("Switch Top Dock"),ALT+CTRL+SHIFT+Key_T,this,SIGNAL(toggleTop()),
00141 actionCollection(),"kmdi_activate_top"));
00142 m_gotoToolDockMenu->insert(new KAction(i18n("Switch Left Dock"),ALT+CTRL+SHIFT+Key_L,this,SIGNAL(toggleLeft()),
00143 actionCollection(),"kmdi_activate_left"));
00144 m_gotoToolDockMenu->insert(new KAction(i18n("Switch Right Dock"),ALT+CTRL+SHIFT+Key_R,this,SIGNAL(toggleRight()),
00145 actionCollection(),"kmdi_activate_right"));
00146 m_gotoToolDockMenu->insert(new KAction(i18n("Switch Bottom Dock"),ALT+CTRL+SHIFT+Key_B,this,SIGNAL(toggleBottom()),
00147 actionCollection(),"kmdi_activate_bottom"));
00148 m_gotoToolDockMenu->insert(new KActionSeparator(actionCollection(),"kmdi_goto_menu_separator"));
00149 m_gotoToolDockMenu->insert(new KAction(i18n("Previous Tool View"),ALT+CTRL+Key_Left,m_mdiMainFrm,SLOT(prevToolViewInDock()),
00150 actionCollection(),"kmdi_prev_toolview"));
00151 m_gotoToolDockMenu->insert(new KAction(i18n("Next Tool View"),ALT+CTRL+Key_Right,m_mdiMainFrm,SLOT(nextToolViewInDock()),
00152 actionCollection(),"kmdi_next_toolview"));
00153
00154 }
00155
00156 KMDIGUIClient::~KMDIGUIClient()
00157 {
00158
00159 for (int i=0;i<m_toolViewActions.count();i++)
00160 disconnect(m_toolViewActions.at(i),0,this,0);
00161
00162 m_toolViewActions.setAutoDelete( false );
00163 m_toolViewActions.clear();
00164 m_documentViewActions.setAutoDelete( false );
00165 m_documentViewActions.clear();
00166 }
00167
00168
00169 void KMDIGUIClient::changeViewMode(int id) {
00170 switch (id) {
00171 case 0: m_mdiMainFrm->switchToToplevelMode();
00172 break;
00173 case 1: m_mdiMainFrm->switchToChildframeMode();
00174 break;
00175 case 2: m_mdiMainFrm->switchToTabPageMode();
00176 break;
00177 case 3: m_mdiMainFrm->switchToIDEAlMode();
00178 break;
00179 default:
00180 Q_ASSERT(0);
00181 }
00182 }
00183
00184 void KMDIGUIClient::setupActions()
00185 {
00186 if ( !factory() || !m_mdiMainFrm )
00187 return;
00188
00189
00190
00191
00192
00193
00194
00195 unplugActionList( actionListName );
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 QPtrList<KAction> addList;
00209 if (m_toolViewActions.count()<3)
00210 for (uint i=0;i<m_toolViewActions.count();i++)
00211 addList.append(m_toolViewActions.at(i));
00212 else
00213 addList.append(m_toolMenu);
00214 if (m_mdiMode==KMdi::IDEAlMode) addList.append(m_gotoToolDockMenu);
00215 if (m_mdiModeAction) addList.append(m_mdiModeAction);
00216 kdDebug(760)<<"KMDIGUIClient::setupActions: plugActionList"<<endl;
00217 plugActionList( actionListName, addList );
00218
00219
00220 }
00221
00222 void KMDIGUIClient::addToolView(KMdiToolViewAccessor* mtva) {
00223 kdDebug(760)<<"*****void KMDIGUIClient::addToolView(KMdiToolViewAccessor* mtva)*****"<<endl;
00224 KAction *a=new ToggleToolViewAction(i18n("Show %1").arg(mtva->wrappedWidget()->caption()),
00225 QString::null,dynamic_cast<KDockWidget*>(mtva->wrapperWidget()),m_mdiMainFrm,actionCollection() );
00226 connect(a,SIGNAL(destroyed(QObject*)),this,SLOT(actionDeleted(QObject*)));
00227 m_toolViewActions.append(a);
00228 m_toolMenu->insert(a);
00229 mtva->d->action=a;
00230 setupActions();
00231 }
00232
00233 void KMDIGUIClient::actionDeleted(QObject* a) {
00234 m_toolViewActions.remove(static_cast<KAction*>(a));
00235
00236 setupActions();
00237 }
00238
00239
00240 void KMDIGUIClient::clientAdded( KXMLGUIClient *client )
00241 {
00242 if ( client == this )
00243 setupActions();
00244 }
00245
00246
00247 void KMDIGUIClient::mdiModeHasBeenChangedTo(KMdi::MdiMode mode) {
00248 kdDebug(760)<<"KMDIGUIClient::mdiModeHasBennChangeTo"<<endl;
00249 m_mdiMode=mode;
00250 if (m_mdiModeAction) {
00251 switch (mode) {
00252 case KMdi::ToplevelMode:
00253 m_mdiModeAction->setCurrentItem(0);
00254 break;
00255 case KMdi::ChildframeMode:
00256 m_mdiModeAction->setCurrentItem(1);
00257 break;
00258 case KMdi::TabPageMode:
00259 m_mdiModeAction->setCurrentItem(2);
00260 break;
00261 case KMdi::IDEAlMode:
00262 m_mdiModeAction->setCurrentItem(3);
00263 break;
00264 default: Q_ASSERT(0);
00265 }
00266 }
00267 setupActions();
00268
00269 }
00270
00271