--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/viewframework/dataprovider/src/glxcontainerlistbinding.cpp Thu Dec 17 08:45:44 2009 +0200
@@ -0,0 +1,303 @@
+/*
+* Copyright (c) 2008-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: CGlxContainerListBinding This class holds the list of
+* tags/albums associated with a media item
+*
+*/
+
+
+
+
+#include "glxcontainerlistbinding.h" // his class holds the list of tags/albums associated with a media item
+
+#include <glxfilterfactory.h> // for TGlxFilterFactory
+#include <glxuistd.h> // for attribute priority
+#include <mul/mulvisualitem.h> // Client need to use this class to add data in data model
+
+using namespace Alf;
+
+//CONSTANTS
+const TInt KTagMediaListId = 0x2000D248;
+const TInt KRangeOffset = 50;
+
+// ----------------------------------------------------------------------------
+// NewL
+// ----------------------------------------------------------------------------
+//
+CGlxContainerListBinding* CGlxContainerListBinding::NewL( const Alf::mulvisualitem::TVisualAttribute& aMulTag /*const char* const
+ aMulTag*/, const CMPXCollectionPath& aPath )
+ {
+ CGlxContainerListBinding* self = CGlxContainerListBinding::NewLC( aMulTag, aPath);
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ----------------------------------------------------------------------------
+// NewLC
+// ----------------------------------------------------------------------------
+//
+CGlxContainerListBinding* CGlxContainerListBinding::NewLC( const Alf::mulvisualitem::TVisualAttribute& aMulTag /*const char* const
+ aMulTag*/, const CMPXCollectionPath& aPath )
+ {
+ CGlxContainerListBinding* self = new ( ELeave ) CGlxContainerListBinding();
+ CleanupStack::PushL( self );
+ self->ConstructL( aMulTag, aPath );
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// ConstructL
+// ----------------------------------------------------------------------------
+//
+void CGlxContainerListBinding::ConstructL( const Alf::mulvisualitem::TVisualAttribute& aMulTag /*const char* const aMulTag*/,
+ const CMPXCollectionPath& aPath )
+ {
+ CGlxSingleTagBinding::BaseConstructL( aMulTag );
+ iContainerPath = CMPXCollectionPath::NewL( aPath );
+
+ // attributes for Title of tags and albums
+ iFetchContext = CGlxDefaultAttributeContext::NewL();
+ iFetchContext->AddAttributeL( KMPXMediaGeneralTitle );
+ iFetchContext->SetRangeOffsets(KRangeOffset,KRangeOffset);
+ }
+
+// ----------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+//
+CGlxContainerListBinding::~CGlxContainerListBinding()
+ {
+ CloseMediaList();
+ }
+
+// ---------------------------------------------------------------------------
+// PopulateT
+// ---------------------------------------------------------------------------
+//
+void CGlxContainerListBinding::PopulateT( Alf::MulVisualItem& aItem,
+ const TGlxMedia& aMedia, TBool /*aIsFocused*/ ) const
+ {
+ const TInt KCommaLength = 2;
+ _LIT(KComma,",");
+
+ //T is used for throws as per C++ standard.Hence used instead of "L"
+ //Ignoring this for code scanner warnings - Leaving functions called in non-leaving functions.
+
+ if(!iContainerList)
+ {
+ CreateMediaListL( aMedia.Id() );
+ }
+
+ if( iContainerList )
+ {
+ CGlxUStringConverter* stringConverter = CGlxUStringConverter::NewL();
+ CleanupStack::PushL(stringConverter );
+
+ TInt tagListcount = iContainerList->Count();
+ //if tags count is grater than 1 then display tags saperated by comma
+ if( tagListcount > 0 )
+ {
+ HBufC* stringBuffer = NULL;
+
+ for(TInt i=0; i < tagListcount; i++ )
+ {
+ HBufC* string = NULL;
+ stringConverter->AsStringL( iContainerList->Item(i),
+ KMPXMediaGeneralTitle, NULL, string );
+ if( string )
+ {
+ if( stringBuffer )
+ {
+ stringBuffer = stringBuffer->ReAlloc( stringBuffer->Length() + string->Length() );
+ stringBuffer->Des().Append ( string->Des() );
+ }
+
+ if( !stringBuffer )
+ {
+ stringBuffer = string->Alloc();
+ }
+
+ delete string;
+ string = NULL;
+ }
+ if( i < tagListcount -1 )
+ {
+ if( stringBuffer )
+ {
+ stringBuffer = stringBuffer->ReAlloc( stringBuffer->Length() + KCommaLength );
+ stringBuffer->Des().Append( KComma );
+ }
+ }
+ }
+
+ if( stringBuffer )
+ {
+ aItem.SetAttribute( MulTag(), *stringBuffer );
+ delete stringBuffer;
+ stringBuffer = NULL;
+ }
+ }
+ else
+ {
+ aItem.SetAttribute( MulTag(), _L("") );
+ }
+ CleanupStack::PopAndDestroy(stringConverter );
+ }
+
+}
+// ---------------------------------------------------------------------------
+// CreateMediaListL
+// ---------------------------------------------------------------------------
+//
+void CGlxContainerListBinding::CreateMediaListL(TGlxMediaId aMediaId) const
+ {
+ //create filter that excludes all containers that do not contain the specified item
+ CMPXFilter* itemFilter = TGlxFilterFactory::CreateExcludeContainersWithoutItemFilterL( aMediaId );
+ CleanupStack::PushL(itemFilter);
+
+ TGlxFilterProperties filterProperty;
+ filterProperty.iSortOrder = EGlxFilterSortOrderAlphabetical;
+ filterProperty.iSortDirection = EGlxFilterSortDirectionAscending;
+ //creates a combined filter, items will be sorted by the filters specified
+ CMPXFilter* filter = TGlxFilterFactory::CreateCombinedFilterL( filterProperty,
+ itemFilter, EFalse);
+ CleanupStack::PushL(filter);
+ //create media list
+ iContainerList = MGlxMediaList::InstanceL( *iContainerPath, TGlxHierarchyId(KTagMediaListId), filter );
+ iContainerList->AddContextL( iFetchContext, KGlxFetchContextPriorityNormal );
+ iContainerList->AddMediaListObserverL( const_cast<CGlxContainerListBinding*>(this));
+ CleanupStack::PopAndDestroy(filter);
+ CleanupStack::PopAndDestroy(itemFilter);
+ }
+// ---------------------------------------------------------------------------
+// CloseMediaListL
+// ---------------------------------------------------------------------------
+//
+void CGlxContainerListBinding::CloseMediaList()
+ {
+ if(iContainerList)
+ {
+ iContainerList->RemoveMediaListObserver( this );
+ if (iFetchContext)
+ {
+ iContainerList->RemoveContext( iFetchContext );
+ delete iFetchContext;
+ iFetchContext = NULL;
+ }
+ iContainerList->Close();
+ }
+ if (iContainerPath)
+ {
+ delete iContainerPath;
+ iContainerPath= NULL;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// HandleItemAddedL
+// ---------------------------------------------------------------------------
+//
+void CGlxContainerListBinding::HandleItemAddedL( TInt /*aStartIndex*/, TInt /*aEndIndex*/,
+ MGlxMediaList* /*aList*/ )
+ {
+ //No implementation
+ }
+
+// ---------------------------------------------------------------------------
+// HandleItemRemovedL
+// ---------------------------------------------------------------------------
+//
+void CGlxContainerListBinding::HandleItemRemovedL( TInt /*aStartIndex*/,
+ TInt /*aEndIndex*/, MGlxMediaList* /*aList*/ )
+ {
+ //No implementation
+ }
+
+// ---------------------------------------------------------------------------
+// HandleAttributesAvailableL
+// ---------------------------------------------------------------------------
+//
+void CGlxContainerListBinding::HandleAttributesAvailableL( TInt /*aItemIndex*/,
+ const RArray<TMPXAttribute>& /*aAttributes*/, MGlxMediaList* aList )
+ {
+ if( aList == iContainerList )
+ {
+ Update();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// HandleFocusChanged
+// checks whether the focus has changed,returns the response status
+// ----------------------------------------------------------------------------
+//
+CGlxBinding::TResponse CGlxContainerListBinding::HandleFocusChanged(
+ TBool /*aIsGained*/ )
+ {
+ //@todo - Need further implementation
+ //return aIsGained ? EUpdateRequested : ENoUpdateNeeded ;
+ //need to remove once bug ESPK-7G6GJX is fixed
+ return ENoUpdateNeeded ;
+ }
+
+// ---------------------------------------------------------------------------
+// HandleFocusChangedL
+// ---------------------------------------------------------------------------
+//
+void CGlxContainerListBinding::HandleFocusChangedL( NGlxListDefs::TFocusChangeType /*aType*/,
+ TInt /*aNewIndex*/, TInt /*aOldIndex*/, MGlxMediaList* /*aList*/ )
+ {
+ //No implementation
+ }
+
+// ---------------------------------------------------------------------------
+// HandleItemSelectedL
+// ---------------------------------------------------------------------------
+//
+void CGlxContainerListBinding::HandleItemSelectedL(TInt /*aIndex*/,
+ TBool /*aSelected*/, MGlxMediaList* /*aList*/ )
+ {
+ //No implementation
+ }
+
+// ---------------------------------------------------------------------------
+// HandleMessageL
+// ---------------------------------------------------------------------------
+//
+void CGlxContainerListBinding::HandleMessageL( const CMPXMessage& /*aMessage*/,
+ MGlxMediaList* /*aList*/ )
+ {
+ //No implementation
+ }
+
+// ---------------------------------------------------------------------------
+// HandleMediaL
+// ---------------------------------------------------------------------------
+//
+void CGlxContainerListBinding::HandleMediaL( TInt /*aListIndex*/,
+ MGlxMediaList* /*aList*/ )
+ {
+ //No implementation
+ }
+
+// ---------------------------------------------------------------------------
+// HandleItemModifiedL
+// ---------------------------------------------------------------------------
+//
+void CGlxContainerListBinding::HandleItemModifiedL( const RArray<TInt>& /*aItemIndexes*/,
+ MGlxMediaList* /*aList*/ )
+ {
+ //No implementation
+ }