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 &centerId);
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 &centerId)
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