diff -r 000000000000 -r 71ca22bcf22a mmserv/audioeffectsui/equalizer/src/EqualizerPresetsDialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/audioeffectsui/equalizer/src/EqualizerPresetsDialog.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,1228 @@ +/* +* Copyright (c) 2005 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 CEqualizerPresetsDialog class +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//LAF and Skin changes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include // Contains the resource definition +#include +#include "EqualizerPrivateConstants.h" +#include "EqualizerPresetsDialog.h" +#include "EqualizerPresetListArray.h" +#include "EqualizerEditingDialog.h" +#include "Equalizer.hrh" + +// CONSTANTS +//Used during building a new preset name +_LIT( KEqrFormat, "%d)" ); +_LIT( KEqrZero, "0" ); +_LIT( KEqrParenthesis, "(" ); + +// Used for checking if the new preset name contains illegal characters +_LIT(KEqrLessThan, "<"); +_LIT(KEqrGreaterThan, ">"); +_LIT(KEqrQuote, "\""); +_LIT(KEqrBackSlash, "\\"); +_LIT(KEqrForwardSlash, "/"); +_LIT(KEqrOrSymbol, "|"); +_LIT(KEqrColon, ":"); +_LIT(KEqrAsterisk, "*"); +_LIT(KEqrQuestionMark, "?"); + +// ================= MEMBER FUNCTIONS ======================= + +// ------------------------------------------------------------------- +// CEqualizerPresetsDialog* CEqualizerPresetsDialog::NewL() +// Create instance of concrete ECOM interface implementation +// ------------------------------------------------------------------- +// +EXPORT_C CEqualizerPresetsDialog* CEqualizerPresetsDialog::NewL( + CAudioEqualizerUtility* aAudEqUtility, + TInt aCurrentActivePreset, + MEqualizerPresetActivationObserver& aEqrPresetActObserver) + { + CEqualizerPresetsDialog* self = new (ELeave) CEqualizerPresetsDialog( + aAudEqUtility, aEqrPresetActObserver); + CleanupStack::PushL(self); + self->ConstructL(aCurrentActivePreset); + CleanupStack::Pop(self); + return self; + } + +// ------------------------------------------------------------------- +// CEqualizerPresetsDialog::CEqualizerPresetsDialog( +// CAudioEqualizerUtility*& aAudEqUtility, +// MEqualizerPresetActivationObserver& aEqrPresetActObserver) +// First Phase Construction +// ------------------------------------------------------------------- +// +CEqualizerPresetsDialog::CEqualizerPresetsDialog( + CAudioEqualizerUtility* aAudEqUtility, + MEqualizerPresetActivationObserver& aEqrPresetActObserver): + + iAudEqUtility(aAudEqUtility), + iEqrPresetActObserver(aEqrPresetActObserver) + { + } + +// ------------------------------------------------------------------- +// CEqualizerPresetsDialog::ConstructL() +// Second Phase Constructor +// ------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::ConstructL(const TInt aCurrentActivePreset) + { + //Initially set these variable to EFalse + iContextSensitiveMenu = EFalse; + iIgnoreKeyEvents = EFalse; + + iRepository = CRepository::NewL(KCRUidMusicPlayerSettings); + + //Add the resource file + + // Find which drive this DLL is installed. + TFileName fileName; + // Get the full resource file + TParse fp; + // Add the resource dir + fp.Set( KEqualizerResourceFileName, &KDC_APP_RESOURCE_DIR, NULL); + // Get the filename with full path + fileName = fp.FullName(); + //for localisation of resource file + BaflUtils::NearestLanguageFile( iEikonEnv->FsSession(), fileName ); + iResourceFileOffset = iEikonEnv->AddResourceFileL( fileName ); + + //Read text for preset "None" from rss file + iPresetNoneText = StringLoader::LoadL(R_QTN_EQUALIZER_PRESET_NONE); + iTitleText = StringLoader::LoadL(R_QTN_EQUALIZER_TITLE_TEXT); + + iItemArray = CEqualizerPresetListArray::NewL(iAudEqUtility, + aCurrentActivePreset); + + iItemArray->GetCurrentActivePreset(iActivePreset); + + CAknDialog::ConstructL(R_EQUALIZER_CONTAINER_MENUBAR); + } + +// ------------------------------------------------------------------- +// CEqualizerPresetsDialog::~CEqualizerPresetsDialog() +// Destructor +// -------------------------------------------------------------------- +// +CEqualizerPresetsDialog::~CEqualizerPresetsDialog() + { + if (iResourceFileOffset) + { + iEikonEnv->DeleteResourceFile(iResourceFileOffset); + } + delete iRepository; + if (iAppTitleText) + { + // restore musicplayer's title + CEikStatusPane* sp=iEikonEnv->AppUiFactory()->StatusPane(); + CAknTitlePane* tp=(CAknTitlePane*)sp->ControlL(TUid::Uid(EEikStatusPaneUidTitle)); + tp->SetTextL(*iAppTitleText); + delete iAppTitleText; + } + delete iPresetNoneText; + delete iTitleText; + delete iItemArray; + } + +// -------------------------------------------------------------------------- +// void CEqualizerPresetsDialog::BuildPresetNameL( TDes& aName) const +// Returns free folder name +// -------------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::BuildPresetNameL( TDes& aName) const + { + //set name in the query box to "Preset" + HBufC* defaultText = StringLoader::LoadLC( + R_QTN_EQ_PRESET_DEFAULT_NAME); + + TInt n(0); + + // Numbers start from 1 + TBool found( EFalse ); + TBuf number; + + // The loop is iterated until a free folder name is found. + FOREVER + { + found = EFalse; + // Constructs a candidate for the name + TBuf newName; + newName.Copy( *defaultText ); + + if( n > 0 ) + // First new is without number ( New folder, New folder(01), New folder(02), ...) + { + // Creates the current number. + number.Format( KEqrFormat, n ); + AknTextUtils::LanguageSpecificNumberConversion ( number ); + + TInt leadingZeroLength( 0 ); + if( n < 10 ) + { + leadingZeroLength = KEqrZero().Length(); + } + + // checks the total length of the costructed string + if( ( number.Length() + newName.Length() + KEqrParenthesis().Length() + + leadingZeroLength ) > KMaxPresetNameLength ) + { + User::Leave( KErrOverflow ); + } + + // Appends the first parenthesis + newName.Append( KEqrParenthesis ); + if( n < 10 ) + { + // Appends the leading zero ( always two digits 08, 09, 10, 11,...) + TBuf< 16 > zero(KEqrZero); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( zero ); + newName.Append( KEqrZero ); + } + newName.Append( number ); + } + found = SearchPresetL(newName); + + if( found == KErrNotFound ) + { + aName = newName; + CleanupStack::PopAndDestroy( defaultText); + return; + } + n++; + } + } + +// ----------------------------------------------------------------------- +// CEqualizerPresetsDialog::GetNewName(TInt aResourceId, TDes& presetName) +// +// This function is called to display the dialog box to get a new name +// during "Raname" or "Create new" +// ----------------------------------------------------------------------- +// +TBool CEqualizerPresetsDialog::GetNewNameL(const TInt aResourceId, TDes& +aPresetName) const + { + CAknTextQueryDialog* dlg; + TBool ret = EFalse; + + while (1) + { + dlg = CAknTextQueryDialog::NewL(aPresetName); + if (dlg->ExecuteLD(aResourceId)) + { + // Illegal characters in a preset name are < > \" \\ / | : * ?" + + if ( (aPresetName.FindC( KEqrLessThan ) != KErrNotFound ) || + (aPresetName.FindC( KEqrGreaterThan ) != KErrNotFound ) || + (aPresetName.FindC( KEqrQuote ) != KErrNotFound ) || + (aPresetName.FindC( KEqrBackSlash ) != KErrNotFound ) || + (aPresetName.FindC( KEqrForwardSlash ) != KErrNotFound ) || + (aPresetName.FindC( KEqrOrSymbol ) != KErrNotFound ) || + (aPresetName.FindC( KEqrColon ) != KErrNotFound ) || + (aPresetName.FindC( KEqrAsterisk ) != KErrNotFound ) || + (aPresetName.FindC( KEqrQuestionMark ) != KErrNotFound ) + ) + { + HBufC* text = StringLoader::LoadLC( + R_QTN_FLDR_ILLEGAL_CHARACTERS); + CAknInformationNote* note = new( ELeave ) CAknInformationNote(ETrue); + note->ExecuteLD( *text ); + CleanupStack::PopAndDestroy(text); + continue; + } + + TInt error = SearchPresetL(aPresetName); + if (error != KErrNotFound) + { + // display error + HBufC* label = StringLoader::LoadLC( + R_QTN_FLDR_NAME_ALREADY_USED, aPresetName ); + CAknInformationNote* note = new( ELeave ) + CAknInformationNote( ETrue ); + note->ExecuteLD( *label ); + CleanupStack::PopAndDestroy(label); + continue; + } + // New name entered + ret = ETrue; + } + // Break, in case user Cancels the data query or + // enters a valid name + break; + } + return ret; + } + +// --------------------------------------------------------------------------- +// TPresetName CEqualizerPresetsDialog::GetHighlightedPresetInListBox() const +// This function returns the highlighted Preset in ListBox +// --------------------------------------------------------------------------- +// +TPresetName CEqualizerPresetsDialog::GetHighlightedPresetInListBox() const + { + TInt selectedIndex = iListBox->CurrentItemIndex(); + CTextListBoxModel* model = iListBox->Model(); + TPresetName selectedItem(model->ItemText(selectedIndex)); + TPresetName highlightedPreset = + selectedItem.Right(selectedItem.Length()- iItemArray->GetPrefixLength()); + return highlightedPreset; + } + +// --------------------------------------------------------------------------- +//void CEqualizerPresetsDialog::ActivateEqrPresetL(const TInt aIndex, +//const TDesC& aPreset) const +// +//This function is used for the activation of a preset +// --------------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::ActivateEqrPresetL(const TInt aIndex, +const TDesC& aPreset) + { + TInt err; + // Store activated preset in central repository + SetCurrentPreset(aPreset); + + // Set the active preset in the equalizer item array + iItemArray->SetCurrentActivePreset(aPreset); + + // Display Confirmation note + HBufC* activateNoteText = StringLoader::LoadLC( + R_QTN_EQ_NOTE_INFO_PRESET_ACTIVATED, aPreset); + CAknConfirmationNote* dialog = new(ELeave)CAknConfirmationNote(); + dialog->ExecuteLD(*activateNoteText); + CleanupStack::PopAndDestroy(activateNoteText); + + // Inform the engine + if (aPreset.Compare(*iPresetNoneText) == 0) + { + TRAP(err, iAudEqUtility->DisableEqualizerL()); + } + else + { + TRAP(err, iAudEqUtility->ApplyPresetL(GetEngineIndexL(aPreset))); + } + + if(!err) + { + iListBox->HandleItemAdditionL(); + iListBox->SetCurrentItemIndexAndDraw(aIndex); + // To prevent two tickmarks from appearing sometimes + iListBox->DrawNow(); + } + } + +// --------------------------------------------------------------------------- +//void CEqualizerPresetsDialog::RenameEqrPresetL(const TInt aIndex, +//const TDesC& aPreset) const +// +//This function is used for the renaming of a preset +// --------------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::RenameEqrPresetL(const TInt /*aIndex*/, +const TDesC& aPreset) + { + //Check if this is an active preset + TPresetName activePresetName = CurrentPreset(); + if (aPreset.Compare(activePresetName) == 0) + { + //Display Confirmation note + HBufC* renameText = StringLoader::LoadLC( + R_QTN_EQ_NOTE_ERR_PRESET_IN_USE_NO_RENAME); + CAknErrorNote* dialog = new(ELeave)CAknErrorNote(); + dialog->ExecuteLD(*renameText); + CleanupStack::PopAndDestroy(renameText); + } + else + { + TPresetName presetName; + presetName = aPreset; + TBool nameEnteredIsFine = + GetNewNameL(R_DIALOG_TEXT_RENAME_ITEM_NAME, presetName); + + if (nameEnteredIsFine) + { + TInt engineIndex = GetEngineIndexL(aPreset); + //Update Engine + iAudEqUtility->GetPresetL(engineIndex); + CAudioEqualizer& audioEqualizer = iAudEqUtility->Equalizer(); + + iAudEqUtility->ModifyPresetL(engineIndex,presetName, + audioEqualizer); + + //Update listbox + // Sort the array of user-defined presets + iItemArray->UpdateSortedArrayL(); + iListBox->SetCurrentItemIndex(SearchPresetL(presetName)); + iListBox->DrawNow(); + } + } + } + +// --------------------------------------------------------------------------- +// void CEqualizerPresetsDialog::EditEqrPresetL(const TInt aIndex, +// const TDesC& aPreset) const +// +// This function is used for the editing of a preset +// --------------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::EditEqrPresetL(const TInt /*aIndex*/, +const TDesC& aPreset) + { + //Set application name in the title pane to preset name. + CEikStatusPane* sp=iEikonEnv->AppUiFactory()->StatusPane(); + CAknTitlePane* tp=(CAknTitlePane*)sp->ControlL(TUid::Uid( + EEikStatusPaneUidTitle)); + tp->SetTextL(aPreset); + TInt engineIndex = GetEngineIndexL(aPreset); + //Update Engine + TBool isActivePreset = (aPreset==CurrentPreset()); + + DisplaySettingsL(iAudEqUtility, engineIndex, isActivePreset); + } + +// --------------------------------------------------------------------------- +// void CEqualizerPresetsDialog::CreateNewEqrPresetL(TInt& aIndex, +// TPresetName& aPreset) const +// +// This function is used for the creation of a new preset. +// @param aIndex The index of the preset in the ListBox. This is set +// to a the index in the ListBox if preset creation is successful. +// If the creation is unscuccessful, then the parameter is not changed. +// @param aPreset The name of the preset created +// --------------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::CreateNewEqrPresetL(TInt& aIndex, +TPresetName& aPreset) const + { + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + + if (SysUtil::FFSSpaceBelowCriticalLevelL(&fs,0)) + { + ShowDiskFullNoteL(); // Phone memory full, show note + } + else + { + TPresetName presetName; + BuildPresetNameL(presetName); + + TBool nameEnteredIsFine = GetNewNameL(R_DIALOG_TEXT_NEW_ITEM_NAME, + presetName); + + if (nameEnteredIsFine) + { + //Update Engine + CAudioEqualizer& audioEqualizer = iAudEqUtility->Equalizer(); + iAudEqUtility->CreatePresetL(presetName, audioEqualizer); + + //Set the level of all bands to 0. + TInt numFreqBand = audioEqualizer.NumberOfBands(); + for (TInt i = 0; i < numFreqBand; i++) + { + audioEqualizer.SetBandLevelL(i+1, 0); + } + + iItemArray->UpdateSortedArrayL(); + //Update AudioEqualizerUtility object, setting the level of all + // bands to 0 + iAudEqUtility->ModifyPresetL(GetEngineIndexL(presetName), + presetName, audioEqualizer); + + //Set the focus to the new preset + iListBox->HandleItemAdditionL(); + iListBox->SetCurrentItemIndex(SearchPresetL(presetName)); + iListBox->DrawNow(); + + aPreset = presetName; + aIndex = iItemArray->MdcaCount()-1; + } + } + CleanupStack::PopAndDestroy(); + } + +// --------------------------------------------------------------------------- +//void CEqualizerPresetsDialog::DeleteEqrPresetL(const TInt aIndex, +//const TDesC& aPreset) const +// +//This function is used for the deletion of a preset +// --------------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::DeleteEqrPresetL(const TInt aIndex, +const TDesC& aPreset) + { + //Check if this is an active preset + TPresetName activePresetName = CurrentPreset(); + if (aPreset.Compare(activePresetName) == 0) + { + //Display error note + HBufC* renameText = + StringLoader::LoadLC(R_QTN_EQ_NOTE_ERR_PRESET_IN_USE); + CAknErrorNote* dialog = new(ELeave)CAknErrorNote(); + dialog->ExecuteLD(*renameText); + CleanupStack::PopAndDestroy(renameText); + } + else + { + //Delete?\n%U" §qtn.query.common.conf.delete? + HBufC* text = + StringLoader::LoadLC( R_QTN_QUERY_COMMON_CONF_DELETE, + aPreset); + + // Show confirmation note + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + TInt result( + dlg->ExecuteLD( R_EQUALIZER_CONFIRMATION_QUERY, *text ) ); + CleanupStack::PopAndDestroy(text); // text + + if ( result ) + { + //Update Engine + iAudEqUtility->DeletePresetL(GetEngineIndexL(aPreset)); + //Remove from listbox + iItemArray->UpdateSortedArrayL(); + iListBox->HandleItemRemovalL(); + // This is to avoid the gap observed when the last entry present + // in the Preset List is deleted + iListBox->SetCurrentItemIndexAndDraw(0); + //If we are at the last preset set focus to the next preset + // else the previous preset + if (aIndex == iItemArray->MdcaCount()) + { + iListBox->SetCurrentItemIndexAndDraw(aIndex - 1); + } + else + { + iListBox->SetCurrentItemIndexAndDraw(aIndex); + } + iListBox->DrawNow(); + } + } + } + +// ------------------------------------------------------------------- +// TInt CEqualizerPresetsDialog::GetEngineIndexL +// (const TPresetName& aPresetName) +// +// This function is called to find the index of a preset in the list of +// presets returned by CAudioEqualizerUtility::Presets() +// -------------------------------------------------------------------- +// +TInt CEqualizerPresetsDialog::GetEngineIndexL(const TPresetName& aPresetName) const + { + TInt engineIndex = KErrNotFound; + TInt count; + + TArray presets = iAudEqUtility->Presets(); + TInt numPredefinedPresets = iAudEqUtility->NumberOfPreDefinedPresets(); + TInt numPresets = presets.Count(); + for (count = 0; count < numPresets; count++) + { + TPresetName selectedItem = iItemArray->MdcaPoint(count+1); + TPresetName presetName = selectedItem.Right( + selectedItem.Length() - iItemArray->GetPrefixLength()); + + + if (((count < numPredefinedPresets) && (presetName == aPresetName)) + || (presets[count].iPresetName == aPresetName)) + { + engineIndex = count; + } + } + if (engineIndex == KErrNotFound) + { + // Leave if this function is called for preset "None" or a preset + // which is there in the ListBox but not in the Engine. + User::Leave(KErrArgument); + } + + return engineIndex; + } + +// ----------------------------------------------------------------------- +// CEqualizerPresetsDialog::DisplaySettingsL +// (CAudioEqualizerUtility *aAudEqUtility, TInt aIndex, +// const TBool aIsActivePreset)) const +// +// This function is used to display the current equalizer settings +// by creating a new dialog. The dialog can also be used for editing, etc. +// of the settings. +// ------------------------------------------------------------------------ +// +void CEqualizerPresetsDialog::DisplaySettingsL(CAudioEqualizerUtility* + aAudEqUtility, const TInt aIndex, const TBool aIsActivePreset) + { + TRect rect = Rect(); + + TInt item; + TPresetName preset = GetHighlightedPresetInListBox(); + iItemArray->GetPresetKeyFromLocalisedName(item, preset); + iEditingDialog = CEqualizerEditingDialog::NewL(aAudEqUtility, + aIndex, rect, aIsActivePreset,iEqrPresetActObserver, item); + iEditingDialog->ExecuteLD(); + iEditingDialog = NULL; + } + +// -------------------------------------------------------------- +// CEqualizerPresetsDialog::CurrentPreset() +// This function is used to read the currently active preset from +// the central repository +// -------------------------------------------------------------- +// +TPresetName CEqualizerPresetsDialog::CurrentPreset() const + { + TInt res = 0; + TPresetName preset; + User::LeaveIfError(iRepository->Get(KMPlayerEqPresetId, res)); + iItemArray->GetLocalisedPresetNameFromKey(res,preset ); + return preset; + } + +// ---------------------------------------------------------------- +// CEqualizerPresetsDialog::SetCurrentPreset(const TPtrC& aPreset) +// This function is used to store the currently active preset into +// the central repository +// ---------------------------------------------------------------- +// +void CEqualizerPresetsDialog::SetCurrentPreset(const TPresetName& aPreset) + { + TInt activePresetKey; + iActivePreset = aPreset; + iItemArray->GetPresetKeyFromLocalisedName(activePresetKey, aPreset); + iEqrPresetActObserver.HandlePresetActivation(activePresetKey); + } + +// ---------------------------------------------------------------------------- +// CEqualizerPresetsDialog::SearchPresetL(const TPresetName& aPreset) const +// This function is used to search for a preset name in the ListBox. +// It return the index of the preset, if found and KErrNotFound if not found. +// ---------------------------------------------------------------------------- +// +TInt CEqualizerPresetsDialog::SearchPresetL(const TPresetName& aPreset) const + { + TInt ret = KErrNotFound; + iItemArray->UpdateSortedArrayL(); + + for (TInt i=0; iMdcaCount(); i++) + { + TPresetName selectedItem = iItemArray->MdcaPoint(i); + TPresetName presetName = selectedItem.Right(selectedItem.Length() - iItemArray->GetPrefixLength()); + + if (aPreset == presetName) + { + ret = i; + break; + } + } + return ret; + } + +// ---------------------------------------------------------------------------- +// CEqualizerPresetsDialog::SetAudioEqualizerL(CAudioEqualizerUtility* +// aAudEqUtility) +// This function is used to set a new CAudioEqualizerUtility* +// ---------------------------------------------------------------------------- +// +EXPORT_C void CEqualizerPresetsDialog::SetAudioEqualizerL( +CAudioEqualizerUtility* aAudEqUtility) + { + iAudEqUtility=aAudEqUtility; + if (iItemArray) + { + iItemArray->SetAudioEqualizer(iAudEqUtility); + } + + if (iEditingDialog) + { + iEditingDialog->SetAudioEqualizerL(iAudEqUtility); + } + + + if (iAudEqUtility) + { + iIgnoreKeyEvents = EFalse; + } + else + { + iIgnoreKeyEvents = ETrue; + } + } + +// ---------------------------------------------------------------------- +// CEqualizerPresets::GetListBoxIconsL() +// This function is used to load the lisitbox icons into an array +// ---------------------------------------------------------------------- +// +CArrayPtr* CEqualizerPresetsDialog::GetListBoxIconsL() const + { + // Get the icon array and deleted if already exists. Memory leak error. + CArrayPtr* previcons = iListBox->ItemDrawer()->ColumnData()->IconArray(); + if( previcons ) + { + previcons->ResetAndDestroy(); + delete previcons; + previcons = NULL; + } + + // CGulIcon class packages two bitmaps: icon image and its mask + // CAknIconArray inherits from CArrayPtrFlat + CArrayPtr* iconList = new (ELeave) + CAknIconArray(KEqualizerArrayGranularity); + CleanupStack::PushL(iconList); + + // Find which drive this DLL is installed. + TFileName fileName; + // Get the full resource file + TParse fp; + // Add the resource dir + fp.Set( KIconsFilename, &KDC_APP_BITMAP_DIR, NULL); + + // Get the filename with full path + fileName = fp.FullName(); + + MAknsSkinInstance* skinInstance; + CFbsBitmap* newIconBmp = NULL; + CFbsBitmap* newIconBmpMask = NULL; + CGulIcon* newIcon = NULL; + + skinInstance = AknsUtils::SkinInstance(); + + //creating blank icon + AknsUtils::CreateIconLC(skinInstance,KAknsIIDQgnPropEmpty, + newIconBmp,newIconBmpMask,fileName, + EMbmEqualizerEmpty13x13, + EMbmEqualizerEmpty13x13_mask); + + newIcon = CGulIcon::NewL(newIconBmp,newIconBmpMask); + + CleanupStack::Pop(2); + CleanupStack::PushL(newIcon); + iconList->AppendL(newIcon); + + CleanupStack::Pop(); + + //creating TICK mark icon + AknsUtils::CreateIconLC(skinInstance,KAknsIIDQgnPropPslnActive, + newIconBmp,newIconBmpMask,fileName, + EMbmEqualizerQgn_prop_psln_active, + EMbmEqualizerQgn_prop_psln_active_mask); + + + newIcon = CGulIcon::NewL(newIconBmp,newIconBmpMask); + + CleanupStack::Pop(2); + CleanupStack::PushL(newIcon); + iconList->AppendL(newIcon); + + CleanupStack::Pop(); + + CleanupStack::Pop(iconList); + + newIconBmp = NULL; + newIconBmpMask = NULL; + newIcon = NULL; + + return iconList; + } + +// ------------------------------------------------------------------- +// CEqualizerPresetsDialog::ExecuteLD() +// +// This function is called to create a dialog +// to display the preset list view of the equalizer +// -------------------------------------------------------------------- +// +EXPORT_C TInt CEqualizerPresetsDialog::ExecuteLD() + { + TInt ret = CAknDialog::ExecuteLD(R_EQUALIZER_DIALOG); + return ret; + } + +// --------------------------------------------------------------------------- +// void CEqualizerPresetsDialog::PreLayoutDynInitL(void) +// This function is called just before the dialog is displayed +// --------------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::PreLayoutDynInitL(void) + { + + CEikStatusPane* sp=iEikonEnv->AppUiFactory()->StatusPane(); + CAknTitlePane* tp=(CAknTitlePane*)sp->ControlL(TUid::Uid( + EEikStatusPaneUidTitle)); + // Store the Application's title text + iAppTitleText = tp->Text()->AllocL(); + + // Set preset name in the title pane + tp->SetTextL(*iTitleText); + + iPreviousStatusPaneLayout = sp->CurrentLayoutResId(); + + if ( sp ) + { + if ( R_AVKON_STATUS_PANE_LAYOUT_USUAL != iPreviousStatusPaneLayout ) + { + sp->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL ); + } + } + iListBox= (CAknSingleGraphicStyleListBox*)Control(ESelectionListControl); + iListBox->ItemDrawer()->ColumnData()->SetIconArray(GetListBoxIconsL()); + + // Set item array to listbox model + iListBox->Model()->SetItemTextArray(iItemArray); + // Item array is not owned by ListBox so it has to be freed. + iListBox->Model()->SetOwnershipType(ELbmDoesNotOwnItemArray); + + // + // Create a scrollbar that will be displayed automatically + // if all the items cannot be displayed on screen + // + iListBox->CreateScrollBarFrameL(ETrue); + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff,CEikScrollBarFrame::EAuto); + // Set focus to the currently active preset + +#ifdef RD_SCALABLE_UI_V2 + iListBox->SetListBoxObserver(this); +#endif //RD_SCALABLE_UI_V2 + TPresetName currentPreset = CurrentPreset(); + + TInt cur = SearchPresetL(currentPreset); + if (cur == KErrNotFound) //Some preset should always be active + { + User::Leave(KErrNotSupported); + } + iListBox->SetCurrentItemIndexAndDraw(cur); + + } + +// ------------------------------------------------------------------- +// CEqualizerPresetsDialog::OkToExitL(TInt aButtonId) +// +// This function is called when the user presses the selection key +// for displaying context sesitive menu +// -------------------------------------------------------------------- +// +TBool CEqualizerPresetsDialog::OkToExitL(TInt aButtonId) + { + TBool ret = EFalse; + if (aButtonId == EEikBidOk) + { + iContextSensitiveMenu = ETrue; + DisplayMenuL(); + } + else if (aButtonId == EAknSoftkeyBack) + { + CEikStatusPane* sp=iEikonEnv->AppUiFactory()->StatusPane(); + CAknTitlePane* tp=(CAknTitlePane*)sp->ControlL(TUid::Uid( + EEikStatusPaneUidTitle)); + + if (iAppTitleText) + { + //set application name in the title pane + tp->SetTextL(*iAppTitleText); + } + ret = CAknDialog::OkToExitL( aButtonId ); + } + else if (aButtonId == EAknSoftkeySelect) + { + const TInt index = iListBox->CurrentItemIndex(); + TPresetName preset = GetHighlightedPresetInListBox(); + ActivateEqrPresetL(index, preset); + } + else + { + ret = CAknDialog::OkToExitL( aButtonId ); + } + + if ( ret ) + { + // Restore landscape layout + CEikStatusPane* sp=iEikonEnv->AppUiFactory()->StatusPane(); + if( Layout_Meta_Data::IsLandscapeOrientation() ) + { + if ( sp && KErrNone != iPreviousStatusPaneLayout ) + { + if ( sp->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_USUAL ) + { + sp->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL ); + } + } + } + else + { + CAknLocalScreenClearer* clearer = CAknLocalScreenClearer::NewLC( ETrue ); + sp->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT ); + CleanupStack::PopAndDestroy( clearer ); + } + } + return ret; + } + +// ------------------------------------------------------------------- +// void CEqualizerPresetsDialog::SizeChanged() +// +// This function is called by the framework whenever there is a change +// in the size of the control +// ------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::SizeChanged() + { + TRect rect = Rect(); + //Getting the layout for the list box + AknLayoutUtils::LayoutControl(iListBox, rect, AknLayout::list_gen_pane(1)); + CAknDialog::SizeChanged(); + } + +// ------------------------------------------------------------------- +// void CEqualizerPresetsDialog::HandleForegroundEventL( TBool aForeground) +// +// Handles changes to the application +// when it switches to or from the foreground. +// ------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::HandleForegroundEventL( TBool aForeground) + { + if (aForeground) + { + CEikStatusPane* sp=iEikonEnv->AppUiFactory()->StatusPane(); + CAknTitlePane* tp=(CAknTitlePane*)sp->ControlL(TUid::Uid( + EEikStatusPaneUidTitle)); + tp->SetTextL(*iTitleText); + } + } + +// ------------------------------------------------------------------- +// void CEqualizerPresetsDialog::FocusChanged(TDrawNow aDrawNow) +// +// Responds to a change in focus. +// This is called whenever the control gains or loses focus +// ------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::FocusChanged(TDrawNow /*aDrawNow*/) + { + iItemArray->UpdateSortedArrayL(); + TPresetName currentPreset = CurrentPreset(); + iItemArray->SetCurrentActivePreset(currentPreset); + + if(iListBox) + { + iListBox->HandleItemAdditionL(); + } + } + +// ------------------------------------------------------------------- +// void CEqualizerFreqBand::HandleResourceChangeL(TInt aType) +// +// This function is called by the framework whenever there is a +// change in skin or layout +// ------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::HandleResourceChangeL(TInt aType) + { + if (aType == KAknsMessageSkinChange) + { + //Creating the icons for the new Skin + iListBox->ItemDrawer()->ColumnData()->SetIconArray(GetListBoxIconsL()); + iListBox->HandleResourceChange(aType); + } + + else if (aType == KEikDynamicLayoutVariantSwitch) + { + TRect rect; + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, rect); + SetRect(rect); + } + + } + +void CEqualizerPresetsDialog::HandleResourceChange(TInt aType) + { + CAknDialog::HandleResourceChange( aType ); + HandleResourceChangeL(aType); + } + +// --------------------------------------------------------- +// CEqualizerPresetsDialog::OfferKeyEventL( +// const TKeyEvent& aKeyEvent,TEventCode aType) +// This function is used to handle key events +// --------------------------------------------------------- +// +TKeyResponse CEqualizerPresetsDialog::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + if (iIgnoreKeyEvents) + { + return EKeyWasNotConsumed; + } + if (aType == EEventKey) + { + if (aKeyEvent.iCode == EKeyBackspace) + { + // Find the preset highlighted + const TInt listBoxIndex = iListBox->CurrentItemIndex(); + + // pre-defined presets cannot be deleted. + // preset "None" is not stored in engine. + if (listBoxIndex > (TInt) + (iAudEqUtility->NumberOfPreDefinedPresets())) + { + TPresetName preset = GetHighlightedPresetInListBox(); + DeleteEqrPresetL(listBoxIndex, preset); + } + return EKeyWasConsumed; + } + } + return CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + } + +// --------------------------------------------------------------------------- +// CEqualizerPresetsDialog::DynInitMenuPaneL( +// TInt aResourceId,CEikMenuPane* aMenuPane) +// This function is called by the EIKON framework just before it displays +// a menu pane. Its default implementation is empty, and by overriding it, +// the application can set the state of menu items dynamically according +// to the state of application data. +// --------------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::DynInitMenuPaneL( + TInt aResourceId, CEikMenuPane* aMenuPane) + { + TPresetName selectedItem = GetHighlightedPresetInListBox(); + + TInt selectedIndex = iListBox->CurrentItemIndex(); + TInt numberOfPreDefinedPresets = + iAudEqUtility->NumberOfPreDefinedPresets(); + + if ( aResourceId == R_EQUALIZER_CONTAINER_MENU) + { + //Is the menubar invoked from Options menu or selection key? + if (iContextSensitiveMenu == EFalse) + { + // The menubar is invoked from Options menu + iMenuBar->SetMenuType(CEikMenuBar::EMenuOptions); + // The selected preset is "None" + if (selectedItem.Compare(*iPresetNoneText) == 0) + { + aMenuPane->SetItemDimmed(EEqualizerCmdRename, ETrue); + aMenuPane->SetItemDimmed(EEqualizerCmdDelete, ETrue); + aMenuPane->SetItemDimmed(EEqualizerCmdEdit, ETrue); + } + // The selected preset is a pre defined preset other than "None" + if (selectedIndex <= numberOfPreDefinedPresets) + { + aMenuPane->SetItemDimmed(EEqualizerCmdRename, ETrue); + aMenuPane->SetItemDimmed(EEqualizerCmdDelete, ETrue); + } + // Help should be displayed only if the feature is supported + // according to Feature Manager + if (!FeatureManager::FeatureSupported(KFeatureIdHelp)) + { + aMenuPane->SetItemDimmed(EEqualizerCmdHelp, ETrue); + } + } + else + { + // The menubar is invoked from selection key + iMenuBar->SetMenuType(CEikMenuBar::EMenuContext); + // These Options are always hidden + aMenuPane->SetItemDimmed(EEqualizerCmdDelete, ETrue); + aMenuPane->SetItemDimmed(EEqualizerCmdRename, ETrue); + aMenuPane->SetItemDimmed(EEqualizerCmdCreateNew, ETrue); + aMenuPane->SetItemDimmed(EEqualizerCmdHelp, ETrue); + aMenuPane->SetItemDimmed(EAknCmdExit, ETrue); + + // The selected preset is "None" + if (selectedItem.Compare(*iPresetNoneText) == 0) + { + aMenuPane->SetItemDimmed(EEqualizerCmdEdit, ETrue); + } + iContextSensitiveMenu = EFalse; + } + } + } + +// ------------------------------------------------------------------- +// CEqualizerPresetsDialog::ProcessCommandL(TInt aCommandId ) +// +// This function is called to process the menubar command in a dialog +// -------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::ProcessCommandL(TInt aCommandId ) + { + // Need to do this in all cases or menu does not disappear after + // a selection is made + CAknDialog::ProcessCommandL(aCommandId); + + // Find the preset highlighted + const TInt index = iListBox->CurrentItemIndex(); + TPresetName preset = GetHighlightedPresetInListBox(); + + switch(aCommandId) + { + case EAknCmdExit : + case EEikCmdExit : + { + iAvkonAppUi->HandleCommandL( aCommandId ); + break; + } + case EEqualizerCmdEdit: + { + EditEqrPresetL(index, preset); + break; + } + case EEqualizerCmdActivate: + { + ActivateEqrPresetL(index, preset); + break; + } + case EEqualizerCmdCreateNew: + { + TInt presetIndex = -1; + TPresetName presetName; + + CreateNewEqrPresetL(presetIndex, presetName); + + if (presetIndex != -1) + { + // A valid preset name has been entered + EditEqrPresetL(presetIndex, presetName); + } + break; + } + + case EEqualizerCmdDelete: + { + DeleteEqrPresetL(index, preset); + break; + } + + case EEqualizerCmdRename: + { + RenameEqrPresetL(index, preset); + break; + } + + case EEqualizerCmdHelp: + { + HlpLauncher::LaunchHelpApplicationL + ( iEikonEnv->WsSession(), + CEikonEnv::Static()->AppUi()->AppHelpContextL() ); + break; + } + + default: + { + break; + } + } + } + +// ------------------------------------------------------------------- +// void CEqualizerPresetsDialog::GetHelpContext( +// TCoeHelpContext& aContext ) const +// Get help context for the control +// -------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::GetHelpContext( + TCoeHelpContext& aContext ) const + { + aContext.iMajor = KUidEqualizer; + aContext.iContext = KEQ_HLP_LIST_VIEW; + } + +// ------------------------------------------------------------------- +// void CEqualizerPresetsDialog::ShowDiskFullNoteL() +// This function is used to display a note to the user if +// memory is below critical level when creating a new preset. +// -------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::ShowDiskFullNoteL() const + { + HBufC* message = NULL; + message = StringLoader::LoadLC(R_QTN_MEMLO_NOT_ENOUGH_MEMORY); + + CAknGlobalNote* note = CAknGlobalNote::NewLC(); + note->SetSoftkeys(R_AVKON_SOFTKEYS_OK_EMPTY); + note->ShowNoteL(/*status,*/ EAknGlobalErrorNote, *message); + + CleanupStack::PopAndDestroy(note); // note, message + CleanupStack::PopAndDestroy(message); // note, message + } + +#ifdef RD_SCALABLE_UI_V2 +// ------------------------------------------------------------------- +// void CEqualizerPresetsDialog::HandleListBoxEventL +// This function callback from MEikListBoxObserver when a listbox item +// is double clicked using a pen input . +// -------------------------------------------------------------------- +// +void CEqualizerPresetsDialog::HandleListBoxEventL( + CEikListBox* /*aListBox*/, + TListBoxEvent aEventType ) + { + switch ( aEventType ) + { +#ifdef SINGLE_CLICK_INCLUDED + case EEventItemSingleClicked: +#endif + case EEventItemDoubleClicked: + { + const TInt index = iListBox->CurrentItemIndex(); + TPresetName preset = GetHighlightedPresetInListBox(); + ActivateEqrPresetL(index, preset); + break; + } + default: + break; + } + } +#endif //RD_SCALABLE_UI_V2 +// End of File +