-rw-r--r-- | library/qpemenubar.cpp | 308 |
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 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2001 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of Qtopia Environment. | ||
5 | ** | ||
6 | ** This file may be distributed and/or modified under the terms of the | ||
7 | ** GNU General Public License version 2 as published by the Free Software | ||
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | ||
9 | ** packaging of this file. | ||
10 | ** | ||
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | ||
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | ||
13 | ** | ||
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
15 | ** | ||
16 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
17 | ** not clear to you. | ||
18 | ** | ||
19 | **********************************************************************/ | ||
20 | |||
21 | #define INCLUDE_MENUITEM_DEF | ||
22 | |||
23 | #include "qpemenubar.h" | ||
24 | #include <qapplication.h> | ||
25 | #include <qguardedptr.h> | ||
26 | #include <qtimer.h> | ||
27 | |||
28 | |||
29 | class QMenuBarHack : public QMenuBar | ||
30 | { | ||
31 | public: | ||
32 | int activeItem() const { return actItem; } | ||
33 | |||
34 | void goodbye() | ||
35 | { | ||
36 | activateItemAt(-1); | ||
37 | for ( unsigned int i = 0; i < count(); i++ ) { | ||
38 | QMenuItem *mi = findItem( idAt(i) ); | ||
39 | if ( mi->popup() ) { | ||
40 | mi->popup()->hide(); | ||
41 | } | ||
42 | } | ||
43 | } | ||
44 | }; | ||
45 | |||
46 | |||
47 | QPEMenuToolFocusManager *QPEMenuToolFocusManager::me = 0; | ||
48 | |||
49 | QPEMenuToolFocusManager::QPEMenuToolFocusManager() : QObject() | ||
50 | { | ||
51 | qApp->installEventFilter( this ); | ||
52 | } | ||
53 | |||
54 | void QPEMenuToolFocusManager::addWidget( QWidget *w ) | ||
55 | { | ||
56 | list.append( GuardedWidget(w) ); | ||
57 | } | ||
58 | |||
59 | void QPEMenuToolFocusManager::removeWidget( QWidget *w ) | ||
60 | { | ||
61 | list.remove( GuardedWidget(w) ); | ||
62 | } | ||
63 | |||
64 | void QPEMenuToolFocusManager::setActive( bool a ) | ||
65 | { | ||
66 | if ( a ) { | ||
67 | oldFocus = qApp->focusWidget(); | ||
68 | QValueList<GuardedWidget>::Iterator it; | ||
69 | it = list.begin(); | ||
70 | while ( it != list.end() ) { | ||
71 | QWidget *w = (*it); | ||
72 | if ( w && w->isEnabled() && w->isVisible() && | ||
73 | w->topLevelWidget() == qApp->activeWindow() ) { | ||
74 | setFocus( w ); | ||
75 | return; | ||
76 | } | ||
77 | ++it; | ||
78 | } | ||
79 | } else { | ||
80 | if ( inFocus ) { | ||
81 | if ( inFocus->inherits( "QMenuBar" ) ) | ||
82 | ((QMenuBarHack *)(QWidget *)inFocus)->goodbye(); | ||
83 | if ( inFocus->hasFocus() ) { | ||
84 | if ( oldFocus && oldFocus->isVisible() && oldFocus->isEnabled() ) { | ||
85 | oldFocus->setFocus(); | ||
86 | } else { | ||
87 | inFocus->clearFocus(); | ||
88 | } | ||
89 | } | ||
90 | } | ||
91 | inFocus = 0; | ||
92 | oldFocus = 0; | ||
93 | } | ||
94 | } | ||
95 | |||
96 | bool QPEMenuToolFocusManager::isActive() const | ||
97 | { | ||
98 | return !inFocus.isNull(); | ||
99 | } | ||
100 | |||
101 | void QPEMenuToolFocusManager::moveFocus( bool next ) | ||
102 | { | ||
103 | if ( !isActive() ) | ||
104 | return; | ||
105 | |||
106 | int n = list.count(); | ||
107 | QValueList<GuardedWidget>::Iterator it; | ||
108 | it = list.find( inFocus ); | ||
109 | if ( it == list.end() ) | ||
110 | it = list.begin(); | ||
111 | while ( --n ) { | ||
112 | if ( next ) { | ||
113 | ++it; | ||
114 | if ( it == list.end() ) | ||
115 | it = list.begin(); | ||
116 | } else { | ||
117 | if ( it == list.begin() ) | ||
118 | it = list.end(); | ||
119 | --it; | ||
120 | } | ||
121 | QWidget *w = (*it); | ||
122 | if ( w && w->isEnabled() && w->isVisible() && | ||
123 | w->topLevelWidget() == qApp->activeWindow() ) { | ||
124 | setFocus( w, next ); | ||
125 | return; | ||
126 | } | ||
127 | } | ||
128 | } | ||
129 | |||
130 | void QPEMenuToolFocusManager::initialize() | ||
131 | { | ||
132 | if ( !me ) | ||
133 | me = new QPEMenuToolFocusManager; | ||
134 | } | ||
135 | |||
136 | QPEMenuToolFocusManager *QPEMenuToolFocusManager::manager() | ||
137 | { | ||
138 | if ( !me ) | ||
139 | me = new QPEMenuToolFocusManager; | ||
140 | |||
141 | return me; | ||
142 | } | ||
143 | |||
144 | void QPEMenuToolFocusManager::setFocus( QWidget *w, bool next ) | ||
145 | { | ||
146 | inFocus = w; | ||
147 | // qDebug( "Set focus on %s", w->className() ); | ||
148 | if ( inFocus->inherits( "QMenuBar" ) ) { | ||
149 | QMenuBar *mb = (QMenuBar *)(QWidget *)inFocus; | ||
150 | if ( next ) | ||
151 | mb->activateItemAt( 0 ); | ||
152 | else | ||
153 | mb->activateItemAt( mb->count()-1 ); | ||
154 | } | ||
155 | inFocus->setFocus(); | ||
156 | } | ||
157 | |||
158 | bool QPEMenuToolFocusManager::eventFilter( QObject *object, QEvent *event ) | ||
159 | { | ||
160 | if ( event->type() == QEvent::KeyPress ) { | ||
161 | QKeyEvent *ke = (QKeyEvent *)event; | ||
162 | if ( isActive() ) { | ||
163 | if ( object->inherits( "QButton" ) ) { | ||
164 | switch ( ke->key() ) { | ||
165 | case Key_Left: | ||
166 | moveFocus( FALSE ); | ||
167 | return TRUE; | ||
168 | |||
169 | case Key_Right: | ||
170 | moveFocus( TRUE ); | ||
171 | return TRUE; | ||
172 | |||
173 | case Key_Up: | ||
174 | case Key_Down: | ||
175 | return TRUE; | ||
176 | } | ||
177 | } else if ( object->inherits( "QPopupMenu" ) ) { | ||
178 | // Deactivate when a menu item is selected | ||
179 | if ( ke->key() == Key_Enter || ke->key() == Key_Return || | ||
180 | ke->key() == Key_Escape ) { | ||
181 | QTimer::singleShot( 0, this, SLOT(deactivate()) ); | ||
182 | } | ||
183 | } else if ( object->inherits( "QMenuBar" ) ) { | ||
184 | int dx = 0; | ||
185 | switch ( ke->key() ) { | ||
186 | case Key_Left: | ||
187 | dx = -1; | ||
188 | break; | ||
189 | |||
190 | case Key_Right: | ||
191 | dx = 1; | ||
192 | break; | ||
193 | } | ||
194 | |||
195 | QMenuBarHack *mb = (QMenuBarHack *)object; | ||
196 | if ( dx && mb->activeItem() >= 0 ) { | ||
197 | int i = mb->activeItem(); | ||
198 | int c = mb->count(); | ||
199 | int n = c; | ||
200 | while ( n-- ) { | ||
201 | i = i + dx; | ||
202 | if ( i == c ) { | ||
203 | mb->goodbye(); | ||
204 | moveFocus( TRUE ); | ||
205 | return TRUE; | ||
206 | } else if ( i < 0 ) { | ||
207 | mb->goodbye(); | ||
208 | moveFocus( FALSE ); | ||
209 | return TRUE; | ||
210 | } | ||
211 | QMenuItem *mi = mb->findItem( mb->idAt(i) ); | ||
212 | if ( mi->isEnabled() && !mi->isSeparator() ) { | ||
213 | break; | ||
214 | } | ||
215 | } | ||
216 | } | ||
217 | } | ||
218 | } | ||
219 | if ( ke->key() == Key_F11 ) { | ||
220 | setActive( !isActive() ); | ||
221 | return TRUE; | ||
222 | } | ||
223 | } else if ( event->type() == QEvent::KeyRelease ) { | ||
224 | QKeyEvent *ke = (QKeyEvent *)event; | ||
225 | if ( isActive() ) { | ||
226 | if ( object->inherits( "QButton" ) ) { | ||
227 | // Deactivate when a button is selected | ||
228 | if ( ke->key() == Key_Space ) | ||
229 | QTimer::singleShot( 0, this, SLOT(deactivate()) ); | ||
230 | } | ||
231 | } | ||
232 | } else if ( event->type() == QEvent::FocusIn ) { | ||
233 | if ( isActive() ) { | ||
234 | // A non-menu/tool widget has been selected - we're deactivated | ||
235 | QWidget *w = (QWidget *)object; | ||
236 | if ( !w->isPopup() && !list.contains( GuardedWidget( w ) ) ) { | ||
237 | inFocus = 0; | ||
238 | } | ||
239 | } | ||
240 | } else if ( event->type() == QEvent::Hide ) { | ||
241 | if ( isActive() ) { | ||
242 | // Deaticvate if a menu/tool has been hidden | ||
243 | QWidget *w = (QWidget *)object; | ||
244 | if ( !w->isPopup() && !list.contains( GuardedWidget( w ) ) ) { | ||
245 | setActive( FALSE ); | ||
246 | } | ||
247 | } | ||
248 | } else if ( event->type() == QEvent::ChildInserted ) { | ||
249 | QChildEvent *ce = (QChildEvent *)event; | ||
250 | if ( ce->child()->inherits( "QMenuBar" ) ) { | ||
251 | addWidget( (QWidget *)ce->child() ); | ||
252 | ce->child()->installEventFilter( this ); | ||
253 | } else if ( object->inherits( "QToolBar" ) && ce->child()->isWidgetType() ) { | ||
254 | addWidget( (QWidget *)ce->child() ); | ||
255 | } | ||
256 | } else if ( event->type() == QEvent::ChildRemoved ) { | ||
257 | QChildEvent *ce = (QChildEvent *)event; | ||
258 | if ( ce->child()->inherits( "QMenuBar" ) ) { | ||
259 | removeWidget( (QWidget *)ce->child() ); | ||
260 | ce->child()->removeEventFilter( this ); | ||
261 | } else if ( object->inherits( "QToolBar" ) && ce->child()->isWidgetType() ) { | ||
262 | removeWidget( (QWidget *)ce->child() ); | ||
263 | } | ||
264 | } | ||
265 | |||
266 | return FALSE; | ||
267 | } | ||
268 | |||
269 | void QPEMenuToolFocusManager::deactivate() | ||
270 | { | ||
271 | setActive( FALSE ); | ||
272 | } | ||
273 | |||
274 | /*! | ||
275 | \class QPEMenuBar qpemenubar.h | ||
276 | \brief The QPEMenuBar class is obsolete. Use QMenuBar instead. | ||
277 | |||
278 | \obsolete | ||
279 | |||
280 | This class is obsolete. Use QMenuBar instead. | ||
281 | |||
282 | \sa QMenuBar | ||
283 | */ | ||
284 | |||
285 | /*! | ||
286 | Constructs a QPEMenuBar just as you would construct | ||
287 | a QMenuBar, passing \a parent and \a name. | ||
288 | */ | ||
289 | QPEMenuBar::QPEMenuBar( QWidget *parent, const char *name ) | ||
290 | : QMenuBar( parent, name ) | ||
291 | { | ||
292 | } | ||
293 | |||
294 | /*! | ||
295 | \reimp | ||
296 | */ | ||
297 | QPEMenuBar::~QPEMenuBar() | ||
298 | { | ||
299 | } | ||
300 | |||
301 | /*! | ||
302 | \internal | ||
303 | */ | ||
304 | void QPEMenuBar::keyPressEvent( QKeyEvent *e ) | ||
305 | { | ||
306 | QMenuBar::keyPressEvent( e ); | ||
307 | } | ||
308 | |||