kmdi/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   connect(this,SIGNAL(toggleTop()),m_topContainer->getWidget(),SLOT(toggle()));
00249   connect(this,SIGNAL(toggleLeft()),m_leftContainer->getWidget(),SLOT(toggle()));
00250   connect(this,SIGNAL(toggleRight()),m_rightContainer->getWidget(),SLOT(toggle()));
00251   connect(this,SIGNAL(toggleBottom()),m_bottomContainer->getWidget(),SLOT(toggle()));
00252 }
00253 
00254 TabWidget *MainWindow::tabWidget ()
00255 {
00256   return m_tabWidget;
00257 }
00258 
00259 ToolViewAccessor *MainWindow::createToolWindow()
00260 {
00261   return new KMDI::ToolViewAccessor(this);
00262 }
00263 
00264 KMDI::ToolViewAccessor *MainWindow::addToolWindow( QWidget* pWnd, KDockWidget::DockPosition pos, QWidget* pTargetWnd, int percent, const QString& tabToolTip, const QString& tabCaption)
00265 {
00266   QWidget *tvta=pWnd;
00267   KDockWidget* pDW = dockManager->getDockWidgetFromName(pWnd->name());
00268   if (pDW) {
00269     // probably readDockConfig already created the widgetContainer, use that
00270     pDW->setWidget(pWnd);
00271 
00272     if (pWnd->icon()) {
00273       pDW->setPixmap(*pWnd->icon());
00274     }
00275     pDW->setTabPageLabel((tabCaption==0)?pWnd->caption():tabCaption);
00276     pDW->setToolTipString(tabToolTip);
00277     dockManager->removeFromAutoCreateList(pDW);
00278     pWnd=pDW;
00279   }
00280 
00281   QRect r=pWnd->geometry();
00282 
00283   KMDI::ToolViewAccessor *mtva=new KMDI::ToolViewAccessor(this,pWnd,tabToolTip,(tabCaption==0)?pWnd->caption():tabCaption);
00284   m_toolViews->insert(tvta,mtva);
00285 
00286   if (pos == KDockWidget::DockNone) {
00287     mtva->d->widgetContainer->setEnableDocking(KDockWidget::DockNone);
00288     mtva->d->widgetContainer->reparent(this, Qt::WType_TopLevel | Qt::WType_Dialog, r.topLeft(), isVisible());
00289   } else {   // add (and dock) the toolview as DockWidget view
00290     //const QPixmap& wndIcon = pWnd->icon() ? *(pWnd->icon()) : QPixmap();
00291 
00292     //KDockWidget *pCover=mtva->d->widgetContainer;
00293 
00294     mtva->place(pos, pTargetWnd,percent);
00295   }
00296 
00297   return mtva;
00298 }
00299 
00300 void MainWindow::deleteToolWindow( KMDI::ToolViewAccessor *accessor)
00301 {
00302   delete accessor;
00303 }
00304 
00305 void MainWindow::deleteToolWindow( QWidget* pWnd)
00306 {
00307   if (!pWnd)
00308     return;
00309 
00310   if (m_toolViews->contains(pWnd)) {
00311     deleteToolWindow((*m_toolViews)[pWnd]);
00312   }
00313 }
00314 
00315 void MainWindow::setToolViewStyle(int flag)
00316 {
00317   d->m_styleIDEAlMode = flag; // see KMultiTabBar for the first 3 bits
00318 
00319   DockContainer *tmpL=(DockContainer*) (m_leftContainer->getWidget()->qt_cast("KMDI::DockContainer"));
00320   if (tmpL) tmpL->setStyle(flag);
00321 
00322   DockContainer *tmpR=(DockContainer*) (m_rightContainer->getWidget()->qt_cast("KMDI::DockContainer"));
00323   if (tmpR) tmpR->setStyle(flag);
00324 
00325   DockContainer *tmpT=(DockContainer*) (m_topContainer->getWidget()->qt_cast("KMDI::DockContainer"));
00326   if (tmpT) tmpT->setStyle(flag);
00327 
00328   DockContainer *tmpB=(DockContainer*) (m_bottomContainer->getWidget()->qt_cast("KMDI::DockContainer"));
00329   if (tmpB) tmpB->setStyle(flag);
00330 
00331   d->m_toolviewStyle = flag;
00332   bool toolviewExists = false;
00333   QMap<QWidget*,KMDI::ToolViewAccessor*>::Iterator it;
00334   for (it = m_toolViews->begin(); it != m_toolViews->end(); ++it) {
00335     KDockWidget *dockWidget = dynamic_cast<KDockWidget*>(it.data()->wrapperWidget());
00336     if (dockWidget) {
00337       if (flag == KMDI::IconOnly)
00338       {
00339         dockWidget->setTabPageLabel(" ");
00340         dockWidget->setPixmap(*(it.data()->wrappedWidget()->icon()));
00341       } else
00342       if (flag == KMDI::TextOnly)
00343       {
00344         dockWidget->setPixmap(); //FIXME: Does not hide the icon in the IDEAl mode.
00345         dockWidget->setTabPageLabel(it.data()->wrappedWidget()->caption());
00346       } else
00347       if (flag == KMDI::TextAndIcon)
00348       {
00349         dockWidget->setPixmap(*(it.data()->wrappedWidget()->icon()));
00350         dockWidget->setTabPageLabel(it.data()->wrappedWidget()->caption());
00351       }
00352       toolviewExists = true;
00353     }
00354   }
00355   if (toolviewExists)
00356   {
00357     //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.
00358     if (flag == KMDI::TextOnly)
00359     {
00360    /*   MainWindow::switchToTabPageMode();
00361       MainWindow::switchToIDEAlMode();*/ //TODO
00362     } else
00363     {
00364       writeDockConfig();
00365       readDockConfig();
00366     }
00367   }
00368 }
00369 
00370 void MainWindow::dockToolViewsIntoContainers(QPtrList<KDockWidget>& widgetsToReparent,KDockWidget *container) {
00371   for ( KDockWidget *dw = widgetsToReparent.first(); dw;
00372       dw=widgetsToReparent.next()){
00373     dw->manualDock(container,KDockWidget::DockCenter,20);
00374     dw->loseFormerBrotherDockWidget();
00375   }
00376 }
00377 
00378 void MainWindow::findToolViewsDockedToMain(QPtrList<KDockWidget>* list,KDockWidget::DockPosition dprtmw) {
00379   KDockWidget *mainDock=getMainDockWidget();
00380   if (mainDock->parentDockTabGroup()) {
00381     mainDock=dynamic_cast<KDockWidget*>(mainDock->parentDockTabGroup()->parent());
00382     // FIXME: will likely crash below due to unchecked cast
00383   }
00384 
00385   KDockWidget* widget=mainDock->findNearestDockWidget(dprtmw);
00386   if (widget) {
00387     if (widget->parentDockTabGroup()) {
00388       widget=static_cast<KDockWidget*>(widget->parentDockTabGroup()->parent());
00389     }
00390 
00391     if (widget) {
00392       KDockTabGroup *tg=dynamic_cast<KDockTabGroup*>(widget->
00393           getWidget());
00394       if (tg) {
00395         kdDebug(760)<<"KDockTabGroup found"<<endl;
00396         for (int i=0;i<tg->count();i++)
00397           list->append((KDockWidget*)static_cast<KDockWidget*>(
00398                 tg->page(i)));
00399       } else
00400         list->append((KDockWidget*)widget);
00401     } else
00402       kdDebug(760)<<"setupToolViewsForIDEALMode: no  widget found"<<endl;
00403   } else
00404     kdDebug(760)<<"No main dock widget found"<<endl;
00405 }
00406 
00407 void MainWindow::setActiveToolDock(DockContainer* td) {
00408   if (td==d->activeDockPriority[0]) return;
00409   if (d->activeDockPriority[0]==0) {
00410     d->activeDockPriority[0]=td;
00411     //        d->focusList=new KMdiFocusList(this);
00412     //        if (m_pMdi)  d->focusList->addWidgetTree(m_pMdi);
00413     //        if (m_documentTabWidget) d->focusList->addWidgetTree(m_documentTabWidget);
00414     return;
00415   }
00416   for (int dst=3,src=2;src>=0;dst--,src--) {
00417     if (d->activeDockPriority[src]==td) src--;
00418     if (src<0) break;
00419     d->activeDockPriority[dst]=d->activeDockPriority[src];
00420   }
00421   d->activeDockPriority[0]=td;
00422 }
00423 
00424 void MainWindow::removeFromActiveDockList(DockContainer* td) {
00425   for (int i=0;i<4;i++) {
00426     if (d->activeDockPriority[i]==td) {
00427       for (;i<3;i++)
00428         d->activeDockPriority[i]=d->activeDockPriority[i+1];
00429       d->activeDockPriority[3]=0;
00430       break;
00431     }
00432   }
00433   /*
00434         if (d->activeDockPriority[0]==0) {
00435         if (d->focusList) d->focusList->restore();
00436         delete d->focusList;
00437         d->focusList=0;
00438         }
00439    */
00440 }
00441 
00442 void MainWindow::prevToolViewInDock() {
00443   DockContainer* td=d->activeDockPriority[0];
00444   if (!td) return;
00445   td->prevToolView();
00446 }
00447 
00448 void MainWindow::nextToolViewInDock() {
00449   DockContainer* td=d->activeDockPriority[0];
00450   if (!td) return;
00451   td->nextToolView();
00452 }
00453 
00454 }
00455 
00456 // kate: space-indent on; indent-width 2; replace-tabs on;
KDE Logo
This file is part of the documentation for kmdi/kmdi Library Version 3.4.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Jul 21 13:15:06 2006 by doxygen 1.4.0 written by Dimitri van Heesch, © 1997-2003