diff -r 14979e23cb5e -r 3de6c4cf6b67 mpxplugins/viewplugins/views/commonplaybackview/src/mpxbutton.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpxplugins/viewplugins/views/commonplaybackview/src/mpxbutton.cpp Wed Sep 01 12:32:02 2010 +0100 @@ -0,0 +1,445 @@ +/* +* Copyright (c) 2006 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: Button class. +* +*/ + + + +// INCLUDE FILES +#include +#include +#include // CAknKeySoundSystem +#include +#include +#include +#include +#include +#include +#include +#include +#include "mpxbutton.h" +#include "mpxplaybackviewlayoutinterface.h" +#include "mpxcommonplaybackview.hrh" +#include "mpxlog.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMPXButton::CMPXButton +// ----------------------------------------------------------------------------- +// +CMPXButton::CMPXButton( + TMPXPbvButton aButtonId, + MMPXButtonCmdObserver* aObserver, + MMPXPlaybackViewLayout* aLayout ) + : iButtonId( aButtonId ), + iCurrentStateIndex( KErrNotFound ), + iObserver( aObserver ), + iVisible( ETrue ), + iLayout( aLayout ) + { + MPX_FUNC("CMPXButton::CMPXButton()"); + } + +// ----------------------------------------------------------------------------- +// CMPXButton::NewLC +// ----------------------------------------------------------------------------- +// +CMPXButton* CMPXButton::NewLC( + TMPXPbvButton aButtonId, + MMPXButtonCmdObserver* aObserver, + MMPXPlaybackViewLayout* aLayout ) + { + MPX_FUNC("CMPXButton::NewLC()"); + CMPXButton* self = new (ELeave) CMPXButton( + aButtonId, + aObserver, + aLayout ); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CMPXButton::NewL +// ----------------------------------------------------------------------------- +// +CMPXButton* CMPXButton::NewL( + TMPXPbvButton aButtonId, + MMPXButtonCmdObserver* aObserver, + MMPXPlaybackViewLayout* aLayout ) + { + MPX_FUNC("CMPXButton::NewL()"); + CMPXButton* self = CMPXButton::NewLC( + aButtonId, + aObserver, + aLayout ); + CleanupStack::Pop(self); + return self; + } + +// Destructor +CMPXButton::~CMPXButton() + { + MPX_FUNC("CMPXButton::~CMPXButton()"); + FreeIcons(); + iButtonArray.ResetAndDestroy(); + + if (iTimer) + { + iTimer->Cancel(); + delete iTimer; + } + } + +// ----------------------------------------------------------------------------- +// CMPXButton::ConstructL +// ----------------------------------------------------------------------------- +// +void CMPXButton::ConstructL() + { + MPX_FUNC("CMPXButton::ConstructL()"); + iKeySoundSystem = static_cast( + CEikonEnv::Static()->AppUi())->KeySounds(); + + iTimer = CPeriodic::NewL( CActive::EPriorityStandard ); + } + + +// ----------------------------------------------------------------------------- +// CMPXButton::AddStateL +// ----------------------------------------------------------------------------- +// +void CMPXButton::AddStateL( + TInt aState, + TInt aEnterCommand, + TInt aExitCommand, + TInt aLongEnterCommand, + TInt aLongExitCommand ) + { + MPX_DEBUG1("CMPXButton::AddStateL() entering"); + TMPXButtonInfo* info = new (ELeave) TMPXButtonInfo; + CleanupStack::PushL( info ); + info->iState = aState; + info->iEnterCommand = aEnterCommand; + info->iExitCommand = aExitCommand; + info->iLongEnterCommand = aLongEnterCommand; + info->iLongExitCommand = aLongExitCommand; + info->iBitmap = LoadIconL( aState ); + iButtonArray.AppendL(info); + CleanupStack::Pop( info ); + MPX_DEBUG1("CMPXButton::AddStateL() exiting"); + } + +// ----------------------------------------------------------------------------- +// CMPXButton::Id +// ----------------------------------------------------------------------------- +// +TMPXPbvButton CMPXButton::Id() const + { + return iButtonId; + } + +// ----------------------------------------------------------------------------- +// CMPXButton::MakeVisible +// ----------------------------------------------------------------------------- +// +void CMPXButton::MakeVisible( + TBool aVisible ) + { + iVisible = aVisible; + } + +// ----------------------------------------------------------------------------- +// CMPXButton::IsVisible +// ----------------------------------------------------------------------------- +// +TBool CMPXButton::IsVisible() const + { + return iVisible; + } + +// ----------------------------------------------------------------------------- +// CMPXButton::SetButtonState +// ----------------------------------------------------------------------------- +// +void CMPXButton::SetButtonState( + TInt aState, + TBool aNotifyExit /*=EFalse=*/, + TBool aNotifyEnter /*=EFalse*/ ) + { + MPX_DEBUG4("CMPXButton::SetButtonState(%d, %d, %d): entering", aState, aNotifyExit, aNotifyEnter); + + TInt index( KErrNotFound ); + TMPXButtonInfo* info( NULL ); + + // Find the new state + for (TInt i = 0; i < iButtonArray.Count(); i++) + { + info = iButtonArray[i]; + if ( info->iState == aState ) + { + index = i; + } + } + + if ( KErrNotFound != index && + iCurrentStateIndex != index ) + { + if ( aNotifyExit || aNotifyEnter ) + { + if ( aNotifyExit ) + { + // Execute the previous state's exit command + info = iButtonArray[iCurrentStateIndex]; + if ( iIsLongPress ) + { + if ( info->iLongExitCommand != KErrNone ) + { + TRAP_IGNORE( + iObserver->HandleButtonCommandL( info->iLongExitCommand )); + } + } + else if ( info->iExitCommand != KErrNone ) + { + TRAP_IGNORE( + iObserver->HandleButtonCommandL( info->iExitCommand )); + } + // Reset long press flag + iIsLongPress = EFalse; + } + + info = iButtonArray[index]; + if ( aNotifyEnter ) + { + // Now execute the new state's enter command + if ( info->iEnterCommand != KErrNone ) + { + TRAP_IGNORE( + iObserver->HandleButtonCommandL( info->iEnterCommand )); + } + } + + // start the timer + iTimer->Cancel(); + if ( info->iLongEnterCommand != KErrNone ) + { + iTimer->Start( KAknKeyboardRepeatInitialDelay, + KAknKeyboardRepeatInitialDelay, + TCallBack(TimerCallback, this )); + } + } + + iCurrentStateIndex = index; + iNeedRedraw = ETrue; + } + MPX_DEBUG1("CMPXButton::SetButtonState(): exiting"); + } + +// ----------------------------------------------------------------------------- +// CMPXButton::CurrentState +// ----------------------------------------------------------------------------- +// +TInt CMPXButton::CurrentState() const + { + MPX_DEBUG1("CMPXButton::CurrentState() entering"); + ASSERT( iCurrentStateIndex < iButtonArray.Count() ); + TInt state( iButtonArray[iCurrentStateIndex]->iState ); + MPX_DEBUG2("CMPXButton::CurrentState() exiting: %d", state); + return state; + } + +// ----------------------------------------------------------------------------- +// CMPXButton::RedrawRect +// ----------------------------------------------------------------------------- +// +void CMPXButton::RedrawRect( + CBitmapContext& aGc, + const TRect& aRect ) const + { + MPX_DEBUG1("CMPXButton::RedrawRect() entering"); + + if (iVisible && aRect.Intersects(iRect)) + { + if (iBackground) + { + MPX_DEBUG1("CMPXButton::RedrawRect() redrawing background"); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + AknsDrawUtils::DrawBackground( + skin, + iBackground, + NULL, + aGc, + iRect.iTl, + iRect, + KAknsDrawParamDefault ); + } + + MPX_DEBUG2("CMPXButton::RedrawRect(): iCurrentStateIndex = %d", iCurrentStateIndex); + ASSERT( iCurrentStateIndex < iButtonArray.Count() ); + TMPXButtonInfo* info( iButtonArray[iCurrentStateIndex] ); + CGulIcon* icon( info->iBitmap ); + + if ( icon ) + { + ASSERT( icon->Bitmap() && icon->Mask() ); + MPX_DEBUG1("CMPXButton::RedrawRect() redrawing icon"); + aGc.BitBltMasked( + iRect.iTl, // aPoint + icon->Bitmap(), // aBitmap + TRect(TPoint(), iRect.Size()), // aSourceRect + icon->Mask(), + EFalse); // aInvertMask + } + } + MPX_DEBUG1("CMPXButton::RedrawRect() exiting"); + } + +// ----------------------------------------------------------------------------- +// CMPXButton::ReloadIconsL +// ----------------------------------------------------------------------------- +// +void CMPXButton::ReloadIconsL( + const TRect& aParentRect ) + { + MPX_DEBUG1("CMPXButton::ReloadIconsL() entering"); + iParentRect = aParentRect; + + FreeIcons(); + + iRect = iLayout->ButtonLayout( aParentRect ); + for (TInt i = 0; i < iButtonArray.Count(); i++) + { + TMPXButtonInfo* info( iButtonArray[i] ); + info->iBitmap = LoadIconL( info->iState ); + AknIconUtils::SetSize( + info->iBitmap->Bitmap(), + iRect.Size() ); + } + MPX_DEBUG1("CMPXButton::ReloadIconsL() exiting"); + } + +// ----------------------------------------------------------------------------- +// CMPXButton::SetBackground +// ----------------------------------------------------------------------------- +// +void CMPXButton::SetBackground( + MAknsControlContext* aBackground) + { + ASSERT( aBackground ); + iBackground = aBackground; + } + +// ----------------------------------------------------------------------------- +// CMPXButton::NeedRedraw +// ----------------------------------------------------------------------------- +// +TBool CMPXButton::NeedRedraw() const + { + return iNeedRedraw; + } + +// ----------------------------------------------------------------------------- +// CMPXButton::ClearRedrawFlag +// ----------------------------------------------------------------------------- +// +void CMPXButton::ClearRedrawFlag() + { + iNeedRedraw = EFalse; + } + +// ----------------------------------------------------------------------------- +// CMPXButton::LoadIconL +// ----------------------------------------------------------------------------- +// +CGulIcon* CMPXButton::LoadIconL( + TInt aState ) + { + MPX_DEBUG1("CMPXButton::LoadIconL() entering"); + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + + iLayout->GetButtonBitmapsL( + iButtonId, + aState, + bitmap, + mask); + CleanupStack::PushL(bitmap); + CleanupStack::PushL(mask); + + CGulIcon* res = CGulIcon::NewL(bitmap, mask); + CleanupStack::Pop(2); // bitmap, mask + + MPX_DEBUG1("CMPXButton::LoadIconL() exiting"); + return res; + } + +// ----------------------------------------------------------------------------- +// CMPXButton::FreeIcons +// ----------------------------------------------------------------------------- +// +void CMPXButton::FreeIcons() + { + MPX_DEBUG1("CMPXButton::FreeIcons() entering"); + for ( TInt i = 0; i < iButtonArray.Count(); i++ ) + { + TMPXButtonInfo* info( iButtonArray[i] ); + delete info->iBitmap; + info->iBitmap = NULL; + } + MPX_DEBUG1("CMPXButton::FreeIcons() exiting"); + } + + +// ----------------------------------------------------------------------------- +// CMPXButton::HandleKeyRepeat +// ----------------------------------------------------------------------------- +// +void CMPXButton::HandleLongPress() + { + MPX_DEBUG1("CMPXButton::HandleLongPress() entering"); + + iIsLongPress = ETrue; + + TMPXButtonInfo* info( iButtonArray[iCurrentStateIndex] ); + if ( info->iLongEnterCommand != KErrNone ) + { + if( !(info->iLongEnterCommand == EMPXPbvCmdIncreaseVolume || + info->iLongEnterCommand == EMPXPbvCmdDecreaseVolume )) + { + iTimer->Cancel(); + } + + TRAP_IGNORE(iObserver->HandleButtonCommandL( info->iLongEnterCommand )); + } + + MPX_DEBUG1("CMPXButton::HandleLongPress() exiting"); + } + +// ----------------------------------------------------------------------------- +// CMPXButton::TimerCallback +// ----------------------------------------------------------------------------- +// +TInt CMPXButton::TimerCallback( + TAny* aPtr ) + { + MPX_DEBUG1("CMPXButton::TimerCallback() entering"); + static_cast(aPtr)->HandleLongPress(); + MPX_DEBUG1("CMPXButton::TimerCallback() exiting"); + return KErrNone; + } + +// End of File