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
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
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 {
00285
00286
00287
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;
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();
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
00353
if (flag == KMDI::TextOnly)
00354 {
00355
00356
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
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
00407
00408
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
00430
00431
00432
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