Example applications for various Homescreen APIs. RCL_3
authorjake
Mon, 02 Aug 2010 12:02:47 +0300
branchRCL_3
changeset 70 d12a7ea0f775
parent 59 d721605b30d0
Example applications for various Homescreen APIs.
idlehomescreen/examples/carouselwidgetexample/group/bld.inf
idlehomescreen/examples/carouselwidgetexample/publisher/data/carouselplugin.rss
idlehomescreen/examples/carouselwidgetexample/publisher/data/carouselpluginres.rss
idlehomescreen/examples/carouselwidgetexample/publisher/data/carouselpluginuids.hrh
idlehomescreen/examples/carouselwidgetexample/publisher/group/bld.inf
idlehomescreen/examples/carouselwidgetexample/publisher/group/carouselplugin.mmp
idlehomescreen/examples/carouselwidgetexample/publisher/inc/carouselplugin.h
idlehomescreen/examples/carouselwidgetexample/publisher/inc/carouselplugindata.h
idlehomescreen/examples/carouselwidgetexample/publisher/inc/carouselpluginengine.h
idlehomescreen/examples/carouselwidgetexample/publisher/inc/carouselpluginwatcher.h
idlehomescreen/examples/carouselwidgetexample/publisher/loc/carouselplugin.loc
idlehomescreen/examples/carouselwidgetexample/publisher/rom/carouselplugin.iby
idlehomescreen/examples/carouselwidgetexample/publisher/rom/carouselplugin_resources.iby
idlehomescreen/examples/carouselwidgetexample/publisher/src/carouselplugin.cpp
idlehomescreen/examples/carouselwidgetexample/publisher/src/carouselplugindata.cpp
idlehomescreen/examples/carouselwidgetexample/publisher/src/carouselpluginengine.cpp
idlehomescreen/examples/carouselwidgetexample/publisher/src/carouselpluginwatcher.cpp
idlehomescreen/examples/carouselwidgetexample/renderer/data/carouselwidget.rss
idlehomescreen/examples/carouselwidgetexample/renderer/group/bld.inf
idlehomescreen/examples/carouselwidgetexample/renderer/group/carouselwidget.mmp
idlehomescreen/examples/carouselwidgetexample/renderer/inc/carouselwidget.h
idlehomescreen/examples/carouselwidgetexample/renderer/rom/carouselwidget.iby
idlehomescreen/examples/carouselwidgetexample/renderer/src/carouselwidget.cpp
idlehomescreen/examples/carouselwidgetexample/sis/carousel.pkg
idlehomescreen/examples/carouselwidgetexample/widget/group/bld.inf
idlehomescreen/examples/carouselwidgetexample/widget/hsps/00/manifest.dat
idlehomescreen/examples/carouselwidgetexample/widget/hsps/00/widgetconfiguration.xml
idlehomescreen/examples/carouselwidgetexample/widget/rom/appstripe.iby
idlehomescreen/examples/carouselwidgetexample/widget/rom/appstripe_customer.iby
idlehomescreen/examples/carouselwidgetexample/widget/rom/appstripe_resources.iby
idlehomescreen/examples/carouselwidgetexample/widget/rom/appstripe_variant.iby
idlehomescreen/examples/carouselwidgetexample/widget/xuikon/00/appstripe.css
idlehomescreen/examples/carouselwidgetexample/widget/xuikon/00/appstripe.dat
idlehomescreen/examples/carouselwidgetexample/widget/xuikon/00/appstripe.dtd
idlehomescreen/examples/carouselwidgetexample/widget/xuikon/00/appstripe.xml
idlehomescreen/examples/hscontentcontrolexample/data/hscontentcontrolexample.l01
idlehomescreen/examples/hscontentcontrolexample/data/hscontentcontrolexample.loc
idlehomescreen/examples/hscontentcontrolexample/data/hscontentcontrolexample.rss
idlehomescreen/examples/hscontentcontrolexample/data/hscontentcontrolexample_reg.loc
idlehomescreen/examples/hscontentcontrolexample/data/hscontentcontrolexample_reg.rss
idlehomescreen/examples/hscontentcontrolexample/gfx/list_icon.bmp
idlehomescreen/examples/hscontentcontrolexample/gfx/list_icon_mask.bmp
idlehomescreen/examples/hscontentcontrolexample/gfx/mark_icon.bmp
idlehomescreen/examples/hscontentcontrolexample/gfx/mark_icon_mask.bmp
idlehomescreen/examples/hscontentcontrolexample/gfx/qgn_menu_hscontentcontrolexample.svg
idlehomescreen/examples/hscontentcontrolexample/group/Icons_aif_scalable_dc.mk
idlehomescreen/examples/hscontentcontrolexample/group/bld.inf
idlehomescreen/examples/hscontentcontrolexample/group/hscontentcontrolexample.mmp
idlehomescreen/examples/hscontentcontrolexample/inc/HsContentControlAppUi.h
idlehomescreen/examples/hscontentcontrolexample/inc/HsContentControlApplication.h
idlehomescreen/examples/hscontentcontrolexample/inc/HsContentControlDocument.h
idlehomescreen/examples/hscontentcontrolexample/inc/HsContentControlListBox.h
idlehomescreen/examples/hscontentcontrolexample/root/group/bld.inf
idlehomescreen/examples/hscontentcontrolexample/root/hsps/00/manifest.dat
idlehomescreen/examples/hscontentcontrolexample/root/hsps/00/widgetconfiguration.xml
idlehomescreen/examples/hscontentcontrolexample/root/sis/hs_configuration_urel.pkg
idlehomescreen/examples/hscontentcontrolexample/root/xuikon/00/root2.css
idlehomescreen/examples/hscontentcontrolexample/root/xuikon/00/root2.dat
idlehomescreen/examples/hscontentcontrolexample/root/xuikon/00/root2.dtd
idlehomescreen/examples/hscontentcontrolexample/root/xuikon/00/root2.xml
idlehomescreen/examples/hscontentcontrolexample/sis/hscontentcontrolexample_urel.pkg
idlehomescreen/examples/hscontentcontrolexample/src/HsContentControlAppUi.cpp
idlehomescreen/examples/hscontentcontrolexample/src/HsContentControlApplication.cpp
idlehomescreen/examples/hscontentcontrolexample/src/HsContentControlDocument.cpp
idlehomescreen/examples/hscontentcontrolexample/src/HsContentControlListBox.cpp
idlehomescreen/examples/mcsexample/data/MCSExample.rls
idlehomescreen/examples/mcsexample/data/MCSExample.rss
idlehomescreen/examples/mcsexample/data/MCSExample_reg.rss
idlehomescreen/examples/mcsexample/gfx/qgn_menu_MCSExample.svg
idlehomescreen/examples/mcsexample/group/Icons_scalable_dc.mk
idlehomescreen/examples/mcsexample/group/MCSExample.mmp
idlehomescreen/examples/mcsexample/group/bld.inf
idlehomescreen/examples/mcsexample/inc/MCSExample.hrh
idlehomescreen/examples/mcsexample/inc/MCSExample.pan
idlehomescreen/examples/mcsexample/inc/MCSExampleAppUi.h
idlehomescreen/examples/mcsexample/inc/MCSExampleAppView.h
idlehomescreen/examples/mcsexample/inc/MCSExampleApplication.h
idlehomescreen/examples/mcsexample/inc/MCSExampleDocument.h
idlehomescreen/examples/mcsexample/inc/mcspluginwatcher.h
idlehomescreen/examples/mcsexample/sis/MCSExample_S60_3_X_v_1_0_0.pkg
idlehomescreen/examples/mcsexample/sis/backup_registration.xml
idlehomescreen/examples/mcsexample/src/MCSExample.cpp
idlehomescreen/examples/mcsexample/src/MCSExampleAppUi.cpp
idlehomescreen/examples/mcsexample/src/MCSExampleAppView.cpp
idlehomescreen/examples/mcsexample/src/MCSExampleApplication.cpp
idlehomescreen/examples/mcsexample/src/MCSExampleDocument.cpp
idlehomescreen/examples/mcsexample/src/mcspluginwatcher.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/group/bld.inf	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2010 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:  Carousel widget for Symbian Homescreen
+ *
+ */
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+ARMV5 WINSCW
+
+#include "../widget/group/bld.inf"
+#include "../renderer/group/bld.inf"
+#include "../publisher/group/bld.inf"
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/data/carouselplugin.rss	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2010 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:  Registry info
+ *
+*/
+
+
+// INCLUDES
+#include <ecom/registryinfov2.rh>
+#include <hscontentpublisheruid.hrh>
+#include "carouselpluginuids.hrh"
+
+
+// -----------------------------------------------------------------------------
+//   
+// registry_info
+// Registry information required for identifying the ECOM component
+//
+// -----------------------------------------------------------------------------
+//
+
+RESOURCE REGISTRY_INFO registry_info
+{
+    resource_format_version = RESOURCE_FORMAT_VERSION_2;
+
+    dll_uid = AI_UID_ECOM_DLL_CONTENTPUBLISHER_CAROUSELPLUGIN; 
+
+    // Declare array of interface info
+    interfaces = 
+    {
+        INTERFACE_INFO
+        {
+            // UID of interface that is implemented
+            interface_uid = HS_UID_ECOM_INTERFACE_CONTENTPUBLISHER; 
+
+            implementations = 
+            {
+                IMPLEMENTATION_INFO
+                {
+                    implementation_uid = AI_UID_ECOM_IMPLEMENTATION_CONTENTPUBLISHER_CAROUSELPLUGIN;
+                    version_no         = 1;
+                    display_name       = "carpub";
+                    default_data       = "";
+                    opaque_data        = "";
+                }
+            };
+        }
+    };
+}
+
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/data/carouselpluginres.rss	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,90 @@
+/*
+* Copyright (c) 2010 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:  Resource definitions for carousel plug-in settings
+*
+*/
+
+
+#include <eikon.rh>
+#include <avkon.rsg>
+#include <avkon.rh>
+#include <appinfo.rh>
+#include <avkon.loc>
+
+#include <carouselplugin.loc>
+
+
+NAME MCPL
+
+RESOURCE RSS_SIGNATURE { }
+
+RESOURCE TBUF { buf="CCPL"; }
+
+//----------------------------------------------------
+// EIK_APP_INFO
+// Contains application information.
+//----------------------------------------------------
+//
+RESOURCE EIK_APP_INFO
+{
+}
+
+//----------------------------------------------------
+// R_MCS_DISABLE_OPEN_ITEM
+// Dialog text: Item cannot be run because of backup
+// state
+//----------------------------------------------------
+//
+RESOURCE TBUF r_mcs_disable_open_item
+{
+    buf = qtn_mcs_disable_open_item;
+}
+
+//----------------------------------------------------
+// R_MCS_DISABLE_OPEN_ITEM_MISSING
+// Dialog text: Item cannot be opened because of it is
+// missing
+//----------------------------------------------------
+//
+RESOURCE TBUF r_mcs_disable_open_item_missing
+{
+    buf = qtn_mcs_disable_open_item_missing;
+}
+
+
+//----------------------------------------------------
+// R_MCS_DISABLE_OPEN_ITEM_DLG
+// Contains application information.
+//----------------------------------------------------
+//
+RESOURCE DIALOG r_mcs_disable_open_item_dlg
+{
+    flags = EAknWarningNoteFlags | EEikDialogFlagWait;
+    buttons = R_AVKON_SOFTKEYS_OK_EMPTY;
+    items =
+        {
+        DLG_LINE
+            {
+            type = EAknCtNote;
+            id = EGeneralNote;
+            control = AVKON_NOTE
+                {
+                layout = EGeneralLayout;
+                animation = R_QGN_NOTE_INFO_ANIM;
+                };
+            }
+        };
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/data/carouselpluginuids.hrh	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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:  UIDs for the Active Idle subsystem components.
+*
+*/
+
+
+#ifndef CAROUSELPLUGINUIDS_HRH
+#define CAROUSELPLUGINUIDS_HRH
+
+/**
+ * Ecom dll uid for MCS plug-in.
+ */
+#define AI_UID_ECOM_DLL_CONTENTPUBLISHER_CAROUSELPLUGIN 0xE001CB57
+
+/**
+ * Ecom implementation uid for MCS plug-in.
+ */
+#define AI_UID_ECOM_IMPLEMENTATION_CONTENTPUBLISHER_CAROUSELPLUGIN 0xE001CB58
+
+/**
+ * Ecom implementation uid for MCS settings plug-in.
+ */
+#define AI_UID_ECOM_IMPLEMENTATION_SETTINGS_MCSPLUGIN 0x20022FDD
+
+#endif //CAROUSELPLUGINUIDS_HRH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/group/bld.inf	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2010 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:  The build information file of carousel Plugin
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../loc/carouselplugin.loc             MW_LAYER_LOC_EXPORT_PATH(carouselplugin.loc)
+
+
+../rom/carouselplugin_resources.iby      LANGUAGE_MW_LAYER_IBY_EXPORT_PATH(carouselplugin_resources.iby)
+../rom/carouselplugin.iby                CORE_MW_LAYER_IBY_EXPORT_PATH(carouselplugin.iby)
+
+
+
+
+PRJ_EXTENSIONS
+
+START EXTENSION s60/mifconv
+OPTION TARGETFILE carouselplugin.mif
+OPTION HEADERFILE carouselplugin.mbg
+OPTION SOURCES -c8,8 qgn_prop_ai_shortcut -c8,8 qgn_menu_url \
+               -c8,8 qgn_menu_mce_sel_mes -c8,8 qgn_menu_mce_syncmail \
+               -c8,8 qgn_menu_am -c8,8 qgn_prop_cp_conn_shortcut \
+               -c8,8 qgn_prop_psln_ai_sub -c8,8 qgn_mcsplugin_log_out
+END
+
+
+PRJ_MMPFILES
+carouselplugin.mmp
+
+
+// End of File.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/group/carouselplugin.mmp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,83 @@
+/*
+* Copyright (c) 2010 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:  Project definition file for project ProfilePlugin
+*
+*/
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+#include "../data/carouselpluginuids.hrh"
+
+TARGET          carouselplugin.dll
+TARGETTYPE      PLUGIN
+UID             0x10009D8D  AI_UID_ECOM_DLL_CONTENTPUBLISHER_CAROUSELPLUGIN
+
+CAPABILITY      CAP_ECOM_PLUGIN
+VENDORID        VID_DEFAULT
+
+SOURCEPATH      ../src
+SOURCE          carouselplugin.cpp
+SOURCE          carouselpluginengine.cpp
+SOURCE          carouselplugindata.cpp
+SOURCE          carouselpluginwatcher.cpp
+
+USERINCLUDE     ../inc
+USERINCLUDE     ../loc
+USERINCLUDE     ../data
+
+APP_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH      ../data
+START RESOURCE  carouselplugin.rss
+HEADER
+TARGETPATH      ECOM_RESOURCE_DIR
+END
+
+START RESOURCE  carouselpluginres.rss
+HEADER
+TARGET          carouselpluginres.rsc
+TARGETPATH      RESOURCE_FILES_DIR
+LANGUAGE_IDS
+END
+LIBRARY         euser.lib
+LIBRARY         mcsmenu.lib
+LIBRARY         mcsextendedmenu.lib
+LIBRARY         egul.lib
+LIBRARY         cone.lib
+LIBRARY         ecom.lib
+LIBRARY         aiutils.lib
+LIBRARY         aknskins.lib
+LIBRARY         aknicon.lib
+LIBRARY         mcsmenuutils.lib
+LIBRARY         hspluginsettings.lib
+LIBRARY         msgs.lib
+LIBRARY         apgrfx.lib
+LIBRARY         apparc.lib
+
+
+LIBRARY         bafl.lib
+LIBRARY         avkon.lib 
+LIBRARY         eikcoctl.lib
+LIBRARY         eikcore.lib
+LIBRARY         efsrv.lib
+LIBRARY         fbscli.lib 
+LIBRARY         gslauncher.lib
+LIBRARY         eikdlg.lib
+LIBRARY         commonengine.lib 
+LIBRARY         favouritesengine.lib
+LIBRARY         viewcli.lib
+LIBRARY         gfxtrans.lib 
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/inc/carouselplugin.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,158 @@
+/*
+* Copyright (c) 2009-2010 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:  Plug-in main class
+*
+*/
+
+
+#ifndef CMCSPLUGIN_H
+#define CMCSPLUGIN_H
+
+// System includes
+
+// User includes
+#include <hscontentpublisher.h>
+#include <aicontentmodel.h>
+
+// Forward declarations
+class MAiContentObserver;
+class MAiContentItemIterator;
+class CCarouselPluginEngine;
+class CCarouselData;
+
+
+/**
+ * @ingroup group_mcsplugin
+ *
+ * MCS Plug-in main class
+ *
+ * @since S60 5.2
+ */
+NONSHARABLE_CLASS( CCarouselPlugin ) : public CHsContentPublisher    
+    {
+public:
+    // constructor and destructor
+
+    static CCarouselPlugin* NewL();
+
+    ~CCarouselPlugin();
+
+private:
+    // constructors
+    
+    /**
+    * C++ default constructor
+    */
+    CCarouselPlugin();
+
+    /**
+    * 2nd phase constructor
+    */
+    void ConstructL();
+    
+public:
+    // from CHsContentPublisher
+  
+    /**
+     * @see CHsContentPublisher
+     */
+    void Start( TStartReason aReason );
+
+    /**
+     * @see CHsContentPublisher
+     */
+    void Stop( TStopReason aReason );
+
+    /**
+     * @see CHsContentPublisher
+     */    
+    void Resume( TResumeReason aReason );
+
+    /**
+     * @see CHsContentPublisher
+     */    
+    void Suspend( TSuspendReason aReason );
+
+    /**
+     * @see CHsContentPublisher
+     */    
+    void SubscribeL( MAiContentObserver& aObserver );
+
+    /**
+     * @see CHsContentPublisher
+     */    
+    void ConfigureL( RAiSettingsItemArray& aSettings );
+
+    /**
+     * @see CHsContentPublisher
+     */    
+    TAny* GetProperty( TProperty aProperty );
+
+    /**
+     * @see CHsContentPublisher
+     */   
+    void HandleEvent( const TDesC& aEventName, const TDesC& aParam );
+    
+public:
+    // new functions
+
+    /**
+    * Publishes data
+    */
+    void PublishL();
+    
+private:
+    // new functions
+    
+    /**
+     * CompareItems
+     */
+    static TInt CompareItems( const MAiPluginSettings& aFirst,
+        const MAiPluginSettings& aSecond );
+          
+    /**
+     * Publishes content for one menu item
+     */
+    void PublishLItemL( MAiContentObserver& aObserver, CCarouselData& aDataItem, TInt aIndex );
+    
+    void PublishEditorItemsL();
+        
+    /**
+    * Delete content model
+    */  
+    void DeleteContentModel();    
+    
+    /**
+     * Determines if dirty items exists
+     */
+    TBool PublishRequired() const; 
+    
+private: 
+    // data
+
+    /** Iterator for plugin content, owned */    
+    MAiContentItemIterator* iContent;
+    /** Number of data in the content model */
+    TInt iDataCount;
+    /** Dynamic content model, owned */    
+    TAiContentItem* iContentModel;
+    /** Plugin engine, owned */    
+    CCarouselPluginEngine* iEngine;
+    /** Array of content observers, not owned */    
+    RPointerArray<MAiContentObserver> iObservers;
+    };
+
+#endif // CMCSPLUGIN_H
+
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/inc/carouselplugindata.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,274 @@
+/*
+* Copyright (c) 2009 - 2010 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:  Plug-in data class
+*
+*/
+
+
+#ifndef CMCSPLUGINDATA_H
+#define CMCSPLUGINDATA_H
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <badesca.h>
+#include <mhomescreensettingsobserver.h>
+#include <hspluginsettings.h>
+#include <propertymap.h>
+#include <mcsmenu.h>
+
+class TMenuItem;
+class CCarouselPluginEngine;
+
+/**
+ *  @ingroup group_mcsplugin
+ *
+ *  Stores the MCS Menu Items and keeps track whether
+ *  item needs to be published or not.
+ *
+ *  @since S60 v9.1
+ */
+NONSHARABLE_CLASS( CCarouselData ) : public CBase
+    {
+public:
+    CCarouselData();
+    
+    ~CCarouselData();
+    
+    /**
+     * SetMenuItem
+     * 
+     * @param aMenuItem
+     */
+    void SetMenuItem( TMenuItem& aMenuItem );
+
+    /**
+     * MenuItem
+     * 
+     * @return TMenuItem
+     */
+    TMenuItem& MenuItem();
+    
+    /**
+     * Name of the item.
+     */
+    TDesC& Name();
+    
+    /**
+     * Set name of the item,
+     */
+    void SetNameL( const TDesC& aName );
+
+    /**
+     * Value of the item. Used for bookmark url.
+     */
+    TDesC& Value();
+    
+    /*
+     * Set value of the item.
+     */   
+    void SetValueL( const TDesC& aValue );
+    
+    /**
+     * SetDirty
+     * 
+     * @param aDirty
+     * @return TBool
+     */
+    void SetDirty( TBool aDirty );
+
+    /**
+     * IsDirty
+     * 
+     * @return TBool
+     */
+    TBool IsDirty() const;
+
+private:
+    /**
+     * iMenuItem
+     */
+    TMenuItem iMenuItem;
+    
+    /**
+     * Item name, own
+     */
+    HBufC* iName;
+    
+    /**
+     * Item value, own
+     */
+    HBufC* iValue;
+
+    /**
+     * iDirty
+     */
+    TBool iDirty;
+    };
+
+/**
+ *  @ingroup group_mcsplugin
+ *
+ *  Plug-in data class
+ *
+ *  @since
+ */
+NONSHARABLE_CLASS( CCarouselPluginData ) : public CBase,
+    public HSPluginSettingsIf::MHomeScreenSettingsObserver
+    {
+
+public:
+
+    /**
+    * Part of the two phased constuction
+    *
+    * @param aEngine
+    * @param aInstanceUid
+    * @return Pointer to the created CMCSPluginData object
+    */
+    static CCarouselPluginData* NewL( CCarouselPluginEngine& aEngine,
+        const TDesC8& aInstanceUid );
+
+    /**
+    * Constructor
+    *
+    * @param aEngine
+    * @param aInstanceUid
+    * @return none
+    */
+    CCarouselPluginData( CCarouselPluginEngine& aEngine, const TDesC8& aInstanceUid );
+
+    /**
+    * Destructor
+    *
+    * @param none
+    * @return none
+    */
+    ~CCarouselPluginData();
+
+    /**
+     * DataItem
+     * 
+     * @param aIndex
+     * @return TMCSData&
+     */
+    CCarouselData& DataItemL( TInt aIndex );
+
+    /**
+     * Saves 'Undefined' menu item into settings when mailbox is deleted
+     * 
+     * @param aIndex
+     * @param aMenuItem
+     */
+    void SaveUndefinedItemL( const TInt& aIndex );
+
+    /**
+     * DataCount
+     * 
+     * @return TInt
+     */
+    TInt DataCount(){ return iData.Count();};
+
+    /**
+     * Gets the instance specific settings from HSPS and creates data items
+     */
+    void UpdateDataL();
+
+    /**
+     * Removes data item from data list and saves new setting into HSPS
+     */
+    void RemoveDataL( TInt aId );
+    
+    // From MHomeScreenSettingsObserver
+    /**
+     * SettingsChangedL
+     * 
+     * @param aEvent
+     * @param aPluginName
+     * @param aPluginUid
+     * @param aPluginId
+     */
+    void SettingsChangedL( const TDesC8& aEvent,  const TDesC8& aPluginName,
+                           const TDesC8& aPluginUid, const TDesC8& aPluginId );
+
+private:
+
+    /**
+    * Part of the two phased construction
+    *
+    * @param void
+    * @return void
+    */
+    void ConstructL();
+
+    /**
+     * GetMenuDataL
+     * @param aProperties
+     * @return TMenuItem
+     */
+    CCarouselData* GetMenuDataL(
+        RPointerArray<HSPluginSettingsIf::CPropertyMap>& aProperties );
+    
+    /**
+     * Get bookmark data item
+     * @param aUid, used for bookmark uid
+     * @param aView, used for bookmark url
+     * @param aParam, used for bookmark name
+     * @param aData, is filled with appropriate values
+     */
+    void GetBkmDataL( const TDesC8& aUid, const TDesC8& aView, const TDesC8& aParam, CCarouselData& aData );
+
+    /**
+     * Get folder data item
+     * @param aParam, is used for folder id (in MCS)
+     * @param aData, is filled with appropriate values
+     */    
+    void GetFolderData( const TDesC8& aParam, CCarouselData& aData );
+
+    /**
+     * Get mailbox data item
+     * @param aUid, uid of the mailbox in messaging application
+     * @param aParam, name of the mailbox
+     * @param aData, is filled with appropriate values
+     */
+    void GetMailboxDataL( const TDesC8& aUid, const TDesC8& aParam,  CCarouselData& aData );
+    
+    /**
+     * Get MCS data item
+     * @param aProperties, Properties are used to filter correct item from MCS.
+     * @param aData, is filled with appropriate values
+     */
+    void GetMCSDataL(
+        RPointerArray<HSPluginSettingsIf::CPropertyMap>& aProperties,  CCarouselData& aData );
+
+private: // data
+
+    // Menu items, which are defined in settings
+    // Own
+    RPointerArray<CCarouselData> iData;
+
+    // Plugin settings. NOT OWNED!
+    HSPluginSettingsIf::CHomescreenSettings* iPluginSettings;
+
+    // Reference to MCS plug-in engine
+    CCarouselPluginEngine& iEngine;
+
+    // Reference to instance uid of HSPS widget
+    const TDesC8& iInstanceUid;
+
+    // MCS resource handle, owned 
+    RMenu iMenu;
+
+    };
+
+#endif // CMCSPLUGINDATA_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/inc/carouselpluginengine.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,250 @@
+/*
+* Copyright (c) 2009 - 2010 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: 
+*
+*/
+
+
+#ifndef CMCSPLUGINENGINE_H
+#define CMCSPLUGINENGINE_H
+
+// System includes
+#include <e32base.h>
+#include <mcsmenu.h>
+#include <mcsmenuitem.h>
+#include <mcsmenunotifier.h>
+#include <msvapi.h>
+
+// User includes
+#include "carouselpluginwatcher.h"
+
+// Forward declarations
+class CGulIcon;
+class CCarouselPluginData;
+class CCarouselData;
+class CCarouselPlugin;
+
+
+/**
+ * @ingroup group_mcsplugin
+ *
+ * MCSPluginEngine class
+ *
+ * @since S60 5.2
+ */
+NONSHARABLE_CLASS( CCarouselPluginEngine ) : public CBase, 
+    public MCarouselPluginWatcherObserver,
+    public MMsvSessionObserver
+    {
+public:  
+    // constructor and destructor
+
+    /**
+    * Part of the two phased constuction
+    *
+    * @param aPlugin
+    * @param aInstanceUid
+    * @return Pointer to the created CMCSPluginEngine object
+    */
+    static CCarouselPluginEngine* NewL( CCarouselPlugin& aPlugin, 
+        const TDesC8& aInstanceUid );
+
+    /**
+    * Destructor
+    *
+    * @param none
+    * @return none
+    */
+    ~CCarouselPluginEngine();
+
+private:
+    // constructors
+    
+    /**
+     * C++ default constructor 
+     */
+    CCarouselPluginEngine( CCarouselPlugin& aPlugin, const TDesC8& aInstanceUid );
+
+    /*
+     * 2nd phase constructor
+     */
+    void ConstructL();
+    
+public:
+    // new functions
+    
+    /**
+     * Gets the menu data.
+     * 
+     * @param aIndex
+     * @return TMCSData&
+     */
+    CCarouselData& MenuDataL( const TInt& aIndex );
+
+    /** Gets the menu item count
+     * 
+     * @return TInt
+     */
+    TInt MenuItemCount();
+
+    /**
+     * Finds the menu item header for given filter.
+     * 
+     * @param aFilter
+     * @return TMenuItem
+     */
+    TMenuItem FindMenuItemL( CMenuFilter& aFilter );
+
+    /**
+     * Retrieves the menu item object from MCS.
+     * 
+     * @param aMenuItem
+     * @return CMenuItem*
+     */
+    CMenuItem* FetchMenuItemL( CCarouselData& aData);
+    
+    /**
+     * Returns icon for given menu item and given attribute
+     * 
+     * @param aMenuItem
+     * @param aAttr
+     * @return CGulIcon*
+     */
+    CGulIcon* ItemIconL( CMenuItem* aMenuItem, const TDesC& aAttr );
+
+    /**
+     * Returns text for given menu item and given attribute
+     * 
+     * @param aMenuItem
+     * @param aAttr
+     */
+    TPtrC ItemTextL( CMenuItem* aMenuItem, const TDesC& aAttr );
+
+    /** 
+     * Launches menu item
+     * 
+     * @param aIndex
+     */
+    void LaunchItemL( const TInt& aIndex );
+
+    /**
+    * Set backup/restore state
+    *
+    * @param aBackupRestore ETrue if backup/restore is ongoing 
+    * @return void
+    */
+    void SetBackupRestore( TBool aBackupRestore );
+
+    /**
+     * ShowSettingsL
+     */
+    void ShowSettingsL();
+
+private:
+    // from MMCSPluginWatcherObserver
+    
+    /**
+     * @see MMCSPluginWatcherObserver 
+     */
+    void HandleNotifyL();
+
+private:    
+    // from MMsvSessionObserver
+
+    /**
+     * @see MMsvSessionObserver
+     */    
+    void HandleSessionEventL( TMsvSessionEvent aEvent, TAny* aArg1,
+        TAny* aArg2, TAny* aArg3 );
+
+private:
+    // new functions
+
+    /**
+     * InitL
+     */
+    void InitL();
+    
+    /**
+     * Tells the settings container to start observing 
+     * for changes in mailbox db and changes in MCS.
+     */
+    void StartObservingL();
+
+    /**
+     * Tells the settings container to stop observing 
+     * for changes in mailbox db.     
+     */
+    void StopObserving();
+
+    /**
+     * ConstructMenuItemForIconL
+     * 
+     * @param aPath
+     * @param aMenuItem
+     * @return TBool
+     */
+    TBool ConstructMenuItemForIconL( 
+        const TDesC& aPath, CMenuItem& aMenuItem );
+
+    /**
+     * Creates bookmark specific MCS menu item.
+     */
+    CMenuItem* CreateBkmItemL( CCarouselData& aData );
+    
+    /**
+     * Creates mailbox specific MCS menu item.
+     */
+    CMenuItem* CreateMailboxItemL( CCarouselData& aData );
+    
+    void LaunchFolderItemL( CCarouselData& aData );
+    
+    void LaunchBookmarkItemL( CCarouselData& aData );
+    
+    void LaunchMailboxItemL( CCarouselData& aData );
+    
+    void LaunchMCSItemL( CCarouselData& aData );
+
+private:
+    // data
+    
+    /** Plugin data, owned */
+    CCarouselPluginData* iPluginData;
+    /** MCS resource handle, owned */
+    RMenu iMenu;
+    /** MCS change notifier handle, owned */
+    RMenuNotifier iNotifier;
+    /** MCS asynchronous operation watcher, owned */
+    CCarouselPluginWatcher* iWatcher;
+    /** MCS change notifier watcher, owned */
+    CCarouselPluginWatcher* iNotifyWatcher;
+    /** MCS plugin, not owned */
+    CCarouselPlugin& iPlugin;
+    /** Reference to plugin owned instanceUid */
+    const TDesC8& iInstanceUid;
+    /** Flag Indicating that backup/restore is in progress */
+    TBool iBackupRestore;
+    /** Offset of resource file */
+    TInt iResourceOffset;
+    /** Message server session, owned */
+    CMsvSession* iMsvSession;        
+    /** "Undefined" menu item, owned */
+    CMenuItem* iUndefinedItem;
+    /** "Undefined" menu item header */
+    TMenuItem iUndefinedItemHeader;    
+    };
+
+#endif // CMCSPLUGINENGINE_H
+
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/inc/carouselpluginwatcher.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,152 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#ifndef __MCSPLUGINWATCHER_H
+#define __MCSPLUGINWATCHER_H
+
+#include <e32base.h>
+
+class CMenuOperation;
+class CCarouselPluginEngine;
+
+/**
+ *  @ingroup group_mcsplugin
+ *
+ *  MCS Plugin Watcher Observer
+ *
+ *  @since S60 9.1
+ */
+class MCarouselPluginWatcherObserver
+    {
+    public:
+    /**
+     * HandleNotifyL
+     */
+    virtual void HandleNotifyL() = 0;
+    };
+
+/**
+ *  @ingroup group_mcsplugin
+ *
+ *  This class implements MCS menu action watcher for async calls.
+ * 
+ *  @since S60 9.1
+ */
+class CCarouselPluginWatcher: public CActive
+    {
+    public:
+        
+        /**
+         * enum Type
+         */
+        enum Type
+            {
+            EOperation,
+            ENotify
+            };
+        
+        /**
+         * Two-phased constructor.
+         * 
+         * @param aType
+         */
+        static CCarouselPluginWatcher* NewL( const Type& aType );
+        
+        /**
+         * Destructor.
+         */
+        virtual ~CCarouselPluginWatcher();
+
+        /**
+         * Watch menu operation or notification.
+         * 
+         * @param aOperation
+         */
+        void Watch( CMenuOperation* aOperation = NULL );
+        
+        /**
+         * WatchNotify
+         * 
+         * @param aObserver
+         */
+        void WatchNotify( MCarouselPluginWatcherObserver* aObserver );
+        
+        /**
+         * StopAndWatch
+         * 
+         * @param aOperation
+         * @param aWaitScheduler
+         */
+        void StopAndWatch( CMenuOperation* aOperation, 
+                           CActiveSchedulerWait* aWaitScheduler );
+        
+        /**
+         * GetStatus 
+         */
+        TInt GetStatus();
+
+    private:
+    
+        /** 
+         * Default constructor.
+         * 
+         * @param aType
+         */
+        CCarouselPluginWatcher( const Type& aType );
+
+        /** 
+         * ConstructL
+         */
+        void ConstructL();
+        
+        /**
+        * Inherited from CActive class 
+        */ 
+        void RunL();
+        
+        /**
+        * Inherited from CActive class 
+        */ 
+        void DoCancel();
+    
+    private:
+        
+        /** 
+         * Menu operation
+         * Owned
+         */
+        CMenuOperation* iOperation; 
+        
+        /**
+         * Wait scheduler
+         * Not owned
+         */
+        CActiveSchedulerWait* iWaitScheduler;
+
+        /** 
+         * Observer reference
+         * Not owned
+         */
+        MCarouselPluginWatcherObserver* iObserver;
+        
+        /** 
+         * iType
+         */
+        Type iType;
+    };
+
+#endif /*__MCSPLUGINWATCHER_H*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/loc/carouselplugin.loc	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,34 @@
+/*
+* Copyright (c) 2010 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:    Localization strings for project carousel Plugin
+*
+*/
+
+// d: A dialog which is shown to user when (s)he is trying to 
+// d: launch shortcut item during backup state.
+// l: popup_note_window
+// w:
+// r: tb9.2
+//
+#define qtn_mcs_disable_open_item "Application cannot be opened during backup"
+
+// d: A dialog which is shown to user when (s)he is trying to 
+// d: launch shortcut item which is missing from menu.
+// l: popup_note_window
+// w:
+// r: tb9.2
+//
+#define qtn_mcs_disable_open_item_missing "Shortcut cannot be opened because item is missing. Try to insert memory card which contains the item or reinstall the application."
+
+//End file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/rom/carouselplugin.iby	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2006 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:  IBY file for carousel plug-in
+*
+*/
+
+
+#ifndef CAROUSELPLUGIN_IBY
+#define CAROUSELPLUGIN_IBY
+#include <bldvariant.hrh>
+
+data=DATAZ_\BITMAP_DIR\carouselplugin.mif BITMAP_DIR\carouselplugin.mif
+
+ECOM_PLUGIN(carouselplugin.dll, carouselplugin.rsc)
+
+#endif // CAROUSELPLUGIN_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/rom/carouselplugin_resources.iby	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2005 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:  IBY file for Profile plug-in
+*
+*/
+
+
+#ifndef CAROUSELPLUGIN_RESOURCES_IBY
+#define CAROUSELPLUGIN_RESOURCES_IBY
+
+#include <data_caging_paths_for_iby.hrh>
+
+data=DATAZ_\RESOURCE_FILES_DIR\carouselpluginres.rsc  RESOURCE_FILES_DIR\carouselpluginres.rsc
+
+#endif // CAROUSELPLUGIN_RESOURCES_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/src/carouselplugin.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,502 @@
+/*
+* Copyright (c) 2009 - 2010 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:  MCS plugin publisher
+*
+*/
+
+// System includes
+#include <ecom/ecom.h>
+#include <ecom/implementationproxy.h>
+#include <gulicon.h>
+#include <mcsmenuitem.h>
+
+// User includes
+#include <aicontentobserver.h>
+#include <aistrcnv.h>
+#include <aiutility.h>
+#include <aipluginsettings.h>
+#include "carouselpluginuids.hrh"
+#include "carouselplugin.h"
+#include "carouselplugindata.h"
+#include "carouselpluginengine.h"
+
+// Constants
+const TUint KPluginNameSeprator =  '/';
+
+const TInt KImplUidMCSPlugin = AI_UID_ECOM_IMPLEMENTATION_CONTENTPUBLISHER_CAROUSELPLUGIN;
+
+_LIT( KEventNameLaunchByIndex,  "LaunchByIndex" );
+_LIT( KEventNameShowSettings,   "ShowSettings" );
+_LIT( KContentItemTypeText, "text" );
+_LIT( KContentItemTypeImage, "image" );
+_LIT( KContentItemTypeData, "data" );
+
+const TImplementationProxy KImplementationTable[] =
+    {
+    IMPLEMENTATION_PROXY_ENTRY( KImplUidMCSPlugin, CCarouselPlugin::NewL ) 
+    };
+
+class CPublishItem : public CBase
+    {
+public:
+    ~CPublishItem();
+    CPublishItem();
+    
+    CGulIcon* icon;
+    HBufC* text;
+    TBool last;
+    };
+
+CPublishItem::CPublishItem()
+    {
+    
+    }
+
+CPublishItem::~CPublishItem()
+    {
+    delete text;
+    }
+
+// ======== LOCAL FUNCTIONS ========
+
+// ======== MEMBER FUNCTIONS ========
+// ----------------------------------------------------------------------------
+// CMCSPlugin::NewL
+//
+// ----------------------------------------------------------------------------
+//
+CCarouselPlugin* CCarouselPlugin::NewL()
+    {
+    CCarouselPlugin* self = new ( ELeave ) CCarouselPlugin;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+ 
+    return self;
+    }
+    
+// ----------------------------------------------------------------------------
+// CMCSPlugin::CMCSPlugin
+//
+// ----------------------------------------------------------------------------
+//
+CCarouselPlugin::CCarouselPlugin()
+    {
+    }
+    
+// ----------------------------------------------------------------------------
+// CMCSPlugin::ConstructL
+// 
+// ----------------------------------------------------------------------------
+//
+void CCarouselPlugin::ConstructL()
+    {
+    }
+    
+// ----------------------------------------------------------------------------
+// Destructor
+// Deletes all data created to heap
+// ----------------------------------------------------------------------------
+//
+CCarouselPlugin::~CCarouselPlugin()
+    {
+    Release( iContent );
+
+    delete iEngine;
+    iObservers.Close();
+    
+    DeleteContentModel();
+    }
+
+// ----------------------------------------------------------------------------
+// CMCSPlugin::PublishL
+// Publishes the all the items
+// ----------------------------------------------------------------------------
+//
+void CCarouselPlugin::PublishL()
+    {    
+    TInt err( KErrNone );
+    TInt observers( iObservers.Count() );
+    TInt transactionId( reinterpret_cast<TInt>( this ) );
+    TInt menuItems ( iEngine->MenuItemCount() );
+
+    for ( TInt i = 0; i < observers; i++ )
+        {
+        MAiContentObserver* observer( iObservers[ i ] );
+        err = observer->StartTransaction( transactionId );
+        
+        if ( err == KErrNotSupported )
+            {
+            return;
+            }
+        
+        // Publish content to all items
+        for ( TInt j = 0; j < menuItems; j++ )
+            {
+            // Index has to start from 1 ( j + 1 )
+            PublishLItemL( *observer, iEngine->MenuDataL( j ), ( j + 1 ) );
+            }// shortcut count
+        
+        if ( err == KErrNone )
+            {
+            err = observer->Commit( transactionId );
+            
+            if ( err == KErrNotSupported )
+                {
+                return;
+                }
+            }
+        }//observers
+
+    // Set all items not dirty.
+    for ( TInt j = 0; j < menuItems; j++ )
+        {
+        iEngine->MenuDataL( j ).SetDirty( EFalse );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CMCSPlugin::PublishLItemL
+// Publishes one item to given index
+// ----------------------------------------------------------------------------
+//
+void CCarouselPlugin::PublishLItemL( MAiContentObserver& aObserver, 
+    CCarouselData& aData, TInt aIndex )
+    {
+    if( !aData.IsDirty() )
+        {
+        return;
+        }
+
+    CMenuItem* item = iEngine->FetchMenuItemL( aData );
+    CleanupStack::PushL( item );
+    
+    if ( iContentModel[0].type == KAiContentTypeData )
+        {
+        if(TPtrC16( ( const TText16* ) iContentModel[ 0 ].cid ) == _L("widget") )
+            {
+            CGulIcon* icon( iEngine->ItemIconL( item, _L("icon")));
+            icon->SetBitmapsOwnedExternally( ETrue );
+            aObserver.Publish( *this, 0, TPckgC<TAny*>( icon ), aIndex - 1 );
+            }
+        }
+    CleanupStack::PopAndDestroy( item );
+    }
+
+// ----------------------------------------------------------------------------
+// PublishEditorItemsL
+// 
+// ----------------------------------------------------------------------------
+//
+void CCarouselPlugin::PublishEditorItemsL()
+    {/*
+    RArray<TMenuItem> items = iEngine->MenuItemsL();
+    CleanupClosePushL( items );
+    
+    TInt count( items.Count());
+    for( TInt i = 0; i < count; i++ )
+        {
+        CMenuItem* item( iEngine->FetchMenuItemL( items[i]));
+        CleanupStack::PushL( item );
+        CGulIcon* icon( iEngine->ItemIconL( *item, _L("icon")));
+        TPtrC name( iEngine->ItemTextL( *item, _L("long_name") ));
+        CPublishItem* pItem = new CPublishItem;
+        pItem->icon = icon;
+        pItem->text = name.AllocL();
+        if( i < count - 1 )
+            {
+            pItem->last = EFalse;
+            }
+        else
+            {
+            pItem->last = ETrue;
+            }
+        iObservers[0]->Publish( *this, 0, TPckgC<TAny*>( pItem), i );
+        delete pItem;
+        CleanupStack::PopAndDestroy( item );
+        }
+    CleanupStack::PopAndDestroy( &items );
+    */
+    }
+
+// ----------------------------------------------------------------------------
+// CMCSPlugin::Start
+// 
+// ----------------------------------------------------------------------------
+//
+void CCarouselPlugin::Start( TStartReason /*aReason*/ )
+    {
+ 
+    }
+
+// ----------------------------------------------------------------------------
+// CMCSPlugin::Stop
+// 
+// ----------------------------------------------------------------------------
+//
+void CCarouselPlugin::Stop( TStopReason /*aReason*/ )
+    {
+
+    }
+
+// ----------------------------------------------------------------------------
+// CMCSPlugin::Resume
+// 
+// ----------------------------------------------------------------------------
+//
+void CCarouselPlugin::Resume( TResumeReason aReason )
+    {       
+    if ( aReason == EForeground )
+        {
+        iEngine->SetBackupRestore( EFalse );
+        
+        if ( PublishRequired() )
+            {
+            TRAP_IGNORE( PublishL() );
+            }        
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CMCSPlugin::Suspend
+// 
+// ----------------------------------------------------------------------------
+//
+void CCarouselPlugin::Suspend( TSuspendReason aReason )
+    {    
+    if ( aReason == EGeneralThemeChange )
+        {                   
+        TInt dataCount( iEngine->MenuItemCount() );
+        
+        for ( TInt i = 0; i < dataCount; i++ )
+            {
+            TRAP_IGNORE( iEngine->MenuDataL( i ).SetDirty( ETrue ) );
+            }                
+        }
+    else if ( aReason == EBackupRestore )
+        {
+        // Prevent item launching during backup / restore 
+        iEngine->SetBackupRestore( ETrue );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CMCSPlugin::SubscribeL
+//
+// ----------------------------------------------------------------------------
+//
+void CCarouselPlugin::SubscribeL( MAiContentObserver& aObserver )
+    { 
+    iObservers.AppendL( &aObserver );
+    }
+   
+// ----------------------------------------------------------------------------
+// CMCSPlugin::ConfigureL
+// 
+// ----------------------------------------------------------------------------
+//
+void CCarouselPlugin::ConfigureL( RAiSettingsItemArray& aSettings )
+    {    
+    iEngine = CCarouselPluginEngine::NewL( *this, PublisherInfo().Namespace() );
+    
+    TLinearOrder<MAiPluginSettings> sortMethod( CCarouselPlugin::CompareItems );
+    RAiSettingsItemArray contentItemsArr;
+
+    TInt count( aSettings.Count() );
+    
+    for ( TInt i = 0; i < count; i++ )
+       {
+       MAiPluginSettings* setting( aSettings[ i ] );
+       
+       if( setting->AiPluginItemType() == EAiPluginContentItem )
+           {
+           MAiPluginContentItem& contItem( setting->AiPluginContentItem() );
+           TPtrC name( contItem.Name() );
+           TPtrC type( contItem.Type() );
+           
+           contentItemsArr.InsertInOrder( setting, sortMethod );
+           }
+       }
+    
+    iDataCount = contentItemsArr.Count();
+    
+    if ( iDataCount > 0 )
+        {
+        // Create the dynamic content Model
+        DeleteContentModel();
+        
+        iContentModel = new ( ELeave ) TAiContentItem[ iDataCount ];
+        
+        for ( TInt i = 0; i < iDataCount; i++ )
+            {
+            iContentModel[i].id = i;
+        
+            MAiPluginContentItem& contentItem( 
+                contentItemsArr[ i ]->AiPluginContentItem() );
+
+            if( contentItem.Type() == KContentItemTypeText )
+                {
+                // text
+                iContentModel[i].type = KAiContentTypeText;
+                }
+            if( contentItem.Type() == KContentItemTypeImage )
+                {
+                // image
+                iContentModel[i].type = KAiContentTypeBitmap;
+                }
+            else if(contentItem.Type() == KContentItemTypeData )
+                {
+                // data
+                iContentModel[i].type = KAiContentTypeData;
+                }
+            
+            TInt pos( contentItem.Name().Locate( KPluginNameSeprator ) );
+            
+            HBufC* contentId = HBufC::NewL( contentItem.Name().Length() );
+            CleanupStack::PushL( contentId );
+            
+            TPtr ptr( contentId->Des() ); 
+            ptr = contentItem.Name().Mid( pos + 1 );
+            
+            TInt sizeOfContentId( ptr.Size() + sizeof( wchar_t ) );
+            
+            iContentModel[i].cid = 
+                static_cast<const wchar_t*>( User::AllocL( sizeOfContentId ) );
+                
+            Mem::Copy( ( TAny* )iContentModel[i].cid, 
+                ptr.PtrZ(), sizeOfContentId );
+            
+            CleanupStack::PopAndDestroy( contentId );
+            }
+        
+        iContent = AiUtility::CreateContentItemArrayIteratorL( 
+                iContentModel, iDataCount );
+        }
+    
+    contentItemsArr.Reset();
+    // We own the array so destroy it
+    aSettings.ResetAndDestroy();
+    }
+
+// ----------------------------------------------------------------------------
+// CMCSPlugin::GetProperty
+// 
+// ----------------------------------------------------------------------------
+//
+TAny* CCarouselPlugin::GetProperty( TProperty aProperty )
+    {
+    if( aProperty == EPublisherContent )
+        {
+        return static_cast< MAiContentItemIterator* >( iContent );        
+        }
+        
+    return NULL;
+    }
+ 
+// ----------------------------------------------------------------------------
+// CMCSPlugin::HandleEvent
+// 
+// ----------------------------------------------------------------------------
+//
+void CCarouselPlugin::HandleEvent( const TDesC& aEventName, const TDesC& aParam )
+    {       
+    if( aEventName == KEventNameLaunchByIndex )
+        {        
+        TInt32 index;
+        AiUtility::ParseInt( index, aParam );
+        
+        TRAP_IGNORE( iEngine->LaunchItemL( index - 1 ) );
+        }
+    else if( aEventName == KEventNameShowSettings )
+        {
+        TRAP_IGNORE( iEngine->ShowSettingsL() );
+        }
+    else if( aEventName == _L("ShowEditor"))
+        {
+        TRAP_IGNORE( PublishEditorItemsL() );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CMCSPlugin::CompareItems
+//
+// ----------------------------------------------------------------------------
+//
+TInt CCarouselPlugin::CompareItems( const MAiPluginSettings& aFirst,
+    const MAiPluginSettings& aSecond )
+    {
+    MAiPluginSettings& first = const_cast<MAiPluginSettings&>(aFirst);
+    MAiPluginSettings& second = const_cast<MAiPluginSettings&>(aSecond);
+    return first.AiPluginContentItem().Name().CompareC(second.AiPluginContentItem().Name());    
+    }
+
+// ----------------------------------------------------------------------------
+// CMCSPlugin::DeleteContentModel
+//
+// ----------------------------------------------------------------------------
+//    
+void CCarouselPlugin::DeleteContentModel()
+    {
+    if( iContentModel )
+        {
+        for ( TInt i = 0; i < iDataCount; i++ )
+            {             
+            if( iContentModel[i].cid )
+                {
+                TAny* cell = static_cast<TAny*>( const_cast<wchar_t*>( iContentModel[i].cid ) );
+                User::Free( cell ); // Originally allocated with User::Alloc, so delete
+                                    // with correlating method.
+                iContentModel[i].cid = NULL;
+                }
+            }
+        
+        delete iContentModel;
+        iContentModel = NULL;        
+        }    
+    }
+
+// ----------------------------------------------------------------------------
+// CMCSPlugin::PublishRequired
+//
+// ----------------------------------------------------------------------------
+//    
+TBool CCarouselPlugin::PublishRequired() const
+    {
+    TInt count( iEngine->MenuItemCount() );
+    
+    TBool retval( EFalse );
+    
+    for ( TInt i = 0; !retval && i < count; i++ )
+        {               
+        TRAP_IGNORE( retval = iEngine->MenuDataL( i ).IsDirty() );       
+        }
+        
+    
+    return retval;
+    }
+
+// ======== GLOBAL FUNCTIONS ========
+// ----------------------------------------------------------------------------
+// Constructs and returns an application object.
+// ----------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( 
+    TInt& aTableCount )
+    {
+    aTableCount = sizeof( KImplementationTable ) / 
+        sizeof( TImplementationProxy );
+    return KImplementationTable;
+    }
+
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/src/carouselplugindata.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,580 @@
+/*
+* Copyright (c) 2009 - 2010 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:  
+*
+*/
+#include <mcsmenuitem.h>
+#include <mcsmenufilter.h>
+#include <itemmap.h>
+#include <aistrcnv.h>
+
+#include "carouselplugindata.h"
+#include "carouselpluginengine.h"
+
+using namespace HSPluginSettingsIf;
+
+_LIT( KMenuAttrParam, "param" );
+_LIT( KMenuAttrLocked, "locked" );
+_LIT8( KProperNameType, "type" );
+_LIT8( KProperNameParam, "param" );
+_LIT8( KProperNameUid, "uid" );
+_LIT8( KProperNameView, "view" );
+_LIT8( KProperNameLocked, "locked" );
+_LIT8( KProperValueFolder, "folder" );
+_LIT8( KProperValueBookmark, "bookmark" );
+_LIT8( KProperValueAppl, "application" );
+_LIT8( KProperValueMailbox, "mailbox" );
+_LIT8( KMenuAttrUndefUid, "0x99999991" );
+
+_LIT( KMyMenuData, "matrixmenudata" );
+_LIT( KMenuTypeMailbox, "menu:mailbox" );
+
+
+#define KMCSCmailMtmUidValue 0x2001F406
+
+// ======== LOCAL FUNCTIONS ========
+
+// ----------------------------------------------------------------------------
+// CleanupResetAndDestroy()
+// ----------------------------------------------------------------------------
+//
+template<class T>
+static void CleanupResetAndDestroy( TAny* aObj )
+    {
+    if( aObj )
+        {
+        static_cast<T*>( aObj )->ResetAndDestroy();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CleanupResetAndDestroyPushL
+// ----------------------------------------------------------------------------
+//
+template<class T>
+static void CleanupResetAndDestroyPushL(T& aArray)
+    {
+    CleanupStack::PushL( TCleanupItem( &CleanupResetAndDestroy<T>, &aArray ) );
+    }
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Default constructor
+// ---------------------------------------------------------------------------
+//
+CCarouselData::CCarouselData()
+    :iDirty( ETrue )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CCarouselData::~CCarouselData()
+    {
+    delete iName;
+    delete iValue;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CCarouselData::SetMenuItem( TMenuItem& aMenuItem )
+    {
+    iMenuItem = aMenuItem;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TMenuItem& CCarouselData::MenuItem()
+    {
+    return iMenuItem;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TDesC& CCarouselData::Name()
+    {
+    return *iName;
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CCarouselData::SetNameL( const TDesC& aName )
+    {
+	delete iName;
+	iName = NULL;
+    iName = aName.AllocL();
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TDesC& CCarouselData::Value()
+    {
+    return *iValue;
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CCarouselData::SetValueL( const TDesC& aValue )
+    {
+	delete iValue;
+	iValue = NULL;
+    iValue = aValue.AllocL();
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CCarouselData::SetDirty( TBool aDirty )
+    {
+    iDirty = aDirty;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TBool CCarouselData::IsDirty() const
+    {
+    return iDirty;
+    }
+    
+
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave
+// ---------------------------------------------------------------------------
+//
+CCarouselPluginData* CCarouselPluginData::NewL( CCarouselPluginEngine& aEngine, const TDesC8& aInstanceUid )
+    {
+    CCarouselPluginData* self = new (ELeave) CCarouselPluginData( aEngine, aInstanceUid );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+ 
+    return self;
+    }
+    
+// ---------------------------------------------------------------------------
+// Default constructor
+// ---------------------------------------------------------------------------
+//
+CCarouselPluginData::CCarouselPluginData( CCarouselPluginEngine& aEngine, const TDesC8& aInstanceUid )
+    : iEngine( aEngine ), iInstanceUid( aInstanceUid )
+    {
+    }
+    
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginData::ConstructL()
+    {
+    iPluginSettings = CHomescreenSettings::Instance();
+    if( iPluginSettings == NULL )
+        {
+        User::Leave( KErrUnknown );
+        }
+    iPluginSettings->AddObserverL( this );
+
+    iMenu.OpenL( KMyMenuData );
+
+    UpdateDataL();
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CCarouselPluginData::~CCarouselPluginData()
+    {
+    if( iPluginSettings )
+        {
+        iPluginSettings->RemoveObserver( this );
+        }
+    iData.ResetAndDestroy();
+    iMenu.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the instance specific settings from HSPS and creates data items
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginData::UpdateDataL()
+    {
+    RPointerArray<CItemMap> settings;
+    CleanupResetAndDestroyPushL( settings );
+
+    User::LeaveIfError( iPluginSettings->GetSettingsL( iInstanceUid, settings ) );
+    if ( settings.Count() <= 0 )
+        {
+        User::Leave( KErrNotFound );
+        }
+
+    TBool wasEmpty = !iData.Count();
+    
+    for ( TInt i = 0; i < settings.Count(); i++ )
+       {
+        CItemMap* itemMap = settings[ i ];
+        
+        // get properties
+        RPointerArray<HSPluginSettingsIf::CPropertyMap>& properties
+            = itemMap->Properties();
+        
+        CCarouselData* data = GetMenuDataL( properties );
+        CleanupStack::PushL( data );
+        if ( wasEmpty )
+            {
+            // list of shortcut slot was empty
+            // we append the shortcut data slots one-by-one to the list            
+            data->SetDirty( ETrue );
+            iData.AppendL( data );
+            CleanupStack::Pop( data );
+            }
+        else 
+            {
+            // check for updates in existing shortcut data slot
+            // if menuitem id has changed, replace the item and 
+            // set as dirty
+            TInt id( iData[ i ]->MenuItem().Id() );
+            
+            // id of all bookmarks is zero so name has to be check
+            // in case of bookmark has changed
+            if ( id >= 0 && ( data->MenuItem().Id() != id ||
+                    ( id == 0 && data->Name().CompareF(
+                            iData[ i ]->Name() ) != 0 ) ) )
+                {
+                data->SetDirty( ETrue );
+                CCarouselData* oldData = iData[i];
+                iData.Remove( i );
+                delete oldData;
+                
+                iData.InsertL( data, i );
+                CleanupStack::Pop( data );
+                }
+            else
+                {
+                CleanupStack::PopAndDestroy( data );
+                }
+            }
+        }
+    
+    // Leave if there isn't any data filled into array as there isn't
+    // anything shortcut to publish on homescreen.
+    if ( iData.Count() <= 0 ) 
+        {
+        User::Leave( KErrNotFound );
+        }
+    
+    // Cleanup.
+    CleanupStack::PopAndDestroy(); // settings
+    }
+
+// ---------------------------------------------------------------------------
+// Removes obsolete data and saves 'Undefined' item to HSPS
+// Used when active mailbox is deleted from system.
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginData::RemoveDataL( TInt aId )
+    {
+    TInt count = iData.Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        CCarouselData* data = iData[i];
+        if( data->MenuItem().Type() == KMenuTypeMailbox &&
+            data->MenuItem().Id() == aId )
+            {
+            iData[i]->MenuItem().SetId( KErrNotFound );
+            iData[i]->SetDirty( ETrue );
+            SaveUndefinedItemL( i );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Call back from Homescreen settings
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginData::SettingsChangedL( const TDesC8& /*aEvent*/,  const TDesC8& /*aPluginName*/,
+                           const TDesC8& /*aPluginUid*/, const TDesC8& aPluginId )
+    {
+    if( aPluginId.CompareF( iInstanceUid ) == 0 )
+        {
+        UpdateDataL();
+        }   
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the menu item from engine using the setting properties as filter
+// ---------------------------------------------------------------------------
+//
+CCarouselData* CCarouselPluginData::GetMenuDataL( 
+        RPointerArray<HSPluginSettingsIf::CPropertyMap>& aProperties )
+    {
+    if ( aProperties.Count() <= 0 )
+		{
+		User::Leave( KErrArgument );
+		}
+
+    TPtrC8 type;
+	TPtrC8 uid;
+	TPtrC8 view;
+	TPtrC8 param;
+    
+    // first we need to check the item type
+    for ( TInt i = 0; i < aProperties.Count(); i++ )
+        {
+        if ( aProperties[i]->Name() == KProperNameType )
+            {
+            type.Set( aProperties[i]->Value());
+            }
+        else if( aProperties[i]->Name() == KProperNameUid)
+            {
+            uid.Set( aProperties[i]->Value());
+            }
+        else if( aProperties[i]->Name() == KProperNameView)
+            {
+            view.Set( aProperties[i]->Value());
+            }
+        else if( aProperties[i]->Name() == KProperNameParam )
+            {
+            param.Set( aProperties[i]->Value());
+            }
+        }
+    CCarouselData* data = new ( ELeave ) CCarouselData();
+    CleanupStack::PushL( data );
+    if( type == KProperValueBookmark )
+        {
+        GetBkmDataL( uid, view, param, *data );
+        }
+    else if( type == KProperValueFolder )
+        {
+        GetFolderData( param, *data );
+        }
+    else if( type == KProperValueMailbox )
+        {
+        GetMailboxDataL( uid, param, *data );
+        }
+    else
+        {
+        GetMCSDataL( aProperties, *data );
+        }
+    CleanupStack::Pop( data );
+    return data;
+    }
+
+// ---------------------------------------------------------------------------
+// Creates bookmark data item.
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginData::GetBkmDataL( const TDesC8& aUid, const TDesC8& aView, const TDesC8& aParam, CCarouselData& aData )
+    {
+    TMenuItem item;
+        
+    if( aUid.Length() > 0 )
+        {
+        CMenuFilter* filter = CMenuFilter::NewLC();
+        HBufC* name( NULL );
+        HBufC* value( NULL );
+        name = AiUtility::CopyToBufferL( name, KProperNameUid );
+        CleanupStack::PushL( name );
+        value = AiUtility::CopyToBufferL( value, aUid );
+        CleanupStack::PushL( value );
+        filter->HaveAttributeL( *name, *value );  
+        CleanupStack::PopAndDestroy( value );
+        CleanupStack::PopAndDestroy( name );
+        item = iEngine.FindMenuItemL( *filter );
+        CleanupStack::PopAndDestroy( filter );    
+        }
+    
+    item.SetType( KMenuTypeUrl );
+    aData.SetMenuItem( item );
+
+    HBufC* view( NULL );
+    view = AiUtility::CopyToBufferL( view, aView );
+    CleanupStack::PushL( view );
+    aData.SetValueL( *view );
+    CleanupStack::PopAndDestroy( view );
+    
+    HBufC* param( NULL );
+    param = AiUtility::CopyToBufferL( param, aParam );
+    CleanupStack::PushL( param );
+    aData.SetNameL( *param );
+    CleanupStack::PopAndDestroy( param );
+    }
+    
+// ---------------------------------------------------------------------------
+// Creates folder data item.
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginData::GetFolderData( const TDesC8& aParam, CCarouselData& aData )
+    {
+    // In folder case, we have to extract id from 
+    // param attribute and return item with this id
+    // convert id to integer
+    TInt id;
+    TLex8 lextmp( aParam);
+    lextmp.Val( id );
+    
+    TMenuItem item;
+    item.SetType( KMenuTypeFolder );
+    item.SetId( id );
+    aData.SetMenuItem( item );
+    }
+
+// ---------------------------------------------------------------------------
+// Creates mailbox data item.
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginData::GetMailboxDataL( const TDesC8& aUid, const TDesC8& aParam, CCarouselData& aData )
+    {
+    TInt id( KErrNotFound );
+    TLex8 lextmp( aUid);
+    lextmp.Val( id );
+    
+    TMenuItem item;
+    item.SetType( KMenuTypeMailbox );
+    item.SetId( id );
+    aData.SetMenuItem( item );
+    
+    HBufC* param( NULL );
+    param = AiUtility::CopyToBufferL( param, aParam );
+    CleanupStack::PushL( param );
+    
+    aData.SetNameL( *param );
+    
+    CleanupStack::PopAndDestroy( param );
+    }
+    
+// ---------------------------------------------------------------------------
+// Gets data item from MCS
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginData::GetMCSDataL( RPointerArray<HSPluginSettingsIf::CPropertyMap>& aProperties,
+        CCarouselData& aData)
+    {
+    CMenuFilter* filter = CMenuFilter::NewLC();
+
+    // Exclude 'view' and 'param' attributes from search criteria by default
+    // Criterias will be added to filter if setting defines them
+    filter->DoNotHaveAttributeL( KMenuAttrView );
+    filter->DoNotHaveAttributeL( KMenuAttrParam );
+    
+    // then add all property/value pairs to the filter
+    for ( TInt i = 0; i < aProperties.Count(); i++ )
+        {
+        // skip the type property
+        if( aProperties[i]->Name() == KProperNameType )
+            {
+            continue;
+            }
+
+        HBufC* name( NULL );
+        HBufC* value( NULL );
+        name = AiUtility::CopyToBufferL( name, aProperties[i]->Name() );
+        CleanupStack::PushL( name );
+        value = AiUtility::CopyToBufferL( value, aProperties[i]->Value() );
+        CleanupStack::PushL( value );
+
+        if ( value->Length() != 0 )
+            {
+            filter->HaveAttributeL( *name, *value );  
+            }
+        CleanupStack::PopAndDestroy( value );
+        CleanupStack::PopAndDestroy( name );
+        }
+    
+    // locked property excluded from search pattern 
+    filter->DoNotHaveAttributeL( KMenuAttrLocked );
+    
+    TMenuItem item = iEngine.FindMenuItemL( *filter );
+    CleanupStack::PopAndDestroy( filter );
+    aData.SetMenuItem( item );
+    }
+
+// ---------------------------------------------------------------------------
+// Returns menu item for given index
+// ---------------------------------------------------------------------------
+//
+CCarouselData& CCarouselPluginData::DataItemL( TInt aIndex )
+    {
+    if( aIndex < 0 || aIndex >= iData.Count())
+        {
+        User::Leave( KErrArgument ); 
+        }
+    return *iData[aIndex];
+    }
+
+// ---------------------------------------------------------------------------
+// Save the undefined item.
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginData::SaveUndefinedItemL( const TInt& aIndex )
+    {
+    RPointerArray<CItemMap> settingItems;
+    CleanupResetAndDestroyPushL( settingItems );
+    
+    iPluginSettings->GetSettingsL( iInstanceUid, settingItems );
+    if ( aIndex >= 0 && aIndex < settingItems.Count() )
+        {
+        CItemMap* itemMap = settingItems[ aIndex ];
+        
+        // get properties
+        RPointerArray<HSPluginSettingsIf::CPropertyMap>& properties
+            = itemMap->Properties();
+
+        for ( TInt i = 0; i < properties.Count(); i++ )
+            {
+            if ( properties[ i ]->Name() == KProperNameType )
+                {
+                properties[ i ]->SetValueL( KProperValueAppl );
+                }
+            else if ( properties[ i ]->Name() == KProperNameUid )
+                {
+                properties[ i ]->SetValueL( KMenuAttrUndefUid );
+                }
+            else if ( properties[ i ]->Name() == KProperNameView )
+                {
+                properties[ i ]->SetValueL( KNullDesC8 );
+                }
+            else if ( properties[ i ]->Name() == KProperNameParam )
+                {
+                properties[ i ]->SetValueL( KNullDesC8 );
+                }
+            else if ( properties[ i ]->Name() == KProperNameLocked )
+                {
+                properties[i]->SetValueL( KNullDesC8 );
+                }
+            }
+        }
+    // ETrue tells that modified settings are stored also to plugin reference
+    iPluginSettings->SetSettingsL( iInstanceUid, settingItems, ETrue );
+    CleanupStack::PopAndDestroy(); // settingItems
+    }
+
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/src/carouselpluginengine.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,841 @@
+/*
+* Copyright (c) 2009-2010 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:  The engine class of MCS plugin. 
+*
+*/
+
+// System includes
+#include <gulicon.h>
+#include <gslauncher.h>
+#include <mcsmenufilter.h>
+#include <mcsmenuoperation.h>
+#include <mcsmenuiconutility.h>
+#include <bautils.h>
+#include <StringLoader.h>
+#include <aknnotedialog.h>
+#include <mcspluginres.rsg>
+#include <apgcli.h> 
+#include <apacmdln.h>
+#include <gfxtranseffect/gfxtranseffect.h>      
+#include <akntranseffect.h>
+#include <schemehandler.h>
+#include <viewcli.h>                // For CVwsSessionWrapper
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <viewclipartner.h>
+#endif
+#include <aisystemuids.hrh>
+
+// User includes
+#include "carouselpluginengine.h"
+#include "carouselplugin.h"
+#include "carouselplugindata.h"
+#include "carouselpluginuids.hrh"
+
+// Constants
+_LIT( KMyMenuData, "matrixmenudata" );
+_LIT( KSkin,         "skin" );
+_LIT( KMif,          "mif" );
+_LIT( KResourceDrive, "Z:" );
+_LIT( KResourceFile, "mcspluginres.rsc" );
+_LIT( KResPath, "\\resource\\" );
+_LIT( KMMApplication, "mm://" );
+_LIT( KHideExit2, "&exit=hide" );
+_LIT( KSetFocusString, "!setfocus?applicationgroup_name=" );
+_LIT( KApplicationGroupName, "applicationgroup_name" );
+_LIT( KIcon, "icon" );
+_LIT( KMenuAttrUndefUid, "0x99999991" );
+_LIT( KMenuIconFile, "aimcsplugin.mif" );
+_LIT( KMenuBookmarkIconId, "16386" );
+_LIT( KMenuBookmarkMaskId, "16387" );
+_LIT( KMenuMailboxIconId, "16388" );
+_LIT( KMenuMailboxMaskId, "16389" );
+_LIT( KMenuTypeMailbox, "menu:mailbox" );
+_LIT( KPrefix, "0x" );
+
+const TUid KHomescreenUid = { AI_UID3_AIFW_COMMON };
+const TUid KMMUid = { 0x101F4CD2 };
+const TUid KMCSCmailUidValue = { 0x2001E277 };
+const TUid KMCSCmailMailboxViewIdValue = { 0x2 };
+const TUid KBrowserUid = { 0x10008D39 };
+
+// ======== LOCAL FUNCTIONS ========
+// ----------------------------------------------------------------------------
+// NextIdToken
+// ----------------------------------------------------------------------------
+//
+static TPtrC NextIdToken( TLex& aLexer )
+   {
+   aLexer.SkipSpace();
+   aLexer.Mark();
+  
+   while( !aLexer.Eos() && !aLexer.Peek().IsSpace() && aLexer.Peek() != ')' )
+       {
+       aLexer.Inc();
+       }
+   
+   return aLexer.MarkedToken();
+   }
+
+// ----------------------------------------------------------------------------
+// Shows note dailog, with the given resource.
+// ----------------------------------------------------------------------------
+//
+static void ShowNoteDlgL( TInt aResource )
+    {
+    HBufC* temp = StringLoader::LoadLC( aResource );
+    
+    CAknNoteDialog* dialog = new (ELeave) CAknNoteDialog(
+    CAknNoteDialog::EConfirmationTone,
+    CAknNoteDialog::ENoTimeout );
+    CleanupStack::PushL( dialog );
+    dialog->SetTextL( temp->Des() );
+    dialog->ExecuteDlgLD( R_MCS_DISABLE_OPEN_ITEM_DLG );
+    CleanupStack::Pop( dialog );
+    CleanupStack::PopAndDestroy( temp );
+    }
+
+// ----------------------------------------------------------------------------
+// Parses uid in Hexadecimal format from the given string.
+// ----------------------------------------------------------------------------
+//
+TUid ParseHexUidFromString(const TDesC& aUidString )
+    {
+    TUid uid( KNullUid ); 
+    const TInt pos( aUidString.FindF( KPrefix ) );
+    
+    if ( pos != KErrNotFound )
+        {
+        TLex lex( aUidString.Mid( pos + KPrefix().Length() ) );
+        
+        // Hex parsing needs unsigned int
+        TUint32 value( 0 );
+        const TInt parseResult( lex.Val( value, EHex ) );
+        
+        if ( parseResult == KErrNone )
+            {
+            TInt32 value32( value );
+            uid.iUid = value32;   
+            }
+        }
+    return uid;
+    }
+
+// ----------------------------------------------------------------------------
+// Start transition effect. User has launched the application with the given uid.
+// ----------------------------------------------------------------------------
+//
+void StartEffect( TUid aUid )
+    {
+    //start a full screen effect
+    GfxTransEffect::BeginFullScreen( 
+        AknTransEffect::EApplicationStart,
+        TRect(), 
+        AknTransEffect::EParameterType, 
+        AknTransEffect::GfxTransParam( aUid,
+        AknTransEffect::TParameter::EActivateExplicitContinue ));
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+// ----------------------------------------------------------------------------
+// CMCSPluginEngine::CMCSPluginEngine
+//
+// ----------------------------------------------------------------------------
+//
+CCarouselPluginEngine::CCarouselPluginEngine( CCarouselPlugin& aPlugin, 
+    const TDesC8& aInstanceUid ) 
+    : iPlugin( aPlugin ), iInstanceUid( aInstanceUid )    
+    {
+    }
+    
+// ----------------------------------------------------------------------------
+// CMCSPluginEngine::NewL
+// 
+// ----------------------------------------------------------------------------
+//
+CCarouselPluginEngine* CCarouselPluginEngine::NewL( CCarouselPlugin& aPlugin, 
+    const TDesC8& aInstanceUid )
+    {
+    CCarouselPluginEngine* self = 
+        new( ELeave ) CCarouselPluginEngine( aPlugin, aInstanceUid );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CMCSPluginEngine::ConstructL
+//
+// ----------------------------------------------------------------------------
+//
+void CCarouselPluginEngine::ConstructL()
+    {
+    TFullName resourceFile( KResourceDrive );
+    resourceFile.Append( KResPath );
+    resourceFile.Append( KResourceFile );
+    BaflUtils::NearestLanguageFile(
+        CCoeEnv::Static()->FsSession(),
+        resourceFile );
+    iResourceOffset =
+        CCoeEnv::Static()->AddResourceFileL( resourceFile );
+    InitL();
+    StartObservingL();
+    
+    // Get "Undefined" item
+    CMenuFilter* filter = CMenuFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->HaveAttributeL( KMenuAttrUid, KMenuAttrUndefUid );
+    iUndefinedItemHeader = FindMenuItemL( *filter );
+    CleanupStack::PopAndDestroy( filter );
+    iUndefinedItem = CMenuItem::OpenL( iMenu, iUndefinedItemHeader );    
+    }
+
+// ----------------------------------------------------------------------------
+// CMCSPluginEngine::~CMCSPluginEngine
+//
+// ----------------------------------------------------------------------------
+//
+CCarouselPluginEngine::~CCarouselPluginEngine()
+    {
+    StopObserving();
+
+    delete iPluginData;
+
+    // Notifier close has to be before iMenu close
+    iNotifier.Close();
+    iMenu.Close();
+    delete iWatcher;
+    delete iNotifyWatcher;
+
+    CCoeEnv::Static()->DeleteResourceFile( iResourceOffset );
+
+    delete iUndefinedItem;
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::InitL
+//
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginEngine::InitL()
+    {
+    iMenu.OpenL( KMyMenuData );
+    iPluginData = CCarouselPluginData::NewL( *this, iInstanceUid );
+    iWatcher = CCarouselPluginWatcher::NewL( CCarouselPluginWatcher::EOperation );
+    
+    TInt err( iNotifier.Open( iMenu ) ); 
+    
+    if ( err == KErrNone )
+        {
+        iNotifyWatcher = CCarouselPluginWatcher::NewL( CCarouselPluginWatcher::ENotify );
+        
+        iNotifier.Notify( 0,
+            RMenuNotifier::EItemsAddedRemoved,
+            iNotifyWatcher->iStatus );
+        iNotifyWatcher->WatchNotify( this );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::StartObservingL
+//
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginEngine::StartObservingL()
+    {
+    // registering to mailbox db. changes observing
+    iMsvSession = CMsvSession::OpenAsObserverL( *this );
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::StopObserving
+//
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginEngine::StopObserving()
+    {       
+    delete iMsvSession;
+    iMsvSession = NULL;    
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::MenuDataL
+//
+// ---------------------------------------------------------------------------
+//
+CCarouselData& CCarouselPluginEngine::MenuDataL( const TInt& aIndex )
+    {
+    return iPluginData->DataItemL( aIndex );
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::MenuItemCount
+//
+// ---------------------------------------------------------------------------
+//
+TInt CCarouselPluginEngine::MenuItemCount()
+    {
+    return iPluginData->DataCount();
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::FindMenuItemL
+// Returns the menu item header, which matches the given filter.
+// ---------------------------------------------------------------------------
+//
+TMenuItem CCarouselPluginEngine::FindMenuItemL( CMenuFilter& aFilter )
+    {    
+    TMenuItem item;
+    const TInt root( iMenu.RootFolderL() );
+    
+    RArray<TMenuItem> items;
+    CleanupClosePushL( items );
+    
+    iMenu.GetItemsL( items, root, &aFilter, ETrue );
+    
+    if ( items.Count() > 0 )
+        {
+        item = items[0];
+        }
+
+    CleanupStack::PopAndDestroy( &items );
+    
+    return item;
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::FetchMenuItemL
+// Returns the actual menu item for the given header.
+// ---------------------------------------------------------------------------
+//
+CMenuItem* CCarouselPluginEngine::FetchMenuItemL( CCarouselData& aData )
+    {
+    CMenuItem* item = NULL;
+    
+    TRAP_IGNORE( item = CMenuItem::OpenL( iMenu, aData.MenuItem().Id() ) );
+    
+    if( item )
+        {
+        return item; 
+        }
+    
+    if( aData.MenuItem().Type() == KMenuTypeUrl )
+        {
+        item = CreateBkmItemL( aData );
+        }
+    else if( aData.MenuItem().Type() == KMenuTypeMailbox )
+        {
+        item = CreateMailboxItemL( aData);
+        }
+    
+    return item;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CMenuItem* CCarouselPluginEngine::CreateBkmItemL( CCarouselData& aData )
+    {
+    CMenuItem* item( NULL );
+    if( aData.MenuItem().Id() != KErrNotFound )
+        {        
+        item = CMenuItem::CreateL( iMenu, KMenuTypeUrl, 0, 0 );
+        CleanupStack::PushL( item );
+        item->SetAttributeL( KMenuAttrLongName, aData.Name() );
+        item->SetAttributeL( KMenuAttrIconFile, KMenuIconFile );
+        item->SetAttributeL( KMenuAttrIconId, KMenuBookmarkIconId );
+        item->SetAttributeL( KMenuAttrMaskId, KMenuBookmarkMaskId );
+        CleanupStack::Pop( item );
+        }
+    return item;
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CMenuItem* CCarouselPluginEngine::CreateMailboxItemL( CCarouselData& aData )
+    {
+    CMenuItem* item( NULL );
+    if( aData.MenuItem().Id() != KErrNotFound )
+        {   
+        item = CMenuItem::CreateL( iMenu, KMenuTypeMailbox, 0, 0 );
+        CleanupStack::PushL( item );
+        item->SetAttributeL( KMenuAttrLongName, aData.Name() );
+        item->SetAttributeL( KMenuAttrIconFile, KMenuIconFile );
+        item->SetAttributeL( KMenuAttrIconId, KMenuMailboxIconId );
+        item->SetAttributeL( KMenuAttrMaskId, KMenuMailboxMaskId );
+        CleanupStack::Pop( item );
+        }
+    return item;
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::ItemIconL
+// Returns MCS default icon if attribute is 'icon' else parses the
+// skin definition from attribute and sets attributes to aMenuItem.
+// ---------------------------------------------------------------------------
+//
+CGulIcon* CCarouselPluginEngine::ItemIconL( CMenuItem* aMenuItem, 
+    const TDesC& aAttr )
+    {
+    
+    CMenuItem* menuItem;
+  
+    // check if item exists in MCS
+    if ( aMenuItem )
+        { 
+        TUint32 flags = aMenuItem->Flags();
+        TUint32 isHidden = flags & TMenuItem::EHidden;
+        TUint32 isMissing = flags & TMenuItem::EMissing;
+
+        if ( iUndefinedItem && ( isHidden || isMissing ) )
+            {
+            menuItem = iUndefinedItem;
+            }
+        else
+            {
+            menuItem = aMenuItem;
+            }
+        }
+    else 
+        {
+        // item not found in MCS. Use Undefined Icon
+        menuItem = iUndefinedItem;
+        }
+
+    CAknIcon* icon( NULL );
+    CGulIcon* gIcon( NULL );
+    TBool exists( ETrue );
+    
+    if ( aAttr != KIcon )
+        {
+        // Resolve secondary icon definition from attribute
+        TPtrC iconDef( menuItem->GetAttributeL( aAttr, exists ) );
+    
+        if ( exists )
+            {
+            exists = ConstructMenuItemForIconL( iconDef, *menuItem );
+            }
+        }
+    
+    if ( exists )
+        {
+        icon = MenuIconUtility::GetItemIconL( *menuItem );
+    
+        if ( icon )
+            {
+            CleanupStack::PushL( icon );
+            
+            gIcon = CGulIcon::NewL( icon->Bitmap(), icon->Mask() );
+            
+            // Detach and delete
+            icon->SetBitmap( NULL );
+            icon->SetMask( NULL );    
+            
+            CleanupStack::PopAndDestroy( icon );
+            }
+        }
+    
+    return gIcon;
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::ItemTextL
+// Returns text string for the given attribute
+// ---------------------------------------------------------------------------
+//
+TPtrC CCarouselPluginEngine::ItemTextL( CMenuItem* aMenuItem, const TDesC& aAttr )
+    {
+
+    CMenuItem* menuItem;
+
+    // check if item exists in MCS
+    if ( aMenuItem )
+        {
+        TUint32 flags = aMenuItem->Flags();
+        TUint32 isHidden = flags & TMenuItem::EHidden;
+        TUint32 isMissing = flags & TMenuItem::EMissing;
+
+        // if item is hidden or missing (mmc card removed)
+        // use "Undefined" text instead
+        if ( iUndefinedItem && ( isHidden || isMissing ) )
+            {
+            menuItem = iUndefinedItem;
+            }
+        else
+            {
+            menuItem = aMenuItem;
+            }
+        }
+    else 
+        {
+        // item not found in MCS. Use "Undefined" text
+        menuItem = iUndefinedItem;
+        }
+    
+    TBool exists( KErrNotFound );
+    
+    TPtrC name( menuItem->GetAttributeL( aAttr, exists ) );
+    
+    if ( exists )
+        {
+        return name;
+        }
+
+    return KNullDesC();
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::LaunchItemL
+// Calls the open command for the given menu item header
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginEngine::LaunchItemL( const TInt& aIndex )
+    {
+    if ( iBackupRestore )
+        {
+        ShowNoteDlgL( R_MCS_DISABLE_OPEN_ITEM ); 
+        return;
+        }
+
+    CCarouselData& dataItem( iPluginData->DataItemL( aIndex ) );
+    // run item based on its type
+    TPtrC type( dataItem.MenuItem().Type());
+
+    // run folder
+    if ( type == KMenuTypeFolder )
+        {
+        LaunchFolderItemL( dataItem );
+        }
+    else if( type == KMenuTypeUrl )
+        {
+        LaunchBookmarkItemL( dataItem );
+        }
+    else if( type == KMenuTypeMailbox )
+        {
+        LaunchMailboxItemL( dataItem );
+        }
+    else
+        {
+        LaunchMCSItemL( dataItem );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginEngine::LaunchFolderItemL( CCarouselData& aData )
+    {
+    CMenuItem* item = NULL;
+    TRAP_IGNORE( item = CMenuItem::OpenL( iMenu, aData.MenuItem().Id() ) );
+    
+    // item does not exist at all in MCS
+    if ( item == NULL )
+        {
+        ShowNoteDlgL( R_MCS_DISABLE_OPEN_ITEM_MISSING );
+        return;
+        }
+    
+    CleanupStack::PushL( item );
+    
+    StartEffect( KMMUid );
+    
+    // message for MM application
+    HBufC8* message; 
+
+    // prepare message for launching folder
+    TBool hasApplicationGroupName( EFalse );
+    
+    TPtrC applicationGroupName( item->GetAttributeL(
+        KApplicationGroupName, hasApplicationGroupName ) );
+                                                      
+    if ( !hasApplicationGroupName )
+        {
+        return;
+        }
+    
+    message = HBufC8::NewLC( KMMApplication().Length() + 
+                             KSetFocusString().Length() +
+                             applicationGroupName.Length() + 
+                             KHideExit2().Length() );
+
+    message->Des().Copy( KMMApplication );
+    message->Des().Append( KSetFocusString );
+    message->Des().Append( applicationGroupName );
+    message->Des().Append( KHideExit2 );
+
+    // find MM application
+    TApaTaskList taskList( CCoeEnv::Static()->WsSession() );
+    TApaTask task( taskList.FindApp( KMMUid ) );
+
+    if ( task.Exists() )
+        {
+        // MM is already running in background - send APA Message
+        task.SendMessage( 
+            TUid::Uid( KUidApaMessageSwitchOpenFileValue ), *message );
+        }
+    else
+        { 
+        // MM not running yet - use Command Line Tail
+        RApaLsSession appArcSession;
+        CleanupClosePushL( appArcSession );
+        
+        User::LeaveIfError( appArcSession.Connect() );
+        
+        TApaAppInfo appInfo;
+        TInt err( appArcSession.GetAppInfo( appInfo, KMMUid ) );
+        
+        if ( err == KErrNone )
+            {
+            CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
+            cmdLine->SetExecutableNameL( appInfo.iFullName );
+            cmdLine->SetCommandL( EApaCommandRun );
+            cmdLine->SetTailEndL( *message );
+            appArcSession.StartApp( *cmdLine );
+            CleanupStack::PopAndDestroy( cmdLine );
+            }
+        CleanupStack::PopAndDestroy( &appArcSession ); 
+        }
+    CleanupStack::PopAndDestroy( message );
+    CleanupStack::PopAndDestroy( item );
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginEngine::LaunchBookmarkItemL( CCarouselData& aData )
+    {
+    StartEffect( KBrowserUid );
+    
+    CSchemeHandler* urlHandler = CSchemeHandler::NewL( aData.Value());    
+    CleanupStack::PushL( urlHandler );
+    urlHandler->HandleUrlStandaloneL();
+    CleanupStack::PopAndDestroy( urlHandler );
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginEngine::LaunchMailboxItemL( CCarouselData& aData )
+    {
+    TInt id( aData.MenuItem().Id());
+    if ( id == KErrNotFound )
+        {
+        ShowNoteDlgL( R_MCS_DISABLE_OPEN_ITEM_MISSING );
+        return;
+        }
+    
+    StartEffect( KMCSCmailUidValue );
+    
+    TUid uId = TUid::Uid( id );
+    const TVwsViewId viewId( KMCSCmailUidValue, KMCSCmailMailboxViewIdValue );
+    CVwsSessionWrapper* vwsSession = CVwsSessionWrapper::NewL();
+    vwsSession->CreateActivateViewEvent( viewId, uId, KNullDesC8() );
+    delete vwsSession;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginEngine::LaunchMCSItemL( CCarouselData& aData )
+    {
+    if( iWatcher->IsActive())
+        {
+        return;
+        }
+    CMenuItem* item = NULL;
+    TRAP_IGNORE( item = CMenuItem::OpenL( iMenu, aData.MenuItem().Id() ) );
+
+    // item does not exist at all in MCS
+    if ( item == NULL )
+        {
+        ShowNoteDlgL( R_MCS_DISABLE_OPEN_ITEM_MISSING );
+        return;
+        }
+
+    CleanupStack::PushL( item );
+    
+    TBool attrExists = ETrue;
+    TPtrC uid = item->GetAttributeL( KMenuAttrUid, attrExists );
+
+    // trying to run hidden or missing application (e.g. unistalled app 
+    // or app on MMC which was removed )
+    // -> We display a note for a user that this is not possible¨
+    TUint32 isHidden = item->Flags() & TMenuItem::EHidden;
+    TUint32 isMissing = item->Flags() & TMenuItem::EMissing;
+
+    if ( ( attrExists && uid == KMenuAttrUndefUid ) || isHidden || isMissing )
+        {
+        CleanupStack::PopAndDestroy( item );
+        ShowNoteDlgL( R_MCS_DISABLE_OPEN_ITEM_MISSING );
+        return;
+        }
+    
+    if ( attrExists )
+        {      
+        StartEffect( ParseHexUidFromString( uid ));
+        }
+    
+    // run application/shortcut
+    CMenuOperation* operation( item->HandleCommandL(
+        KMenuCmdOpen, KNullDesC8, iWatcher->iStatus ) );
+    iWatcher->Watch( operation );
+    CleanupStack::PopAndDestroy( item );
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::HandleNotifyL
+// Handle the change in Menu Content
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginEngine::HandleNotifyL()
+    {
+    TInt count( iPluginData->DataCount() );
+    
+    for ( TInt i = 0; i < count; i++ )
+        {
+        CCarouselData& data( iPluginData->DataItemL( i ) );
+        data.SetDirty( ETrue );
+        }
+    
+    iPlugin.PublishL();
+    
+    // Notification must be activated again
+    iNotifyWatcher->Cancel();
+    iNotifier.Notify( 0,
+        RMenuNotifier::EItemsAddedRemoved,
+        iNotifyWatcher->iStatus );
+
+    iNotifyWatcher->WatchNotify( this );
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::HandleSessionEventL
+// Handles an event from the message server.
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginEngine::HandleSessionEventL( TMsvSessionEvent aEvent, 
+    TAny* aArg1, TAny* /*aArg2*/, TAny* /*aArg3*/)
+    {
+    switch ( aEvent )
+        {
+        case EMsvEntriesDeleted:
+            {
+            CMsvEntrySelection* sel = static_cast<CMsvEntrySelection*>( aArg1 );
+            TInt count( sel->Count());
+            for( TInt i = 0; i < count; i++ )
+                {
+                iPluginData->RemoveDataL( sel->At( i ) );
+                }
+            }
+            break;
+        default:
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::SetBackupRestore
+//
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginEngine::SetBackupRestore( TBool aBackupRestore )
+    {
+    iBackupRestore = aBackupRestore;
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::ShowSettingsL
+// Launch General Settings plugin
+// ---------------------------------------------------------------------------
+//
+void CCarouselPluginEngine::ShowSettingsL()
+    { 
+    TUid uid = {AI_UID_ECOM_IMPLEMENTATION_SETTINGS_MCSPLUGIN};
+    
+    CGSLauncher* launcher = CGSLauncher::NewLC();
+    launcher->LaunchGSViewL ( uid, KHomescreenUid, iInstanceUid );
+    CleanupStack::PopAndDestroy( launcher );
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSPluginEngine::ConstructMenuItemForIconL
+// Syntax: skin(major minor):mif(filename bimapId maskId)
+// ---------------------------------------------------------------------------
+//
+TBool CCarouselPluginEngine::ConstructMenuItemForIconL( const TDesC& aPath, 
+    CMenuItem& aMenuItem )
+   {
+   TInt pos( aPath.Locate( ':' ) );
+   if ( pos == KErrNotFound )
+       {
+       pos = aPath.Length();
+       }
+   TPtrC skin( aPath.Left( pos ) );
+   TInt sf( skin.FindF( KSkin ) );
+   
+   if ( sf == KErrNotFound )
+       {
+       return EFalse;
+       }
+   
+   TPtrC temp( skin.Mid( sf + KSkin().Length() ) );
+   TLex input( temp );   
+   input.SkipSpace();
+   
+   if ( !input.Eos() && input.Peek() == '(' )
+       {
+       input.Inc();
+       }
+   TPtrC majorId( NextIdToken( input ) );
+   TPtrC minorId( NextIdToken( input ) );
+   
+   aMenuItem.SetAttributeL( KMenuAttrIconSkinMajorId, majorId );
+   aMenuItem.SetAttributeL( KMenuAttrIconSkinMinorId, minorId );
+   
+   if ( aPath.Length() > pos && 
+      ( aPath.Mid( pos + 1 ).FindF( KMif ) != KErrNotFound ) )
+       {
+       TPtrC mif( aPath.Mid( pos + 1 ) );
+       TInt mf( mif.FindF( KMif ) );
+       
+       TLex input1( mif.Mid( mf + KMif().Length() ) );
+       input1.SkipSpace();
+       
+       if ( !input1.Eos() && input1.Peek() == '(' )
+          {
+          input1.Inc();
+          }
+       
+       TPtrC file( NextIdToken( input1 ) );
+       TPtrC bitmapId( NextIdToken( input1 ) );
+       TPtrC maskId( NextIdToken( input1 ) );
+       
+       aMenuItem.SetAttributeL( KMenuAttrIconFile, file );
+       aMenuItem.SetAttributeL( KMenuAttrIconId, bitmapId );
+       aMenuItem.SetAttributeL( KMenuAttrMaskId, maskId );
+       }
+   
+   return ETrue;
+   }
+
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/publisher/src/carouselpluginwatcher.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2009 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:  Menu item operation watcher. 
+*
+*/
+
+#include <mcsmenuoperation.h>
+#include "carouselpluginwatcher.h"
+#include "carouselpluginengine.h"
+
+// ---------------------------------------------------------------------------
+// two-phased constructor
+// ---------------------------------------------------------------------------
+CCarouselPluginWatcher* CCarouselPluginWatcher::NewL( const Type& aType )
+	{
+	CCarouselPluginWatcher* self = new (ELeave) CCarouselPluginWatcher( aType );
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop( self );
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// default constructor
+// ---------------------------------------------------------------------------
+CCarouselPluginWatcher::CCarouselPluginWatcher( const Type& aType )
+	: CActive( CActive::EPriorityStandard ),
+	iType( aType )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// ---------------------------------------------------------------------------
+// destructor
+// ---------------------------------------------------------------------------
+CCarouselPluginWatcher::~CCarouselPluginWatcher()
+    {
+    Cancel();
+    }
+
+// ---------------------------------------------------------------------------
+// second phase constructor
+// ---------------------------------------------------------------------------
+void CCarouselPluginWatcher::ConstructL()
+	{
+	
+	}
+
+// ---------------------------------------------------------------------------
+// Watch  Async
+// ---------------------------------------------------------------------------
+void CCarouselPluginWatcher::Watch( CMenuOperation* aOperation)
+    {
+    __ASSERT_DEBUG( KRequestPending == iStatus.Int(), User::Invariant() );
+    //__ASSERT_DEBUG( !iOperation, User::Invariant() ); 
+    iOperation = aOperation;
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+// Watch  Async
+// ---------------------------------------------------------------------------
+void CCarouselPluginWatcher::WatchNotify( MCarouselPluginWatcherObserver* aObserver )
+    {
+    __ASSERT_DEBUG( KRequestPending == iStatus.Int(), User::Invariant() );
+    //__ASSERT_DEBUG( !iOperation, User::Invariant() ); 
+    iObserver = aObserver;
+    SetActive();
+    }
+
+void CCarouselPluginWatcher::StopAndWatch( CMenuOperation* aOperation, 
+                                      CActiveSchedulerWait* aWaitScheduler )
+    {
+    __ASSERT_DEBUG( KRequestPending == iStatus.Int(), User::Invariant() );
+    iWaitScheduler = aWaitScheduler;
+    iOperation = aOperation;
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+// Inherited from CActive class 
+// ---------------------------------------------------------------------------
+void CCarouselPluginWatcher::RunL()
+    {
+    delete iOperation;
+    iOperation = NULL;  
+    
+    if( iType == ENotify )
+        {
+        iObserver->HandleNotifyL();
+        }
+    if ( iWaitScheduler && iWaitScheduler->IsStarted() )
+        {
+        Cancel();
+        iWaitScheduler->AsyncStop();
+        }
+    //CActiveScheduler::Stop();
+    }
+
+// ---------------------------------------------------------------------------
+// Inherited from CActive class 
+// ---------------------------------------------------------------------------
+void CCarouselPluginWatcher::DoCancel()
+    {
+    delete iOperation;
+    iOperation = NULL;
+    }
+
+TInt CCarouselPluginWatcher::GetStatus()
+    {
+    return iStatus.Int();
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/renderer/data/carouselwidget.rss	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2010 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:  Carousel widget for Symbian Homescreen
+ *
+ */
+
+#include <ecom/registryinfo.rh>
+
+RESOURCE REGISTRY_INFO theInfo
+{
+dll_uid = 0xEabba432;
+interfaces =
+    {
+    INTERFACE_INFO
+        {
+        interface_uid = 0x200286DF;
+        implementations =
+            {
+            IMPLEMENTATION_INFO
+                {
+                implementation_uid = 0xEabba433;
+                version_no = 1;
+                display_name = "CarouselWidget";
+                default_data = "carousel";
+                opaque_data = "";
+                }
+            };
+        }
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/renderer/group/bld.inf	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2010 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:  Carousel widget for Symbian Homescreen
+ *
+ */
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+ARMV5 WINSCW
+
+PRJ_EXPORTS
+
+../rom/carouselwidget.iby                CORE_MW_LAYER_IBY_EXPORT_PATH(carouselwidget.iby)
+
+PRJ_MMPFILES
+
+carouselwidget.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/renderer/group/carouselwidget.mmp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2010 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:  Carousel widget for Symbian Homescreen
+ *
+ */
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+TARGET          carouselwidget.dll
+TARGETTYPE      PLUGIN
+UID             0x10009d8d 0xEabba432
+
+CAPABILITY      CAP_ECOM_PLUGIN
+
+EPOCALLOWDLLDATA
+
+SOURCEPATH      ../src 
+SOURCE          carouselwidget.cpp
+
+USERINCLUDE     ../inc
+
+MW_LAYER_SYSTEMINCLUDE
+APP_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH      ../data
+START RESOURCE  carouselwidget.rss
+HEADER
+TARGETPATH      ECOM_RESOURCE_DIR
+END
+
+LIBRARY         extrenderingplugin.lib
+LIBRARY         euser.lib
+LIBRARY         eikcore.lib
+LIBRARY         cone.lib
+LIBRARY         xn3layoutengine.lib
+LIBRARY         xn3utils.lib
+LIBRARY         xn3domdocument.lib
+LIBRARY	        avkon.lib
+LIBRARY         ws32.lib
+LIBRARY         fbscli.lib
+LIBRARY         bitgdi.lib
+LIBRARY         egul.lib
+LIBRARY         bafl.lib
+LIBRARY         eikcoctl.lib
+LIBRARY         eikctl.lib
+LIBRARY         gdi.lib
+LIBRARY         aknicon.lib
+LIBRARY         aknphysics.lib
+LIBRARY         AknSkins.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/renderer/inc/carouselwidget.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2010 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:  Carousel widget for Symbian Homescreen
+ *
+ */
+
+#ifndef _CCAROUSELWIDGET_H
+#define _CCAROUSELWIDGET_H
+
+//  INCLUDES
+#include <xnextrenderingpluginadapter.h>
+#include <aknphysicsobserveriface.h>
+
+class MXnExtEventHandler;
+class CCarouselItem;
+class CAknPhysics;
+
+// Class declaration
+NONSHARABLE_CLASS( CCarouselItem ) : public CBase  
+    {
+public:
+
+    // Constructors
+        
+    /**
+     * C++ default constructor.
+     */
+CCarouselItem(/* CCarouselEditor& aEditor,*/ CFbsBitmap* aBitmap, CFbsBitmap* aMask);
+    
+    /**
+     * Destructor.
+     */
+    ~CCarouselItem();
+    
+    void SetTextL( const TDesC& aText );
+
+    CFbsBitmap* iBitmap;
+    CFbsBitmap* iMask;
+private:
+   
+    HBufC* iText;
+    };
+
+// CLASS DECLARATION
+
+/**
+*  
+*/
+class CCarouselWidget : public CXnExtRenderingPluginAdapter, 
+    public MAknPhysicsObserver
+    {
+
+public:  // Constructors and destructor
+        
+    /**
+    * Two-phased constructor.
+    */
+    static CCarouselWidget* NewL();
+    
+    /**
+    * Destructor.
+    */
+    virtual ~CCarouselWidget();
+
+public: // from base classes
+
+    /**
+    * From CCoeControl Handles key events.
+    * @since Series 60 3.1
+    * @param aKeyEvent Key event.
+    * @param aType Event type.
+    * @return Key response
+    */
+    TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent,
+        TEventCode aType );
+
+    /**
+    * From CCoeControl
+    */
+    void SetContainerWindowL( const CCoeControl &aContainer );
+
+    /**
+    * See CCoeControl documentation
+    */
+    void HandlePointerEventL( const TPointerEvent& aPointerEvent );
+
+    /**
+    * From CCoeControl, CountComponentControls
+    * @return Number of component controls
+    */
+    TInt CountComponentControls() const;
+
+    /**
+    * From CCoeControl, ComponentControl
+    * @param aIndex index of component control
+    * @return pointer to the specified control
+    */
+    CCoeControl* ComponentControl( TInt aIndex ) const;
+
+    /**
+    * Skin change notification.
+    * See CXnControlAdapter documentation
+    * @since Series 60 3.1
+    */
+    void SkinChanged();
+
+    /**
+    * See CXnControlAdapter documentation
+    */
+    void EnterPowerSaveModeL();
+
+    /**
+    * See CXnControlAdapter documentation
+    */
+    void ExitPowerSaveModeL();
+
+    // From MAknPhysicsObserver
+    /**
+     * Physics emulation has moved the view.
+     */
+    void ViewPositionChanged( const TPoint& aNewPosition, 
+                TBool aDrawNow, TUint aFlags );
+
+    /**
+     * Called when emulation ended.
+     */
+    void PhysicEmulationEnded();
+
+    /**
+     * Returns the observer view position.
+     *
+     * @return Physics observer view position.
+     */
+    TPoint ViewPosition() const;
+
+protected: // from base classes
+
+    /**
+    * From CCoeControl
+    * Called if focus changes
+    */
+    void FocusChanged( TDrawNow aDrawNow );
+
+    /**
+    * From CCoeControl
+    * Called if position or size changes
+    */
+    void SizeChanged();
+    
+    /**
+     * Sets the external event handler interface.
+     *
+     * @since Series 60 5.2
+     * @param aEventHandler Event handler interface.
+     */
+    void SetEventHandler( MXnExtEventHandler* aEventHandler );
+    
+    /**
+     * Routes the data stream for the external rendering plugin.
+     *
+     * @since Series 60 5.2
+     * @param aData Data stream.
+     * @param aType Type of the stream.
+     * @param aIndex Index of the data.
+     */
+    void SetDataL( const TDesC8& aData, const TDesC& aType, TInt aIndex );
+
+private: // from base classes
+
+    /**
+    * From CCoeControl, Draw
+    * See CCoeControl documentation
+    */
+    void Draw( const TRect& aRect ) const;
+
+public:
+
+    /**
+    * C++ default constructor.
+    */
+    CCarouselWidget();
+
+    /**
+    * By default Symbian 2nd phase constructor is private.
+    */
+    void ConstructL();
+    
+    TRect ViewPort() {return iViewPort; };
+
+private:
+    void InitPhysicEngineL();
+    
+    TInt ItemIndex( TPoint& aPoint );
+    
+    void LaunchItemL( TPoint& aPosition );
+    
+private: // Member data
+    /**
+     * Physics. 
+     * Own.
+     */
+    CAknPhysics*        iPhysics;
+    
+    MXnExtEventHandler* iEventHandler; // not own
+    
+    /**
+     * Pointer down start time.
+     */
+    TTime               iStartTime;
+
+    /**
+     * Start (pointer down) position.
+     */
+    TPoint              iStartPosition;
+    
+    /**
+     * Current pointer position.
+     */   
+    TPoint              iStylusPosition;
+    
+    /**
+     * Current view position.
+     */
+    TPoint              iCurrentPosition;
+    
+    /**
+     * Adjusted view position
+     */
+    TPoint iViewPosition;
+    
+    /**
+     * Visible area, i.e. area of the scollable control that is to be drawn.
+     */          
+    TRect                           iViewPort;
+    
+    RPointerArray<CCarouselItem>    iStripeItems;
+    
+    TBool                           iDrawHighlight;
+    };
+
+#endif      // _CCAROUSELWIDGET_H
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/renderer/rom/carouselwidget.iby	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2010 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:
+* IBY file for Carousel Widget
+*
+*/
+
+#ifndef CAROUSELWIDGET_IBY
+#define CAROUSELWIDGET_IBY
+
+ECOM_PLUGIN(carouselwidget.dll, carouselwidget.rsc)
+
+#endif // CAROUSELWIDGET_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/renderer/src/carouselwidget.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,443 @@
+/*
+ * Copyright (c) 2010 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:  Carousel widget for Symbian Homescreen
+ *
+ */
+
+#include <ecom/implementationproxy.h>
+#include <aknphysics.h>
+#include <gulicon.h>
+#include <AknIconUtils.h>
+#include <AknsDrawUtils.h>
+#include <xnexteventhandler.h>
+#include "carouselwidget.h"
+
+const TSize KIconSize(70,70);
+const TInt KItemPadding( 6 );
+
+_LIT( KLaunchByIndex, "LaunchByIndex(");
+
+template< class PtrT > inline PtrT* UnpackPtr( 
+    const TDesC8& aBuf )
+    {
+    TAny* result( NULL );
+    
+    if ( aBuf.Size() == sizeof( TAny* ) )
+        {
+        // Effectively writes aBuf contents to result
+        TPckg< TAny* >( result ).Copy( aBuf ); 
+        }
+        
+    return static_cast< PtrT* >( result );
+    }
+// ============================ MEMBER FUNCTIONS ===============================
+CCarouselItem::CCarouselItem( CFbsBitmap* aBitmap, CFbsBitmap* aMask)
+    :iBitmap( aBitmap ), iMask( aMask )
+    {
+    }
+
+CCarouselItem::~CCarouselItem()
+    {
+    delete iBitmap;
+    delete iMask;
+    delete iText;
+    }
+
+void CCarouselItem::SetTextL( const TDesC& aText )
+    {
+    delete iText;
+    iText = NULL;
+    iText = aText.AllocL();    
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// Symbian static 1st phase constructor
+// -----------------------------------------------------------------------------
+//
+CCarouselWidget* CCarouselWidget::NewL()
+    {
+    CCarouselWidget* self = new( ELeave ) CCarouselWidget();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// C++ destructor
+// -----------------------------------------------------------------------------
+//
+CCarouselWidget::~CCarouselWidget()
+    {
+    delete iPhysics;
+    iStripeItems.ResetAndDestroy();
+    //delete iCover;
+    }
+
+// -----------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCarouselWidget::ConstructL()
+    {
+    
+    }
+
+// -----------------------------------------------------------------------------
+// Handles key events.
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CCarouselWidget::OfferKeyEventL( const TKeyEvent& /*aKeyEvent*/,
+    TEventCode /*aType*/ )
+    {
+    return EKeyWasConsumed;
+    }
+
+// -----------------------------------------------------------------------------
+// Set window for this control
+// -----------------------------------------------------------------------------
+//
+void CCarouselWidget::SetContainerWindowL( const CCoeControl &aContainer )
+    {
+    CCoeControl::SetContainerWindowL( aContainer );
+    }
+
+// -----------------------------------------------------------------------------
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCarouselWidget::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+    if( !iPhysics )
+        {
+        return;
+        }
+    TPoint stylusPos( aPointerEvent.iPosition );   
+    switch( aPointerEvent.iType )
+        {
+        case TPointerEvent::EButton1Down:
+            {
+            iPhysics->StopPhysics();
+            iPhysics->ResetFriction();
+            iStartPosition = stylusPos;
+            iStartTime.HomeTime();
+            iStylusPosition = stylusPos;
+            iDrawHighlight = ETrue;
+            }
+            break; 
+            
+        case TPointerEvent::EButton1Up:
+            {
+            iDrawHighlight = EFalse;
+            TInt distance = iStartPosition.iX - stylusPos.iX;
+            if( Abs(distance) <= iPhysics->DragThreshold() )
+                {
+                LaunchItemL( stylusPos );
+                }
+            else
+                {
+                TPoint drag( distance, 0 );
+                iPhysics->StartPhysics( drag, iStartTime );
+                }            }
+            break; 
+        case TPointerEvent::EDrag:
+        case TPointerEvent::EMove:
+            {
+            TPoint dragTh(  iStartPosition - stylusPos );
+            if( Abs(dragTh.iX) > iPhysics->DragThreshold() || 
+                Abs(dragTh.iY) > iPhysics->DragThreshold())
+                {
+                iDrawHighlight = EFalse;
+                }
+            TInt deltaX( iStylusPosition.iX - stylusPos.iX );
+            iStylusPosition = stylusPos;
+            TPoint deltaPoint( deltaX, 0 );
+            iPhysics->RegisterPanningPosition( deltaPoint );
+            }
+            break;
+        default:                
+            break;                
+        }
+
+    CCoeControl::HandlePointerEventL( aPointerEvent );
+    }
+
+// -----------------------------------------------------------------------------
+// Returns the number of component controls
+// -----------------------------------------------------------------------------
+//
+TInt CCarouselWidget::CountComponentControls() const
+    {
+    return 0;
+    }    
+
+// -----------------------------------------------------------------------------
+// Returns the specified control
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CCarouselWidget::ComponentControl( TInt /*aIndex*/ ) const
+    {
+      return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// Skin change notification.
+// -----------------------------------------------------------------------------
+//
+void CCarouselWidget::SkinChanged()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCarouselWidget::EnterPowerSaveModeL
+//
+// -----------------------------------------------------------------------------
+//
+void CCarouselWidget::EnterPowerSaveModeL()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCarouselWidget::ExitPowerSaveModeL
+//
+// -----------------------------------------------------------------------------
+//
+void CCarouselWidget::ExitPowerSaveModeL()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// Called if focus changes
+// -----------------------------------------------------------------------------
+//
+void CCarouselWidget::FocusChanged( TDrawNow /*aDrawNow*/ )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// Called if position or size changes
+// -----------------------------------------------------------------------------
+//
+void CCarouselWidget::SizeChanged()
+    {
+    iViewPort = Rect();
+    TRAP_IGNORE( InitPhysicEngineL() );
+    DrawNow();
+    }
+
+// -----------------------------------------------------------------------------
+// Sets the external event handler interface.
+// -----------------------------------------------------------------------------
+//
+void CCarouselWidget::SetEventHandler( MXnExtEventHandler* aEventHandler )
+    {
+    iEventHandler = aEventHandler;
+    }
+
+// -----------------------------------------------------------------------------
+// Data stream from the publisher
+// -----------------------------------------------------------------------------
+//
+void CCarouselWidget::SetDataL( const TDesC8& aData, const TDesC& aType, TInt aIndex )
+    {
+    /// Unpack the data stream, works because publisher is in same process.
+    CGulIcon* icon( UnpackPtr<CGulIcon>( aData ) );
+    CleanupStack::PushL( icon );
+    AknIconUtils::SetSize( icon->Bitmap(), KIconSize);
+    
+    CCarouselItem* item = new ( ELeave ) CCarouselItem(/* *iEditor,*/ icon->Bitmap(), icon->Mask() );
+    CleanupStack::PopAndDestroy( icon );
+    
+    if( aType == _L("Appstripe/widget"))
+        {
+        if( iStripeItems.Count() <= aIndex )
+            {
+            iStripeItems.AppendL( item );
+            InitPhysicEngineL();
+            }
+        else
+            {
+            CCarouselItem* citem = iStripeItems[ aIndex ];
+            delete citem;
+            iStripeItems.Remove( aIndex );
+            iStripeItems.Insert( item, aIndex );
+            }
+        DrawNow();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Draws the carousel component
+// -----------------------------------------------------------------------------
+//
+void CCarouselWidget::Draw( const TRect& /*aRect*/ ) const
+    {
+    CWindowGc& gc( SystemGc() );
+    gc.SetClippingRect( iViewPort );    
+    TRect bitmapRect( TPoint(0,0), KIconSize );
+    TPoint point( iViewPort.iTl );
+    point.iX -= iViewPosition.iX;
+    
+    TInt count = iStripeItems.Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        CFbsBitmap* bitmap = iStripeItems[i]->iBitmap;
+        CFbsBitmap* mask = iStripeItems[i]->iMask;
+
+        TRect drawRect( point, KIconSize );
+        if( iDrawHighlight && drawRect.Contains( iStylusPosition ))
+            {
+            TRect innerRect( drawRect );
+            innerRect.Shrink( 5, 5 );
+            
+            MAknsSkinInstance* skin( AknsUtils::SkinInstance() );
+            AknsDrawUtils::DrawFrame( skin, gc, drawRect, innerRect,
+                KAknsIIDQsnFrHomePressed, KAknsIIDDefault );
+            }
+        if( iViewPort.Contains( drawRect.iBr )||
+            iViewPort.Contains( drawRect.iTl ))
+            {
+            gc.BitBltMasked( point, bitmap, bitmapRect, mask, EFalse);
+            }
+        point.iX += KIconSize.iWidth + KItemPadding;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// ViewPositionChanged
+// ---------------------------------------------------------------------------
+//
+void CCarouselWidget::ViewPositionChanged( 
+    const TPoint& aNewPosition, TBool aDrawNow, TUint /*aFlags*/ )
+    {
+    iCurrentPosition = aNewPosition;
+    iViewPosition.iX = aNewPosition.iX - iViewPort.Width()/2;
+    if( aDrawNow )
+        {
+        DrawNow( iViewPort );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// PhysicEmulationEnded
+// ---------------------------------------------------------------------------
+//    
+void CCarouselWidget::PhysicEmulationEnded()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// ViewPosition
+// ---------------------------------------------------------------------------
+//    
+TPoint CCarouselWidget::ViewPosition() const
+    {
+    return iCurrentPosition;
+    }
+
+// ---------------------------------------------------------------------------
+// InitPhysicEngineL
+// ---------------------------------------------------------------------------
+//    
+void CCarouselWidget::InitPhysicEngineL()
+    {
+    // Init physic engine
+    if ( !iPhysics && CAknPhysics::FeatureEnabled() )
+        {
+        iPhysics = CAknPhysics::NewL( *this, this );
+        }
+    if( !iPhysics )
+        {
+        return;
+        }
+    TSize viewPortSize = iViewPort.Size();
+    TInt totalWidth( iStripeItems.Count() * (KIconSize.iWidth + KItemPadding ));
+    TSize totalSize( totalWidth, viewPortSize.iHeight );
+    iPhysics->InitPhysicsL( totalSize, viewPortSize, ETrue );
+    iCurrentPosition = TPoint( viewPortSize.iWidth / 2, viewPortSize.iHeight / 2 );
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CCarouselWidget::ItemIndex( TPoint& aPoint )
+    {
+    TPoint itemStartPoint( iViewPort.iTl );
+    itemStartPoint.iX -= iViewPosition.iX;
+    
+    TRect dropRect( itemStartPoint, KIconSize );
+    dropRect.Resize( KItemPadding, 0 );
+    TInt index( 0 );
+    do
+        {
+        if( dropRect.Contains( aPoint ))
+            {
+            return index;
+            }
+        dropRect.Move( KIconSize.iWidth+KItemPadding, 0);
+        index++;
+        }
+    while( index < iStripeItems.Count() );
+    return KErrNotFound;
+    }
+
+// -----------------------------------------------------------------------------
+// Launches the item, which is in aPosition
+// -----------------------------------------------------------------------------
+//
+void CCarouselWidget::LaunchItemL( TPoint& aPosition )
+    {
+    TInt index = ItemIndex( aPosition );
+    // carousel plugin expects indexes to start from 1
+    index++;
+    TInt len( KLaunchByIndex().Length()+3 );
+    TBuf<17> event;
+    event.Append( KLaunchByIndex );
+    event.AppendNum( index );
+    event.Append( _L(")"));
+    iEventHandler->HandleEventL( event, _L8("Appstripe"));
+    }
+
+// -----------------------------------------------------------------------------
+// C++ default constructor
+// -----------------------------------------------------------------------------
+//
+CCarouselWidget::CCarouselWidget()
+    {
+    }
+
+// ============================ PUBLIC FUNCTIONS ===============================
+const TImplementationProxy KImplementationTable[] =
+    {
+#ifdef __EABI__
+    IMPLEMENTATION_PROXY_ENTRY( 0xEabba433, CCarouselWidget::NewL )
+#else
+    { { 0xEabba433 }, CCarouselWidget::NewL }
+#endif
+    };
+
+// -----------------------------------------------------------------------------
+// Returns the list of implementations provided by the plugin
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(
+    TInt& aTableCount )
+    {
+    aTableCount = sizeof( KImplementationTable ) / sizeof( TImplementationProxy );
+    return KImplementationTable;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/sis/carousel.pkg	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,33 @@
+; Installation file for carousel widget
+;
+;
+; UID is the dll's UID
+;
+#{"Carousel Shortcut"},(0xE001CB57),1,0,0
+
+
+;Localised Vendor name
+%{"HSExample"}
+
+;Unique Vendor name
+:"HSExample"
+
+;Supports Series 60 v 5.0
+[0x1028315F], 1, 0, 0, {"S60ProductID"}
+
+;Publisher plug-in
+"/epoc32/release/armv5/urel/carouselplugin.dll"       -"c:/sys/bin/carouselplugin.dll"
+"/epoc32/data/z/resource/plugins/carouselplugin.rsc"  -"c:/resource/plugins/carouselplugin.rsc"
+
+;Renderer plug-in
+"/epoc32/release/armv5/urel/carouselwidget.dll"       -"c:/sys/bin/carouselwidget.dll"
+"/epoc32/data/z/resource/plugins/carouselwidget.rsc"  -"c:/resource/plugins/carouselwidget.rsc"
+
+;Widget declaration
+"../widget/hsps/00/widgetconfiguration.xml"           - "c:/private/200159c0/import/2001f48a/101fb657/1725ad3d/1.0/widgetconfiguration.xml"
+"../widget/hsps/00/manifest.dat"                      - "c:/private/200159c0/import/2001f48a/101fb657/1725ad3d/1.0/manifest.dat"
+"/epoc32/data/z/private/200159c0/install/appstripe/xuikon/00/appstripe.o0000" - "c:/private/200159c0/import/2001f48a/101fb657/1725ad3d/1.0/00/appstripe.o0000"
+"../widget/xuikon/00/appstripe.dat"                   - "c:/private/200159c0/import/plugin_2001f48a_101fb657_1725ad3d_1.0.dat"
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/widget/group/bld.inf	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,60 @@
+/*
+* Copyright (c) 2009 - 2010 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: Editor for carousel widget.
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+// Support for productization and Carbide.Ui customization
+//********************************************************
+../hsps/00/manifest.dat /epoc32/data/Z/resource/homescreen/appstripe/hsps/manifest.dat
+../hsps/00/widgetconfiguration.xml /epoc32/data/Z/resource/homescreen/appstripe/hsps/widgetconfiguration.xml
+../xuikon/00/appstripe.dat /epoc32/data/Z/resource/homescreen/appstripe/xuikon/appstripe.dat
+../xuikon/00/appstripe.css /epoc32/data/Z/resource/homescreen/appstripe/xuikon/appstripe.css
+../xuikon/00/appstripe.xml /epoc32/data/Z/resource/homescreen/appstripe/xuikon/appstripe.xml
+//../xuikon/00/appstripe.dtd /epoc32/data/Z/resource/homescreen/appstripe/xuikon/appstripe.dtd
+
+// Support for S60 builds
+//***********************
+// export iby files
+../rom/appstripe_resources.iby LANGUAGE_MW_LAYER_IBY_EXPORT_PATH(appstripe_resources.iby)
+../rom/appstripe_customer.iby CUSTOMER_MW_LAYER_IBY_EXPORT_PATH(appstripe_customer.iby)
+../rom/appstripe_variant.iby CUSTOMER_MW_LAYER_IBY_EXPORT_PATH(appstripe_variant.iby)
+../rom/appstripe.iby CORE_MW_LAYER_IBY_EXPORT_PATH(appstripe.iby)
+
+
+// Dtd-localization
+//*****************
+PRJ_EXTENSIONS
+START EXTENSION tools/dtd
+OPTION SWITCH_LOC_FILE_NAME appstripe
+OPTION DTD_TYPE widget
+END
+
+PRJ_MMPFILES
+
+// build icons
+
+// build application
+
+PRJ_TESTMMPFILES
+
+//#endif
+
+//  End of File  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/widget/hsps/00/manifest.dat	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<package version="2.0">
+
+  <family>qhd_tch</family>
+
+  <type>widget</type>
+
+  <!-- interface uid -->
+	<interfaceuid>0x2001f48a</interfaceuid>
+
+	<!-- vendor uid  -->
+	<provideruid>0x101fb657</provideruid>
+
+	<!-- uid -->
+	<configurationuid>0x1725ad3d</configurationuid>
+	
+	<!-- description -->
+	<fullname>App Stripe</fullname>
+	<shortname>appstripe</shortname>
+	<version>1.0</version>
+
+	<!-- configuration -->
+	<filexml>widgetconfiguration.xml</filexml>
+
+ 	<!-- Locale specific resources -->
+	<localization>
+        	<fileresource>appstripe.o0000</fileresource>
+	</localization> 
+	
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/widget/hsps/00/widgetconfiguration.xml	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,63 @@
+<configuration>
+    <control>
+    <settings>
+      <!-- Shortcut #1, Phonebook -->
+      <item id="first" name="Shortcut1" >
+        <property  name="type" value="application"/>
+        <property  name="uid" value="0x101F4CCE"/>
+        <property  name="view" value=""/>
+        <property  name="param" value=""/>
+      </item>
+      <!-- Shortcut #2, Messaging -->
+      <item id="second" name="Shortcut2" >
+        <property  name="type" value="application"/>
+        <property  name="uid" value="0x100058C5"/>
+        <property  name="view" value=""/>
+        <property  name="param" value=""/>
+      </item>
+      <!-- Shortcut #3, Browser -->
+      <item id="third" name="Shortcut3" >
+        <property  name="type" value="application"/>
+        <property  name="uid" value="0x10008D39"/>
+        <property  name="view" value=""/>
+        <property  name="param" value=""/>
+      </item>
+      <!-- Shortcut #4, Photos -->
+      <item id="fourth" name="Shortcut4" >
+        <property  name="type" value="application"/>
+        <property  name="uid" value="0x200009EE"/>
+        <property  name="view" value=""/>
+        <property  name="param" value=""/>
+      </item>
+      <!-- Shortcut #5 -->
+      <item id="fifth" name="Shortcut5" >
+        <property  name="type" value="application"/>
+        <property  name="uid" value="0x200009EE"/>
+        <property  name="view" value=""/>
+        <property  name="param" value=""/>
+      </item>
+      <!-- Shortcut #6 -->
+      <item id="sixth" name="Shortcut6" >
+        <property  name="type" value="application"/>
+        <property  name="uid" value="0x200009EE"/>
+        <property  name="view" value=""/>
+        <property  name="param" value=""/>
+      </item>
+      <!-- Shortcut #7 -->
+      <item id="seventh" name="Shortcut7" >
+        <property  name="type" value="application"/>
+        <property  name="uid" value="0x200009EE"/>
+        <property  name="view" value=""/>
+        <property  name="param" value=""/>
+      </item>
+      <!-- Shortcut #8 -->
+      <item id="eigth" name="Shortcut8" >
+        <property  name="type" value="application"/>
+        <property  name="uid" value="0x200009EE"/>
+        <property  name="view" value=""/>
+        <property  name="param" value=""/>
+      </item>
+     
+    </settings>
+    </control>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/widget/rom/appstripe.iby	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#ifndef __APPSTRIPE_IBY__
+#define __APPSTRIPE_IBY__
+
+// Enabled by DTD-localization tools
+data=ZPRIVATE\200159c0\install\appstripe\hsps\00\manifest.dat \private\200159c0\install\appstripe\hsps\00\manifest.dat
+data=ZPRIVATE\200159c0\install\appstripe\xuikon\00\appstripe.o0000 \private\200159c0\install\appstripe\xuikon\00\appstripe.o0000
+
+#endif  // __APPSTRIPE_IBY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/widget/rom/appstripe_customer.iby	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,21 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#ifndef __APPSTRIPE_CUSTOMER_IBY__
+#define __APPSTRIPE_CUSTOMER_IBY__
+
+#endif  // __APPSTRIPE_CUSTOMER_IBY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/widget/rom/appstripe_resources.iby	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#ifndef __APPSTRIPE_RESOURCES_IBY__
+#define __APPSTRIPE_RESOURCES_IBY__
+
+// Enabled by DTD-localization tools, language specific
+
+#endif  // __APPSTRIPE_RESOURCES_IBY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/widget/rom/appstripe_variant.iby	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,24 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#ifndef __APPSTRIPE_VARIANT_IBY__
+#define __APPSTRIPE_VARIANT_IBY__
+
+// Enabled by variation tools, variant specific
+data=ZPRIVATE\200159c0\install\appstripe\hsps\00\widgetconfiguration.xml \private\200159c0\install\appstripe\hsps\00\widgetconfiguration.xml
+
+#endif  // __APPSTRIPE_VARIANT_IBY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/widget/xuikon/00/appstripe.css	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,10 @@
+widget
+{
+	width:auto;
+	height:auto;
+	padding-top: 5px;
+  padding-bottom: 5px;
+  padding-left: 3px;
+  background-color: none;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/widget/xuikon/00/appstripe.dat	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<data>
+    <AppUid>2001CB4F</AppUid>
+    <Provideruid>101FB657</Provideruid>
+    <ThemeUid>11001240</ThemeUid>
+    <ThemeFullName>AppStripeWidget</ThemeFullName>
+    <ThemeShortName>appstripe</ThemeShortName>
+    <ThemeVersion>1.0</ThemeVersion>
+    <FileXML>appstripe.xml</FileXML>
+    <FileCSS>appstripe.css</FileCSS>
+</data>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/carouselwidgetexample/widget/xuikon/00/appstripe.xml	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- <!DOCTYPE xmluiml SYSTEM "AI3_Demo.dtd"> -->
+<xmluiml xmlns="http://www.series60.com/xml/xmluiml/1" version="1.0">   
+    <widget _s60-swipe-destination="none">
+
+        <!-- Data plugin(s) in this widget -->
+        <contentsource id="Appstripe" name="Appstripe" value="0xE001CB58"/>
+
+        <carousel id="Carousel" focusable="true" _s60-focus-appearance="none" _s60-initial-focus="1">
+          <data id="stripe">
+            <property class="Appstripe/widget"/>
+          </data>
+        </carousel>
+
+    <menuextension>
+      <menuitem target="hs_widget_menuitem_settings">
+        <actions>
+          <action>
+            <trigger name="activate"/>
+            <event name="Appstripe/ShowSettings"/>
+          </action>
+        </actions>
+      </menuitem>
+    </menuextension>
+    </widget>
+</xmluiml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/data/hscontentcontrolexample.l01	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+// localized strings for language: UK English (01)
+#define STR_HsContentControlApplication_1 ""
+#define STR_HsContentControlApplication_2 ""
+#define STR_HsContentControlApplication_3 ""
+#define STR_HsContentControlApplication_4 "HS Content Control"
+#define STR_HsContentControlApplication_5 "HS Content Control"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/data/hscontentcontrolexample.loc	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,20 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+#ifdef LANGUAGE_01
+#include "hscontentcontrolexample.l01"
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/data/hscontentcontrolexample.rss	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,107 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+NAME HSCO
+
+#include <eikon.rh>
+#include <avkon.rsg>
+#include <avkon.rh>
+#include <appinfo.rh>
+#include "hscontentcontrolexample.loc"
+
+RESOURCE RSS_SIGNATURE
+    {
+    }
+
+RESOURCE TBUF
+    {
+    buf = "HsContentControl";
+    }
+
+RESOURCE EIK_APP_INFO r_application_hs_content_control_app_ui
+    {
+    cba = R_AVKON_SOFTKEYS_EXIT;
+    status_pane = r_application_status_pane;
+    menubar = r_application_options_menu;
+    }
+
+RESOURCE STATUS_PANE_APP_MODEL r_application_status_pane
+    {
+    panes =
+        {
+        SPANE_PANE
+            {
+            id = EEikStatusPaneUidNavi;
+            type = EAknCtNaviPane;
+            resource = r_navi_decorator;
+            }
+
+        };
+    }
+
+RESOURCE NAVI_DECORATOR r_navi_decorator
+    {
+    type = ENaviDecoratorControlTabGroup;
+
+    control = TAB_GROUP
+        {
+        tab_width = EAknTabWidthWithOneTab;
+
+        active = 0;
+
+        tabs = 
+            {
+            TAB
+                {
+                id = 0;
+                txt = "Active configuration";
+                },
+            TAB
+                {
+                id = 1;
+                txt = "Configurations";
+                },
+            TAB
+                {
+                id = 2;
+                txt = "Views";
+                },
+            TAB
+                {
+                id = 3;
+                txt = "Widgets";
+                }                
+            };
+
+        };
+    }
+
+
+RESOURCE MENU_BAR r_application_options_menu
+    {
+    }
+
+RESOURCE LOCALISABLE_APP_INFO r_localisable_app_info
+    {
+    short_caption = STR_HsContentControlApplication_5;
+    caption_and_icon = CAPTION_AND_ICON_INFO
+        {
+        caption = STR_HsContentControlApplication_4;
+        number_of_icons = 0;
+        };
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/data/hscontentcontrolexample_reg.loc	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+//  LOCALISATION STRINGS
+
+// Caption string for app.
+#define qtn_caption_string "hscontentcontrolexample"
+
+// Short caption string for app.
+#define qtn_short_caption_string "HW"
+
+#define qtn_loc_resource_file_1 "\\resource\\apps\\hscontentcontrolexample"
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/data/hscontentcontrolexample_reg.rss	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+#include <eikon.rh>
+#include <avkon.rsg>
+#include <avkon.rh>
+#include <appinfo.rh>
+#include "hscontentcontrolexample_reg.loc"
+#include <hscontentcontrolexample.rsg>
+
+UID2 KUidAppRegistrationResourceFile
+UID3 0xE88D7143
+
+RESOURCE APP_REGISTRATION_INFO
+	{
+	app_file="hscontentcontrolexample";
+	localisable_resource_file =  qtn_loc_resource_file_1;
+	localisable_resource_id = R_LOCALISABLE_APP_INFO;
+
+	embeddability=KAppNotEmbeddable;
+	newfile=KAppDoesNotSupportNewFile;
+	}
+
Binary file idlehomescreen/examples/hscontentcontrolexample/gfx/list_icon.bmp has changed
Binary file idlehomescreen/examples/hscontentcontrolexample/gfx/list_icon_mask.bmp has changed
Binary file idlehomescreen/examples/hscontentcontrolexample/gfx/mark_icon.bmp has changed
Binary file idlehomescreen/examples/hscontentcontrolexample/gfx/mark_icon_mask.bmp has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/gfx/qgn_menu_hscontentcontrolexample.svg	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%" viewBox="0 0 88 87.999">
+<g>
+<g>
+<g>
+<g>
+<rect fill="none" width="88" height="87.999"/>
+</g>
+</g>
+<g>
+<linearGradient id="XMLID_7_" gradientUnits="userSpaceOnUse" x1="12.3042" y1="18.3799" x2="63.4113" y2="79.287">
+<stop offset="0" style="stop-color:#B3DDFF"/>
+<stop offset="0.8146" style="stop-color:#084296"/>
+<stop offset="1" style="stop-color:#084296"/>
+</linearGradient>
+<path fill="url(#XMLID_7_)" d="M32.135,7.415L14.363,17.432v23.167c0,0,8.926,15.351,10.468,18.001       c-2.386,1.704-15.44,11.03-15.44,11.03l21.613,12.652c0,0,12.907-9.85,14.71-11.226c1.979,1.109,16.231,9.101,16.231,9.101       l16.664-15.132c0,0-14.066-6.929-16.888-8.318c1.467-3.01,10.531-21.604,10.531-21.604l-22.298-9.59       c0,0-1.486,3.173-2.093,4.467c-2.046-0.88-6.573-2.826-6.573-2.826s-3.713,2.463-5.696,3.778       c-0.327-0.744-0.542-1.233-0.657-1.495c0.007-0.824,0.213-23.72,0.213-23.72L32.135,7.415z"/>
+<linearGradient id="XMLID_8_" gradientUnits="userSpaceOnUse" x1="40.8276" y1="52.1914" x2="16.1997" y2="21.1353">
+<stop offset="0" style="stop-color:#5AA7E0"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_8_)" points="59.051,57.621 69.536,36.111 50.944,28.115 48.852,32.581 41.493,29.418 34.719,33.911        32.932,29.849 33.117,9.157 16.363,18.601 16.363,40.06 27.476,59.169 13.064,69.463 30.856,79.879 45.546,68.669        61.667,77.708 75.089,65.521 "/>
+<linearGradient id="XMLID_9_" gradientUnits="userSpaceOnUse" x1="60.585" y1="31.876" x2="53.8582" y2="45.1125">
+<stop offset="0" style="stop-color:#5AA7E0"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_9_)" points="41.26,48.783 50.944,28.115 69.536,36.111 59.051,57.621 "/>
+<polygon fill="#0046B7" points="16.363,40.06 27.476,59.169 41.26,48.783 32.932,29.849 "/>
+<polygon fill="#3366CC" points="16.363,40.06 16.363,18.601 33.117,9.157 32.932,29.849 "/>
+<polygon fill="#CFECFF" points="26.696,39.23 41.493,29.418 59.523,37.168 45.546,47.954 "/>
+<path fill="#5AA7E0" d="M41.954,55.286"/>
+<polygon fill="#3366CC" points="26.696,39.23 27.476,59.169 45.546,68.669 45.546,47.954 "/>
+<polygon fill="#5AA7E0" points="13.064,69.463 27.476,59.169 45.546,68.669 30.856,79.879 "/>
+<linearGradient id="XMLID_10_" gradientUnits="userSpaceOnUse" x1="29.2085" y1="63.6836" x2="48.7102" y2="56.1976">
+<stop offset="0" style="stop-color:#5AA7E0"/>
+<stop offset="0.0056" style="stop-color:#5AA7E0"/>
+<stop offset="0.85" style="stop-color:#3366CC"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_10_)" points="43.423,46.971 27.476,59.169 45.546,68.669 45.546,47.954 "/>
+<polygon fill="#0046B7" points="45.546,47.954 45.546,68.669 59.051,57.621 59.523,37.168 "/>
+<linearGradient id="XMLID_11_" gradientUnits="userSpaceOnUse" x1="45.3936" y1="59.5186" x2="59.0508" y2="59.5186">
+<stop offset="0" style="stop-color:#0046B7"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_11_)" points="45.394,50.368 45.546,68.669 59.051,57.621 "/>
+<linearGradient id="XMLID_12_" gradientUnits="userSpaceOnUse" x1="60.8945" y1="68.6807" x2="57.2953" y2="58.792">
+<stop offset="0" style="stop-color:#5AA7E0"/>
+<stop offset="0.4101" style="stop-color:#5AA7E0"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_12_)" points="61.667,77.708 45.546,68.669 59.051,57.621 75.089,65.521 "/>
+</g>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/group/Icons_aif_scalable_dc.mk	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,83 @@
+#
+# Copyright (c) 2010 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:  Content Control example
+#
+#
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\Z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+
+# ----------------------------------------------------------------------------
+# TODO: Configure these
+# ----------------------------------------------------------------------------
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\hscontentcontrolexample_aif.mif
+HEADERDIR=$(EPOCROOT)epoc32\include
+HEADERFILENAME=$(HEADERDIR)\hscontentcontrolexample_aif.mbg
+
+ICONDIR=..\gfx
+
+do_nothing :
+	@rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN :
+	@echo ...Deleting $(ICONTARGETFILENAME)
+	del /q /f $(ICONTARGETFILENAME)
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+# ----------------------------------------------------------------------------
+# TODO: Configure these.
+#
+# NOTE 1: DO NOT DEFINE MASK FILE NAMES! They are included automatically by
+# MifConv if the mask detph is defined.
+#
+# NOTE 2: Usually, source paths should not be included in the bitmap
+# definitions. MifConv searches for the icons in all icon directories in a
+# predefined order, which is currently \s60\icons, \s60\bitmaps2.
+# The directory \s60\icons is included in the search only if the feature flag
+# __SCALABLE_ICONS is defined.
+# ----------------------------------------------------------------------------
+# NOTE: if you have JUSTINTIME enabled for your S60 3rd FP1 or newer SDK
+# and this command crashes, consider adding "/X" to the command line.
+# See <http://forum.nokia.com/document/Forum_Nokia_Technical_Library_v1_35/contents/FNTL/Build_process_fails_at_mif_file_creation_in_S60_3rd_Ed_FP1_SDK.htm>
+# ----------------------------------------------------------------------------
+
+RESOURCE : $(ICONTARGETFILENAME)
+
+$(ICONTARGETFILENAME) : $(ICONDIR)\qgn_menu_hscontentcontrolexample.svg
+	mifconv $(ICONTARGETFILENAME) \
+		/H$(HEADERFILENAME) \
+		/c32,8 $(ICONDIR)\qgn_menu_hscontentcontrolexample.svg
+		
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/group/bld.inf	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+PRJ_PLATFORMS
+WINSCW ARMV5 GCCE
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+
+gnumakefile icons_aif_scalable_dc.mk
+
+hscontentcontrolexample.mmp
+
+#include "../root/group/bld.inf"
+
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/group/hscontentcontrolexample.mmp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,71 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+APP_LAYER_SYSTEMINCLUDE
+TARGET			hscontentcontrolexample.exe
+UID			   0x100039CE 0xE88D7143
+VENDORID	  	  0
+TARGETTYPE		exe
+EPOCSTACKSIZE	 0x5000
+
+CAPABILITY    WriteDeviceData ReadDeviceData
+
+SYSTEMINCLUDE /epoc32/include /epoc32/include/variant /epoc32/include/ecom
+USERINCLUDE	   ../inc ../data
+
+SOURCEPATH		../data
+START RESOURCE	hscontentcontrolexample.rss
+HEADER
+TARGETPATH resource/apps
+END //RESOURCE
+
+START RESOURCE	hscontentcontrolexample_reg.rss
+TARGETPATH 	  /private/10003a3f/apps
+END //RESOURCE
+
+LIBRARY			euser.lib apparc.lib cone.lib eikcore.lib avkon.lib
+LIBRARY			commonengine.lib efsrv.lib estor.lib eikcoctl.lib eikdlg.lib 
+LIBRARY			eikctl.lib bafl.lib fbscli.lib aknnotify.lib aknicon.lib
+LIBRARY			etext.lib gdi.lib egul.lib insock.lib
+LIBRARY			ecom.lib InetProtUtil.lib http.lib esock.lib aknhlist.lib
+LIBRARY         aknskins.lib   
+LIBRARY         hsccapiclient.lib
+LIBRARY         hscontentinfo.lib
+
+LANG 				01
+
+START BITMAP	hscontentcontrolexample.mbm
+HEADER
+TARGETPATH		/resource/apps
+SOURCEPATH		../gfx
+SOURCE	c12,1	list_icon.bmp list_icon_mask.bmp
+END
+
+SOURCEPATH		../src
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
+
+SOURCE          HsContentControlListBox.cpp 
+SOURCE          HsContentControlApplication.cpp 
+SOURCE          HsContentControlAppUi.cpp 
+SOURCE          HsContentControlDocument.cpp
+
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/inc/HsContentControlAppUi.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,72 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+
+#ifndef HSCONTENTCONTROLAPPUI_H
+#define HSCONTENTCONTROLAPPUI_H
+
+// [[[ begin generated region: do not modify [Generated Includes]
+#include <aknappui.h>
+#include <eikmenub.h>
+// ]]] end generated region [Generated Includes]
+
+// [[[ begin generated region: do not modify [Generated Forward Declarations]
+class CHsContentControlListBox;
+// ]]] end generated region [Generated Forward Declarations]
+
+/**
+ * @class    CHsContentControlAppUi HsContentControlAppUi.h
+ * @brief The AppUi class handles application-wide aspects of the user interface, including
+ *        container management and the default menu, control pane, and status pane.
+ */
+class CHsContentControlAppUi : public CAknAppUi
+    {
+public: 
+    // constructor and destructor
+    CHsContentControlAppUi();
+    void ConstructL();
+    virtual ~CHsContentControlAppUi();
+
+public: 
+    // from CEikAppUi
+    void HandleCommandL( TInt aCommand );
+    void HandleResourceChangeL( TInt aType );    
+    
+private:
+    void InitializeContainersL();
+    // [[[ begin generated region: do not modify [Generated Methods]
+public: 
+    // ]]] end generated region [Generated Methods]
+    
+    // [[[ begin generated region: do not modify [Generated Instance Variables]
+private: 
+    CHsContentControlListBox* iHsContentControlListBox;
+    // ]]] end generated region [Generated Instance Variables]
+    
+    
+    // [[[ begin [Overridden Methods]
+protected: 
+    // ]]] end [Overridden Methods]
+    
+    
+    // [[[ begin [User Handlers]
+protected: 
+    // ]]] end [User Handlers]
+    
+    };
+
+#endif // HSCONTENTCONTROLAPPUI_H            
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/inc/HsContentControlApplication.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+
+#ifndef HSCONTENTCONTROLAPPLICATION_H
+#define HSCONTENTCONTROLAPPLICATION_H
+
+// [[[ begin generated region: do not modify [Generated Includes]
+#include <aknapp.h>
+// ]]] end generated region [Generated Includes]
+
+// [[[ begin generated region: do not modify [Generated Constants]
+const TUid KUidHsContentControlApplication = { 0xE88D7143 };
+// ]]] end generated region [Generated Constants]
+
+/**
+ *
+ * @class    CHsContentControlApplication HsContentControlApplication.h
+ * @brief    A CAknApplication-derived class is required by the S60 application 
+ *          framework. It is subclassed to create the application's document 
+ *          object.
+ */
+class CHsContentControlApplication : public CAknApplication
+    {
+private:
+    TUid AppDllUid() const;
+    CApaDocument* CreateDocumentL();
+    
+    };
+            
+#endif // HSCONTENTCONTROLAPPLICATION_H        
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/inc/HsContentControlDocument.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+
+#ifndef HSCONTENTCONTROLDOCUMENT_H
+#define HSCONTENTCONTROLDOCUMENT_H
+
+#include <akndoc.h>
+        
+class CEikAppUi;
+
+/**
+* @class    CHsContentControlDocument HsContentControlDocument.h
+* @brief    A CAknDocument-derived class is required by the S60 application 
+*           framework. It is responsible for creating the AppUi object. 
+*/
+class CHsContentControlDocument : public CAknDocument
+    {
+public: 
+    // constructor
+    static CHsContentControlDocument* NewL( CEikApplication& aApp );
+
+private: 
+    // constructors
+    CHsContentControlDocument( CEikApplication& aApp );
+    void ConstructL();
+    
+public: 
+    // from base class CEikDocument
+    CEikAppUi* CreateAppUiL();
+    };
+#endif // HSCONTENTCONTROLDOCUMENT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/inc/HsContentControlListBox.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,206 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+
+#ifndef __HSCONTENTCONTROLLISTBOX_H__
+#define __HSCONTENTCONTROLLISTBOX_H__
+
+//  Includes
+#include <coecntrl.h>        
+#include <akntreelistobserver.h>
+#include <AknTabObserver.h>
+#include <hscontentcontrol.h>
+
+//  Forward declarations
+class MEikCommandObserver;        
+class CAknSingleStyleTreeList;
+class CAknsBasicBackgroundControlContext;
+class CAknNavigationDecorator;
+class CAknTabGroup;
+class CAknStylusPopUpMenu;
+class CHsCcApiClient;
+class CHsContentInfoArray;
+
+/**
+ * Container class for HsContentControlListBox
+ * 
+ * @class    CHsContentControlListBox HsContentControlListBox.h
+ */
+class CHsContentControlListBox : public CCoeControl,     
+    public MAknTreeListObserver,
+    public MAknTabObserver,
+    public MEikMenuObserver,
+    public MHsContentControl    
+    {
+public:
+    // constructors and destructor
+    
+    /**
+     * Two-phased constructor.
+     */    
+    static CHsContentControlListBox* NewL( 
+        const TRect& aRect, 
+        const CCoeControl* aParent, 
+        MEikCommandObserver* aCommandObserver );
+
+    /**
+     * Two-phased constructor.
+     */    
+    static CHsContentControlListBox* NewLC( 
+        const TRect& aRect, 
+        const CCoeControl* aParent, 
+        MEikCommandObserver* aCommandObserver );
+        
+    /**
+     * Destructor
+     */    
+    ~CHsContentControlListBox();
+
+public:
+    // from CCoeControl
+    
+    /**
+     * @see CCoeControl
+     */            
+    TInt CountComponentControls() const;
+
+    /**
+     * @see CCoeControl
+     */                
+    CCoeControl* ComponentControl( TInt aIndex ) const;
+    
+    /**
+     * @see CCoeControl
+     */                
+    TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ); 
+    
+    /**
+     * @see CCoeControl
+     */                
+    void HandleResourceChange( TInt aType );
+
+    /**
+     * @see CCoeControl
+     */                
+    void SizeChanged();
+
+    /**
+     * @see CCoeControl
+     */                
+    TTypeUid::Ptr MopSupplyObject( TTypeUid aId );
+            
+private:
+   // from MAknTreeListObserver
+
+    /**
+     * @see MAknTreeListObserver
+     */
+    TInt HandleTreeListEvent(       
+        CAknTreeList& aList,
+        TAknTreeItemID aItem,
+        TEvent aEvent );
+    
+private:    
+    // From MEikMenuObserver
+
+    /**
+     * @see MEikMenuObserver
+     */
+    void ProcessCommandL( TInt aCommandId );
+    
+    /**
+     * @see MEikMenuObserver
+     */
+    void SetEmphasis( CCoeControl* aMenuControl, TBool aEmphasis );
+    
+private:
+    // from MAknTabObserver
+    
+    /**
+     * @see MAknTabObserver
+     */    
+    void TabChangedL( TInt aIndex );
+    
+private:
+    // from MHsContentControl
+    
+    /**
+     * @see MHsContentControl
+     */
+    void NotifyWidgetListChanged();
+
+    /**
+     * @see MHsContentControl
+     */
+    void NotifyViewListChanged();
+
+    /**
+     * @see MHsContentControl
+     */
+    void NotifyAppListChanged();
+          
+private:
+    // new functions
+    
+    void InitializeControlsL();    
+    void LayoutControls();
+    void PopulateListL();
+
+    static TInt PopulateList( TAny* aAny );
+    
+private:
+    // constructors
+
+    /**
+     * C++ default constructor
+     */    
+    CHsContentControlListBox();
+
+    /** 
+     * 2nd phase constructor
+     */
+    void ConstructL( 
+        const TRect& aRect, 
+        const CCoeControl* aParent, 
+        MEikCommandObserver* aCommandObserver );
+    
+private:
+    // data
+
+    /** Homescreen content control client, owned */
+    CHsCcApiClient* iHsCcApiClient;    
+    /** Callback, owned */
+    CAsyncCallBack* iCallback;
+    /** Popup menu, owned */
+    CAknStylusPopUpMenu* iPopup;    
+    /** List box, owned */
+    CAknSingleStyleTreeList* iListBox;
+    /** Bg context, owned */
+    CAknsBasicBackgroundControlContext* iBgContext;
+    /** Content info array, owned */
+    CHsContentInfoArray* iArray;
+    /** Navigation decorator, owned */
+    CAknNavigationDecorator* iDecorator;
+    /** Tab group, not owned */
+    CAknTabGroup* iTabGroup;   
+    /** Selected tree item */
+    TAknTreeItemID iSelectedItem;    
+    /** Active tab index */
+    TInt iTabIndex;
+    };
+                
+#endif // __HSCONTENTCONTROLLISTBOX_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/root/group/bld.inf	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+// Support for productization and Carbide.Ui customization
+../hsps/00/manifest.dat /epoc32/data/Z/resource/homescreen/root2/hsps/manifest.dat
+../hsps/00/widgetconfiguration.xml /epoc32/data/Z/resource/homescreen/root2/hsps/widgetconfiguration.xml
+../xuikon/00/root2.dat /epoc32/data/Z/resource/homescreen/root2/xuikon/root2.dat
+../xuikon/00/root2.css /epoc32/data/Z/resource/homescreen/root2/xuikon/root2.css
+../xuikon/00/root2.xml /epoc32/data/Z/resource/homescreen/root2/xuikon/root2.xml
+//../xuikon/00/root2.dtd /epoc32/data/Z/resource/homescreen/root2/xuikon/root2.dtd
+
+
+PRJ_EXTENSIONS
+START EXTENSION tools/dtd
+OPTION SWITCH_LOC_FILE_NAME root2
+OPTION DTD_TYPE widget
+END
+//  End of File  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/root/hsps/00/manifest.dat	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<package version="2.0">
+    <family>qhd_tch</family>
+    <type>application</type>
+
+    <interfaceuid>0x102750F0</interfaceuid>
+    <provideruid>0x101fb657</provideruid>
+    <configurationuid>0x20102020</configurationuid>
+
+    <fullname>HS Configuration</fullname>
+    <shortname>root2</shortname>
+    <version>1.0</version>
+
+    <filexml>widgetconfiguration.xml</filexml>
+    <!-- Locale specific resources -->
+    <localization>
+        <fileresource tag="xuikon">root2.o0000</fileresource>
+    </localization>
+</package>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/root/hsps/00/widgetconfiguration.xml	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<configuration max_child="6" xmlns:xi="http://www.w3.org/2001/xinclude">
+    <control>
+        <plugins>
+            <plugin uid="0x2001f48b" locking_status="none"/>
+            <plugin uid="0x20026f50" locking_status="none"/>
+            <plugin uid="0x20026f50" locking_status="none"/>
+            <plugin uid="0x20026f50" locking_status="none"/>
+            <plugin uid="0x20026f50" locking_status="none"/>
+            <plugin uid="0x20026f50" locking_status="none"/>            
+        </plugins>
+        <settings/>
+    </control>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/root/sis/hs_configuration_urel.pkg	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,33 @@
+; Installation file for recentcallswidget dll
+;
+; This is an auto-generated PKG file by Carbide.
+; This file uses variables specific to Carbide builds that will not work
+; on command-line builds. If you want to use this generated PKG file from the
+; command-line tools you will need to modify the variables with the appropriate
+; values: $(EPOCROOT), $(PLATFORM), $(TARGET)
+
+;
+; UID is the dll's UID
+;
+#{"HS 6 pages configuration"},(0x20102020),1,0,0
+
+
+;Localised Vendor name
+%{"Nokia"}
+
+;Unique Vendor name
+:"Nokia"
+
+;Supports Series 60 v 5.0
+[0x1028315F], 0, 0, 0, {"S60ProductID"}
+
+
+"../hsps/00/widgetconfiguration.xml"                 - "c:/private/200159C0/import/102750F0/101FB657/20102020/1.0/widgetconfiguration.xml"
+"../hsps/00/manifest.dat"                            - "c:/private/200159C0/import/102750F0/101FB657/20102020/1.0/manifest.dat"
+
+"/epoc32/data/z/private/200159c0/install/root2/xuikon/00/root2.o0000" - "c:/private/200159C0/import/102750F0/101FB657/20102020/1.0/00/root2.o0000"
+
+"../xuikon/00/root2.dat"                       - "c:/private/200159C0/import/plugin_102750F0_101FB657_20102020_1.0.dat"
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/root/xuikon/00/root2.css	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,3 @@
+views 
+{
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/root/xuikon/00/root2.dat	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<data>
+    <!-- UIDs below are not used, deprecated functionality.-->
+    <AppUid>2001CB4F</AppUid>
+    <Provideruid>101FB657</Provideruid>
+    <ThemeUid>11001241</ThemeUid>
+    <ThemeFullName>Anything</ThemeFullName>
+    <ThemeShortName>root2</ThemeShortName>
+    <ThemeVersion>1.0</ThemeVersion>
+    <FileXML>root2.xml</FileXML>
+    <FileCSS>root2.css</FileCSS>
+</data>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/root/xuikon/00/root2.xml	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmluiml xmlns="http://www.series60.com/xml/xmluiml/1" version="1.0">
+    <views/>    
+</xmluiml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/sis/hscontentcontrolexample_urel.pkg	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,36 @@
+; hscontentcontrolexample.pkg
+; This is an auto-generated PKG file by Carbide.
+; This file uses variables specific to Carbide builds that will not work
+; on command-line builds. If you want to use this generated PKG file from the
+; command-line tools you will need to modify the variables with the appropriate
+; values: $(EPOCROOT), $(PLATFORM), $(TARGET)
+; Also, the resource file entries should be changed to match the language
+; used in the build. For example, if building for LANGUAGE_01, change the file
+; extensions .rsc to .r01.
+;
+;Language - standard language definitions
+&EN
+
+; standard SIS file header
+#{"HS ContentControl"},(0xE88D7143),1,0,0
+
+;Localised Vendor name
+%{"Vendor-EN"}
+
+;Unique Vendor name
+:"Vendor"
+
+;Supports Series 60 v 3.0
+[0x101F7961], 0, 0, 0, {"Series60ProductID"}
+
+;Files to install
+;You should change the source paths to match that of your environment
+;<source> <destination>
+"\epoc32\release\armv5\urel\hscontentcontrolexample.exe"		-"!:\sys\bin\hscontentcontrolexample.exe"
+"\epoc32\data\z\resource\apps\hscontentcontrolexample.r01"		-"!:\resource\apps\hscontentcontrolexample.r01"
+"\epoc32\data\z\private\10003a3f\apps\hscontentcontrolexample_reg.r01"	-"!:\private\10003a3f\import\apps\hscontentcontrolexample_reg.r01"
+"\epoc32\data\z\resource\apps\hscontentcontrolexample_aif.mif" -"!:\resource\apps\hscontentcontrolexample_aif.mif"
+"\epoc32\data\z\resource\apps\hscontentcontrolexample.mbm" -"!:\resource\apps\hscontentcontrolexample.mbm"
+; Add any installation notes if applicable
+;"hscontentcontrolexample.txt"					  -"!:\private\0xE88D7143\hscontentcontrolexample.txt"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/src/HsContentControlAppUi.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,125 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+
+// [[[ begin generated region: do not modify [Generated System Includes]
+#include <eikmenub.h>
+#include <hscontentcontrolexample.rsg>
+// ]]] end generated region [Generated System Includes]
+
+// [[[ begin generated region: do not modify [Generated User Includes]
+#include "HsContentControlAppUi.h"
+#include "HsContentControlListBox.h"
+// ]]] end generated region [Generated User Includes]
+
+// [[[ begin generated region: do not modify [Generated Constants]
+// ]]] end generated region [Generated Constants]
+
+/**
+ * Construct the CHsContentControlAppUi instance
+ */ 
+CHsContentControlAppUi::CHsContentControlAppUi()
+    {
+    // [[[ begin generated region: do not modify [Generated Contents]
+    iHsContentControlListBox = NULL;
+    // ]]] end generated region [Generated Contents]
+    
+    }
+
+/** 
+ * The appui's destructor removes the container from the control
+ * stack and destroys it.
+ */
+CHsContentControlAppUi::~CHsContentControlAppUi()
+    {
+    // [[[ begin generated region: do not modify [Generated Contents]
+    if ( iHsContentControlListBox != NULL )
+        {
+        RemoveFromStack( iHsContentControlListBox );
+        delete iHsContentControlListBox;
+        iHsContentControlListBox = NULL;
+        }
+    // ]]] end generated region [Generated Contents]
+    
+    }
+
+/**
+ * @brief Completes the second phase of Symbian object construction. 
+ * Put initialization code that could leave here. 
+ */ 
+void CHsContentControlAppUi::ConstructL()
+    {
+    // [[[ begin generated region: do not modify [Generated Contents]
+    
+    BaseConstructL( EAknEnableSkin | EAknEnableMSK |                      
+        EAknTouchCompatible | EAknSingleClickCompatible );
+                        
+    InitializeContainersL();
+    // ]]] end generated region [Generated Contents]
+    
+    }
+
+// [[[ begin generated function: do not modify
+void CHsContentControlAppUi::InitializeContainersL()
+    {
+    iHsContentControlListBox = CHsContentControlListBox::NewL( ClientRect(), NULL, this );
+    iHsContentControlListBox->SetMopParent( this );
+    AddToStackL( iHsContentControlListBox );
+    
+    iHsContentControlListBox->DrawNow();
+    }
+// ]]] end generated function
+
+/**
+ * Handle a command for this appui (override)
+ * @param aCommand command id to be handled
+ */
+void CHsContentControlAppUi::HandleCommandL( TInt aCommand )
+    {
+    // [[[ begin generated region: do not modify [Generated Code]
+    TBool commandHandled = EFalse;
+    switch ( aCommand )
+        { // code to dispatch to the AppUi's menu and CBA commands is generated here
+        default:
+            break;
+        }
+    
+        
+    if ( !commandHandled ) 
+        {
+        if ( aCommand == EAknSoftkeyExit || 
+            aCommand == EAknSoftkeyBack || 
+            aCommand == EEikCmdExit )
+            {
+            Exit();
+            }
+        }
+    // ]]] end generated region [Generated Code]
+    
+    }
+
+/** 
+ * Override of the HandleResourceChangeL virtual function
+ */
+void CHsContentControlAppUi::HandleResourceChangeL( TInt aType )
+    {
+    CAknAppUi::HandleResourceChangeL( aType );
+    // [[[ begin generated region: do not modify [Generated Code]
+    // ]]] end generated region [Generated Code]
+    
+    }
+                
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/src/HsContentControlApplication.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,88 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+
+// [[[ begin generated region: do not modify [Generated System Includes]
+// ]]] end generated region [Generated System Includes]
+
+// [[[ begin generated region: do not modify [Generated Includes]
+#include "HsContentControlApplication.h"
+#include "HsContentControlDocument.h"
+#ifdef EKA2
+#include <eikstart.h>
+#endif
+// ]]] end generated region [Generated Includes]
+
+/**
+ * @brief Returns the application's UID (override from CApaApplication::AppDllUid())
+ * @return UID for this application (KUidHsContentControlApplication)
+ */
+TUid CHsContentControlApplication::AppDllUid() const
+    {
+    return KUidHsContentControlApplication;
+    }
+
+/**
+ * @brief Creates the application's document (override from CApaApplication::CreateDocumentL())
+ * @return Pointer to the created document object (CHsContentControlDocument)
+ */
+CApaDocument* CHsContentControlApplication::CreateDocumentL()
+    {
+    return CHsContentControlDocument::NewL( *this );
+    }
+
+#ifdef EKA2
+
+/**
+ *    @brief Called by the application framework to construct the application object
+ *  @return The application (CHsContentControlApplication)
+ */    
+LOCAL_C CApaApplication* NewApplication()
+    {
+    return new CHsContentControlApplication;
+    }
+
+/**
+* @brief This standard export is the entry point for all Series 60 applications
+* @return error code
+ */    
+GLDEF_C TInt E32Main()
+    {
+    return EikStart::RunApplication( NewApplication );
+    }
+    
+#else     // Series 60 2.x main DLL program code
+
+/**
+* @brief This standard export constructs the application object.
+* @return The application (CHsContentControlApplication)
+*/
+EXPORT_C CApaApplication* NewApplication()
+    {
+    return new CHsContentControlApplication;
+    }
+
+/**
+* @brief This standard export is the entry point for all Series 60 applications
+* @return error code
+*/
+GLDEF_C TInt E32Dll(TDllReason /*reason*/)
+    {
+    return KErrNone;
+    }
+
+#endif // EKA2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/src/HsContentControlDocument.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,67 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+
+// [[[ begin generated region: do not modify [Generated User Includes]
+#include "HsContentControlDocument.h"
+#include "HsContentControlAppUi.h"
+// ]]] end generated region [Generated User Includes]
+
+/**
+ * @brief Constructs the document class for the application.
+ * @param anApplication the application instance
+ */
+CHsContentControlDocument::CHsContentControlDocument( CEikApplication& anApplication )
+    : CAknDocument( anApplication )
+    {
+    }
+
+/**
+ * @brief Completes the second phase of Symbian object construction. 
+ * Put initialization code that could leave here.  
+ */ 
+void CHsContentControlDocument::ConstructL()
+    {
+    }
+    
+/**
+ * Symbian OS two-phase constructor.
+ *
+ * Creates an instance of CHsContentControlDocument, constructs it, and
+ * returns it.
+ *
+ * @param aApp the application instance
+ * @return the new CHsContentControlDocument
+ */
+CHsContentControlDocument* CHsContentControlDocument::NewL( CEikApplication& aApp )
+    {
+    CHsContentControlDocument* self = new ( ELeave ) CHsContentControlDocument( aApp );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+/**
+ * @brief Creates the application UI object for this document.
+ * @return the new instance
+ */    
+CEikAppUi* CHsContentControlDocument::CreateAppUiL()
+    {
+    return new ( ELeave ) CHsContentControlAppUi;
+    }
+                
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/src/HsContentControlListBox.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,598 @@
+/*
+* Copyright (c) 2010 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:  Content Control example
+*
+*/
+
+
+//  Includes
+#include <aknlists.h>
+#include <akncontext.h>
+#include <akntitle.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <akntabgrp.h>
+#include <aknstyluspopupmenu.h>
+
+#include <aknsinglestyletreelist.h>
+#include <aknsbasicbackgroundcontrolcontext.h>
+
+#include <hsccapiclient.h>
+#include <hscontentinfo.h>
+#include <hscontentinfoarray.h>
+
+#include "HsContentControlListBox.h"
+
+//  Constants
+const TInt KFlags( CAknSingleStyleTreeList::EPersistent | 
+        CAknSingleStyleTreeList::EExpanded );
+
+_LIT( KActivate, "Activate" );
+
+enum TTabs
+    {
+    ETabFirst = 0,
+    ETabActiveConfiguration = ETabFirst,
+    ETabConfigurations,
+    ETabViews,
+    ETabWidgets,
+    ETabLast = ETabWidgets 
+    };
+
+// ============================ LOCAL FUNCTIONS ================================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::CHsContentControlListBox
+//
+// -----------------------------------------------------------------------------
+//
+CHsContentControlListBox::CHsContentControlListBox()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::~CHsContentControlListBox
+//
+// -----------------------------------------------------------------------------
+//
+CHsContentControlListBox::~CHsContentControlListBox()
+    {    
+    delete iHsCcApiClient;
+    delete iCallback;
+    delete iPopup;
+    delete iListBox;
+    delete iBgContext;
+    delete iArray;    
+    delete iDecorator;
+    }
+  
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::NewL
+//
+// -----------------------------------------------------------------------------
+//
+CHsContentControlListBox* CHsContentControlListBox::NewL( const TRect& aRect,  
+    const CCoeControl* aParent, MEikCommandObserver* aCommandObserver )          
+    {
+    CHsContentControlListBox* self = 
+        CHsContentControlListBox::NewLC( aRect, aParent, aCommandObserver ); 
+    CleanupStack::Pop( self );
+    
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::NewLC
+//
+// -----------------------------------------------------------------------------
+//
+CHsContentControlListBox* CHsContentControlListBox::NewLC( const TRect& aRect,          
+    const CCoeControl* aParent, MEikCommandObserver* aCommandObserver )         
+    {
+    CHsContentControlListBox* self = new ( ELeave ) CHsContentControlListBox();
+    CleanupStack::PushL( self );
+    
+    self->ConstructL( aRect, aParent, aCommandObserver );
+    
+    return self;
+    }
+            
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::ConstructL
+//
+// -----------------------------------------------------------------------------
+//
+void CHsContentControlListBox::ConstructL( const TRect& aRect,          
+    const CCoeControl* aParent, MEikCommandObserver* /*aCommandObserver*/ )         
+    {
+    iHsCcApiClient = CHsCcApiClient::NewL( this );
+    
+    TCallBack cb( PopulateList, this );
+    
+    iCallback = new ( ELeave ) CAsyncCallBack( cb, CActive::EPriorityStandard );
+    
+    if ( !aParent )
+        {
+        CreateWindowL();
+        }
+    else
+        {
+        SetContainerWindowL( *aParent );
+        }
+    
+    InitializeControlsL();
+
+    SetRect( aRect );
+               
+    ActivateL();
+    
+    PopulateListL();
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::CountComponentControls
+//
+// -----------------------------------------------------------------------------
+//
+TInt CHsContentControlListBox::CountComponentControls() const
+    {
+    return 1;
+    }
+                
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::CHsContentControlListBox
+//
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CHsContentControlListBox::ComponentControl( TInt aIndex ) const
+    {
+    if ( aIndex == 0 )
+        {
+        return iListBox;
+        }
+    
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::OfferKeyEventL
+//
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CHsContentControlListBox::OfferKeyEventL(  
+    const TKeyEvent& aKeyEvent, TEventCode aType )         
+    {    
+    if ( iListBox->OfferKeyEventL( aKeyEvent, aType ) == EKeyWasConsumed )         
+        {
+        return EKeyWasConsumed;
+        }
+    
+    return CCoeControl::OfferKeyEventL( aKeyEvent, aType );
+    }
+                
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::HandleResourceChange
+//
+// -----------------------------------------------------------------------------
+//
+void CHsContentControlListBox::HandleResourceChange( TInt aType )
+    {
+    CCoeControl::HandleResourceChange( aType );
+    
+    SetRect( iAvkonAppUi->ClientRect() );
+    }
+                
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::SizeChanged
+//
+// -----------------------------------------------------------------------------
+//
+void CHsContentControlListBox::SizeChanged()
+    {
+    CCoeControl::SizeChanged();
+
+    LayoutControls();    
+    }
+                
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::MopSupplyObject
+//
+// -----------------------------------------------------------------------------
+//
+TTypeUid::Ptr CHsContentControlListBox::MopSupplyObject( TTypeUid aId )
+    {
+    if ( aId.iUid == MAknsControlContext::ETypeId && iBgContext )
+        {
+        return MAknsControlContext::SupplyMopObject( aId, iBgContext );
+        }
+
+    return CCoeControl::MopSupplyObject( aId );
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::HandleTreeListEvent
+//
+// -----------------------------------------------------------------------------
+//
+TInt CHsContentControlListBox::HandleTreeListEvent(       
+    CAknTreeList& /*aList*/,
+    TAknTreeItemID aItem,
+    TEvent aEvent )
+    {        
+    if ( aEvent == EItemSelected )
+        {        
+        if ( !iListBox->IsLeaf( aItem ) && !iListBox->IsMarked( aItem ) )
+            {
+            return KErrNone;
+            }
+                
+        const TWsEvent& event( iCoeEnv->LastEvent() );        
+        
+        if ( event.Type() == EEventPointer )
+            {                              
+            TInt x, y;            
+        
+            TPointerEvent& pointer( *event.Pointer() );
+            
+            x = pointer.iParentPosition.iX;
+            y = pointer.iParentPosition.iY;
+
+            delete iPopup;
+            iPopup = NULL;            
+        
+            iPopup = CAknStylusPopUpMenu::NewL( this, TPoint( x, y ) );             
+                           
+            if ( iTabIndex == ETabConfigurations )
+                {
+                iSelectedItem = aItem;
+                
+                iPopup->AddMenuItemL( KActivate, 1 );
+                
+                iPopup->SetPosition( TPoint( x, y ), 
+                    CAknStylusPopUpMenu::EPositionTypeRightBottom );
+                
+                iPopup->ShowMenu();
+                }
+            }
+        }
+    
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::ProcessCommandL
+//
+// -----------------------------------------------------------------------------
+//
+void CHsContentControlListBox::ProcessCommandL( TInt aCommandId )
+    {  
+    TAknTreeItemID item( iSelectedItem );
+    
+    iSelectedItem = KAknTreeIIDNone;
+    
+    if ( item == KAknTreeIIDNone || aCommandId == KErrCancel )
+        {
+        return;
+        }
+           
+    // Resolve selected item
+    if ( iTabIndex == ETabConfigurations )
+        {
+        TAknTreeItemID id = iListBox->Child( KAknTreeIIDRoot, 0 );
+        
+        TInt count( iListBox->ChildCount( id ) );
+        
+        for ( TInt i = 0; i < count; i++ )
+            {
+            if ( iListBox->Child( id, i ) == item )
+                {
+                CHsContentInfo* info( iArray->Array()[i] );
+                
+                TRAP_IGNORE( iHsCcApiClient->ActivateAppL( *info ) );
+                
+                break;
+                }
+            }
+        }       
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::SetEmphasis
+//
+// -----------------------------------------------------------------------------
+//
+void CHsContentControlListBox::SetEmphasis( CCoeControl* /*aMenuControl*/, 
+    TBool /*aEmphasis*/ )
+    {         
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::TabChangedL
+//
+// -----------------------------------------------------------------------------
+//
+void CHsContentControlListBox::TabChangedL( TInt aIndex )
+    {
+    if ( aIndex != iTabIndex )
+        {
+        iTabIndex = aIndex;
+        
+        iDecorator->SetScrollButtonDimmed( 
+            CAknNavigationDecorator::ERightButton, EFalse );
+        
+        iDecorator->SetScrollButtonDimmed( 
+            CAknNavigationDecorator::ELeftButton, EFalse );
+        
+        if ( iTabIndex == ETabFirst )
+            {
+            iDecorator->SetScrollButtonDimmed( 
+                CAknNavigationDecorator::ELeftButton, ETrue );    
+            }
+        else if ( iTabIndex == ETabLast )
+            {
+            iDecorator->SetScrollButtonDimmed( 
+                CAknNavigationDecorator::ERightButton, ETrue );    
+            }
+        
+        iCallback->Cancel();
+        iCallback->CallBack();        
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::NotifyWidgetListChanged
+//
+// -----------------------------------------------------------------------------
+//
+void CHsContentControlListBox::NotifyWidgetListChanged()
+    {
+    iCallback->Cancel();
+    iCallback->CallBack();
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::NotifyViewListChanged
+//
+// -----------------------------------------------------------------------------
+//
+void CHsContentControlListBox::NotifyViewListChanged()
+    {
+    iCallback->Cancel();
+    iCallback->CallBack();
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::NotifyAppListChanged
+//
+// -----------------------------------------------------------------------------
+//
+void CHsContentControlListBox::NotifyAppListChanged()
+    {
+    iCallback->Cancel();
+    iCallback->CallBack();
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::InitializeControlsL
+//
+// -----------------------------------------------------------------------------
+//
+void CHsContentControlListBox::InitializeControlsL()
+    {
+    iListBox = CAknSingleStyleTreeList::NewL( *this );
+    iListBox->SetContainerWindowL( *this );    
+    iListBox->AddObserverL( this );    
+    iListBox->SetFocus( ETrue );
+    
+    iBgContext = CAknsBasicBackgroundControlContext::NewL(
+        KAknsIIDQsnBgScreen, TRect(), ETrue );
+    
+    CEikStatusPane* sp( iAvkonAppUi->StatusPane() );
+    
+    TUid naviPaneUid( TUid::Uid( EEikStatusPaneUidNavi ) );
+                                 
+    CAknNavigationControlContainer* naviPane = 
+        static_cast< CAknNavigationControlContainer* >( sp->ControlL( naviPaneUid ) ); 
+    
+    iDecorator = naviPane->ResourceDecorator();
+            
+    iDecorator->MakeScrollButtonVisible( ETrue );
+    
+    iDecorator->SetScrollButtonDimmed( 
+        CAknNavigationDecorator::ELeftButton, ETrue );
+
+    iDecorator->SetScrollButtonDimmed( 
+        CAknNavigationDecorator::ERightButton, EFalse );
+    
+    iTabGroup = static_cast< CAknTabGroup* > ( iDecorator->DecoratedControl() );    
+    iTabGroup->SetObserver( this );       
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::LayoutControls
+//
+// -----------------------------------------------------------------------------
+//
+void CHsContentControlListBox::LayoutControls()
+    {
+    iListBox->SetRect( Rect() );
+    
+    TRect rect;
+    
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, rect );     
+    
+    iBgContext->SetRect( rect );
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::PopulateListL
+//
+// -----------------------------------------------------------------------------
+//    
+void CHsContentControlListBox::PopulateListL()
+    {
+    if ( !iListBox->IsEmpty( KAknTreeIIDRoot ) )
+        {
+        // Remove all
+        iListBox->RemoveItem( KAknTreeIIDRoot, EFalse );
+        }
+    
+    delete iArray;
+    iArray = NULL;
+
+    if ( iTabIndex == ETabActiveConfiguration )
+        {       
+        CHsContentInfo* activeApp = CHsContentInfo::NewL();
+        CleanupStack::PushL( activeApp );
+        
+        // Get active homescreen configuration
+        iHsCcApiClient->ActiveAppL( *activeApp );
+
+        _LIT( KActiveConfiguration, "Active configuration" );
+        
+        TAknTreeItemID root = iListBox->AddNodeL( 
+            KAknTreeIIDRoot, KActiveConfiguration, KFlags, EFalse );
+                       
+        CHsContentInfoArray* viewList = CHsContentInfoArray::NewL();
+        CleanupStack::PushL( viewList );
+        
+        // Get view list from the active configuration
+        iHsCcApiClient->ViewListL( *activeApp, *viewList );
+        
+        _LIT( KView, "View " );
+        
+        for ( TInt j = 0; j < viewList->Array().Count(); j++ )
+            {
+            TBuf< 32 > viewname;        
+            viewname = KView();
+            viewname.AppendNum( j + 1 );
+            
+            CHsContentInfo* view( viewList->Array()[j] );
+            
+            TAknTreeItemID parent = iListBox->AddNodeL( 
+                root, viewname, KFlags, EFalse );
+    
+            CHsContentInfoArray* widgetList = CHsContentInfoArray::NewL();
+            CleanupStack::PushL( widgetList );
+    
+            // Get widget list from the view 
+            iHsCcApiClient->WidgetListL( *view, *widgetList );
+            
+            for ( TInt k = 0; k < widgetList->Array().Count(); k++ )
+                {
+                CHsContentInfo* widget( widgetList->Array()[k] );
+                
+                iListBox->AddLeafL( parent, widget->Name(), KFlags, EFalse );            
+                }
+            
+            CleanupStack::PopAndDestroy( widgetList );
+            }   
+        
+        CleanupStack::PopAndDestroy( viewList );
+        
+        CleanupStack::PopAndDestroy( activeApp );    
+        }
+    else if ( iTabIndex == ETabConfigurations )
+        {
+        _LIT( KConfigurations, "Configurations" );
+        
+        TAknTreeItemID root = iListBox->AddNodeL( 
+            KAknTreeIIDRoot, KConfigurations, KFlags, EFalse );
+                   
+        iArray = CHsContentInfoArray::NewL();
+        
+        // Get all homescreen configurations 
+        iHsCcApiClient->AppListL( *iArray );
+        
+        _LIT( KConfiguration, "Configuration " );
+        
+        for ( TInt i = 0; i < iArray->Array().Count(); i++ )
+            {
+            TBuf< 32 > confname;
+            confname = KConfiguration();
+            confname.AppendNum( i + 1 );
+            
+            CHsContentInfo* app( iArray->Array()[i] );
+                        
+            iListBox->AddLeafL( root, confname, KFlags, EFalse );            
+            }
+        }
+    
+    else if ( iTabIndex == ETabViews )
+        {
+        _LIT( KViews, "Views" );
+        
+        TAknTreeItemID root = iListBox->AddNodeL( 
+            KAknTreeIIDRoot, KViews, KFlags, EFalse );
+    
+        iArray = CHsContentInfoArray::NewL();        
+    
+        // Get all homescreen views
+        iHsCcApiClient->ViewListL( *iArray );
+        
+        _LIT( KView, "View " );
+        
+        for ( TInt i = 0; i < iArray->Array().Count(); i++ )
+            {
+            TBuf< 32 > viewname;        
+            viewname = KView();
+            viewname.AppendNum( i + 1 );
+        
+            CHsContentInfo* view( iArray->Array()[i] );
+            
+            iListBox->AddLeafL( root, viewname, KFlags, EFalse );                 
+            }
+        }
+
+    else if ( iTabIndex == ETabWidgets )
+        {
+        _LIT( KWidgets, "Widgets" );
+        
+        TAknTreeItemID root = iListBox->AddNodeL( 
+            KAknTreeIIDRoot, KWidgets, KFlags, EFalse );
+    
+        iArray = CHsContentInfoArray::NewL();
+            
+        // Get all homescreen widgets
+        iHsCcApiClient->WidgetListL( *iArray );
+        
+        for ( TInt i = 0; i < iArray->Array().Count(); i++ )
+            {
+            CHsContentInfo* widget( iArray->Array()[i] );
+            
+            iListBox->AddLeafL( root, widget->Name(), KFlags, EFalse );                 
+            }
+        }
+    
+    DrawNow();
+    }
+
+// -----------------------------------------------------------------------------
+// CHsContentControlListBox::PopulateList
+//
+// -----------------------------------------------------------------------------
+//    
+/*static*/ TInt CHsContentControlListBox::PopulateList( TAny* aAny )
+    {
+    CHsContentControlListBox* self = 
+        static_cast< CHsContentControlListBox* >( aAny );
+    
+    TRAP_IGNORE( self->PopulateListL() );       
+    
+    return KErrNone;
+    }
+
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/data/MCSExample.rls	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+//  LOCALISATION STRINGS
+
+// Caption string for app.
+#define qtn_caption_string "MCSExample"
+
+// First item in "Options" menu pane
+#define qtn_command1 "Message"
+
+// Second item in "Options" menu pane
+#define qtn_command2 "List all items"
+
+#define qtn_help "Help"
+
+#define qtn_about "About"
+
+// Third item in "Options" menu pane
+#define qtn_exit "Exit"
+
+// When user requests ECommand1 event, text below is shown.
+#define qtn_command1_text "MCS example application."
+
+#define qtn_loc_resource_file_1 "\\resource\\apps\\MCSExample_0xEB753B18"
+
+#define qtn_about_dialog_title "About"
+
+#define qtn_about_dialog_text "MCSExample Version 1.0.0\n\nAuthor: Jaakko Haukipuro\n\nSupport: \n\n(c) "
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/data/MCSExample.rss	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,310 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+//  RESOURCE IDENTIFIER
+NAME MCSE	// 4 letter ID
+
+
+//  INCLUDES
+#include <eikon.rh>
+#include <avkon.rsg>
+#include <avkon.rh>
+#include <appinfo.rh>
+#include "MCSExample.hrh"
+#include "MCSExample.rls"
+
+//  RESOURCE DEFINITIONS
+// -----------------------------------------------------------------------------
+//
+//	Define the resource file signature
+//	This resource should be empty.
+//
+// -----------------------------------------------------------------------------
+//
+RESOURCE RSS_SIGNATURE
+	{
+	}
+
+// -----------------------------------------------------------------------------
+//
+//	Default Document Name
+//
+// -----------------------------------------------------------------------------
+//
+RESOURCE TBUF r_default_document_name
+	{
+	buf="MCSE";
+	}
+
+// -----------------------------------------------------------------------------
+//
+//	Define default menu and CBA key.
+//
+// -----------------------------------------------------------------------------
+//
+RESOURCE EIK_APP_INFO
+	{
+	menubar = r_menubar;
+	cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
+	}
+
+
+// -----------------------------------------------------------------------------
+//
+//   r_menubar
+//   Main menubar
+//
+// -----------------------------------------------------------------------------
+//
+RESOURCE MENU_BAR r_menubar
+	{
+	titles =
+		{
+		MENU_TITLE { menu_pane = r_menu; }
+		};
+	}
+
+
+// -----------------------------------------------------------------------------
+//
+//   r_menu
+//   Menu for "Options"
+//
+// -----------------------------------------------------------------------------
+//
+RESOURCE MENU_PANE r_menu
+	{
+	items =
+		{
+		// added the new Options menu command here
+		MENU_ITEM
+				{
+				command = ECommand1;
+				txt = qtn_command1;
+				},
+		MENU_ITEM
+				{
+				command = ECommand2;
+				txt = qtn_command2;
+				},
+		MENU_ITEM
+				{
+				command = EHelp;
+				txt = qtn_help;
+				},
+		MENU_ITEM
+				{
+				command = EAbout;
+				txt = qtn_about;
+				},
+		MENU_ITEM
+				{
+				command = EAknSoftkeyExit;
+				txt = qtn_exit;
+				}
+		};
+	}
+
+// -----------------------------------------------------------------------------
+//
+// About dialog resource.
+//
+// -----------------------------------------------------------------------------
+//
+RESOURCE DIALOG r_about_query_dialog
+	{
+	flags =  EEikDialogFlagNoBorder | EEikDialogFlagNoShadow;
+	buttons = R_AVKON_SOFTKEYS_OK_EMPTY;
+	items=
+		{
+		DLG_LINE 
+			{
+			type = EAknCtPopupHeadingPane;
+			id = EAknMessageQueryHeaderId;
+			itemflags = EEikDlgItemNonFocusing;
+			control = AVKON_HEADING
+				{
+				};
+			},
+		DLG_LINE
+			{
+			type = EAknCtMessageQuery;
+			id = EAknMessageQueryContentId;
+			control = AVKON_MESSAGE_QUERY
+				{
+				};
+			}
+		};
+	}
+
+RESOURCE DIALOG r_icon_query_dialog
+    {
+    flags = EGeneralQueryFlags;
+    buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
+    form = r_icon_form;
+    }
+
+RESOURCE FORM r_icon_form
+    {
+    flags = EEikFormUseDoubleSpacedFormat|EEikFormEditModeOnly;
+    items =
+        {
+        DLG_LINE
+            {
+            type = EEikCtEdwin;
+            prompt = "Major skin ID";
+            id = EMyFirstLine;
+            control = EDWIN
+                 {
+                 flags = EEikEdwinNoHorizScrolling | EEikEdwinResizable;
+                 width = 30;
+                 maxlength = 30;
+                 // added to limit expanding in forms. 
+                 // If you want full screen use 6 here
+                 max_view_height_in_lines = 1; 
+                 // if you have the line above, you must have this. 
+                 // It's calculable from LAF
+                 base_line_delta = 21; 
+                 };
+            },
+        DLG_LINE
+            {
+            type = EEikCtEdwin;
+            prompt = "Minor skin ID";
+            id = EMySecondLine;
+            control = EDWIN
+                 {
+                 flags = EEikEdwinNoHorizScrolling | EEikEdwinResizable;
+                 width = 30;
+                 maxlength = 30;
+                 // added to limit expanding in forms. 
+                 // If you want full screen use 6 here
+                 max_view_height_in_lines = 1; 
+                 // if you have the line above, you must have this. 
+                 // It's calculable from LAF
+                 base_line_delta = 21; 
+                 };
+            },
+        DLG_LINE
+            {
+            type = EEikCtEdwin;
+            prompt = "MIF/MBM file name";
+            id = EMyThirdLine;
+            control = EDWIN
+                 {
+                 flags = EEikEdwinNoHorizScrolling | EEikEdwinResizable;
+                 width = 30;
+                 maxlength = 30;
+                 // added to limit expanding in forms. 
+                 // If you want full screen use 6 here
+                 max_view_height_in_lines = 1; 
+                 // if you have the line above, you must have this. 
+                 // It's calculable from LAF
+                 base_line_delta = 21; 
+                 };
+            },
+        DLG_LINE
+            {
+            type = EEikCtEdwin;
+            prompt = "MIF/MBM bitmap ID";
+            id = EMyFourthLine;
+            control = EDWIN
+                 {
+                 flags = EEikEdwinNoHorizScrolling | EEikEdwinResizable;
+                 width = 30;
+                 maxlength = 30;
+                 // added to limit expanding in forms. 
+                 // If you want full screen use 6 here
+                 max_view_height_in_lines = 1; 
+                 // if you have the line above, you must have this. 
+                 // It's calculable from LAF
+                 base_line_delta = 21; 
+                 };
+            },
+        DLG_LINE
+            {
+            type = EEikCtEdwin;
+            prompt = "MIF/MBM mask ID";
+            id = EMyFifthLine;
+            control = EDWIN
+                 {
+                 flags = EEikEdwinNoHorizScrolling | EEikEdwinResizable;
+                 width = 30;
+                 maxlength = 30;
+                 // added to limit expanding in forms. 
+                 // If you want full screen use 6 here
+                 max_view_height_in_lines = 1; 
+                 // if you have the line above, you must have this. 
+                 // It's calculable from LAF
+                 base_line_delta = 21; 
+                 };
+            },
+        DLG_LINE
+            {
+            type = EEikCtEdwin;
+            prompt = "Presenceicon";
+            id = EMySixthLine;
+            control = EDWIN
+                 {
+                 flags = EEikEdwinNoHorizScrolling | EEikEdwinResizable;
+                 width = 30;
+                 maxlength = 30;
+                 // added to limit expanding in forms. 
+                 // If you want full screen use 6 here
+                 max_view_height_in_lines = 1; 
+                 // if you have the line above, you must have this. 
+                 // It's calculable from LAF
+                 base_line_delta = 21; 
+                 };
+            }
+        };
+    }
+
+
+
+// -----------------------------------------------------------------------------
+//
+// Resources for messages.
+//
+// -----------------------------------------------------------------------------
+//
+RESOURCE TBUF32 r_caption_string { buf=qtn_caption_string; }
+RESOURCE TBUF32 r_about_dialog_title { buf=qtn_about_dialog_title; }
+RESOURCE TBUF r_about_dialog_text { buf=qtn_about_dialog_text; }
+RESOURCE TBUF r_command1_text { buf=qtn_command1_text; }
+
+
+// ---------------------------------------------------------------------------- 
+//
+// r_localisable_app_info
+//
+// ---------------------------------------------------------------------------- 
+//
+RESOURCE LOCALISABLE_APP_INFO r_localisable_app_info
+	{
+	short_caption = qtn_caption_string;
+	caption_and_icon = 
+	CAPTION_AND_ICON_INFO
+		{
+		caption = qtn_caption_string;
+
+		number_of_icons = 1;
+		icon_file = "\\resource\\apps\\MCSExample_0xEB753B18.mif";
+		};
+	}
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/data/MCSExample_reg.rss	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#include "MCSExample.hrh"
+#include "MCSExample.rls"
+#include <appinfo.rh>
+#include <MCSExample_0xEB753B18.rsg>
+
+UID2 KUidAppRegistrationResourceFile
+UID3 _UID3
+
+RESOURCE APP_REGISTRATION_INFO
+	{
+	app_file="MCSExample_0xEB753B18";
+	localisable_resource_file =  qtn_loc_resource_file_1;
+	localisable_resource_id = R_LOCALISABLE_APP_INFO;
+
+	embeddability=KAppNotEmbeddable;
+	newfile=KAppDoesNotSupportNewFile;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/gfx/qgn_menu_MCSExample.svg	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%" viewBox="0 0 88 87.999">
+<g>
+<g>
+<g>
+<g>
+<rect fill="none" width="88" height="87.999"/>
+</g>
+</g>
+<g>
+<linearGradient id="XMLID_7_" gradientUnits="userSpaceOnUse" x1="12.3042" y1="18.3799" x2="63.4113" y2="79.287">
+<stop offset="0" style="stop-color:#B3DDFF"/>
+<stop offset="0.8146" style="stop-color:#084296"/>
+<stop offset="1" style="stop-color:#084296"/>
+</linearGradient>
+<path fill="url(#XMLID_7_)" d="M32.135,7.415L14.363,17.432v23.167c0,0,8.926,15.351,10.468,18.001       c-2.386,1.704-15.44,11.03-15.44,11.03l21.613,12.652c0,0,12.907-9.85,14.71-11.226c1.979,1.109,16.231,9.101,16.231,9.101       l16.664-15.132c0,0-14.066-6.929-16.888-8.318c1.467-3.01,10.531-21.604,10.531-21.604l-22.298-9.59       c0,0-1.486,3.173-2.093,4.467c-2.046-0.88-6.573-2.826-6.573-2.826s-3.713,2.463-5.696,3.778       c-0.327-0.744-0.542-1.233-0.657-1.495c0.007-0.824,0.213-23.72,0.213-23.72L32.135,7.415z"/>
+<linearGradient id="XMLID_8_" gradientUnits="userSpaceOnUse" x1="40.8276" y1="52.1914" x2="16.1997" y2="21.1353">
+<stop offset="0" style="stop-color:#5AA7E0"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_8_)" points="59.051,57.621 69.536,36.111 50.944,28.115 48.852,32.581 41.493,29.418 34.719,33.911        32.932,29.849 33.117,9.157 16.363,18.601 16.363,40.06 27.476,59.169 13.064,69.463 30.856,79.879 45.546,68.669        61.667,77.708 75.089,65.521 "/>
+<linearGradient id="XMLID_9_" gradientUnits="userSpaceOnUse" x1="60.585" y1="31.876" x2="53.8582" y2="45.1125">
+<stop offset="0" style="stop-color:#5AA7E0"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_9_)" points="41.26,48.783 50.944,28.115 69.536,36.111 59.051,57.621 "/>
+<polygon fill="#0046B7" points="16.363,40.06 27.476,59.169 41.26,48.783 32.932,29.849 "/>
+<polygon fill="#3366CC" points="16.363,40.06 16.363,18.601 33.117,9.157 32.932,29.849 "/>
+<polygon fill="#CFECFF" points="26.696,39.23 41.493,29.418 59.523,37.168 45.546,47.954 "/>
+<path fill="#5AA7E0" d="M41.954,55.286"/>
+<polygon fill="#3366CC" points="26.696,39.23 27.476,59.169 45.546,68.669 45.546,47.954 "/>
+<polygon fill="#5AA7E0" points="13.064,69.463 27.476,59.169 45.546,68.669 30.856,79.879 "/>
+<linearGradient id="XMLID_10_" gradientUnits="userSpaceOnUse" x1="29.2085" y1="63.6836" x2="48.7102" y2="56.1976">
+<stop offset="0" style="stop-color:#5AA7E0"/>
+<stop offset="0.0056" style="stop-color:#5AA7E0"/>
+<stop offset="0.85" style="stop-color:#3366CC"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_10_)" points="43.423,46.971 27.476,59.169 45.546,68.669 45.546,47.954 "/>
+<polygon fill="#0046B7" points="45.546,47.954 45.546,68.669 59.051,57.621 59.523,37.168 "/>
+<linearGradient id="XMLID_11_" gradientUnits="userSpaceOnUse" x1="45.3936" y1="59.5186" x2="59.0508" y2="59.5186">
+<stop offset="0" style="stop-color:#0046B7"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_11_)" points="45.394,50.368 45.546,68.669 59.051,57.621 "/>
+<linearGradient id="XMLID_12_" gradientUnits="userSpaceOnUse" x1="60.8945" y1="68.6807" x2="57.2953" y2="58.792">
+<stop offset="0" style="stop-color:#5AA7E0"/>
+<stop offset="0.4101" style="stop-color:#5AA7E0"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_12_)" points="61.667,77.708 45.546,68.669 59.051,57.621 75.089,65.521 "/>
+</g>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/group/Icons_scalable_dc.mk	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2010 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:
+#
+
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\Z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\MCSExample_0xEB753B18.mif
+
+ICONDIR=..\gfx
+
+do_nothing :
+	@rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN :
+	@echo ...Deleting $(ICONTARGETFILENAME)
+	del /q /f $(ICONTARGETFILENAME)
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+# ----------------------------------------------------------------------------
+# NOTE: if you have JUSTINTIME enabled for your S60 3rd FP1 or newer SDK
+# and this command crashes, consider adding "/X" to the command line.
+# See <http://forum.nokia.com/document/Forum_Nokia_Technical_Library_v1_35/contents/FNTL/Build_process_fails_at_mif_file_creation_in_S60_3rd_Ed_FP1_SDK.htm>
+# ----------------------------------------------------------------------------
+
+RESOURCE : $(ICONTARGETFILENAME)
+
+$(ICONTARGETFILENAME) : $(ICONDIR)\qgn_menu_MCSExample.svg
+	mifconv $(ICONTARGETFILENAME) \
+		/c32 $(ICONDIR)\qgn_menu_MCSExample.svg
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/group/MCSExample.mmp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,81 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+APP_LAYER_SYSTEMINCLUDE
+
+
+TARGET			MCSExample_0xEB753B18.exe
+TARGETTYPE		exe
+UID		  0x100039CE 0xEB753B18
+
+SOURCEPATH		..\src
+SOURCE			MCSExample.cpp
+SOURCE			MCSExampleApplication.cpp
+SOURCE			MCSExampleAppView.cpp
+SOURCE			MCSExampleAppUi.cpp
+SOURCE			MCSExampleDocument.cpp
+SOURCE          mcspluginwatcher.cpp
+
+SOURCEPATH		..\data
+
+START RESOURCE	MCSExample.rss
+HEADER
+TARGET MCSExample_0xEB753B18
+TARGETPATH resource\apps
+END //RESOURCE
+
+START RESOURCE	MCSExample_reg.rss
+TARGET MCSExample_0xEB753B18_reg
+TARGETPATH 	  \private\10003a3f\apps
+END //RESOURCE
+
+
+
+USERINCLUDE	   ..\inc
+
+SYSTEMINCLUDE	 \epoc32\include
+
+LIBRARY		   euser.lib
+LIBRARY		   apparc.lib
+LIBRARY		   cone.lib
+LIBRARY		   eikcore.lib
+LIBRARY        eikcoctl.lib
+LIBRARY        eikctl.lib
+LIBRARY		   avkon.lib
+LIBRARY        aknicon.lib
+LIBRARY        bafl.lib
+LIBRARY		   commonengine.lib
+LIBRARY        aknnotify.lib
+LIBRARY        fbscli.lib
+LIBRARY        egul.lib
+LIBRARY        mcsmenu.lib
+LIBRARY        mcsextendedmenu.lib
+LIBRARY        eikdlg.lib
+ 
+
+LANG SC
+
+VENDORID	  	  0
+SECUREID		  0xEB753B18
+CAPABILITY	  	  ReadUserData ReadDeviceData WriteDeviceData
+
+#ifdef ENABLE_ABIV2_MODE
+  DEBUGGABLE_UDEBONLY
+#endif
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/group/bld.inf	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+
+PRJ_PLATFORMS
+WINSCW ARMV5 GCCE
+
+PRJ_MMPFILES
+
+gnumakefile icons_scalable_dc.mk
+
+MCSExample.mmp
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/inc/MCSExample.hrh	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,42 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#ifndef __MCSEXAMPLE_HRH__
+#define __MCSEXAMPLE_HRH__
+
+#define _UID3 0xEB753B18
+
+// MCSExample enumerate command codes
+enum TMCSExampleIds
+    {
+    ECommand1 = 0x6001, // start value must not be 0
+    ECommand2,
+    EHelp,
+    EAbout
+    };
+
+enum TMyControlIds
+    {
+    EMyFirstLine = 100,
+    EMySecondLine,
+    EMyThirdLine,
+    EMyFourthLine,
+    EMyFifthLine,
+    EMySixthLine
+    };
+
+#endif // __MCSEXAMPLE_HRH__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/inc/MCSExample.pan	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,34 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#ifndef __MCSEXAMPLE_PAN__
+#define __MCSEXAMPLE_PAN__
+
+/** MCSExample application panic codes */
+enum TMCSExamplePanics
+    {
+    EMCSExampleUi = 1
+    // add further panics here
+    };
+
+inline void Panic(TMCSExamplePanics aReason)
+    {
+    _LIT(applicationName, "MCSExample");
+    User::Panic(applicationName, aReason);
+    }
+
+#endif // __MCSEXAMPLE_PAN__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/inc/MCSExampleAppUi.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,93 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#ifndef __MCSEXAMPLEAPPUI_h__
+#define __MCSEXAMPLEAPPUI_h__
+
+// INCLUDES
+#include <aknappui.h>
+
+// FORWARD DECLARATIONS
+class CMCSExampleAppView;
+
+// CLASS DECLARATION
+/**
+ * CMCSExampleAppUi application UI class.
+ * Interacts with the user through the UI and request message processing
+ * from the handler class
+ */
+class CMCSExampleAppUi : public CAknAppUi
+    {
+public:
+    // Constructors and destructor
+
+    /**
+     * ConstructL.
+     * 2nd phase constructor.
+     */
+    void ConstructL();
+
+    /**
+     * CMCSExampleAppUi.
+     * C++ default constructor. This needs to be public due to
+     * the way the framework constructs the AppUi
+     */
+    CMCSExampleAppUi();
+
+    /**
+     * ~CMCSExampleAppUi.
+     * Virtual Destructor.
+     */
+    virtual ~CMCSExampleAppUi();
+
+private:
+    // Functions from base classes
+
+    /**
+     * From CEikAppUi, HandleCommandL.
+     * Takes care of command handling.
+     * @param aCommand Command to be handled.
+     */
+    void HandleCommandL(TInt aCommand);
+
+    /**
+     *  HandleStatusPaneSizeChange.
+     *  Called by the framework when the application status pane
+     *  size is changed.
+     */
+    void HandleStatusPaneSizeChange();
+
+    /**
+     *  From CCoeAppUi, HelpContextL.
+     *  Provides help context for the application.
+     *  size is changed.
+     */
+    CArrayFix<TCoeHelpContext>* HelpContextL() const;
+
+private:
+    // Data
+
+    /**
+     * The application view
+     * Owned by CMCSExampleAppUi
+     */
+    CMCSExampleAppView* iAppView;
+
+    };
+
+#endif // __MCSEXAMPLEAPPUI_h__
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/inc/MCSExampleAppView.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,163 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#ifndef __MCSEXAMPLEAPPVIEW_h__
+#define __MCSEXAMPLEAPPVIEW_h__
+
+// INCLUDES
+#include <coecntrl.h>
+#include <aknform.h>
+#include <gulicon.h>
+#include <aknlists.h>
+#include <eiklbo.h> // MEikListBoxObserver
+#include <mcsmenu.h>
+
+class CMCSExampleWatcher;
+
+struct TMyData
+    {
+public:     // data
+    TBuf<256> majorID;
+    TBuf<256> minorID;
+    TBuf<256> iconFile;
+    TBuf<256> iconID;
+    TBuf<256> maskID;
+    TBuf<256> statusIcon;
+    TBool updated;
+    };
+
+class CMyForm : public CAknForm
+    {
+public:     // construction
+    CMyForm( TMyData& aData );
+    virtual ~CMyForm();
+public:     // from CAknForm
+    //void DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane );
+    //void ProcessCommandL( TInt aCommandId );
+    TBool SaveFormDataL();
+    void DoNotSaveFormDataL();
+    //void AddItemL() ;
+    void PreLayoutDynInitL();
+    //MEikDialogPageObserver::TFormControlTypes
+    //    ConvertCustomControlTypeToBaseControlType( TInt aControlType ) const;
+protected:
+    TBool OkToExitL( TInt aButtonId );
+    
+private:
+    void LoadFormDataL();
+private:    // data
+    TMyData& iData;
+    };
+
+
+
+// CLASS DECLARATION
+class CMCSExampleAppView : public CCoeControl, public MEikListBoxObserver
+    {
+public:
+    // New methods
+
+    /**
+     * NewL.
+     * Two-phased constructor.
+     * Create a CMCSExampleAppView object, which will draw itself to aRect.
+     * @param aRect The rectangle this view will be drawn to.
+     * @return a pointer to the created instance of CMCSExampleAppView.
+     */
+    static CMCSExampleAppView* NewL(const TRect& aRect);
+
+    /**
+     * NewLC.
+     * Two-phased constructor.
+     * Create a CMCSExampleAppView object, which will draw itself
+     * to aRect.
+     * @param aRect Rectangle this view will be drawn to.
+     * @return A pointer to the created instance of CMCSExampleAppView.
+     */
+    static CMCSExampleAppView* NewLC(const TRect& aRect);
+
+    /**
+     * ~CMCSExampleAppView
+     * Virtual Destructor.
+     */
+    virtual ~CMCSExampleAppView();
+
+    void ListAllItemsL();
+    
+public:
+    // Functions from base classes
+
+    /**
+     * From CCoeControl, Draw
+     * Draw this CMCSExampleAppView to the screen.
+     * @param aRect the rectangle of this view that needs updating
+     */
+    void Draw(const TRect& aRect) const;
+
+    /**
+     * From CoeControl, SizeChanged.
+     * Called by framework when the view size is changed.
+     */
+    virtual void SizeChanged();
+
+    /**
+     * From CoeControl, HandlePointerEventL.
+     * Called by framework when a pointer touch event occurs.
+     * Note: although this method is compatible with earlier SDKs, 
+     * it will not be called in SDKs without Touch support.
+     * @param aPointerEvent the information about this event
+     */
+    virtual void HandlePointerEventL(const TPointerEvent& aPointerEvent);
+    
+    CCoeControl* ComponentControl( TInt aIndex) const;
+    
+    TInt CountComponentControls() const;
+    
+    void HandleListBoxEventL( CEikListBox* aListBox, TListBoxEvent aEventType );
+
+private:
+    // Constructors
+
+    /**
+     * ConstructL
+     * 2nd phase constructor.
+     * Perform the second phase construction of a
+     * CMCSExampleAppView object.
+     * @param aRect The rectangle this view will be drawn to.
+     */
+    void ConstructL(const TRect& aRect);
+
+    /**
+     * CMCSExampleAppView.
+     * C++ default constructor.
+     */
+    CMCSExampleAppView();
+    
+    CDesCArray* GetArrayL(CArrayPtr<CGulIcon>* aIcons);
+    void MakeListBoxL(void);
+    void UpdateScrollBar(CEikListBox* aListBox);
+    void ShowFormL( TInt aItemIndex);
+    
+    RMenu iMCSMenu;
+    CAknSingleLargeStyleListBox* iListBox;
+    RArray<TMenuItem> iItemArray;
+    /** MCS asynchronous operation watcher, owned */
+    CMCSExampleWatcher* iWatcher;
+    };
+
+#endif // __MCSEXAMPLEAPPVIEW_h__
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/inc/MCSExampleApplication.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,64 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#ifndef __MCSEXAMPLEAPPLICATION_H__
+#define __MCSEXAMPLEAPPLICATION_H__
+
+// INCLUDES
+#include <aknapp.h>
+#include "MCSExample.hrh"
+
+// UID for the application;
+// this should correspond to the uid defined in the mmp file
+const TUid KUidMCSExampleApp =
+    {
+    _UID3
+    };
+
+// CLASS DECLARATION
+
+/**
+ * CMCSExampleApplication application class.
+ * Provides factory to create concrete document object.
+ * An instance of CMCSExampleApplication is the application part of the
+ * AVKON application framework for the MCSExample example application.
+ */
+class CMCSExampleApplication : public CAknApplication
+    {
+public:
+    // Functions from base classes
+
+    /**
+     * From CApaApplication, AppDllUid.
+     * @return Application's UID (KUidMCSExampleApp).
+     */
+    TUid AppDllUid() const;
+
+protected:
+    // Functions from base classes
+
+    /**
+     * From CApaApplication, CreateDocumentL.
+     * Creates CMCSExampleDocument document object. The returned
+     * pointer in not owned by the CMCSExampleApplication object.
+     * @return A pointer to the created document object.
+     */
+    CApaDocument* CreateDocumentL();
+    };
+
+#endif // __MCSEXAMPLEAPPLICATION_H__
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/inc/MCSExampleDocument.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#ifndef __MCSEXAMPLEDOCUMENT_h__
+#define __MCSEXAMPLEDOCUMENT_h__
+
+// INCLUDES
+#include <akndoc.h>
+
+// FORWARD DECLARATIONS
+class CMCSExampleAppUi;
+class CEikApplication;
+
+// CLASS DECLARATION
+
+/**
+ * CMCSExampleDocument application class.
+ * An instance of class CMCSExampleDocument is the Document part of the
+ * AVKON application framework for the MCSExample example application.
+ */
+class CMCSExampleDocument : public CAknDocument
+    {
+public:
+    // Constructors and destructor
+
+    /**
+     * NewL.
+     * Two-phased constructor.
+     * Construct a CMCSExampleDocument for the AVKON application aApp
+     * using two phase construction, and return a pointer
+     * to the created object.
+     * @param aApp Application creating this document.
+     * @return A pointer to the created instance of CMCSExampleDocument.
+     */
+    static CMCSExampleDocument* NewL(CEikApplication& aApp);
+
+    /**
+     * NewLC.
+     * Two-phased constructor.
+     * Construct a CMCSExampleDocument for the AVKON application aApp
+     * using two phase construction, and return a pointer
+     * to the created object.
+     * @param aApp Application creating this document.
+     * @return A pointer to the created instance of CMCSExampleDocument.
+     */
+    static CMCSExampleDocument* NewLC(CEikApplication& aApp);
+
+    /**
+     * ~CMCSExampleDocument
+     * Virtual Destructor.
+     */
+    virtual ~CMCSExampleDocument();
+
+public:
+    // Functions from base classes
+
+    /**
+     * CreateAppUiL
+     * From CEikDocument, CreateAppUiL.
+     * Create a CMCSExampleAppUi object and return a pointer to it.
+     * The object returned is owned by the Uikon framework.
+     * @return Pointer to created instance of AppUi.
+     */
+    CEikAppUi* CreateAppUiL();
+
+private:
+    // Constructors
+
+    /**
+     * ConstructL
+     * 2nd phase constructor.
+     */
+    void ConstructL();
+
+    /**
+     * CMCSExampleDocument.
+     * C++ default constructor.
+     * @param aApp Application creating this document.
+     */
+    CMCSExampleDocument(CEikApplication& aApp);
+
+    };
+
+#endif // __MCSEXAMPLEDOCUMENT_h__
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/inc/mcspluginwatcher.h	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,97 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#ifndef __MCSPLUGINWATCHER_H
+#define __MCSPLUGINWATCHER_H
+
+#include <e32base.h>
+
+class CMenuOperation;
+class CMCSPluginEngine;
+class CMCSExampleAppView;
+
+
+/**
+ *
+ *  This class implements MCS menu action watcher for async calls.
+ * 
+ */
+class CMCSExampleWatcher: public CActive
+    {
+    public:
+        
+        
+        /**
+         * Two-phased constructor.
+         * 
+         * @param aType
+         */
+        static CMCSExampleWatcher* NewL( );
+        
+        /**
+         * Destructor.
+         */
+        virtual ~CMCSExampleWatcher();
+
+        /**
+         * Watch menu operation or notification.
+         * 
+         * @param aOperation
+         */
+        void Watch( CMenuOperation* aOperation, CMCSExampleAppView* aObserver );
+
+        
+        /**
+         * GetStatus 
+         */
+        TInt GetStatus();
+
+    private:
+    
+        /** 
+         * Default constructor.
+         * 
+         * @param aType
+         */
+        CMCSExampleWatcher();
+
+        /** 
+         * ConstructL
+         */
+        void ConstructL();
+        
+        /**
+        * Inherited from CActive class 
+        */ 
+        void RunL();
+        
+        /**
+        * Inherited from CActive class 
+        */ 
+        void DoCancel();
+    
+    private:
+        
+        /** 
+         * Menu operation
+         * Owned
+         */
+        CMenuOperation* iOperation; 
+        CMCSExampleAppView* iObserver;
+    };
+
+#endif /*__MCSPLUGINWATCHER_H*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/sis/MCSExample_S60_3_X_v_1_0_0.pkg	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,37 @@
+; Installation file for MCSExample application
+;
+; This is an auto-generated PKG file by Carbide.
+; This file uses variables specific to Carbide builds that will not work
+; on command-line builds. If you want to use this generated PKG file from the
+; command-line tools you will need to modify the variables with the appropriate
+; values: $(EPOCROOT), $(PLATFORM), $(TARGET)
+;
+;Language - standard language definitions
+&EN
+
+; standard SIS file header
+#{"MCSExample"},(0xEB753B18),1,0,0
+
+;Localised Vendor name
+%{"Vendor-EN"}
+
+;Unique Vendor name
+:"Vendor"
+
+;Supports Series 60 v 3.0
+[0x101F7961], 0, 0, 0, {"Series60ProductID"}
+
+;Files to install
+;You should change the source paths to match that of your environment
+;<source> <destination>
+"$(EPOCROOT)Epoc32\release\$(PLATFORM)\$(TARGET)\MCSExample_0xEB753B18.exe"		-"!:\sys\bin\MCSExample_0xEB753B18.exe"
+"$(EPOCROOT)Epoc32\data\z\resource\apps\MCSExample_0xEB753B18.rsc"		-"!:\resource\apps\MCSExample_0xEB753B18.rsc"
+"$(EPOCROOT)Epoc32\data\z\private\10003a3f\apps\MCSExample_0xEB753B18_reg.rsc"	-"!:\private\10003a3f\import\apps\MCSExample_0xEB753B18_reg.rsc"
+"$(EPOCROOT)Epoc32\data\z\resource\apps\MCSExample_0xEB753B18.mif" -"!:\resource\apps\MCSExample_0xEB753B18.mif"
+;"..\help\MCSExample_0xEB753B18.hlp"							 -"!:\resource\help\MCSExample_0xEB753B18.hlp"
+
+; Add any installation notes if applicable
+;"MCSExample.txt"		-"!:\private\EB753B18\MCSExample.txt"
+
+;required for application to be covered by backup/restore facility 
+"..\sis\backup_registration.xml"		-"!:\private\EB753B18\backup_registration.xml"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/sis/backup_registration.xml	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,5 @@
+<?xml version="1.0" standalone="yes"?>
+<backup_registration>
+  <system_backup/>
+  <restore requires_reboot = "no"/>
+</backup_registration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/src/MCSExample.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+// INCLUDE FILES
+#include <eikstart.h>
+#include "MCSExampleApplication.h"
+
+LOCAL_C CApaApplication* NewApplication()
+    {
+    return new CMCSExampleApplication;
+    }
+
+GLDEF_C TInt E32Main()
+    {
+    return EikStart::RunApplication(NewApplication);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/src/MCSExampleAppUi.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,169 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+// INCLUDE FILES
+#include <avkon.hrh>
+#include <aknmessagequerydialog.h>
+#include <aknnotewrappers.h>
+#include <stringloader.h>
+
+#include <MCSExample_0xEB753B18.rsg>
+#include "MCSExample.hrh"
+#include "MCSExample.pan"
+#include "MCSExampleApplication.h"
+#include "MCSExampleAppUi.h"
+#include "MCSExampleAppView.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppUi::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppUi::ConstructL()
+    {
+    // Initialise app UI with standard value.
+    BaseConstructL(CAknAppUi::EAknEnableSkin|CAknAppUi::EAknSingleClickCompatible);
+
+    // Create view object
+    iAppView = CMCSExampleAppView::NewL(ClientRect());
+    }
+// -----------------------------------------------------------------------------
+// CMCSExampleAppUi::CMCSExampleAppUi()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CMCSExampleAppUi::CMCSExampleAppUi()
+    {
+    // No implementation required
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppUi::~CMCSExampleAppUi()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CMCSExampleAppUi::~CMCSExampleAppUi()
+    {
+    if (iAppView)
+        {
+        delete iAppView;
+        iAppView = NULL;
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppUi::HandleCommandL()
+// Takes care of command handling.
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppUi::HandleCommandL(TInt aCommand)
+    {
+    switch (aCommand)
+        {
+        case EEikCmdExit:
+        case EAknSoftkeyExit:
+            Exit();
+            break;
+
+        case ECommand1:
+            {
+
+            // Load a string from the resource file and display it
+            HBufC* textResource = StringLoader::LoadLC(R_COMMAND1_TEXT);
+            CAknInformationNote* informationNote;
+
+            informationNote = new (ELeave) CAknInformationNote;
+
+            // Show the information Note with
+            // textResource loaded with StringLoader.
+            informationNote->ExecuteLD(*textResource);
+
+            // Pop HBuf from CleanUpStack and Destroy it.
+            CleanupStack::PopAndDestroy(textResource);
+            }
+            break;
+        case ECommand2:
+            {
+            iAppView->ListAllItemsL();
+            }
+            break;
+        case EHelp:
+            {
+
+            }
+            break;
+        case EAbout:
+            {
+
+            CAknMessageQueryDialog* dlg =
+                    new (ELeave) CAknMessageQueryDialog();
+            dlg->PrepareLC(R_ABOUT_QUERY_DIALOG);
+            HBufC* title = iEikonEnv->AllocReadResourceLC(
+                    R_ABOUT_DIALOG_TITLE);
+            dlg->QueryHeading()->SetTextL(*title);
+            CleanupStack::PopAndDestroy(); //title
+            HBufC* msg = iEikonEnv->AllocReadResourceLC(R_ABOUT_DIALOG_TEXT);
+            dlg->SetMessageTextL(*msg);
+            CleanupStack::PopAndDestroy(); //msg
+            dlg->RunLD();
+            }
+            break;
+        default:
+            Panic( EMCSExampleUi);
+            break;
+        }
+    }
+// -----------------------------------------------------------------------------
+//  Called by the framework when the application status pane
+//  size is changed.  Passes the new client rectangle to the
+//  AppView
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppUi::HandleStatusPaneSizeChange()
+    {
+    iAppView->SetRect(ClientRect());
+    }
+
+CArrayFix<TCoeHelpContext>* CMCSExampleAppUi::HelpContextL() const
+    {
+#warning "Please see comment about help and UID3..."
+    // Note: Help will not work if the application uid3 is not in the
+    // protected range.  The default uid3 range for projects created
+    // from this template (0xE0000000 - 0xEFFFFFFF) are not in the protected range so that they
+    // can be self signed and installed on the device during testing.
+    // Once you get your official uid3 from Symbian Ltd. and find/replace
+    // all occurrences of uid3 in your project, the context help will
+    // work. Alternatively, a patch now exists for the versions of 
+    // HTML help compiler in SDKs and can be found here along with an FAQ:
+    // http://www3.symbian.com/faq.nsf/AllByDate/E9DF3257FD565A658025733900805EA2?OpenDocument
+#ifdef _HELP_AVAILABLE_
+    CArrayFixFlat<TCoeHelpContext>* array = new(ELeave)CArrayFixFlat<TCoeHelpContext>(1);
+    CleanupStack::PushL(array);
+    array->AppendL(TCoeHelpContext(KUidMCSExampleApp, KGeneral_Information));
+    CleanupStack::Pop(array);
+    return array;
+#else
+    return NULL;
+#endif
+    }
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/src/MCSExampleAppView.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,462 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+// INCLUDE FILES
+#include <coemain.h>
+#include <mcsmenuitem.h>
+#include <mcsmenuiconutility.h>
+#include <mcsdef.h>
+#include <akniconarray.h>
+#include <eikclbd.h>
+#include <eikedwin.h>
+
+#include <aknsconstants.h>
+#include <aknsconstants.hrh>
+
+#include <MCSExample_0xEB753B18.rsg>
+#include "MCSExampleAppView.h"
+#include "mcspluginwatcher.h"
+#include "MCSExample.hrh"
+
+_LIT( KMenuData, "matrixmenudata" );
+
+CMyForm::CMyForm( TMyData& aData ) : iData( aData )
+    {
+    }
+
+CMyForm::~CMyForm()
+    {
+    }
+        
+void CMyForm::PreLayoutDynInitL()
+    {
+    CAknForm::PreLayoutDynInitL();
+    LoadFormDataL();
+    }
+
+void CMyForm::LoadFormDataL()
+    {
+    CEikEdwin* textEd1 =
+        (CEikEdwin*)Control( EMyFirstLine );
+    textEd1->SetTextL( &iData.majorID );
+    
+    CEikEdwin* textEd2 =
+        (CEikEdwin*)Control( EMySecondLine );
+    textEd2->SetTextL( &iData.minorID );
+    
+    CEikEdwin* textEd3 =
+        (CEikEdwin*)Control( EMyThirdLine );
+    textEd3->SetTextL( &iData.iconFile );
+    
+    CEikEdwin* textEd4 =
+        (CEikEdwin*)Control( EMyFourthLine );
+    textEd4->SetTextL( &iData.iconID );
+    
+    CEikEdwin* textEd5 =
+        (CEikEdwin*)Control( EMyFifthLine );
+    textEd5->SetTextL( &iData.maskID );
+    
+    CEikEdwin* textEd6 =
+        (CEikEdwin*)Control( EMySixthLine );
+    textEd6->SetTextL( &iData.statusIcon );
+    }
+
+TBool CMyForm::SaveFormDataL()
+    {
+    CEikEdwin* textEd1 =
+        (CEikEdwin*)Control( EMyFirstLine );
+    textEd1->GetText( iData.majorID );
+    
+    CEikEdwin* textEd2 =
+        (CEikEdwin*)Control( EMySecondLine );
+    textEd2->GetText( iData.minorID );
+    
+    CEikEdwin* textEd3 =
+        (CEikEdwin*)Control( EMyThirdLine );
+    textEd3->GetText( iData.iconFile );
+    
+    CEikEdwin* textEd4 =
+        (CEikEdwin*)Control( EMyFourthLine );
+    textEd4->GetText( iData.iconID );
+    
+    CEikEdwin* textEd5 =
+        (CEikEdwin*)Control( EMyFifthLine );
+    textEd5->GetText( iData.maskID );
+    
+    CEikEdwin* textEd6 =
+        (CEikEdwin*)Control( EMySixthLine );
+    textEd6->GetText( iData.statusIcon );
+    return ETrue;
+    }
+
+void CMyForm::DoNotSaveFormDataL()
+    {
+    LoadFormDataL();
+    }
+
+TBool CMyForm::OkToExitL( TInt aButtonId )
+    {
+    if ( aButtonId  == EAknSoftkeyOk)
+        {
+        SaveFormDataL();
+        iData.updated = ETrue;
+        }
+    else if( aButtonId == EAknSoftkeyCancel )
+        {
+        iData.updated = EFalse;
+        }
+    return ETrue;
+    }
+
+CGulIcon* ConvertToGulIconLC( CAknIcon* aIcon )
+    {
+    CGulIcon* icon = CGulIcon::NewL( aIcon->Bitmap(), aIcon->Mask() );
+    CleanupStack::PushL( icon );
+    // Detach bitmap and mask
+    aIcon->SetBitmap( NULL );
+    aIcon->SetMask( NULL );
+    return icon;
+    }
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMCSExampleAppView* CMCSExampleAppView::NewL(const TRect& aRect)
+    {
+    CMCSExampleAppView* self = CMCSExampleAppView::NewLC(aRect);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::NewLC()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMCSExampleAppView* CMCSExampleAppView::NewLC(const TRect& aRect)
+    {
+    CMCSExampleAppView* self = new (ELeave) CMCSExampleAppView;
+    CleanupStack::PushL(self);
+    self->ConstructL(aRect);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::ConstructL(const TRect& aRect)
+    {
+    // Create a window for this application view
+    CreateWindowL();
+
+    // Set the windows size
+    SetRect(aRect);
+
+    // Activate the window, which makes it ready to be drawn
+    ActivateL();
+    
+    iMCSMenu.OpenL( KMenuData );
+    iWatcher = CMCSExampleWatcher::NewL();
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::CMCSExampleAppView()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CMCSExampleAppView::CMCSExampleAppView()
+    {
+    // No implementation required
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::~CMCSExampleAppView()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CMCSExampleAppView::~CMCSExampleAppView()
+    {
+    iMCSMenu.Close();
+    delete iListBox;
+    iItemArray.Close();
+    delete iWatcher;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::ListAllItemsL()
+    {
+    
+
+    CArrayPtr<CGulIcon>* icons =new( ELeave ) CAknIconArray(1);
+    CleanupStack::PushL(icons);
+   
+    iListBox->Model()->SetItemTextArray(GetArrayL(icons));
+    iListBox->Model()->SetOwnershipType(ELbmOwnsItemArray);
+    //
+    // Inform the listbox of item additions. 
+    // This should be done if you want your items displayed correctly
+    iListBox ->HandleItemAdditionL();
+ 
+    CleanupStack::Pop(icons);
+    CArrayPtr<CGulIcon>* oldArray = iListBox->ItemDrawer()->ColumnData()->IconArray();
+    delete oldArray;
+    iListBox->ItemDrawer()->ColumnData()->SetIconArray(icons);
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::MakeListBoxL()
+    {
+    TInt MySetIndex(0);
+ 
+    if(iListBox)
+    {
+        MySetIndex = iListBox->CurrentItemIndex();
+    }
+ 
+    delete iListBox;
+    iListBox = NULL;
+ 
+    iListBox = new( ELeave ) CAknSingleLargeStyleListBox();
+    iListBox->ConstructL(this,EAknListBoxSelectionList);
+    iListBox->SetListBoxObserver( this );
+    
+    iListBox->CreateScrollBarFrameL( ETrue );
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+ 
+    iListBox->SetRect(Rect());
+ 
+    iListBox->View()->SetListEmptyTextL(_L("No data"));
+ 
+    iListBox->ActivateL();
+ 
+    TInt ItemsCount = iListBox->Model()->ItemTextArray()->MdcaCount();
+ 
+    if(ItemsCount > MySetIndex && MySetIndex >= 0)
+        iListBox->SetCurrentItemIndex(MySetIndex);
+    else if(ItemsCount > 0)
+        iListBox->SetCurrentItemIndex(0);
+ 
+    UpdateScrollBar(iListBox);
+    iListBox->DrawNow();
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+CDesCArray* CMCSExampleAppView::GetArrayL(CArrayPtr<CGulIcon>* aIcons)
+{   
+    TBuf<256> listString;
+    CDesCArrayFlat* myArray = new(ELeave)CDesCArrayFlat(1);
+    CleanupStack::PushL(myArray);
+ 
+    const TInt rootId = iMCSMenu. RootFolderL();
+    iItemArray.Reset();
+    //CleanupClosePushL( itemArray );
+    // Get all the items from MCS
+    iMCSMenu.GetItemsL( iItemArray, rootId, NULL, ETrue );
+
+    for( TInt i = 0; i < iItemArray.Count(); i++ )
+        {
+        // Open the actual item
+        CMenuItem* menuItem = CMenuItem::OpenL( iMCSMenu, iItemArray[i] );
+        CleanupStack::PushL( menuItem );
+        
+        // Get the name of the item
+        TBool attrExists( EFalse );
+        TPtrC attr = menuItem->GetAttributeL(_L("short_name" ), attrExists );
+
+        //Create listbox string
+        listString.Delete(0, 256);
+        listString.AppendNum( i );
+        listString.Append( _L("\t"));
+        listString.Append( attr );
+        myArray->AppendL( listString );
+        
+        //Fetch the item icon from MCS
+        CAknIcon* icon = MenuIconUtility::GetItemIconL( *menuItem );
+        CleanupStack::PushL( icon );
+        if ( icon )
+            {
+            CGulIcon* gIcon = ConvertToGulIconLC( icon );
+            aIcons->AppendL( gIcon );
+            CleanupStack::Pop( gIcon );
+            }
+        CleanupStack::PopAndDestroy( icon );
+        CleanupStack::PopAndDestroy( menuItem );
+        } 
+    CleanupStack::Pop(myArray);
+    return myArray;
+}
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::UpdateScrollBar(CEikListBox* aListBox)
+    {
+    if (aListBox)
+        {   
+        TInt pos(aListBox->View()->CurrentItemIndex());
+        if (aListBox->ScrollBarFrame())
+            {
+            aListBox->ScrollBarFrame()->MoveVertThumbTo(pos);
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::Draw()
+// Draws the display.
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::Draw(const TRect& /*aRect*/) const
+    {
+    // Get the standard graphics context
+    CWindowGc& gc = SystemGc();
+
+    // Gets the control's extent
+    TRect drawRect(Rect());
+
+    // Clears the screen
+    gc.Clear(drawRect);
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::SizeChanged()
+// Called by framework when the view size is changed.
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::SizeChanged()
+    {
+    TRAP_IGNORE( MakeListBoxL() );
+    DrawNow();
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::HandlePointerEventL()
+// Called by framework to handle pointer touch events.
+// Note: although this method is compatible with earlier SDKs, 
+// it will not be called in SDKs without Touch support.
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::HandlePointerEventL(
+        const TPointerEvent& aPointerEvent)
+    {
+
+    // Call base class HandlePointerEventL()
+    CCoeControl::HandlePointerEventL(aPointerEvent);
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::HandleListBoxEventL( CEikListBox* /*aListBox*/, TListBoxEvent aEventType )
+    {
+    if( iListBox && aEventType == EEventItemSingleClicked )
+        {
+        TInt index = iListBox->CurrentItemIndex();
+        if( index < iItemArray.Count())
+            {
+            ShowFormL( index );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::ShowFormL( TInt aItemIndex)
+    {
+    CMenuItem* menuItem = CMenuItem::OpenL( iMCSMenu, iItemArray[aItemIndex] );
+    CleanupStack::PushL( menuItem );
+    TBool attrExists( EFalse );
+    TPtrC attr = menuItem->GetAttributeL(_L("short_name" ), attrExists );
+    // Initialize  form data.
+    TBool exists( EFalse );;
+    TMyData myData;
+    myData.majorID = menuItem->GetAttributeL( KMenuAttrIconSkinMajorId, exists );
+    myData.minorID = menuItem->GetAttributeL( KMenuAttrIconSkinMinorId, exists );
+    myData.iconFile = menuItem->GetAttributeL( KMenuAttrIconFile, exists );
+    myData.iconID = menuItem->GetAttributeL( KMenuAttrIconId, exists );
+    myData.maskID = menuItem->GetAttributeL( KMenuAttrMaskId, exists );
+    // e.g. skin(0x101F86E3 0x1ee2)
+    myData.statusIcon = menuItem->GetAttributeL( _L("presenceicon"), exists );
+    myData.updated = EFalse;
+
+    // Launch the dialog to view/edit data
+    CAknForm* dlg = new ( ELeave ) CMyForm( myData );
+    CleanupStack::PushL( dlg );
+    dlg->ConstructL( 0 ); // default menu items only
+    CleanupStack::Pop( dlg );
+    dlg->ExecuteLD( R_ICON_QUERY_DIALOG );
+    // myData now contains the edited values.
+
+    if( myData.updated )
+        {
+        // Changes the main icon, if all values are empty then application icon is used.
+        // Piority 0
+        menuItem->SetAttributeL(KMenuAttrIconSkinMajorId, myData.majorID );
+        menuItem->SetAttributeL(KMenuAttrIconSkinMinorId, myData.minorID );
+        // Pririty 1
+        menuItem->SetAttributeL(KMenuAttrIconFile, myData.iconFile );
+        menuItem->SetAttributeL(KMenuAttrIconId, myData.iconID );
+        menuItem->SetAttributeL(KMenuAttrMaskId, myData.maskID );
+        //Changes the presence icon
+        menuItem->SetAttributeL( _L("presenceicon"), myData.statusIcon );
+                
+        CMenuOperation* operation = menuItem->SaveL( iWatcher->iStatus );
+        // Deletes the operation after its completion
+        iWatcher->Watch( operation, this );
+        }
+    CleanupStack::PopAndDestroy( menuItem );
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CMCSExampleAppView::ComponentControl( TInt /*aIndex*/) const
+{
+    return iListBox;
+}
+ 
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TInt CMCSExampleAppView::CountComponentControls() const
+{   
+    if(iListBox)
+        return 1;
+    else
+        return 0;
+}
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/src/MCSExampleApplication.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,47 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+// INCLUDE FILES
+#include "MCSExample.hrh"
+#include "MCSExampleDocument.h"
+#include "MCSExampleApplication.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMCSExampleApplication::CreateDocumentL()
+// Creates CApaDocument object
+// -----------------------------------------------------------------------------
+//
+CApaDocument* CMCSExampleApplication::CreateDocumentL()
+    {
+    // Create an MCSExample document, and return a pointer to it
+    return CMCSExampleDocument::NewL(*this);
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleApplication::AppDllUid()
+// Returns application UID
+// -----------------------------------------------------------------------------
+//
+TUid CMCSExampleApplication::AppDllUid() const
+    {
+    // Return the UID for the MCSExample application
+    return KUidMCSExampleApp;
+    }
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/src/MCSExampleDocument.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,93 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+// INCLUDE FILES
+#include "MCSExampleAppUi.h"
+#include "MCSExampleDocument.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMCSExampleDocument::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMCSExampleDocument* CMCSExampleDocument::NewL(CEikApplication& aApp)
+    {
+    CMCSExampleDocument* self = NewLC(aApp);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleDocument::NewLC()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMCSExampleDocument* CMCSExampleDocument::NewLC(CEikApplication& aApp)
+    {
+    CMCSExampleDocument* self = new (ELeave) CMCSExampleDocument(aApp);
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleDocument::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleDocument::ConstructL()
+    {
+    // No implementation required
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleDocument::CMCSExampleDocument()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CMCSExampleDocument::CMCSExampleDocument(CEikApplication& aApp) :
+    CAknDocument(aApp)
+    {
+    // No implementation required
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSExampleDocument::~CMCSExampleDocument()
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CMCSExampleDocument::~CMCSExampleDocument()
+    {
+    // No implementation required
+    }
+
+// ---------------------------------------------------------------------------
+// CMCSExampleDocument::CreateAppUiL()
+// Constructs CreateAppUi.
+// ---------------------------------------------------------------------------
+//
+CEikAppUi* CMCSExampleDocument::CreateAppUiL()
+    {
+    // Create the application user interface, and return a pointer to it;
+    // the framework takes ownership of this object
+    return new (ELeave) CMCSExampleAppUi;
+    }
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/src/mcspluginwatcher.cpp	Mon Aug 02 12:02:47 2010 +0300
@@ -0,0 +1,94 @@
+/*
+* Copyright (c) 2010 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:  Menu item operation watcher. 
+*
+*/
+
+#include <mcsmenuoperation.h>
+#include "mcspluginwatcher.h"
+#include "MCSExampleAppView.h"
+
+// ---------------------------------------------------------------------------
+// two-phased constructor
+// ---------------------------------------------------------------------------
+CMCSExampleWatcher* CMCSExampleWatcher::NewL(  )
+	{
+	CMCSExampleWatcher* self = new (ELeave) CMCSExampleWatcher(  );
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop( self );
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// default constructor
+// ---------------------------------------------------------------------------
+CMCSExampleWatcher::CMCSExampleWatcher(  )
+	: CActive( CActive::EPriorityStandard )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// ---------------------------------------------------------------------------
+// destructor
+// ---------------------------------------------------------------------------
+CMCSExampleWatcher::~CMCSExampleWatcher()
+    {
+    Cancel();
+    }
+
+// ---------------------------------------------------------------------------
+// second phase constructor
+// ---------------------------------------------------------------------------
+void CMCSExampleWatcher::ConstructL()
+	{
+	
+	}
+
+// ---------------------------------------------------------------------------
+// Watch  Async
+// ---------------------------------------------------------------------------
+void CMCSExampleWatcher::Watch( CMenuOperation* aOperation, CMCSExampleAppView* aObserver )
+    {
+    iObserver = aObserver;
+    __ASSERT_DEBUG( KRequestPending == iStatus.Int(), User::Invariant() );
+    //__ASSERT_DEBUG( !iOperation, User::Invariant() ); 
+    iOperation = aOperation;
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+// Inherited from CActive class 
+// ---------------------------------------------------------------------------
+void CMCSExampleWatcher::RunL()
+    {
+    iObserver->ListAllItemsL();
+    delete iOperation;
+    iOperation = NULL;  
+    }
+
+// ---------------------------------------------------------------------------
+// Inherited from CActive class 
+// ---------------------------------------------------------------------------
+void CMCSExampleWatcher::DoCancel()
+    {
+    delete iOperation;
+    iOperation = NULL;
+    }
+
+TInt CMCSExampleWatcher::GetStatus()
+    {
+    return iStatus.Int();
+    }
+