diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | bcb704366cb5e333a626c18c308c7e0448a8e69f (patch) | |
tree | f0d6ab7d78ecdd9207cf46536376b44b91a1ca71 /ksirc/mditoplevel.cpp | |
download | tdenetwork-bcb704366cb5e333a626c18c308c7e0448a8e69f.tar.gz tdenetwork-bcb704366cb5e333a626c18c308c7e0448a8e69f.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdenetwork@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'ksirc/mditoplevel.cpp')
-rw-r--r-- | ksirc/mditoplevel.cpp | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/ksirc/mditoplevel.cpp b/ksirc/mditoplevel.cpp new file mode 100644 index 00000000..3f35d464 --- /dev/null +++ b/ksirc/mditoplevel.cpp @@ -0,0 +1,260 @@ + +#include <qguardedptr.h> + +#include <qtabbar.h> + +#include <kapplication.h> +#include <kiconloader.h> +#include <kconfig.h> +#include <kdebug.h> +#include <kpopupmenu.h> +#include <klocale.h> +#include <kaction.h> + +#include "mditoplevel.h" +#include "toplevel.h" +#include "servercontroller.h" + +#define ID_CLOSE 5 + +void KSTabWidget::mousePressEvent(QMouseEvent *e) +{ + if(e->button() == RightButton){ + QPoint p = tabBar()->mapFromParent(e->pos()); + QTab *tab = tabBar()->selectTab(p); + if(tab){ + int id = tab->identifier(); + emit showContexMenu(page(id), tabBar()->mapToGlobal(p)); + } + } +} + +MDITopLevel::MDITopLevel(QWidget *parent, const char *name) + : KMainWindow(parent, name) +{ + m_closing = false; + + m_tab = new KSTabWidget( this ); + m_tab->setTabPosition( QTabWidget::Bottom ); + + setCentralWidget( m_tab ); + + connect( m_tab, SIGNAL( currentChanged( QWidget * ) ), + this, SLOT( slotCurrentChanged( QWidget * ) ) ); + + connect( m_tab, SIGNAL( showContexMenu(QWidget *, const QPoint &) ), + this, SLOT( slotShowContexMenu(QWidget *, const QPoint &) ) ); + + KConfig *config = kapp->config(); + config->setGroup("MDI"); + QSize s( 600, 360 ); + resize(config->readSizeEntry( "TopLevelSize", &s )); + + m_dirtyIcon = UserIcon( "star" ); + m_addressedIcon = UserIcon( "info" ); + + m_pop = new KPopupMenu(m_tab, ""); + m_pop->insertItem( SmallIcon("fileclose"), i18n("Close"), this, SLOT( slotCloseLastWid() )); + +} + +MDITopLevel::~MDITopLevel() +{ + kdDebug(5008) << "~MDITopLevel in" << endl; + + KConfig *config = kapp->config(); + config->setGroup( "MDI" ); + config->writeEntry( "TopLevelSize", this->size() ); + config->sync(); + + QPtrListIterator<QWidget> it( m_tabWidgets ); + for (; it.current(); ++it ) + it.current()->disconnect( this, 0 ); + kdDebug(5008) << "~MDITopLevel out" << endl; + +} + +void MDITopLevel::addWidget( QWidget *widget, bool show ) +{ + if ( m_tabWidgets.containsRef( widget ) ) + return; + + kdDebug(5008) << "In add widget" << endl; + + widget->reparent( m_tab, 0, QPoint( 0, 0 ), show ); + + if(show == TRUE){ + showWidget(widget); + } + + m_tabWidgets.append( widget ); + + connect( widget, SIGNAL( destroyed() ) , + this, SLOT( slotWidgetDestroyed() ) ); + + connect( widget, SIGNAL( changeChannel( const QString &, const QString & ) ), + this, SLOT( slotChangeChannelName( const QString &, const QString & ) ) ); + + widget->installEventFilter( this ); + + connect( widget, SIGNAL( changed( bool, QString ) ), + this, SLOT( slotMarkPageDirty( bool ) ) ); +} + +void MDITopLevel::removeWidget( QWidget *widget ) +{ + if (m_closing) + return; + m_tabWidgets.removeRef( widget ); + removeFromAddressedList( widget ); + m_tab->removePage( widget ); + widget->removeEventFilter( this ); + widget->disconnect( this, 0 ); +} + +void MDITopLevel::hideWidget( QWidget *widget ) +{ + m_tab->removePage( widget ); + widget->hide(); +} + +void MDITopLevel::showWidget( QWidget *widget ) +{ + if(m_tab->indexOf(widget) == -1){ + int space = widget->caption().find(" "); + QString cap = space < 1 ? widget->caption():widget->caption().left(space); + m_tab->addTab( widget, cap); + m_tab->showPage( widget ); + m_tab->setCurrentPage( m_tab->indexOf(widget) ); + } +} + +void MDITopLevel::next() +{ + if (m_tab->currentPageIndex() < m_tab->count() - 1) + m_tab->setCurrentPage(m_tab->currentPageIndex() + 1); + else + m_tab->setCurrentPage(0); +} + +void MDITopLevel::previous() +{ + if (m_tab->currentPageIndex() > 0) + m_tab->setCurrentPage(m_tab->currentPageIndex() - 1); + else + m_tab->setCurrentPage(m_tab->count() - 1); +} + +void MDITopLevel::closeEvent( QCloseEvent *ev ) +{ + m_closing = true; + // Don't use iterators on a list while deleting elements + // from it (Antonio) + int i = 0; + kdDebug(5008) << "Mdi got close event " << endl; + while ( m_tabWidgets.count() && (i++ < 100000)) { + kdDebug(5008) << "MDITopLevel trying to close: " << m_tabWidgets.first()->name() << endl; + QGuardedPtr<QWidget> w = m_tabWidgets.take(0); + w->show(); + w->close( false ); + if(w) + delete (QWidget *)w; + } + + KMainWindow::closeEvent( ev ); + m_closing = false; +} + +void MDITopLevel::slotWidgetDestroyed() +{ + const QWidget *widget = static_cast<const QWidget *>( sender() ); + + m_tabWidgets.removeRef( widget ); + removeFromAddressedList( widget ); +} + +bool MDITopLevel::eventFilter( QObject *obj, QEvent *ev ) +{ + if ( ev->type() != QEvent::CaptionChange ) + return false; + + QWidget *widget = dynamic_cast<QWidget *>( obj ); + + if ( !widget || !m_tabWidgets.containsRef( widget ) ) + return false; + + if ( m_tab->currentPage() == widget ) + setPlainCaption( widget->caption() ); + + return false; +} + +void MDITopLevel::slotCurrentChanged( QWidget *page ) +{ + + m_tab->setTabIconSet( page, QIconSet() ); + removeFromAddressedList( page ); + + setPlainCaption( page->QWidget::caption() ); + + KSircTopLevel *kst = dynamic_cast<KSircTopLevel *>( page ); + if ( !kst ) + return; + kst->lineEdit()->setFocus(); +} + +void MDITopLevel::slotMarkPageDirty( bool addressed ) +{ + // This is called when a line appeared in this channel. + // addressed is true if it was addressed to the user + KMainWindow *window = dynamic_cast<KMainWindow *>( const_cast<QObject *>( sender() ) ); + + if ( !window ) + return; + + if ( window != m_tab->currentPage() ) + { + if ( m_addressed.containsRef( window ) ) + addressed = true; + else if ( addressed ) { + m_addressed.append( window ); + } + m_tab->setTabIconSet( window, addressed ? m_addressedIcon : m_dirtyIcon ); + } +} + +void MDITopLevel::slotChangeChannelName( const QString &, const QString &channelName ) +{ + KMainWindow *window = dynamic_cast<KMainWindow *>( const_cast<QObject *>( sender() ) ); + + if ( !window ) + return; + + QString esc = channelName; + esc.replace("&", "&&"); + m_tab->setTabLabel( window, esc ); + removeFromAddressedList( window ); +} + +void MDITopLevel::removeFromAddressedList( const QWidget* w ) +{ + // If this tab was showing a "you're being talked to" icon, remove it + // and tell the servercontroller (so that it can update the docked icon). + m_addressed.removeRef( w ); +} + +void MDITopLevel::slotShowContexMenu(QWidget *w, const QPoint &p) +{ + m_last_pop_wid = w; + m_pop->popup(p); +} + +void MDITopLevel::slotCloseLastWid() +{ + m_last_pop_wid->close(); + +} + +#include "mditoplevel.moc" + +// vim: ts=4 sw=4 et |