source: trunk/src/gui/s60framework/qs60mainappui.cpp@ 561

Last change on this file since 561 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

  • Property svn:eol-style set to native
File size: 8.7 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the Symbian application wrapper of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42// INCLUDE FILES
43#include <exception>
44#include <avkon.hrh>
45#include <eikmenub.h>
46#include <eikmenup.h>
47#include <barsread.h>
48#include <s60main.rsg>
49#include <avkon.rsg>
50
51#include "qs60mainappui.h"
52#include <QtGui/qapplication.h>
53#include <QtGui/qsymbianevent.h>
54#include <QtGui/qmenu.h>
55#include <private/qmenu_p.h>
56#include <private/qt_s60_p.h>
57#include <qdebug.h>
58
59QT_BEGIN_NAMESPACE
60
61/*!
62 \class QS60MainAppUi
63 \since 4.6
64 \brief The QS60MainAppUi class is a helper class for S60 migration.
65
66 \warning This class is provided only to get access to S60 specific
67 functionality in the application framework classes. It is not
68 portable. We strongly recommend against using it in new applications.
69
70 The QS60MainAppUi provides a helper class for use in migrating from
71 existing S60 based applications to Qt based applications. It is used
72 in the exact same way as the \c CAknAppUi class from Symbian, but
73 internally provides extensions used by Qt.
74
75 When modifying old S60 applications that rely on implementing
76 functions in \c CAknAppUi, the class should be modified to inherit
77 from this class instead of \c CAknAppUi. Then the application can
78 choose to override only certain functions.
79
80 For more information on \c CAknAppUi, please see the S60
81 documentation.
82
83 Unlike other Qt classes, QS60MainAppUi behaves like an S60 class,
84 and can throw Symbian leaves.
85
86 \sa QS60MainDocument, QS60MainApplication
87 */
88
89/*!
90 * \brief Second phase Symbian constructor.
91 *
92 * Constructs all the elements of the class that can cause a leave to happen.
93 *
94 * If you override this function, you should call the base class implementation as well.
95 */
96void QS60MainAppUi::ConstructL()
97{
98 // Cone's heap and handle checks on app destruction are not suitable for Qt apps, as many
99 // objects can still exist in static data at that point. Instead we will print relevant information
100 // so that comparative checks may be made for memory leaks, using ~SPrintExitInfo in corelib.
101 iEikonEnv->DisableExitChecks(ETrue);
102
103 // Initialise app UI with standard value.
104 // ENoAppResourceFile and ENonStandardResourceFile makes UI to work without
105 // resource files in most SDKs. S60 3rd FP1 public seems to require resource file
106 // even these flags are defined
107 TInt flags = CAknAppUi::EAknEnableSkin;
108 if (QApplication::testAttribute(Qt::AA_S60DontConstructApplicationPanes)) {
109 flags |= CAknAppUi::ENoScreenFurniture | CAknAppUi::ENonStandardResourceFile;
110 }
111 BaseConstructL(flags);
112
113 if (!QApplication::testAttribute(Qt::AA_S60DontConstructApplicationPanes)) {
114 CEikButtonGroupContainer* nativeContainer = Cba();
115 nativeContainer->SetCommandSetL(R_AVKON_SOFTKEYS_EMPTY_WITH_IDS);
116 }
117}
118
119/*!
120 * \brief Contructs an instance of QS60MainAppUi.
121 */
122QS60MainAppUi::QS60MainAppUi()
123{
124 // No implementation required
125}
126
127/*!
128 * \brief Destroys the QS60MainAppUi.
129 */
130QS60MainAppUi::~QS60MainAppUi()
131{
132}
133
134/*!
135 * \brief Handles commands produced by the S60 framework.
136 *
137 * \a command holds the ID of the command to handle, and is S60 specific.
138 *
139 * If you override this function, you should call the base class implementation if you do not
140 * handle the command.
141 */
142void QS60MainAppUi::HandleCommandL(TInt command)
143{
144 if (qApp) {
145 QSymbianEvent event(QSymbianEvent::CommandEvent, command);
146 QT_TRYCATCH_LEAVING(qApp->symbianProcessEvent(&event));
147 }
148}
149
150/*!
151 * \brief Handles a resource change in the S60 framework.
152 *
153 * Resource changes include layout switches. \a type holds the type of resource change that
154 * occurred.
155 *
156 * If you override this function, you should call the base class implementation if you do not
157 * handle the resource change.
158 */
159void QS60MainAppUi::HandleResourceChangeL(TInt type)
160{
161 CAknAppUi::HandleResourceChangeL(type);
162
163 if (qApp) {
164 QSymbianEvent event(QSymbianEvent::ResourceChangeEvent, type);
165 QT_TRYCATCH_LEAVING(qApp->symbianProcessEvent(&event));
166 }
167}
168
169/*!
170 * \brief Handles raw window server events.
171 *
172 * The event type and information is passed in \a wsEvent, while the receiving control is passed in
173 * \a destination.
174 *
175 * If you override this function, you should call the base class implementation if you do not
176 * handle the event.
177 */
178void QS60MainAppUi::HandleWsEventL(const TWsEvent& wsEvent, CCoeControl *destination)
179{
180 int result = 0;
181 if (qApp) {
182 QSymbianEvent event(&wsEvent);
183 QT_TRYCATCH_LEAVING(
184 result = qApp->symbianProcessEvent(&event)
185 );
186 }
187
188 if (result <= 0)
189 CAknAppUi::HandleWsEventL(wsEvent, destination);
190}
191
192
193/*!
194 * \brief Handles changes to the status pane size.
195 *
196 * Called by the framework when the application status pane size is changed.
197 *
198 * If you override this function, you should call the base class implementation if you do not
199 * handle the size change.
200 */
201void QS60MainAppUi::HandleStatusPaneSizeChange()
202{
203 TRAP_IGNORE(HandleResourceChangeL(KInternalStatusPaneChange));
204 HandleStackedControlsResourceChange(KInternalStatusPaneChange);
205}
206
207/*!
208 * \brief Dynamically initializes a menu bar.
209 *
210 * The resource associated with the menu is given in \a resourceId, and the actual menu bar is
211 * passed in \a menuBar.
212 *
213 * If you override this function, you should call the base class implementation as well.
214 */
215void QS60MainAppUi::DynInitMenuBarL(TInt /* resourceId */, CEikMenuBar * /* menuBar */)
216{
217}
218
219/*!
220 * \brief Dynamically initializes a menu pane.
221 *
222 * The resource associated with the menu is given in \a resourceId, and the actual menu pane is
223 * passed in \a menuPane.
224 *
225 * If you override this function, you should call the base class implementation as well.
226 */
227void QS60MainAppUi::DynInitMenuPaneL(TInt resourceId, CEikMenuPane *menuPane)
228{
229 if (resourceId == R_QT_WRAPPERAPP_MENU) {
230 if (menuPane->NumberOfItemsInPane() <= 1)
231 QT_TRYCATCH_LEAVING(qt_symbian_show_toplevel(menuPane));
232
233 } else if (resourceId != R_AVKON_MENUPANE_FEP_DEFAULT
234 && resourceId != R_AVKON_MENUPANE_EDITTEXT_DEFAULT
235 && resourceId != R_AVKON_MENUPANE_LANGUAGE_DEFAULT) {
236 QT_TRYCATCH_LEAVING(qt_symbian_show_submenu(menuPane, resourceId));
237 }
238}
239
240/*!
241 * \brief Restores a menu window.
242 *
243 * The menu window to restore is given in \a menuWindow. The resource ID and type of menu is given
244 * in \a resourceId and \a menuType, respectively.
245 *
246 * If you override this function, you should call the base class implementation as well.
247 */
248void QS60MainAppUi::RestoreMenuL(CCoeControl* menuWindow, TInt resourceId, TMenuType menuType)
249{
250 if (resourceId >= QT_SYMBIAN_FIRST_MENU_ITEM && resourceId <= QT_SYMBIAN_LAST_MENU_ITEM) {
251 if (menuType == EMenuPane)
252 DynInitMenuPaneL(resourceId, (CEikMenuPane*)menuWindow);
253 else
254 DynInitMenuBarL(resourceId, (CEikMenuBar*)menuWindow);
255 } else {
256 CAknAppUi::RestoreMenuL(menuWindow, resourceId, menuType);
257 }
258}
259
260QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.