Now the systrayicon change it's color when a download is in progress. I simply change...
[kdenetwork.git] / ksirc / displayMgrMDI.cpp
blob6f9727779df6e5d07f4f04d890740d3caaef26e4
1 #include "displayMgrMDI.h"
2 #include "toplevel.h"
4 #include <unistd.h>
6 #include <assert.h>
7 #include <qpopupmenu.h>
8 #include <kwin.h>
9 #include <kaccel.h>
10 #include <kaction.h>
11 #include <kapplication.h>
12 #include <klocale.h>
13 #include <kdebug.h>
15 #include <kmenubar.h>
17 DisplayMgrMDI::DisplayMgrMDI()
21 DisplayMgrMDI::~DisplayMgrMDI()
23 kdDebug(5008) << "~DisplayMgrMDI in" << endl;
24 if ( m_topLevel )
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();
45 if(cmenu){
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() );
64 showmenu->plug( sm );
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 );
76 showfull->plug( sm );
77 connect( showfull, SIGNAL(toggled(bool)), this, SLOT(setFullScreen(bool)) );
79 cmenu->insertItem( i18n("&Settings"), sm, -1, 5 );
82 topLevel()->show();
85 void DisplayMgrMDI::removeTopLevel(QWidget *w )
87 if ( !m_topLevel )
88 return;
90 assert( 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 );
102 m_topLevel = 0;
104 else if(m_topLevel->tabWidget()->count() == 0){
105 m_topLevel->hide();
109 void DisplayMgrMDI::show(QWidget *w)
111 if ( !m_topLevel )
112 return;
114 m_topLevel->showWidget(w);
115 m_topLevel->show();
118 void DisplayMgrMDI::hide(QWidget *w)
120 if ( !m_topLevel )
121 return;
123 m_topLevel->hideWidget(w);
124 if(m_topLevel->tabWidget()->count() == 0){
125 m_topLevel->hide();
129 void DisplayMgrMDI::raise(QWidget *w, bool takefocus)
131 assert( m_topLevel );
132 if(takefocus){
133 KWin::setCurrentDesktop(KWin::info(m_topLevel->winId()).desktop);
135 m_topLevel->show();
136 m_topLevel->raise();
137 m_topLevel->setActiveWindow();
138 #if KDE_IS_VERSION(3,1,92)
139 KWin::activateWindow(m_topLevel->winId());
140 #else
141 KWin::setActiveWindow(m_topLevel->winId());
142 #endif
144 m_topLevel->tabWidget()->showPage( w );
148 void DisplayMgrMDI::setCaption(QWidget *w, const QString& cap)
150 assert( m_topLevel );
152 w->setCaption(cap);
154 QString esc = cap;
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 );
174 m_topLevel->next();
177 void DisplayMgrMDI::reparentReq()
179 kdDebug(5008) << "got reparent" << endl;
181 QWidget *o = kapp->focusWidget();
182 QWidget *s;
184 if(o == NULL){
185 kdDebug(5008) << "Kapp says no widget has focus!" << endl;
186 o = kapp->activeWindow();
188 if(o->inherits("KMainWindow") == false)
189 return;
191 s = o;
193 else {
195 kdDebug(5008) << "QWidget is: " << o->className() << " name: " << o->name("none give") << endl;
198 s = o;
199 while(s->parentWidget()){
200 kdDebug(5008) << "Got a: " << s->className() << endl;
201 s = s->parentWidget();
202 if(s->inherits("KMainWindow"))
203 break;
209 // QWidget *s = m_topLevel->tabWidget()->currentPage(); can't do this since you can never reattach
210 if(s){
211 KMainWindow *kst = static_cast<KMainWindow *>(s);
212 kdDebug(5008) << "Top is: " << kst->name("none give") <<endl;
214 QMenuData *tmenu = kst->menuBar();
215 if(tmenu){
216 QMenuItem *menui = tmenu->findItem(DMM_MDI_ID);
217 if(menui){
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 );
221 show(kst);
222 cmenu->setItemChecked(DMM_DEATCH_ID, false);
224 else {
225 hide(kst);
226 kst->reparent( 0, QPoint(0,0), true );
227 cmenu->setItemChecked(DMM_DEATCH_ID, true);
234 MDITopLevel *DisplayMgrMDI::topLevel()
236 if ( !m_topLevel )
238 m_topLevel = new MDITopLevel(0x0, "MDITopLevel");
239 m_topLevel->show();
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()) );
246 return m_topLevel;
249 void DisplayMgrMDI::setTabPosition( int idx ) {
251 switch ( idx ) {
252 case 0:
253 m_topLevel->tabWidget()->setTabPosition(QTabWidget::Top);
254 break;
255 case 1:
256 m_topLevel->tabWidget()->setTabPosition(QTabWidget::Bottom);
257 break;
262 void DisplayMgrMDI::setFullScreen( bool full ) {
263 if ( full )
264 m_topLevel->showFullScreen();
265 else
266 m_topLevel->showNormal();
271 void DisplayMgrMDI::moveWindowLeft() {
272 moveWindow(-1);
275 void DisplayMgrMDI::moveWindowRight() {
276 moveWindow(1);
279 void DisplayMgrMDI::moveWindow(int step)
281 if(m_topLevel->tabWidget()->count() == 0){
282 return;
285 QWidget *w = m_topLevel->tabWidget()->currentPage();
286 if(w != 0x0){
287 int index = m_topLevel->tabWidget()->currentPageIndex();
288 index += step;
289 if(index < 0)
290 return;
291 if(index >= m_topLevel->tabWidget()->count())
292 return;
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"