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

tdemdi

  • tdemdi
tdemdidockcontainer.cpp
1 /* This file is part of the KDE project
2  Copyright (C) 2002 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 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 "tdemdimainfrm.h"
21 #include "tdemdidockcontainer.h"
22 #include "tdemdidockcontainer.moc"
23 
24 #include "kdockwidget_private.h"
25 
26 #include <tqwidgetstack.h>
27 #include <tqlayout.h>
28 #include <tqtimer.h>
29 #include <tqtooltip.h>
30 #include <tdemultitabbar.h>
31 #include <tdeglobalsettings.h>
32 
33 #include <kdebug.h>
34 #include <kiconloader.h>
35 #include <tdeapplication.h>
36 #include <tdeconfig.h>
37 #include <tdelocale.h>
38 
39 //TODO: Well, this is already defined in tdeui/kdockwidget.cpp
40 static const char* const tdemdi_not_close_xpm[] =
41  {
42  "5 5 2 1",
43  "# c black",
44  ". c None",
45  "#####",
46  "#...#",
47  "#...#",
48  "#...#",
49  "#####"
50  };
51 
52 KMdiDockContainer::KMdiDockContainer( TQWidget *parent, TQWidget *win, int position, int flags )
53  : TQWidget( parent ), KDockContainer()
54 {
55  m_tabSwitching = false;
56  m_block = false;
57  m_inserted = -1;
58  m_mainWin = win;
59  oldtab = -1;
60  mTabCnt = 0;
61  m_position = position;
62  m_previousTab = -1;
63  m_separatorPos = 18000;
64  m_movingState = NotMoving;
65  m_startEvent = 0;
66  kdDebug( 760 ) << k_funcinfo << endl;
67 
68  TQBoxLayout *l;
69  m_horizontal = ( ( position == KDockWidget::DockTop ) || ( position == KDockWidget::DockBottom ) );
70 
71 
72  if ( m_horizontal )
73  l = new TQVBoxLayout( this ); //vertical layout for top and bottom docks
74  else
75  l = new TQHBoxLayout( this ); //horizontal layout for left and right docks
76 
77  l->setAutoAdd( false );
78 
79  m_tb = new KMultiTabBar( m_horizontal ? KMultiTabBar::Horizontal : KMultiTabBar::Vertical, this );
80 
81  m_tb->setStyle( KMultiTabBar::KMultiTabBarStyle( flags ) );
82  m_tb->showActiveTabTexts( true );
83 
84  KMultiTabBar::KMultiTabBarPosition kmtbPos;
85  switch( position )
86  {
87  case KDockWidget::DockLeft:
88  kmtbPos = KMultiTabBar::Left;
89  break;
90  case KDockWidget::DockRight:
91  kmtbPos = KMultiTabBar::Right;
92  break;
93  case KDockWidget::DockTop:
94  kmtbPos = KMultiTabBar::Top;
95  break;
96  case KDockWidget::DockBottom:
97  kmtbPos = KMultiTabBar::Bottom;
98  break;
99  default:
100  kmtbPos = KMultiTabBar::Right;
101  break;
102  }
103  m_tb->setPosition( kmtbPos );
104 
105  m_ws = new TQWidgetStack( this );
106 
107  m_ws->setSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Expanding ) );
108 
109  //layout the tabbar
110  if ( position == KDockWidget::DockLeft || position == KDockWidget::DockTop )
111  {
112  //add the tabbar then the widget stack
113  l->add( m_tb );
114  l->add( m_ws );
115  }
116  else
117  {
118  //add the widget stack then the tabbar
119  l->add( m_ws );
120  l->add( m_tb );
121  }
122 
123  l->activate();
124  m_ws->hide();
125 
126 }
127 
128 void KMdiDockContainer::setStyle( int style )
129 {
130  if ( m_tb )
131  m_tb->setStyle( KMultiTabBar::KMultiTabBarStyle( style ) );
132 }
133 
134 KMdiDockContainer::~KMdiDockContainer()
135 {
136  TQMap<KDockWidget*, int>::iterator it;
137  while ( m_map.count() )
138  {
139  it = m_map.begin();
140  KDockWidget *w = it.key();
141  if ( m_overlapButtons.contains( w ) )
142  {
143  ( ::tqt_cast<KDockWidgetHeader*>( w->getHeader() ) )->removeButton( m_overlapButtons[w] );
144  m_overlapButtons.remove( w );
145  }
146  m_map.remove( w );
147  w->undock();
148  }
149  deactivated( this );
150 }
151 
152 
153 void KMdiDockContainer::init()
154 {
155  bool overlap = isOverlapMode();
156  kdDebug( 760 ) << k_funcinfo << endl;
157  if ( !m_horizontal )
158  {
159  kdDebug( 760 ) << k_funcinfo << "Horizontal tabbar. Setting forced fixed width." << endl;
160  parentDockWidget()->setForcedFixedWidth( m_tb->width() );
161  activateOverlapMode( m_tb->width() );
162  }
163  else
164  {
165  kdDebug( 760 ) << k_funcinfo << "Vertical tabbar. Setting forced fixed height." << endl;
166  parentDockWidget()->setForcedFixedHeight( m_tb->height() );
167  activateOverlapMode( m_tb->height() );
168  }
169 
170  if (!overlap) deactivateOverlapMode();
171 
172  // try to restore splitter size
173  if ( parentDockWidget() && parentDockWidget()->parent() )
174  {
175  KDockSplitter * sp = ::tqt_cast<KDockSplitter*>( parentDockWidget()->parent() );
176  if ( sp )
177  sp->setSeparatorPosX( m_separatorPos );
178  }
179 }
180 
181 KDockWidget* KMdiDockContainer::parentDockWidget()
182 {
183  return ( ( KDockWidget* ) parent() );
184 }
185 
186 void KMdiDockContainer::insertWidget ( KDockWidget *dwdg, TQPixmap pixmap, const TQString &text, int & )
187 {
188  kdDebug( 760 ) << k_funcinfo << "Adding a dockwidget to the dock container" << endl;
189  KDockWidget* w = dwdg;
190  int tab;
191  bool alreadyThere = m_map.contains( w );
192 
193  if ( alreadyThere )
194  {
195  tab = m_map[ w ];
196  if ( m_ws->addWidget( w, tab ) != tab )
197  kdDebug( 760 ) << "ERROR COULDN'T READD WIDGET" << endl;
198 
199  kdDebug( 760 ) << k_funcinfo << "Readded widget " << dwdg << endl;
200  }
201  else
202  {
203  tab = m_ws->addWidget( w );
204  m_map.insert( w, tab );
205  m_revMap.insert( tab, w );
206 
207  if ( ( ( KDockWidget* ) parentWidget() ) ->mayBeShow() )
208  ( ( KDockWidget* ) parentWidget() ) ->dockBack();
209 
210  if ( ::tqt_cast<KDockWidgetHeader*>(w->getHeader()) )
211  {
212  kdDebug( 760 ) << k_funcinfo << "The dockwidget we're adding has a header" << endl;
213  kdDebug( 760 ) << k_funcinfo << "Adding our overlap mode button to it" << endl;
214 
215  KDockWidgetHeader *hdr = ::tqt_cast<KDockWidgetHeader*>( w->getHeader() );
216  KDockButton_Private *btn = new KDockButton_Private( hdr, "OverlapButton" );
217 
218  TQToolTip::add( btn, i18n( "Switch between overlap and side by side mode", "Overlap" ) );
219 
220  btn->setToggleButton( true );
221  btn->setPixmap( const_cast< const char** >( tdemdi_not_close_xpm ) );
222  hdr->addButton( btn );
223  m_overlapButtons.insert( w, btn );
224  btn->setOn( !isOverlapMode() );
225 
226  connect( btn, TQ_SIGNAL( clicked() ), this, TQ_SLOT( changeOverlapMode() ) );
227  }
228 
229  m_tb->appendTab( pixmap.isNull() ? SmallIcon( "misc" ) : pixmap, tab, w->tabPageLabel() );
230  m_tb->tab( tab )->installEventFilter( this );
231  kdDebug( 760 ) << k_funcinfo << "Added tab with label " << w->tabPageLabel() <<
232  " to the tabbar" << endl;
233 
234  connect( m_tb->tab( tab ), TQ_SIGNAL( clicked( int ) ), this, TQ_SLOT( tabClicked( int ) ) );
235 
236  mTabCnt++;
237  m_inserted = tab;
238  int dummy = 0;
239  KDockContainer::insertWidget( w, pixmap, text, dummy );
240  itemNames.append( w->name() );
241  tabCaptions.insert( w->name(), w->tabPageLabel() );
242  tabTooltips.insert( w->name(), w->toolTipString() );
243  }
244 
245  //FB m_ws->raiseWidget(tab);
246 }
247 
248 
249 bool KMdiDockContainer::eventFilter( TQObject *obj, TQEvent *event )
250 {
251  switch ( event->type() )
252  {
253  case TQEvent::MouseButtonPress:
254  {
255  KMultiTabBarTab* kmtbTab = dynamic_cast<KMultiTabBarTab*>( obj );
256  if ( !kmtbTab )
257  {
258  kdDebug(760) << k_funcinfo << "Got a mouse button press but we have no tab" << endl;
259  break;
260  }
261 
262  KDockWidget* w = m_revMap[ kmtbTab->id() ];
263  if ( !w )
264  {
265  kdDebug(760) << k_funcinfo << "Got a mouse button press but we have no widget" << endl;
266  break;
267  }
268 
269  if ( !w->getHeader() )
270  {
271  kdDebug(760) << k_funcinfo << "Got a mouse button press but we have no header" << endl;
272  break;
273  }
274 
275  KDockWidgetHeader *hdr = ::tqt_cast<KDockWidgetHeader*>( w->getHeader() );
276  if ( !hdr )
277  {
278  kdDebug(760) << "Wrong header type in KMdiDockContainer::eventFilter" << endl;
279  break;
280  }
281 
282  m_dockManager = w->dockManager();
283  m_dragPanel = hdr->dragPanel();
284 
285  if ( m_dragPanel )
286  m_movingState = WaitingForMoveStart;
287 
288  delete m_startEvent;
289  m_startEvent = new TQMouseEvent( * ( ( TQMouseEvent* ) event ) );
290  }
291  break;
292  case TQEvent::MouseButtonRelease:
293  if ( m_movingState == Moving )
294  {
295  m_movingState = NotMoving;
296  TQApplication::postEvent( m_dragPanel, new TQMouseEvent( * ( ( TQMouseEvent* ) event ) ) );
297  delete m_startEvent;
298  m_startEvent = 0;
299  }
300  case TQEvent::MouseMove:
301  if ( m_movingState == WaitingForMoveStart )
302  {
303  TQPoint p( ( ( TQMouseEvent* ) event )->pos() - m_startEvent->pos() );
304  if ( p.manhattanLength() > TDEGlobalSettings::dndEventDelay() )
305  {
306  m_dockManager->eventFilter( m_dragPanel, static_cast<TQEvent*>(m_startEvent) );
307  m_dockManager->eventFilter( m_dragPanel, event );
308  m_movingState = Moving;
309  }
310  }
311  else if ( m_movingState == Moving )
312  m_dockManager->eventFilter( m_dragPanel, event );
313 
314  break;
315  default:
316  break;
317 
318  }
319  return false;
320 
321 }
322 
323 void KMdiDockContainer::showWidget( KDockWidget *w )
324 {
325  if ( !m_map.contains( w ) )
326  return ;
327 
328  int id = m_map[ w ];
329  m_tb->setTab( id, true );
330  tabClicked( id );
331 }
332 
333 void KMdiDockContainer::changeOverlapMode()
334 {
335  const KDockButton_Private * btn = dynamic_cast<const KDockButton_Private*>( sender() );
336 
337  if ( !btn )
338  return ;
339 
340  if ( !btn->isOn() )
341  {
342  kdDebug( 760 ) << k_funcinfo << "Activating overlap mode" << endl;
343  if ( !m_horizontal )
344  activateOverlapMode( m_tb->width() );
345  else
346  activateOverlapMode( m_tb->height() );
347 
348  }
349  else
350  {
351  kdDebug( 760 ) << k_funcinfo << "Deactivating overlap mode" << endl;
352  deactivateOverlapMode();
353  }
354 
355  TQMap<KDockWidget*, KDockButton_Private*>::iterator it;
356  for ( it = m_overlapButtons.begin(); it != m_overlapButtons.end(); ++it )
357  it.data()->setOn( !isOverlapMode() );
358 }
359 
360 void KMdiDockContainer::hideIfNeeded()
361 {
362  if ( itemNames.count() == 0 )
363  {
364  kdDebug( 760 ) << k_funcinfo << "Hiding the dock container" << endl;
365  ( ( KDockWidget* ) parentWidget() )->undock();
366  }
367 }
368 
369 void KMdiDockContainer::removeWidget( KDockWidget* dwdg )
370 {
371  KDockWidget * w = dwdg;
372  if ( !m_map.contains( w ) )
373  return; //we don't have this widget in our container
374 
375  kdDebug( 760 ) << k_funcinfo << endl;
376  //lower the tab. ( TODO: needed? )
377  int id = m_map[ w ];
378  if ( m_tb->isTabRaised( id ) )
379  {
380  m_tb->setTab( id, false );
381  tabClicked( id );
382  }
383 
384  m_tb->removeTab( id );
385  m_ws->removeWidget( w );
386  m_map.remove( w );
387  m_revMap.remove( id );
388  if ( m_overlapButtons.contains( w ) )
389  {
390  ( ::tqt_cast<KDockWidgetHeader*>( w->getHeader() ) )->removeButton( m_overlapButtons[ w ] );
391  m_overlapButtons.remove( w );
392  }
393  KDockContainer::removeWidget( w );
394  itemNames.remove( w->name() );
395  tabCaptions.remove( w->name() );
396  tabTooltips.remove( w->name() );
397  hideIfNeeded();
398 }
399 
400 void KMdiDockContainer::undockWidget( KDockWidget *dwdg )
401 {
402  KDockWidget * w = dwdg;
403 
404  if ( !m_map.contains( w ) )
405  return ;
406 
407  int id = m_map[ w ];
408  if ( m_tb->isTabRaised( id ) )
409  {
410  kdDebug( 760 ) << k_funcinfo << "Widget has been undocked, setting tab down" << endl;
411  m_tb->setTab( id, false );
412  tabClicked( id );
413  }
414 }
415 
416 void KMdiDockContainer::tabClicked( int t )
417 {
418  bool call_makeVisible = !m_tabSwitching;
419  m_tabSwitching = true;
420  if ( m_tb->isTabRaised( t ) )
421  {
422  kdDebug( 760 ) << k_funcinfo << "Tab " << t << " was just activated" << endl;
423  if ( m_ws->isHidden() )
424  {
425  kdDebug( 760 ) << k_funcinfo << "Showing widgetstack for tab just clicked" << endl;
426  m_ws->show();
427  parentDockWidget()->restoreFromForcedFixedSize();
428  }
429 
430  if ( !m_ws->widget( t ) )
431  {
432  kdDebug( 760 ) << k_funcinfo << "Widget tab was clicked for is not in our stack" << endl;
433  kdDebug( 760 ) << k_funcinfo << "Docking it back in" << endl;
434  m_revMap[t]->manualDock( parentDockWidget(), KDockWidget::DockCenter, 20 );
435  if ( call_makeVisible )
436  m_revMap[t]->makeDockVisible();
437  m_tabSwitching = false;
438  emit activated( this );
439  return ;
440  }
441 
442  if ( m_ws->widget( t ) )
443  {
444  m_ws->raiseWidget( t );
445  KDockWidget * tmpDw = ::tqt_cast<KDockWidget*>( m_ws->widget( t ) );
446  if ( tmpDw )
447  {
448  if ( tmpDw->getWidget() )
449  tmpDw->getWidget()->setFocus();
450  }
451  else
452  kdDebug( 760 ) << k_funcinfo << "Something really weird is going on" << endl;
453  }
454  else
455  kdDebug( 760 ) << k_funcinfo << "We have no widget to handle in our stack." << endl;
456 
457  if ( oldtab != t )
458  m_tb->setTab( oldtab, false );
459 
460  m_tabSwitching = true;
461  oldtab = t;
462  emit activated( this );
463  }
464  else
465  {
466  kdDebug( 760 ) << k_funcinfo << "Tab " << t << " was just deactiviated" << endl;
467  // try save splitter position
468  if ( parentDockWidget() && parentDockWidget()->parent() )
469  {
470  KDockSplitter * sp = ::tqt_cast<KDockSplitter*>( parentDockWidget()->parent() );
471  if ( sp )
472  m_separatorPos = sp->separatorPos();
473  }
474  m_previousTab = t;
475  // oldtab=-1;
476  if ( m_block )
477  return ;
478  emit deactivated( this );
479  m_block = true;
480  if ( m_ws->widget( t ) )
481  {
482  // ((KDockWidget*)m_ws->widget(t))->undock();
483  }
484  m_block = false;
485  m_ws->hide ();
486 
487 
488  kdDebug( 760 ) << k_funcinfo << "Fixed Width:" << m_tb->width() << endl;
489  if ( !m_horizontal )
490  parentDockWidget()->setForcedFixedWidth( m_tb->width() ); // strange why it worked before at all
491  else
492  parentDockWidget()->setForcedFixedHeight( m_tb->height() ); // strange why it worked before at all
493  }
494  m_tabSwitching = false;
495 }
496 
497 void KMdiDockContainer::setToolTip ( KDockWidget* w, TQString &s )
498 {
499  kdDebug( 760 ) << k_funcinfo << "Setting tooltip '" << s << "' for widget " << w << endl;
500  int tabId = m_map[w];
501  KMultiTabBarTab *mbTab = m_tb->tab( tabId );
502  TQToolTip::remove( mbTab );
503  TQToolTip::add( mbTab, s );
504 }
505 
506 void KMdiDockContainer::setPixmap( KDockWidget* widget , const TQPixmap& pixmap )
507 {
508  int id = m_ws->id( widget );
509  if ( id == -1 )
510  return ;
511  KMultiTabBarTab *tab = m_tb->tab( id );
512  tab->setIcon( pixmap.isNull() ? SmallIcon( "misc" ) : pixmap );
513 }
514 
515 void KMdiDockContainer::save( TQDomElement& dockEl )
516 {
517  TQDomDocument doc = dockEl.ownerDocument();
518  TQDomElement el;
519  el = doc.createElement( "name" );
520  el.appendChild( doc.createTextNode( TQString( "%1" ).arg( parent() ->name() ) ) );
521  dockEl.appendChild( el );
522  el = doc.createElement( "overlapMode" );
523  el.appendChild( doc.createTextNode( isOverlapMode() ? "true" : "false" ) );
524  dockEl.appendChild( el );
525  TQPtrList<KMultiTabBarTab>* tl = m_tb->tabs();
526  TQPtrListIterator<KMultiTabBarTab> it( *tl );
527  TQStringList::Iterator it2 = itemNames.begin();
528  int i = 0;
529  for ( ;it.current() != 0;++it, ++it2 )
530  {
531  el = doc.createElement( "child" );
532  el.setAttribute( "pos", TQString( "%1" ).arg( i ) );
533  TQString s = tabCaptions[ *it2 ];
534  if ( !s.isEmpty() )
535  {
536  el.setAttribute( "tabCaption", s );
537  }
538  s = tabTooltips[ *it2 ];
539  if ( !s.isEmpty() )
540  {
541  el.setAttribute( "tabTooltip", s );
542  }
543  el.appendChild( doc.createTextNode( *it2 ) );
544  dockEl.appendChild( el );
545  if ( m_tb->isTabRaised( it.current() ->id() ) )
546  {
547  TQDomElement el2 = doc.createElement( "raised" );
548  el2.appendChild( doc.createTextNode( m_ws->widget( it.current() ->id() ) ->name() ) );
549  el.appendChild( el2 );
550  }
551  ++i;
552  }
553 
554 
555 }
556 
557 void KMdiDockContainer::load( TQDomElement& dockEl )
558 {
559  TQString raise;
560 
561  for ( TQDomNode n = dockEl.firstChild();!n.isNull();n = n.nextSibling() )
562  {
563  TQDomElement el = n.toElement();
564  if ( el.isNull() )
565  continue;
566  if ( el.tagName() == "overlapMode" )
567  {
568  if ( el.attribute( "overlapMode" ) != "false" )
569  activateOverlapMode( m_horizontal?m_tb->height():m_tb->width() );
570  else
571  deactivateOverlapMode();
572  }
573  else if ( el.tagName() == "child" )
574  {
575  KDockWidget * dw = ( ( KDockWidget* ) parent() ) ->dockManager() ->getDockWidgetFromName( el.text() );
576  if ( dw )
577  {
578  if ( el.hasAttribute( "tabCaption" ) )
579  {
580  dw->setTabPageLabel( el.attribute( "tabCaption" ) );
581  }
582  if ( el.hasAttribute( "tabTooltip" ) )
583  {
584  dw->setToolTipString( el.attribute( "tabTooltip" ) );
585  }
586  dw->manualDock( ( KDockWidget* ) parent(), KDockWidget::DockCenter );
587  }
588  }
589  }
590 
591  TQPtrList<KMultiTabBarTab>* tl = m_tb->tabs();
592  TQPtrListIterator<KMultiTabBarTab> it1( *tl );
593  m_ws->hide();
594  if ( !m_horizontal )
595  parentDockWidget()->setForcedFixedWidth( m_tb->width() );
596  else
597  parentDockWidget()->setForcedFixedHeight( m_tb->height() );
598 
599  for ( ;it1.current() != 0;++it1 )
600  m_tb->setTab( it1.current() ->id(), false );
601 
602  kapp->syncX();
603  m_delayedRaise = -1;
604 
605  for ( TQMap<KDockWidget*, KDockButton_Private*>::iterator it = m_overlapButtons.begin();
606  it != m_overlapButtons.end();++it )
607  it.data() ->setOn( !isOverlapMode() );
608 
609  if ( !raise.isEmpty() )
610  {
611  for ( TQMap<KDockWidget*, int>::iterator it = m_map.begin();it != m_map.end();++it )
612  {
613  if ( it.key() ->name() == raise )
614  {
615  m_delayedRaise = it.data();
616  TQTimer::singleShot( 0, this, TQ_SLOT( delayedRaise() ) );
617  kdDebug( 760 ) << k_funcinfo << "raising " << it.key()->name() << endl;
618  break;
619  }
620  }
621 
622  }
623  if ( m_delayedRaise == -1 )
624  TQTimer::singleShot( 0, this, TQ_SLOT( init() ) );
625 }
626 
627 void KMdiDockContainer::save( TDEConfig* cfg, const TQString& group_or_prefix )
628 {
629  TQString grp = cfg->group();
630  cfg->deleteGroup( group_or_prefix + TQString( "::%1" ).arg( parent() ->name() ) );
631  cfg->setGroup( group_or_prefix + TQString( "::%1" ).arg( parent() ->name() ) );
632 
633  if ( isOverlapMode() )
634  cfg->writeEntry( "overlapMode", "true" );
635  else
636  cfg->writeEntry( "overlapMode", "false" );
637 
638  // try to save the splitter position
639  if ( parentDockWidget() && parentDockWidget() ->parent() )
640  {
641  KDockSplitter * sp = ::tqt_cast<KDockSplitter*>( parentDockWidget() -> parent() );
642  if ( sp )
643  cfg->writeEntry( "separatorPosition", m_separatorPos );
644  }
645 
646  TQPtrList<KMultiTabBarTab>* tl = m_tb->tabs();
647  TQPtrListIterator<KMultiTabBarTab> it( *tl );
648  TQStringList::Iterator it2 = itemNames.begin();
649  int i = 0;
650  for ( ;it.current() != 0;++it, ++it2 )
651  {
652  // cfg->writeEntry(TQString("widget%1").arg(i),m_ws->widget(it.current()->id())->name());
653  cfg->writeEntry( TQString( "widget%1" ).arg( i ), ( *it2 ) );
654  TQString s = tabCaptions[ *it2 ];
655  if ( !s.isEmpty() )
656  {
657  cfg->writeEntry( TQString( "widget%1-tabCaption" ).arg( i ), s );
658  }
659  s = tabTooltips[ *it2 ];
660  if ( !s.isEmpty() )
661  {
662  cfg->writeEntry( TQString( "widget%1-tabTooltip" ).arg( i ), s );
663  }
664  // kdDebug(760)<<"****************************************Saving: "<<m_ws->widget(it.current()->id())->name()<<endl;
665  if ( m_tb->isTabRaised( it.current() ->id() ) )
666  cfg->writeEntry( m_ws->widget( it.current() ->id() ) ->name(), true );
667  ++i;
668  }
669  cfg->sync();
670  cfg->setGroup( grp );
671 
672 }
673 
674 void KMdiDockContainer::load( TDEConfig* cfg, const TQString& group_or_prefix )
675 {
676  TQString grp = cfg->group();
677  cfg->setGroup( group_or_prefix + TQString( "::%1" ).arg( parent() ->name() ) );
678 
679  if ( cfg->readEntry( "overlapMode" ) != "false" )
680  activateOverlapMode( m_horizontal?m_tb->height():m_tb->width() );
681  else
682  deactivateOverlapMode();
683 
684  m_separatorPos = cfg->readNumEntry( "separatorPosition", 18000 );
685 
686  int i = 0;
687  TQString raise;
688  while ( true )
689  {
690  TQString dwn = cfg->readEntry( TQString( "widget%1" ).arg( i ) );
691  if ( dwn.isEmpty() )
692  break;
693  kdDebug( 760 ) << k_funcinfo << "configuring dockwidget :" << dwn << endl;
694  KDockWidget *dw = ( ( KDockWidget* ) parent() ) ->dockManager() ->getDockWidgetFromName( dwn );
695  if ( dw )
696  {
697  TQString s = cfg->readEntry( TQString( "widget%1-tabCaption" ).arg( i ) );
698  if ( !s.isEmpty() )
699  {
700  dw->setTabPageLabel( s );
701  }
702  s = cfg->readEntry( TQString( "widget%1-tabTooltip" ).arg( i ) );
703  if ( !s.isEmpty() )
704  {
705  dw->setToolTipString( s );
706  }
707  dw->manualDock( ( KDockWidget* ) parent(), KDockWidget::DockCenter );
708  }
709  if ( cfg->readBoolEntry( dwn, false ) )
710  raise = dwn;
711  i++;
712 
713  }
714 
715  TQPtrList<KMultiTabBarTab>* tl = m_tb->tabs();
716  TQPtrListIterator<KMultiTabBarTab> it1( *tl );
717  m_ws->hide();
718  if ( !m_horizontal )
719  parentDockWidget() ->setForcedFixedWidth( m_tb->width() );
720  else
721  parentDockWidget() ->setForcedFixedHeight( m_tb->height() );
722  for ( ;it1.current() != 0;++it1 )
723  {
724  m_tb->setTab( it1.current() ->id(), false );
725  }
726  kapp->syncX();
727  m_delayedRaise = -1;
728 
729  for ( TQMap<KDockWidget*, KDockButton_Private*>::iterator it = m_overlapButtons.begin();
730  it != m_overlapButtons.end();++it )
731  it.data() ->setOn( !isOverlapMode() );
732 
733  if ( !raise.isEmpty() )
734  {
735  for ( TQMap<KDockWidget*, int>::iterator it = m_map.begin();it != m_map.end();++it )
736  {
737  if ( it.key() ->name() == raise )
738  {
739  /* tabClicked(it.data());
740  m_tb->setTab(it.data(),true);
741  tabClicked(it.data());
742  m_ws->raiseWidget(it.key());
743  kapp->sendPostedEvents();
744  kapp->syncX();*/
745 
746  m_delayedRaise = it.data();
747  TQTimer::singleShot( 0, this, TQ_SLOT( delayedRaise() ) );
748  kdDebug( 760 ) << k_funcinfo << "raising" << it.key() ->name() << endl;
749  break;
750  }
751  }
752 
753  }
754  if ( m_delayedRaise == -1 )
755  TQTimer::singleShot( 0, this, TQ_SLOT( init() ) );
756  cfg->setGroup( grp );
757 
758 }
759 
760 void KMdiDockContainer::delayedRaise()
761 {
762  m_tb->setTab( m_delayedRaise, true );
763  tabClicked( m_delayedRaise );
764 }
765 
766 void KMdiDockContainer::collapseOverlapped()
767 {
768  //don't collapse if we're switching tabs
769  if ( m_tabSwitching )
770  return;
771 
772  if ( isOverlapMode() )
773  {
774  TQPtrList<KMultiTabBarTab>* tl = m_tb->tabs();
775  TQPtrListIterator<KMultiTabBarTab> it( *tl );
776  for ( ;it.current();++it )
777  {
778  if ( it.current()->isOn() )
779  {
780  kdDebug( 760 ) << k_funcinfo << "lowering tab with id " << ( *it )->id() << endl;
781  it.current()->setState( false );
782  tabClicked( ( *it )->id() );
783  }
784  }
785  }
786 }
787 
788 void KMdiDockContainer::toggle()
789 {
790  kdDebug( 760 ) << k_funcinfo << endl;
791 
792  if ( m_tb->isTabRaised( oldtab ) )
793  {
794  kdDebug( 760 ) << k_funcinfo << "lowering tab" << endl;
795  m_tb->setTab( oldtab, false );
796  tabClicked( oldtab );
797  KMdiMainFrm *mainFrm = dynamic_cast<KMdiMainFrm*>( m_mainWin );
798  if ( mainFrm && mainFrm->activeWindow() )
799  mainFrm->activeWindow()->setFocus();
800  }
801  else
802  {
803  kdDebug( 760 ) << k_funcinfo << "raising tab" << endl;
804  if ( m_tb->tab( m_previousTab ) == 0 )
805  {
806  if ( m_tb->tabs() ->count() == 0 )
807  return ;
808 
809  m_previousTab = m_tb->tabs() ->getFirst() ->id();
810  }
811  m_tb->setTab( m_previousTab, true );
812  tabClicked( m_previousTab );
813  }
814 }
815 
816 void KMdiDockContainer::prevToolView()
817 {
818  kdDebug( 760 ) << k_funcinfo << endl;
819  TQPtrList<KMultiTabBarTab>* tabs = m_tb->tabs();
820  int pos = tabs->findRef( m_tb->tab( oldtab ) );
821 
822  if ( pos == -1 )
823  return ;
824 
825  pos--;
826  if ( pos < 0 )
827  pos = tabs->count() - 1;
828 
829  KMultiTabBarTab *tab = tabs->at( pos );
830  if ( !tab )
831  return ; //can never happen here, but who knows
832 
833  m_tb->setTab( tab->id(), true );
834  tabClicked( tab->id() );
835 }
836 
837 void KMdiDockContainer::nextToolView()
838 {
839  kdDebug( 760 ) << k_funcinfo << endl;
840  TQPtrList<KMultiTabBarTab>* tabs = m_tb->tabs();
841  int pos = tabs->findRef( m_tb->tab( oldtab ) );
842 
843  if ( pos == -1 )
844  return ;
845 
846  pos++;
847  if ( pos >= ( int ) tabs->count() )
848  pos = 0;
849 
850  KMultiTabBarTab *tab = tabs->at( pos );
851  if ( !tab )
852  return ; //can never happen here, but who knows
853 
854  m_tb->setTab( tab->id(), true );
855  tabClicked( tab->id() );
856 }
KMdiMainFrm
Base class for all your special main frames.
Definition: tdemdimainfrm.h:240
KMdiMainFrm::activeWindow
KMdiChildView * activeWindow()
Returns the focused attached MDI view.
Definition: tdemdimainfrm.cpp:952

tdemdi

Skip menu "tdemdi"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

tdemdi

Skip menu "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 by doxygen 1.9.1
This website is maintained by Timothy Pearson.