1 #include "displayMgrMDI.h"
7 #include <qpopupmenu.h>
11 #include <kapplication.h>
17 DisplayMgrMDI::DisplayMgrMDI()
21 DisplayMgrMDI::~DisplayMgrMDI()
23 kdDebug(5008) << "~DisplayMgrMDI in" << endl
;
25 delete static_cast<MDITopLevel
*>( m_topLevel
);
26 kdDebug(5008) << "~DisplayMgrMDI out" << endl
;
29 #define DMM_MDI_ID 2351
30 #define DMM_DEATCH_ID 50
31 #define DMM_MOVEL_ID 51
32 #define DMM_MOVER_ID 52
34 void DisplayMgrMDI::newTopLevel( QWidget
*w
, bool show
)
36 topLevel()->addWidget( w
, show
);
37 if(w
->inherits("KSircTopLevel")){
38 KSircTopLevel
*t
= static_cast<KSircTopLevel
*>(w
);
39 connect(m_topLevel
->tabWidget(), SIGNAL(currentChanged(QWidget
*)), t
, SLOT(focusChange(QWidget
*)));
41 if(w
->inherits("KMainWindow")){
42 KMainWindow
*t
= static_cast<KMainWindow
*>(w
);
44 QMenuBar
*cmenu
= t
->menuBar();
46 QPopupMenu
*m
= new QPopupMenu(t
, QCString(t
->name()) + "_popup_MDI");
47 m
->setCheckable(true);
48 m
->insertItem(i18n("Detach Window"), this, SLOT(reparentReq()), 0, DMM_DEATCH_ID
, 0);
49 m
->insertSeparator(0);
50 m
->insertItem(i18n("Move Tab Left"), this, SLOT(moveWindowLeft()), ALT
+SHIFT
+Key_Left
, DMM_MOVEL_ID
, 0);
51 m
->insertItem(i18n("Move Tab Right"), this, SLOT(moveWindowRight()), ALT
+SHIFT
+Key_Right
, DMM_MOVER_ID
, 0);
53 * By using an posisiton of 4 this works for KSircTopLevel
54 * and DCCTopLevel but will cause problems when we have
55 * new top level windows with different menus.
56 * BEWARE THIS IS BAD, we should have a better way of doing this
58 cmenu
->insertItem(i18n("&Window"), m
, DMM_MDI_ID
, 4);
59 cmenu
->setAccel(Key_M
, DMM_MDI_ID
);
61 QPopupMenu
*sm
= new QPopupMenu(t
, "settings" );
63 KToggleAction
*showmenu
= KStdAction::showMenubar( 0, 0, t
->actionCollection() );
65 connect( showmenu
, SIGNAL(toggled(bool)), cmenu
, SLOT(setShown(bool)) );
67 KSelectAction
*selectTabbar
= new KSelectAction(i18n("&Tab Bar"), 0, this, "tabbar" );
68 QStringList tabbaritems
;
69 tabbaritems
<< i18n("&Top") << i18n("&Bottom");
70 selectTabbar
->setItems(tabbaritems
);
71 selectTabbar
->setCurrentItem(1);
72 selectTabbar
->plug( sm
);
73 connect( selectTabbar
, SIGNAL(activated(int)), this, SLOT(setTabPosition(int)) );
75 KToggleAction
*showfull
= KStdAction::fullScreen( 0, 0, t
->actionCollection(), t
);
77 connect( showfull
, SIGNAL(toggled(bool)), this, SLOT(setFullScreen(bool)) );
79 cmenu
->insertItem( i18n("&Settings"), sm
, -1, 5 );
85 void DisplayMgrMDI::removeTopLevel(QWidget
*w
)
92 kdDebug(5008) << "DisplayMgrMDI: got removeToplevel" << endl
;
94 m_topLevel
->removeWidget( w
);
96 if ( m_topLevel
->widgets().count() == 0 ) {
97 kdDebug(5008) << "DisplayMgrMDI: count == 0 nuking all" << endl
;
98 if ( !m_topLevel
->closing() ) {
99 kdDebug(5008) << "DisplayMgrMDI: delete m_topLevel" << endl
;
100 delete static_cast<MDITopLevel
*>( m_topLevel
);
104 else if(m_topLevel
->tabWidget()->count() == 0){
109 void DisplayMgrMDI::show(QWidget
*w
)
114 m_topLevel
->showWidget(w
);
118 void DisplayMgrMDI::hide(QWidget
*w
)
123 m_topLevel
->hideWidget(w
);
124 if(m_topLevel
->tabWidget()->count() == 0){
129 void DisplayMgrMDI::raise(QWidget
*w
, bool takefocus
)
131 assert( m_topLevel
);
133 KWin::setCurrentDesktop(KWin::info(m_topLevel
->winId()).desktop
);
137 m_topLevel
->setActiveWindow();
138 #if KDE_IS_VERSION(3,1,92)
139 KWin::activateWindow(m_topLevel
->winId());
141 KWin::setActiveWindow(m_topLevel
->winId());
144 m_topLevel
->tabWidget()->showPage( w
);
148 void DisplayMgrMDI::setCaption(QWidget
*w
, const QString
& cap
)
150 assert( m_topLevel
);
155 esc
.replace("&", "&&");
156 kdDebug(5008) << "Set caption: " << esc
<< endl
;
158 m_topLevel
->tabWidget()->setTabLabel( w
, esc
);
161 void DisplayMgrMDI::slotCycleTabsLeft()
164 assert( m_topLevel
);
166 m_topLevel
->previous();
169 void DisplayMgrMDI::slotCycleTabsRight()
172 assert( m_topLevel
);
177 void DisplayMgrMDI::reparentReq()
179 kdDebug(5008) << "got reparent" << endl
;
181 QWidget
*o
= kapp
->focusWidget();
185 kdDebug(5008) << "Kapp says no widget has focus!" << endl
;
186 o
= kapp
->activeWindow();
188 if(o
->inherits("KMainWindow") == false)
195 kdDebug(5008) << "QWidget is: " << o
->className() << " name: " << o
->name("none give") << endl
;
199 while(s
->parentWidget()){
200 kdDebug(5008) << "Got a: " << s
->className() << endl
;
201 s
= s
->parentWidget();
202 if(s
->inherits("KMainWindow"))
209 // QWidget *s = m_topLevel->tabWidget()->currentPage(); can't do this since you can never reattach
211 KMainWindow
*kst
= static_cast<KMainWindow
*>(s
);
212 kdDebug(5008) << "Top is: " << kst
->name("none give") <<endl
;
214 QMenuData
*tmenu
= kst
->menuBar();
216 QMenuItem
*menui
= tmenu
->findItem(DMM_MDI_ID
);
218 QMenuData
*cmenu
= menui
->popup();
219 if(cmenu
->findItem(DMM_DEATCH_ID
) && cmenu
->isItemChecked(DMM_DEATCH_ID
)){
220 kst
->reparent( topLevel()->tabWidget(), 0, QPoint( 0, 0 ), true );
222 cmenu
->setItemChecked(DMM_DEATCH_ID
, false);
226 kst
->reparent( 0, QPoint(0,0), true );
227 cmenu
->setItemChecked(DMM_DEATCH_ID
, true);
234 MDITopLevel
*DisplayMgrMDI::topLevel()
238 m_topLevel
= new MDITopLevel(0x0, "MDITopLevel");
241 KAccel
*a
= new KAccel( m_topLevel
);
242 a
->insert( "cycle left", i18n("Cycle left"), QString::null
, ALT
+Key_Left
, ALT
+Key_Left
, this, SLOT(slotCycleTabsLeft()) );
243 a
->insert( "cycle right", i18n("Cycle right"), QString::null
, ALT
+Key_Right
, ALT
+Key_Right
, this, SLOT(slotCycleTabsRight()) );
249 void DisplayMgrMDI::setTabPosition( int idx
) {
253 m_topLevel
->tabWidget()->setTabPosition(QTabWidget::Top
);
256 m_topLevel
->tabWidget()->setTabPosition(QTabWidget::Bottom
);
262 void DisplayMgrMDI::setFullScreen( bool full
) {
264 m_topLevel
->showFullScreen();
266 m_topLevel
->showNormal();
271 void DisplayMgrMDI::moveWindowLeft() {
275 void DisplayMgrMDI::moveWindowRight() {
279 void DisplayMgrMDI::moveWindow(int step
)
281 if(m_topLevel
->tabWidget()->count() == 0){
285 QWidget
*w
= m_topLevel
->tabWidget()->currentPage();
287 int index
= m_topLevel
->tabWidget()->currentPageIndex();
291 if(index
>= m_topLevel
->tabWidget()->count())
294 m_topLevel
->setUpdatesEnabled(false);
295 m_topLevel
->hideWidget(w
);
296 int space
= w
->caption().find(" ");
297 QString esc
= space
< 1 ? w
->caption():w
->caption().left(space
);
298 esc
.replace("&", "&&");
299 kdDebug(5008) << "Insert tab: " << esc
<< endl
;
300 m_topLevel
->tabWidget()->insertTab( w
, esc
, index
);
301 m_topLevel
->tabWidget()->showPage( w
);
302 m_topLevel
->setUpdatesEnabled(true);
306 #include "displayMgrMDI.moc"