diff -r 6465d5bb863a -r 13e71d907dc3 profilesservices/FileList/Src/CFLDPopupList.cpp --- /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 +#include +#include +#include +#include // KAvkonBitmapFile, KAvkonVariatedBitmapsFile +#include // MBM indices for seamless link +#include +#include +#include +#include +#include +#ifdef RD_TACTILE_FEEDBACK +#include +#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( ListBox() ); + + if( !listBox ) + { + return; + } + + // Create new icon array + CArrayPtr* 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* arr = listBox->ItemDrawer()->ColumnData()->IconArray(); + if( arr ) + { + arr->ResetAndDestroy(); + delete arr; + arr = NULL; + } + + listBox->ItemDrawer()->ColumnData()->SetIconArrayL( iconArray ); + CleanupStack::Pop( iconArray ); + + } + + +// End of File