kmdi Library API Documentation

mainwindow.cpp

00001 /* This file is part of the KDE libraries 00002 Copyright (C) 2004 Christoph Cullmann <cullmann@kde.org> 00003 Copyright (C) 2002,2003 Joseph Wenninger <jowenn@kde.org> 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License as published by the Free Software Foundation; either 00008 version 2 of the License, or (at your option) any later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public License 00016 along with this library; see the file COPYING.LIB. If not, write to 00017 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00018 Boston, MA 02111-1307, USA. 00019 00020 Based on: 00021 00022 //---------------------------------------------------------------------------- 00023 // Project : KDE MDI extension 00024 // 00025 // begin : 07/1999 by Szymon Stefanek as part of kvirc 00026 // (an IRC application) 00027 // changes : 09/1999 by Falk Brettschneider to create an 00028 // - 06/2000 stand-alone Qt extension set of 00029 // classes and a Qt-based library 00030 // : 02/2000 by Massimo Morin (mmorin@schedsys.com) 00031 // 2000-2003 maintained by the KDevelop project 00032 // patches : -/2000 by Lars Beikirch (Lars.Beikirch@gmx.net) 00033 // : 01/2003 by Jens Zurheide (jens.zurheide@gmx.de) 00034 // 00035 // copyright : (C) 1999-2003 by Falk Brettschneider 00036 // and 00037 // Szymon Stefanek (stefanek@tin.it) 00038 // email : falkbr@kdevelop.org (Falk Brettschneider) 00039 //---------------------------------------------------------------------------- 00040 */ 00041 00042 #include "config.h" 00043 00044 #include "tabwidget.h" 00045 00046 #include <assert.h> 00047 00048 #include <qcursor.h> 00049 #include <qclipboard.h> 00050 #include <qobjectlist.h> 00051 #include <qpopupmenu.h> 00052 #include <qmenubar.h> 00053 00054 #include <kmenubar.h> 00055 #include <kapplication.h> 00056 #include <kdebug.h> 00057 #include <kdeversion.h> 00058 #include <qtabwidget.h> 00059 #include <klocale.h> 00060 00061 #include <kiconloader.h> 00062 #include "dockcontainer.h" 00063 #include "mainwindow.moc" 00064 00065 00066 #include <qtoolbutton.h> 00067 #include <qlayout.h> 00068 #include <qstring.h> 00069 #include <qmap.h> 00070 #include <qvaluelist.h> 00071 00072 #include "mainwindow.h" 00073 #include "dockcontainer.h" 00074 #include "toolviewaccessor_p.h" 00075 00076 #include "guiclient.h" 00077 00078 namespace KMDIPrivate 00079 { 00080 class MainWindowPrivate { 00081 public: 00082 MainWindowPrivate() { 00083 for (int i=0;i<4;i++) { 00084 activeDockPriority[i]=0; 00085 m_styleIDEAlMode = 0; 00086 m_toolviewStyle = 0; 00087 } 00088 } 00089 ~MainWindowPrivate() {} 00090 KMDI::DockContainer* activeDockPriority[4]; 00091 int m_styleIDEAlMode; 00092 int m_toolviewStyle; 00093 }; 00094 } 00095 00096 namespace KMDI 00097 { 00098 00099 //============ constructor ============// 00100 MainWindow::MainWindow(QWidget* parentWidget, const char* name) 00101 : KParts::DockMainWindow( parentWidget, name) 00102 , m_toolViews (new QMap<QWidget*,KMDI::ToolViewAccessor*>) 00103 , d(new KMDIPrivate::MainWindowPrivate()) 00104 { 00105 // setup main dock stuff 00106 setupMainDock (); 00107 00108 // setup the sidebar framework 00109 setupToolViews (); 00110 00111 // setup all menu entries 00112 setupGUIClient (); 00113 } 00114 00115 //============ ~MainWindow ============// 00116 MainWindow::~MainWindow() 00117 { 00118 delete m_toolViews; 00119 m_toolViews=0; 00120 00121 delete d; 00122 d=0; 00123 } 00124 00125 void MainWindow::setupMainDock () 00126 { 00127 // cover KMdi's childarea by a dockwidget 00128 KDockWidget *dw = createDockWidget( "mdiAreaCover", QPixmap(), 0L, "mdi_area_cover"); 00129 dw->setDockWindowTransient(this,true); 00130 dw->setEnableDocking(KDockWidget::DockNone); 00131 dw->setDockSite(KDockWidget::DockCorner); 00132 00133 // setup tab widget 00134 m_tabWidget = new KMDI::TabWidget (dw); 00135 dw->setWidget(m_tabWidget); 00136 00137 // set this dock to main view 00138 setView(dw); 00139 setMainDockWidget(dw); 00140 00141 // connect signals to collapse sidebars 00142 connect(m_tabWidget,SIGNAL(focusInEvent()),this,SIGNAL(collapseOverlapContainers())); 00143 } 00144 00145 void MainWindow::setupToolViews () 00146 { 00147 m_leftContainer = createDockWidget("KMdiDock::leftDock",SmallIcon("misc"),0L,"Left Dock"); 00148 m_rightContainer = createDockWidget("KMdiDock::rightDock",SmallIcon("misc"),0L,"Right Dock"); 00149 m_topContainer = createDockWidget("KMdiDock::topDock",SmallIcon("misc"),0L,"Top Dock"); 00150 m_bottomContainer = createDockWidget("KMdiDock::bottomDock",SmallIcon("misc"),0L,"Bottom Dock"); 00151 00152 KDockWidget *mainDock=getMainDockWidget(); 00153 KDockWidget *w=mainDock; 00154 00155 if (mainDock->parentDockTabGroup()) { 00156 w=static_cast<KDockWidget*>(mainDock->parentDockTabGroup()->parent()); 00157 } 00158 00159 QPtrList<KDockWidget> leftReparentWidgets; 00160 QPtrList<KDockWidget> rightReparentWidgets; 00161 QPtrList<KDockWidget> bottomReparentWidgets; 00162 QPtrList<KDockWidget> topReparentWidgets; 00163 00164 if (mainDock->parentDockTabGroup()) { 00165 mainDock=static_cast<KDockWidget*>(mainDock->parentDockTabGroup()->parent()); 00166 } 00167 00168 findToolViewsDockedToMain(&leftReparentWidgets,KDockWidget::DockLeft); 00169 findToolViewsDockedToMain(&rightReparentWidgets,KDockWidget::DockRight); 00170 findToolViewsDockedToMain(&bottomReparentWidgets,KDockWidget::DockBottom); 00171 findToolViewsDockedToMain(&topReparentWidgets,KDockWidget::DockTop); 00172 00173 mainDock->setEnableDocking(KDockWidget::DockNone); //::DockCorner); 00174 mainDock->setDockSite(KDockWidget::DockCorner); 00175 00176 00177 DockContainer *tmpDC; 00178 m_leftContainer->setWidget(tmpDC=new DockContainer(m_leftContainer, this, KDockWidget::DockLeft, d->m_styleIDEAlMode)); 00179 m_leftContainer->setEnableDocking(KDockWidget::DockLeft); 00180 m_leftContainer->manualDock(mainDock, KDockWidget::DockLeft,20); 00181 tmpDC->init(); 00182 00183 connect (this,SIGNAL(toggleLeft()),tmpDC,SLOT(toggle())); 00184 connect(this,SIGNAL(collapseOverlapContainers()),tmpDC,SLOT(collapseOverlapped())); 00185 connect(tmpDC,SIGNAL(activated(DockContainer*)),this,SLOT(setActiveToolDock(DockContainer*))); 00186 connect(tmpDC,SIGNAL(deactivated(DockContainer*)),this,SLOT(removeFromActiveDockList(DockContainer*))); 00187 00188 m_rightContainer->setWidget(tmpDC=new DockContainer(m_rightContainer, this, KDockWidget::DockRight, d->m_styleIDEAlMode)); 00189 m_rightContainer->setEnableDocking(KDockWidget::DockRight); 00190 m_rightContainer->manualDock(mainDock, KDockWidget::DockRight,80); 00191 tmpDC->init(); 00192 00193 connect (this,SIGNAL(toggleRight()),tmpDC,SLOT(toggle())); 00194 connect(this,SIGNAL(collapseOverlapContainers()),tmpDC,SLOT(collapseOverlapped())); 00195 connect(tmpDC,SIGNAL(activated(DockContainer*)),this,SLOT(setActiveToolDock(DockContainer*))); 00196 connect(tmpDC,SIGNAL(deactivated(DockContainer*)),this,SLOT(removeFromActiveDockList(DockContainer*))); 00197 00198 m_topContainer->setWidget(tmpDC=new DockContainer(m_topContainer, this, KDockWidget::DockTop, d->m_styleIDEAlMode)); 00199 m_topContainer->setEnableDocking(KDockWidget::DockTop); 00200 m_topContainer->manualDock(mainDock, KDockWidget::DockTop,20); 00201 tmpDC->init(); 00202 00203 connect (this,SIGNAL(toggleTop()),tmpDC,SLOT(toggle())); 00204 connect(this,SIGNAL(collapseOverlapContainers()),tmpDC,SLOT(collapseOverlapped())); 00205 connect(tmpDC,SIGNAL(activated(DockContainer*)),this,SLOT(setActiveToolDock(DockContainer*))); 00206 connect(tmpDC,SIGNAL(deactivated(DockContainer*)),this,SLOT(removeFromActiveDockList(DockContainer*))); 00207 00208 m_bottomContainer->setWidget(tmpDC=new DockContainer(m_bottomContainer, this, KDockWidget::DockBottom, d->m_styleIDEAlMode)); 00209 m_bottomContainer->setEnableDocking(KDockWidget::DockBottom); 00210 m_bottomContainer->manualDock(mainDock, KDockWidget::DockBottom,80); 00211 tmpDC->init(); 00212 00213 connect (this,SIGNAL(toggleBottom()),tmpDC,SLOT(toggle())); 00214 connect(this,SIGNAL(collapseOverlapContainers()),tmpDC,SLOT(collapseOverlapped())); 00215 connect(tmpDC,SIGNAL(activated(DockContainer*)),this,SLOT(setActiveToolDock(DockContainer*))); 00216 connect(tmpDC,SIGNAL(deactivated(DockContainer*)),this,SLOT(removeFromActiveDockList(DockContainer*))); 00217 00218 m_leftContainer->setDockSite( KDockWidget::DockCenter ); 00219 m_rightContainer->setDockSite( KDockWidget::DockCenter ); 00220 m_topContainer->setDockSite( KDockWidget::DockCenter ); 00221 m_bottomContainer->setDockSite( KDockWidget::DockCenter ); 00222 00223 dockToolViewsIntoContainers(leftReparentWidgets,m_leftContainer); 00224 dockToolViewsIntoContainers(rightReparentWidgets,m_rightContainer); 00225 dockToolViewsIntoContainers(bottomReparentWidgets,m_bottomContainer); 00226 dockToolViewsIntoContainers(topReparentWidgets,m_topContainer); 00227 00228 dockManager->setSpecialLeftDockContainer(m_leftContainer); 00229 dockManager->setSpecialRightDockContainer(m_rightContainer); 00230 dockManager->setSpecialTopDockContainer(m_topContainer); 00231 dockManager->setSpecialBottomDockContainer(m_bottomContainer); 00232 00233 ((DockContainer*) (m_leftContainer->getWidget()))->hideIfNeeded(); 00234 ((DockContainer*) (m_rightContainer->getWidget()))->hideIfNeeded(); 00235 ((DockContainer*) (m_topContainer->getWidget()))->hideIfNeeded(); 00236 ((DockContainer*) (m_bottomContainer->getWidget()))->hideIfNeeded(); 00237 } 00238 00239 void MainWindow::setupGUIClient () 00240 { 00241 m_guiClient = new KMDIPrivate::GUIClient (this); 00242 00243 connect(m_guiClient,SIGNAL(toggleTop()),this,SIGNAL(toggleTop())); 00244 connect(m_guiClient,SIGNAL(toggleLeft()),this,SIGNAL(toggleLeft())); 00245 connect(m_guiClient,SIGNAL(toggleRight()),this,SIGNAL(toggleRight())); 00246 connect(m_guiClient,SIGNAL(toggleBottom()),this,SIGNAL(toggleBottom())); 00247 } 00248 00249 TabWidget *MainWindow::tabWidget () 00250 { 00251 return m_tabWidget; 00252 } 00253 00254 ToolViewAccessor *MainWindow::createToolWindow() 00255 { 00256 return new KMDI::ToolViewAccessor(this); 00257 } 00258 00259 KMDI::ToolViewAccessor *MainWindow::addToolWindow( QWidget* pWnd, KDockWidget::DockPosition pos, QWidget* pTargetWnd, int percent, const QString& tabToolTip, const QString& tabCaption) 00260 { 00261 QWidget *tvta=pWnd; 00262 KDockWidget* pDW = dockManager->getDockWidgetFromName(pWnd->name()); 00263 if (pDW) { 00264 // probably readDockConfig already created the widgetContainer, use that 00265 pDW->setWidget(pWnd); 00266 00267 if (pWnd->icon()) { 00268 pDW->setPixmap(*pWnd->icon()); 00269 } 00270 pDW->setTabPageLabel((tabCaption==0)?pWnd->caption():tabCaption); 00271 pDW->setToolTipString(tabToolTip); 00272 dockManager->removeFromAutoCreateList(pDW); 00273 pWnd=pDW; 00274 } 00275 00276 QRect r=pWnd->geometry(); 00277 00278 KMDI::ToolViewAccessor *mtva=new KMDI::ToolViewAccessor(this,pWnd,tabToolTip,(tabCaption==0)?pWnd->caption():tabCaption); 00279 m_toolViews->insert(tvta,mtva); 00280 00281 if (pos == KDockWidget::DockNone) { 00282 mtva->d->widgetContainer->setEnableDocking(KDockWidget::DockNone); 00283 mtva->d->widgetContainer->reparent(this, Qt::WType_TopLevel | Qt::WType_Dialog, r.topLeft(), isVisible()); 00284 } else { // add (and dock) the toolview as DockWidget view 00285 //const QPixmap& wndIcon = pWnd->icon() ? *(pWnd->icon()) : QPixmap(); 00286 00287 //KDockWidget *pCover=mtva->d->widgetContainer; 00288 00289 mtva->place(pos, pTargetWnd,percent); 00290 } 00291 00292 return mtva; 00293 } 00294 00295 void MainWindow::deleteToolWindow( KMDI::ToolViewAccessor *accessor) 00296 { 00297 delete accessor; 00298 } 00299 00300 void MainWindow::deleteToolWindow( QWidget* pWnd) 00301 { 00302 if (!pWnd) 00303 return; 00304 00305 if (m_toolViews->contains(pWnd)) { 00306 deleteToolWindow((*m_toolViews)[pWnd]); 00307 } 00308 } 00309 00310 void MainWindow::setToolViewStyle(int flag) 00311 { 00312 d->m_styleIDEAlMode = flag; // see KMultiTabBar for the first 3 bits 00313 00314 DockContainer *tmpL=(DockContainer*) (m_leftContainer->getWidget()->qt_cast("KMDI::DockContainer")); 00315 if (tmpL) tmpL->setStyle(flag); 00316 00317 DockContainer *tmpR=(DockContainer*) (m_rightContainer->getWidget()->qt_cast("KMDI::DockContainer")); 00318 if (tmpR) tmpR->setStyle(flag); 00319 00320 DockContainer *tmpT=(DockContainer*) (m_topContainer->getWidget()->qt_cast("KMDI::DockContainer")); 00321 if (tmpT) tmpT->setStyle(flag); 00322 00323 DockContainer *tmpB=(DockContainer*) (m_bottomContainer->getWidget()->qt_cast("KMDI::DockContainer")); 00324 if (tmpB) tmpB->setStyle(flag); 00325 00326 d->m_toolviewStyle = flag; 00327 bool toolviewExists = false; 00328 QMap<QWidget*,KMDI::ToolViewAccessor*>::Iterator it; 00329 for (it = m_toolViews->begin(); it != m_toolViews->end(); ++it) { 00330 KDockWidget *dockWidget = dynamic_cast<KDockWidget*>(it.data()->wrapperWidget()); 00331 if (dockWidget) { 00332 if (flag == KMDI::IconOnly) 00333 { 00334 dockWidget->setTabPageLabel(" "); 00335 dockWidget->setPixmap(*(it.data()->wrappedWidget()->icon())); 00336 } else 00337 if (flag == KMDI::TextOnly) 00338 { 00339 dockWidget->setPixmap(); //FIXME: Does not hide the icon in the IDEAl mode. 00340 dockWidget->setTabPageLabel(it.data()->wrappedWidget()->caption()); 00341 } else 00342 if (flag == KMDI::TextAndIcon) 00343 { 00344 dockWidget->setPixmap(*(it.data()->wrappedWidget()->icon())); 00345 dockWidget->setTabPageLabel(it.data()->wrappedWidget()->caption()); 00346 } 00347 toolviewExists = true; 00348 } 00349 } 00350 if (toolviewExists) 00351 { 00352 //workaround for the above FIXME to make switching to TextOnly mode work in IDEAl as well. Be sure that this version of switch* is called. 00353 if (flag == KMDI::TextOnly) 00354 { 00355 /* MainWindow::switchToTabPageMode(); 00356 MainWindow::switchToIDEAlMode();*/ //TODO 00357 } else 00358 { 00359 writeDockConfig(); 00360 readDockConfig(); 00361 } 00362 } 00363 } 00364 00365 void MainWindow::dockToolViewsIntoContainers(QPtrList<KDockWidget>& widgetsToReparent,KDockWidget *container) { 00366 for ( KDockWidget *dw = widgetsToReparent.first(); dw; 00367 dw=widgetsToReparent.next()){ 00368 dw->manualDock(container,KDockWidget::DockCenter,20); 00369 dw->loseFormerBrotherDockWidget(); 00370 } 00371 } 00372 00373 void MainWindow::findToolViewsDockedToMain(QPtrList<KDockWidget>* list,KDockWidget::DockPosition dprtmw) { 00374 KDockWidget *mainDock=getMainDockWidget(); 00375 if (mainDock->parentDockTabGroup()) { 00376 mainDock=dynamic_cast<KDockWidget*>(mainDock->parentDockTabGroup()->parent()); 00377 // FIXME: will likely crash below due to unchecked cast 00378 } 00379 00380 KDockWidget* widget=mainDock->findNearestDockWidget(dprtmw); 00381 if (widget) { 00382 if (widget->parentDockTabGroup()) { 00383 widget=static_cast<KDockWidget*>(widget->parentDockTabGroup()->parent()); 00384 } 00385 00386 if (widget) { 00387 KDockTabGroup *tg=dynamic_cast<KDockTabGroup*>(widget-> 00388 getWidget()); 00389 if (tg) { 00390 kdDebug(760)<<"KDockTabGroup found"<<endl; 00391 for (int i=0;i<tg->count();i++) 00392 list->append((KDockWidget*)static_cast<KDockWidget*>( 00393 tg->page(i))); 00394 } else 00395 list->append((KDockWidget*)widget); 00396 } else 00397 kdDebug(760)<<"setupToolViewsForIDEALMode: no widget found"<<endl; 00398 } else 00399 kdDebug(760)<<"No main dock widget found"<<endl; 00400 } 00401 00402 void MainWindow::setActiveToolDock(DockContainer* td) { 00403 if (td==d->activeDockPriority[0]) return; 00404 if (d->activeDockPriority[0]==0) { 00405 d->activeDockPriority[0]=td; 00406 // d->focusList=new KMdiFocusList(this); 00407 // if (m_pMdi) d->focusList->addWidgetTree(m_pMdi); 00408 // if (m_documentTabWidget) d->focusList->addWidgetTree(m_documentTabWidget); 00409 return; 00410 } 00411 for (int dst=3,src=2;src>=0;dst--,src--) { 00412 if (d->activeDockPriority[src]==td) src--; 00413 if (src<0) break; 00414 d->activeDockPriority[dst]=d->activeDockPriority[src]; 00415 } 00416 d->activeDockPriority[0]=td; 00417 } 00418 00419 void MainWindow::removeFromActiveDockList(DockContainer* td) { 00420 for (int i=0;i<4;i++) { 00421 if (d->activeDockPriority[i]==td) { 00422 for (;i<3;i++) 00423 d->activeDockPriority[i]=d->activeDockPriority[i+1]; 00424 d->activeDockPriority[3]=0; 00425 break; 00426 } 00427 } 00428 /* 00429 if (d->activeDockPriority[0]==0) { 00430 if (d->focusList) d->focusList->restore(); 00431 delete d->focusList; 00432 d->focusList=0; 00433 } 00434 */ 00435 } 00436 00437 void MainWindow::prevToolViewInDock() { 00438 DockContainer* td=d->activeDockPriority[0]; 00439 if (!td) return; 00440 td->prevToolView(); 00441 } 00442 00443 void MainWindow::nextToolViewInDock() { 00444 DockContainer* td=d->activeDockPriority[0]; 00445 if (!td) return; 00446 td->nextToolView(); 00447 } 00448 00449 } 00450 00451 // kate: space-indent on; indent-width 2; replace-tabs on;
KDE Logo
This file is part of the documentation for kmdi Library Version 3.4.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Apr 12 23:29:43 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003