diff -r f72a12da539e -r 5315654608de idlehomescreen/widgetmanager/src/wmwidgetloaderao.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/widgetmanager/src/wmwidgetloaderao.cpp Thu Jan 07 12:39:41 2010 +0200 @@ -0,0 +1,271 @@ +/* +* 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: +* Active object to load widgets into list +* +*/ + +// INCLUDE FILES +#include "wmcommon.h" +#include "wmplugin.h" +#include "wmresourceloader.h" +#include "wmpersistentwidgetorder.h" +#include "wmlistbox.h" +#include "wmwidgetloaderao.h" + +#include // content control api +#include // content control api +#include // widget reqistry +#include // avkon resources +#include // TResourceReader + +// --------------------------------------------------------------------------- +// CWmWidgetLoaderAo::NewL +// --------------------------------------------------------------------------- +// +CWmWidgetLoaderAo* CWmWidgetLoaderAo::NewL( + CWmPlugin& aWmPlugin, + CWmListBox& aTargetList ) + { + CWmWidgetLoaderAo* self = new (ELeave) CWmWidgetLoaderAo( + aWmPlugin, aTargetList ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CWmWidgetLoaderAo::NewL +// --------------------------------------------------------------------------- +// +CWmWidgetLoaderAo::CWmWidgetLoaderAo( + CWmPlugin& aWmPlugin, + CWmListBox& aTargetList ) + : CAsyncOneShot( EPriorityStandard ) + , iWmPlugin( aWmPlugin ) + , iWidgetsList( aTargetList ) + { + iWidgetRegistry = NULL; + iWidgetOrder = NULL; + } + +// --------------------------------------------------------------------------- +// CWmWidgetLoaderAo::ConstructL +// --------------------------------------------------------------------------- +// +void CWmWidgetLoaderAo::ConstructL() + { + } + +// --------------------------------------------------------------------------- +// CWmWidgetLoaderAo::~CWmWidgetLoaderAo +// --------------------------------------------------------------------------- +// +CWmWidgetLoaderAo::~CWmWidgetLoaderAo() + { + // cancel ongoing operation + Cancel(); + + // cleanup run data + Cleanup(); + + } + +// --------------------------------------------------------------------------- +// CWmWidgetLoaderAo::StartLoading +// --------------------------------------------------------------------------- +// +void CWmWidgetLoaderAo::StartLoading() + { + if ( IsActive() ) + { + // cancel ongoing process + Cancel(); + } + Call(); + } + +// --------------------------------------------------------------------------- +// CWmWidgetLoaderAo::RunL +// --------------------------------------------------------------------------- +// +void CWmWidgetLoaderAo::RunL() + { + DoLoadWidgetsL(); + Cleanup(); + } + +// --------------------------------------------------------------------------- +// CWmWidgetLoaderAo::RunError +// --------------------------------------------------------------------------- +// +TInt CWmWidgetLoaderAo::RunError( TInt /*aError*/ ) + { + Cleanup(); + return KErrNone; + } + +// --------------------------------------------------------- +// CWmWidgetLoaderAo::DoLoadWidgetsL +// --------------------------------------------------------- +// +void CWmWidgetLoaderAo::DoLoadWidgetsL() + { + // 1. mark all the existing widgets initially non-valid + for( TInt i=0; iLoadL() ); + + // 4. loop through the content array and compare it against the existing + // widget data. + TInt widgetsAdded = 0; + TInt widgetsChanged = 0; + while( contentInfoArray->Array().Count() > 0 ) + { + CHsContentInfo* contentInfo = contentInfoArray->Array()[0]; + contentInfoArray->Array().Remove( 0 ); + + // check if this widget exists. + // if it does, keep the existing one + // if it does not, add it + CWmWidgetData* existingData = FindWidgetData( *contentInfo ); + if ( existingData ) + { + // update existing widget data + existingData->SetValid( ETrue ); + if ( existingData->ReplaceContentInfoL( contentInfo ) ) + { + ++widgetsChanged; + } + } + else + { + // add a new widget data + AddWidgetDataL( contentInfo ); + ++widgetsAdded; + } + } + + // 5: finally, remove all UI widgets that during the loading process were + // NOT marked as VALID. those widgets do not exist anymore. + TInt widgetsRemoved = 0; + for( TInt i=0; i 0 ) + { + iWidgetsList.DrawDeferred(); + } + + // 6: cleanup + CleanupStack::PopAndDestroy( contentInfoArray ); + + // 7. check list empty condition + if ( iWidgetsList.WidgetDataCount() == 0 ) + { + TResourceReader rr; + CEikonEnv::Static()->CreateResourceReaderLC( + rr, R_AVKON_LISTBOX_DEFAULT_EMPTY_TEXT ); + TPtrC empty= rr.ReadTPtrC(); + iWidgetsList.View()->SetListEmptyTextL( empty ); + CleanupStack::PopAndDestroy(); + iWidgetsList.DrawDeferred(); + } + + // 8. store list order if necessary + if ( loadError != KErrNone || widgetsAdded > 0 || widgetsRemoved > 0 ) + { + iWidgetOrder->StoreL( iWidgetsList.WidgetDataArray() ); + } + + } + +// --------------------------------------------------------- +// CWmWidgetLoaderAo::FindWidgetDataL +// --------------------------------------------------------- +// +CWmWidgetData* CWmWidgetLoaderAo::FindWidgetData( + CHsContentInfo& aContentInfo ) + { + CWmWidgetData* data = NULL; + for( TInt i=0; iConnect() ); + } + CleanupStack::Pop( aContentInfo ); + + CWmWidgetData* widgetData = CWmWidgetData::NewLC( + aContentInfo, iWidgetRegistry ); + widgetData->SetPersistentWidgetOrder( iWidgetOrder ); + widgetData->SetValid( ETrue ); + iWidgetsList.AddWidgetDataL( widgetData ); + CleanupStack::Pop( widgetData ); + } + +// --------------------------------------------------------------------------- +// CWmWidgetLoaderAo::Cleanup +// --------------------------------------------------------------------------- +// +void CWmWidgetLoaderAo::Cleanup() + { + // disconnect widget registry + if ( iWidgetRegistry ) + { + iWidgetRegistry->Disconnect(); + iWidgetRegistry->Close(); + delete iWidgetRegistry; + iWidgetRegistry = NULL; + } + + // delete widget order + delete iWidgetOrder; + iWidgetOrder = NULL; + } + +// end of file +