/*
* 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: Defines functionality related to Equalizer Settings Dialog
*
*/
// INCLUDE FILES
#include <bautils.h>
#include <aknenv.h>
#include <avkon.hrh>
#include <e32cmn.h>
#include <data_caging_path_literals.hrh>
//LAF and Skin changes
#include <aknlayout.cdl.h>
#include <aknlayoutscalable_apps.cdl.h>
#include <AknLayout2ScalableDef.h>
#include <AknLayout2Def.h>
#include <AknUtils.h>
#include <bldvariant.hrh>
#include <featmgr.h>
#include <AudioEqualizerUtility.h>
#include <hlplch.h>
#include <StringLoader.h>
#include <akntitle.h>
#include <aknnotewrappers.h>
#include <Equalizer.rsg>
#include "EqualizerPrivateConstants.h"
#include <csxhelp/eq.hlp.hrh>
#include "EqualizerEditingDialog.h"
#include "EqualizerFreqBandContainer.h"
#include "Equalizer.hrh"
// ============================ MEMBER FUNCTIONS =============================
// -------------------------------------------------------------------
// CEqualizerEditingDialog* CEqualizerEditingDialog::NewL(
// CAudioEqualizerUtility& aAudEqUtility,
// const TInt aPresetIndex, TRect& aRect, const TBool aIsActivePreset)
// Create instance of concrete ECOM interface implementation
// -------------------------------------------------------------------
//
CEqualizerEditingDialog* CEqualizerEditingDialog::NewL(
CAudioEqualizerUtility* aAudEqUtility, const TInt aPresetIndex,
TRect& aRect, const TBool aIsActivePreset,
MEqualizerPresetActivationObserver& aObserver,
TInt aPresetKey)
{
CEqualizerEditingDialog* self = new (ELeave) CEqualizerEditingDialog(
aAudEqUtility, aPresetIndex, aRect, aIsActivePreset, aObserver,
aPresetKey);
CleanupStack::PushL(self);
self->ConstructL();
CleanupStack::Pop(self);
return self;
}
// -------------------------------------------------------------------
// CEqualizerEditingDialog::ConstructL()
// Second Phase Constructor
// -------------------------------------------------------------------
//
void CEqualizerEditingDialog::ConstructL()
{
//Initially set these variable to EFalse
iIgnoreKeyEvents = EFalse;
iContextSensitiveMenu = EFalse;
iPresetName = iAudEqUtility->GetPresetL(iPresetIndex);
CAudioEqualizer& audioEqualizer = iAudEqUtility->Equalizer();
iNumberOfFreqBands = audioEqualizer.NumberOfBands();
iMover=new(ELeave)CArrayFixSeg<TInt>(KEqualizerArrayGranularity);
iFreqBandRect = RArray<TRect>(iNumberOfFreqBands);
iScaleRect = RArray<TRect>(iNumberOfFreqBands);
iBackgroundRect = RArray<TRect>(iNumberOfFreqBands);
iSliderRect = RArray<TRect>(iNumberOfFreqBands);
GetLayoutRect();
// 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 );
CAknDialog::ConstructL(R_EQUALIZER_SETTINGS_MENUBAR);
}
// ---------------------------------------------------------------------
// CEqualizerEditingDialog::CEqualizerEditingDialog
// (CAudioEqualizerUtility* aAudEqUtility, TInt aPresetIndex,
// TRect& aRect, const TBool aIsActivePreset)
// First phase constructor
// ---------------------------------------------------------------------
//
CEqualizerEditingDialog::CEqualizerEditingDialog(CAudioEqualizerUtility*
aAudEqUtility, const TInt aPresetIndex, TRect& aRect,
const TBool aIsActivePreset, MEqualizerPresetActivationObserver& aObserver,
TInt aPresetKey ):
iAudEqUtility(aAudEqUtility),
iPresetIndex(aPresetIndex), iRect(aRect),
iIsActivePreset(aIsActivePreset),
iObserver( aObserver ), iPresetKey( aPresetKey )
{
}
// --------------------------------------------------------------------
// CEqualizerEditingDialog::~CEqualizerEditingDialog()
// Destructor
// --------------------------------------------------------------------
//
CEqualizerEditingDialog::~CEqualizerEditingDialog()
{
if (iResourceFileOffset)
{
iEikonEnv->DeleteResourceFile(iResourceFileOffset);
}
if (iMover)
{
iMover->Reset();
delete iMover;
}
iFreqBandRect.Close();
iScaleRect.Close();
iBackgroundRect.Close();
iSliderRect.Close();
}
// --------------------------------------------------------------------
// SEikControlInfo CEqualizerEditingDialog::
// CreateCustomControlL ( TInt aControlType )
// This function is called by the framework to create a custom control
// inside the dialog
// --------------------------------------------------------------------
//
SEikControlInfo CEqualizerEditingDialog::CreateCustomControlL ( TInt
aControlType )
{
SEikControlInfo controlInfo;
controlInfo.iControl = NULL;
controlInfo.iTrailerTextId = 0;
controlInfo.iFlags = 0;
SetMoverPositionsL(EFalse);
switch ( aControlType)
{
case EEqualizerCustomCtrlDlgCtCustomControl:
controlInfo.iControl = new(ELeave) CEqualizerFreqBandContainer
(this, iAudEqUtility, iPresetIndex, iIsActivePreset,
iRect, iObserver, iPresetKey, iPresetName);
iFreqBandContainer = (CEqualizerFreqBandContainer*)
controlInfo.iControl;
break;
default:
break;
}
return controlInfo;
}
// -------------------------------------------------------------------
// void CEqualizerEditingDialog::SizeChanged()
//
// This function is called by the framework whenever the control size
// is changed
// --------------------------------------------------------------------
//
void CEqualizerEditingDialog::SizeChanged()
{
CAknDialog::SizeChanged();
iRect = Rect();
GetLayoutRect();
CAudioEqualizer& audioEqualizer = iAudEqUtility->Equalizer();
iAudEqUtility->ModifyPresetL(iPresetIndex, iPresetName, audioEqualizer);
iMover->Reset();
SetMoverPositionsL(EFalse);
}
// -------------------------------------------------------------------
// void CEqualizerEditingDialog::GetLayoutRect()
//
// This function is called to retrive the freqband rect, scale rect
// slider rect from the layout
// --------------------------------------------------------------------
//
void CEqualizerEditingDialog::GetLayoutRect()
{
iFreqBandRect.Reset();
iScaleRect.Reset();
iBackgroundRect.Reset();
iSliderRect.Reset();
TInt variety = EEqualizerVarietyOne;
if(iNumberOfFreqBands == KEqualizerFiveBands)
variety = EEqualizerVarietyTwo;
for(TInt count = 0; count < iNumberOfFreqBands; count++)
{
iFreqBandRect.Append(CEqualizerFreqBand::ComponentRect(
iRect,variety+2,count));
iScaleRect.Append(CEqualizerFreqBand::ComponentRect(
iFreqBandRect[count],variety,EEqualizerScale));
iBackgroundRect.Append(CEqualizerFreqBand::ComponentRect(
iScaleRect[count],EEqualizerVarietyNotUsed,EEqualizerBackground));
iSliderRect.Append(CEqualizerFreqBand::ComponentRect(
iScaleRect[count],EEqualizerVarietyNotUsed,EEqualizerSlider));
}
}
// --------------------------------------------------------------------
// void CEqualizerEditingDialog::SetMoverPositionsL(TBool aReset)
// This function is used to read the positions of the mover for the
// various bands from the engine.
// --------------------------------------------------------------------
//
void CEqualizerEditingDialog::SetMoverPositionsL(TBool aReset)
{
//Calulate change in db level
TInt32 minBandLevel;
TInt32 maxBandLevel;
iAudEqUtility->GetPresetL(iPresetIndex);
CAudioEqualizer& audioEqualizer = iAudEqUtility->Equalizer();
audioEqualizer.DbLevelLimits(minBandLevel, maxBandLevel);
//The minimum band level should always be negative and the
// maximum band level should always be positive.
if (( minBandLevel > 0 ) || (maxBandLevel < 0))
{
User::Leave(KErrNotSupported);
}
for (TInt i =0; i<iNumberOfFreqBands; i++)
{
TInt scaleHeight = iBackgroundRect[i].Height();
TInt scaleZeroPos = (iBackgroundRect[i].iTl.iY) + (scaleHeight / 2);
TInt halfSliderSize = iSliderRect[i].Height() / 2;
TInt sliderInc = iBackgroundRect[i].Height() / KNumberOfSteps;
TInt diffUIBandLevel = KNumberOfSteps / 2;
TInt curBandlevel = audioEqualizer.BandLevel(i+1);
__ASSERT_DEBUG((curBandlevel >= minBandLevel) ||
(curBandlevel <= maxBandLevel), User::Invariant());
if ((curBandlevel < minBandLevel) || (curBandlevel > maxBandLevel))
{
curBandlevel = 0; //Band level is invalid, use zero instead.
}
if (curBandlevel > 0)
{
TReal frac = (TReal)curBandlevel / maxBandLevel;
TInt moverPos = (TInt) (scaleZeroPos - (frac *
diffUIBandLevel * sliderInc));
if((moverPos < (iBackgroundRect[i].iTl.iY + halfSliderSize)) ||
((scaleZeroPos - moverPos) >= (diffUIBandLevel * sliderInc)))
{
moverPos = iBackgroundRect[i].iTl.iY + halfSliderSize;
}
if (aReset)
{
(*iMover)[i] = moverPos;
}
else
{
iMover->AppendL(moverPos);
}
}
else if (curBandlevel < 0)
{
TReal frac = (TReal)curBandlevel / minBandLevel;
TInt moverPos = (TInt) (scaleZeroPos + (frac *
diffUIBandLevel * sliderInc));
if((moverPos > ((iBackgroundRect[i].iBr.iY ) - halfSliderSize)) ||
((moverPos - scaleZeroPos) >= (diffUIBandLevel * sliderInc)))
{
moverPos = (iBackgroundRect[i].iBr.iY ) - halfSliderSize;
}
if (aReset)
{
(*iMover)[i] = moverPos;
}
else
{
iMover->AppendL(moverPos);
}
}
else
{
if (aReset)
{
(*iMover)[i] = scaleZeroPos;
}
else
{
iMover->AppendL(scaleZeroPos);
}
}
}
}
// ---------------------------------------------------------
// CEqualizerEditingDialog::OfferKeyEventL(
// const TKeyEvent& aKeyEvent,TEventCode aType)
// This function is used to handle key events
// ---------------------------------------------------------
//
TKeyResponse CEqualizerEditingDialog::OfferKeyEventL(
const TKeyEvent& aKeyEvent,
TEventCode aType )
{
if (iIgnoreKeyEvents)
{
return EKeyWasNotConsumed;
}
else
{
return CAknDialog::OfferKeyEventL( aKeyEvent, aType );
}
}
// -------------------------------------------------------------------
// void CEqualizerEditingDialog::ProcessCommandL(TInt aCommandId)
// This function is called by the framework to handle the user's
// menubar command options
// --------------------------------------------------------------------
//
void CEqualizerEditingDialog::ProcessCommandL(TInt aCommandId)
{
// Need to do this in all cases or menu does not disappear after
// a selection is made
CAknDialog::ProcessCommandL(aCommandId);
switch(aCommandId)
{
case EAknCmdExit :
case EEikCmdExit :
{
CAudioEqualizer& audioEqualizer = iAudEqUtility->Equalizer();
iAudEqUtility->ModifyPresetL(iPresetIndex, iPresetName, audioEqualizer);
iAvkonAppUi->HandleCommandL( aCommandId );
break;
}
case EEqualizerCmdHelp:
{
HlpLauncher::LaunchHelpApplicationL
( iEikonEnv->WsSession(),
CEikonEnv::Static()->AppUi()->AppHelpContextL() );
break;
}
case EEqualizerCmdReset:
{
iAudEqUtility->GetPresetL(iPresetIndex);
CAudioEqualizer& audioEqualizer = iAudEqUtility->Equalizer();
if (iPresetIndex < iAudEqUtility->NumberOfPreDefinedPresets())
{
//Predefined preset
iAudEqUtility->ResetPresetL(iPresetIndex);
SetMoverPositionsL(ETrue);
}
else
{
//User defined preset, Reset manually
for (TInt i =0; i<iNumberOfFreqBands; i++)
{
TInt scaleHeight = iBackgroundRect[i].Height();
TInt scaleZeroPos = (iBackgroundRect[i].iTl.iY)
+ (scaleHeight / 2);
(*iMover)[i] = scaleZeroPos;
audioEqualizer.SetBandLevelL(i+1, 0);
}
iAudEqUtility->ModifyPresetL(iPresetIndex, iPresetName,
audioEqualizer);
}
if (iIsActivePreset)
{
TRAP_IGNORE(iAudEqUtility->ApplyPresetL(iPresetIndex));
}
// In MPX, we need to callback to observer when a preset is changed
if( iIsActivePreset )
{
iObserver.HandlePresetActivation( iPresetKey );
}
iFreqBandContainer->SetRect(iRect);
DrawNow();
break;
}
default:
{
break;
}
}
}
// -------------------------------------------------------------------
// void CEqualizerEditingDialog::GetHelpContext(
// TCoeHelpContext& aContext ) const
// Get help context for the control
// --------------------------------------------------------------------
//
void CEqualizerEditingDialog::GetHelpContext(
TCoeHelpContext& aContext ) const
{
aContext.iMajor = KUidEqualizer;
aContext.iContext = KEQ_HLP_EDITING_VIEW;
}
// ---------------------------------------------------------------------------
// CEqualizerEditingDialog::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 CEqualizerEditingDialog::DynInitMenuPaneL(
TInt aResourceId, CEikMenuPane* aMenuPane)
{
if ( aResourceId == R_EQUALIZER_SETTINGS_MENU)
{
iMenuBar->SetMenuType(CEikMenuBar::EMenuOptions);
// Help should be displayed only if the feature is supported
// according to Feature Manager
if (!FeatureManager::FeatureSupported(KFeatureIdHelp))
{
aMenuPane->SetItemDimmed(EEqualizerCmdHelp, ETrue);
}
if(iContextSensitiveMenu)
{
iMenuBar->SetMenuType(CEikMenuBar::EMenuContext);
aMenuPane->SetItemDimmed(EAknCmdExit, ETrue);
aMenuPane->SetItemDimmed(EEqualizerCmdHelp, ETrue);
iContextSensitiveMenu = EFalse;
}
}
}
// ----------------------------------------------------------------------------
// CEqualizerEditingDialog::SetAudioEqualizerL(CAudioEqualizerUtility*
// aAudEqUtility)
// This function is used to set a new CAudioEqualizerUtility*
// ----------------------------------------------------------------------------
//
void CEqualizerEditingDialog::SetAudioEqualizerL(
CAudioEqualizerUtility* aAudEqUtility)
{
iAudEqUtility=aAudEqUtility;
if (iAudEqUtility)
{
iIgnoreKeyEvents = EFalse;
iFreqBandContainer->SetAudioEqualizerL(aAudEqUtility);
}
else
{
iIgnoreKeyEvents = ETrue;
}
}
// -------------------------------------------------------------------
// TInt CEqualizerEditingDialog::ExecuteLD()
// This function is called to execute and delete the dialog
// --------------------------------------------------------------------
//
TInt CEqualizerEditingDialog::ExecuteLD()
{
return CAknDialog::ExecuteLD(R_EQUALIZER_EDITING_DIALOG);
}
// -------------------------------------------------------------------
// TBool CEqualizerEditingDialog::OkToExitL(TInt aButtonId)
// This function is called when the OK key is pressed
// --------------------------------------------------------------------
//
TBool CEqualizerEditingDialog::OkToExitL(TInt aButtonId)
{
TBool ret = EFalse;
if (aButtonId == EEikBidOk)
{
ret = EFalse;
}
else if (aButtonId == EAknSoftkeyBack)
{
CAudioEqualizer& audioEqualizer = iAudEqUtility->Equalizer();
iAudEqUtility->ModifyPresetL(iPresetIndex, iPresetName, audioEqualizer);
HBufC* iTitleText = StringLoader::LoadLC(R_QTN_EQUALIZER_TITLE_TEXT);
CEikStatusPane* sp=iEikonEnv->AppUiFactory()->StatusPane();
CAknTitlePane* tp=(CAknTitlePane*)sp->ControlL(TUid::Uid(EEikStatusPaneUidTitle));
tp->SetTextL(*iTitleText);
CleanupStack::PopAndDestroy(iTitleText);
ret = CAknDialog::OkToExitL( aButtonId );
}
else if(aButtonId == EAknSoftkeyContextOptions)
{
iContextSensitiveMenu = ETrue;
DisplayMenuL();
}
else
{
ret = CAknDialog::OkToExitL( aButtonId );
}
return ret;
}
// -------------------------------------------------------------------
// TInt CEqualizerEditingDialog::GetMoverPosition(TInt aBandIndex)
// This function returns the current mover position for each frequency band
// --------------------------------------------------------------------
//
TInt CEqualizerEditingDialog::GetMoverPosition(TInt aBandIndex)
{
return (*iMover)[aBandIndex];
}
// End of File