--- /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 <StringLoader.h>
+#include <akntitle.h>
+#include <eikenv.h>
+#include <bldvariant.hrh>
+#include <aknnotewrappers.h>
+#include <bautils.h>
+#include <aknenv.h>
+#include <aknlists.h>
+#include <data_caging_path_literals.hrh>
+#include <eikclbd.h>
+#include <AknIconArray.h>
+#include <avkon.hrh>
+//LAF and Skin changes
+#include <AknsUtils.h>
+#include <e32base.h>
+#include <AknsConstants.h>
+#include <aknlayout.cdl.h>
+#include <featmgr.h>
+#include <hlplch.h>
+#include <AudioEqualizerUtility.h>
+#include <sysutil.h>
+#include <AknGlobalNote.h>
+#include <aknclearer.h>
+#include <layoutmetadata.cdl.h>
+
+#include <csxhelp/eq.hlp.hrh>
+#include <Equalizer.rsg> // Contains the resource definition
+#include <equalizer.mbg>
+#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<KMaxPresetNameLength> number;
+
+ // The loop is iterated until a free folder name is found.
+ FOREVER
+ {
+ found = EFalse;
+ // Constructs a candidate for the name
+ TBuf<KMaxPresetNameLength> 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<RFs>( 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<TEfAudioEqualizerUtilityPreset> 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; i<iItemArray->MdcaCount(); 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<CGulIcon>* CEqualizerPresetsDialog::GetListBoxIconsL() const
+ {
+ // Get the icon array and deleted if already exists. Memory leak error.
+ CArrayPtr<CGulIcon>* 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<CGulIcon>* 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
+