1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtGui module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 or version 3 as published by the Free
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22 ** following information to ensure the GNU Lesser General Public License
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 **
26 ** As a special exception, The Qt Company gives you certain additional
27 ** rights. These rights are described in The Qt Company LGPL Exception
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 **
30 ** GNU General Public License Usage
31 ** Alternatively, this file may be used under the terms of the GNU
32 ** General Public License version 3.0 as published by the Free Software
33 ** Foundation and appearing in the file LICENSE.GPL included in the
34 ** packaging of this file. Please review the following information to
35 ** ensure the GNU General Public License version 3.0 requirements will be
36 ** met: http://www.gnu.org/copyleft/gpl.html.
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include "qs60style.h"
43 #include "qs60style_p.h"
44 #include "qpainter.h"
45 #include "qstyleoption.h"
46 #include "qstyle.h"
47 #include "private/qapplication_p.h"
48 #include "private/qt_s60_p.h"
49 #include "private/qpixmap_raster_symbian_p.h"
50 #include "private/qcore_symbian_p.h"
51 #include "private/qvolatileimage_p.h"
52 #include "qapplication.h"
53 #include "qsettings.h"
54
55 #include <w32std.h>
56 #include <AknsConstants.h>
57 #include <aknconsts.h>
58 #include <AknsItemID.h>
59 #include <AknsUtils.h>
60 #include <AknsDrawUtils.h>
61 #include <AknsSkinInstance.h>
62 #include <AknsBasicBackgroundControlContext.h>
63 #include <avkon.mbg>
64 #include <AknFontAccess.h>
65 #include <AknLayoutFont.h>
66 #include <AknUtils.h>
67 #include <aknnavi.h>
68 #include <gulicon.h>
69 #include <AknBitmapAnimation.h>
70 #include <centralrepository.h>
71
72 #if !defined(QT_NO_STYLE_S60) || defined(QT_PLUGIN)
73
74 QT_BEGIN_NAMESPACE
75
76 enum TDrawType {
77 EDrawIcon,
78 EDrawGulIcon,
79 EDrawBackground,
80 EDrawAnimation,
81 ENoDraw
82 };
83
84 const TUid personalisationUID = { 0x101F876F };
85
86 enum TSupportRelease {
87 ES60_None = 0x0000, //indicates that the commonstyle should draw the graphics
88 ES60_3_1 = 0x0001,
89 ES60_3_2 = 0x0002,
90 ES60_5_0 = 0x0004,
91 ES60_5_1 = 0x0008,
92 ES60_5_2 = 0x0010,
93 ES60_5_3 = 0x0020,
94 ES60_5_4 = 0x0040,
95 ES60_3_X = ES60_3_1 | ES60_3_2,
96 // Releases before Symbian Foundation
97 ES60_PreSF = ES60_3_1 | ES60_3_2 | ES60_5_0,
98 // Releases before the S60 5.2
99 ES60_Pre52 = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1,
100 // Releases before S60 5.3
101 ES60_Pre53 = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1 | ES60_5_2,
102 // Releases before S60 5.4
103 ES60_Pre54 = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1 | ES60_5_2 | ES60_5_3,
104 // Add all new releases here
105 ES60_All = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1 | ES60_5_2 | ES60_5_3 | ES60_5_4
106 };
107
108 typedef struct {
109 const TAknsItemID &skinID; // Determines default theme graphics ID.
110 TDrawType drawType; // Determines which native drawing routine is used to draw this item.
111 int supportInfo; // Defines the S60 versions that use the default graphics.
112 // These two, define new graphics that are used in releases other than partMapEntry.supportInfo defined releases.
113 // In general, these are given in numeric form to allow style compilation in earlier
114 // native releases that do not contain the new graphics.
115 int newMajorSkinId;
116 int newMinorSkinId;
117 } partMapEntry;
118
AnimationData(const QS60StyleEnums::SkinParts part,int frames,int interval)119 AnimationData::AnimationData(const QS60StyleEnums::SkinParts part, int frames, int interval) : m_id(part),
120 m_frames(frames), m_interval(interval), m_mode(QS60StyleEnums::AM_Looping)
121 {
122 }
123
AnimationDataV2(const AnimationData & data)124 AnimationDataV2::AnimationDataV2(const AnimationData &data) : AnimationData(data.m_id, data.m_frames, data.m_interval),
125 m_animation(0), m_currentFrame(0), m_resourceBased(false), m_timerId(0)
126 {
127 }
~AnimationDataV2()128 AnimationDataV2::~AnimationDataV2()
129 {
130 delete m_animation;
131 }
132
QS60StyleAnimation(const QS60StyleEnums::SkinParts part,int frames,int interval)133 QS60StyleAnimation::QS60StyleAnimation(const QS60StyleEnums::SkinParts part, int frames, int interval)
134 {
135 m_defaultData.reset(new AnimationData(part, frames, interval));
136 m_currentData.reset(new AnimationDataV2(*m_defaultData));
137 }
138
~QS60StyleAnimation()139 QS60StyleAnimation::~QS60StyleAnimation()
140 {
141 }
142
setAnimationObject(CAknBitmapAnimation * animation)143 void QS60StyleAnimation::setAnimationObject(CAknBitmapAnimation* animation)
144 {
145 Q_ASSERT(animation);
146 if (m_currentData->m_animation)
147 delete m_currentData->m_animation;
148 m_currentData->m_animation = animation;
149 }
150
resetToDefaults()151 void QS60StyleAnimation::resetToDefaults()
152 {
153 m_currentData.reset(new AnimationDataV2(*m_defaultData));
154 }
155
156 class QS60StyleModeSpecifics
157 {
158 public:
159 static QPixmap skinnedGraphics(QS60StyleEnums::SkinParts stylepart,
160 const QSize &size, QS60StylePrivate::SkinElementFlags flags);
161 static QPixmap skinnedGraphics(QS60StylePrivate::SkinFrameElements frameElement, const QSize &size, QS60StylePrivate::SkinElementFlags flags);
162 static QPixmap colorSkinnedGraphics(const QS60StyleEnums::SkinParts &stylepart,
163 const QSize &size, QPainter *painter, QS60StylePrivate::SkinElementFlags flags);
164 static QColor colorValue(const TAknsItemID &colorGroup, int colorIndex);
165 static QPixmap fromFbsBitmap(CFbsBitmap *icon, CFbsBitmap *mask, QS60StylePrivate::SkinElementFlags flags, const TSize& targetSize);
166 static bool disabledPartGraphic(QS60StyleEnums::SkinParts &part);
167 static bool disabledFrameGraphic(QS60StylePrivate::SkinFrameElements &frame);
168 static QPixmap generateMissingThemeGraphic(QS60StyleEnums::SkinParts &part, const QSize &size, QS60StylePrivate::SkinElementFlags flags);
169 static TAknsItemID partSpecificThemeId(int part);
170
171 static QVariant themeDefinition(QS60StyleEnums::ThemeDefinitions definition, QS60StyleEnums::SkinParts part);
172
173 private:
174 static QPixmap createSkinnedGraphicsLX(QS60StyleEnums::SkinParts part,
175 const QSize &size, QS60StylePrivate::SkinElementFlags flags);
176 static QPixmap createSkinnedGraphicsLX(QS60StylePrivate::SkinFrameElements frameElement, const QSize &size, QS60StylePrivate::SkinElementFlags flags);
177 static QPixmap colorSkinnedGraphicsLX(const QS60StyleEnums::SkinParts &stylepart,
178 const QSize &size, QPainter *painter, QS60StylePrivate::SkinElementFlags flags);
179 static void frameIdAndCenterId(QS60StylePrivate::SkinFrameElements frameElement, TAknsItemID &frameId, TAknsItemID ¢erId);
180 static TRect innerRectFromElement(QS60StylePrivate::SkinFrameElements frameElement, const TRect &outerRect);
181 static void fallbackInfo(const QS60StyleEnums::SkinParts &stylePart, TInt &fallbackIndex);
182 static bool checkSupport(const int supportedRelease);
183 // Array to match the skin ID, fallback graphics and Qt widget graphics.
184 static const partMapEntry m_partMap[];
185 };
186
187 const partMapEntry QS60StyleModeSpecifics::m_partMap[] = {
188 /* SP_QgnGrafBarWaitAnim */ {KAknsIIDQgnGrafBarWaitAnim, EDrawAnimation, ES60_All, -1,-1},
189 /* SP_QgnGrafBarFrameCenter */ {KAknsIIDQgnGrafBarFrameCenter, EDrawIcon, ES60_All, -1,-1},
190 /* SP_QgnGrafBarFrameSideL */ {KAknsIIDQgnGrafBarFrameSideL, EDrawIcon, ES60_All, -1,-1},
191 /* SP_QgnGrafBarFrameSideR */ {KAknsIIDQgnGrafBarFrameSideR, EDrawIcon, ES60_All, -1,-1},
192 /* SP_QgnGrafBarProgress */ {KAknsIIDQgnGrafBarProgress, EDrawIcon, ES60_All, -1,-1},
193 // No drop area for 3.x non-touch devices
194 /* SP_QgnGrafOrgBgGrid */ {KAknsIIDNone, EDrawIcon, ES60_3_X, EAknsMajorGeneric ,0x1eba}, //KAknsIIDQgnGrafOrgBgGrid
195 /* SP_QgnGrafScrollArrowDown */ {KAknsIIDQgnGrafScrollArrowDown, EDrawGulIcon, ES60_All, -1,-1},
196 /* SP_QgnGrafScrollArrowLeft */ {KAknsIIDQgnGrafScrollArrowLeft, EDrawGulIcon, ES60_All, -1,-1},
197 /* SP_QgnGrafScrollArrowRight */ {KAknsIIDQgnGrafScrollArrowRight, EDrawGulIcon, ES60_All, -1,-1},
198 /* SP_QgnGrafScrollArrowUp */ {KAknsIIDQgnGrafScrollArrowUp, EDrawGulIcon, ES60_All, -1,-1},
199
200 // In S60 5.3 there is a new tab graphic
201 /* SP_QgnGrafTabActiveL */ {KAknsIIDQgnGrafTabActiveL, EDrawIcon, ES60_Pre53, EAknsMajorSkin, 0x2219}, //KAknsIIDQtgFrTabActiveNormalL
202 /* SP_QgnGrafTabActiveM */ {KAknsIIDQgnGrafTabActiveM, EDrawIcon, ES60_Pre53, EAknsMajorSkin, 0x221b}, //KAknsIIDQtgFrTabActiveNormalC
203 /* SP_QgnGrafTabActiveR */ {KAknsIIDQgnGrafTabActiveR, EDrawIcon, ES60_Pre53, EAknsMajorSkin, 0x221a}, //KAknsIIDQtgFrTabActiveNormalR
204 /* SP_QgnGrafTabPassiveL */ {KAknsIIDQgnGrafTabPassiveL, EDrawIcon, ES60_Pre53, EAknsMajorSkin, 0x2221}, //KAknsIIDQtgFrTabPassiveNormalL
205 /* SP_QgnGrafTabPassiveM */ {KAknsIIDQgnGrafTabPassiveM, EDrawIcon, ES60_Pre53, EAknsMajorSkin, 0x2223}, //KAknsIIDQtgFrTabPassiveNormalC
206 /* SP_QgnGrafTabPassiveR */ {KAknsIIDQgnGrafTabPassiveR, EDrawIcon, ES60_Pre53, EAknsMajorSkin, 0x2222}, //KAknsIIDQtgFrTabPassiveNormalR
207
208 // In 3.1 there is no slider groove.
209 /* SP_QgnGrafNsliderEndLeft */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x19cf /* KAknsIIDQgnGrafNsliderEndLeft */},
210 /* SP_QgnGrafNsliderEndRight */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x19d0 /* KAknsIIDQgnGrafNsliderEndRight */},
211 /* SP_QgnGrafNsliderMiddle */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x19d2 /* KAknsIIDQgnGrafNsliderMiddle */},
212 /* SP_QgnIndiCheckboxOff */ {KAknsIIDQgnIndiCheckboxOff, EDrawIcon, ES60_All, -1,-1},
213 /* SP_QgnIndiCheckboxOn */ {KAknsIIDQgnIndiCheckboxOn, EDrawIcon, ES60_All, -1,-1},
214
215 // Following 5 items (SP_QgnIndiHlColSuper - SP_QgnIndiHlLineStraight) are available starting from S60 release 3.2.
216 // In 3.1 CommonStyle drawing is used for these QTreeView elements, since no similar icons in AVKON UI.
217 /* SP_QgnIndiHlColSuper */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x17d5 /* KAknsIIDQgnIndiHlColSuper */},
218 /* SP_QgnIndiHlExpSuper */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x17d6 /* KAknsIIDQgnIndiHlExpSuper */},
219 /* SP_QgnIndiHlLineBranch */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x17d7 /* KAknsIIDQgnIndiHlLineBranch */},
220 /* SP_QgnIndiHlLineEnd */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x17d8 /* KAknsIIDQgnIndiHlLineEnd */},
221 /* SP_QgnIndiHlLineStraight */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x17d9 /* KAknsIIDQgnIndiHlLineStraight */},
222 /* SP_QgnIndiMarkedAdd */ {KAknsIIDQgnIndiMarkedAdd, EDrawIcon, ES60_All, -1,-1},
223 /* SP_QgnIndiNaviArrowLeft */ {KAknsIIDQgnIndiNaviArrowLeft, EDrawIcon, ES60_All, -1,-1},
224 /* SP_QgnIndiNaviArrowRight */ {KAknsIIDQgnIndiNaviArrowRight, EDrawIcon, ES60_All, -1,-1},
225 /* SP_QgnIndiRadiobuttOff */ {KAknsIIDQgnIndiRadiobuttOff, EDrawIcon, ES60_All, -1,-1},
226 /* SP_QgnIndiRadiobuttOn */ {KAknsIIDQgnIndiRadiobuttOn, EDrawIcon, ES60_All, -1,-1},
227
228 // In 3.1 there different slider graphic and no pressed state.
229 /* SP_QgnGrafNsliderMarker */ {KAknsIIDQgnIndiSliderEdit, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x19d1 /* KAknsIIDQgnGrafNsliderMarker */},
230 /* SP_QgnGrafNsliderMarkerSelected */ {KAknsIIDQgnIndiSliderEdit, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x1a4a /* KAknsIIDQgnGrafNsliderMarkerSelected */},
231 /* SP_QgnIndiSubmenu */ {KAknsIIDQgnIndiSubmenu, EDrawIcon, ES60_All, -1,-1},
232 /* SP_QgnNoteErased */ {KAknsIIDQgnNoteErased, EDrawIcon, ES60_All, -1,-1},
233 /* SP_QgnNoteError */ {KAknsIIDQgnNoteError, EDrawIcon, ES60_All, -1,-1},
234 /* SP_QgnNoteInfo */ {KAknsIIDQgnNoteInfo, EDrawIcon, ES60_All, -1,-1},
235 /* SP_QgnNoteOk */ {KAknsIIDQgnNoteOk, EDrawIcon, ES60_All, -1,-1},
236 /* SP_QgnNoteQuery */ {KAknsIIDQgnNoteQuery, EDrawIcon, ES60_All, -1,-1},
237 /* SP_QgnNoteWarning */ {KAknsIIDQgnNoteWarning, EDrawIcon, ES60_All, -1,-1},
238 /* SP_QgnPropFileSmall */ {KAknsIIDQgnPropFileSmall, EDrawIcon, ES60_All, -1,-1},
239 /* SP_QgnPropFolderCurrent */ {KAknsIIDQgnPropFolderCurrent, EDrawIcon, ES60_All, -1,-1},
240 /* SP_QgnPropFolderSmall */ {KAknsIIDQgnPropFolderSmall, EDrawIcon, ES60_All, -1,-1},
241 /* SP_QgnPropFolderSmallNew */ {KAknsIIDQgnPropFolderSmallNew, EDrawIcon, ES60_All, -1,-1},
242 /* SP_QgnPropPhoneMemcLarge */ {KAknsIIDQgnPropPhoneMemcLarge, EDrawIcon, ES60_All, -1,-1},
243
244 // Toolbar graphics is different in 3.1/3.2 vs. 5.0
245 /* SP_QgnFrSctrlButtonCornerTl */ {KAknsIIDQsnFrButtonTbCornerTl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2301}, /* KAknsIIDQgnFrSctrlButtonCornerTl*/
246 /* SP_QgnFrSctrlButtonCornerTr */ {KAknsIIDQsnFrButtonTbCornerTr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2302},
247 /* SP_QgnFrSctrlButtonCornerBl */ {KAknsIIDQsnFrButtonTbCornerBl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2303},
248 /* SP_QgnFrSctrlButtonCornerBr */ {KAknsIIDQsnFrButtonTbCornerBr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2304},
249 /* SP_QgnFrSctrlButtonSideT */ {KAknsIIDQsnFrButtonTbSideT, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2305},
250 /* SP_QgnFrSctrlButtonSideB */ {KAknsIIDQsnFrButtonTbSideB, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2306},
251 /* SP_QgnFrSctrlButtonSideL */ {KAknsIIDQsnFrButtonTbSideL, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2307},
252 /* SP_QgnFrSctrlButtonSideR */ {KAknsIIDQsnFrButtonTbSideR, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2308},
253 /* SP_QgnFrSctrlButtonCenter */ {KAknsIIDQsnFrButtonTbCenter, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2309}, /*KAknsIIDQgnFrSctrlButtonCenter*/
254
255 // No pressed state for toolbar button in 3.1/3.2.
256 /* SP_QgnFrSctrlButtonCornerTlPressed */ {KAknsIIDQsnFrButtonTbCornerTl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2621}, /*KAknsIIDQgnFrSctrlButtonCornerTlPressed*/
257 /* SP_QgnFrSctrlButtonCornerTrPressed */ {KAknsIIDQsnFrButtonTbCornerTr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2622},
258 /* SP_QgnFrSctrlButtonCornerBlPressed */ {KAknsIIDQsnFrButtonTbCornerBl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2623},
259 /* SP_QgnFrSctrlButtonCornerBrPressed */ {KAknsIIDQsnFrButtonTbCornerBr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2624},
260 /* SP_QgnFrSctrlButtonSideTPressed */ {KAknsIIDQsnFrButtonTbSideT, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2625},
261 /* SP_QgnFrSctrlButtonSideBPressed */ {KAknsIIDQsnFrButtonTbSideB, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2626},
262 /* SP_QgnFrSctrlButtonSideLPressed */ {KAknsIIDQsnFrButtonTbSideL, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2627},
263 /* SP_QgnFrSctrlButtonSideRPressed */ {KAknsIIDQsnFrButtonTbSideR, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2628},
264 /* SP_QgnFrSctrlButtonCenterPressed */ {KAknsIIDQsnFrButtonTbCenter, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2629},
265
266 // 3.1 & 3.2 do not have pressed state for scrollbar, so use normal scrollbar graphics instead.
267 /* SP_QsnCpScrollHandleBottomPressed*/ {KAknsIIDQsnCpScrollHandleBottom, EDrawIcon, ES60_3_X, EAknsMajorGeneric, 0x20f8}, /*KAknsIIDQsnCpScrollHandleBottomPressed*/
268 /* SP_QsnCpScrollHandleMiddlePressed*/ {KAknsIIDQsnCpScrollHandleMiddle, EDrawIcon, ES60_3_X, EAknsMajorGeneric, 0x20f9}, /*KAknsIIDQsnCpScrollHandleMiddlePressed*/
269 /* SP_QsnCpScrollHandleTopPressed*/ {KAknsIIDQsnCpScrollHandleTop, EDrawIcon, ES60_3_X, EAknsMajorGeneric, 0x20fa}, /*KAknsIIDQsnCpScrollHandleTopPressed*/
270
271 /* SP_QsnBgScreen */ {KAknsIIDQsnBgScreen, EDrawBackground, ES60_All, -1,-1},
272
273 /* SP_QsnCpScrollBgBottom */ {KAknsIIDQsnCpScrollBgBottom, EDrawIcon, ES60_All, -1,-1},
274 /* SP_QsnCpScrollBgMiddle */ {KAknsIIDQsnCpScrollBgMiddle, EDrawIcon, ES60_All, -1,-1},
275 /* SP_QsnCpScrollBgTop */ {KAknsIIDQsnCpScrollBgTop, EDrawIcon, ES60_All, -1,-1},
276
277 /* SP_QsnCpScrollHandleBottom */ {KAknsIIDQsnCpScrollHandleBottom, EDrawIcon, ES60_All, -1,-1},
278 /* SP_QsnCpScrollHandleMiddle */ {KAknsIIDQsnCpScrollHandleMiddle, EDrawIcon, ES60_All, -1,-1},
279 /* SP_QsnCpScrollHandleTop */ {KAknsIIDQsnCpScrollHandleTop, EDrawIcon, ES60_All, -1,-1},
280
281 /* SP_QsnFrButtonTbCornerTl */ {KAknsIIDQsnFrButtonTbCornerTl, ENoDraw, ES60_All, -1, -1},
282 /* SP_QsnFrButtonTbCornerTr */ {KAknsIIDQsnFrButtonTbCornerTr, ENoDraw, ES60_All, -1, -1},
283 /* SP_QsnFrButtonTbCornerBl */ {KAknsIIDQsnFrButtonTbCornerBl, ENoDraw, ES60_All, -1, -1},
284 /* SP_QsnFrButtonTbCornerBr */ {KAknsIIDQsnFrButtonTbCornerBr, ENoDraw, ES60_All, -1, -1},
285 /* SP_QsnFrButtonTbSideT */ {KAknsIIDQsnFrButtonTbSideT, ENoDraw, ES60_All, -1, -1},
286 /* SP_QsnFrButtonTbSideB */ {KAknsIIDQsnFrButtonTbSideB, ENoDraw, ES60_All, -1, -1},
287 /* SP_QsnFrButtonTbSideL */ {KAknsIIDQsnFrButtonTbSideL, ENoDraw, ES60_All, -1, -1},
288 /* SP_QsnFrButtonTbSideR */ {KAknsIIDQsnFrButtonTbSideR, ENoDraw, ES60_All, -1, -1},
289 /* SP_QsnFrButtonTbCenter */ {KAknsIIDQsnFrButtonTbCenter, EDrawIcon, ES60_All, -1, -1},
290
291 /* SP_QsnFrButtonTbCornerTlPressed */{KAknsIIDQsnFrButtonTbCornerTlPressed, ENoDraw, ES60_All, -1,-1},
292 /* SP_QsnFrButtonTbCornerTrPressed */{KAknsIIDQsnFrButtonTbCornerTrPressed, ENoDraw, ES60_All, -1,-1},
293 /* SP_QsnFrButtonTbCornerBlPressed */{KAknsIIDQsnFrButtonTbCornerBlPressed, ENoDraw, ES60_All, -1,-1},
294 /* SP_QsnFrButtonTbCornerBrPressed */{KAknsIIDQsnFrButtonTbCornerBrPressed, ENoDraw, ES60_All, -1,-1},
295 /* SP_QsnFrButtonTbSideTPressed */ {KAknsIIDQsnFrButtonTbSideTPressed, ENoDraw, ES60_All, -1,-1},
296 /* SP_QsnFrButtonTbSideBPressed */ {KAknsIIDQsnFrButtonTbSideBPressed, ENoDraw, ES60_All, -1,-1},
297 /* SP_QsnFrButtonTbSideLPressed */ {KAknsIIDQsnFrButtonTbSideLPressed, ENoDraw, ES60_All, -1,-1},
298 /* SP_QsnFrButtonTbSideRPressed */ {KAknsIIDQsnFrButtonTbSideRPressed, ENoDraw, ES60_All, -1,-1},
299 /* SP_QsnFrButtonTbCenterPressed */ {KAknsIIDQsnFrButtonTbCenterPressed, EDrawIcon, ES60_All, -1,-1},
300
301 /* SP_QsnFrCaleCornerTl */ {KAknsIIDQsnFrCaleCornerTl, ENoDraw, ES60_All, -1,-1},
302 /* SP_QsnFrCaleCornerTr */ {KAknsIIDQsnFrCaleCornerTr, ENoDraw, ES60_All, -1,-1},
303 /* SP_QsnFrCaleCornerBl */ {KAknsIIDQsnFrCaleCornerBl, ENoDraw, ES60_All, -1,-1},
304 /* SP_QsnFrCaleCornerBr */ {KAknsIIDQsnFrCaleCornerBr, ENoDraw, ES60_All, -1,-1},
305 /* SP_QsnFrCaleSideT */ {KAknsIIDQsnFrCaleSideT, ENoDraw, ES60_All, -1,-1},
306 /* SP_QsnFrCaleSideB */ {KAknsIIDQsnFrCaleSideB, ENoDraw, ES60_All, -1,-1},
307 /* SP_QsnFrCaleSideL */ {KAknsIIDQsnFrCaleSideL, ENoDraw, ES60_All, -1,-1},
308 /* SP_QsnFrCaleSideR */ {KAknsIIDQsnFrCaleSideR, ENoDraw, ES60_All, -1,-1},
309 /* SP_QsnFrCaleCenter */ {KAknsIIDQsnFrCaleCenter, ENoDraw, ES60_All, -1,-1},
310
311 /* SP_QsnFrCaleHeadingCornerTl */ {KAknsIIDQsnFrCaleHeadingCornerTl, ENoDraw, ES60_All, -1,-1},
312 /* SP_QsnFrCaleHeadingCornerTr */ {KAknsIIDQsnFrCaleHeadingCornerTr, ENoDraw, ES60_All, -1,-1},
313 /* SP_QsnFrCaleHeadingCornerBl */ {KAknsIIDQsnFrCaleHeadingCornerBl, ENoDraw, ES60_All, -1,-1},
314 /* SP_QsnFrCaleHeadingCornerBr */ {KAknsIIDQsnFrCaleHeadingCornerBr, ENoDraw, ES60_All, -1,-1},
315 /* SP_QsnFrCaleHeadingSideT */ {KAknsIIDQsnFrCaleHeadingSideT, ENoDraw, ES60_All, -1,-1},
316 /* SP_QsnFrCaleHeadingSideB */ {KAknsIIDQsnFrCaleHeadingSideB, ENoDraw, ES60_All, -1,-1},
317 /* SP_QsnFrCaleHeadingSideL */ {KAknsIIDQsnFrCaleHeadingSideL, ENoDraw, ES60_All, -1,-1},
318 /* SP_QsnFrCaleHeadingSideR */ {KAknsIIDQsnFrCaleHeadingSideR, ENoDraw, ES60_All, -1,-1},
319 /* SP_QsnFrCaleHeadingCenter */ {KAknsIIDQsnFrCaleHeadingCenter, ENoDraw, ES60_All, -1,-1},
320
321 /* SP_QsnFrInputCornerTl */ {KAknsIIDQsnFrInputCornerTl, ENoDraw, ES60_All, -1,-1},
322 /* SP_QsnFrInputCornerTr */ {KAknsIIDQsnFrInputCornerTr, ENoDraw, ES60_All, -1,-1},
323 /* SP_QsnFrInputCornerBl */ {KAknsIIDQsnFrInputCornerBl, ENoDraw, ES60_All, -1,-1},
324 /* SP_QsnFrInputCornerBr */ {KAknsIIDQsnFrInputCornerBr, ENoDraw, ES60_All, -1,-1},
325 /* SP_QsnFrInputSideT */ {KAknsIIDQsnFrInputSideT, ENoDraw, ES60_All, -1,-1},
326 /* SP_QsnFrInputSideB */ {KAknsIIDQsnFrInputSideB, ENoDraw, ES60_All, -1,-1},
327 /* SP_QsnFrInputSideL */ {KAknsIIDQsnFrInputSideL, ENoDraw, ES60_All, -1,-1},
328 /* SP_QsnFrInputSideR */ {KAknsIIDQsnFrInputSideR, ENoDraw, ES60_All, -1,-1},
329 /* SP_QsnFrInputCenter */ {KAknsIIDQsnFrInputCenter, ENoDraw, ES60_All, -1,-1},
330
331 /* SP_QsnFrListCornerTl */ {KAknsIIDQsnFrListCornerTl, ENoDraw, ES60_All, -1,-1},
332 /* SP_QsnFrListCornerTr */ {KAknsIIDQsnFrListCornerTr, ENoDraw, ES60_All, -1,-1},
333 /* SP_QsnFrListCornerBl */ {KAknsIIDQsnFrListCornerBl, ENoDraw, ES60_All, -1,-1},
334 /* SP_QsnFrListCornerBr */ {KAknsIIDQsnFrListCornerBr, ENoDraw, ES60_All, -1,-1},
335 /* SP_QsnFrListSideT */ {KAknsIIDQsnFrListSideT, ENoDraw, ES60_All, -1,-1},
336 /* SP_QsnFrListSideB */ {KAknsIIDQsnFrListSideB, ENoDraw, ES60_All, -1,-1},
337 /* SP_QsnFrListSideL */ {KAknsIIDQsnFrListSideL, ENoDraw, ES60_All, -1,-1},
338 /* SP_QsnFrListSideR */ {KAknsIIDQsnFrListSideR, ENoDraw, ES60_All, -1,-1},
339 /* SP_QsnFrListCenter */ {KAknsIIDQsnFrListCenter, ENoDraw, ES60_All, -1,-1},
340
341 /* SP_QsnFrPopupCornerTl */ {KAknsIIDQsnFrPopupCornerTl, ENoDraw, ES60_All, -1,-1},
342 /* SP_QsnFrPopupCornerTr */ {KAknsIIDQsnFrPopupCornerTr, ENoDraw, ES60_All, -1,-1},
343 /* SP_QsnFrPopupCornerBl */ {KAknsIIDQsnFrPopupCornerBl, ENoDraw, ES60_All, -1,-1},
344 /* SP_QsnFrPopupCornerBr */ {KAknsIIDQsnFrPopupCornerBr, ENoDraw, ES60_All, -1,-1},
345 /* SP_QsnFrPopupSideT */ {KAknsIIDQsnFrPopupSideT, ENoDraw, ES60_All, -1,-1},
346 /* SP_QsnFrPopupSideB */ {KAknsIIDQsnFrPopupSideB, ENoDraw, ES60_All, -1,-1},
347 /* SP_QsnFrPopupSideL */ {KAknsIIDQsnFrPopupSideL, ENoDraw, ES60_All, -1,-1},
348 /* SP_QsnFrPopupSideR */ {KAknsIIDQsnFrPopupSideR, ENoDraw, ES60_All, -1,-1},
349 /* SP_QsnFrPopupCenter */ {KAknsIIDQsnFrPopupCenterSubmenu, ENoDraw, ES60_All, -1,-1},
350
351 // ToolTip graphics different in 3.1 vs. 3.2+.
352 /* SP_QsnFrPopupPreviewCornerTl */ {KAknsIIDQsnFrPopupCornerTl, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c5}, /* KAknsIIDQsnFrPopupPreviewCornerTl */
353 /* SP_QsnFrPopupPreviewCornerTr */ {KAknsIIDQsnFrPopupCornerTr, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c6},
354 /* SP_QsnFrPopupPreviewCornerBl */ {KAknsIIDQsnFrPopupCornerBl, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c3},
355 /* SP_QsnFrPopupPreviewCornerBr */ {KAknsIIDQsnFrPopupCornerBr, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c4},
356 /* SP_QsnFrPopupPreviewSideT */ {KAknsIIDQsnFrPopupSideT, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19ca},
357 /* SP_QsnFrPopupPreviewSideB */ {KAknsIIDQsnFrPopupSideB, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c7},
358 /* SP_QsnFrPopupPreviewSideL */ {KAknsIIDQsnFrPopupSideL, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c8},
359 /* SP_QsnFrPopupPreviewSideR */ {KAknsIIDQsnFrPopupSideR, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c9},
360 /* SP_QsnFrPopupPreviewCenter */ {KAknsIIDQsnFrPopupCenter, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c2},
361
362 /* SP_QsnFrSetOptCornerTl */ {KAknsIIDQsnFrSetOptCornerTl, ENoDraw, ES60_All, -1,-1},
363 /* SP_QsnFrSetOptCornerTr */ {KAknsIIDQsnFrSetOptCornerTr, ENoDraw, ES60_All, -1,-1},
364 /* SP_QsnFrSetOptCornerBl */ {KAknsIIDQsnFrSetOptCornerBl, ENoDraw, ES60_All, -1,-1},
365 /* SP_QsnFrSetOptCornerBr */ {KAknsIIDQsnFrSetOptCornerBr, ENoDraw, ES60_All, -1,-1},
366 /* SP_QsnFrSetOptSideT */ {KAknsIIDQsnFrSetOptSideT, ENoDraw, ES60_All, -1,-1},
367 /* SP_QsnFrSetOptSideB */ {KAknsIIDQsnFrSetOptSideB, ENoDraw, ES60_All, -1,-1},
368 /* SP_QsnFrSetOptSideL */ {KAknsIIDQsnFrSetOptSideL, ENoDraw, ES60_All, -1,-1},
369 /* SP_QsnFrSetOptSideR */ {KAknsIIDQsnFrSetOptSideR, ENoDraw, ES60_All, -1,-1},
370 /* SP_QsnFrSetOptCenter */ {KAknsIIDQsnFrSetOptCenter, ENoDraw, ES60_All, -1,-1},
371
372 // No toolbar frame for 5.0+ releases.
373 /* SP_QsnFrPopupSubCornerTl */ {KAknsIIDQsnFrPopupSubCornerTl, ENoDraw, ES60_3_X, -1,-1},
374 /* SP_QsnFrPopupSubCornerTr */ {KAknsIIDQsnFrPopupSubCornerTr, ENoDraw, ES60_3_X, -1,-1},
375 /* SP_QsnFrPopupSubCornerBl */ {KAknsIIDQsnFrPopupSubCornerBl, ENoDraw, ES60_3_X, -1,-1},
376 /* SP_QsnFrPopupSubCornerBr */ {KAknsIIDQsnFrPopupSubCornerBr, ENoDraw, ES60_3_X, -1,-1},
377 /* SP_QsnFrPopupSubSideT */ {KAknsIIDQsnFrPopupSubSideT, ENoDraw, ES60_3_X, -1,-1},
378 /* SP_QsnFrPopupSubSideB */ {KAknsIIDQsnFrPopupSubSideB, ENoDraw, ES60_3_X, -1,-1},
379 /* SP_QsnFrPopupSubSideL */ {KAknsIIDQsnFrPopupSubSideL, ENoDraw, ES60_3_X, -1,-1},
380 /* SP_QsnFrPopupSubSideR */ {KAknsIIDQsnFrPopupSubSideR, ENoDraw, ES60_3_X, -1,-1},
381 /* SP_QsnFrPopupSubCenter */ {KAknsIIDQsnFrPopupCenterSubmenu, ENoDraw, ES60_3_X, -1,-1},
382
383 // No inactive button graphics in 3.1/3.2
384 /* SP_QsnFrButtonCornerTlInactive */ {KAknsIIDQsnFrButtonTbCornerTl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b1}, /*KAknsIIDQsnFrButtonCornerTlInactive*/
385 /* SP_QsnFrButtonCornerTrInactive */ {KAknsIIDQsnFrButtonTbCornerTr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b2},
386 /* SP_QsnFrButtonCornerBlInactive */ {KAknsIIDQsnFrButtonTbCornerBl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b3},
387 /* SP_QsnFrButtonCornerTrInactive */ {KAknsIIDQsnFrButtonTbCornerBr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b4},
388 /* SP_QsnFrButtonSideTInactive */ {KAknsIIDQsnFrButtonTbSideT, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b5},
389 /* SP_QsnFrButtonSideBInactive */ {KAknsIIDQsnFrButtonTbSideB, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b6},
390 /* SP_QsnFrButtonSideLInactive */ {KAknsIIDQsnFrButtonTbSideL, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b7},
391 /* SP_QsnFrButtonSideRInactive */ {KAknsIIDQsnFrButtonTbSideR, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b8},
392 /* SP_QsnFrButtonCenterInactive */ {KAknsIIDQsnFrButtonTbCenter, EDrawIcon, ES60_3_X, EAknsMajorSkin, 0x21b9},
393
394 // No pressed down grid in 3.1/3.2
395 /* SP_QsnFrGridCornerTlPressed */ {KAknsIIDQsnFrGridCornerTl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2681}, /*KAknsIIDQsnFrGridCornerTlPressed*/
396 /* SP_QsnFrGridCornerTrPressed */ {KAknsIIDQsnFrGridCornerTr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2682},
397 /* SP_QsnFrGridCornerBlPressed */ {KAknsIIDQsnFrGridCornerBl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2683},
398 /* SP_QsnFrGridCornerBrPressed */ {KAknsIIDQsnFrGridCornerBr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2684},
399 /* SP_QsnFrGridSideTPressed */ {KAknsIIDQsnFrGridSideT, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2685},
400 /* SP_QsnFrGridSideBPressed */ {KAknsIIDQsnFrGridSideB, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2686},
401 /* SP_QsnFrGridSideLPressed */ {KAknsIIDQsnFrGridSideL, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2687},
402 /* SP_QsnFrGridSideRPressed */ {KAknsIIDQsnFrGridSideR, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2688},
403 /* SP_QsnFrGridCenterPressed */ {KAknsIIDQsnFrGridCenter, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2689},
404
405 // No pressed down list in 3.1/3.2
406 /* SP_QsnFrListCornerTlPressed */ {KAknsIIDQsnFrListCornerTl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x268b}, /*KAknsIIDQsnFrListCornerTlPressed*/
407 /* SP_QsnFrListCornerTrPressed */ {KAknsIIDQsnFrListCornerTr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x268c},
408 /* SP_QsnFrListCornerBlPressed */ {KAknsIIDQsnFrListCornerBl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x268d},
409 /* SP_QsnFrListCornerBrPressed */ {KAknsIIDQsnFrListCornerBr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x268e},
410 /* SP_QsnFrListSideTPressed */ {KAknsIIDQsnFrListSideT, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x268f},
411 /* SP_QsnFrListSideBPressed */ {KAknsIIDQsnFrListSideB, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2690},
412 /* SP_QsnFrListSideLPressed */ {KAknsIIDQsnFrListSideL, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2691},
413 /* SP_QsnFrListSideRPressed */ {KAknsIIDQsnFrListSideR, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2692},
414 /* SP_QsnFrListCenterPressed */ {KAknsIIDQsnFrListCenter, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2693},
415
416 /* SP_QtgToolBarAdd */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x27c0}, //KAknsIIDQtgToolbarAdd
417 /* SP_QtgToolBarAddDetail */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2778}, //KAknsIIDQtgToolbarAddDetail
418 /* SP_QtgToolbarAgain */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x271a}, //KAknsIIDQtgToolbarAgain
419 /* SP_QtgToolBarAgenda */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x281a}, //KAknsIIDQtgToolbarAgenda
420 /* SP_QtgToolBarAudioOff */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2751}, //KAknsIIDQtgToolbarAudioOff
421 /* SP_QtgToolBarAudioOn */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2752}, //KAknsIIDQtgToolbarAudioOn
422 /* SP_CustomToolBarBack */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x271b}, //KAknsIIDQtgToolbarBack
423 /* SP_QtgToolBarBluetoothOff */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2753}, //KAknsIIDQtgToolbarBluetoothOff
424 /* SP_QtgToolBarBluetoothOn */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2754}, //KAknsIIDQtgToolbarBluetoothOn
425 /* SP_QtgToolBarCancel */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2895}, //KAknsIIDQtgToolbarCancel
426 /* SP_QtgToolBarDelete */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2755}, //KAknsIIDQtgToolbarDelete
427 /* SP_QtgToolBarDetails */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x271e}, //KAknsIIDQtgToolbarDetails
428 /* SP_QtgToolBarDone */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x271f}, //KAknsIIDQtgToolbarDone
429 /* SP_QtgToolBarEdit */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2720}, //KAknsIIDQtgToolbarEdit
430 /* SP_QtgToolBarEditDisabled */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2946}, //KAknsIIDQtgToolbarEditDisabled
431 /* SP_QtgToolBarEmailSend */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x292f}, //KAknsIIDQtgToolbarEmailSend
432 /* SP_QtgToolBarEmergencyCall */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2721}, //KAknsIIDQtgToolbarEmergencyCall
433 /* SP_QtgToolBarFavouriteAdd */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x28ed}, //KAknsIIDQtgToolbarFavouriteAdd
434 /* SP_QtgToolBarFavouriteRemove */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x28ee}, //KAknsIIDQtgToolbarFavouriteRemove
435 /* SP_QtgToolBarFavourites */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x28b8}, //KAknsIIDQtgToolbarFavourites
436 /* SP_QtgToolBarForward */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x281b}, //KAknsIIDQtgToolbarForward
437 /* SP_QtgToolBarGo */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2930}, //KAknsIIDQtgToolbarGo
438 /* SP_QtgToolBarHome */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2722}, //KAknsIIDQtgToolbarHome
439 /* SP_QtgToolBarImageTools */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2947}, //KAknsIIDQtgToolbarImageTools
440 /* SP_QtgToolBarList */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x28b9}, //KAknsIIDQtgToolbarList
441 /* SP_QtgToolBarLock */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2723}, //KAknsIIDQtgToolbarLock
442 /* SP_QtgToolBarLogs */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x281c}, //KAknsIIDQtgToolbarLogs
443 /* SP_QtgToolBarMenu */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2724}, //KAknsIIDQtgToolbarMenu
444 /* SP_QtgToolBarNewContact */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2779}, //KAknsIIDQtgToolbarNewContact
445 /* SP_QtgToolBarNewGroup */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x277a}, //KAknsIIDQtgToolbarNewGroup
446 /* SP_QtgToolBarNext */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x281d}, //KAknsIIDQtgToolbarNext
447 /* SP_QtgToolBarNextFrame */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2981}, //KAknsIIDQtgToolbarNextFrame
448 /* SP_QtgToolBarNowPlay */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x28ef}, //KAknsIIDQtgToolbarNowplay
449 /* SP_QtgToolBarOptions */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2725}, //KAknsIIDQtgToolbarOptions
450 /* SP_QtgToolBarOther */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2726}, //KAknsIIDQtgToolbarOther
451 /* SP_QtgToolBarOvi */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2931}, //KAknsIIDQtgToolbarOvi
452 /* SP_QtgToolBarPause */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2727}, //KAknsIIDQtgToolbarPause
453 /* SP_QtgToolBarPlay */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2728}, //KAknsIIDQtgToolbarPlay
454 /* SP_QtgToolBarPrevious */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x281e}, //KAknsIIDQtgToolbarPrevious
455 /* SP_QtgToolBarPreviousFrame */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2982}, //KAknsIIDQtgToolbarPreviousFrame
456 /* SP_QtgToolBarRead */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2729}, //KAknsIIDQtgToolbarRead
457 /* SP_QtgToolBarRedo */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2948}, //KAknsIIDQtgToolbarRedo
458 /* SP_QtgToolBarRedoDisabled */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2949}, //KAknsIIDQtgToolbarRedoDisabled
459 /* SP_QtgToolBarRefresh */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2932}, //KAknsIIDQtgToolbarRefresh
460 /* SP_QtgToolBarRemoveDetail */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x277b}, //KAknsIIDQtgToolbarRemoveDetail
461 /* SP_QtgToolBarRemoveDisabled */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x294a}, //KAknsIIDQtgToolbarRemoveDisabled
462 /* SP_QtgToolBarRepeat */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x281f}, //KAknsIIDQtgToolbarRepeat
463 /* SP_QtgToolBarRepeatOff */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2820}, //KAknsIIDQtgToolbarRepeatOff
464 /* SP_QtgToolBarRepeatOne */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2821}, //KAknsIIDQtgToolbarRepeatOne
465 /* SP_QtgToolBarRewind */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2822}, //KAknsIIDQtgToolbarRewind
466 /* SP_QtgToolBarSearch */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x272a}, //KAknsIIDQtgToolbarSearch
467 /* SP_QtgToolBarSearchDisabled */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x294b}, //KAknsIIDQtgToolbarSearchDisabled
468 /* SP_QtgToolBarSelectContent */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x294c}, //KAknsIIDQtgToolbarSelectContent
469 /* SP_QtgToolBarSelfTimer */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2756}, //KAknsIIDQtgToolbarSelfTimer
470 /* SP_QtgToolBarSend */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x272b}, //KAknsIIDQtgToolbarSend
471 /* SP_QtgToolBarSendDimmed */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x29b0}, //KAknsIIDQtgToolbarSendDimmed
472 /* SP_QtgToolBarShare */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2823}, //KAknsIIDQtgToolbarShare
473 /* SP_QtgToolBarShift */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x272c}, //KAknsIIDQtgToolbarShift
474 /* SP_QtgToolBarShuffle */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2824}, //KAknsIIDQtgToolbarShuffle
475 /* SP_QtgToolBarShuffleOff */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2825}, //KAknsIIDQtgToolbarShuffleOff
476 /* SP_QtgToolBarSignalOff */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2757}, //KAknsIIDQtgToolbarSignalOff
477 /* SP_QtgToolBarSignalOn */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2758}, //KAknsIIDQtgToolbarSignalOn
478 /* SP_QtgToolBarStop */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x272d}, //KAknsIIDQtgToolbarStop
479 /* SP_QtgToolBarSync */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2894}, //KAknsIIDQtgToolbarSync
480 /* SP_QtgToolBarTools */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2983}, //KAknsIIDQtgToolbarTools
481 /* SP_QtgToolBarTrim */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2954}, //KAknsIIDQtgToolbarTrim
482 /* SP_QtgToolBarUnlock */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x272e}, //KAknsIIDQtgToolbarUnlock
483 /* SP_QtgToolBarUnmark */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x272f}, //KAknsIIDQtgToolbarUnmark
484 /* SP_QtgToolBarView */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2730}, //KAknsIIDQtgToolbarView
485 /* SP_QtgToolBarWlanOff */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2759}, //KAknsIIDQtgToolbarWlanOff
486 /* SP_QtgToolBarWlanOn */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x275a}, //KAknsIIDQtgToolbarWlanOn
487
488 /* SP_QtgGrafCameraButtonCaptureNormal */ {KAknsIIDNone, EDrawIcon, ES60_Pre52, EAknsMajorGeneric, 0x2743}, //KAknsIIDQtgGrafCameraButtonCaptureNormal (already in 9.2)
489 /* SP_QtgGrafCameraButtonCapturePressed */ {KAknsIIDNone, EDrawIcon, ES60_Pre52, EAknsMajorGeneric, 0x2744}, //KAknsIIDQtgGrafCameraButtonCapturePressed
490 /* SP_QtgGrafCameraButtonPauseNormal */ {KAknsIIDNone, EDrawIcon, ES60_Pre52, EAknsMajorGeneric, 0x2745}, //KAknsIIDQtgGrafCameraButtonPauseNormal
491 /* SP_QtgGrafCameraButtonPausePressed */ {KAknsIIDNone, EDrawIcon, ES60_Pre52, EAknsMajorGeneric, 0x2746}, //KAknsIIDQtgGrafCameraButtonPausePressed
492 /* SP_QtgGrafCameraButtonPlayNormal */ {KAknsIIDNone, EDrawIcon, ES60_Pre52, EAknsMajorGeneric, 0x2747}, //KAknsIIDQtgGrafCameraButtonPlayNormal
493 /* SP_QtgGrafCameraButtonPlayPressed */ {KAknsIIDNone, EDrawIcon, ES60_Pre52, EAknsMajorGeneric, 0x2748}, //KAknsIIDQtgGrafCameraButtonPlayPressed
494 /* SP_QtgGrafCameraButtonRecNormal */ {KAknsIIDNone, EDrawIcon, ES60_Pre52, EAknsMajorGeneric, 0x2749}, //KAknsIIDQtgGrafCameraButtonRecNormal
495 /* SP_QtgGrafCameraButtonRecPressed */ {KAknsIIDNone, EDrawIcon, ES60_Pre52, EAknsMajorGeneric, 0x274a}, //KAknsIIDQtgGrafCameraButtonRecPressed
496 /* SP_QtgGrafCameraButtonStopNormal */ {KAknsIIDNone, EDrawIcon, ES60_Pre52, EAknsMajorGeneric, 0x274b}, //KAknsIIDQtgGrafCameraButtonStopNormal
497 /* SP_QtgGrafCameraButtonStopPressed */ {KAknsIIDNone, EDrawIcon, ES60_Pre52, EAknsMajorGeneric, 0x274c}, //KAknsIIDQtgGrafCameraButtonStopPressed
498
499 /* SP_QtgTabAll */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2851}, //KAknsIIDQtgTabAll
500 /* SP_QtgTabArtist */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x288f}, //KAknsIIDQtgTabArtist
501 /* SP_QtgTabFavourite */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x28eb}, //KAknsIIDQtgTabFavourite
502 /* SP_QtgTabGenre */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2890}, //KAknsIIDQtgTabGenre
503 /* SP_QtgTabLanguage */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x28ec}, //KAknsIIDQtgTabLanguage
504 /* SP_QtgTabMusicAlbum */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2891}, //KAknsIIDQtgTabMusicAlbum
505 /* SP_QtgTabPhotosAlbum */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2818}, //KAknsIIDQtgTabPhotosAlbum
506 /* SP_QtgTabPhotosAll */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2819}, //KAknsIIDQtgTabPhotosAll
507 /* SP_QtgTabPlaylist */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2892}, //KAknsIIDQtgTabPlaylist
508 /* SP_QtgTabServices */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x274f}, //KAknsIIDQtgTabServices
509 /* SP_QtgTabSongs */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2893}, //KAknsIIDQtgTabSongs
510 /* SP_QtgTabVideos */ {KAknsIIDNone, EDrawIcon, ES60_Pre53, EAknsMajorGeneric, 0x2750}, //KAknsIIDQtgTabVideos
511
512 /* SP_QgnIndiBrowserTbReload */ {KAknsIIDQgnIndiBrowserTbReload, EDrawIcon, ES60_All, -1, -1},
513 /* SP_QgnIndiBrowserTbHome */ {KAknsIIDQgnIndiBrowserTbHome, EDrawIcon, ES60_All, -1, -1},
514 /* SP_QgnIndiBrowserTbStop */ {KAknsIIDQgnIndiBrowserTbStop, EDrawIcon, ES60_All, -1, -1},
515 };
516
skinnedGraphics(QS60StyleEnums::SkinParts stylepart,const QSize & size,QS60StylePrivate::SkinElementFlags flags)517 QPixmap QS60StyleModeSpecifics::skinnedGraphics(
518 QS60StyleEnums::SkinParts stylepart, const QSize &size,
519 QS60StylePrivate::SkinElementFlags flags)
520 {
521 QPixmap themedImage;
522 TRAPD( error, QT_TRYCATCH_LEAVING({
523 const QPixmap skinnedImage = createSkinnedGraphicsLX(stylepart, size, flags);
524 themedImage = skinnedImage;
525 }));
526 if (error)
527 return themedImage = QPixmap();
528 return themedImage;
529 }
530
skinnedGraphics(QS60StylePrivate::SkinFrameElements frame,const QSize & size,QS60StylePrivate::SkinElementFlags flags)531 QPixmap QS60StyleModeSpecifics::skinnedGraphics(
532 QS60StylePrivate::SkinFrameElements frame, const QSize &size, QS60StylePrivate::SkinElementFlags flags)
533 {
534 QPixmap themedImage;
535 TRAPD( error, QT_TRYCATCH_LEAVING({
536 const QPixmap skinnedImage = createSkinnedGraphicsLX(frame, size, flags);
537 themedImage = skinnedImage;
538 }));
539 if (error)
540 return themedImage = QPixmap();
541 return themedImage;
542 }
543
colorSkinnedGraphics(const QS60StyleEnums::SkinParts & stylepart,const QSize & size,QPainter * painter,QS60StylePrivate::SkinElementFlags flags)544 QPixmap QS60StyleModeSpecifics::colorSkinnedGraphics(
545 const QS60StyleEnums::SkinParts &stylepart, const QSize &size, QPainter *painter,
546 QS60StylePrivate::SkinElementFlags flags)
547 {
548 QPixmap colorGraphics;
549 TRAPD(error, QT_TRYCATCH_LEAVING(colorGraphics = colorSkinnedGraphicsLX(stylepart, size, painter, flags)));
550 return error ? QPixmap() : colorGraphics;
551 }
552
fallbackInfo(const QS60StyleEnums::SkinParts & stylePart,TInt & fallbackIndex)553 void QS60StyleModeSpecifics::fallbackInfo(const QS60StyleEnums::SkinParts &stylePart, TInt &fallbackIndex)
554 {
555 switch(stylePart) {
556 case QS60StyleEnums::SP_QgnGrafBarWaitAnim:
557 fallbackIndex = EMbmAvkonQgn_graf_bar_wait_1;
558 break;
559 case QS60StyleEnums::SP_QgnGrafBarFrameCenter:
560 fallbackIndex = EMbmAvkonQgn_graf_bar_frame_center;
561 break;
562 case QS60StyleEnums::SP_QgnGrafBarFrameSideL:
563 fallbackIndex = EMbmAvkonQgn_graf_bar_frame_side_l;
564 break;
565 case QS60StyleEnums::SP_QgnGrafBarFrameSideR:
566 fallbackIndex = EMbmAvkonQgn_graf_bar_frame_side_r;
567 break;
568 case QS60StyleEnums::SP_QgnGrafBarProgress:
569 fallbackIndex = EMbmAvkonQgn_graf_bar_progress;
570 break;
571 case QS60StyleEnums::SP_QgnGrafTabActiveL:
572 fallbackIndex = EMbmAvkonQgn_graf_tab_active_l;
573 break;
574 case QS60StyleEnums::SP_QgnGrafTabActiveM:
575 fallbackIndex = EMbmAvkonQgn_graf_tab_active_m;
576 break;
577 case QS60StyleEnums::SP_QgnGrafTabActiveR:
578 fallbackIndex = EMbmAvkonQgn_graf_tab_active_r;
579 break;
580 case QS60StyleEnums::SP_QgnGrafTabPassiveL:
581 fallbackIndex = EMbmAvkonQgn_graf_tab_passive_l;
582 break;
583 case QS60StyleEnums::SP_QgnGrafTabPassiveM:
584 fallbackIndex = EMbmAvkonQgn_graf_tab_passive_m;
585 break;
586 case QS60StyleEnums::SP_QgnGrafTabPassiveR:
587 fallbackIndex = EMbmAvkonQgn_graf_tab_passive_r;
588 break;
589 case QS60StyleEnums::SP_QgnIndiCheckboxOff:
590 fallbackIndex = EMbmAvkonQgn_indi_checkbox_off;
591 break;
592 case QS60StyleEnums::SP_QgnIndiCheckboxOn:
593 fallbackIndex = EMbmAvkonQgn_indi_checkbox_on;
594 break;
595 case QS60StyleEnums::SP_QgnIndiHlColSuper:
596 fallbackIndex = 0x4456; /* EMbmAvkonQgn_indi_hl_col_super */
597 break;
598 case QS60StyleEnums::SP_QgnIndiHlExpSuper:
599 fallbackIndex = 0x4458; /* EMbmAvkonQgn_indi_hl_exp_super */
600 break;
601 case QS60StyleEnums::SP_QgnIndiHlLineBranch:
602 fallbackIndex = 0x445A; /* EMbmAvkonQgn_indi_hl_line_branch */
603 break;
604 case QS60StyleEnums::SP_QgnIndiHlLineEnd:
605 fallbackIndex = 0x445C; /* EMbmAvkonQgn_indi_hl_line_end */
606 break;
607 case QS60StyleEnums::SP_QgnIndiHlLineStraight:
608 fallbackIndex = 0x445E; /* EMbmAvkonQgn_indi_hl_line_straight */
609 break;
610 case QS60StyleEnums::SP_QgnIndiMarkedAdd:
611 fallbackIndex = EMbmAvkonQgn_indi_marked_add;
612 break;
613 case QS60StyleEnums::SP_QgnIndiNaviArrowLeft:
614 fallbackIndex = EMbmAvkonQgn_indi_navi_arrow_left;
615 break;
616 case QS60StyleEnums::SP_QgnIndiNaviArrowRight:
617 fallbackIndex = EMbmAvkonQgn_indi_navi_arrow_right;
618 break;
619 case QS60StyleEnums::SP_QgnIndiRadiobuttOff:
620 fallbackIndex = EMbmAvkonQgn_indi_radiobutt_off;
621 break;
622 case QS60StyleEnums::SP_QgnIndiRadiobuttOn:
623 fallbackIndex = EMbmAvkonQgn_indi_radiobutt_on;
624 break;
625 case QS60StyleEnums::SP_QgnGrafNsliderMarker:
626 fallbackIndex = 17572; /* EMbmAvkonQgn_graf_nslider_marker */
627 break;
628 case QS60StyleEnums::SP_QgnGrafNsliderMarkerSelected:
629 fallbackIndex = 17574; /* EMbmAvkonQgn_graf_nslider_marker_selected */
630 break;
631 case QS60StyleEnums::SP_QgnIndiSubmenu:
632 fallbackIndex = EMbmAvkonQgn_indi_submenu;
633 break;
634 case QS60StyleEnums::SP_QgnNoteErased:
635 fallbackIndex = EMbmAvkonQgn_note_erased;
636 break;
637 case QS60StyleEnums::SP_QgnNoteError:
638 fallbackIndex = EMbmAvkonQgn_note_error;
639 break;
640 case QS60StyleEnums::SP_QgnNoteInfo:
641 fallbackIndex = EMbmAvkonQgn_note_info;
642 break;
643 case QS60StyleEnums::SP_QgnNoteOk:
644 fallbackIndex = EMbmAvkonQgn_note_ok;
645 break;
646 case QS60StyleEnums::SP_QgnNoteQuery:
647 fallbackIndex = EMbmAvkonQgn_note_query;
648 break;
649 case QS60StyleEnums::SP_QgnNoteWarning:
650 fallbackIndex = EMbmAvkonQgn_note_warning;
651 break;
652 case QS60StyleEnums::SP_QgnPropFileSmall:
653 fallbackIndex = EMbmAvkonQgn_prop_file_small;
654 break;
655 case QS60StyleEnums::SP_QgnPropFolderCurrent:
656 fallbackIndex = EMbmAvkonQgn_prop_folder_current;
657 break;
658 case QS60StyleEnums::SP_QgnPropFolderSmall:
659 fallbackIndex = EMbmAvkonQgn_prop_folder_small;
660 break;
661 case QS60StyleEnums::SP_QgnPropFolderSmallNew:
662 fallbackIndex = EMbmAvkonQgn_prop_folder_small_new;
663 break;
664 case QS60StyleEnums::SP_QgnPropPhoneMemcLarge:
665 fallbackIndex = EMbmAvkonQgn_prop_phone_memc_large;
666 break;
667 default:
668 fallbackIndex = -1;
669 break;
670 }
671 }
672
colorSkinnedGraphicsLX(const QS60StyleEnums::SkinParts & stylepart,const QSize & size,QPainter * painter,QS60StylePrivate::SkinElementFlags flags)673 QPixmap QS60StyleModeSpecifics::colorSkinnedGraphicsLX(
674 const QS60StyleEnums::SkinParts &stylepart,
675 const QSize &size, QPainter *painter, QS60StylePrivate::SkinElementFlags flags)
676 {
677 // this function can throw both exceptions and leaves. There are no cleanup dependencies between Qt and Symbian parts.
678 const int stylepartIndex = (int)stylepart;
679 const TAknsItemID skinId = m_partMap[stylepartIndex].skinID;
680
681 TInt fallbackGraphicID = -1;
682 fallbackInfo(stylepart, fallbackGraphicID);
683
684 TAknsItemID colorGroup = KAknsIIDQsnIconColors;
685 TRgb defaultColor = KRgbBlack;
686 int colorIndex = -1; //set a bogus value to color index to ensure that painter color is used
687 //to color the icon
688 if (painter) {
689 QRgb widgetColor = painter->pen().color().rgb();
690 defaultColor = TRgb(qRed(widgetColor), qGreen(widgetColor), qBlue(widgetColor));
691 }
692
693 const bool rotatedBy90or270 =
694 (flags & (QS60StylePrivate::SF_PointEast | QS60StylePrivate::SF_PointWest));
695 const TSize targetSize =
696 rotatedBy90or270?TSize(size.height(), size.width()):TSize(size.width(), size.height());
697 CFbsBitmap *icon = 0;
698 CFbsBitmap *iconMask = 0;
699 const TInt fallbackGraphicsMaskID =
700 fallbackGraphicID == KErrNotFound?KErrNotFound:fallbackGraphicID+1; //masks are auto-generated as next in mif files
701 MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
702 AknsUtils::CreateColorIconLC(
703 skinInstance,
704 skinId,
705 colorGroup,
706 colorIndex,
707 icon,
708 iconMask,
709 (fallbackGraphicID != KErrNotFound ? AknIconUtils::AvkonIconFileName() : KNullDesC),
710 fallbackGraphicID,
711 fallbackGraphicsMaskID,
712 defaultColor);
713
714 QPixmap result = fromFbsBitmap(icon, iconMask, flags, targetSize);
715 CleanupStack::PopAndDestroy(2); //icon, iconMask
716 return result;
717 }
718
colorValue(const TAknsItemID & colorGroup,int colorIndex)719 QColor QS60StyleModeSpecifics::colorValue(const TAknsItemID &colorGroup, int colorIndex)
720 {
721 TRgb skinnedColor;
722 MAknsSkinInstance* skin = AknsUtils::SkinInstance();
723 AknsUtils::GetCachedColor(skin, skinnedColor, colorGroup, colorIndex);
724 return QColor(skinnedColor.Red(),skinnedColor.Green(),skinnedColor.Blue());
725 }
726
727 struct QAutoFbsBitmapHeapLock
728 {
QAutoFbsBitmapHeapLockQAutoFbsBitmapHeapLock729 QAutoFbsBitmapHeapLock(CFbsBitmap* aBmp) : mBmp(aBmp) { mBmp->LockHeap(); }
~QAutoFbsBitmapHeapLockQAutoFbsBitmapHeapLock730 ~QAutoFbsBitmapHeapLock() { mBmp->UnlockHeap(); }
731 CFbsBitmap* mBmp;
732 };
733
fromFbsBitmap(CFbsBitmap * icon,CFbsBitmap * mask,QS60StylePrivate::SkinElementFlags flags,const TSize & targetSize)734 QPixmap QS60StyleModeSpecifics::fromFbsBitmap(CFbsBitmap *icon, CFbsBitmap *mask, QS60StylePrivate::SkinElementFlags flags, const TSize &targetSize)
735 {
736 Q_ASSERT(icon);
737
738 AknIconUtils::DisableCompression(icon);
739 TInt error = AknIconUtils::SetSize(icon, targetSize, EAspectRatioNotPreserved);
740
741 if (mask && !error) {
742 AknIconUtils::DisableCompression(mask);
743 error = AknIconUtils::SetSize(mask, targetSize, EAspectRatioNotPreserved);
744 }
745 if (error)
746 return QPixmap();
747
748 QPixmap pixmap;
749 QScopedPointer<QPixmapData> pd(QPixmapData::create(0, 0, QPixmapData::PixmapType));
750 if (mask) {
751 // Try the efficient path with less copying and conversion.
752 QVolatileImage img(icon, mask);
753 pd->fromNativeType(&img, QPixmapData::VolatileImage);
754 if (!pd->isNull())
755 pixmap = QPixmap(pd.take());
756 }
757 if (pixmap.isNull()) {
758 // Potentially more expensive path.
759 pd->fromNativeType(icon, QPixmapData::FbsBitmap);
760 pixmap = QPixmap(pd.take());
761 if (mask) {
762 pixmap.setAlphaChannel(QPixmap::fromSymbianCFbsBitmap(mask));
763 }
764 }
765
766 if ((flags & QS60StylePrivate::SF_PointEast) ||
767 (flags & QS60StylePrivate::SF_PointSouth) ||
768 (flags & QS60StylePrivate::SF_PointWest)) {
769 QImage iconImage = pixmap.toImage();
770 QTransform imageTransform;
771 if (flags & QS60StylePrivate::SF_PointEast) {
772 imageTransform.rotate(90);
773 } else if (flags & QS60StylePrivate::SF_PointSouth) {
774 imageTransform.rotate(180);
775 iconImage = iconImage.transformed(imageTransform);
776 } else if (flags & QS60StylePrivate::SF_PointWest) {
777 imageTransform.rotate(270);
778 }
779 if (imageTransform.isRotating())
780 iconImage = iconImage.transformed(imageTransform);
781
782 pixmap = QPixmap::fromImage(iconImage);
783 }
784 if ((flags & QS60StylePrivate::SF_Mirrored_X_Axis) ||
785 (flags & QS60StylePrivate::SF_Mirrored_Y_Axis)) {
786 QImage iconImage = pixmap.toImage().mirrored(
787 flags & QS60StylePrivate::SF_Mirrored_X_Axis,
788 flags & QS60StylePrivate::SF_Mirrored_Y_Axis);
789 pixmap = QPixmap::fromImage(iconImage);
790 }
791
792 return pixmap;
793 }
794
isSingleClickUi()795 bool QS60StylePrivate::isSingleClickUi()
796 {
797 return (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0);
798 }
799
deleteStoredSettings()800 void QS60StylePrivate::deleteStoredSettings()
801 {
802 QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));
803 settings.beginGroup(QLatin1String("QS60Style"));
804 settings.remove(QString());
805 settings.endGroup();
806 }
807
808 // Since S60Style has 'button' as a graphic, we don't have any native color which to use
809 // for QPalette::Button. Therefore S60Style needs to guesstimate palette color by calculating
810 // average rgb values for button pixels.
811 // Returns Qt::black if there is an issue with the graphics (image is NULL, or no constBits() found).
colorFromFrameGraphics(SkinFrameElements frame) const812 QColor QS60StylePrivate::colorFromFrameGraphics(SkinFrameElements frame) const
813 {
814 #ifndef QT_NO_SETTINGS
815 TInt themeID = 0;
816 //First we need to fetch active theme ID. We need to store the themeID at the same time
817 //as color, so that we can later check if the stored color is still from the same theme.
818 //Native side stores active theme UID/Timestamp into central repository.
819 int error = 0;
820 QT_TRAP_THROWING(
821 CRepository *themeRepository = CRepository::NewLC(personalisationUID);
822 if (themeRepository) {
823 TBuf<32> value; //themeID is currently max of 8 + 1 + 8 characters, but lets have some extra space
824 const TUint32 key = 0x00000002; //active theme key in the repository
825 error = themeRepository->Get(key, value);
826 if (error == KErrNone) {
827 TLex lex(value);
828 TPtrC numberToken(lex.NextToken());
829 if (numberToken.Length())
830 error = TLex(numberToken).Val(themeID);
831 else
832 error = KErrArgument;
833 }
834 }
835 CleanupStack::PopAndDestroy(themeRepository);
836 );
837
838 QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));
839 settings.beginGroup(QLatin1String("QS60Style"));
840 if (themeID != 0) {
841 QVariant buttonColor = settings.value(QLatin1String("ButtonColor"));
842 if (!buttonColor.isNull()) {
843 //there is a stored color value, lets see if the theme ID matches
844 if (error == KErrNone) {
845 QVariant themeUID = settings.value(QLatin1String("ThemeUID"));
846 if (!themeUID.isNull() && themeUID.toInt() == themeID) {
847 QColor storedColor(buttonColor.value<QColor>());
848 if (storedColor.isValid())
849 return storedColor;
850 }
851 }
852 settings.remove(QString()); //if color was invalid, or theme has been changed, just delete all stored settings
853 }
854 }
855 #endif
856
857 QColor color = calculatedColor(frame);
858
859 #ifndef QT_NO_SETTINGS
860 settings.setValue(QLatin1String("ThemeUID"), QVariant(themeID));
861 if (frame == SF_ButtonNormal) //other colors are not currently calculated from graphics
862 settings.setValue(QLatin1String("ButtonColor"), QVariant(color));
863 settings.endGroup();
864 #endif
865
866 return color;
867 }
868
qt_s60_fill_background_offset(const QWidget * targetWidget)869 QPoint qt_s60_fill_background_offset(const QWidget *targetWidget)
870 {
871 CCoeControl *control = targetWidget->effectiveWinId();
872 TPoint pos(0,0);
873 if (control)
874 pos = control->PositionRelativeToScreen();
875 return QPoint(pos.iX, pos.iY);
876 }
877
createSkinnedGraphicsLX(QS60StyleEnums::SkinParts part,const QSize & size,QS60StylePrivate::SkinElementFlags flags)878 QPixmap QS60StyleModeSpecifics::createSkinnedGraphicsLX(
879 QS60StyleEnums::SkinParts part, const QSize &size,
880 QS60StylePrivate::SkinElementFlags flags)
881 {
882 // this function can throw both exceptions and leaves. There are no cleanup dependencies between Qt and Symbian parts.
883 if (!size.isValid())
884 return QPixmap();
885
886 // Check release support and change part, if necessary.
887 const TAknsItemID skinId = partSpecificThemeId((int)part);
888 const int stylepartIndex = (int)part;
889 const TDrawType drawType = m_partMap[stylepartIndex].drawType;
890 Q_ASSERT(drawType != ENoDraw);
891 const bool rotatedBy90or270 =
892 (flags & (QS60StylePrivate::SF_PointEast | QS60StylePrivate::SF_PointWest));
893 const TSize targetSize =
894 rotatedBy90or270 ? TSize(size.height(), size.width()) : qt_QSize2TSize(size);
895
896 MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
897 static const TDisplayMode displayMode = S60->supportsPremultipliedAlpha ? Q_SYMBIAN_ECOLOR16MAP : EColor16MA;
898 static const TInt drawParam = S60->supportsPremultipliedAlpha ? KAknsDrawParamDefault : KAknsDrawParamRGBOnly;
899
900 QPixmap result;
901
902 switch (drawType) {
903 case EDrawGulIcon: {
904 CGulIcon* icon = AknsUtils::CreateGulIconL( AknsUtils::SkinInstance(), skinId, EFalse );
905 if (icon)
906 result = fromFbsBitmap(icon->Bitmap(), icon->Mask(), flags, targetSize);
907 delete icon;
908 break;
909 }
910 case EDrawIcon: {
911 TInt fallbackGraphicID = -1;
912 fallbackInfo(part, fallbackGraphicID);
913
914 CFbsBitmap *icon = 0;
915 CFbsBitmap *iconMask = 0;
916 const TInt fallbackGraphicsMaskID =
917 fallbackGraphicID == KErrNotFound?KErrNotFound:fallbackGraphicID+1; //masks are auto-generated as next in mif files
918
919 AknsUtils::CreateIconL(
920 skinInstance,
921 skinId,
922 icon,
923 iconMask,
924 (fallbackGraphicID != KErrNotFound ? AknIconUtils::AvkonIconFileName() : KNullDesC),
925 fallbackGraphicID ,
926 fallbackGraphicsMaskID);
927
928 // If drawing fails, re-try without a mask.
929 if (!icon) {
930 AknsUtils::CreateIconL(
931 skinInstance,
932 skinId,
933 icon,
934 (fallbackGraphicID != KErrNotFound ? AknIconUtils::AvkonIconFileName() : KNullDesC),
935 fallbackGraphicID);
936 }
937
938 result = fromFbsBitmap(icon, iconMask, flags, targetSize);
939 delete icon;
940 delete iconMask;
941 break;
942 }
943 case EDrawBackground: {
944 // QS60WindowSurface::unlockBitmapHeap();
945 CFbsBitmap *background = new (ELeave) CFbsBitmap(); //offscreen
946 CleanupStack::PushL(background);
947 User::LeaveIfError(background->Create(targetSize, displayMode));
948
949 CFbsBitmapDevice *dev = CFbsBitmapDevice::NewL(background);
950 CleanupStack::PushL(dev);
951 CFbsBitGc *gc = NULL;
952 User::LeaveIfError(dev->CreateContext(gc));
953 CleanupStack::PushL(gc);
954
955 CAknsBasicBackgroundControlContext *bgContext = CAknsBasicBackgroundControlContext::NewL(
956 skinId,
957 targetSize,
958 EFalse);
959 CleanupStack::PushL(bgContext);
960
961 const TBool drawn = AknsDrawUtils::DrawBackground(
962 skinInstance,
963 bgContext,
964 NULL,
965 *gc,
966 TPoint(),
967 targetSize,
968 drawParam);
969
970 if (drawn) {
971 result = fromFbsBitmap(background, NULL, flags, targetSize);
972 } else {
973 // if drawing fails in skin server, draw background as white
974 QPixmap defaultBg = QPixmap(targetSize.iWidth, targetSize.iHeight);
975 defaultBg.fill(Qt::white);
976 result = defaultBg;
977 }
978
979 CleanupStack::PopAndDestroy(4, background); //background, dev, gc, bgContext
980 // QS60WindowSurface::lockBitmapHeap();
981 break;
982 }
983 case EDrawAnimation: {
984 CFbsBitmap* animationFrame = 0;
985 CFbsBitmap* frameMask = 0;
986 CAknBitmapAnimation* aknAnimation = 0;
987 TBool constructedFromTheme = ETrue;
988
989 QS60StyleAnimation* animation = QS60StylePrivate::animationDefinition(part); //ownership is not passed
990 if (animation) {
991 if (!animation->animationObject() && !animation->isResourceBased()) {// no pre-made item exists, create new animation
992 CAknBitmapAnimation* newAnimation = CAknBitmapAnimation::NewL();
993 CleanupStack::PushL(newAnimation);
994 if (newAnimation)
995 constructedFromTheme = newAnimation->ConstructFromSkinL(skinId);
996 if (constructedFromTheme && newAnimation->BitmapAnimData()->FrameArray().Count() > 0) {
997 animation->setResourceBased(false);
998 animation->setAnimationObject(newAnimation); //animation takes ownership
999 }
1000 CleanupStack::Pop(newAnimation);
1001 }
1002 //fill-in stored information
1003 aknAnimation = animation->animationObject();
1004 constructedFromTheme = !animation->isResourceBased();
1005 }
1006
1007 const int currentFrame = QS60StylePrivate::currentAnimationFrame(part);
1008 if (constructedFromTheme && aknAnimation && aknAnimation->BitmapAnimData()->FrameArray().Count() > 0) {
1009 //Animation was created successfully and contains frames, just fetch current frame
1010 if(currentFrame >= aknAnimation->BitmapAnimData()->FrameArray().Count())
1011 User::Leave(KErrOverflow);
1012 const CBitmapFrameData* frameData = aknAnimation->BitmapAnimData()->FrameArray().At(currentFrame);
1013 if (frameData) {
1014 animationFrame = frameData->Bitmap();
1015 frameMask = frameData->Mask();
1016 }
1017 } else {
1018 //Theme does not contain animation theming, create frames from resource file
1019 TInt fallbackGraphicID = -1;
1020 fallbackInfo(part, fallbackGraphicID);
1021 fallbackGraphicID = fallbackGraphicID + (currentFrame * 2); //skip masks
1022 TInt fallbackGraphicsMaskID =
1023 (fallbackGraphicID == KErrNotFound) ? KErrNotFound : fallbackGraphicID + 1; //masks are auto-generated as next in mif files
1024 if (fallbackGraphicsMaskID != KErrNotFound)
1025 fallbackGraphicsMaskID = fallbackGraphicsMaskID + (currentFrame * 2); //skip actual graphics
1026
1027 //Then draw animation frame
1028 AknsUtils::CreateIconL(
1029 skinInstance,
1030 KAknsIIDDefault, //animation is not themed, lets force fallback graphics
1031 animationFrame,
1032 frameMask,
1033 (fallbackGraphicID != KErrNotFound ? AknIconUtils::AvkonIconFileName() : KNullDesC),
1034 fallbackGraphicID ,
1035 fallbackGraphicsMaskID);
1036 }
1037 result = fromFbsBitmap(animationFrame, frameMask, flags, targetSize);
1038 if (!constructedFromTheme) {
1039 delete animationFrame;
1040 animationFrame = 0;
1041 delete frameMask;
1042 frameMask = 0;
1043 }
1044 break;
1045 }
1046 }
1047 if (!result)
1048 result = QPixmap();
1049
1050 return result;
1051 }
1052
createSkinnedGraphicsLX(QS60StylePrivate::SkinFrameElements frameElement,const QSize & size,QS60StylePrivate::SkinElementFlags flags)1053 QPixmap QS60StyleModeSpecifics::createSkinnedGraphicsLX(QS60StylePrivate::SkinFrameElements frameElement,
1054 const QSize &size, QS60StylePrivate::SkinElementFlags flags)
1055 {
1056 // this function can throw both exceptions and leaves. There are no cleanup dependencies between Qt and Symbian parts.
1057 if (!size.isValid())
1058 return QPixmap();
1059
1060 const bool rotatedBy90or270 =
1061 (flags & (QS60StylePrivate::SF_PointEast | QS60StylePrivate::SF_PointWest));
1062 const TSize targetSize =
1063 rotatedBy90or270 ? TSize(size.height(), size.width()) : qt_QSize2TSize(size);
1064
1065 MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
1066 QPixmap result;
1067
1068 static const TDisplayMode displayMode = S60->supportsPremultipliedAlpha ? Q_SYMBIAN_ECOLOR16MAP : EColor16MA;
1069 static const TInt drawParam = S60->supportsPremultipliedAlpha ? KAknsDrawParamDefault : KAknsDrawParamNoClearUnderImage|KAknsDrawParamRGBOnly;
1070
1071 CFbsBitmap *frame = new (ELeave) CFbsBitmap(); //offscreen
1072 CleanupStack::PushL(frame);
1073 User::LeaveIfError(frame->Create(targetSize, displayMode));
1074
1075 CFbsBitmapDevice* bitmapDev = CFbsBitmapDevice::NewL(frame);
1076 CleanupStack::PushL(bitmapDev);
1077 CFbsBitGc* bitmapGc = NULL;
1078 User::LeaveIfError(bitmapDev->CreateContext(bitmapGc));
1079 CleanupStack::PushL(bitmapGc);
1080
1081 frame->LockHeap();
1082 memset(frame->DataAddress(), 0, frame->SizeInPixels().iWidth * frame->SizeInPixels().iHeight * 4); // 4: argb bytes
1083 frame->UnlockHeap();
1084
1085 const TRect outerRect(TPoint(0, 0), targetSize);
1086 const TRect innerRect = innerRectFromElement(frameElement, outerRect);
1087
1088 TAknsItemID frameSkinID, centerSkinID;
1089 frameSkinID = centerSkinID = partSpecificThemeId(QS60StylePrivate::m_frameElementsData[frameElement].center);
1090 frameIdAndCenterId(frameElement, frameSkinID, centerSkinID);
1091
1092 TBool drawn = AknsDrawUtils::DrawFrame(
1093 skinInstance,
1094 *bitmapGc,
1095 outerRect,
1096 innerRect,
1097 frameSkinID,
1098 centerSkinID,
1099 drawParam );
1100
1101 if (S60->supportsPremultipliedAlpha) {
1102 if (drawn) {
1103 result = fromFbsBitmap(frame, NULL, flags, targetSize);
1104 } else {
1105 // Drawing might fail due to OOM (we can do nothing about that),
1106 // or due to skin item not being available.
1107 // If the latter occurs, lets try switch to non-release specific items (if available)
1108 // and re-try the drawing.
1109 frameSkinID = centerSkinID = m_partMap[(int)QS60StylePrivate::m_frameElementsData[frameElement].center].skinID;
1110 frameIdAndCenterId(frameElement, frameSkinID, centerSkinID);
1111 drawn = AknsDrawUtils::DrawFrame( skinInstance,
1112 *bitmapGc, outerRect, innerRect,
1113 frameSkinID, centerSkinID,
1114 drawParam );
1115 // in case drawing fails, even after using default graphics, ignore the error
1116 if (drawn)
1117 result = fromFbsBitmap(frame, NULL, flags, targetSize);
1118 }
1119 } else {
1120 TDisplayMode maskDepth = EGray256;
1121 // Query the skin item for possible frame graphics mask details.
1122 if (skinInstance) {
1123 CAknsMaskedBitmapItemData* skinMaskedBmp = static_cast<CAknsMaskedBitmapItemData*>(
1124 skinInstance->GetCachedItemData(frameSkinID,EAknsITMaskedBitmap));
1125 if (skinMaskedBmp && skinMaskedBmp->Mask())
1126 maskDepth = skinMaskedBmp->Mask()->DisplayMode();
1127 }
1128 if (maskDepth != ENone) {
1129 CFbsBitmap *frameMask = new (ELeave) CFbsBitmap(); //offscreen
1130 CleanupStack::PushL(frameMask);
1131 User::LeaveIfError(frameMask->Create(targetSize, maskDepth));
1132
1133 CFbsBitmapDevice* maskBitmapDevice = CFbsBitmapDevice::NewL(frameMask);
1134 CleanupStack::PushL(maskBitmapDevice);
1135 CFbsBitGc* maskBitGc = NULL;
1136 User::LeaveIfError(maskBitmapDevice->CreateContext(maskBitGc));
1137 CleanupStack::PushL(maskBitGc);
1138
1139 if (drawn) {
1140 //ensure that the mask is really transparent
1141 maskBitGc->Activate( maskBitmapDevice );
1142 maskBitGc->SetPenStyle(CGraphicsContext::ENullPen);
1143 maskBitGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
1144 maskBitGc->SetBrushColor(KRgbWhite);
1145 maskBitGc->Clear();
1146 maskBitGc->SetBrushStyle(CGraphicsContext::ENullBrush);
1147
1148 drawn = AknsDrawUtils::DrawFrame(skinInstance,
1149 *maskBitGc, outerRect, innerRect,
1150 frameSkinID, centerSkinID,
1151 KAknsSDMAlphaOnly |KAknsDrawParamNoClearUnderImage);
1152 if (drawn)
1153 result = fromFbsBitmap(frame, frameMask, flags, targetSize);
1154 }
1155 CleanupStack::PopAndDestroy(3, frameMask);
1156 }
1157 }
1158 CleanupStack::PopAndDestroy(3, frame); //frame, bitmapDev, bitmapGc
1159 return result;
1160 }
1161
frameIdAndCenterId(QS60StylePrivate::SkinFrameElements frameElement,TAknsItemID & frameId,TAknsItemID & centerId)1162 void QS60StyleModeSpecifics::frameIdAndCenterId(QS60StylePrivate::SkinFrameElements frameElement, TAknsItemID &frameId, TAknsItemID ¢erId)
1163 {
1164 // There are some major mix-ups in skin declarations for some frames.
1165 // First, the frames are not declared in sequence.
1166 // Second, the parts use different major than the frame-master.
1167
1168 switch(frameElement) {
1169 case QS60StylePrivate::SF_ToolTip:
1170 centerId.Set(EAknsMajorGeneric, 0x19c2);
1171 frameId.Set(EAknsMajorSkin, 0x5300);
1172 break;
1173 case QS60StylePrivate::SF_PopupBackground:
1174 centerId.Set(KAknsIIDQsnFrPopupCenterSubmenu);
1175 frameId.Set(KAknsIIDQsnFrPopupSub);
1176 break;
1177 case QS60StylePrivate::SF_DialogBackground:
1178 centerId.Set(KAknsIIDQsnFrPopupCenter);
1179 frameId.Set(KAknsIIDQsnFrPopup);
1180 break;
1181 case QS60StylePrivate::SF_SettingsList:
1182 // Starting from S60_5_3, the root theme has been changed so that KAknsIIDQsnFrSetOpt is empty.
1183 // Set the theme ID to None, to avoid theme server trying to draw the empty frame.
1184 if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_2) {
1185 centerId.Set(KAknsIIDNone);
1186 frameId.Set(KAknsIIDNone);
1187 }
1188 break;
1189 case QS60StylePrivate::SF_PanelBackground:
1190 // remove center piece for panel graphics, so that only border is drawn
1191 centerId.Set(KAknsIIDNone);
1192 frameId.Set(KAknsIIDQsnFrSetOpt);
1193 break;
1194 default:
1195 // center should be correct here
1196 frameId.iMinor = centerId.iMinor - 9;
1197 break;
1198 }
1199 }
1200
innerRectFromElement(QS60StylePrivate::SkinFrameElements frameElement,const TRect & outerRect)1201 TRect QS60StyleModeSpecifics::innerRectFromElement(QS60StylePrivate::SkinFrameElements frameElement, const TRect &outerRect)
1202 {
1203 TInt widthShrink = QS60StylePrivate::pixelMetric(PM_FrameCornerWidth);
1204 TInt heightShrink = QS60StylePrivate::pixelMetric(PM_FrameCornerHeight);
1205 switch(frameElement) {
1206 case QS60StylePrivate::SF_PanelBackground:
1207 // panel should have slightly slimmer border to enable thin line of background graphics between closest component
1208 widthShrink = widthShrink - 2;
1209 heightShrink = heightShrink - 2;
1210 break;
1211 case QS60StylePrivate::SF_ToolTip:
1212 widthShrink = widthShrink >> 1;
1213 heightShrink = heightShrink >> 1;
1214 break;
1215 case QS60StylePrivate::SF_ListHighlight:
1216 //In Sym^3 devices highlights are less blocky
1217 if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0) {
1218 widthShrink += 2;
1219 heightShrink += 2;
1220 } else {
1221 widthShrink -= 2;
1222 heightShrink -= 2;
1223 }
1224 break;
1225 case QS60StylePrivate::SF_PopupBackground:
1226 widthShrink = widthShrink + 5;
1227 heightShrink = heightShrink + 5;
1228 break;
1229 default:
1230 break;
1231 }
1232 TRect innerRect(outerRect);
1233 innerRect.Shrink(widthShrink, heightShrink);
1234 return innerRect;
1235 }
1236
checkSupport(const int supportedRelease)1237 bool QS60StyleModeSpecifics::checkSupport(const int supportedRelease)
1238 {
1239 if (supportedRelease == ES60_All)
1240 return true;
1241
1242 const QSysInfo::S60Version currentRelease = QSysInfo::s60Version();
1243 return ( (currentRelease == QSysInfo::SV_S60_3_1 && supportedRelease & ES60_3_1) ||
1244 (currentRelease == QSysInfo::SV_S60_3_2 && supportedRelease & ES60_3_2) ||
1245 (currentRelease == QSysInfo::SV_S60_5_0 && supportedRelease & ES60_5_0) ||
1246 (currentRelease == QSysInfo::SV_S60_5_1 && supportedRelease & ES60_5_1) ||
1247 (currentRelease == QSysInfo::SV_S60_5_2 && supportedRelease & ES60_5_2) ||
1248 (currentRelease == QSysInfo::SV_S60_5_3 && supportedRelease & ES60_5_3) ||
1249 (currentRelease == QSysInfo::SV_S60_5_4 && supportedRelease & ES60_5_4) );
1250 }
1251
partSpecificThemeId(int part)1252 TAknsItemID QS60StyleModeSpecifics::partSpecificThemeId(int part)
1253 {
1254 TAknsItemID newSkinId;
1255 if (!checkSupport(m_partMap[(int)part].supportInfo))
1256 newSkinId.Set(m_partMap[(int)part].newMajorSkinId, m_partMap[(int)part].newMinorSkinId);
1257 else
1258 newSkinId.Set(m_partMap[(int)part].skinID);
1259 return newSkinId;
1260 }
1261
s60Font_specific(QS60StyleEnums::FontCategories fontCategory,int pointSize,bool resolveFontSize)1262 QFont QS60StylePrivate::s60Font_specific(
1263 QS60StyleEnums::FontCategories fontCategory,
1264 int pointSize, bool resolveFontSize)
1265 {
1266 Q_UNUSED(resolveFontSize);
1267
1268 TAknFontCategory aknFontCategory = EAknFontCategoryUndefined;
1269 switch (fontCategory) {
1270 case QS60StyleEnums::FC_Primary:
1271 aknFontCategory = EAknFontCategoryPrimary;
1272 break;
1273 case QS60StyleEnums::FC_Secondary:
1274 aknFontCategory = EAknFontCategorySecondary;
1275 break;
1276 case QS60StyleEnums::FC_Title:
1277 aknFontCategory = EAknFontCategoryTitle;
1278 break;
1279 case QS60StyleEnums::FC_PrimarySmall:
1280 aknFontCategory = EAknFontCategoryPrimarySmall;
1281 break;
1282 case QS60StyleEnums::FC_Digital:
1283 aknFontCategory = EAknFontCategoryDigital;
1284 break;
1285 case QS60StyleEnums::FC_Undefined:
1286 default:
1287 break;
1288 }
1289
1290 // Create AVKON font according the given parameters
1291 CWsScreenDevice* dev = CCoeEnv::Static()->ScreenDevice();
1292 TAknFontSpecification spec(aknFontCategory, TFontSpec(), NULL);
1293 if (pointSize > 0) {
1294 const TInt pixelSize = dev->VerticalTwipsToPixels(pointSize * KTwipsPerPoint);
1295 spec.SetTextPaneHeight(pixelSize + 4); // TODO: Is 4 a reasonable top+bottom margin?
1296 }
1297
1298 QFont result;
1299 TRAPD( error, QT_TRYCATCH_LEAVING({
1300 const CAknLayoutFont* aknFont =
1301 AknFontAccess::CreateLayoutFontFromSpecificationL(*dev, spec);
1302
1303 result = qt_TFontSpec2QFontL(aknFont->DoFontSpecInTwips());
1304 if (result.pointSize() != pointSize)
1305 result.setPointSize(pointSize); // Correct the font size returned by CreateLayoutFontFromSpecificationL()
1306
1307 delete aknFont;
1308 }));
1309 if (error) result = QFont();
1310 return result;
1311 }
1312
setActiveLayout()1313 void QS60StylePrivate::setActiveLayout()
1314 {
1315 const QSize activeScreenSize(screenSize());
1316 int activeLayoutIndex = -1;
1317 const short screenHeight = (short)activeScreenSize.height();
1318 const short screenWidth = (short)activeScreenSize.width();
1319 for (int i=0; i<m_numberOfLayouts; i++) {
1320 if (screenHeight==m_layoutHeaders[i].height &&
1321 screenWidth==m_layoutHeaders[i].width) {
1322 activeLayoutIndex = i;
1323 break;
1324 }
1325 }
1326
1327 //not found, lets try with either of dimensions
1328 if (activeLayoutIndex==-1){
1329 const bool landscape = screenHeight < screenWidth;
1330 activeLayoutIndex += (!landscape) ? 1 : 0;
1331 }
1332
1333 setCurrentLayout(activeLayoutIndex);
1334 }
1335
Q_GLOBAL_STATIC(QList<QS60StyleAnimation * >,m_animations)1336 Q_GLOBAL_STATIC(QList<QS60StyleAnimation *>, m_animations)
1337
1338 QS60StylePrivate::QS60StylePrivate()
1339 {
1340 //Animation defaults need to be created when style is instantiated
1341 QS60StyleAnimation* progressBarAnimation = new QS60StyleAnimation(QS60StyleEnums::SP_QgnGrafBarWaitAnim, 7, 100);
1342 m_animations()->append(progressBarAnimation);
1343 // No need to set active layout, if dynamic metrics API is available
1344 setActiveLayout();
1345 }
1346
removeAnimations()1347 void QS60StylePrivate::removeAnimations()
1348 {
1349 //currently only one animation in the list.
1350 if (!m_animations()->isEmpty()) {
1351 delete m_animations()->takeFirst();
1352 }
1353 }
1354
s60Color(QS60StyleEnums::ColorLists list,int index,const QStyleOption * option)1355 QColor QS60StylePrivate::s60Color(QS60StyleEnums::ColorLists list,
1356 int index, const QStyleOption *option)
1357 {
1358 static const TAknsItemID *idMap[] = {
1359 &KAknsIIDQsnHighlightColors,
1360 &KAknsIIDQsnIconColors,
1361 &KAknsIIDQsnLineColors,
1362 &KAknsIIDQsnOtherColors,
1363 &KAknsIIDQsnParentColors,
1364 &KAknsIIDQsnTextColors
1365 };
1366 Q_ASSERT((int)list < (int)sizeof(idMap)/sizeof(idMap[0]));
1367 const QColor color = QS60StyleModeSpecifics::colorValue(*idMap[(int) list], index - 1);
1368 return option ? QS60StylePrivate::stateColor(color, option) : color;
1369 }
1370
1371 // In some cases, the AVKON UI themegraphic is already in 'disabled state'.
1372 // If so, return true for these parts.
disabledPartGraphic(QS60StyleEnums::SkinParts & part)1373 bool QS60StyleModeSpecifics::disabledPartGraphic(QS60StyleEnums::SkinParts &part)
1374 {
1375 bool disabledGraphic = false;
1376 switch(part){
1377 // inactive button graphics are available from 5.0 onwards
1378 case QS60StyleEnums::SP_QsnFrButtonCornerTlInactive:
1379 case QS60StyleEnums::SP_QsnFrButtonCornerTrInactive:
1380 case QS60StyleEnums::SP_QsnFrButtonCornerBlInactive:
1381 case QS60StyleEnums::SP_QsnFrButtonCornerBrInactive:
1382 case QS60StyleEnums::SP_QsnFrButtonSideTInactive:
1383 case QS60StyleEnums::SP_QsnFrButtonSideBInactive:
1384 case QS60StyleEnums::SP_QsnFrButtonSideLInactive:
1385 case QS60StyleEnums::SP_QsnFrButtonSideRInactive:
1386 case QS60StyleEnums::SP_QsnFrButtonCenterInactive:
1387 disabledGraphic = true;
1388 break;
1389 default:
1390 break;
1391 }
1392 return disabledGraphic;
1393 }
1394
1395 // In some cases, the AVKON UI themegraphic is already in 'disabled state'.
1396 // If so, return true for these frames.
disabledFrameGraphic(QS60StylePrivate::SkinFrameElements & frame)1397 bool QS60StyleModeSpecifics::disabledFrameGraphic(QS60StylePrivate::SkinFrameElements &frame)
1398 {
1399 bool disabledGraphic = false;
1400 switch(frame){
1401 // inactive button graphics are available from 5.0 onwards
1402 case QS60StylePrivate::SF_ButtonInactive:
1403 disabledGraphic = true;
1404 break;
1405 default:
1406 break;
1407 }
1408 return disabledGraphic;
1409 }
1410
generateMissingThemeGraphic(QS60StyleEnums::SkinParts & part,const QSize & size,QS60StylePrivate::SkinElementFlags flags)1411 QPixmap QS60StyleModeSpecifics::generateMissingThemeGraphic(QS60StyleEnums::SkinParts &part,
1412 const QSize &size, QS60StylePrivate::SkinElementFlags flags)
1413 {
1414 QS60StyleEnums::SkinParts updatedPart = part;
1415 switch(part){
1416 // AVKON UI has a abnormal handling for scrollbar graphics. It is possible that the root
1417 // skin does not contain mandatory graphics for scrollbar pressed states. Therefore, AVKON UI
1418 // creates dynamically these graphics by modifying the normal state scrollbar graphics slightly.
1419 // S60Style needs to work similarly. Therefore if skingraphics call provides to be a miss
1420 // (i.e. result is not valid), style needs to draw normal graphics instead and apply some
1421 // modifications (similar to generatedIconPixmap()) to the result.
1422 case QS60StyleEnums::SP_QsnCpScrollHandleBottomPressed:
1423 updatedPart = QS60StyleEnums::SP_QsnCpScrollHandleBottom;
1424 break;
1425 case QS60StyleEnums::SP_QsnCpScrollHandleMiddlePressed:
1426 updatedPart = QS60StyleEnums::SP_QsnCpScrollHandleMiddle;
1427 break;
1428 case QS60StyleEnums::SP_QsnCpScrollHandleTopPressed:
1429 updatedPart = QS60StyleEnums::SP_QsnCpScrollHandleTop;
1430 break;
1431 default:
1432 break;
1433 }
1434 if (part==updatedPart) {
1435 return QPixmap();
1436 } else {
1437 QPixmap result = skinnedGraphics(updatedPart, size, flags);
1438 QStyleOption opt;
1439 QPalette *themePalette = QS60StylePrivate::themePalette();
1440 if (themePalette)
1441 opt.palette = *themePalette;
1442
1443 // For now, always generate new icon based on "selected". In the future possibly, expand
1444 // this to consist other possibilities as well.
1445 result = QApplication::style()->generatedIconPixmap(QIcon::Selected, result, &opt);
1446 return result;
1447 }
1448 }
1449
part(QS60StyleEnums::SkinParts part,const QSize & size,QPainter * painter,SkinElementFlags flags)1450 QPixmap QS60StylePrivate::part(QS60StyleEnums::SkinParts part,
1451 const QSize &size, QPainter *painter, SkinElementFlags flags)
1452 {
1453 QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock);
1454
1455 QPixmap result = (flags & SF_ColorSkinned)?
1456 QS60StyleModeSpecifics::colorSkinnedGraphics(part, size, painter, flags)
1457 : QS60StyleModeSpecifics::skinnedGraphics(part, size, flags);
1458
1459 lock.relock();
1460
1461 if (flags & SF_StateDisabled && !QS60StyleModeSpecifics::disabledPartGraphic(part)) {
1462 QStyleOption opt;
1463 QPalette *themePalette = QS60StylePrivate::themePalette();
1464 if (themePalette)
1465 opt.palette = *themePalette;
1466 result = QApplication::style()->generatedIconPixmap(QIcon::Disabled, result, &opt);
1467 }
1468
1469 if (!result)
1470 result = QS60StyleModeSpecifics::generateMissingThemeGraphic(part, size, flags);
1471
1472 return result;
1473 }
1474
frame(SkinFrameElements frame,const QSize & size,SkinElementFlags flags)1475 QPixmap QS60StylePrivate::frame(SkinFrameElements frame, const QSize &size, SkinElementFlags flags)
1476 {
1477 QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock);
1478 QPixmap result = QS60StyleModeSpecifics::skinnedGraphics(frame, size, flags);
1479 lock.relock();
1480
1481 if (flags & SF_StateDisabled && !QS60StyleModeSpecifics::disabledFrameGraphic(frame)) {
1482 QStyleOption opt;
1483 QPalette *themePalette = QS60StylePrivate::themePalette();
1484 if (themePalette)
1485 opt.palette = *themePalette;
1486 result = QApplication::style()->generatedIconPixmap(QIcon::Disabled, result, &opt);
1487 }
1488 return result;
1489 }
1490
backgroundTexture(bool skipCreation)1491 QPixmap QS60StylePrivate::backgroundTexture(bool skipCreation)
1492 {
1493 bool createNewBackground = false;
1494 TRect applicationRect = (static_cast<CEikAppUi*>(S60->appUi())->ApplicationRect());
1495 if (!m_background) {
1496 createNewBackground = true;
1497 } else {
1498 //if background brush does not match screensize, re-create it
1499 if (m_background->width() != applicationRect.Width() ||
1500 m_background->height() != applicationRect.Height()) {
1501 delete m_background;
1502 m_background = 0;
1503 createNewBackground = true;
1504 }
1505 }
1506
1507 if (createNewBackground && !skipCreation) {
1508 QPixmap background = part(QS60StyleEnums::SP_QsnBgScreen,
1509 QSize(applicationRect.Width(), applicationRect.Height()), 0, SkinElementFlags());
1510 m_background = new QPixmap(background);
1511
1512 // Notify all widgets that palette is updated with the actual background texture.
1513 QPalette pal = QApplication::palette();
1514 pal.setBrush(QPalette::Window, *m_background);
1515
1516 //Application palette hash is automatically cleared when QApplication::setPalette is called.
1517 //To avoid losing palette hash data, back it up before calling the setPalette() API and
1518 //restore it afterwards.
1519 typedef QHash<QByteArray, QPalette> PaletteHash;
1520 PaletteHash hash;
1521 if (qt_app_palettes_hash() || !qt_app_palettes_hash()->isEmpty())
1522 hash = *qt_app_palettes_hash();
1523 QApplication::setPalette(pal);
1524 if (hash.isEmpty()) {
1525 //set default theme palette hash
1526 setThemePaletteHash(&pal);
1527 } else {
1528 for (int i = 0; i < hash.count() - 1; i++) {
1529 QByteArray widgetClassName = hash.keys().at(i);
1530 QApplication::setPalette(hash.value(widgetClassName), widgetClassName);
1531 }
1532 }
1533 storeThemePalette(&pal);
1534 foreach (QWidget *widget, QApplication::allWidgets()) {
1535 setThemePalette(widget);
1536 widget->ensurePolished();
1537 }
1538 }
1539 if (!m_background)
1540 return QPixmap();
1541 return *m_background;
1542 }
1543
screenSize()1544 QSize QS60StylePrivate::screenSize()
1545 {
1546 return QSize(S60->screenWidthInPixels, S60->screenHeightInPixels);
1547 }
1548
QS60Style()1549 QS60Style::QS60Style()
1550 : QCommonStyle(*new QS60StylePrivate)
1551 {
1552 }
1553
1554 #ifdef Q_WS_S60
handleDynamicLayoutVariantSwitch()1555 void QS60StylePrivate::handleDynamicLayoutVariantSwitch()
1556 {
1557 clearCaches(QS60StylePrivate::CC_LayoutChange);
1558 setBackgroundTexture(qApp);
1559 setActiveLayout();
1560 foreach (QWidget *widget, QApplication::allWidgets())
1561 widget->ensurePolished();
1562 }
1563
handleSkinChange()1564 void QS60StylePrivate::handleSkinChange()
1565 {
1566 clearCaches(QS60StylePrivate::CC_ThemeChange);
1567 setThemePalette(qApp);
1568 foreach (QWidget *topLevelWidget, QApplication::allWidgets()){
1569 QEvent e(QEvent::StyleChange);
1570 QApplication::sendEvent(topLevelWidget, &e);
1571 setThemePalette(topLevelWidget);
1572 topLevelWidget->ensurePolished();
1573 }
1574 #ifndef QT_NO_PROGRESSBAR
1575 //re-start animation timer
1576 stopAnimation(QS60StyleEnums::SP_QgnGrafBarWaitAnim); //todo: once we have more animations, we could say "stop all running ones"
1577 startAnimation(QS60StyleEnums::SP_QgnGrafBarWaitAnim); //and "re-start all previously running ones"
1578 #endif
1579 }
1580
currentAnimationFrame(QS60StyleEnums::SkinParts part)1581 int QS60StylePrivate::currentAnimationFrame(QS60StyleEnums::SkinParts part)
1582 {
1583 QS60StyleAnimation *animation = animationDefinition(part);
1584 // todo: looping could be done in QS60Style::timerEvent
1585 if (animation->frameCount() == animation->currentFrame())
1586 animation->setCurrentFrame(0);
1587 return animation->currentFrame();
1588 }
1589
animationDefinition(QS60StyleEnums::SkinParts part)1590 QS60StyleAnimation* QS60StylePrivate::animationDefinition(QS60StyleEnums::SkinParts part)
1591 {
1592 int i = 0;
1593 const int animationsCount = m_animations()->isEmpty() ? 0 : m_animations()->count();
1594 for(; i < animationsCount; i++) {
1595 if (part == m_animations()->at(i)->animationId())
1596 break;
1597 }
1598 return m_animations()->at(i);
1599 }
1600
startAnimation(QS60StyleEnums::SkinParts animationPart)1601 void QS60StylePrivate::startAnimation(QS60StyleEnums::SkinParts animationPart)
1602 {
1603 Q_Q(QS60Style);
1604
1605 //Query animation data from theme and store values to local struct.
1606 QVariant themeAnimationDataVariant = QS60StyleModeSpecifics::themeDefinition(
1607 QS60StyleEnums::TD_AnimationData, animationPart);
1608 QList<QVariant> themeAnimationData = themeAnimationDataVariant.toList();
1609
1610 QS60StyleAnimation *animation = QS60StylePrivate::animationDefinition(animationPart);
1611 if (animation) {
1612 if (themeAnimationData.at(QS60StyleEnums::AD_Interval).toInt() != 0)
1613 animation->setInterval(themeAnimationData.at(QS60StyleEnums::AD_Interval).toInt());
1614
1615 if (themeAnimationData.at(QS60StyleEnums::AD_NumberOfFrames).toInt() != 0)
1616 animation->setFrameCount(themeAnimationData.at(QS60StyleEnums::AD_NumberOfFrames).toInt());
1617
1618 //todo: playmode is ignored for now, since it seems to return invalid data on some themes
1619 //lets use the table values for play mode
1620
1621 animation->setCurrentFrame(0); //always initialize
1622 const int timerId = q->startTimer(animation->interval());
1623 animation->setTimerId(timerId);
1624 }
1625 }
1626
stopAnimation(QS60StyleEnums::SkinParts animationPart)1627 void QS60StylePrivate::stopAnimation(QS60StyleEnums::SkinParts animationPart)
1628 {
1629 Q_Q(QS60Style);
1630
1631 QS60StyleAnimation *animation = QS60StylePrivate::animationDefinition(animationPart);
1632 if (animation) {
1633 animation->setCurrentFrame(0);
1634 if (animation->timerId() != 0) {
1635 q->killTimer(animation->timerId());
1636 animation->setTimerId(0);
1637 }
1638 animation->resetToDefaults();
1639 }
1640 }
1641
themeDefinition(QS60StyleEnums::ThemeDefinitions definition,QS60StyleEnums::SkinParts part)1642 QVariant QS60StyleModeSpecifics::themeDefinition(
1643 QS60StyleEnums::ThemeDefinitions definition, QS60StyleEnums::SkinParts part)
1644 {
1645 MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
1646
1647 Q_ASSERT(skinInstance);
1648
1649 switch(definition) {
1650 //Animation definitions
1651 case QS60StyleEnums::TD_AnimationData:
1652 {
1653 CAknsBmpAnimItemData *animationData = 0;
1654 TAknsItemID animationSkinId = partSpecificThemeId(part);
1655 QList<QVariant> list;
1656
1657 TRAPD( error, QT_TRYCATCH_LEAVING(
1658 animationData = static_cast<CAknsBmpAnimItemData*>(skinInstance->CreateUncachedItemDataL(
1659 animationSkinId, EAknsITBmpAnim))));
1660 if (error)
1661 return list;
1662
1663 if (animationData) {
1664 list.append((int)animationData->FrameInterval());
1665 list.append((int)animationData->NumberOfImages());
1666
1667 QS60StyleEnums::AnimationMode playMode;
1668 switch(animationData->PlayMode()) {
1669 case CBitmapAnimClientData::ECycle:
1670 playMode = QS60StyleEnums::AM_Looping;
1671 break;
1672 case CBitmapAnimClientData::EBounce:
1673 playMode = QS60StyleEnums::AM_Bounce;
1674 break;
1675 default:
1676 playMode = QS60StyleEnums::AM_PlayOnce;
1677 break;
1678 }
1679 list.append(QVariant((int)playMode));
1680 delete animationData;
1681 } else {
1682 list.append(0);
1683 list.append(0);
1684 }
1685 return list;
1686 }
1687 break;
1688 default:
1689 break;
1690 }
1691 return QVariant();
1692 }
1693
1694 #endif // Q_WS_S60
1695
1696 QT_END_NAMESPACE
1697
1698 #endif // QT_NO_STYLE_S60 || QT_PLUGIN
1699