KParts
statusbarextension.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "statusbarextension.h"
00022
00023 #include <qvaluelist.h>
00024 #include <qobjectlist.h>
00025
00026 #include <kstatusbar.h>
00027 #include <kmainwindow.h>
00028 #include <kdebug.h>
00029 #include <kdelibs_export.h>
00030 #include <kparts/part.h>
00031 #include <kparts/event.h>
00032
00033 using namespace KParts;
00034
00036
00038
00039 class KParts::StatusBarItem {
00040 public:
00041 StatusBarItem()
00042 : m_widget(0), m_visible(false)
00043 {}
00044 StatusBarItem( QWidget * widget, int stretch, bool permanent )
00045 : m_widget(widget), m_stretch(stretch), m_permanent(permanent), m_visible(false)
00046 {}
00047
00048 QWidget * widget() const { return m_widget; }
00049
00050 void ensureItemShown( KStatusBar * sb )
00051 {
00052 if ( !m_visible )
00053 {
00054 sb->addWidget( m_widget, m_stretch, m_permanent );
00055 m_visible = true;
00056 m_widget->show();
00057 }
00058 }
00059 void ensureItemHidden( KStatusBar * sb )
00060 {
00061 if ( m_visible )
00062 {
00063 sb->removeWidget( m_widget );
00064 m_visible = false;
00065 m_widget->hide();
00066 }
00067 }
00068 private:
00069 QWidget * m_widget;
00070 int m_stretch;
00071 bool m_permanent;
00072 bool m_visible;
00073 };
00074
00076
00077
00078 StatusBarExtension::StatusBarExtension(KParts::ReadOnlyPart *parent, const char* name)
00079 : QObject(parent, name), m_statusBar(0), d(0)
00080 {
00081 parent->installEventFilter(this);
00082 }
00083
00084 StatusBarExtension::~StatusBarExtension()
00085 {
00086 }
00087
00088
00089 StatusBarExtension *StatusBarExtension::childObject( QObject *obj )
00090 {
00091 if ( !obj || !obj->children() )
00092 return 0L;
00093
00094
00095
00096 const QObjectList *children = obj->children();
00097 QObjectListIt it( *children );
00098 for (; it.current(); ++it )
00099 if ( it.current()->inherits( "KParts::StatusBarExtension" ) )
00100 return static_cast<KParts::StatusBarExtension *>( it.current() );
00101
00102 return 0L;
00103 }
00104
00105 bool StatusBarExtension::eventFilter(QObject * watched, QEvent* ev)
00106 {
00107 if ( !GUIActivateEvent::test( ev ) ||
00108 !watched->inherits("KParts::ReadOnlyPart") )
00109 return QObject::eventFilter(watched, ev);
00110
00111 KStatusBar * sb = statusBar();
00112 if ( !sb )
00113 return QObject::eventFilter(watched, ev);
00114
00115 GUIActivateEvent *gae = static_cast<GUIActivateEvent*>(ev);
00116
00117 if ( gae->activated() )
00118 {
00119 QValueListIterator<StatusBarItem> it = m_statusBarItems.begin();
00120 for ( ; it != m_statusBarItems.end() ; ++it )
00121 (*it).ensureItemShown( sb );
00122 }
00123 else
00124 {
00125 QValueListIterator<StatusBarItem> it = m_statusBarItems.begin();
00126 for ( ; it != m_statusBarItems.end() ; ++it )
00127 (*it).ensureItemHidden( sb );
00128 }
00129
00130 return false;
00131
00132 }
00133
00134 KStatusBar * StatusBarExtension::statusBar() const
00135 {
00136 if ( !m_statusBar ) {
00137 QWidget* w = static_cast<KParts::ReadOnlyPart*>(parent())->widget();
00138 KMainWindow* mw = dynamic_cast<KMainWindow *>( w->topLevelWidget() );
00139 if ( mw )
00140 m_statusBar = mw->statusBar();
00141 }
00142 return m_statusBar;
00143 }
00144
00145 void StatusBarExtension::setStatusBar( KStatusBar* status )
00146 {
00147 m_statusBar = status;
00148 }
00149
00150 void StatusBarExtension::addStatusBarItem( QWidget * widget, int stretch, bool permanent )
00151 {
00152 m_statusBarItems.append( StatusBarItem( widget, stretch, permanent ) );
00153 QValueListIterator<StatusBarItem> it = m_statusBarItems.fromLast();
00154 KStatusBar * sb = statusBar();
00155 Q_ASSERT(sb);
00156 if (sb)
00157 (*it).ensureItemShown( sb );
00158 }
00159
00160 void StatusBarExtension::removeStatusBarItem( QWidget * widget )
00161 {
00162 KStatusBar * sb = statusBar();
00163 QValueListIterator<StatusBarItem> it = m_statusBarItems.begin();
00164 for ( ; it != m_statusBarItems.end() ; ++it )
00165 if ( (*it).widget() == widget )
00166 {
00167 if ( sb )
00168 (*it).ensureItemHidden( sb );
00169 m_statusBarItems.remove( it );
00170 break;
00171 }
00172 if ( it == m_statusBarItems.end() )
00173 kdWarning(1000) << "StatusBarExtension::removeStatusBarItem. Widget not found : " << widget << endl;
00174 }
00175
00176 #include "statusbarextension.moc"
00177
00178