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