photosgallery/viewframework/dataprovider/src/glxdetailsmulmodelproviderimpl.cpp
changeset 0 4e91876724a2
child 18 bcb43dc84c44
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/viewframework/dataprovider/src/glxdetailsmulmodelproviderimpl.cpp	Thu Dec 17 08:45:44 2009 +0200
@@ -0,0 +1,400 @@
+/*
+* 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:    Implementation class for details data provider
+*
+*/
+
+
+
+
+#include "glxdetailsmulmodelproviderimpl.h"   // This is the implementation class of details data provider 
+#include "glxattributerequirement.h"          // This class will set the required attribute to the medialist
+#include "glxbindingset.h"                    // This basically holds the bindings required to populate the visual item
+#include "glxbinding.h"                       // This class holds the bindings required to populate the visual item
+#include "glxmulbindingsetfactory.h"          // CreateBindingSetL creates instance of Binding set
+#include <mglxmedialist.h>                    // Interface for reading lists of media items
+#include <glxlog.h>                           // Logging
+#include <glxtracer.h>
+#include <eikmenup.h>                         // A helper class for extending CEikMenuPaneItem without breaking binary  
+#include <glxuistd.h>                         // attribute/thumbnail fetch context priority definitions
+#include "glxdetailsboundcommand.h"           // Handles user commands
+#include "glxerrormanager.h"                       // for handling the error attribute that may be attached to items
+#include "glxthumbnailattributeinfo.h"
+#include "glxdetailsboundcommand.hrh" 
+/** Error Id EMPY-7MKDHP **/
+#include "mglxmetadatadialogobserver.h" 		//for call back to dailog
+#include <glxcommandhandlers.hrh>
+using namespace Alf;
+
+// ----------------------------------------------------------------------------
+// NewL
+// ----------------------------------------------------------------------------
+//
+CGlxDetailsMulModelProviderImpl* CGlxDetailsMulModelProviderImpl::NewL(
+     CAlfEnv& aEnv, 
+     Alf::IMulWidget& aWidget, 
+     MGlxMediaList& aMediaList, 
+     Alf::mulwidget::TLogicalTemplate aDefaultTemplate, 
+     TInt aDataWindowSize )
+  	{
+  	TRACER("CGlxDetailsMulModelProviderImpl::NewL");
+  	CGlxDetailsMulModelProviderImpl* self = new ( ELeave )CGlxDetailsMulModelProviderImpl( aWidget, aMediaList, aDefaultTemplate, aDataWindowSize);
+  	CleanupStack::PushL( self );
+  	self->ConstructL( aEnv, aDefaultTemplate, aDataWindowSize );
+  	CleanupStack::Pop( self );
+  	return self;
+  	}
+  	
+// ----------------------------------------------------------------------------
+// ConstructL
+// ----------------------------------------------------------------------------
+//  	
+void CGlxDetailsMulModelProviderImpl::ConstructL(
+    CAlfEnv& aEnv, 
+    Alf::mulwidget::TLogicalTemplate aDefaultTemplate,
+    TInt aDataWindowSize )
+    {
+    TRACER("CGlxDetailsMulModelProviderImpl::ConstructL");
+    BaseConstructL( aEnv, aDefaultTemplate, aDataWindowSize );
+    iMediaList.AddMediaListObserverL(this);
+   	iAttributeRequirements = CGlxAttributeRequirements::NewL( iMediaList );
+   	AddWidgetEventHandler();
+    }
+// ----------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+//	            	
+CGlxDetailsMulModelProviderImpl::~CGlxDetailsMulModelProviderImpl()
+	{
+	TRACER("CGlxDetailsMulModelProviderImpl::~CGlxDetailsMulModelProviderImpl");
+    iEntries.ResetAndDestroy();
+	iEntries.Close();
+	iMediaList.RemoveMediaListObserver( this );
+	delete 	iAttributeRequirements;				
+	}
+
+// ----------------------------------------------------------------------------
+// AddEntryL
+// ----------------------------------------------------------------------------
+//	    					
+void CGlxDetailsMulModelProviderImpl::AddEntryL( const TGlxMulBindingSetFactory& aFactory )
+	{
+	TRACER("CGlxDetailsMulModelProviderImpl::AddEntryL");
+	CGlxBindingSet* bindingSet = aFactory.CreateBindingSetL( *this );
+	CleanupStack::PushL( bindingSet);
+	iEntries.Append( bindingSet );
+	CleanupStack::Pop( bindingSet );
+    TSize Size;
+    bindingSet->AddRequirementsL(*iAttributeRequirements,Size);
+	InsertItemsL( iEntries.Count() - 1, 1 );
+	}
+					
+// ----------------------------------------------------------------------------
+// OfferCommandL
+// ----------------------------------------------------------------------------
+//	    					
+TBool CGlxDetailsMulModelProviderImpl::OfferCommandL( TInt aCommandId )
+	{
+	TRACER("CGlxDetailsMulModelProviderImpl::OfferCommandL");
+	MGlxBoundCommand* command = BoundCommand( FocusIndex() );
+    if ( command ) 
+        {
+        return command->OfferCommandL( aCommandId , iMediaList );
+        }
+    return EFalse;				
+	}
+
+// ----------------------------------------------------------------------------
+// HasCommandL
+// ----------------------------------------------------------------------------
+//
+TBool CGlxDetailsMulModelProviderImpl::HasCommandL( CEikMenuPane& aMenuPane, const TInt aCommandId )
+    {
+    TRACER("CGlxDetailsMulModelProviderImpl::HasCommandL");
+    TInt count = aMenuPane.NumberOfItemsInPane();
+    TInt i = -1;
+    while ( ++i < count )
+        {
+        if ( aCommandId == aMenuPane.ItemDataByIndexL( i ).iCommandId )
+            {
+            return ETrue;
+            }
+        }
+    return EFalse; 
+    }
+// ----------------------------------------------------------------------------
+// InitMenuL
+// ----------------------------------------------------------------------------
+//	    					
+void CGlxDetailsMulModelProviderImpl::InitMenuL( CEikMenuPane& aMenu )
+	{
+	TRACER("CGlxDetailsMulModelProviderImpl::InitMenuL");
+	//CEikMenuPane::SetItemDimmed will panic if the menu item does not exist
+ 	if ( HasCommandL( aMenu, KGlxEditBoundMenuCommandId ) )
+		{
+		// Disable by default, bound command will enable if needed
+		aMenu.SetItemDimmed( KGlxEditBoundMenuCommandId, ETrue );
+		const MGlxBoundCommand* command = BoundCommand( FocusIndex() );
+		if ( command )
+			{
+			command->InitMenuL( aMenu );
+			}
+		}
+	else
+		{
+		// no implementation	
+		}
+	
+	
+	if ( HasCommandL( aMenu, KGlxDeleteBoundMenuCommandId ) )
+		{
+		// Disable by default, bound command will enable if needed
+		aMenu.SetItemDimmed( KGlxDeleteBoundMenuCommandId, ETrue );
+		const MGlxBoundCommand* command = BoundCommand( FocusIndex() );
+		if ( command )
+			{
+			command->InitMenuL( aMenu );
+			}
+		}
+		else
+		{
+		// no implementation	
+		}
+		
+	if ( HasCommandL( aMenu, KGlxViewBoundMenuCommandId ) )
+		{
+		// Disable by default, bound command will enable if needed
+		aMenu.SetItemDimmed( KGlxViewBoundMenuCommandId, ETrue );
+		const MGlxBoundCommand* command = BoundCommand( FocusIndex() );
+		if ( command )
+			{
+			command->InitMenuL( aMenu );
+			}
+		}
+	else
+		{
+		// no implementation	
+		}
+	if ( HasCommandL( aMenu, EGlxCmdAiwShowMap ) )
+		{
+		// Disable by default, bound command will enable if needed
+		aMenu.SetItemDimmed( EGlxCmdAiwShowMap, ETrue );
+		const MGlxBoundCommand* command = BoundCommand( FocusIndex() );
+		if ( command )
+			{
+			command->InitMenuL( aMenu );
+			}
+		}
+	else
+		{
+		// no implementation	
+		}	
+}
+
+// ----------------------------------------------------------------------------
+// CGlxDetailsMulModelProviderImpl
+// ----------------------------------------------------------------------------
+//	    					
+CGlxDetailsMulModelProviderImpl::CGlxDetailsMulModelProviderImpl(
+    Alf::IMulWidget& aWidget, 
+	MGlxMediaList& aMediaList,
+	Alf::mulwidget::TLogicalTemplate /*aDefaultTemplate*/,
+	TInt /*aDataWindowSize*/ ):
+	    CGlxMulModelProviderBase(aWidget), iMediaList( aMediaList )
+	{
+	}
+
+// ----------------------------------------------------------------------------
+// HandleBindingChanged
+// ----------------------------------------------------------------------------
+//	    					
+void CGlxDetailsMulModelProviderImpl::HandleBindingChanged( const CGlxBinding& /*aBinding*/ )
+	{
+	 for(TInt i = 0; i < iEntries.Count(); i++)
+         {
+         UpdateItems( i, 1 );
+         }
+	}
+
+// ----------------------------------------------------------------------------
+// HandleFocusChanged
+// ----------------------------------------------------------------------------
+//	    
+void CGlxDetailsMulModelProviderImpl::HandleFocusChanged( TInt aNewFocus, TInt aPreviousFocus )
+	{
+	TRACER("CGlxDetailsMulModelProviderImpl::HandleFocusChanged");
+	if ( aPreviousFocus != -1 )
+	    {
+        if ( CGlxBinding::EUpdateRequested == 
+            iEntries[ aPreviousFocus ]->HandleFocusChanged( EFalse ) )
+            {
+            UpdateItems( aPreviousFocus, 1 );
+            //UpdateItemL( *iEntries[ aPreviousFocus ], media, aPreviousFocus );
+            }
+        }
+    
+    if ( aNewFocus != -1 )
+        {
+        if ( CGlxBinding::EUpdateRequested == 
+            iEntries[ aNewFocus ]->HandleFocusChanged( ETrue ) )
+            {
+            UpdateItems( aNewFocus, 1 );
+            //UpdateItemL( *iEntries[ aNewFocus ], media, aNewFocus );
+            }
+        }
+	}
+
+// ----------------------------------------------------------------------------
+// HandleAttributesAvailableL
+// ----------------------------------------------------------------------------
+//	
+void CGlxDetailsMulModelProviderImpl::HandleAttributesAvailableL( TInt aIndex, 
+        const RArray<TMPXAttribute>& aAttributes, MGlxMediaList* aList )
+    {
+    TRACER("CGlxDetailsMulModelProviderImpl::HandleAttributesAvailableL");
+    if ( aList->FocusIndex() == aIndex )
+        {
+        for(TInt i = 0; i < iEntries.Count(); i++)
+            {
+            if(iEntries[i]->HasRelevantAttributes(aAttributes) )
+                {
+		        UpdateItems( i, 1 );
+                }
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// ProvideData
+// ----------------------------------------------------------------------------
+//
+void  CGlxDetailsMulModelProviderImpl::ProvideData (int aIndex, int aCount, 
+    MulDataPath /*aPath*/)
+    {
+    TRACER("CGlxDetailsMulModelProviderImpl::ProvideData");
+	for( int i = aIndex;i < aIndex + aCount ; i++)
+		{
+		if( KErrNotFound != iMediaList.FocusIndex())
+			{
+			SetDataT( *iEntries[ i ], iMediaList.Item(iMediaList.FocusIndex()), i ) ;
+			}
+		}       
+    }       
+        
+// ----------------------------------------------------------------------------
+// HandleItemAddedL
+// ----------------------------------------------------------------------------
+//
+void  CGlxDetailsMulModelProviderImpl::HandleItemAddedL(TInt /*aStartIndex*/, TInt /*aEndIndex*/,
+    MGlxMediaList* /*aList*/ )
+    {
+    TRACER("CGlxDetailsMulModelProviderImpl::HandleItemAddedL");
+    TInt count = iEntries.Count();
+    for(int i = 0; i < count; i++)
+        {
+	     UpdateItems( i , 1 );
+        }
+    }
+// ----------------------------------------------------------------------------
+// HandleError
+// ----------------------------------------------------------------------------
+//
+void CGlxDetailsMulModelProviderImpl::HandleError( TInt aError )
+    {
+    TRACER("CGlxDetailsMulModelProviderImpl::HandleError");
+    TRAP_IGNORE( DoHandleErrorL( aError ) );
+    }
+
+// ----------------------------------------------------------------------------
+// HandleError
+// ----------------------------------------------------------------------------
+//
+void CGlxDetailsMulModelProviderImpl::DoHandleErrorL( TInt /*aError*/ )
+    {
+    TRACER("CGlxDetailsMulModelProviderImpl::DoHandleErrorL");
+    // Check for items for which fetching a thumbnail has failed, and replace
+    // the default icon with broken icon
+    TInt count = iMediaList.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        const TGlxMedia& item = iMediaList.Item( i );
+        TInt thumbnailError = GlxErrorManager::HasAttributeErrorL(
+                                item.Properties(), KGlxMediaIdThumbnail );
+        if( thumbnailError )
+            {
+            UpdateItems( i , 1 );
+            }
+        }
+    }
+// ----------------------------------------------------------------------------
+// HideLocationMenuItem
+// ----------------------------------------------------------------------------
+//
+void CGlxDetailsMulModelProviderImpl::HideLocationMenuItem( CEikMenuPane& aMenu )
+    {
+    if ( HasCommandL( aMenu, EGlxCmdAiwBase ) )
+        {
+        const MGlxBoundCommand* command = BoundCommand( FocusIndex() );
+        if ( command )
+            {
+            command->HideLocationMenuItem( aMenu );
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// EnableMskL
+// ----------------------------------------------------------------------------
+//
+void CGlxDetailsMulModelProviderImpl::EnableMskL()
+    {
+    TRACER("CGlxDetailsMulModelProviderImpl::EnableMskL");
+    MGlxBoundCommand* command = BoundCommand( FocusIndex() );
+    if ( command )
+        {
+        command->ChangeMskL();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// SetDetailsDailogObserver
+// ----------------------------------------------------------------------------
+//
+void CGlxDetailsMulModelProviderImpl::SetDetailsDailogObserver( MGlxMetadataDialogObserver& aObserver )
+    {
+    TRACER("CGlxDetailsMulModelProviderImpl::SetDetailsDailogObserver");
+	/** Error Id EMPY-7MKDHP **/
+	MGlxBoundCommand* command = BoundCommand( FocusIndex() );
+	if ( command )
+	    {
+	    command->SetDetailsDailogObserver( aObserver ) ;
+	    }
+    }
+
+
+// ----------------------------------------------------------------------------
+// HandleCommandCompleteL
+// ----------------------------------------------------------------------------
+//  
+void CGlxDetailsMulModelProviderImpl::HandleCommandCompleteL(TAny* /*aSessionId*/,
+       CMPXCommand* /*aCommandResult*/, TInt aError, MGlxMediaList* /*aList*/)
+    {
+    TRACER("CGlxDetailsMulModelProviderImpl::HandleCommandCompleteL");
+    TGlxMedia media = iMediaList.Item(iMediaList.FocusIndex()) ;
+    media.DeleteLocationAttribute();
+    if ( aError == KErrNone )
+        {
+	   	UpdateItems( FocusIndex(), 1 );   
+        }
+    }