psln/Src/PslnMainViewContainer.cpp
branchRCL_3
changeset 56 d48ab3b357f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/psln/Src/PslnMainViewContainer.cpp	Wed Sep 01 12:16:19 2010 +0100
@@ -0,0 +1,388 @@
+/*
+* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Container for Main View.
+*
+*/
+
+
+
+// INCLUDE FILES
+
+// Psln specific.
+#include "PslnMainViewContainer.h"
+#include "PslnUi.h"
+#include "PslnDebug.h"
+#include "PslnConst.h"
+
+// Lists & Icons.
+#include <aknlists.h>
+#include <AknIconArray.h>
+#include <eikclbd.h>
+
+// Framework
+#include <pslnfwplugininterface.h>
+#include "PslnPluginHandler.h"
+
+// Resources
+#include <psln.rsg>
+#include <pslnicon.mbg>
+#include <data_caging_path_literals.hrh>
+
+// Help related.
+#include <csxhelp/skins.hlp.hrh>
+
+// CONSTANTS
+// Tab character.
+_LIT( KTab, "\t" );
+
+// Icon indexes for listbox.
+const TInt KPslnGeneralId          = 0;
+const TInt KPslnWallpaperId        = 1;
+const TInt KPslnScreenSaverId      = 2;
+// Container granularity.
+const TInt KPslnMainConGranularity = 6;
+// Max index of static (i.e. non-ECOM) folder when no plugins loaded.
+const TInt KPslnStaticFolderNum = 2;
+
+// Path to icon file.
+_LIT( KPslnIconFilename, "z:pslnicon.mbm" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------------------------
+// C++ constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CPslnMainViewContainer::CPslnMainViewContainer( CPslnUi* aPslnUi )
+    : iPslnUi( aPslnUi )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CPslnMainViewContainer::~CPslnMainViewContainer()
+    {
+    // iListBox is deleted in class CPslnBaseContainer.
+    delete iItems;
+    }
+
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CPslnMainViewContainer::ConstructL( const TRect& aRect )
+    {
+    iListBox = new (ELeave) CAknSingleLargeStyleListBox;
+
+    BaseConstructL(
+        aRect,
+        R_PSLN_SKIN_LIST_VIEW_TITLE,
+        R_PSLN_MAIN_VIEW_LBX );
+    }
+
+// ---------------------------------------------------------------------------
+// Creates listbox.
+// ---------------------------------------------------------------------------
+//
+void CPslnMainViewContainer::ConstructListBoxL( TInt aResLbxId )
+    {
+    iItems = iCoeEnv->ReadDesC16ArrayResourceL( aResLbxId );
+    CreateListBoxItemsL();
+    }
+
+
+// ---------------------------------------------------------------------------
+// Creates listbox items.
+// ---------------------------------------------------------------------------
+//
+void CPslnMainViewContainer::CreateListBoxItemsL()
+    {
+    PSLN_TRACE_DEBUG("CPslnMainViewContainer::CreateListBoxItemsL BEGIN");
+    // Array for icons in the listbox. Owns the icons.
+    CAknIconArray* iconList =
+        new (ELeave) CAknIconArray( KPslnMainConGranularity );
+    CleanupStack::PushL( iconList );
+
+    // Find the resource file:
+    HBufC* iconFile = HBufC::NewLC( KMaxFileName );
+    TPtr fileNamePtr = iconFile->Des();
+    GetIconFilePath( fileNamePtr );
+
+    // Add non-plugin icons to icon group.
+    // General icon.
+    AddIconL(
+        iconList,
+        KAknsIIDQgnPropPslnGeneralSub,
+        fileNamePtr,
+        EMbmPslniconQgn_prop_psln_general_sub,
+        EMbmPslniconQgn_prop_psln_general_sub_mask );
+
+    // Wallpaper icon.
+    AddIconL(
+        iconList,
+        KAknsIIDQgnPropPslnWpaperSub,
+        fileNamePtr,
+        EMbmPslniconQgn_prop_psln_wpaper_sub,
+        EMbmPslniconQgn_prop_psln_wpaper_sub_mask );
+
+    // Screensaver screensaver.
+    AddIconL(
+        iconList,
+        KAknsIIDQgnPropPslnSsaverSub,
+        fileNamePtr,
+        EMbmPslniconQgn_prop_psln_ssaver_sub,
+        EMbmPslniconQgn_prop_psln_ssaver_sub_mask );
+
+    CleanupStack::PopAndDestroy( iconFile );
+
+    // Add General Theme static view.
+    // Icon location is ok - directly from resources.
+    MakeItemL( KPslnGeneralId );
+
+    // How many dynamic items have been added in-between.
+    TInt offset = 0;
+    iPluginArray = iPslnUi->PluginHandler()->GetPluginArray();
+    // Create buffers.
+    HBufC* buf = HBufC::NewLC( KPslnItemLength );
+    TPtr ptrBuf = buf->Des();
+    HBufC* item = HBufC::NewLC( KPslnItemLength );
+    TPtr ptrItem = item->Des();
+    // Add Active Idle (and Application Shell) plugin(s).
+    if ( iPluginArray )
+        {
+        for ( TInt i = 0; i < iPluginArray->Count(); i++ )
+            {
+            CPslnFWPluginInterface* plugin = iPluginArray->operator[]( i );
+            CleanupStack::PushL( plugin );
+
+            // TRAP all but OOM, so that plugins cannot cause Psln to fail to
+            // launch.
+            TRAPD( err,
+                offset += MakePluginItemL( *plugin, *iconList, ptrBuf, ptrItem ) );
+            if ( err == KErrNoMemory )
+                {
+                User::Leave( KErrNoMemory );
+                }
+
+            // Initialize buffers.
+            ptrBuf.Zero();
+            ptrItem.Zero();
+
+            // icon is now owned by icon array and plugin by plugin handler
+            CleanupStack::Pop( plugin );
+            plugin = NULL;
+            }
+        }
+    CleanupStack::PopAndDestroy( 2, buf ); // buf, item
+
+    // Add Screen Saver and Wallpaper static views.
+    TBitFlags views = iPslnUi->ViewSupport();
+    if ( views.IsSet( CPslnUi::EPslnWallpaperView ) )
+        {
+        MakeItemL( KPslnWallpaperId, offset );
+        }
+
+    if ( views.IsSet( CPslnUi::EPslnScreensaverView ) )
+        {
+        MakeItemL( KPslnScreenSaverId, offset );
+        }
+
+    iPslnUi->AllViewsDone();
+
+    // Destroy the old icons because SetIconArray() does not destroy them.
+    CEikColumnListBox* listbox = static_cast<CEikColumnListBox*> ( iListBox );
+    CArrayPtr<CGulIcon>* oldIcons =
+        listbox->ItemDrawer()->ColumnData()->IconArray();
+    if( oldIcons )
+        {
+        oldIcons->ResetAndDestroy();
+        delete oldIcons;
+        }
+
+    // Transfer ownership of icon array to the lbx.
+    listbox->ItemDrawer()->ColumnData()->SetIconArray( iconList );
+    CleanupStack::Pop( iconList );
+
+    iListBox->HandleItemAdditionL();
+    PSLN_TRACE_DEBUG("CPslnMainViewContainer::CreateListBoxItemsL END");
+    }
+
+// ---------------------------------------------------------------------------
+// Creates a specific setting item.
+// ---------------------------------------------------------------------------
+//
+void CPslnMainViewContainer::MakeItemL( const TInt aIndex, const TInt aOffset )
+    {
+    PSLN_TRACE_DEBUG("CPslnMainViewContainer::MakeItemL BEGIN");
+    if ( aIndex > iItems->Count() )
+        {
+        User::Leave( KErrArgument );
+        }
+    HBufC* item = (*iItems)[aIndex].AllocLC();
+    // Reallocating invalidates the original string.
+    HBufC* reallocItem = item->ReAllocL( item->Length() + KPslnIconSize );
+    CleanupStack::Pop( item );
+    item = reallocItem;
+    CleanupStack::PushL( item );
+    reallocItem = NULL; // do not use anymore.
+    TPtr ptr = item->Des();
+
+    TInt wallpaperOffset = 0;
+    if ( aIndex == KPslnScreenSaverId 
+	    && !iPslnUi->ViewSupport().IsSet( CPslnUi::EPslnWallpaperView ) )
+        {
+        wallpaperOffset = 1;
+        }
+    if ( aOffset != KErrNotFound )
+        {
+        iItemArray->InsertL( aIndex + aOffset - wallpaperOffset, ptr );
+        }
+    else
+        {
+        iItemArray->InsertL( aIndex - wallpaperOffset, ptr );
+        }
+    CleanupStack::PopAndDestroy( item );
+    PSLN_TRACE_DEBUG("CPslnMainViewContainer::MakeItemL END");
+    }
+
+// ---------------------------------------------------------------------------
+// Gets help context for Help application.
+// ---------------------------------------------------------------------------
+//
+void CPslnMainViewContainer::GetHelpContext( TCoeHelpContext& aContext ) const
+    {
+    aContext.iMajor = KUidPsln;
+    aContext.iContext = KSKINS_HLP_APP_MAIN;
+    }
+
+// ---------------------------------------------------------------------------
+// Creates a plugin item (with title and icon)
+// ---------------------------------------------------------------------------
+//
+TInt CPslnMainViewContainer::MakePluginItemL(
+    CPslnFWPluginInterface& aPlugin, CAknIconArray& aIconList,
+    TPtr& aBufPtr, TPtr& aItemPtr  )
+    {
+    TInt offset = 0;
+    // Adding icon.
+    CGulIcon* icon = aPlugin.CreateIconL();
+    CleanupStack::PushL( icon );
+    PSLN_TRACE_DEBUG("CPslnMainViewContainer::MakePluginItemL BEGIN");
+
+    aPlugin.GetCaptionL( aBufPtr );
+    TInt location = KErrNotFound;
+    CPslnFWPluginInterface::TPslnFWLocationType locType;
+    aPlugin.GetLocationTypeAndIndex( locType, location );
+
+    // If it is AS or AI plugin, add it.
+    if ( aPlugin.Id().iUid == KPslnASPluginUid.iUid ||
+         aPlugin.Id().iUid == KPslnAIPluginUid.iUid )
+        {
+        TInt upcomingPlace = location + KPslnStaticFolderNum;
+        if ( upcomingPlace >= aIconList.Count() )
+            {
+            upcomingPlace = aIconList.Count();
+            }
+        aIconList.InsertL( upcomingPlace , icon );
+
+        // Let's correct the icon index.
+        upcomingPlace = location + KPslnStaticFolderNum;
+        aItemPtr.AppendNum( upcomingPlace );
+        aItemPtr.Append( KTab );
+        aItemPtr.Append( aBufPtr );
+        if ( location >= iItemArray->Count() )
+            {
+            location = iItemArray->Count();
+            }
+        iItemArray->InsertL( location , aItemPtr );
+        offset++;
+        }
+    else
+        {
+        aIconList.AppendL( icon );
+        // use icon list position as index
+        // iconList->Count() is here always at least 1
+        // we need to adjust the icon index based on loaded plugins
+        // which are inserted between static views.
+        aItemPtr.AppendNum( aIconList.Count() - 1 + iAIAdded + iASAdded );
+        aItemPtr.Append( KTab );
+        aItemPtr.Append( aBufPtr );
+        iItemArray->AppendL( aItemPtr );
+        }
+
+    if ( aPlugin.Id().iUid == KPslnASPluginUid.iUid )
+        {
+        iASAdded = ETrue;
+        }
+
+    if ( aPlugin.Id().iUid == KPslnAIPluginUid.iUid )
+        {
+        iAIAdded = ETrue;
+        }
+
+    CleanupStack::Pop( icon );
+    return offset;
+    }
+
+// ---------------------------------------------------------------------------
+// Adds icon to icon array.
+// ---------------------------------------------------------------------------
+//
+void CPslnMainViewContainer::AddIconL(
+    CAknIconArray* aIcons,
+    const TAknsItemID& aSkinId,
+    const TDesC& aFileName,
+    TInt aBitmapId,
+    TInt aMaskId )
+    {
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;
+    AknsUtils::CreateIconL(
+        AknsUtils::SkinInstance(),
+        aSkinId,
+        bitmap,
+        mask,
+        aFileName,
+        aBitmapId,
+        aMaskId );
+    CleanupStack::PushL( bitmap );
+    CleanupStack::PushL( mask );
+    CGulIcon* icon = CGulIcon::NewL( bitmap, mask );
+    CleanupStack::Pop( 2, bitmap ); // bitmap, mask
+    CleanupStack::PushL( icon );
+    if ( aIcons )
+        {
+        aIcons->AppendL( icon );
+        }
+    CleanupStack::Pop( icon );
+    }
+
+// ---------------------------------------------------------------------------
+// Parses icon file path to given parameter.
+// ---------------------------------------------------------------------------
+//
+void CPslnMainViewContainer::GetIconFilePath( TDes& aPath )
+    {
+    // Find the resource file:
+    TParse parse;
+    parse.Set( KPslnIconFilename, &KDC_APP_BITMAP_DIR, NULL );
+    if ( aPath.MaxLength() >= parse.FullName().Length() )
+        {
+        aPath.Copy( parse.FullName() );
+        }
+    }
+
+//  End of File