summaryrefslogtreecommitdiff
path: root/library/qpemenubar.cpp
authorkergoth <kergoth>2002-01-25 22:14:26 (UTC)
committer kergoth <kergoth>2002-01-25 22:14:26 (UTC)
commit15318cad33835e4e2dc620d033e43cd930676cdd (patch) (side-by-side diff)
treec2fa0399a2c47fda8e2cd0092c73a809d17f68eb /library/qpemenubar.cpp
downloadopie-15318cad33835e4e2dc620d033e43cd930676cdd.zip
opie-15318cad33835e4e2dc620d033e43cd930676cdd.tar.gz
opie-15318cad33835e4e2dc620d033e43cd930676cdd.tar.bz2
Initial revision
Diffstat (limited to 'library/qpemenubar.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/qpemenubar.cpp308
1 files changed, 308 insertions, 0 deletions
diff --git a/library/qpemenubar.cpp b/library/qpemenubar.cpp
new file mode 100644
index 0000000..39f8fd6
--- a/dev/null
+++ b/library/qpemenubar.cpp
@@ -0,0 +1,308 @@
+/**********************************************************************
+** Copyright (C) 2001 Trolltech AS. All rights reserved.
+**
+** This file is part of Qtopia Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#define INCLUDE_MENUITEM_DEF
+
+#include "qpemenubar.h"
+#include <qapplication.h>
+#include <qguardedptr.h>
+#include <qtimer.h>
+
+
+class QMenuBarHack : public QMenuBar
+{
+public:
+ int activeItem() const { return actItem; }
+
+ void goodbye()
+ {
+ activateItemAt(-1);
+ for ( unsigned int i = 0; i < count(); i++ ) {
+ QMenuItem *mi = findItem( idAt(i) );
+ if ( mi->popup() ) {
+ mi->popup()->hide();
+ }
+ }
+ }
+};
+
+
+QPEMenuToolFocusManager *QPEMenuToolFocusManager::me = 0;
+
+QPEMenuToolFocusManager::QPEMenuToolFocusManager() : QObject()
+{
+ qApp->installEventFilter( this );
+}
+
+void QPEMenuToolFocusManager::addWidget( QWidget *w )
+{
+ list.append( GuardedWidget(w) );
+}
+
+void QPEMenuToolFocusManager::removeWidget( QWidget *w )
+{
+ list.remove( GuardedWidget(w) );
+}
+
+void QPEMenuToolFocusManager::setActive( bool a )
+{
+ if ( a ) {
+ oldFocus = qApp->focusWidget();
+ QValueList<GuardedWidget>::Iterator it;
+ it = list.begin();
+ while ( it != list.end() ) {
+ QWidget *w = (*it);
+ if ( w && w->isEnabled() && w->isVisible() &&
+ w->topLevelWidget() == qApp->activeWindow() ) {
+ setFocus( w );
+ return;
+ }
+ ++it;
+ }
+ } else {
+ if ( inFocus ) {
+ if ( inFocus->inherits( "QMenuBar" ) )
+ ((QMenuBarHack *)(QWidget *)inFocus)->goodbye();
+ if ( inFocus->hasFocus() ) {
+ if ( oldFocus && oldFocus->isVisible() && oldFocus->isEnabled() ) {
+ oldFocus->setFocus();
+ } else {
+ inFocus->clearFocus();
+ }
+ }
+ }
+ inFocus = 0;
+ oldFocus = 0;
+ }
+}
+
+bool QPEMenuToolFocusManager::isActive() const
+{
+ return !inFocus.isNull();
+}
+
+void QPEMenuToolFocusManager::moveFocus( bool next )
+{
+ if ( !isActive() )
+ return;
+
+ int n = list.count();
+ QValueList<GuardedWidget>::Iterator it;
+ it = list.find( inFocus );
+ if ( it == list.end() )
+ it = list.begin();
+ while ( --n ) {
+ if ( next ) {
+ ++it;
+ if ( it == list.end() )
+ it = list.begin();
+ } else {
+ if ( it == list.begin() )
+ it = list.end();
+ --it;
+ }
+ QWidget *w = (*it);
+ if ( w && w->isEnabled() && w->isVisible() &&
+ w->topLevelWidget() == qApp->activeWindow() ) {
+ setFocus( w, next );
+ return;
+ }
+ }
+}
+
+void QPEMenuToolFocusManager::initialize()
+{
+ if ( !me )
+ me = new QPEMenuToolFocusManager;
+}
+
+QPEMenuToolFocusManager *QPEMenuToolFocusManager::manager()
+{
+ if ( !me )
+ me = new QPEMenuToolFocusManager;
+
+ return me;
+}
+
+void QPEMenuToolFocusManager::setFocus( QWidget *w, bool next )
+{
+ inFocus = w;
+// qDebug( "Set focus on %s", w->className() );
+ if ( inFocus->inherits( "QMenuBar" ) ) {
+ QMenuBar *mb = (QMenuBar *)(QWidget *)inFocus;
+ if ( next )
+ mb->activateItemAt( 0 );
+ else
+ mb->activateItemAt( mb->count()-1 );
+ }
+ inFocus->setFocus();
+}
+
+bool QPEMenuToolFocusManager::eventFilter( QObject *object, QEvent *event )
+{
+ if ( event->type() == QEvent::KeyPress ) {
+ QKeyEvent *ke = (QKeyEvent *)event;
+ if ( isActive() ) {
+ if ( object->inherits( "QButton" ) ) {
+ switch ( ke->key() ) {
+ case Key_Left:
+ moveFocus( FALSE );
+ return TRUE;
+
+ case Key_Right:
+ moveFocus( TRUE );
+ return TRUE;
+
+ case Key_Up:
+ case Key_Down:
+ return TRUE;
+ }
+ } else if ( object->inherits( "QPopupMenu" ) ) {
+ // Deactivate when a menu item is selected
+ if ( ke->key() == Key_Enter || ke->key() == Key_Return ||
+ ke->key() == Key_Escape ) {
+ QTimer::singleShot( 0, this, SLOT(deactivate()) );
+ }
+ } else if ( object->inherits( "QMenuBar" ) ) {
+ int dx = 0;
+ switch ( ke->key() ) {
+ case Key_Left:
+ dx = -1;
+ break;
+
+ case Key_Right:
+ dx = 1;
+ break;
+ }
+
+ QMenuBarHack *mb = (QMenuBarHack *)object;
+ if ( dx && mb->activeItem() >= 0 ) {
+ int i = mb->activeItem();
+ int c = mb->count();
+ int n = c;
+ while ( n-- ) {
+ i = i + dx;
+ if ( i == c ) {
+ mb->goodbye();
+ moveFocus( TRUE );
+ return TRUE;
+ } else if ( i < 0 ) {
+ mb->goodbye();
+ moveFocus( FALSE );
+ return TRUE;
+ }
+ QMenuItem *mi = mb->findItem( mb->idAt(i) );
+ if ( mi->isEnabled() && !mi->isSeparator() ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+ if ( ke->key() == Key_F11 ) {
+ setActive( !isActive() );
+ return TRUE;
+ }
+ } else if ( event->type() == QEvent::KeyRelease ) {
+ QKeyEvent *ke = (QKeyEvent *)event;
+ if ( isActive() ) {
+ if ( object->inherits( "QButton" ) ) {
+ // Deactivate when a button is selected
+ if ( ke->key() == Key_Space )
+ QTimer::singleShot( 0, this, SLOT(deactivate()) );
+ }
+ }
+ } else if ( event->type() == QEvent::FocusIn ) {
+ if ( isActive() ) {
+ // A non-menu/tool widget has been selected - we're deactivated
+ QWidget *w = (QWidget *)object;
+ if ( !w->isPopup() && !list.contains( GuardedWidget( w ) ) ) {
+ inFocus = 0;
+ }
+ }
+ } else if ( event->type() == QEvent::Hide ) {
+ if ( isActive() ) {
+ // Deaticvate if a menu/tool has been hidden
+ QWidget *w = (QWidget *)object;
+ if ( !w->isPopup() && !list.contains( GuardedWidget( w ) ) ) {
+ setActive( FALSE );
+ }
+ }
+ } else if ( event->type() == QEvent::ChildInserted ) {
+ QChildEvent *ce = (QChildEvent *)event;
+ if ( ce->child()->inherits( "QMenuBar" ) ) {
+ addWidget( (QWidget *)ce->child() );
+ ce->child()->installEventFilter( this );
+ } else if ( object->inherits( "QToolBar" ) && ce->child()->isWidgetType() ) {
+ addWidget( (QWidget *)ce->child() );
+ }
+ } else if ( event->type() == QEvent::ChildRemoved ) {
+ QChildEvent *ce = (QChildEvent *)event;
+ if ( ce->child()->inherits( "QMenuBar" ) ) {
+ removeWidget( (QWidget *)ce->child() );
+ ce->child()->removeEventFilter( this );
+ } else if ( object->inherits( "QToolBar" ) && ce->child()->isWidgetType() ) {
+ removeWidget( (QWidget *)ce->child() );
+ }
+ }
+
+ return FALSE;
+}
+
+void QPEMenuToolFocusManager::deactivate()
+{
+ setActive( FALSE );
+}
+
+/*!
+ \class QPEMenuBar qpemenubar.h
+ \brief The QPEMenuBar class is obsolete. Use QMenuBar instead.
+
+ \obsolete
+
+ This class is obsolete. Use QMenuBar instead.
+
+ \sa QMenuBar
+*/
+
+/*!
+ Constructs a QPEMenuBar just as you would construct
+ a QMenuBar, passing \a parent and \a name.
+*/
+QPEMenuBar::QPEMenuBar( QWidget *parent, const char *name )
+ : QMenuBar( parent, name )
+{
+}
+
+/*!
+ \reimp
+*/
+QPEMenuBar::~QPEMenuBar()
+{
+}
+
+/*!
+ \internal
+*/
+void QPEMenuBar::keyPressEvent( QKeyEvent *e )
+{
+ QMenuBar::keyPressEvent( e );
+}
+