+/*\r
+ ========================================================================\r
+ Name : ComingNext_SkinFetcherContainerView.cpp\r
+ Author : Michael Prager\r
+ Copyright : Licensed under GPLv3\r
+ Description : \r
+ ========================================================================\r
+ */\r
+// [[[ begin generated region: do not modify [Generated System Includes]\r
+#include <aknviewappui.h>\r
+#include <eikmenub.h>\r
+#include <avkon.hrh>\r
+#include <barsread.h>\r
+#include <stringloader.h>\r
+#include <eiklabel.h>\r
+#include <eikenv.h>\r
+#include <akncontext.h>\r
+#include <akntitle.h>\r
+#include <eikbtgpc.h>\r
+#include <aknlistquerydialog.h>\r
+#include <akniconarray.h>\r
+#include <aknnotewrappers.h>\r
+#include <ComingNext_SkinFetcher.rsg>\r
+// ]]] end generated region [Generated System Includes]\r
+\r
+// [[[ begin generated region: do not modify [Generated User Includes]\r
+\r
+#include "ComingNext_SkinFetcher.hrh"\r
+#include "ComingNext_SkinFetcherContainerView.h"\r
+#include "ComingNext_SkinFetcherContainer.hrh"\r
+#include "ComingNext_SkinFetcherContainer.h"\r
+// ]]] end generated region [Generated User Includes]\r
+\r
+// [[[ begin generated region: do not modify [Generated Constants]\r
+// ]]] end generated region [Generated Constants]\r
+\r
+#include "SkinFetcher.h"\r
+\r
+/**\r
+ * First phase of Symbian two-phase construction. Should not contain any\r
+ * code that could leave.\r
+ */\r
+CComingNext_SkinFetcherContainerView::CComingNext_SkinFetcherContainerView()\r
+{\r
+ // [[[ begin generated region: do not modify [Generated Contents]\r
+ iComingNext_SkinFetcherContainer = NULL;\r
+ // ]]] end generated region [Generated Contents]\r
+\r
+}\r
+\r
+/** \r
+ * The view's destructor removes the container from the control\r
+ * stack and destroys it.\r
+ */\r
+CComingNext_SkinFetcherContainerView::~CComingNext_SkinFetcherContainerView()\r
+{\r
+ // [[[ begin generated region: do not modify [Generated Contents]\r
+ delete iComingNext_SkinFetcherContainer;\r
+ iComingNext_SkinFetcherContainer = NULL;\r
+ // ]]] end generated region [Generated Contents]\r
+\r
+}\r
+\r
+/**\r
+ * Symbian two-phase constructor.\r
+ * This creates an instance then calls the second-phase constructor\r
+ * without leaving the instance on the cleanup stack.\r
+ * @return new instance of CComingNext_SkinFetcherContainerView\r
+ */\r
+CComingNext_SkinFetcherContainerView* CComingNext_SkinFetcherContainerView::NewL()\r
+{\r
+ CComingNext_SkinFetcherContainerView* self =\r
+ CComingNext_SkinFetcherContainerView::NewLC();\r
+ CleanupStack::Pop(self);\r
+ return self;\r
+}\r
+\r
+/**\r
+ * Symbian two-phase constructor.\r
+ * This creates an instance, pushes it on the cleanup stack,\r
+ * then calls the second-phase constructor.\r
+ * @return new instance of CComingNext_SkinFetcherContainerView\r
+ */\r
+CComingNext_SkinFetcherContainerView* CComingNext_SkinFetcherContainerView::NewLC()\r
+{\r
+ CComingNext_SkinFetcherContainerView* self =\r
+ new (ELeave) CComingNext_SkinFetcherContainerView();\r
+ CleanupStack::PushL(self);\r
+ self->ConstructL();\r
+ return self;\r
+}\r
+\r
+/**\r
+ * Second-phase constructor for view. \r
+ * Initialize contents from resource.\r
+ */\r
+void CComingNext_SkinFetcherContainerView::ConstructL()\r
+{\r
+ // [[[ begin generated region: do not modify [Generated Code]\r
+ BaseConstructL( R_COMING_NEXT_SKIN_FETCHER_CONTAINER_COMING_NEXT_SKIN_FETCHER_CONTAINER_VIEW_2 );\r
+ \r
+ // ]]] end generated region [Generated Code]\r
+\r
+ // add your own initialization code here\r
+\r
+}\r
+\r
+/**\r
+ * @return The UID for this view\r
+ */\r
+TUid CComingNext_SkinFetcherContainerView::Id() const\r
+{\r
+ return TUid::Uid(EComingNext_SkinFetcherContainerViewId);\r
+}\r
+\r
+/**\r
+ * Handle a command for this view (override)\r
+ * @param aCommand command id to be handled\r
+ */\r
+void CComingNext_SkinFetcherContainerView::HandleCommandL(TInt aCommand)\r
+{\r
+ // [[[ begin generated region: do not modify [Generated Code]\r
+ TBool commandHandled = EFalse;\r
+ switch ( aCommand )\r
+ { // code to dispatch to the AknView's menu and CBA commands is generated here\r
+ \r
+ case EComingNext_SkinFetcherContainerViewControlPaneLeftId:\r
+ commandHandled = HandleControlPaneLeftSoftKeyPressedL( aCommand );\r
+ break;\r
+ \r
+ case EAknSoftkeyExit:\r
+ commandHandled = HandleControlPaneRightSoftKeyPressedL( aCommand );\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ \r
+ \r
+ if ( !commandHandled ) \r
+ {\r
+ \r
+ if ( aCommand == EAknSoftkeyExit )\r
+ {\r
+ AppUi()->HandleCommandL( EEikCmdExit );\r
+ }\r
+ \r
+ }\r
+ // ]]] end generated region [Generated Code]\r
+\r
+}\r
+\r
+/**\r
+ * Handles user actions during activation of the view, \r
+ * such as initializing the content.\r
+ */\r
+void CComingNext_SkinFetcherContainerView::DoActivateL(\r
+ const TVwsViewId& /*aPrevViewId*/, TUid /*aCustomMessageId*/,\r
+ const TDesC8& /*aCustomMessage*/)\r
+{\r
+ // [[[ begin generated region: do not modify [Generated Contents]\r
+ SetupStatusPaneL();\r
+ \r
+ \r
+ \r
+ \r
+ if ( iComingNext_SkinFetcherContainer == NULL )\r
+ {\r
+ iComingNext_SkinFetcherContainer = CreateContainerL();\r
+ iComingNext_SkinFetcherContainer->SetMopParent( this );\r
+ AppUi()->AddToStackL( *this, iComingNext_SkinFetcherContainer );\r
+ } \r
+ // ]]] end generated region [Generated Contents]\r
+\r
+}\r
+\r
+/**\r
+ */\r
+void CComingNext_SkinFetcherContainerView::DoDeactivate()\r
+{\r
+ // [[[ begin generated region: do not modify [Generated Contents]\r
+ CleanupStatusPane();\r
+ \r
+ if ( iComingNext_SkinFetcherContainer != NULL )\r
+ {\r
+ AppUi()->RemoveFromViewStack( *this, iComingNext_SkinFetcherContainer );\r
+ delete iComingNext_SkinFetcherContainer;\r
+ iComingNext_SkinFetcherContainer = NULL;\r
+ }\r
+ // ]]] end generated region [Generated Contents]\r
+\r
+}\r
+\r
+/** \r
+ * Handle status pane size change for this view (override)\r
+ */\r
+void CComingNext_SkinFetcherContainerView::HandleStatusPaneSizeChange()\r
+{\r
+ CAknView::HandleStatusPaneSizeChange();\r
+\r
+ // this may fail, but we're not able to propagate exceptions here\r
+ TVwsViewId view;\r
+ AppUi()->GetActiveViewId(view);\r
+ if (view.iViewUid == Id())\r
+ {\r
+ TInt result;\r
+ TRAP( result, SetupStatusPaneL() );\r
+ }\r
+\r
+ // [[[ begin generated region: do not modify [Generated Code]\r
+ // ]]] end generated region [Generated Code]\r
+\r
+}\r
+\r
+// [[[ begin generated function: do not modify\r
+void CComingNext_SkinFetcherContainerView::SetupStatusPaneL()\r
+ {\r
+ // reset the context pane\r
+ TUid contextPaneUid = TUid::Uid( EEikStatusPaneUidContext );\r
+ CEikStatusPaneBase::TPaneCapabilities subPaneContext = \r
+ StatusPane()->PaneCapabilities( contextPaneUid );\r
+ if ( subPaneContext.IsPresent() && subPaneContext.IsAppOwned() )\r
+ {\r
+ CAknContextPane* context = static_cast< CAknContextPane* > ( \r
+ StatusPane()->ControlL( contextPaneUid ) );\r
+ context->SetPictureToDefaultL();\r
+ }\r
+ \r
+ // setup the title pane\r
+ TUid titlePaneUid = TUid::Uid( EEikStatusPaneUidTitle );\r
+ CEikStatusPaneBase::TPaneCapabilities subPaneTitle = \r
+ StatusPane()->PaneCapabilities( titlePaneUid );\r
+ if ( subPaneTitle.IsPresent() && subPaneTitle.IsAppOwned() )\r
+ {\r
+ CAknTitlePane* title = static_cast< CAknTitlePane* >( \r
+ StatusPane()->ControlL( titlePaneUid ) );\r
+ TResourceReader reader;\r
+ iEikonEnv->CreateResourceReaderLC( reader, R_COMING_NEXT_SKIN_FETCHER_CONTAINER_TITLE_RESOURCE_2 );\r
+ title->SetFromResourceL( reader );\r
+ CleanupStack::PopAndDestroy(); // reader internal state\r
+ }\r
+ \r
+ }\r
+\r
+// ]]] end generated function\r
+\r
+// [[[ begin generated function: do not modify\r
+void CComingNext_SkinFetcherContainerView::CleanupStatusPane()\r
+ {\r
+ }\r
+\r
+// ]]] end generated function\r
+\r
+/**\r
+ * Creates the top-level container for the view. You may modify this method's\r
+ * contents and the CComingNext_SkinFetcherContainer::NewL() signature as needed to initialize the\r
+ * container, but the signature for this method is fixed.\r
+ * @return new initialized instance of CComingNext_SkinFetcherContainer\r
+ */\r
+CComingNext_SkinFetcherContainer* CComingNext_SkinFetcherContainerView::CreateContainerL()\r
+{\r
+ return CComingNext_SkinFetcherContainer::NewL(ClientRect(), NULL, this);\r
+}\r
+\r
+/** \r
+ * Handle the leftSoftKeyPressed event.\r
+ * @return ETrue if the command was handled, EFalse if not\r
+ */\r
+TBool CComingNext_SkinFetcherContainerView::HandleControlPaneLeftSoftKeyPressedL(\r
+ TInt aCommand)\r
+{\r
+ TInt pos = RunListQuery1L(NULL, NULL, NULL);\r
+ if (pos != -1)\r
+ {\r
+ CSkinFetcher::GenerateBackgroundImage(pos,\r
+ CAknViewAppUi::EAppUiOrientationPortrait);\r
+ CSkinFetcher::GenerateBackgroundImage(pos,\r
+ CAknViewAppUi::EAppUiOrientationLandscape);\r
+ RunNote1L();\r
+ }\r
+ return ETrue;\r
+}\r
+\r
+/** \r
+ * Handle the rightSoftKeyPressed event.\r
+ * @return ETrue if the command was handled, EFalse if not\r
+ */\r
+TBool CComingNext_SkinFetcherContainerView::HandleControlPaneRightSoftKeyPressedL(\r
+ TInt aCommand)\r
+{\r
+ iAvkonAppUi->Exit();\r
+ return ETrue;\r
+}\r
+\r
+// [[[ begin generated function: do not modify\r
+/**\r
+ * Create a list box item with the given column values.\r
+ */\r
+void CComingNext_SkinFetcherContainerView::CreateListQuery1ItemL( \r
+ TDes& aBuffer, \r
+ \r
+ const TDesC& aMainText )\r
+ {\r
+ _LIT ( KStringHeader, "%S" );\r
+\r
+ aBuffer.Format( KStringHeader(), &aMainText );\r
+ }\r
+// ]]] end generated function\r
+\r
+// [[[ begin generated function: do not modify\r
+/**\r
+ * Add an item to the list by reading the text items from resource\r
+ * and setting a single image property (if available) from an index\r
+ * in the list box's icon array.\r
+ * @param aResourceId id of an ARRAY resource containing the textual\r
+ * items in the columns\r
+ * \r
+ */\r
+void CComingNext_SkinFetcherContainerView::CreateListQuery1ResourceArrayItemL( \r
+ TDes& aBuffer, \r
+ TInt aResourceId )\r
+ {\r
+ CDesCArray* array = CCoeEnv::Static()->ReadDesCArrayResourceL( aResourceId );\r
+ CleanupStack::PushL( array );\r
+ CreateListQuery1ItemL( aBuffer, ( *array ) [ 0 ] );\r
+ CleanupStack::PopAndDestroy( array );\r
+ }\r
+// ]]] end generated function\r
+\r
+// [[[ begin generated function: do not modify\r
+/**\r
+ * Initialize contents of the popup item list. This constructs the array\r
+ * and pushes it on the cleanup stack.\r
+ * @return item array, never null\r
+ */\r
+CDesCArray* CComingNext_SkinFetcherContainerView::InitializeListQuery1LC()\r
+ {\r
+ const int KNumItems = 5;\r
+ CDesCArray* itemArray = new ( ELeave ) CDesCArrayFlat( KNumItems ? KNumItems : 1 );\r
+ CleanupStack::PushL( itemArray );\r
+ \r
+ // This is intended to be large enough, but if you get \r
+ // a USER 11 panic, consider reducing string sizes.\r
+ TBuf< 512 > des;\r
+ CreateListQuery1ResourceArrayItemL(\r
+ des, R_COMING_NEXT_SKIN_FETCHER_CONTAINER_LISTBOX_ITEM1 );\r
+ itemArray->AppendL( des );\r
+ CreateListQuery1ResourceArrayItemL(\r
+ des, R_COMING_NEXT_SKIN_FETCHER_CONTAINER_LISTBOX_ITEM2 );\r
+ itemArray->AppendL( des );\r
+ CreateListQuery1ResourceArrayItemL(\r
+ des, R_COMING_NEXT_SKIN_FETCHER_CONTAINER_LISTBOX_ITEM3 );\r
+ itemArray->AppendL( des );\r
+ CreateListQuery1ResourceArrayItemL(\r
+ des, R_COMING_NEXT_SKIN_FETCHER_CONTAINER_LISTBOX_ITEM4 );\r
+ itemArray->AppendL( des );\r
+ CreateListQuery1ResourceArrayItemL(\r
+ des, R_COMING_NEXT_SKIN_FETCHER_CONTAINER_LISTBOX_ITEM5 );\r
+ itemArray->AppendL( des );\r
+ return itemArray;\r
+ }\r
+// ]]] end generated function\r
+\r
+// [[[ begin generated function: do not modify\r
+/**\r
+ * Set up the list query's icon array. If any icons are used, allocates an\r
+ * icon array, and places it on the cleanup stack. \r
+ * @return icon array, or NULL\r
+ */\r
+CArrayPtr< CGulIcon >* CComingNext_SkinFetcherContainerView::SetupListQuery1IconsLC()\r
+ {\r
+ CArrayPtr< CGulIcon >* icons = NULL;\r
+ return icons;\r
+ }\r
+ \r
+// ]]] end generated function\r
+\r
+// [[[ begin generated function: do not modify\r
+/**\r
+ * Show the popup list query dialog for listQuery1.\r
+ * <p>\r
+ * You may override the designer-specified items or icons, though generally\r
+ * both should be overridden together.\r
+ * @param aOverrideText optional override text\r
+ * @param aOverrideItemArray if not NULL, the array of formatted list items to display (passes ownership)\r
+ * @param aOverrideIconArray if not NULL, the array of icons to display (passes ownership)\r
+ * @return selected index (>=0) or -1 for Cancel\r
+ */\r
+TInt CComingNext_SkinFetcherContainerView::RunListQuery1L( \r
+ const TDesC* aOverrideText,\r
+ CDesCArray* aOverrideItemArray,\r
+ CArrayPtr< CGulIcon >* aOverrideIconArray )\r
+ {\r
+ TInt index = 0;\r
+ CAknListQueryDialog* queryDialog = NULL;\r
+ queryDialog = new ( ELeave ) CAknListQueryDialog( &index ); \r
+ CleanupStack::PushL( queryDialog );\r
+ \r
+ queryDialog->PrepareLC( R_COMING_NEXT_SKIN_FETCHER_CONTAINER_LIST_QUERY1 );\r
+ if ( aOverrideText != NULL )\r
+ {\r
+ queryDialog->SetHeaderTextL( *aOverrideText );\r
+ }\r
+ \r
+ // initialize list items\r
+ CDesCArray* itemArray = NULL;\r
+ \r
+ if ( aOverrideItemArray != NULL ) \r
+ {\r
+ CleanupStack::PushL( aOverrideItemArray );\r
+ itemArray = aOverrideItemArray;\r
+ }\r
+ else\r
+ {\r
+ itemArray = InitializeListQuery1LC();\r
+ }\r
+ \r
+ queryDialog->SetItemTextArray( itemArray );\r
+ queryDialog->SetOwnershipType( ELbmOwnsItemArray );\r
+ CleanupStack::Pop( itemArray );\r
+ \r
+ // initialize list icons\r
+ CArrayPtr< CGulIcon >* iconArray = NULL;\r
+ \r
+ if ( aOverrideIconArray != NULL )\r
+ {\r
+ CleanupStack::PushL( aOverrideIconArray );\r
+ iconArray = aOverrideIconArray;\r
+ }\r
+ else\r
+ {\r
+ iconArray = SetupListQuery1IconsLC();\r
+ }\r
+ \r
+ if ( iconArray != NULL ) \r
+ {\r
+ queryDialog->SetIconArrayL( iconArray ); // passes ownership\r
+ CleanupStack::Pop( iconArray );\r
+ }\r
+ \r
+ // run dialog\r
+ TInt result = queryDialog->RunLD();\r
+ \r
+ // clean up\r
+ CleanupStack::Pop( queryDialog );\r
+ \r
+ return result == 0 ? -1 : index;\r
+ }\r
+ \r
+// ]]] end generated function\r
+\r
+// [[[ begin generated function: do not modify\r
+/**\r
+ * Show the popup note for note1\r
+ * @param aOverrideText optional override text\r
+ */\r
+void CComingNext_SkinFetcherContainerView::RunNote1L( const TDesC* aOverrideText )\r
+ {\r
+ CAknConfirmationNote* note = new ( ELeave ) CAknConfirmationNote();\r
+ if ( aOverrideText == NULL )\r
+ {\r
+ HBufC* noteText = StringLoader::LoadLC( R_COMING_NEXT_SKIN_FETCHER_CONTAINER_NOTE1 );\r
+ note->ExecuteLD( *noteText );\r
+ CleanupStack::PopAndDestroy( noteText );\r
+ }\r
+ else\r
+ {\r
+ note->ExecuteLD( *aOverrideText );\r
+ }\r
+ }\r
+// ]]] end generated function\r
+\r