--- /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