• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdemdi/tdemdi
 

tdemdi/tdemdi

  • tdemdi
  • tdemdi
mainwindow.cpp
1 /* This file is part of the KDE libraries
2  Copyright (C) 2004 Christoph Cullmann <cullmann@kde.org>
3  Copyright (C) 2002,2003 Joseph Wenninger <jowenn@kde.org>
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Library General Public
7  License as published by the Free Software Foundation; either
8  version 2 of the License, or (at your option) any later version.
9 
10  This library is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Library General Public License for more details.
14 
15  You should have received a copy of the GNU Library General Public License
16  along with this library; see the file COPYING.LIB. If not, write to
17  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  Boston, MA 02110-1301, USA.
19 
20  Based on:
21 
22  //----------------------------------------------------------------------------
23  // Project : KDE MDI extension
24  //
25  // begin : 07/1999 by Szymon Stefanek as part of kvirc
26  // (an IRC application)
27  // changes : 09/1999 by Falk Brettschneider to create an
28  // - 06/2000 stand-alone Qt extension set of
29  // classes and a Qt-based library
30  // : 02/2000 by Massimo Morin (mmorin@schedsys.com)
31  // 2000-2003 maintained by the KDevelop project
32  // patches : -/2000 by Lars Beikirch (Lars.Beikirch@gmx.net)
33  // : 01/2003 by Jens Zurheide (jens.zurheide@gmx.de)
34  //
35  // copyright : (C) 1999-2003 by Falk Brettschneider
36  // and
37  // Szymon Stefanek (stefanek@tin.it)
38  // email : falkbr@kdevelop.org (Falk Brettschneider)
39  //----------------------------------------------------------------------------
40 */
41 
42 #include "config.h"
43 
44 #include "tabwidget.h"
45 
46 #include <assert.h>
47 
48 #include <tqcursor.h>
49 #include <tqclipboard.h>
50 #include <tqobjectlist.h>
51 #include <tqpopupmenu.h>
52 #include <tqmenubar.h>
53 
54 #include <tdemenubar.h>
55 #include <tdeapplication.h>
56 #include <kdebug.h>
57 #include <tqtabwidget.h>
58 #include <tdelocale.h>
59 
60 #include <kiconloader.h>
61 #include "dockcontainer.h"
62 #include "mainwindow.moc"
63 
64 
65 #include <tqtoolbutton.h>
66 #include <tqlayout.h>
67 #include <tqstring.h>
68 #include <tqmap.h>
69 #include <tqvaluelist.h>
70 
71 #include "mainwindow.h"
72 #include "dockcontainer.h"
73 #include "toolviewaccessor_p.h"
74 
75 #include "guiclient.h"
76 
77 namespace KMDIPrivate
78 {
79  class MainWindowPrivate {
80  public:
81  MainWindowPrivate() {
82  for (int i=0;i<4;i++) {
83  activeDockPriority[i]=0;
84  m_styleIDEAlMode = 0;
85  m_toolviewStyle = 0;
86  }
87  }
88  ~MainWindowPrivate() {}
89  KMDI::DockContainer* activeDockPriority[4];
90  int m_styleIDEAlMode;
91  int m_toolviewStyle;
92  };
93 }
94 
95 namespace KMDI
96 {
97 
98 //============ constructor ============//
99 MainWindow::MainWindow(TQWidget* parentWidget, const char* name)
100  : KParts::DockMainWindow( parentWidget, name)
101  , m_toolViews (new TQMap<TQWidget*,KMDI::ToolViewAccessor*>)
102  , d(new KMDIPrivate::MainWindowPrivate())
103 {
104  // setup main dock stuff
105  setupMainDock ();
106 
107  // setup the sidebar framework
108  setupToolViews ();
109 
110  // setup all menu entries
111  setupGUIClient ();
112 }
113 
114 //============ ~MainWindow ============//
115 MainWindow::~MainWindow()
116 {
117  delete m_toolViews;
118  m_toolViews=0;
119 
120  delete d;
121  d=0;
122 }
123 
124 void MainWindow::setupMainDock ()
125 {
126  // cover KMdi's childarea by a dockwidget
127  KDockWidget *dw = createDockWidget( "mdiAreaCover", TQPixmap(), 0L, "mdi_area_cover");
128  dw->setDockWindowTransient(this,true);
129  dw->setEnableDocking(KDockWidget::DockNone);
130  dw->setDockSite(KDockWidget::DockCorner);
131 
132  // setup tab widget
133  m_tabWidget = new KMDI::TabWidget (dw);
134  dw->setWidget(m_tabWidget);
135 
136  // set this dock to main view
137  setView(dw);
138  setMainDockWidget(dw);
139 
140  // connect signals to collapse sidebars
141  connect(m_tabWidget,TQ_SIGNAL(focusInEvent()),this,TQ_SIGNAL(collapseOverlapContainers()));
142 }
143 
144 void MainWindow::setupToolViews ()
145 {
146  m_leftContainer = createDockWidget("KMdiDock::leftDock",SmallIcon("misc"),0L,"Left Dock");
147  m_rightContainer = createDockWidget("KMdiDock::rightDock",SmallIcon("misc"),0L,"Right Dock");
148  m_topContainer = createDockWidget("KMdiDock::topDock",SmallIcon("misc"),0L,"Top Dock");
149  m_bottomContainer = createDockWidget("KMdiDock::bottomDock",SmallIcon("misc"),0L,"Bottom Dock");
150 
151  KDockWidget *mainDock=getMainDockWidget();
152  KDockWidget *w=mainDock;
153 
154  if (mainDock->parentDockTabGroup()) {
155  w=static_cast<KDockWidget*>(mainDock->parentDockTabGroup()->parent());
156  }
157 
158  TQPtrList<KDockWidget> leftReparentWidgets;
159  TQPtrList<KDockWidget> rightReparentWidgets;
160  TQPtrList<KDockWidget> bottomReparentWidgets;
161  TQPtrList<KDockWidget> topReparentWidgets;
162 
163  if (mainDock->parentDockTabGroup()) {
164  mainDock=static_cast<KDockWidget*>(mainDock->parentDockTabGroup()->parent());
165  }
166 
167  findToolViewsDockedToMain(&leftReparentWidgets,KDockWidget::DockLeft);
168  findToolViewsDockedToMain(&rightReparentWidgets,KDockWidget::DockRight);
169  findToolViewsDockedToMain(&bottomReparentWidgets,KDockWidget::DockBottom);
170  findToolViewsDockedToMain(&topReparentWidgets,KDockWidget::DockTop);
171 
172  mainDock->setEnableDocking(KDockWidget::DockNone); //::DockCorner);
173  mainDock->setDockSite(KDockWidget::DockCorner);
174 
175 
176  DockContainer *tmpDC;
177  m_leftContainer->setWidget(tmpDC=new DockContainer(m_leftContainer, this, KDockWidget::DockLeft, d->m_styleIDEAlMode));
178  m_leftContainer->setEnableDocking(KDockWidget::DockLeft);
179  m_leftContainer->manualDock(mainDock, KDockWidget::DockLeft,20);
180  tmpDC->init();
181 
182  connect (this,TQ_SIGNAL(toggleLeft()),tmpDC,TQ_SLOT(toggle()));
183  connect(this,TQ_SIGNAL(collapseOverlapContainers()),tmpDC,TQ_SLOT(collapseOverlapped()));
184  connect(tmpDC,TQ_SIGNAL(activated(DockContainer*)),this,TQ_SLOT(setActiveToolDock(DockContainer*)));
185  connect(tmpDC,TQ_SIGNAL(deactivated(DockContainer*)),this,TQ_SLOT(removeFromActiveDockList(DockContainer*)));
186 
187  m_rightContainer->setWidget(tmpDC=new DockContainer(m_rightContainer, this, KDockWidget::DockRight, d->m_styleIDEAlMode));
188  m_rightContainer->setEnableDocking(KDockWidget::DockRight);
189  m_rightContainer->manualDock(mainDock, KDockWidget::DockRight,80);
190  tmpDC->init();
191 
192  connect (this,TQ_SIGNAL(toggleRight()),tmpDC,TQ_SLOT(toggle()));
193  connect(this,TQ_SIGNAL(collapseOverlapContainers()),tmpDC,TQ_SLOT(collapseOverlapped()));
194  connect(tmpDC,TQ_SIGNAL(activated(DockContainer*)),this,TQ_SLOT(setActiveToolDock(DockContainer*)));
195  connect(tmpDC,TQ_SIGNAL(deactivated(DockContainer*)),this,TQ_SLOT(removeFromActiveDockList(DockContainer*)));
196 
197  m_topContainer->setWidget(tmpDC=new DockContainer(m_topContainer, this, KDockWidget::DockTop, d->m_styleIDEAlMode));
198  m_topContainer->setEnableDocking(KDockWidget::DockTop);
199  m_topContainer->manualDock(mainDock, KDockWidget::DockTop,20);
200  tmpDC->init();
201 
202  connect (this,TQ_SIGNAL(toggleTop()),tmpDC,TQ_SLOT(toggle()));
203  connect(this,TQ_SIGNAL(collapseOverlapContainers()),tmpDC,TQ_SLOT(collapseOverlapped()));
204  connect(tmpDC,TQ_SIGNAL(activated(DockContainer*)),this,TQ_SLOT(setActiveToolDock(DockContainer*)));
205  connect(tmpDC,TQ_SIGNAL(deactivated(DockContainer*)),this,TQ_SLOT(removeFromActiveDockList(DockContainer*)));
206 
207  m_bottomContainer->setWidget(tmpDC=new DockContainer(m_bottomContainer, this, KDockWidget::DockBottom, d->m_styleIDEAlMode));
208  m_bottomContainer->setEnableDocking(KDockWidget::DockBottom);
209  m_bottomContainer->manualDock(mainDock, KDockWidget::DockBottom,80);
210  tmpDC->init();
211 
212  connect (this,TQ_SIGNAL(toggleBottom()),tmpDC,TQ_SLOT(toggle()));
213  connect(this,TQ_SIGNAL(collapseOverlapContainers()),tmpDC,TQ_SLOT(collapseOverlapped()));
214  connect(tmpDC,TQ_SIGNAL(activated(DockContainer*)),this,TQ_SLOT(setActiveToolDock(DockContainer*)));
215  connect(tmpDC,TQ_SIGNAL(deactivated(DockContainer*)),this,TQ_SLOT(removeFromActiveDockList(DockContainer*)));
216 
217  m_leftContainer->setDockSite( KDockWidget::DockCenter );
218  m_rightContainer->setDockSite( KDockWidget::DockCenter );
219  m_topContainer->setDockSite( KDockWidget::DockCenter );
220  m_bottomContainer->setDockSite( KDockWidget::DockCenter );
221 
222  dockToolViewsIntoContainers(leftReparentWidgets,m_leftContainer);
223  dockToolViewsIntoContainers(rightReparentWidgets,m_rightContainer);
224  dockToolViewsIntoContainers(bottomReparentWidgets,m_bottomContainer);
225  dockToolViewsIntoContainers(topReparentWidgets,m_topContainer);
226 
227  dockManager->setSpecialLeftDockContainer(m_leftContainer);
228  dockManager->setSpecialRightDockContainer(m_rightContainer);
229  dockManager->setSpecialTopDockContainer(m_topContainer);
230  dockManager->setSpecialBottomDockContainer(m_bottomContainer);
231 
232  ((DockContainer*) (m_leftContainer->getWidget()))->hideIfNeeded();
233  ((DockContainer*) (m_rightContainer->getWidget()))->hideIfNeeded();
234  ((DockContainer*) (m_topContainer->getWidget()))->hideIfNeeded();
235  ((DockContainer*) (m_bottomContainer->getWidget()))->hideIfNeeded();
236 }
237 
238 void MainWindow::setupGUIClient ()
239 {
240  m_guiClient = new KMDIPrivate::GUIClient (this);
241 
242  connect(m_guiClient,TQ_SIGNAL(toggleTop()),this,TQ_SIGNAL(toggleTop()));
243  connect(m_guiClient,TQ_SIGNAL(toggleLeft()),this,TQ_SIGNAL(toggleLeft()));
244  connect(m_guiClient,TQ_SIGNAL(toggleRight()),this,TQ_SIGNAL(toggleRight()));
245  connect(m_guiClient,TQ_SIGNAL(toggleBottom()),this,TQ_SIGNAL(toggleBottom()));
246 }
247 
248 TabWidget *MainWindow::tabWidget ()
249 {
250  return m_tabWidget;
251 }
252 
253 ToolViewAccessor *MainWindow::createToolWindow()
254 {
255  return new KMDI::ToolViewAccessor(this);
256 }
257 
258 KMDI::ToolViewAccessor *MainWindow::addToolWindow( TQWidget* pWnd, KDockWidget::DockPosition pos, TQWidget* pTargetWnd, int percent, const TQString& tabToolTip, const TQString& tabCaption)
259 {
260  TQWidget *tvta=pWnd;
261  KDockWidget* pDW = dockManager->getDockWidgetFromName(pWnd->name());
262  if (pDW) {
263  // probably readDockConfig already created the widgetContainer, use that
264  pDW->setWidget(pWnd);
265 
266  if (pWnd->icon()) {
267  pDW->setPixmap(*pWnd->icon());
268  }
269  pDW->setTabPageLabel((tabCaption==0)?pWnd->caption():tabCaption);
270  pDW->setToolTipString(tabToolTip);
271  dockManager->removeFromAutoCreateList(pDW);
272  pWnd=pDW;
273  }
274 
275  TQRect r=pWnd->geometry();
276 
277  KMDI::ToolViewAccessor *mtva=new KMDI::ToolViewAccessor(this,pWnd,tabToolTip,(tabCaption==0)?pWnd->caption():tabCaption);
278  m_toolViews->insert(tvta,mtva);
279 
280  if (pos == KDockWidget::DockNone) {
281  mtva->d->widgetContainer->setEnableDocking(KDockWidget::DockNone);
282  mtva->d->widgetContainer->reparent(this, (WFlags)(WType_TopLevel | WType_Dialog), r.topLeft(), isVisible());
283  } else { // add (and dock) the toolview as DockWidget view
284  //const TQPixmap& wndIcon = pWnd->icon() ? *(pWnd->icon()) : TQPixmap();
285 
286  //KDockWidget *pCover=mtva->d->widgetContainer;
287 
288  mtva->place(pos, pTargetWnd,percent);
289  }
290 
291  return mtva;
292 }
293 
294 void MainWindow::deleteToolWindow( KMDI::ToolViewAccessor *accessor)
295 {
296  delete accessor;
297 }
298 
299 void MainWindow::deleteToolWindow( TQWidget* pWnd)
300 {
301  if (!pWnd)
302  return;
303 
304  if (m_toolViews->contains(pWnd)) {
305  deleteToolWindow((*m_toolViews)[pWnd]);
306  }
307 }
308 
309 void MainWindow::setToolViewStyle(int flag)
310 {
311  d->m_styleIDEAlMode = flag; // see KMultiTabBar for the first 3 bits
312 
313  DockContainer *tmpL=::tqt_cast<KMDI::DockContainer*>(m_leftContainer->getWidget());
314  if (tmpL) tmpL->setStyle(flag);
315 
316  DockContainer *tmpR=::tqt_cast<KMDI::DockContainer*>(m_rightContainer->getWidget());
317  if (tmpR) tmpR->setStyle(flag);
318 
319  DockContainer *tmpT=::tqt_cast<KMDI::DockContainer*>(m_topContainer->getWidget());
320  if (tmpT) tmpT->setStyle(flag);
321 
322  DockContainer *tmpB=::tqt_cast<KMDI::DockContainer*>(m_bottomContainer->getWidget());
323  if (tmpB) tmpB->setStyle(flag);
324 
325  d->m_toolviewStyle = flag;
326  bool toolviewExists = false;
327  TQMap<TQWidget*,KMDI::ToolViewAccessor*>::Iterator it;
328  for (it = m_toolViews->begin(); it != m_toolViews->end(); ++it) {
329  KDockWidget *dockWidget = dynamic_cast<KDockWidget*>(it.data()->wrapperWidget());
330  if (dockWidget) {
331  if (flag == KMDI::IconOnly)
332  {
333  dockWidget->setTabPageLabel(" ");
334  dockWidget->setPixmap(*(it.data()->wrappedWidget()->icon()));
335  } else
336  if (flag == KMDI::TextOnly)
337  {
338  dockWidget->setPixmap(); //FIXME: Does not hide the icon in the IDEAl mode.
339  dockWidget->setTabPageLabel(it.data()->wrappedWidget()->caption());
340  } else
341  if (flag == KMDI::TextAndIcon)
342  {
343  dockWidget->setPixmap(*(it.data()->wrappedWidget()->icon()));
344  dockWidget->setTabPageLabel(it.data()->wrappedWidget()->caption());
345  }
346  toolviewExists = true;
347  }
348  }
349  if (toolviewExists)
350  {
351  //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.
352  if (flag == KMDI::TextOnly)
353  {
354  /* MainWindow::switchToTabPageMode();
355  MainWindow::switchToIDEAlMode();*/ //TODO
356  } else
357  {
358  writeDockConfig();
359  readDockConfig();
360  }
361  }
362 }
363 
364 void MainWindow::dockToolViewsIntoContainers(TQPtrList<KDockWidget>& widgetsToReparent,KDockWidget *container) {
365  for ( KDockWidget *dw = widgetsToReparent.first(); dw;
366  dw=widgetsToReparent.next()){
367  dw->manualDock(container,KDockWidget::DockCenter,20);
368  dw->loseFormerBrotherDockWidget();
369  }
370 }
371 
372 void MainWindow::findToolViewsDockedToMain(TQPtrList<KDockWidget>* list,KDockWidget::DockPosition dprtmw) {
373  KDockWidget *mainDock=getMainDockWidget();
374  if (mainDock->parentDockTabGroup()) {
375  mainDock=dynamic_cast<KDockWidget*>(mainDock->parentDockTabGroup()->parent());
376  // FIXME: will likely crash below due to unchecked cast
377  }
378 
379  KDockWidget* widget=mainDock->findNearestDockWidget(dprtmw);
380  if (widget) {
381  if (widget->parentDockTabGroup()) {
382  widget=static_cast<KDockWidget*>(widget->parentDockTabGroup()->parent());
383  }
384 
385  if (widget) {
386  KDockTabGroup *tg=dynamic_cast<KDockTabGroup*>(widget->
387  getWidget());
388  if (tg) {
389  kdDebug(760)<<"KDockTabGroup found"<<endl;
390  for (int i=0;i<tg->count();i++)
391  list->append((KDockWidget*)static_cast<KDockWidget*>(
392  tg->page(i)));
393  } else
394  list->append((KDockWidget*)widget);
395  } else
396  kdDebug(760)<<"setupToolViewsForIDEALMode: no widget found"<<endl;
397  } else
398  kdDebug(760)<<"No main dock widget found"<<endl;
399 }
400 
401 void MainWindow::setActiveToolDock(DockContainer* td) {
402  if (td==d->activeDockPriority[0]) return;
403  if (d->activeDockPriority[0]==0) {
404  d->activeDockPriority[0]=td;
405  // d->focusList=new KMdiFocusList(this);
406  // if (m_pMdi) d->focusList->addWidgetTree(m_pMdi);
407  // if (m_documentTabWidget) d->focusList->addWidgetTree(m_documentTabWidget);
408  return;
409  }
410  for (int dst=3,src=2;src>=0;dst--,src--) {
411  if (d->activeDockPriority[src]==td) src--;
412  if (src<0) break;
413  d->activeDockPriority[dst]=d->activeDockPriority[src];
414  }
415  d->activeDockPriority[0]=td;
416 }
417 
418 void MainWindow::removeFromActiveDockList(DockContainer* td) {
419  for (int i=0;i<4;i++) {
420  if (d->activeDockPriority[i]==td) {
421  for (;i<3;i++)
422  d->activeDockPriority[i]=d->activeDockPriority[i+1];
423  d->activeDockPriority[3]=0;
424  break;
425  }
426  }
427  /*
428  if (d->activeDockPriority[0]==0) {
429  if (d->focusList) d->focusList->restore();
430  delete d->focusList;
431  d->focusList=0;
432  }
433  */
434 }
435 
436 void MainWindow::prevToolViewInDock() {
437  DockContainer* td=d->activeDockPriority[0];
438  if (!td) return;
439  td->prevToolView();
440 }
441 
442 void MainWindow::nextToolViewInDock() {
443  DockContainer* td=d->activeDockPriority[0];
444  if (!td) return;
445  td->nextToolView();
446 }
447 
448 }
KMDI
A namespace for the KMDI library.
Definition: dockcontainer.cpp:52
KMDI::TextAndIcon
@ TextAndIcon
Show both the icon and description on the toolview tabs.
Definition: global.h:65
KMDI::IconOnly
@ IconOnly
Show only icons on the toolview tabs.
Definition: global.h:61
KMDI::TextOnly
@ TextOnly
Show only the text description on the toolview tabs.
Definition: global.h:63

tdemdi/tdemdi

Skip menu "tdemdi/tdemdi"
  • Main Page
  • Namespace List
  • File List
  • Namespace Members

tdemdi/tdemdi

Skip menu "tdemdi/tdemdi"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdemdi/tdemdi by doxygen 1.9.1
This website is maintained by Timothy Pearson.