• 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
40static 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
52KMdiDockContainer::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
128void KMdiDockContainer::setStyle( int style )
129{
130 if ( m_tb )
131 m_tb->setStyle( KMultiTabBar::KMultiTabBarStyle( style ) );
132}
133
134KMdiDockContainer::~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
153void 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
181KDockWidget* KMdiDockContainer::parentDockWidget()
182{
183 return ( ( KDockWidget* ) parent() );
184}
185
186void 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
249bool 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
323void 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
333void 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
360void 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
369void 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
400void 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
416void 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
497void 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
506void 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
515void 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
557void 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 tdeApp->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
627void 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
674void 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 tdeApp->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 tdeApp->sendPostedEvents();
744 tdeApp->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
760void KMdiDockContainer::delayedRaise()
761{
762 m_tb->setTab( m_delayedRaise, true );
763 tabClicked( m_delayedRaise );
764}
765
766void 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
788void 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
816void 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
837void 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.4
This website is maintained by Timothy Pearson.