idlehomescreen/examples/hscontentcontrolexample/src/HsContentControlListBox.cpp
branchRCL_3
changeset 35 3321d3e205b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/hscontentcontrolexample/src/HsContentControlListBox.cpp	Tue Sep 14 20:58:58 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