diff -r 072a5fa0c63b -r c6bafb5162d8 voicerecorder/RecViewSrc/CVRStateInfoPanel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/voicerecorder/RecViewSrc/CVRStateInfoPanel.cpp Wed Sep 01 12:29:14 2010 +0100 @@ -0,0 +1,521 @@ +/* +* Copyright (c) 2002 - 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: +* A compound control class. It is responsible for drawing and updating +* a set of labels, and a progress bar. +* +*/ + + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "CVRLabel.h" +#include "CVRStateInfoPanel.h" +#include "MVRStateInfoModel.h" +#include "voicerecorder.hrh" +#include "VRConsts.h" + +// CONSTANTS +const TInt KVRLabelMap[] = + { + CVRStateInfoPanel::ELabelName, + CVRStateInfoPanel::ELabelDate, + CVRStateInfoPanel::ELabelQuality, + CVRStateInfoPanel::ELabelStatus, + CVRStateInfoPanel::ELabelMax, + CVRStateInfoPanel::ELabelMin, + CVRStateInfoPanel::ELabelQualityText + }; + +_LIT( KVREmptyLabel, " " ); + + +// ================= MEMBER FUNCTIONS ======================================== + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::CVRStateInfoPanel +// +// ---------------------------------------------------------------------------- +// +CVRStateInfoPanel::CVRStateInfoPanel( MVRStateInfoModel* aModel ) + : iModel( aModel ), iLabels( ENumLabels ), iPBposition( 0 ) + { + if ( iModel ) + { + iModel->SetStateInfoObserver( this ); + } + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::CVRStateInfoPanel +// +// ---------------------------------------------------------------------------- +// +CVRStateInfoPanel::CVRStateInfoPanel( MVRStateInfoModel* aModel, + TUid aParentViewUid ) + : iModel( aModel ), + iLabels( ENumLabels ), + iParentViewUid( aParentViewUid ), + iPBposition( 0 ) + { + if ( iModel ) + { + iModel->SetStateInfoObserver( this ); + iModel->SetStateInfoPanelObserver( this ); + } + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::~CVRStateInfoPanel +// +// ---------------------------------------------------------------------------- +// +CVRStateInfoPanel::~CVRStateInfoPanel() + { + if ( iModel ) + { + iModel->SetStateInfoObserver( NULL ); + } + iLabels.ResetAndDestroy(); + delete iProgressBar; + iSkin = NULL; + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::ConstructL +// +// ---------------------------------------------------------------------------- +// +void CVRStateInfoPanel::ConstructL() + { + // New skin instance is loaded + iSkin = AknsUtils::SkinInstance(); + + // Create labels + for ( TInt i = 0; i < ENumLabels; i++ ) + { + CVRLabel* label = CVRLabel::NewLC( *this ); + + // Set the MOP-parent so that the labels can get the + // skin context from rec view container + label->SetMopParent( this ); + iLabels.AppendL( label ); + CleanupStack::Pop(); // label; + + // Set initial text for label + TBuf< VRLABELMAXLENGTH > str; + iModel->GetLabel( str, i ); + label->SetText( str ); + } + + CreateProgressBarL(); + UpdateLayoutL(); + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::CreateProgressBarL +// +// ---------------------------------------------------------------------------- +// +void CVRStateInfoPanel::CreateProgressBarL() + { + delete iProgressBar; + iProgressBar = NULL; + + // Create progress bar + CEikProgressInfo::SInfo info = ProgressInfo(); + + iProgressBar = new( ELeave ) CEikProgressInfo( info ); + iProgressBar->SetContainerWindowL( *this ); + + // Set the MOP-parent so that the progress bar can get the + // skin context from rec view container + iProgressBar->SetMopParent( this ); + iProgressBar->ConstructL(); + + iProgressBar->ActivateL(); + AknLayoutUtils::LayoutControl( iProgressBar, Rect(), + AppLayout::Voice_Recorder_elements_Line_4() ); + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::SizeChanged +// +// ---------------------------------------------------------------------------- +// +void CVRStateInfoPanel::SizeChanged() + { + TAknTextComponentLayout layoutText; + + for ( TInt i = 0; i < ENumLabels; i++ ) + { + switch ( KVRLabelMap[i] ) + { + case 0: + layoutText = AknLayoutScalable_Apps::vorec_t1(); + break; + case 1: + layoutText = AknLayoutScalable_Apps::vorec_t2(); + break; + case 2: + layoutText = AknLayoutScalable_Apps::vorec_t3(); + break; + case 3: + layoutText = AknLayoutScalable_Apps::vorec_t4(); + break; + case 4: + layoutText = AknLayoutScalable_Apps::vorec_t5(); + break; + case 5: + layoutText = AknLayoutScalable_Apps::vorec_t6(); + break; + case 6: + layoutText = AknLayoutScalable_Apps::vorec_t7(); + break; + } + AknLayoutUtils::LayoutLabel( iLabels.At( i ), Rect(), layoutText.LayoutLine() ); + + CCoeControl* label( iLabels.At( i ) ); + TRgb color( KRgbBlack ); + AknsUtils::GetCachedColor( iSkin, color, KAknsIIDQsnTextColors, + EAknsCIQsnTextColorsCG6 ); + // We can ignore the error, it only means we will have wrong color + TRAP_IGNORE( AknLayoutUtils::OverrideControlColorL( *label, + EColorLabelText, color ) ); + } + + // There's nothing rational to do here if it leaves + TRAP_IGNORE( CreateProgressBarL() ); + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::Draw +// +// ---------------------------------------------------------------------------- +// +void CVRStateInfoPanel::Draw( const TRect& /*aRect*/ ) const + { + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::CountComponentControls +// +// ---------------------------------------------------------------------------- +// +TInt CVRStateInfoPanel::CountComponentControls() const + { + TInt componentCount( 0 ); + if ( iProgressBar ) + { + componentCount = ENumLabels + 1; // +1 means iProgressBar + } + return componentCount; + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::ComponentControl +// +// ---------------------------------------------------------------------------- +// +CCoeControl* CVRStateInfoPanel::ComponentControl( TInt aIndex ) const + { + if ( aIndex < ENumLabels ) + { + return iLabels.At( aIndex ); + } + else + { + return iProgressBar; + } + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::Update +// +// ---------------------------------------------------------------------------- +// +void CVRStateInfoPanel::Update( TVRUpdateCommand /*aCommand*/ ) + { + for ( TInt i = 0; i < ENumLabels; i++ ) + { + TBuf< VRLABELMAXLENGTH > str; + iModel->GetLabel( str, i ); + if ( str.Length() < 1 ) + { + // "" doesn't empty the label, so use space + str = KVREmptyLabel; + } + iLabels.At( i )->SetTextAndDraw( str ); + } + + UpdateProgressBar(); + + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::UpdateLayoutL +// +// ---------------------------------------------------------------------------- +// +void CVRStateInfoPanel::UpdateLayoutL() + { + SizeChanged(); + } + + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::ProgressInfo +// +// ---------------------------------------------------------------------------- +// +CEikProgressInfo::SInfo CVRStateInfoPanel::ProgressInfo() + { + CEikProgressInfo::SInfo info; + + TAknWindowLineLayout infobarLayout = + AppLayout::Voice_Recorder_elements_Line_4(); + TAknLayoutRect infobarRect; + infobarRect.LayoutRect( Rect(), infobarLayout ); + + info.iWidth = infobarRect.Rect().Width(); + info.iHeight = infobarRect.Rect().Height(); + + return info; + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::HandleResourceChangeL +// +// ---------------------------------------------------------------------------- +// +void CVRStateInfoPanel::HandleResourceChangeL( TInt aType ) + { + if ( aType == KEikDynamicLayoutVariantSwitch ) + { + UpdateLayoutL(); + } + else if ( aType == KAknsMessageSkinChange ) + { + // New skin instance is loaded + iSkin = AknsUtils::SkinInstance(); + } + + for ( TInt i = 0; i < ENumLabels; i++ ) + { + if ( i < iLabels.Count() ) + { + iLabels.At( i )->HandleResourceChange( aType ); + } + } + + iProgressBar->HandleResourceChange( aType ); + UpdateProgressBar(); + + CCoeControl::HandleResourceChange( aType ); + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::UpdateProgressBar +// +// ---------------------------------------------------------------------------- +// +void CVRStateInfoPanel::UpdateProgressBar() + { + + if ( iProgressBar ) + { + if ( iModel->HasProgressBar() ) + { + iProgressBar->SetFinalValue( I64INT( iModel->Duration().Int64() / + KVRSecondAsMicroSeconds ) ); + iProgressBar->SetAndDraw( I64INT( iModel->Position().Int64() / + KVRSecondAsMicroSeconds ) ); + iProgressBar->MakeVisible( ETrue ); + + iPBposition = I64INT( iModel->Position().Int64() / + KVRSecondAsMicroSeconds ); + } + else + { + iProgressBar->MakeVisible( EFalse ); + } + } + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::HandlePointerEventL +// From CCoeControl +// ---------------------------------------------------------------------------- +// +void CVRStateInfoPanel::HandlePointerEventL( const TPointerEvent& + aPointerEvent ) + { + if( AknLayoutUtils::PenEnabled() && iModel->HasProgressBar() && + iProgressBar ) + { + CCoeControl::HandlePointerEventL( aPointerEvent ); + + switch( aPointerEvent.iType ) + { + case TPointerEvent::EButton1Down: + { + TRect progressBarRect( iProgressBar->Rect() ); + // Check if pressed position is in progress bar's rect + if( progressBarRect.Contains( aPointerEvent.iPosition ) ) + { + HandleProgressBarTouchL( progressBarRect, + aPointerEvent.iPosition.iX ); + } + break; + } + case TPointerEvent::EDrag: + { + TRect progressBarRect( iProgressBar->Rect() ); + if( progressBarRect.Contains( aPointerEvent.iPosition ) ) + { + HandleProgressBarTouchL( progressBarRect, + aPointerEvent.iPosition.iX ); + } + break; + } + case TPointerEvent::EButton1Up: + { + break; + } + default: + { + break; + } + } + } + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::HandleProgressBarTouchL +// +// ---------------------------------------------------------------------------- +// +void CVRStateInfoPanel::HandleProgressBarTouchL( TRect aPBRect, + TInt aPressedPoint ) + { + if ( AknLayoutUtils::PenEnabled() ) + { +#ifdef _DEBUG + RDebug::Print( _L( "VoiceRecorder: HandleProgressBarTouchL enter" ) ); +#endif + // Progress Bar start and end points + TInt pbEndPoint( aPBRect.iBr.iX ); + TInt pbStartPoint( aPBRect.iTl.iX ); + + TInt totalPBLength( pbEndPoint - pbStartPoint ); + // calculate what is the time position that was pressed in + // the progress bar + TTimeIntervalMicroSeconds newPosition( + ( ( aPressedPoint - pbStartPoint ) * + iModel->Duration().Int64() ) / + totalPBLength ); + + // Round the position to the nearest second value + TInt roundedNewPosition( RoundMicroSecsToSecs( newPosition ) ); + + // Performace issue. Send command only if value has changed + if ( roundedNewPosition != iPBposition ) + { + iPBposition = roundedNewPosition; + + CAknViewAppUi* appUi = reinterpret_cast< CAknViewAppUi* >( + CEikonEnv::Static()->EikAppUi() ); + CAknView* view = appUi->View( iParentViewUid ); + + // inform the view that position has changed. + view->HandleCommandL( ECmdSetNewPosition ); + } +#ifdef _DEBUG + RDebug::Print( _L( "VoiceRecorder: HandleProgressBarTouchL exit" ) ); +#endif + + } // PenEnabled + + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::RoundMicroSecsToSecs +// Rounds aMicroSecs value to nearest second value (Round) +// ---------------------------------------------------------------------------- +// +TInt CVRStateInfoPanel::RoundMicroSecsToSecs( TTimeIntervalMicroSeconds + aMicroSecs ) + { + // Rounds to secondss resolution (Floor) + Int64 secondsInMicroSecs( ( ( aMicroSecs.Int64() / + KVRSecondAsMicroSeconds ) * + KVRSecondAsMicroSeconds ) ); + + // takes the leftover part in seconds resolution + Int64 leftoversInMicroSecs ( aMicroSecs.Int64() - secondsInMicroSecs ); + + // Nearer to upper sec value + if ( leftoversInMicroSecs / ( KVRSecondAsMilliSeconds ) > + KVRHalfSecondAsMilliSeconds ) + { + // + 1 sec + return ( ( secondsInMicroSecs + KVRSecondAsMicroSeconds ) / + KVRSecondAsMicroSeconds ); + } + // Nearer to lower sec value + else + { + return secondsInMicroSecs / KVRSecondAsMicroSeconds; + } + } + + +// ---------------------------------------------------------------------------- +// CVRStateInfoPanel::ProgressBarPosition +// Just returns the current progress bar position +// ---------------------------------------------------------------------------- +// +TInt CVRStateInfoPanel::ProgressBarPosition() const + { + return iPBposition; + } + +// End of file