--- /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