00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
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
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
00106 setupMainDock ();
00107
00108
00109 setupToolViews ();
00110
00111
00112 setupGUIClient ();
00113 }
00114
00115
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
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
00134 m_tabWidget = new KMDI::TabWidget (dw);
00135 dw->setWidget(m_tabWidget);
00136
00137
00138 setView(dw);
00139 setMainDockWidget(dw);
00140
00141
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);
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
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 {
00290
00291
00292
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;
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();
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
00358 if (flag == KMDI::TextOnly)
00359 {
00360
00361
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
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
00412
00413
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
00435
00436
00437
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