psln/Src/PslnGeneralThemeContainer.cpp
changeset 37 89c890c70182
parent 34 6b5204869ed5
child 45 667edd0b8678
equal deleted inserted replaced
34:6b5204869ed5 37:89c890c70182
     1 /*
       
     2 * Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  General theme view's container.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 // General
       
    21 #include <aknlists.h>
       
    22 #include <eikclbd.h>
       
    23 #include <StringLoader.h>
       
    24 #include <AknGlobalNote.h>
       
    25 
       
    26 #include <aknlocalskinlib.h>
       
    27 #include <aknlistloadertfx.h>
       
    28 
       
    29 #include <aknnotewrappers.h> 
       
    30 
       
    31 // Resources.
       
    32 #include <psln.rsg>
       
    33 
       
    34 // Constants.
       
    35 #include "PslnConst.h"
       
    36 
       
    37 // Help context.
       
    38 #include <csxhelp/skins.hlp.hrh>
       
    39 
       
    40 // HAL
       
    41 #include <hal.h>
       
    42 
       
    43 // General - psln specific.
       
    44 #include "PslnGeneralThemeContainer.h"
       
    45 #include "PslnFeatures.h"
       
    46 #include "PslnModel.h"
       
    47 #include "PslnDebug.h"
       
    48 #include "PslnSkinEntry.h"
       
    49 #include "PslnUi.h"
       
    50 
       
    51 // Central Repository and Publish&Subscribe keys.
       
    52 #include <centralrepository.h>
       
    53 #include "pslninternalcrkeys.h"
       
    54 
       
    55 
       
    56 // Framework
       
    57 #include <pslnfwiconhelper.h>
       
    58 #include <mpslnfwmsklabelobserver.h>
       
    59 
       
    60 // Constant for delay for the first timer event
       
    61 const TTimeIntervalMicroSeconds32 KIdlePreviewDelay = 250000;
       
    62 
       
    63 // Constant for interval for the subsequent timer events
       
    64 const TTimeIntervalMicroSeconds32 KIdlePreviewInterval = 200000;
       
    65 
       
    66 // ============================ MEMBER FUNCTIONS ===============================
       
    67 // -----------------------------------------------------------------------------
       
    68 // C++ default constructor can NOT contain any code, that might leave.
       
    69 // -----------------------------------------------------------------------------
       
    70 //
       
    71 CPslnGeneralThemeContainer::CPslnGeneralThemeContainer()
       
    72     {
       
    73     }
       
    74 
       
    75 // -----------------------------------------------------------------------------
       
    76 // Symbian 2nd phase constructor can leave.
       
    77 // -----------------------------------------------------------------------------
       
    78 //
       
    79 void CPslnGeneralThemeContainer::ConstructL( const TRect& aRect )
       
    80     {
       
    81     iListBox = new (ELeave) CAknSingleGraphicStyleListBox;
       
    82 
       
    83 
       
    84     iPreviewIdle = CPeriodic::NewL( CActive::EPriorityIdle );
       
    85 
       
    86     RFs& fs = CCoeEnv::Static()->FsSession();
       
    87     iLocalSkinInstance = CAknLocalSkinInstance::NewL ( fs, iModel->SkinSrvSession() );
       
    88     
       
    89     if( PslnFeatures::IsSupported( KPslnSupportFastPreviewTheme ) )
       
    90         {
       
    91         InitPreviewTime();
       
    92         }
       
    93     BaseConstructL( aRect, R_PSLN_SKIN_LIST_VIEW_TITLE, KPslnNoResource );
       
    94     iOldSkinNum = iModel->NumberOfSkins();
       
    95     }
       
    96 
       
    97 // Destructor
       
    98 CPslnGeneralThemeContainer::~CPslnGeneralThemeContainer()
       
    99     {
       
   100     // iListBox is deleted in class CPslnBaseContainer.
       
   101 
       
   102     iSkinItemList.Reset();
       
   103 
       
   104     if ( iPreviewIdle )
       
   105         {
       
   106         iPreviewIdle->Cancel();
       
   107         }
       
   108     delete iPreviewIdle;
       
   109     delete iLocalSkinInstance;
       
   110 
       
   111     // Remove locally skinned items.
       
   112     MAknsSkinInstance* si = AknsUtils::SkinInstance();
       
   113     if ( si )
       
   114         {        
       
   115         si->SetChangeEventsEnabled( EFalse );
       
   116         si->RemoveLocalItemDefs();
       
   117         si->SetChangeEventsEnabled( ETrue );
       
   118         }
       
   119     }
       
   120 
       
   121 // ---------------------------------------------------------------------------
       
   122 // Checks if embedded browser is supported.
       
   123 // ---------------------------------------------------------------------------
       
   124 //
       
   125 TBool CPslnGeneralThemeContainer::IsEmbeddedLinkVisible() const
       
   126     {
       
   127     return PslnFeatures::IsEnhancedEmbeddedLinksSupported();
       
   128     }
       
   129 
       
   130 // ---------------------------------------------------------------------------
       
   131 // Updates skin item list.
       
   132 // ---------------------------------------------------------------------------
       
   133 //
       
   134 void CPslnGeneralThemeContainer::UpdateSkinListItemsL( const TInt& aNewIndex )
       
   135 {
       
   136     // This is needed to make the list effects update
       
   137     CAknListLoader::InvalidateAll();
       
   138 
       
   139     PSLN_TRACE_DEBUG("CPslnGeneralThemeContainer::UpdateSkinListItemsL");
       
   140     // Update skins.
       
   141     iItemArray->Reset();
       
   142     iToBeUsedIndex = KErrNotFound;
       
   143     if ( aNewIndex != KErrNotFound )
       
   144         {
       
   145         iToBeUsedIndex = aNewIndex;
       
   146         }
       
   147     CreateListBoxItemsL();
       
   148     
       
   149     // Create pre- and post-text icons.
       
   150     CPslnFWIconHelper* iconHelper = CPslnFWIconHelper::NewL();
       
   151     CleanupStack::PushL( iconHelper );
       
   152     iconHelper->AddIconsToSettingItemsL(
       
   153         ETrue,
       
   154         KErrNotFound, // not used since we are adding all
       
   155         iListBox );
       
   156     CleanupStack::PopAndDestroy( iconHelper );
       
   157     
       
   158     }
       
   159 
       
   160 // -----------------------------------------------------------------------------
       
   161 // Creates listbox.
       
   162 // -----------------------------------------------------------------------------
       
   163 //
       
   164 void CPslnGeneralThemeContainer::ConstructListBoxL( TInt /*aResLbxId*/ )
       
   165     {
       
   166     iListBox->DisableSingleClick( ETrue );
       
   167     UpdateSkinListItemsL( KErrNotFound );
       
   168     }
       
   169 
       
   170 // -----------------------------------------------------------------------------
       
   171 // Empty implementation of inherited method.
       
   172 // -----------------------------------------------------------------------------
       
   173 //
       
   174 void CPslnGeneralThemeContainer::CreateListBoxItemsL()
       
   175     {
       
   176     PSLN_TRACE_DEBUG("CPslnGeneralThemeContainer::CreateListBoxItemsL BEGIN");
       
   177     TInt downloadAdded = 0;
       
   178     if ( IsEmbeddedLinkVisible() )
       
   179         {
       
   180         HBufC* text = StringLoader::LoadLC(
       
   181             R_PSLN_QTN_SKINS_DOWNLOAD_SKINS, iEikonEnv );
       
   182         // Reallocating invalidates original text, so it is required that
       
   183         // original text is popped from cleanupstack, then reassigned to
       
   184         // reallocated value and finally pushed back to cleanupstack.
       
   185         HBufC* reallocText = text->ReAllocL( text->Length() + KPslnIconSize );
       
   186         CleanupStack::Pop( text );
       
   187         text = reallocText;
       
   188         CleanupStack::PushL( text );
       
   189         // Do not use reallocated string after assigning it to the original.
       
   190         reallocText = NULL;
       
   191         TPtr textPtr = text->Des();
       
   192 
       
   193         textPtr.Insert( 0, KPslnFWEmbeddedLinkListItemFormat );
       
   194         iItemArray->InsertL( 0, textPtr );
       
   195         downloadAdded = 1;
       
   196         CleanupStack::PopAndDestroy( text );
       
   197         }
       
   198 
       
   199     TInt maxSkinIndex = 0;
       
   200     if ( iModel )
       
   201         {
       
   202         // If current skin is not found => update from server.
       
   203         if ( iModel->ActiveSkinIndex() == KErrNotFound )
       
   204             {
       
   205             iModel->PerformCompleteUpdateL();
       
   206             }
       
   207         maxSkinIndex = iModel->NumberOfSkins();
       
   208         }
       
   209 
       
   210     HBufC* skinName = HBufC::NewLC( KMaxName );
       
   211     TInt currentlyActiveSkinIndex = KErrNotFound;
       
   212     static_cast<CPslnUi*>( ControlEnv()->AppUi() )->
       
   213         SetDRMProtectedSkinInSkinList( EFalse );
       
   214 
       
   215     for ( TInt skinIndex = KPslnSeries60SkinIndex;
       
   216           skinIndex < maxSkinIndex; skinIndex++ )
       
   217         {
       
   218         PSLN_TRACE_DEBUG("CPslnGeneralThemeContainer::CreateListBoxItemsL 3");
       
   219         TPtr skinNamePtr = skinName->Des();
       
   220         iModel->GetSkinNameByIndex(
       
   221             skinIndex,
       
   222             skinNamePtr,
       
   223             EPslnSkinNameTypeList );
       
   224 
       
   225         // Add pre-text icon.
       
   226         if ( iModel->IsActiveSkinSelected( skinIndex  ) )
       
   227             {
       
   228             skinNamePtr.Insert( 0, KPslnFWActiveListItemFormat );
       
   229             currentlyActiveSkinIndex = skinIndex;
       
   230             }
       
   231         else
       
   232             {
       
   233             skinNamePtr.Insert( 0, KPslnFWNonActiveListItemFormat );
       
   234             }
       
   235 
       
   236         if( iModel->IsActiveSkinSelected( skinIndex  ) && iToBeUsedIndex == KErrNotFound )
       
   237             {
       
   238             iModel->SetCurrentSelectedSkinIndex (skinIndex);
       
   239             iToBeUsedIndex = skinIndex + downloadAdded;
       
   240             }
       
   241 
       
   242         // Add post-text icon(s).
       
   243 #ifndef RD_MULTIPLE_DRIVE
       
   244         if( iModel->LocationOfSkin( skinIndex ) == EAknsSrvMMC )
       
   245             {
       
   246             skinNamePtr.Append( KPslnFWListItemFormatMMCSuffix );
       
   247             }
       
   248 #else
       
   249         if( iModel->IsThemeOnMemoryCard( skinIndex ) )
       
   250             {
       
   251             skinNamePtr.Append( KPslnFWListItemFormatMMCSuffix );
       
   252             }
       
   253         else if( iModel->IsThemeOnMassDrive( skinIndex ) )
       
   254             {
       
   255             skinNamePtr.Append( KPslnFWListItemFormatMassDriveSuffix );
       
   256             }
       
   257 #endif // RD_MULTIPLE_DRIVE
       
   258 
       
   259         switch( iModel->ProtectionOfSkin( skinIndex ) )
       
   260             {
       
   261             case EAknsSrvProtected:
       
   262                 skinNamePtr.Append( KPslnFWListItemFormatDRMProtectedSuffix );
       
   263                 static_cast<CPslnUi*>( ControlEnv()->AppUi() )->
       
   264                     SetDRMProtectedSkinInSkinList( ETrue );
       
   265                 break;
       
   266             case EAknsSrvNoRights:
       
   267             case EAknsSrvCountBased:
       
   268             case EAknsSrvFutureRights:
       
   269             case EAknsSrvExpiredRights:
       
   270                 skinNamePtr.Append( KPslnFWListItemFormatDRMExpiredSuffix );
       
   271                 static_cast<CPslnUi*>( ControlEnv()->AppUi() )->
       
   272                     SetDRMProtectedSkinInSkinList( ETrue );
       
   273                 break;
       
   274             case EAknsSrvNoProtection:
       
   275             default:
       
   276                 // Do nothing
       
   277                 break;
       
   278             }
       
   279         PSLN_TRACE_DEBUG1("CPslnGeneralThemeContainer::CreateListBoxItemsL postfix icon: %d", iModel->ProtectionOfSkin( skinIndex ) );
       
   280         iItemArray->InsertL( ( skinIndex + downloadAdded ), skinNamePtr );
       
   281         skinNamePtr.Zero();
       
   282         }
       
   283     CleanupStack::PopAndDestroy( skinName );
       
   284     
       
   285     if ( iOldSkinNum != maxSkinIndex )
       
   286         {
       
   287         iToBeUsedIndex = currentlyActiveSkinIndex + downloadAdded;
       
   288         }
       
   289     if ( ( iToBeUsedIndex >= ( 0 + downloadAdded ) ) &&
       
   290          ( iToBeUsedIndex <= ( maxSkinIndex + downloadAdded ) ) )
       
   291         {
       
   292         SetCurrentItemIndex( iToBeUsedIndex );
       
   293         iActiveSkinItemIndex = iToBeUsedIndex;
       
   294         }
       
   295     else
       
   296         {    
       
   297         SetCurrentItemIndex( ( currentlyActiveSkinIndex + downloadAdded ) );
       
   298         iActiveSkinItemIndex = currentlyActiveSkinIndex + downloadAdded;
       
   299         }
       
   300     iListBox->HandleItemAdditionL();
       
   301     if ( iOldSkinNum != maxSkinIndex )
       
   302         {
       
   303         StartThemePreviewL();
       
   304         iOldSkinNum = maxSkinIndex;
       
   305         }
       
   306     PSLN_TRACE_DEBUG("CPslnGeneralThemeContainer::CreateListBoxItemsL END");
       
   307     }
       
   308 
       
   309 // ---------------------------------------------------------------------------
       
   310 // Updates D column icons.
       
   311 // ---------------------------------------------------------------------------
       
   312 //
       
   313 void CPslnGeneralThemeContainer::UpdateSkinListItemsDColumnOnlyL()
       
   314     {
       
   315     // Create pre- and post-text icons.
       
   316     CPslnFWIconHelper* iconHelper = CPslnFWIconHelper::NewL();
       
   317     CleanupStack::PushL( iconHelper );
       
   318     iconHelper->AddIconsToSettingItemsL(
       
   319         ETrue,
       
   320         KErrNotFound, // not used since we are adding all
       
   321         iListBox );
       
   322     CleanupStack::PopAndDestroy( iconHelper );
       
   323     }
       
   324 
       
   325 // ---------------------------------------------------------------------------
       
   326 // Starts theme preview.
       
   327 // ---------------------------------------------------------------------------
       
   328 //
       
   329 void CPslnGeneralThemeContainer::StartThemePreviewL( TBool aTouch )
       
   330     {    
       
   331     // Start timer with 0.5s delay.
       
   332     iPreviewIdle->Cancel();
       
   333     
       
   334     if( PslnFeatures::IsSupported( KPslnSupportFastPreviewTheme ) )
       
   335         {
       
   336         iPreviewIdle->Start( 
       
   337             aTouch ? iPreviewDelayTime : iPreviewDelayTimeOnHardKey, 
       
   338             iPreviewIntervalTime, 
       
   339             TCallBack( DoHandleIdleTimeL, this ) );
       
   340         }
       
   341     else
       
   342         {
       
   343         iPreviewIdle->Start( 
       
   344             KIdlePreviewDelay, 
       
   345             KIdlePreviewInterval, 
       
   346             TCallBack( DoHandleIdleTimeL, this ) );
       
   347         }
       
   348     }
       
   349     
       
   350 // ---------------------------------------------------------------------------
       
   351 // Cancel theme preview.
       
   352 // ---------------------------------------------------------------------------
       
   353 //
       
   354 void CPslnGeneralThemeContainer::CancelThemePreviewL()
       
   355     {   
       
   356     iPreviewIdle->Cancel();
       
   357     }
       
   358 
       
   359 // ---------------------------------------------------------------------------
       
   360 // Sets theme preview observer.
       
   361 // ---------------------------------------------------------------------------
       
   362 //
       
   363 void CPslnGeneralThemeContainer::SetThemePreviewObserver( 
       
   364     MPslnThemePreviewObserver* aObserver )
       
   365     {
       
   366     iObserver = aObserver;
       
   367     }
       
   368 
       
   369 // ---------------------------------------------------------------------------
       
   370 // Locks up and down key events.
       
   371 // ---------------------------------------------------------------------------
       
   372 //
       
   373 void CPslnGeneralThemeContainer::LockUpAndDownKeys( const TBool& aLocked )
       
   374     {
       
   375     TRAPD( transitionEffectsValue, iModel->GetTransitionEffectStateL() );
       
   376     // Effects are enabled if value is NOT KMaxTInt.
       
   377     // Only lock keys, if transition effects are off.
       
   378     if( transitionEffectsValue == KMaxTInt ) 
       
   379         {        
       
   380         iLockedKeys = aLocked;
       
   381         }
       
   382     }
       
   383 
       
   384 // ---------------------------------------------------------------------------
       
   385 // Gets help context for Help application.
       
   386 // ---------------------------------------------------------------------------
       
   387 //
       
   388 void CPslnGeneralThemeContainer::GetHelpContext(
       
   389     TCoeHelpContext& aContext ) const
       
   390     {
       
   391     aContext.iMajor = KUidPsln;
       
   392     aContext.iContext = KSKINS_HLP_LIST;
       
   393     }
       
   394 
       
   395 // ---------------------------------------------------------------------------
       
   396 // Handles key events.
       
   397 // Starts the new preview theme load before passing the event to base class.
       
   398 // ---------------------------------------------------------------------------
       
   399 //
       
   400 TKeyResponse CPslnGeneralThemeContainer::OfferKeyEventL(
       
   401     const TKeyEvent& aKeyEvent, 
       
   402     TEventCode aType )
       
   403     {
       
   404     TKeyResponse resp = EKeyWasConsumed;
       
   405 
       
   406     // If lock is active, ignore up and down key events.
       
   407     if ( iLockedKeys &&
       
   408          !( aKeyEvent.iCode == EKeyUpArrow || aKeyEvent.iCode == EKeyDownArrow ) ||
       
   409         !iLockedKeys )
       
   410         {
       
   411         resp = CPslnBaseContainer::OfferKeyEventL( aKeyEvent, aType );
       
   412         }
       
   413     
       
   414        // React to up and down arrow key events IF download skin is not selected.
       
   415     if ( aType == EEventKey && 
       
   416          (aKeyEvent.iCode == EKeyUpArrow || aKeyEvent.iCode == EKeyDownArrow ) &&
       
   417          !iLockedKeys )
       
   418         {
       
   419         iObserver->HandlePreviewStateChange( ETrue );
       
   420         StartThemePreviewL( EFalse );
       
   421         }
       
   422 
       
   423     return resp;
       
   424     }
       
   425 
       
   426 // ---------------------------------------------------------------------------
       
   427 // Creates the skin item list for local item skinning.
       
   428 // ---------------------------------------------------------------------------
       
   429 //
       
   430 void CPslnGeneralThemeContainer::CreateSkinItemList()
       
   431     {
       
   432     PSLN_TRACE_DEBUG("CPslnGeneralThemeContainer::CreateSkinItemList" );
       
   433     TInt retVal = KErrNone;
       
   434 
       
   435     // Main area, screen, status pane and control pane.
       
   436     retVal += AddItemToList( KAknsIIDQsnBgScreen );
       
   437     //retVal += AddItemToList( KAknsIIDQsnBgAreaMainListGene );
       
   438     retVal += AddItemToList( KAknsIIDQsnBgAreaStaconRt );
       
   439     retVal += AddItemToList( KAknsIIDQsnBgAreaStaconLt );
       
   440     retVal += AddItemToList( KAknsIIDQsnBgAreaStaconRb );
       
   441     retVal += AddItemToList( KAknsIIDQsnBgAreaStaconLb );
       
   442     retVal += AddItemToList( KAknsIIDQsnBgAreaControl );
       
   443     retVal += AddItemToList( KAknsIIDQsnBgAreaControlPopup );
       
   444     retVal += AddItemToList( KAknsIIDQsnBgAreaStatus );
       
   445     retVal += AddItemToList( KAknsIIDQsnFrStatusFlat );
       
   446     retVal += AddItemToList( KAknsIIDQsnFrStatusFlatCornerTl );
       
   447     retVal += AddItemToList( KAknsIIDQsnFrStatusFlatCornerTr );
       
   448     retVal += AddItemToList( KAknsIIDQsnFrStatusFlatCornerBl );
       
   449     retVal += AddItemToList( KAknsIIDQsnFrStatusFlatCornerBr );
       
   450     retVal += AddItemToList( KAknsIIDQsnFrStatusFlatSideT );
       
   451     retVal += AddItemToList( KAknsIIDQsnFrStatusFlatSideB );
       
   452     retVal += AddItemToList( KAknsIIDQsnFrStatusFlatSideL );
       
   453     retVal += AddItemToList( KAknsIIDQsnFrStatusFlatSideR );
       
   454     retVal += AddItemToList( KAknsIIDQsnFrStatusFlatCenter );
       
   455 
       
   456     // Navipane
       
   457     retVal += AddItemToList( KAknsIIDQsnBgNavipaneSolid );
       
   458     retVal += AddItemToList( KAknsIIDQsnBgNavipaneWipe );
       
   459     retVal += AddItemToList( KAknsIIDQgnIndiNaviArrowLeft );
       
   460     retVal += AddItemToList( KAknsIIDQgnIndiNaviArrowRight );
       
   461 
       
   462     // Battery pane, signal pane
       
   463     retVal += AddItemToList( KAknsIIDQgnIndiSignalStrength );
       
   464     retVal += AddItemToList( KAknsIIDQgnIndiBatteryStrength );
       
   465 
       
   466     // Scrollbars
       
   467     retVal += AddItemToList( KAknsIIDQsnCpScrollBgTop );
       
   468     retVal += AddItemToList( KAknsIIDQsnCpScrollBgMiddle );
       
   469     retVal += AddItemToList( KAknsIIDQsnCpScrollBgBottom );
       
   470     retVal += AddItemToList( KAknsIIDQsnCpScrollHandleBgTop );
       
   471     retVal += AddItemToList( KAknsIIDQsnCpScrollHandleBgMiddle );
       
   472     retVal += AddItemToList( KAknsIIDQsnCpScrollHandleBgBottom );
       
   473     retVal += AddItemToList( KAknsIIDQsnCpScrollHandleTop );
       
   474     retVal += AddItemToList( KAknsIIDQsnCpScrollHandleMiddle );
       
   475     retVal += AddItemToList( KAknsIIDQsnCpScrollHandleBottom );
       
   476 
       
   477     // Tabs
       
   478     retVal += AddItemToList( KAknsIIDQgnGrafTabActiveL );
       
   479     retVal += AddItemToList( KAknsIIDQgnGrafTabActiveM );
       
   480     retVal += AddItemToList( KAknsIIDQgnGrafTabActiveR );
       
   481     retVal += AddItemToList( KAknsIIDQgnGrafTabPassiveL );
       
   482     retVal += AddItemToList( KAknsIIDQgnGrafTabPassiveM );
       
   483     retVal += AddItemToList( KAknsIIDQgnGrafTabPassiveR );    
       
   484 
       
   485     // Highlight
       
   486     retVal += AddItemToList( KAknsIIDQsnFrList );
       
   487     retVal += AddItemToList( KAknsIIDQsnFrListCornerTl );
       
   488     retVal += AddItemToList( KAknsIIDQsnFrListCornerTr );
       
   489     retVal += AddItemToList( KAknsIIDQsnFrListCornerBl );
       
   490     retVal += AddItemToList( KAknsIIDQsnFrListCornerBr );
       
   491     retVal += AddItemToList( KAknsIIDQsnFrListSideT );
       
   492     retVal += AddItemToList( KAknsIIDQsnFrListSideB );
       
   493     retVal += AddItemToList( KAknsIIDQsnFrListSideL );
       
   494     retVal += AddItemToList( KAknsIIDQsnFrListSideR );
       
   495     retVal += AddItemToList( KAknsIIDQsnFrListCenter );
       
   496 
       
   497     // Options menu
       
   498     retVal += AddItemToList( KAknsIIDQsnFrPopup );
       
   499     retVal += AddItemToList( KAknsIIDQsnFrPopupCornerTl );
       
   500     retVal += AddItemToList( KAknsIIDQsnFrPopupCornerTr );
       
   501     retVal += AddItemToList( KAknsIIDQsnFrPopupCornerBl );
       
   502     retVal += AddItemToList( KAknsIIDQsnFrPopupCornerBr );
       
   503     retVal += AddItemToList( KAknsIIDQsnFrPopupSideT );
       
   504     retVal += AddItemToList( KAknsIIDQsnFrPopupSideB );
       
   505     retVal += AddItemToList( KAknsIIDQsnFrPopupSideL );
       
   506     retVal += AddItemToList( KAknsIIDQsnFrPopupSideR );
       
   507     retVal += AddItemToList( KAknsIIDQsnFrPopupCenter );
       
   508     retVal += AddItemToList( KAknsIIDQsnFrPopupSub );
       
   509     retVal += AddItemToList( KAknsIIDQsnFrPopupSubCornerTl );
       
   510     retVal += AddItemToList( KAknsIIDQsnFrPopupSubCornerTr );
       
   511     retVal += AddItemToList( KAknsIIDQsnFrPopupSubCornerBl );
       
   512     retVal += AddItemToList( KAknsIIDQsnFrPopupSubCornerBr );
       
   513     retVal += AddItemToList( KAknsIIDQsnFrPopupSubSideT );
       
   514     retVal += AddItemToList( KAknsIIDQsnFrPopupSubSideB );
       
   515     retVal += AddItemToList( KAknsIIDQsnFrPopupSubSideL );
       
   516     retVal += AddItemToList( KAknsIIDQsnFrPopupSubSideR );
       
   517     retVal += AddItemToList( KAknsIIDQsnFrPopupCenterSubmenu );
       
   518     retVal += AddItemToList( KAknsIIDQgnIndiSubmenu );
       
   519 
       
   520     // Icons
       
   521     retVal += AddItemToList( KAknsIIDQgnPropPslnActive );
       
   522     retVal += AddItemToList( KAknsIIDQgnIndiMmcAdd );
       
   523 
       
   524     // QHD specific CBA.    
       
   525     retVal += AddItemToList( KAknsIIDQgnIndiSctrlMaskInactLsc );
       
   526     retVal += AddItemToList( KAknsIIDQgnIndiSctrlMaskActLsc );
       
   527     retVal += AddItemToList( KAknsIIDQgnFrSctrlButton );
       
   528     retVal += AddItemToList( KAknsIIDQgnFrSctrlButtonCornerTl );
       
   529     retVal += AddItemToList( KAknsIIDQgnFrSctrlButtonCornerTr );
       
   530     retVal += AddItemToList( KAknsIIDQgnFrSctrlButtonCornerBl );
       
   531     retVal += AddItemToList( KAknsIIDQgnFrSctrlButtonCornerBr );
       
   532     retVal += AddItemToList( KAknsIIDQgnFrSctrlButtonSideT );
       
   533     retVal += AddItemToList( KAknsIIDQgnFrSctrlButtonSideB );
       
   534     retVal += AddItemToList( KAknsIIDQgnFrSctrlButtonSideL );
       
   535     retVal += AddItemToList( KAknsIIDQgnFrSctrlButtonSideR );
       
   536     retVal += AddItemToList( KAknsIIDQgnFrSctrlButtonCenter );
       
   537     retVal += AddItemToList( KAknsIIDQgnFrSctrlSkButton  );
       
   538     retVal += AddItemToList( KAknsIIDQgnFrSctrlSkButtonCornerTl );
       
   539     retVal += AddItemToList( KAknsIIDQgnFrSctrlSkButtonCornerTr );
       
   540     retVal += AddItemToList( KAknsIIDQgnFrSctrlSkButtonCornerBl );
       
   541     retVal += AddItemToList( KAknsIIDQgnFrSctrlSkButtonCornerBr );
       
   542     retVal += AddItemToList( KAknsIIDQgnFrSctrlSkButtonSideT );
       
   543     retVal += AddItemToList( KAknsIIDQgnFrSctrlSkButtonSideB );
       
   544     retVal += AddItemToList( KAknsIIDQgnFrSctrlSkButtonSideL );
       
   545     retVal += AddItemToList( KAknsIIDQgnFrSctrlSkButtonSideR );
       
   546     retVal += AddItemToList( KAknsIIDQgnFrSctrlSkButtonCenter );
       
   547 
       
   548     __ASSERT_DEBUG( retVal == KErrNone, User::Panic(_L("Error in inserting"), 1) );
       
   549     }
       
   550 
       
   551 // ---------------------------------------------------------------------------
       
   552 // Adds one item to skin item list.
       
   553 // ---------------------------------------------------------------------------
       
   554 //
       
   555 TInt CPslnGeneralThemeContainer::AddItemToList( const TAknsItemID& aSkinID )
       
   556     {
       
   557     TAknsItemID skinItem;
       
   558     skinItem.Set( aSkinID.iMajor, aSkinID.iMinor );
       
   559     TInt error = iSkinItemList.InsertInOrder( skinItem, TAknsItemID::LinearOrder );
       
   560     PSLN_TRACE_DEBUG3("CPslnGeneralThemeContainer::AddItemToList item=%d %d added %d", 
       
   561         aSkinID.iMajor, aSkinID.iMinor, error );
       
   562     return error;
       
   563     }
       
   564 
       
   565 // -----------------------------------------------------------------------------
       
   566 // Callback function when application is idle.
       
   567 // -----------------------------------------------------------------------------
       
   568 //
       
   569 TInt CPslnGeneralThemeContainer::DoHandleIdleTimeL( TAny* aAny )
       
   570     {
       
   571     static_cast< CPslnGeneralThemeContainer* >( aAny )->HandleIdleTimeL();
       
   572     return KErrNone;
       
   573     }
       
   574 
       
   575 // -----------------------------------------------------------------------------
       
   576 // Callback function when application is idle.
       
   577 // -----------------------------------------------------------------------------
       
   578 //
       
   579 TInt CPslnGeneralThemeContainer::DoHandleEffectEndL( TAny* aAny )
       
   580     {
       
   581     static_cast< CPslnGeneralThemeContainer* >( aAny )->HandleEffectEndL();
       
   582     return KErrNone;
       
   583     }
       
   584 
       
   585 // -----------------------------------------------------------------------------
       
   586 // Handle idle time.
       
   587 // -----------------------------------------------------------------------------
       
   588 //
       
   589 void CPslnGeneralThemeContainer::HandleIdleTimeL()
       
   590     {
       
   591     PSLN_TRACE_DEBUG("CPslnGeneralThemeContainer::HandleIdleTimeL" );
       
   592     // First stop timer.
       
   593     iPreviewIdle->Cancel();
       
   594     
       
   595 
       
   596     // Check free mem
       
   597     TInt freeMem = 0;
       
   598     HAL::Get( HALData::EMemoryRAMFree , freeMem );
       
   599     if( freeMem <= KPslnMinMemSize )
       
   600         {
       
   601         HBufC* errorBuf = StringLoader::LoadLC(
       
   602             R_PSLN_QTN_MEMLO_RAM_OUT_OF_MEM );
       
   603         // Display global note.
       
   604         CAknGlobalNote* errorNote = CAknGlobalNote::NewLC();
       
   605         errorNote->ShowNoteL( EAknGlobalErrorNote, *errorBuf );
       
   606         CleanupStack::PopAndDestroy( 2 ); // errorNote & errorBuf
       
   607         return;
       
   608         }
       
   609 
       
   610     // Ignore download skin item if it is available.
       
   611     TInt modifier = IsEmbeddedLinkVisible();
       
   612     TInt activeSkinIndex = iListBox->CurrentItemIndex() - modifier;
       
   613     
       
   614     TBool usbAttached = static_cast<CPslnUi*>( ControlEnv()->AppUi() )->USBAttachState();
       
   615             
       
   616     iActiveSkinItemIndex = iListBox->CurrentItemIndex();
       
   617     if( iModel->IsValidForPreview(activeSkinIndex) == EFalse )
       
   618         {
       
   619         // If skin file didn't valid, preview active skin.
       
   620         activeSkinIndex = iModel->ActiveSkinIndex();
       
   621         }
       
   622     if ( IsEmbeddedLinkVisible() && iListBox->CurrentItemIndex() == 0 )
       
   623         {
       
   624         activeSkinIndex = iModel->ActiveSkinIndex();
       
   625         }
       
   626     if( iModel->IsThemeOnMemoryCard( activeSkinIndex ) && usbAttached)
       
   627         {
       
   628         activeSkinIndex = 0;
       
   629         }
       
   630     
       
   631     CPslnSkinEntry* activeSkin = iModel->VisibleSkin( activeSkinIndex );
       
   632     
       
   633     if ( activeSkin )
       
   634         {
       
   635         // Re-create the list, since skin preview library removes skinned items
       
   636         // from used list (performance reasons).
       
   637         iSkinItemList.Reset();
       
   638         CreateSkinItemList();        
       
   639         PSLN_TRACE_DEBUG("CPslnGeneralThemeContainer::HandleIdleTimeL Create Preview" );
       
   640         static_cast<CPslnUi*>( ControlEnv()->AppUi() )->ToggleScreenBlankerL( ETrue, ETrue, EFalse );
       
   641 
       
   642         if ( iModel->IsActiveSkinSelected( activeSkinIndex  ) )
       
   643             {            
       
   644             // Remove locally skinned items.
       
   645             MAknsSkinInstance* si = AknsUtils::SkinInstance();
       
   646             if ( si )
       
   647                 {        
       
   648                 si->SetChangeEventsEnabled( EFalse );
       
   649                 si->RemoveLocalItemDefs();
       
   650                 si->SetChangeEventsEnabled( ETrue );
       
   651                 }
       
   652             }
       
   653         else
       
   654             {   
       
   655             TRAPD(err,iLocalSkinInstance->ApplyL( activeSkin->FullName(), iSkinItemList ));
       
   656             if (err == EAknsSrvProtected)
       
   657                 {            
       
   658                 ShowErrorNoteL( R_PSLN_QTN_DRM_PREV_RIGHTS_SET );
       
   659                 }
       
   660             else if (err == KErrCorrupt)
       
   661                 {
       
   662                 //Skin corrupt
       
   663                 ShowErrorNoteL( R_PSLN_QTN_SKINS_ERROR_CORRUPTED );
       
   664                 //Preview the active skin
       
   665                 TRAP_IGNORE(iLocalSkinInstance->ApplyL( 
       
   666                                 iModel->VisibleSkin(iModel->ActiveSkinIndex())->FullName(),
       
   667                                 iSkinItemList ));
       
   668                 SetCurrentItemIndex( iModel->ActiveSkinIndex() + modifier);
       
   669                 if ( iMSKObserver )
       
   670                     {
       
   671                     iMSKObserver->CheckMiddleSoftkeyLabelL();
       
   672                     }
       
   673                 }
       
   674             else
       
   675                 {
       
   676                 User::LeaveIfError(err);    
       
   677                 }        
       
   678             }
       
   679 
       
   680         // This is needed to make the list effects update
       
   681         CAknListLoader::InvalidateAll();
       
   682 
       
   683         if( PslnFeatures::IsSupported( KPslnSupportFastPreviewTheme ) )
       
   684             {
       
   685             iPreviewIdle->Start( 
       
   686                 iPreviewDelayTime, 
       
   687                 iPreviewIntervalTime, 
       
   688                 TCallBack( DoHandleEffectEndL, this ) );
       
   689             }
       
   690         else
       
   691             {
       
   692             iPreviewIdle->Start( 
       
   693                 KIdlePreviewDelay, 
       
   694                 KIdlePreviewInterval, 
       
   695                 TCallBack( DoHandleEffectEndL, this ) );
       
   696             }
       
   697         }
       
   698     }
       
   699 
       
   700 // ---------------------------------------------------------------------------
       
   701 // Handle effect end.
       
   702 // ---------------------------------------------------------------------------
       
   703 //
       
   704 void CPslnGeneralThemeContainer::HandleEffectEndL()
       
   705     {
       
   706     // First stop timer.
       
   707     iPreviewIdle->Cancel();
       
   708     static_cast<CPslnUi*>( ControlEnv()->AppUi() )->
       
   709         ToggleScreenBlankerL( EFalse, EFalse );
       
   710     iObserver->HandlePreviewStateChange( EFalse );
       
   711     }
       
   712 
       
   713 
       
   714     
       
   715 // ---------------------------------------------------------------------------
       
   716 // Restart Quick Preview
       
   717 // ---------------------------------------------------------------------------
       
   718 //
       
   719 void CPslnGeneralThemeContainer::RestartQuickPreviewL()
       
   720     {
       
   721     TInt modifier = IsEmbeddedLinkVisible();
       
   722     TInt activeSkinIndex = iListBox->CurrentItemIndex() - modifier;
       
   723     if( iModel->IsThemeOnMemoryCard(activeSkinIndex) )
       
   724         {
       
   725         HandleIdleTimeL();
       
   726         }
       
   727     }
       
   728     
       
   729 // ---------------------------------------------------------------------------
       
   730 // Get Preview Skin Index
       
   731 // ---------------------------------------------------------------------------
       
   732 //    
       
   733 TInt CPslnGeneralThemeContainer::PreviewSkinIndex()
       
   734     {
       
   735     // Ignore download skin item if it is available.
       
   736     TInt modifier = IsEmbeddedLinkVisible();
       
   737     TInt previewSkinIndex = iListBox->CurrentItemIndex() - modifier;
       
   738     
       
   739     TBool usbAttached = static_cast<CPslnUi*>( ControlEnv()->AppUi() )->USBAttachState();
       
   740     
       
   741     if( !iModel->IsValidForPreview(previewSkinIndex) )
       
   742         {
       
   743         // If skin file on memorycard and usb attached, preview default skin.
       
   744         previewSkinIndex = 0;
       
   745         }
       
   746     else if( iModel->IsThemeOnMemoryCard( previewSkinIndex ) && usbAttached)
       
   747         {
       
   748         // If skin file didn't exist, preview default skin.
       
   749         previewSkinIndex = 0;
       
   750         }
       
   751     return previewSkinIndex;
       
   752     }
       
   753 
       
   754 // ---------------------------------------------------------------------------
       
   755 // Set theme preview state active.
       
   756 // ---------------------------------------------------------------------------
       
   757 //
       
   758 void CPslnGeneralThemeContainer::SetPreviewStateActive()
       
   759     {
       
   760     iObserver->HandlePreviewStateChange( ETrue );
       
   761     }
       
   762     
       
   763 // ---------------------------------------------------------------------------
       
   764 // Checks if current focus theme is in preview state. 
       
   765 // ---------------------------------------------------------------------------
       
   766 //
       
   767 TBool CPslnGeneralThemeContainer::CurrentThemeInPreviewState()
       
   768     {
       
   769     return iListBox->CurrentItemIndex() != iActiveSkinItemIndex;
       
   770     }
       
   771     
       
   772 // -----------------------------------------------------------------------------
       
   773 // Load preview delay time settings from CenRep.
       
   774 // -----------------------------------------------------------------------------
       
   775 //
       
   776 void CPslnGeneralThemeContainer::InitPreviewTime()
       
   777     {
       
   778     //load from cenrep
       
   779     iPreviewDelayTime = KErrNone;
       
   780     iPreviewDelayTimeOnHardKey = KErrNone;
       
   781     iPreviewIntervalTime = KErrNone;
       
   782     CRepository* timeRepository = NULL;
       
   783     TRAPD( err, timeRepository = CRepository::NewL( KCRUidThemes ) );
       
   784     if( err != KErrNone )
       
   785         {
       
   786         return;
       
   787         }
       
   788     timeRepository->Get( KThemesPreviewDelayTime, iPreviewDelayTime ); 
       
   789     timeRepository->Get( KThemesPreviewDelayTimeOnHardKey, iPreviewDelayTimeOnHardKey ); 
       
   790     timeRepository->Get( KThemesPreviewIntervalTime, iPreviewIntervalTime );
       
   791     delete timeRepository;
       
   792     timeRepository = NULL;
       
   793     }
       
   794 
       
   795 // -----------------------------------------------------------------------------
       
   796 // Show Error Note.
       
   797 // -----------------------------------------------------------------------------
       
   798 //
       
   799 void CPslnGeneralThemeContainer::ShowErrorNoteL( TInt  aResourceId ) 
       
   800     {
       
   801     HBufC* errorText = StringLoader::LoadLC(aResourceId);
       
   802     CAknErrorNote * note = new(ELeave) CAknErrorNote (EFalse);
       
   803     note->ExecuteLD(*errorText);
       
   804     CleanupStack::PopAndDestroy(errorText);
       
   805     }
       
   806 
       
   807 // -----------------------------------------------------------------------------
       
   808 // Handle Pointer Event.
       
   809 // -----------------------------------------------------------------------------
       
   810 //
       
   811 void CPslnGeneralThemeContainer::HandlePointerEventL( const TPointerEvent &aPointerEvent )
       
   812     {
       
   813     // Cancel this kind of preview, in conflict with kinetic scrolling.
       
   814 /*
       
   815     // Launch theme preview when pen up, in case pen is out of listbox.
       
   816     if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
       
   817         {
       
   818         iObserver->HandlePreviewStateChange( ETrue );
       
   819         StartThemePreviewL( ETrue );
       
   820         }
       
   821 */
       
   822     
       
   823     CCoeControl::HandlePointerEventL( aPointerEvent );
       
   824     }
       
   825 
       
   826 //  End of File