20 #include "mainwindow.h"
21 #include "dockcontainer.h"
23 #include "dockcontainer.moc"
25 #include "kdockwidget_private.h"
27 #include <tqwidgetstack.h>
30 #include <tqtooltip.h>
31 #include <tdemultitabbar.h>
32 #include <tdeglobalsettings.h>
35 #include <kiconloader.h>
36 #include <tdeapplication.h>
37 #include <tdeconfig.h>
38 #include <tdelocale.h>
41 static const char*
const tdemdi_not_close_xpm[]={
55 DockContainer::DockContainer(TQWidget *parent, TQWidget *win,
int position,
int flags)
56 : TQWidget(parent),KDockContainer()
58 m_tabSwitching =
false;
64 m_position = position;
66 m_separatorPos = 18000;
67 m_movingState=NotMoving;
69 kdDebug(760)<<
"DockContainer created"<<endl;
72 m_vertical=!((position==KDockWidget::DockTop) || (position==KDockWidget::DockBottom));
75 l=
new TQVBoxLayout(
this);
77 l=
new TQHBoxLayout(
this);
81 m_tb=
new KMultiTabBar(((position==KDockWidget::DockTop) || (position==KDockWidget::DockBottom))?
82 KMultiTabBar::Horizontal:KMultiTabBar::Vertical,
this);
84 m_tb->setStyle(KMultiTabBar::KMultiTabBarStyle(flags));
85 m_tb->showActiveTabTexts(
true);
87 m_tb->setPosition((position==KDockWidget::DockLeft)?KMultiTabBar::Left:
88 (position==KDockWidget::DockBottom)?KMultiTabBar::Bottom:
89 (position==KDockWidget::DockTop)?KMultiTabBar::Top:KMultiTabBar::Right);
91 m_ws=
new TQWidgetStack(
this);
93 m_ws->setSizePolicy(TQSizePolicy(TQSizePolicy::Expanding,TQSizePolicy::Expanding));
95 if ( (position==KDockWidget::DockLeft) || (position==KDockWidget::DockTop))
108 m_tb->installEventFilter(
this);
111 void DockContainer::setStyle(
int style) {
112 if (m_tb) m_tb->setStyle(KMultiTabBar::KMultiTabBarStyle(style));
115 DockContainer::~DockContainer()
117 TQMap<KDockWidget*,int>::iterator it;
118 while (m_map.count()) {
120 KDockWidget *w=it.key();
121 if (m_overlapButtons.contains(w)) {
122 (::tqt_cast<KDockWidgetHeader*>(w->getHeader()))->removeButton(m_overlapButtons[w]);
123 m_overlapButtons.remove(w);
132 void DockContainer::init()
134 bool overlap = isOverlapMode();
137 parentDockWidget()->setForcedFixedWidth(m_tb->width());
138 activateOverlapMode(m_tb->width());
142 parentDockWidget()->setForcedFixedHeight(m_tb->height());
143 activateOverlapMode(m_tb->height());
146 if (!overlap) deactivateOverlapMode();
149 if ( parentDockWidget() && parentDockWidget()->parent() )
151 KDockSplitter *sp= ::tqt_cast<KDockSplitter*>(parentDockWidget()->
154 sp->setSeparatorPosX( m_separatorPos );
158 KDockWidget *DockContainer::parentDockWidget()
160 return ((KDockWidget*)parent());
163 void DockContainer::insertWidget (KDockWidget *dwdg, TQPixmap pixmap,
const TQString &text,
int &)
165 KDockWidget* w = (KDockWidget*) dwdg;
167 bool alreadyThere=m_map.contains(w);
172 if (m_ws->addWidget(w,tab)!=tab) kdDebug(760)<<
"ERROR COULDN'T READD WIDGET************"<<endl;
173 kdDebug(760)<<
"READDED WIDGET***********************************"<<endl;
179 tab=m_ws->addWidget(w);
181 m_revMap.insert(tab,w);
184 if (((KDockWidget*)parentWidget())->mayBeShow())
185 ((KDockWidget*)parentWidget())->dockBack();
187 if (::tqt_cast<KDockWidgetHeader*>(w->getHeader()))
189 kdDebug(760)<<
"*** KDockWidgetHeader has been found"<<endl;
191 KDockWidgetHeader *hdr=::tqt_cast<KDockWidgetHeader*>(w->getHeader());
193 KDockButton_Private *btn =
new KDockButton_Private( hdr,
"OverlapButton" );
195 TQToolTip::add( btn, i18n(
"Switch between overlap and side by side mode",
"Overlap") );
197 btn->setToggleButton(
true );
198 btn->setPixmap(
const_cast< const char**
>(tdemdi_not_close_xpm) );
200 m_overlapButtons.insert(w,btn);
201 btn->setOn(!isOverlapMode());
203 connect(btn,TQ_SIGNAL(clicked()),
this,TQ_SLOT(changeOverlapMode()));
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;
212 connect(m_tb->tab(tab),TQ_SIGNAL(clicked(
int)),
this,TQ_SLOT(tabClicked(
int)));
214 kdDebug(760)<<
"DockContainer::insertWidget()"<<endl;
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());
234 bool DockContainer::eventFilter( TQObject *obj, TQEvent *event )
237 if ( (event->type()==TQEvent::Resize) && (m_ws->isHidden()) ) {
238 TQSize size=((TQResizeEvent*)event)->size();
240 parentDockWidget()->setForcedFixedWidth(size.width());
242 parentDockWidget()->setForcedFixedHeight(size.height());
246 switch ( event->type() ){
247 case TQEvent::MouseButtonPress:
249 KDockWidget * w=m_revMap[
dynamic_cast<KMultiTabBarTab*
>(obj)->
id()];
251 kdDebug()<<
"NoWidget"<<endl;
254 if (!w->getHeader()) {
255 kdDebug()<<
"NO HEADER"<<endl;
258 KDockWidgetHeader *hdr=::tqt_cast<KDockWidgetHeader*>(w->getHeader());
260 kdDebug()<<
"Wrong header type in DockContainer::eventFilter"<<endl;
263 m_dockManager=w->dockManager();
264 m_dragPanel=hdr->dragPanel();
265 if (m_dragPanel) m_movingState=WaitingForMoveStart;
267 m_startEvent=
new TQMouseEvent(* ((TQMouseEvent*)event));
270 case TQEvent::MouseButtonRelease:
271 if (m_movingState==Moving) {
272 m_movingState=NotMoving;
273 TQApplication::postEvent(m_dragPanel,
new TQMouseEvent(* ( (TQMouseEvent*)event)));
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,
static_cast<TQEvent*
>(m_startEvent));
283 m_dockManager->eventFilter(m_dragPanel,event);
284 m_movingState=Moving;
286 }
else if (m_movingState==Moving) {
287 m_dockManager->eventFilter(m_dragPanel,event);
298 void DockContainer::showWidget(KDockWidget *w) {
299 if (!m_map.contains(w))
return;
301 kdDebug()<<
"KMDI::DockContainer::<showWidget"<<endl;
303 m_tb->setTab(
id,
true);
308 void DockContainer::changeOverlapMode()
310 const KDockButton_Private *btn=
dynamic_cast<const KDockButton_Private*
>(sender());
312 kdDebug(760)<<
"DockContainer::changeOverlapMode: button=="<<btn<<endl;
317 kdDebug(760)<<
"DockContainer::changeOverlapMode: activateOverlapMode"<<endl;
319 activateOverlapMode(m_tb->width());
323 activateOverlapMode(m_tb->height());
326 kdDebug(760)<<
"DockContainer::changeOverlapMode: deactivateOverlapMode"<<endl;
327 deactivateOverlapMode();
330 for (TQMap<KDockWidget*,KDockButton_Private*>::iterator it=m_overlapButtons.begin();
331 it!=m_overlapButtons.end();++it)
332 it.data()->setOn(!isOverlapMode());
335 void DockContainer::hideIfNeeded() {
336 kdDebug(760)<<
"************************* hideIfNeeded *************************"<<endl;
337 if (!itemNames.count())
338 ((KDockWidget*)parentWidget())->undock();
341 void DockContainer::removeWidget(KDockWidget* dwdg)
343 KDockWidget* w = (KDockWidget*) dwdg;
344 if (!m_map.contains(w))
return;
346 if (m_tb->isTabRaised(
id)) {
349 m_tb->setTab(
id,
false);
350 m_tabSwitching =
false;
354 m_ws->removeWidget(w);
357 if (m_overlapButtons.contains(w)) {
358 (::tqt_cast<KDockWidgetHeader*>(w->getHeader()))->removeButton(m_overlapButtons[w]);
359 m_overlapButtons.remove(w);
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();
369 void DockContainer::undockWidget(KDockWidget *dwdg)
371 KDockWidget* w = (KDockWidget*) dwdg;
373 if (!m_map.contains(w))
377 if (m_tb->isTabRaised(
id)) {
378 kdDebug(760)<<
"Wiget has been undocked, setting tab down"<<endl;
379 m_tb->setTab(
id,
false);
384 void DockContainer::tabClicked(
int t)
386 kdDebug(760)<<
"DockContainer::tabClicked()"<<endl;
387 bool call_makeVisible=!m_tabSwitching;
389 if ((t!=-1) && m_tb->isTabRaised(t))
391 if (m_ws->isHidden())
394 parentDockWidget()->restoreFromForcedFixedSize();
396 if (!m_ws->widget(t))
398 m_revMap[t]->manualDock(parentDockWidget(),KDockWidget::DockCenter,20);
399 if (call_makeVisible) m_revMap[t]->makeDockVisible();
400 m_tabSwitching=
false;
401 emit activated(
this);
404 m_ws->raiseWidget(t);
405 if (m_ws->widget(t)) {
406 KDockWidget *tmpDw=::tqt_cast<KDockWidget*>(m_ws->widget(t));
408 if (tmpDw->getWidget()) tmpDw->getWidget()->setFocus();
409 }
else kdDebug(760)<<
"Something really weird is going on"<<endl;
411 kdDebug(760)<<
"DockContainer::tabClicked(int): m_ws->widget(t)==0 "<<endl;
413 if (oldtab!=t) m_tb->setTab(oldtab,
false);
416 emit activated(
this);
421 if ( parentDockWidget() && parentDockWidget()->parent() )
423 KDockSplitter *sp= ::tqt_cast<KDockSplitter*>(parentDockWidget()->
426 m_separatorPos = sp->separatorPos();
431 emit deactivated(
this);
441 kdDebug(760)<<
"Fixed Width:"<<m_tb->width()<<endl;
443 parentDockWidget()->setForcedFixedWidth(m_tb->width());
445 parentDockWidget()->setForcedFixedHeight(m_tb->height());
447 m_tabSwitching=
false;
450 void DockContainer::setToolTip (KDockWidget *, TQString &s)
452 kdDebug(760)<<
"***********************************Setting tooltip for a widget: "<<s<<endl;
455 void DockContainer::setPixmap(KDockWidget* widget ,
const TQPixmap& pixmap)
457 int id=m_ws->id(widget);
459 KMultiTabBarTab *tab=m_tb->tab(
id);
460 tab->setIcon(pixmap.isNull()?SmallIcon(
"misc"):pixmap);
463 void DockContainer::save(TDEConfig* cfg,
const TQString& group_or_prefix)
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()));
471 cfg->writeEntry(
"overlapMode",isOverlapMode());
474 if ( parentDockWidget() && parentDockWidget()->parent() )
476 KDockSplitter *sp= ::tqt_cast<KDockSplitter*>(parentDockWidget()->
479 cfg->writeEntry(
"separatorPosition", m_separatorPos );
482 TQPtrList<KMultiTabBarTab>* tl=m_tb->tabs();
483 TQPtrListIterator<KMultiTabBarTab> it(*tl);
484 TQStringList::Iterator it2=itemNames.begin();
486 for (;it.current()!=0;++it,++it2)
489 cfg->writeEntry(TQString(
"widget%1").arg(i),(*it2));
490 TQString s=tabCaptions[*it2];
492 cfg->writeEntry(TQString(
"widget%1-tabCaption").arg(i),s);
496 cfg->writeEntry(TQString(
"widget%1-tabTooltip").arg(i),s);
499 if (m_tb->isTabRaised(it.current()->id()))
500 cfg->writeEntry(m_ws->widget(it.current()->id())->name(),
true);
507 void DockContainer::load(TDEConfig* cfg,
const TQString& group_or_prefix)
509 TQString grp=cfg->group();
510 cfg->setGroup(group_or_prefix+TQString(
"::%1").arg(parent()->name()));
512 if (cfg->readBoolEntry(
"overlapMode"))
513 activateOverlapMode( m_vertical?m_tb->width():m_tb->height() );
515 deactivateOverlapMode();
517 m_separatorPos = cfg->readNumEntry(
"separatorPosition", 18000 );
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);
529 TQString s=cfg->readEntry(TQString(
"widget%1-tabCaption").arg(i));
531 dw->setTabPageLabel(s);
533 s=cfg->readEntry(TQString(
"widget%1-tabTooltip").arg(i));
535 dw->setToolTipString(s);
537 dw->manualDock((KDockWidget*)parent(),KDockWidget::DockCenter);
539 if (cfg->readBoolEntry(dwn,
false))
raise=dwn;
544 TQPtrList<KMultiTabBarTab>* tl=m_tb->tabs();
545 TQPtrListIterator<KMultiTabBarTab> it1(*tl);
548 parentDockWidget()->setForcedFixedWidth(m_tb->width());
550 parentDockWidget()->setForcedFixedHeight(m_tb->height());
551 for (;it1.current()!=0;++it1)
553 m_tb->setTab(it1.current()->id(),
false);
558 for (TQMap<KDockWidget*,KDockButton_Private*>::iterator it=m_overlapButtons.begin();
559 it!=m_overlapButtons.end();++it)
560 it.data()->setOn(!isOverlapMode());
562 if (!
raise.isEmpty())
564 for (TQMap<KDockWidget*,int>::iterator it=m_map.begin();it!=m_map.end();++it)
566 if (it.key()->name()==
raise)
575 m_delayedRaise=it.data();
576 TQTimer::singleShot(0,
this,TQ_SLOT(delayedRaise()));
577 kdDebug(760)<<
"************** raising *******: "<<it.key()->name()<<endl;
583 if (m_delayedRaise==-1) TQTimer::singleShot(0,
this,TQ_SLOT(init()));
588 void DockContainer::delayedRaise()
590 m_tb->setTab(m_delayedRaise,
true);
591 tabClicked(m_delayedRaise);
594 void DockContainer::collapseOverlapped()
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());
610 void DockContainer::toggle() {
611 kdDebug(760)<<
"DockContainer:activate"<<endl;
612 if (m_tb->isTabRaised(oldtab)) {
613 m_tb->setTab(oldtab,
false);
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();
625 m_tb->setTab(m_previousTab,
true);
626 tabClicked(m_previousTab);
630 void DockContainer::prevToolView() {
631 TQPtrList<KMultiTabBarTab>* tabs=m_tb->tabs();
632 int pos=tabs->findRef(m_tb->tab(oldtab));
635 if (pos<0) pos=tabs->count()-1;
636 KMultiTabBarTab *tab=tabs->at(pos);
638 m_tb->setTab(tab->id(),
true);
639 tabClicked(tab->id());
642 void DockContainer::nextToolView() {
643 TQPtrList<KMultiTabBarTab>* tabs=m_tb->tabs();
644 int pos=tabs->findRef(m_tb->tab(oldtab));
647 if (pos>=(
int)tabs->count()) pos=0;
648 KMultiTabBarTab *tab=tabs->at(pos);
650 m_tb->setTab(tab->id(),
true);
651 tabClicked(tab->id());
A namespace for the KMDI library.