diff -r 000000000000 -r 3ce708148e4d devicediagnostics/devdiagapp/src/devdiagsuitecontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devicediagnostics/devdiagapp/src/devdiagsuitecontainer.cpp Thu Dec 17 08:40:12 2009 +0200 @@ -0,0 +1,440 @@ +/* +* Copyright (c) 2007-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Main container that displayes suites. +* +*/ + + +// INCLUDE FILES + +#include "devdiagsuitecontainer.h" +#include "devdiagengine.h" + +#include +#include +#include +#include +#include +#include // CAknIconArray +#include // AknIconUtils +#include // CGulIcon + +#include // CColumnListBoxData +#include +#include +#include + +///@@@KSR: changes for BAD Warnings - KNSmlTab" was declared but never referenced +//_LIT( KNSmlTab, "\t" ); +_LIT( KListSuiteElementFormat, "%d\t%S" ); + +const TInt KIconArrayGranularity(5); + +// ========================== MEMBER FUNCTIONS ================================= + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CDevDiagSuiteContainer* CDevDiagSuiteContainer::NewL( CDevDiagSuiteView* aView, + CDevDiagEngine& aEngine, + const TRect& aRect ) + { + CDevDiagSuiteContainer* self = new( ELeave ) + CDevDiagSuiteContainer( aView, aEngine ); + + CleanupStack::PushL( self ); + self->ConstructL( aRect ); + CleanupStack::Pop(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::CDevDiagSuiteContainer +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CDevDiagSuiteContainer::CDevDiagSuiteContainer( CDevDiagSuiteView* aView, + CDevDiagEngine& aEngine ) + : iView( aView ), iEngine(aEngine) + { + } + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CDevDiagSuiteContainer::ConstructL( const TRect& aRect ) + { + CreateWindowL(); + + iListBox = new ( ELeave ) CAknSingleLargeStyleListBox; + + iListBox->SetContainerWindowL( *this ); + iListBox->ConstructL( this, EAknListBoxSelectionList ); + + iListBox->CreateScrollBarFrameL( ETrue ); + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto ); + + CArrayPtr< CGulIcon >* icons = new ( ELeave ) CAknIconArray( + KIconArrayGranularity ); + + iListBox->ItemDrawer()->ColumnData()->SetIconArray( icons ); + + iListBox->UpdateScrollBarsL(); + //iListBox->ScrollBarFrame()->MoveVertThumbTo( 0 ); + + iListBox->SetListBoxObserver( this ); + + SetRect( aRect ); + ActivateL(); + } + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::~CDevDiagSuiteContainer +// ----------------------------------------------------------------------------- +// +CDevDiagSuiteContainer::~CDevDiagSuiteContainer() + { + delete iListBox; + + //iChildren.ResetAndDestroy(); + iChildren.Close(); + } + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::SizeChanged +// ----------------------------------------------------------------------------- +// +void CDevDiagSuiteContainer::SizeChanged() + { + iListBox->SetRect( Rect() ); // Mandatory, otherwise not drawn + } + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::HandleResourceChange +// ----------------------------------------------------------------------------- +// +void CDevDiagSuiteContainer::HandleResourceChange( TInt aType ) + { + CCoeControl::HandleResourceChange( aType ); + + //Handle change in layout orientation + if ( aType == KEikDynamicLayoutVariantSwitch || aType == KAknsMessageSkinChange ) + { + if ( aType == KAknsMessageSkinChange ) + { + // Skin changed; we'll have to reload the icon array + CArrayPtr* iconArray = + iListBox->ItemDrawer()->ColumnData()->IconArray(); + if ( iconArray ) + { + iconArray->ResetAndDestroy(); + delete iconArray; + iconArray = NULL; + } + TRAP_IGNORE( AddIconsL() ); + } + + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect ); + SetRect( mainPaneRect ); + DrawDeferred(); + } + } + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::CountComponentControls +// ----------------------------------------------------------------------------- +// +TInt CDevDiagSuiteContainer::CountComponentControls() const + { + TInt retval( 0 ); + if ( iListBox ) + { + retval = 1; + } + return retval; // return nbr of controls inside this container + } + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::ComponentControl +// ----------------------------------------------------------------------------- +// +CCoeControl* CDevDiagSuiteContainer::ComponentControl( TInt aIndex ) const + { + switch ( aIndex ) + { + case 0: + { + return iListBox; + } + default: + { + return NULL; + } + } + } + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::Draw +// ----------------------------------------------------------------------------- +// +void CDevDiagSuiteContainer::Draw( const TRect& /* aRect */ ) const + { + } + + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::HandleControlEventL +// ----------------------------------------------------------------------------- +// + +void CDevDiagSuiteContainer::HandleControlEventL( CCoeControl* /* aControl */, + TCoeEvent /* aEventType */ ) + { + } + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::OfferKeyEventL +// ----------------------------------------------------------------------------- +// + +TKeyResponse CDevDiagSuiteContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + + if ( iListBox && aType == EEventKey ) + { + switch ( aKeyEvent.iCode ) + { + case EStdKeyHome: + { + break; + } + + case EKeyEscape: + { + + iAvkonAppUi->ProcessCommandL( EEikCmdExit ); + + break; + } + case EKeyUpArrow: + case EKeyDownArrow: + { + TKeyResponse retVal = + iListBox->OfferKeyEventL( aKeyEvent, aType ); + return retVal; + } + case EKeyLeftArrow: + case EKeyRightArrow: + { + break; // AppUi handles the tab changes + } + default: + { + return iListBox->OfferKeyEventL( aKeyEvent, aType ); + } + } + } + + return EKeyWasNotConsumed; + } + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::HandleListBoxEventL +// ----------------------------------------------------------------------------- +// +void CDevDiagSuiteContainer::HandleListBoxEventL( CEikListBox* /*aListBox*/, + TListBoxEvent aEventType ) + { + // if the Select Key has been pressed + if ((aEventType == MEikListBoxObserver::EEventEnterKeyPressed) || + (aEventType == MEikListBoxObserver::EEventItemClicked)) + { + + } + } + + +#ifdef __SERIES60_HELP +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::GetHelpContext +// ----------------------------------------------------------------------------- +// +void CDevDiagSuiteContainer::GetHelpContext( TCoeHelpContext& /*aContext*/ ) const + { + //aContext.iMajor = KUidSmlSyncApp; + //aContext.iContext = KDM_HLP_DIAGNOSTICS_APPLICATION; + } + +#else + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::GetHelpContext +// ----------------------------------------------------------------------------- +// +void CDevDiagSuiteContainer::GetHelpContext( TCoeHelpContext& /*aContext*/ ) const + { + } +#endif // __SERIES60_HELP + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::FocusChanged +// ----------------------------------------------------------------------------- +// +void CDevDiagSuiteContainer::FocusChanged( TDrawNow /*aDrawNow*/ ) + { + if ( iListBox ) + { + iListBox->SetFocus( IsFocused() ); + } + } + +// ----------------------------------------------------------------------------- +// Display a group of plug-ins that are under the parent suite. +// ----------------------------------------------------------------------------- +// +void CDevDiagSuiteContainer::DisplayChildrenL( TUid aParentUid ) + { + iListBox->Model()->SetOwnershipType( ELbmOwnsItemArray ); + + // Add listbox items. + CDesCArray* pluginTextArray = static_cast< CDesCArray* >( + iListBox->Model()->ItemTextArray() ); + pluginTextArray->Reset(); + + // Get the root suite. + MDiagPlugin* plugin; + HBufC* formattedName = NULL; + if ( iEngine.PluginPool().FindPlugin( aParentUid, plugin ) == KErrNone ) + { + + iChildren.Reset(); //plug-ins are owned by the engine. + + MDiagSuitePlugin* suite = static_cast< MDiagSuitePlugin* >( plugin ); + suite->GetChildrenL( iChildren, MDiagSuitePlugin::ESortByPosition ); + + AddIconsL(); //Update icon array to match texts + + for ( TInt j = 0; j < iChildren.Count(); j++ ) + { + HBufC* name = iChildren[j]->GetPluginNameL( + MDiagPlugin::ENameLayoutListSingle ); + CleanupStack::PushL( name ); + + formattedName = HBufC::NewLC( name->Length() + + KListSuiteElementFormat().Length() ); + formattedName->Des().Format( KListSuiteElementFormat(), j ,name ); + + pluginTextArray->AppendL( *formattedName ); + + CleanupStack::PopAndDestroy( formattedName ); + CleanupStack::PopAndDestroy( name ); + } + + iListBox->SetFocus( ETrue ); + iListBox->HandleItemAdditionL(); + iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue ); + iListBox->DrawDeferred(); + } + else + { + User::Leave(KErrNotFound); + } + } + + +// ----------------------------------------------------------------------------- +// Append aPlugin name onto the listbox. +// ----------------------------------------------------------------------------- +// +void CDevDiagSuiteContainer::DisplayPluginL( MDiagPlugin* aPlugin ) + { + iListBox->Model()->SetOwnershipType( ELbmOwnsItemArray ); + + // Add listbox items. + CDesCArray* pluginTextArray = static_cast< CDesCArray* >( + iListBox->Model()->ItemTextArray() ); + + iChildren.Append( aPlugin ); + + HBufC* name = aPlugin->GetPluginNameL( + MDiagPlugin::ENameLayoutListSingle ); + CleanupStack::PushL( name ); + + CArrayPtr< CGulIcon >* icons = + iListBox->ItemDrawer()->ColumnData()->IconArray(); + + icons->AppendL( aPlugin->CreateIconL() ); + + HBufC* formattedName = HBufC::NewLC( name->Length() + + KListSuiteElementFormat().Length() ); + formattedName->Des().Format( KListSuiteElementFormat(), (iChildren.Count() -1), name ); + + pluginTextArray->AppendL( *formattedName ); + + CleanupStack::PopAndDestroy( formattedName ); + CleanupStack::PopAndDestroy( name ); + + iListBox->SetFocus( ETrue ); + iListBox->HandleItemAdditionL(); + iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue ); + iListBox->DrawDeferred(); + } + +// ----------------------------------------------------------------------------- +// Returns currently selected plug-in. +// ----------------------------------------------------------------------------- +// +void CDevDiagSuiteContainer::SelectedPlugin(MDiagPlugin*& aPlugin) const + { + aPlugin = iChildren[ iListBox->CurrentItemIndex() ]; + } + +// ----------------------------------------------------------------------------- +// CDevDiagSuiteContainer::AddIconsL +// ----------------------------------------------------------------------------- +// +void CDevDiagSuiteContainer::AddIconsL() + { + CArrayPtr* icons = NULL; + + if ( !iListBox->ItemDrawer()->ColumnData()->IconArray() ) + { + icons = new (ELeave) CArrayPtrFlat(KIconArrayGranularity); + iListBox->ItemDrawer()->ColumnData()->SetIconArray( icons ); + } + else + { + icons = iListBox->ItemDrawer()->ColumnData()->IconArray(); + } + + for ( TInt i = 0; i < iChildren.Count(); ++i ) + { + icons->AppendL( iChildren[i]->CreateIconL( )); + } + } + + + + +// End of File