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

tdemdi/tdemdi

  • tdemdi
  • tdemdi
dockcontainer.cpp
1 /* This file is part of the KDE project
2  Copyright (C) 2002, 2003 Joseph Wenninger <jowenn@kde.org>
3  Copyright (C) 2002, 2004 Christoph Cullmann <cullmann@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 version 2 as published by the Free Software Foundation.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Library General Public License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to
16  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  Boston, MA 02110-1301, USA.
18 */
19 
20 #include "mainwindow.h"
21 #include "dockcontainer.h"
22 
23 #include "dockcontainer.moc"
24 
25 #include "kdockwidget_private.h"
26 
27 #include <tqwidgetstack.h>
28 #include <tqlayout.h>
29 #include <tqtimer.h>
30 #include <tqtooltip.h>
31 #include <tdemultitabbar.h>
32 #include <tdeglobalsettings.h>
33 
34 #include <kdebug.h>
35 #include <kiconloader.h>
36 #include <tdeapplication.h>
37 #include <tdeconfig.h>
38 #include <tdelocale.h>
39 
40 //TODO: Well, this is already defined in tdeui/kdockwidget.cpp
41 static const char* const tdemdi_not_close_xpm[]={
42 "5 5 2 1",
43 "# c black",
44 ". c None",
45 "#####",
46 "#...#",
47 "#...#",
48 "#...#",
49 "#####"};
50 
51 namespace KMDI
52 {
53 
54 
55 DockContainer::DockContainer(TQWidget *parent, TQWidget *win, int position, int flags)
56 : TQWidget(parent),KDockContainer()
57 {
58  m_tabSwitching = false;
59  m_block=false;
60  m_inserted=-1;
61  m_mainWin = win;
62  oldtab=-1;
63  mTabCnt=0;
64  m_position = position;
65  m_previousTab=-1;
66  m_separatorPos = 18000;
67  m_movingState=NotMoving;
68  m_startEvent=0;
69  kdDebug(760)<<"DockContainer created"<<endl;
70 
71  TQBoxLayout *l;
72  m_vertical=!((position==KDockWidget::DockTop) || (position==KDockWidget::DockBottom));
73 
74  if (!m_vertical)
75  l=new TQVBoxLayout(this);
76  else
77  l=new TQHBoxLayout(this);
78 
79  l->setAutoAdd(false);
80 
81  m_tb=new KMultiTabBar(((position==KDockWidget::DockTop) || (position==KDockWidget::DockBottom))?
82  KMultiTabBar::Horizontal:KMultiTabBar::Vertical,this);
83 
84  m_tb->setStyle(KMultiTabBar::KMultiTabBarStyle(flags));
85  m_tb->showActiveTabTexts(true);
86 
87  m_tb->setPosition((position==KDockWidget::DockLeft)?KMultiTabBar::Left:
88  (position==KDockWidget::DockBottom)?KMultiTabBar::Bottom:
89  (position==KDockWidget::DockTop)?KMultiTabBar::Top:KMultiTabBar::Right);
90 
91  m_ws=new TQWidgetStack(this);
92 
93  m_ws->setSizePolicy(TQSizePolicy(TQSizePolicy::Expanding,TQSizePolicy::Expanding));
94 
95  if ( (position==KDockWidget::DockLeft) || (position==KDockWidget::DockTop))
96  {
97  l->add(m_tb);
98  l->add(m_ws);
99  }
100  else
101  {
102  l->add(m_ws);
103  l->add(m_tb);
104  }
105 
106  l->activate();
107  m_ws->hide();
108  m_tb->installEventFilter(this);
109 }
110 
111 void DockContainer::setStyle(int style) {
112  if (m_tb) m_tb->setStyle(KMultiTabBar::KMultiTabBarStyle(style));
113 }
114 
115 DockContainer::~DockContainer()
116 {
117  TQMap<KDockWidget*,int>::iterator it;
118  while (m_map.count()) {
119  it = m_map.begin();
120  KDockWidget *w=it.key();
121  if (m_overlapButtons.contains(w)) {
122  (::tqqt_cast<KDockWidgetHeader*>(w->getHeader()))->removeButton(m_overlapButtons[w]);
123  m_overlapButtons.remove(w);
124  }
125  m_map.remove(w);
126  w->undock();
127  }
128  deactivated(this);
129 }
130 
131 
132 void DockContainer::init()
133 {
134  bool overlap = isOverlapMode();
135  if (m_vertical)
136  {
137  parentDockWidget()->setForcedFixedWidth(m_tb->width());
138  activateOverlapMode(m_tb->width());
139  }
140  else
141  {
142  parentDockWidget()->setForcedFixedHeight(m_tb->height());
143  activateOverlapMode(m_tb->height());
144  }
145 
146  if (!overlap) deactivateOverlapMode();
147 
148  // try to restore splitter size
149  if ( parentDockWidget() && parentDockWidget()->parent() )
150  {
151  KDockSplitter *sp= ::tqqt_cast<KDockSplitter*>(parentDockWidget()->
152  parent());
153  if ( sp )
154  sp->setSeparatorPosX( m_separatorPos );
155  }
156 }
157 
158 KDockWidget *DockContainer::parentDockWidget()
159 {
160  return ((KDockWidget*)parent());
161 }
162 
163 void DockContainer::insertWidget (KDockWidget *dwdg, TQPixmap pixmap, const TQString &text, int &)
164 {
165  KDockWidget* w = (KDockWidget*) dwdg;
166  int tab;
167  bool alreadyThere=m_map.contains(w);
168 
169  if (alreadyThere)
170  {
171  tab=m_map[w];
172  if (m_ws->addWidget(w,tab)!=tab) kdDebug(760)<<"ERROR COULDN'T READD WIDGET************"<<endl;
173  kdDebug(760)<<"READDED WIDGET***********************************"<<endl;
174 /*JOWENN m_tb->setTab(tab,true);
175  tabClicked(tab);*/
176  }
177  else
178  {
179  tab=m_ws->addWidget(w);
180  m_map.insert(w,tab);
181  m_revMap.insert(tab,w);
182 
183 
184  if (((KDockWidget*)parentWidget())->mayBeShow())
185  ((KDockWidget*)parentWidget())->dockBack();
186 
187  if (::tqqt_cast<KDockWidgetHeader*>(w->getHeader()))
188  {
189  kdDebug(760)<<"*** KDockWidgetHeader has been found"<<endl;
190 
191  KDockWidgetHeader *hdr=::tqqt_cast<KDockWidgetHeader*>(w->getHeader());
192 
193  KDockButton_Private *btn = new KDockButton_Private( hdr, "OverlapButton" );
194 
195  TQToolTip::add( btn, i18n("Switch between overlap and side by side mode", "Overlap") );
196 
197  btn->setToggleButton( true );
198  btn->setPixmap( const_cast< const char** >(tdemdi_not_close_xpm) );
199  hdr->addButton(btn);
200  m_overlapButtons.insert(w,btn);
201  btn->setOn(!isOverlapMode());
202 
203  connect(btn,TQT_SIGNAL(clicked()),this,TQT_SLOT(changeOverlapMode()));
204  }
205 
206  m_tb->appendTab(pixmap.isNull()?SmallIcon("misc"):pixmap,tab,w->tabPageLabel());
207  m_tb->tab(tab)->installEventFilter( this );
208  kdDebug(760)<<"NAMENAMENAMENAME:===========================:"<<w->tabPageLabel()<<endl;
209 
210 //FB m_tb->setTab(tab,true);
211 
212  connect(m_tb->tab(tab),TQT_SIGNAL(clicked(int)),this,TQT_SLOT(tabClicked(int)));
213 
214  kdDebug(760)<<"DockContainer::insertWidget()"<<endl;
215 
216 //FB m_tb->setTab(oldtab,false);
217 
218  mTabCnt++;
219  m_inserted=tab;
220  int dummy=0;
221 //FB tabClicked(tab);
222  KDockContainer::insertWidget(w,pixmap,text,dummy);
223  itemNames.append(w->name());
224  tabCaptions.insert(w->name(),w->tabPageLabel());
225  tabTooltips.insert(w->name(),w->toolTipString());
226 
227 
228  }
229 
230 //FB m_ws->raiseWidget(tab);
231 }
232 
233 
234 bool DockContainer::eventFilter( TQObject *obj, TQEvent *event )
235 {
236  if (TQT_BASE_OBJECT(obj)==TQT_BASE_OBJECT(m_tb)) {
237  if ( (event->type()==TQEvent::Resize) && (m_ws->isHidden()) ) {
238  TQSize size=((TQResizeEvent*)event)->size();
239  if (m_vertical)
240  parentDockWidget()->setForcedFixedWidth(size.width());
241  else
242  parentDockWidget()->setForcedFixedHeight(size.height());
243  }
244  }
245  else
246  switch ( event->type() ){
247  case TQEvent::MouseButtonPress:
248  {
249  KDockWidget * w=m_revMap[tqt_dynamic_cast<KMultiTabBarTab*>(obj)->id()];
250  if (!w) {
251  kdDebug()<<"NoWidget"<<endl;
252  break;
253  }
254  if (!w->getHeader()) {
255  kdDebug()<<"NO HEADER"<<endl;
256  break;
257  }
258  KDockWidgetHeader *hdr=::tqqt_cast<KDockWidgetHeader*>(w->getHeader());
259  if (!hdr) {
260  kdDebug()<<"Wrong header type in DockContainer::eventFilter"<<endl;
261  break;
262  }
263  m_dockManager=w->dockManager();
264  m_dragPanel=TQT_TQOBJECT(hdr->dragPanel());
265  if (m_dragPanel) m_movingState=WaitingForMoveStart;
266  delete m_startEvent;
267  m_startEvent=new TQMouseEvent(* ((TQMouseEvent*)event));
268  }
269  break;
270  case TQEvent::MouseButtonRelease:
271  if (m_movingState==Moving) {
272  m_movingState=NotMoving;
273  TQApplication::postEvent(m_dragPanel,new TQMouseEvent(* ( (TQMouseEvent*)event)));
274  delete m_startEvent;
275  m_startEvent=0;
276  }
277  break;
278  case TQEvent::MouseMove:
279  if (m_movingState==WaitingForMoveStart) {
280  TQPoint p( ((TQMouseEvent*)event)->pos() - m_startEvent->pos() );
281  if( p.manhattanLength() > TDEGlobalSettings::dndEventDelay()) {
282  m_dockManager->eventFilter(m_dragPanel,TQT_TQEVENT(m_startEvent));
283  m_dockManager->eventFilter(m_dragPanel,event);
284  m_movingState=Moving;
285  }
286  } else if (m_movingState==Moving) {
287  m_dockManager->eventFilter(m_dragPanel,event);
288  }
289  break;
290  default:
291  break;
292 
293  }
294  return false;
295 
296 }
297 
298 void DockContainer::showWidget(KDockWidget *w) {
299  if (!m_map.contains(w)) return;
300 
301  kdDebug()<<"KMDI::DockContainer::<showWidget"<<endl;
302  int id=m_map[w];
303  m_tb->setTab(id,true);
304  tabClicked(id);
305 
306 }
307 
308 void DockContainer::changeOverlapMode()
309 {
310  const KDockButton_Private *btn=tqt_dynamic_cast<const KDockButton_Private*>(sender());
311 
312  kdDebug(760)<<"DockContainer::changeOverlapMode: button=="<<btn<<endl;
313 
314  if (!btn) return;
315 
316  if (!btn->isOn()) {
317  kdDebug(760)<<"DockContainer::changeOverlapMode: activateOverlapMode"<<endl;
318  if (m_vertical) {
319  activateOverlapMode(m_tb->width());
320  }
321  else
322  {
323  activateOverlapMode(m_tb->height());
324  }
325  } else {
326  kdDebug(760)<<"DockContainer::changeOverlapMode: deactivateOverlapMode"<<endl;
327  deactivateOverlapMode();
328  }
329 
330  for (TQMap<KDockWidget*,KDockButton_Private*>::iterator it=m_overlapButtons.begin();
331  it!=m_overlapButtons.end();++it)
332  it.data()->setOn(!isOverlapMode());
333 }
334 
335 void DockContainer::hideIfNeeded() {
336  kdDebug(760)<<"************************* hideIfNeeded *************************"<<endl;
337  if (!itemNames.count())
338  ((KDockWidget*)parentWidget())->undock();
339 }
340 
341 void DockContainer::removeWidget(KDockWidget* dwdg)
342 {
343  KDockWidget* w = (KDockWidget*) dwdg;
344  if (!m_map.contains(w)) return;
345  int id=m_map[w];
346  if (m_tb->isTabRaised(id)) {
347  //why do we hide the tab if we're just going
348  //to remove it? - mattr 2004-10-26
349  m_tb->setTab(id,false);
350  m_tabSwitching = false;
351  tabClicked(id);
352  }
353  m_tb->removeTab(id);
354  m_ws->removeWidget(w);
355  m_map.remove(w);
356  m_revMap.remove(id);
357  if (m_overlapButtons.contains(w)) {
358  (::tqqt_cast<KDockWidgetHeader*>(w->getHeader()))->removeButton(m_overlapButtons[w]);
359  m_overlapButtons.remove(w);
360  }
361  KDockContainer::removeWidget(w);
362  itemNames.remove(w->name());
363  tabCaptions.remove(w->name());
364  tabTooltips.remove(w->name());
365  if (!itemNames.count())
366  ((KDockWidget*)parentWidget())->undock();
367 }
368 
369 void DockContainer::undockWidget(KDockWidget *dwdg)
370 {
371  KDockWidget* w = (KDockWidget*) dwdg;
372 
373  if (!m_map.contains(w))
374  return;
375 
376  int id=m_map[w];
377  if (m_tb->isTabRaised(id)) {
378  kdDebug(760)<<"Wiget has been undocked, setting tab down"<<endl;
379  m_tb->setTab(id,false);
380  tabClicked(id);
381  }
382 }
383 
384 void DockContainer::tabClicked(int t)
385 {
386  kdDebug(760)<<"DockContainer::tabClicked()"<<endl;
387  bool call_makeVisible=!m_tabSwitching;
388  m_tabSwitching=true;
389  if ((t!=-1) && m_tb->isTabRaised(t))
390  {
391  if (m_ws->isHidden())
392  {
393  m_ws->show ();
394  parentDockWidget()->restoreFromForcedFixedSize();
395  }
396  if (!m_ws->widget(t))
397  {
398  m_revMap[t]->manualDock(parentDockWidget(),KDockWidget::DockCenter,20);
399  if (call_makeVisible) m_revMap[t]->makeDockVisible();//manualDock(parentDockWidget(),KDockWidget::DockCenter,20);
400  m_tabSwitching=false;
401  emit activated(this);
402  return;
403  }
404  m_ws->raiseWidget(t);
405  if (m_ws->widget(t)) {
406  KDockWidget *tmpDw=::tqqt_cast<KDockWidget*>(m_ws->widget(t));
407  if (tmpDw) {
408  if (tmpDw->getWidget()) tmpDw->getWidget()->setFocus();
409  } else kdDebug(760)<<"Something really weird is going on"<<endl;
410  } else
411  kdDebug(760)<<"DockContainer::tabClicked(int): m_ws->widget(t)==0 "<<endl;
412 
413  if (oldtab!=t) m_tb->setTab(oldtab,false);
414  m_tabSwitching=true;
415  oldtab=t;
416  emit activated(this);
417  }
418  else
419  {
420  // try save splitter position
421  if ( parentDockWidget() && parentDockWidget()->parent() )
422  {
423  KDockSplitter *sp= ::tqqt_cast<KDockSplitter*>(parentDockWidget()->
424  parent());
425  if ( sp )
426  m_separatorPos = sp->separatorPos();
427  }
428  m_previousTab=t;
429 // oldtab=-1;
430  if (m_block) return;
431  emit deactivated(this);
432  m_block=true;
433  if (m_ws->widget(t))
434  {
435 // ((KDockWidget*)m_ws->widget(t))->undock();
436  }
437  m_block=false;
438  m_ws->hide ();
439 
440 
441  kdDebug(760)<<"Fixed Width:"<<m_tb->width()<<endl;
442  if (m_vertical)
443  parentDockWidget()->setForcedFixedWidth(m_tb->width()); // strange why it worked before at all
444  else
445  parentDockWidget()->setForcedFixedHeight(m_tb->height()); // strange why it worked before at all
446  }
447  m_tabSwitching=false;
448 }
449 
450 void DockContainer::setToolTip (KDockWidget *, TQString &s)
451 {
452  kdDebug(760)<<"***********************************Setting tooltip for a widget: "<<s<<endl;
453 }
454 
455 void DockContainer::setPixmap(KDockWidget* widget ,const TQPixmap& pixmap)
456 {
457  int id=m_ws->id(widget);
458  if (id==-1) return;
459  KMultiTabBarTab *tab=m_tb->tab(id);
460  tab->setIcon(pixmap.isNull()?SmallIcon("misc"):pixmap);
461 }
462 
463 void DockContainer::save(TDEConfig* cfg,const TQString& group_or_prefix)
464 {
465  // group name
466  TQString grp=cfg->group();
467  cfg->deleteGroup(group_or_prefix+TQString("::%1").arg(parent()->name()));
468  cfg->setGroup(group_or_prefix+TQString("::%1").arg(parent()->name()));
469 
470  // save overlap mode
471  cfg->writeEntry("overlapMode",isOverlapMode());
472 
473  // try to save the splitter position
474  if ( parentDockWidget() && parentDockWidget()->parent() )
475  {
476  KDockSplitter *sp= ::tqqt_cast<KDockSplitter*>(parentDockWidget()->
477  parent());
478  if ( sp )
479  cfg->writeEntry( "separatorPosition", m_separatorPos );
480  }
481 
482  TQPtrList<KMultiTabBarTab>* tl=m_tb->tabs();
483  TQPtrListIterator<KMultiTabBarTab> it(*tl);
484  TQStringList::Iterator it2=itemNames.begin();
485  int i=0;
486  for (;it.current()!=0;++it,++it2)
487  {
488 // cfg->writeEntry(TQString("widget%1").arg(i),m_ws->widget(it.current()->id())->name());
489  cfg->writeEntry(TQString("widget%1").arg(i),(*it2));
490  TQString s=tabCaptions[*it2];
491  if (!s.isEmpty()) {
492  cfg->writeEntry(TQString("widget%1-tabCaption").arg(i),s);
493  }
494  s=tabTooltips[*it2];
495  if (!s.isEmpty()) {
496  cfg->writeEntry(TQString("widget%1-tabTooltip").arg(i),s);
497  }
498 // kdDebug(760)<<"****************************************Saving: "<<m_ws->widget(it.current()->id())->name()<<endl;
499  if (m_tb->isTabRaised(it.current()->id()))
500  cfg->writeEntry(m_ws->widget(it.current()->id())->name(),true);
501  ++i;
502  }
503 
504  cfg->setGroup(grp);
505 }
506 
507 void DockContainer::load(TDEConfig* cfg,const TQString& group_or_prefix)
508 {
509  TQString grp=cfg->group();
510  cfg->setGroup(group_or_prefix+TQString("::%1").arg(parent()->name()));
511 
512  if (cfg->readBoolEntry("overlapMode"))
513  activateOverlapMode( m_vertical?m_tb->width():m_tb->height() );
514  else
515  deactivateOverlapMode();
516 
517  m_separatorPos = cfg->readNumEntry( "separatorPosition", 18000 ); // = 18%
518 
519  int i=0;
520  TQString raise;
521  while (true)
522  {
523  TQString dwn=cfg->readEntry(TQString("widget%1").arg(i));
524  if (dwn.isEmpty()) break;
525  kdDebug(760)<<"*************************************************************Configuring dockwidget :"<<dwn<<endl;
526  KDockWidget *dw=((KDockWidget*)parent())->dockManager()->getDockWidgetFromName(dwn);
527  if (dw)
528  {
529  TQString s=cfg->readEntry(TQString("widget%1-tabCaption").arg(i));
530  if (!s.isEmpty()) {
531  dw->setTabPageLabel(s);
532  }
533  s=cfg->readEntry(TQString("widget%1-tabTooltip").arg(i));
534  if (!s.isEmpty()) {
535  dw->setToolTipString(s);
536  }
537  dw->manualDock((KDockWidget*)parent(),KDockWidget::DockCenter);
538  }
539  if (cfg->readBoolEntry(dwn,false)) raise=dwn;
540  i++;
541 
542  }
543 
544  TQPtrList<KMultiTabBarTab>* tl=m_tb->tabs();
545  TQPtrListIterator<KMultiTabBarTab> it1(*tl);
546  m_ws->hide();
547  if (m_vertical)
548  parentDockWidget()->setForcedFixedWidth(m_tb->width());
549  else
550  parentDockWidget()->setForcedFixedHeight(m_tb->height());
551  for (;it1.current()!=0;++it1)
552  {
553  m_tb->setTab(it1.current()->id(),false);
554  }
555  kapp->syncX();
556  m_delayedRaise=-1;
557 
558  for (TQMap<KDockWidget*,KDockButton_Private*>::iterator it=m_overlapButtons.begin();
559  it!=m_overlapButtons.end();++it)
560  it.data()->setOn(!isOverlapMode());
561 
562  if (!raise.isEmpty())
563  {
564  for (TQMap<KDockWidget*,int>::iterator it=m_map.begin();it!=m_map.end();++it)
565  {
566  if (it.key()->name()==raise)
567  {
568 /* tabClicked(it.data());
569  m_tb->setTab(it.data(),true);
570  tabClicked(it.data());
571  m_ws->raiseWidget(it.key());
572  kapp->sendPostedEvents();
573  kapp->syncX();*/
574 
575  m_delayedRaise=it.data();
576  TQTimer::singleShot(0,this,TQT_SLOT(delayedRaise()));
577  kdDebug(760)<<"************** raising *******: "<<it.key()->name()<<endl;
578  break;
579  }
580  }
581 
582  }
583  if (m_delayedRaise==-1) TQTimer::singleShot(0,this,TQT_SLOT(init()));
584  cfg->setGroup(grp);
585 
586 }
587 
588 void DockContainer::delayedRaise()
589 {
590  m_tb->setTab(m_delayedRaise,true);
591  tabClicked(m_delayedRaise);
592 }
593 
594 void DockContainer::collapseOverlapped()
595 {
596  if (m_tabSwitching) return;
597  if (isOverlapMode()){
598  TQPtrList<KMultiTabBarTab>* tl=m_tb->tabs();
599  TQPtrListIterator<KMultiTabBarTab> it(*tl);
600  for(;it.current();++it) {
601  if (it.current()->isOn()) {
602  kdDebug(760)<<"Lowering TAB"<<endl;
603  it.current()->setState(false);
604  tabClicked(it.current()->id());
605  }
606  }
607  }
608 }
609 
610 void DockContainer::toggle() {
611  kdDebug(760)<<"DockContainer:activate"<<endl;
612  if (m_tb->isTabRaised(oldtab)) {
613  m_tb->setTab(oldtab,false);
614  tabClicked(oldtab);
615  // KMDI::MainWindow *mainFrm = tqt_dynamic_cast<KMDI::MainWindow*>(m_mainWin);
616  // if (mainFrm && mainFrm->activeWindow() ) // TODO
617  // mainFrm->activeWindow()->setFocus();
618 
619  } else {
620  kdDebug(760)<<"DockContainer::toggle(): raising tab"<<endl;
621  if (m_tb->tab(m_previousTab)==0) {
622  if (m_tb->tabs()->count()==0) return;
623  m_previousTab=m_tb->tabs()->getFirst()->id();
624  }
625  m_tb->setTab(m_previousTab,true);
626  tabClicked(m_previousTab);
627  }
628 }
629 
630 void DockContainer::prevToolView() {
631  TQPtrList<KMultiTabBarTab>* tabs=m_tb->tabs();
632  int pos=tabs->findRef(m_tb->tab(oldtab));
633  if (pos==-1) return;
634  pos--;
635  if (pos<0) pos=tabs->count()-1;
636  KMultiTabBarTab *tab=tabs->at(pos);
637  if (!tab) return; //can never happen here, but who knows
638  m_tb->setTab(tab->id(),true);
639  tabClicked(tab->id());
640 }
641 
642 void DockContainer::nextToolView() {
643  TQPtrList<KMultiTabBarTab>* tabs=m_tb->tabs();
644  int pos=tabs->findRef(m_tb->tab(oldtab));
645  if (pos==-1) return;
646  pos++;
647  if (pos>=(int)tabs->count()) pos=0;
648  KMultiTabBarTab *tab=tabs->at(pos);
649  if (!tab) return; //can never happen here, but who knows
650  m_tb->setTab(tab->id(),true);
651  tabClicked(tab->id());
652 }
653 
654 }
KMDI
A namespace for the KMDI library.
Definition: dockcontainer.cpp:51

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
  •     tdecore
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  • tdeioslave
  •   http
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdemdi/tdemdi by doxygen 1.8.8
This website is maintained by Timothy Pearson.