profilesservices/FileList/Src/CFLDPopupList.cpp
changeset 68 13e71d907dc3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/profilesservices/FileList/Src/CFLDPopupList.cpp	Thu Nov 04 13:38:47 2010 +0800
@@ -0,0 +1,637 @@
+/*
+* Copyright (c) 2002 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 of the CFLDPopupList.
+*
+*/
+
+
+
+// CLASS HEADER
+#include    "CFLDPopupList.h"
+
+// INTERNAL INCLUDES
+#include    "CFLDFileListModel.h"
+#include    "MFLDFileObserver.h"
+#include    "MFLDFileListBoxObserver.h"
+
+// EXTERNAL INCLUDES
+#include <AknIconArray.h>
+#include <aknmemorycardui.mbg>
+#include <AknsUtils.h>
+#include <gulicon.h>
+#include <aknconsts.h> // KAvkonBitmapFile, KAvkonVariatedBitmapsFile
+#include <variatedbitmaps.mbg> // MBM indices for seamless link
+#include <avkon.mbg>
+#include <data_caging_path_literals.hrh>
+#include <aknlists.h>
+#include <commondialogs.mbg>
+#include <filelist.mbg>
+#ifdef RD_TACTILE_FEEDBACK
+#include <touchfeedback.h>
+#endif //RD_TACTILE_FEEDBACK
+// CONSTANTS
+namespace
+	{
+    _LIT( KFLDMassStorageBitmapFile, "z:filelist.mbm" );
+    _LIT( KFLDMemoryCardUiBitmapFile, "z:aknmemorycardui.mbm" );
+
+	const TInt KIconGranularity( 3 );
+	}
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CFLDPopupList::CFLDPopupList
+// C++ constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CFLDPopupList::CFLDPopupList(
+	MFLDFileObserver& aFileObserver,
+    MFLDFileListBoxObserver* aListBoxObserver,
+	CFLDFileListModel& aModel )
+	:	CAknPopupList(),
+		iFileObserver( aFileObserver ),
+        iListBoxObserver( aListBoxObserver ),
+		iModel( aModel ),
+		iPoint(-1,-1)
+    {
+    }
+
+
+void CFLDPopupList::ConstructL(
+ CEikListBox* aListBox, TInt aCbaResource, AknPopupLayouts::TAknPopupLayouts aType )
+	{
+	// Notify foreground lost
+    CCoeEnv* coeEnv = CCoeEnv::Static();
+    coeEnv->AddForegroundObserverL( *this );
+    coeEnv->AddFocusObserverL( *this );
+    
+    CAknPopupList::ConstructL( aListBox, aCbaResource, aType );
+	}
+
+// -----------------------------------------------------------------------------
+// CFLDPopupList::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CFLDPopupList* CFLDPopupList::NewL(
+	CEikListBox* aListBox,
+	TInt aCbaResource,
+	MFLDFileObserver& aFileObserver,
+    MFLDFileListBoxObserver* aListBoxObserver,
+	CFLDFileListModel& aModel,
+	AknPopupLayouts::TAknPopupLayouts aType )
+	{
+	CFLDPopupList* self = new( ELeave )
+        CFLDPopupList( aFileObserver, aListBoxObserver, aModel );
+	CleanupStack::PushL( self );
+	self->ConstructL( aListBox, aCbaResource, aType );
+	CleanupStack::Pop( self );
+	return self;
+	}
+
+// Destructor
+ CFLDPopupList::~CFLDPopupList()
+    {
+    CCoeEnv::Static()->RemoveForegroundObserver( *this );
+    CCoeEnv::Static()->RemoveFocusObserver( *this );
+    }
+    
+ // -----------------------------------------------------------------------------
+ // CFLDPopupList::HandlePointerEventL
+ // (other items were commented in a header).
+ // -----------------------------------------------------------------------------
+ //
+ void CFLDPopupList::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+	 {
+	 if ( aPointerEvent.iType == TPointerEvent::EButton1Down)
+		 {
+		 iPoint = aPointerEvent.iPosition;
+		 CancelPreview();
+		 }
+	if (!Rect().Contains(iPoint))
+		{
+#ifdef RD_TACTILE_FEEDBACK 
+		MTouchFeedback* feedback = MTouchFeedback::Instance();
+		if (feedback)
+			{
+			feedback->InstantFeedback(this, ETouchFeedbackBasic);
+			}
+#endif //RD_TACTILE_FEEDBACK		}
+		AttemptExitL(EFalse);
+		}
+	CAknPopupList::HandlePointerEventL(aPointerEvent);
+	 }
+// -----------------------------------------------------------------------------
+// CFLDPopupList::AttemptExitL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CFLDPopupList::AttemptExitL( TBool aAccept )
+	{
+	if( iExitChecksDone )
+	    {
+	    CAknPopupList::AttemptExitL( aAccept );
+	    return;
+	    }
+
+	TFileName fileName( KNullDesC );
+	iModel.GetFileName( fileName, iListBox->CurrentItemIndex() );
+
+#ifdef RD_VIDEO_AS_RINGING_TONE
+	// Get current softkey state
+	if( iListBoxObserver )
+    	{
+		iListBoxObserver->HandleSoftKeyState( iSoftKeyState );
+    	}
+	TBool isVideo( EFalse );
+	if ( iModel.MediaFileType( fileName ) == ECLFMediaTypeVideo )
+		{
+		isVideo = ETrue;
+		}
+#endif
+
+	if( aAccept )
+		{
+		// User made a selection (didn't press cancel).
+
+#ifdef RD_VIDEO_AS_RINGING_TONE
+		if( isVideo )
+			{
+			if( iSoftKeyState ==
+			 MFLDFileListBoxObserver::EToneSelectionSoftKeyState )
+				{
+				// Cancel listbox timer
+        		if( iListBoxObserver )
+            		{
+            		iListBoxObserver->HandleFileListBoxEventL(
+                		MFLDFileListBoxObserver::EOtherKeyEvent,
+                		fileName );
+            		}
+				}
+			else
+				{
+				// No need to cancel timer
+				// (it has been already cancelled)
+				}
+			}
+		else
+			{
+        	// Cancel listbox timer
+        	if( iListBoxObserver )
+            	{
+            	iListBoxObserver->HandleFileListBoxEventL(
+                	MFLDFileListBoxObserver::EOtherKeyEvent,
+                	fileName );
+            	}
+			}
+#else
+		// Cancel listbox timer
+        if( iListBoxObserver )
+        	{
+            iListBoxObserver->HandleFileListBoxEventL(
+            	MFLDFileListBoxObserver::EOtherKeyEvent,
+                fileName );
+            }
+#endif
+
+#ifdef RD_VIDEO_AS_RINGING_TONE
+	if( !isVideo )	// Only perform file validity check for audio files here
+		{
+		// Ask the observer if the file is valid.
+        if( !iFileObserver.IsFileValidL(
+         fileName, MFLDFileObserver::ESelect ) )
+			{
+            // Not ok to close the pop-up.
+            // Return. Don't call CAknPopupList::AttemptExitL.
+			return;
+			}
+		}
+
+#else
+        // Ask the observer if the file is valid.
+    if( !iFileObserver.IsFileValidL(
+     fileName, MFLDFileObserver::ESelect ) )
+    	{
+	    // Not ok to close the pop-up.
+        // Return. Don't call CAknPopupList::AttemptExitL.
+		return;
+		}
+#endif
+
+
+#ifdef RD_VIDEO_AS_RINGING_TONE
+		if( iListBoxObserver )
+			{
+			// Ask the observer if the file is video
+			if( isVideo )
+				{// File is a video
+
+				// Change the softkeys back to normal
+				iListBoxObserver->HandleFileListBoxEventL(
+ 						MFLDFileListBoxObserver::EVideoPreviewCanceled,
+ 						 fileName );
+ 						
+				if( iSoftKeyState
+				 == MFLDFileListBoxObserver::EToneSelectionSoftKeyState )
+			 		{	// File is a video and we are in tone selection list
+
+			 		// Ask the observer if the file is valid.
+        			if( !iFileObserver.IsFileValidL(
+        			 fileName, MFLDFileObserver::ESelect ) )
+        				{
+						// Not ok to close the pop-up.
+            			// Return. Don't call CAknPopupList::AttemptExitL.
+						return;
+        				}
+			 		}
+			 	else if( iSoftKeyState
+			 	 == MFLDFileListBoxObserver::EPreviewSoftKeyState )
+			 		{	// File is a video and it has been focused for 1s
+
+			 		// Ask the observer if the file is valid.
+        			if( !iFileObserver.IsFileValidL(
+        			 fileName, MFLDFileObserver::EPlay ) )
+        				{
+						// Not ok to close the pop-up.
+            			// Return. Don't call CAknPopupList::AttemptExitL.
+						return;
+        				}
+
+			 		iListBoxObserver->HandleFileListBoxEventL(
+                		MFLDFileListBoxObserver::EVideoPreview,
+                		fileName );
+                	
+			 		// Disable scrollbar
+			 		ListBox()->ScrollBarFrame()->VerticalScrollBar()->SetDimmed( ETrue );
+
+			 		// Remove the focus from listbox
+                	ListBox()->SetDimmed( ETrue );
+
+                	// Not ok to close the pop-up.
+            		// Return. Don't call CAknPopupList::AttemptExitL.
+                	return;
+			 		}
+			 	else if( iSoftKeyState
+			 	 == MFLDFileListBoxObserver::EPreviewSelectSoftKeyState )
+			 		{	// File is a video and it is in preview state
+
+			 		// Ask the observer if the file is valid.
+        			if( !iFileObserver.IsFileValidL(
+        			 fileName, MFLDFileObserver::ESelect ) )
+						{
+						// When video screen is closed,
+						// listbox must be forced to be refreshed
+						// ( otherwise scrollbar is not redrawn)
+						ListBox()->SetDimmed( EFalse );
+	                    ListBox()->ScrollBarFrame()->VerticalScrollBar()->SetDimmed( EFalse );
+						DrawNow( CEikonEnv::Static()->EikAppUi()->ApplicationRect() );
+						// Not ok to close the pop-up.
+            			// Return. Don't call CAknPopupList::AttemptExitL.
+						return;
+						}
+
+					// When video screen is closed, listbox must be refreshed
+					DrawDeferred();
+	            	}
+				}
+			}
+		}
+	else	// 	if( aAccept )
+		{
+		// User canceled selection
+		if( iListBoxObserver )
+			{
+			if( isVideo )
+				{	// File is a video
+				
+				// Change the softkeys back to normal
+				iListBoxObserver->HandleFileListBoxEventL(
+	       			MFLDFileListBoxObserver::EVideoPreviewCanceled,
+	       			 fileName );
+				
+	 			if( iSoftKeyState ==
+	 			 MFLDFileListBoxObserver::EPreviewSelectSoftKeyState )
+					{	// File is a video and it is in preview state
+
+					// When video screen is closed,
+					// listbox must be forced to be refreshed
+					// ( otherwise scrollbar is not redrawn)
+					ListBox()->SetDimmed( EFalse );
+                    ListBox()->ScrollBarFrame()->VerticalScrollBar()->SetDimmed( EFalse );
+					DrawNow( CEikonEnv::Static()->EikAppUi()->ApplicationRect() );
+					// Not ok to close the pop-up.
+            		// Return. Don't call CAknPopupList::AttemptExitL.
+					return;
+					}
+	 			}
+			}
+#endif
+
+		}
+
+	iExitChecksDone = ETrue;
+	CAknPopupList::AttemptExitL( aAccept );
+	}
+
+// -----------------------------------------------------------------------------
+// CFLDPopupList::HandleResourceChange
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CFLDPopupList::HandleResourceChange( TInt aType )
+    {
+#ifdef RD_VIDEO_AS_RINGING_TONE
+    if( aType == KEikDynamicLayoutVariantSwitch ||
+         aType == KAknsMessageSkinChange )
+        {
+		if( iListBoxObserver )
+			{
+ 			TRAP_IGNORE( iListBoxObserver->HandleFileListBoxEventL(
+ 				MFLDFileListBoxObserver::EVideoPreviewCanceled ) );
+ 		    if( ListBox()->IsFocused() )
+ 		        {
+ 		        ListBox()->SetDimmed( EFalse );
+                ListBox()->ScrollBarFrame()->VerticalScrollBar()->SetDimmed( EFalse );
+ 		        }
+			}
+        }
+#endif
+    if( aType == KAknsMessageSkinChange )
+        {
+        TRAP_IGNORE( PopulateIconArrayL() );
+        }
+
+    CAknPopupList::HandleResourceChange( aType );
+    }
+
+// -----------------------------------------------------------------------------
+// CFLDPopupList::GetFileListBoxObserver
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+MFLDFileListBoxObserver* CFLDPopupList::GetFileListBoxObserver()
+	{
+	return iListBoxObserver;
+	}
+
+// -----------------------------------------------------------------------------
+// CFLDPopupList::HandleListBoxEventL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CFLDPopupList::HandleListBoxEventL( CEikListBox* aListBox,
+	TListBoxEvent aEventType )
+    {
+	switch( aEventType )
+		{
+		// Special handling for touch: first click just starts preview;
+		// second click (double click) will select the tone.
+		// Fall through.
+		case EEventItemClicked:
+			{
+			iModel.GetFileName( iCurrentFileName, iListBox->CurrentItemIndex() );
+			iListBoxObserver->HandleFileListBoxEventL( 
+				MFLDFileListBoxObserver::EFocusChanged, iCurrentFileName );
+			return;
+			}
+
+		case EEventItemDoubleClicked:
+			AttemptExitL( ETrue );
+			return;
+
+		default:
+			break;
+		}
+
+	CAknPopupList::HandleListBoxEventL( aListBox, aEventType );
+    }
+
+// -----------------------------------------------------------------------------
+// CFLDPopupList::CancelPreview
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CFLDPopupList::CancelPreview()
+    {
+    if( iListBoxObserver )
+    	{
+        TRAP_IGNORE( iListBoxObserver->HandleFileListBoxEventL(
+         				MFLDFileListBoxObserver::EOtherKeyEvent, KNullDesC ) );
+    	}
+    }
+
+// -----------------------------------------------------------------------------
+// CFLDPopupList::PopupListWindow::
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RWindow& CFLDPopupList::PopupListWindow() const
+	{
+	return Window();
+	}
+
+// -----------------------------------------------------------------------------
+// CFLDPopupList::HandleGainingForeground
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CFLDPopupList::HandleGainingForeground()
+	{
+	TRAP_IGNORE( ListBox()->HandleItemAdditionL() );
+	}
+// -----------------------------------------------------------------------------
+// CFLDPopupList::HandleLosingForeground
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CFLDPopupList::HandleLosingForeground()
+	{
+    if( iListBoxObserver )
+        {
+        iListBoxObserver->HandleSoftKeyState( iSoftKeyState );
+        if( iSoftKeyState == MFLDFileListBoxObserver::EPreviewSelectSoftKeyState )
+            {
+            TRAP_IGNORE( iListBoxObserver->HandleFileListBoxEventL(
+                MFLDFileListBoxObserver::EVideoPreviewCanceled, KNullDesC ) );
+            DrawNow();
+            }
+
+        // Set the vertical scroll bar and listbox to not dimmed.        
+        if ( ListBox()->IsFocused() )
+            {
+            ListBox()->SetDimmed( EFalse );
+            ListBox()->ScrollBarFrame()->VerticalScrollBar()->SetDimmed( EFalse );
+            }
+        }
+	}	
+
+// -----------------------------------------------------------------------------
+// CFLDPopupList::HandleChangeInFocus
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CFLDPopupList::HandleChangeInFocus()
+	{
+	if( ListBox()->IsFocused() )
+		{
+		ListBox()->SetDimmed( EFalse );
+		}
+	}	
+// -----------------------------------------------------------------------------
+// CFLDPopupList::HandleDestructionOfFocusedItem
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CFLDPopupList::HandleDestructionOfFocusedItem()
+	{
+	}	
+
+// -----------------------------------------------------------------------------
+// CFLDPopupList::PopulateIconArrayL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CFLDPopupList::PopulateIconArrayL()
+    {
+    CAknSingleGraphicBtPopupMenuStyleListBox* listBox = 
+    	static_cast<CAknSingleGraphicBtPopupMenuStyleListBox*>( ListBox() );
+
+	if( !listBox )
+		{
+		return;
+		}
+
+    // Create new icon array
+    CArrayPtr<CGulIcon>* iconArray = new( ELeave ) CAknIconArray( KIconGranularity );
+    CleanupStack::PushL( iconArray );
+
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+    //    
+    // Create an empty icon in icon array position 0
+    // 
+    CGulIcon* icon =
+        AknsUtils::CreateGulIconL( skin, KAknsIIDQgnPropEmpty, KAvkonBitmapFile,
+        EMbmAvkonQgn_prop_empty, EMbmAvkonQgn_prop_empty_mask  );
+    CleanupStack::PushL( icon );
+    iconArray->AppendL( icon );
+    CleanupStack::Pop( icon );
+
+    //
+    // Create an URL icon for download tones in icon array position 1
+    //
+    icon = AknsUtils::CreateGulIconL( skin, KAknsIIDQgnPropLinkEmbdSmall,
+        KAvkonVariatedBitmapsFile,
+        EMbmVariatedbitmapsQgn_prop_link_embd_small,
+        EMbmVariatedbitmapsQgn_prop_link_embd_small_mask );
+    CleanupStack::PushL( icon );
+    iconArray->AppendL( icon );
+    CleanupStack::Pop( icon );
+
+    //
+    // Create an memory card icon in icon array position 2
+    //		
+	TParse* fp = new(ELeave) TParse();
+	fp->Set(KFLDMemoryCardUiBitmapFile, &KDC_APP_BITMAP_DIR, NULL);
+	TFileName resourceFileName( fp->FullName() );
+	delete fp;
+        
+    TRgb defaultColour( KRgbBlack );
+    CFbsBitmap* bmap = NULL;
+    CFbsBitmap* mask = NULL;
+
+    AknsUtils::GetCachedColor( skin, defaultColour,
+               KAknsIIDQsnIconColors, EAknsCIQsnIconColorsCG13 );
+    AknsUtils::CreateColorIconLC( skin, KAknsIIDQgnPropLinkEmbdSmall,
+                KAknsIIDQsnIconColors, EAknsCIQsnIconColorsCG13, bmap, mask,
+                resourceFileName, EMbmAknmemorycarduiQgn_indi_mmc_add,
+                EMbmAknmemorycarduiQgn_indi_mmc_add_mask,
+                defaultColour );
+    icon = CGulIcon::NewL( bmap, mask );
+    icon->SetBitmapsOwnedExternally( EFalse );
+    CleanupStack::Pop( 2 ); // icon owns the bitmaps now
+        
+    CleanupStack::PushL( icon );
+    iconArray->AppendL( icon );
+    CleanupStack::Pop( icon );
+     
+    //
+    // Create an audio file icon in icon array position 3
+    //
+    icon = AknsUtils::CreateGulIconL( skin, KAknsIIDQgnPropFmgrFileSound,
+        KCommonDialogsBitmapFile,
+        EMbmCommondialogsQgn_prop_fmgr_file_sound,
+        EMbmCommondialogsQgn_prop_fmgr_file_sound_mask );
+    CleanupStack::PushL( icon );
+    iconArray->AppendL( icon );
+    CleanupStack::Pop( icon );
+
+    //
+    // Create a video file icon in icon array position 4
+    //
+    icon = AknsUtils::CreateGulIconL( skin, KAknsIIDQgnPropFmgrFileVideo,
+        KCommonDialogsBitmapFile,
+        EMbmCommondialogsQgn_prop_fmgr_file_video,
+        EMbmCommondialogsQgn_prop_fmgr_file_video_mask );
+    CleanupStack::PushL( icon );
+    iconArray->AppendL( icon );
+    CleanupStack::Pop( icon );
+
+    //
+    // create mass storage icon in icon array position 5
+    //
+	TParse* fp2 = new(ELeave) TParse();
+	fp2->Set(KFLDMassStorageBitmapFile, &KDC_APP_BITMAP_DIR, NULL);
+	resourceFileName = fp2->FullName();
+	delete fp2;
+
+    TRgb defaultColour2( KRgbBlack );
+    CFbsBitmap* bmap2 = NULL;
+    CFbsBitmap* mask2 = NULL;
+
+    AknsUtils::GetCachedColor( skin, defaultColour2,
+               KAknsIIDQsnIconColors, EAknsCIQsnIconColorsCG13 );
+    AknsUtils::CreateColorIconLC( skin, KAknsIIDQgnPropLinkEmbdSmall,
+                KAknsIIDQsnIconColors, EAknsCIQsnIconColorsCG13, bmap2, mask2,
+                resourceFileName, EMbmFilelistQgn_indi_fmgr_ms_add,
+                EMbmFilelistQgn_indi_fmgr_ms_add_mask,
+                defaultColour2 );
+    
+    icon = CGulIcon::NewL( bmap2, mask2 );
+    icon->SetBitmapsOwnedExternally( EFalse );
+    CleanupStack::Pop( 2 ); // icon owns the bitmaps now
+        
+    CleanupStack::PushL( icon );
+    iconArray->AppendL( icon );
+    CleanupStack::Pop( icon );
+
+
+    // Delete old icons
+    CArrayPtr<CGulIcon>* arr = listBox->ItemDrawer()->ColumnData()->IconArray();
+    if( arr )
+    	{
+    	arr->ResetAndDestroy();
+	    delete arr;
+	    arr = NULL;
+    	}
+
+	listBox->ItemDrawer()->ColumnData()->SetIconArrayL( iconArray );
+	CleanupStack::Pop( iconArray );
+
+    }
+
+
+//  End of File