diff -r 000000000000 -r 5f000ab63145 phoneapp/phoneuiview/src/cphonestatuspane.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneapp/phoneuiview/src/cphonestatuspane.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,730 @@ +/* +* Copyright (c) 2002 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 CPhoneTextTitlePane class. +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "phoneui.pan" +#include "cphonestatuspane.h" +#include "mphonestatuspaneobserver.h" +#include "cphonerecoverysystem.h" + +#include "tphonecommandparam.h" +#include "tphonecmdparaminteger.h" +#include "tphonecmdparamboolean.h" +#include "tphonecmdparambitmap.h" +#include "phonelogger.h" + +#include + +// CONSTANTS + +// MODULE DATA STRUCTURES + +/** +* It is title pane containing text. +*/ +class CPhoneTextTitlePane : + public CBase, + private MPhoneStatusPaneObserver + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CPhoneTextTitlePane* NewLC( + CPhoneStatusPane& aStatusPaneManager, + TInt aTextResourceId ); + + /** + * Destructor. + */ + ~CPhoneTextTitlePane(); + + public: // Functions from base classes + + /** + * From MPhoneStatusPaneObserver, handles activation of title pane. + */ + void HandleTitlePaneActiveL( TBool aActive ); + + private: + + /** + * C++ constructor. + */ + CPhoneTextTitlePane( + CPhoneStatusPane& aStatusPaneManager, + TInt aTextResourceId ); + + /** + * Symbian OS constructor. + */ + void ConstructL(); + + private: // Data + + // Status pane manager. + CPhoneStatusPane& iStatusPaneManager; + + // Text resource id. + const TInt iTextResourceId; + + }; + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CPhoneStatusPane::Instance +// Initializes the singleton object +// (other items were commented in a header). +// --------------------------------------------------------- +// +CPhoneStatusPane* CPhoneStatusPane::Instance() + { + CPhoneStatusPane* instance = static_cast + ( CCoeEnv::Static ( KUidPhoneStatusPaneHandlerSingleton ) ); + + if( !instance ) + { + TRAPD( err, instance = CPhoneStatusPane::NewL() ); + if ( err ) + { + Panic( EPhoneUtilsCouldNotCreateSingleton ); + } + } + return instance; + } + +// --------------------------------------------------------- +// CPhoneStatusPane::CPhoneStatusPane +// --------------------------------------------------------- +// +// C++ default constructor can NOT contain any code, that +// might leave. +// +CPhoneStatusPane::CPhoneStatusPane( ) : + CCoeStatic( KUidPhoneStatusPaneHandlerSingleton, EThread ), + iTitlePaneList( NULL ), + iStatusPane( NULL ), + iTitlePane( NULL ), + iTitlePanePicture( NULL ), + iTitlePanePictureMask( NULL ), + iNaviPane( NULL ), + iNaviDecorator( NULL ) + { + } + +// Symbian OS default constructor can leave. +void CPhoneStatusPane::ConstructL() + { + iTitlePaneList = new ( ELeave ) CArrayFixFlat< THandlerTag > + ( KPhoneTitlePaneListGranularity ); + + // Get pointer for title pane + iStatusPane = static_cast( CEikonEnv::Static()-> + EikAppUi() )->StatusPane(); + iTitlePane = static_cast( iStatusPane->ControlL( + TUid::Uid( EEikStatusPaneUidTitle ) ) ); + iTitlePane->SetNumberOfVisibleTextRows( 1 ); + + // Initialize display of title pane information + iTitlePaneTextIsDisplayed = ETrue; + + // Get pointer for navigation pane + iNaviPane = static_cast + ( iStatusPane->ControlL(TUid::Uid(EEikStatusPaneUidNavi)) ); + + if ( !FeatureManager::FeatureSupported( KFeatureIdOnScreenDialer ) ) + { + // Construct navi pane decorator + iNaviDecorator = iNaviPane->CreateNavigationLabelL( KNullDesC() ); + iNaviPane->PushL( *iNaviDecorator ); + } + + // Get recovery Id from recovery system + iUpdateTitlePaneRecoveryId = CPhoneRecoverySystem::Instance()->AddL( + TCallBack( UpdateTitlePaneCallBackL, this ), + CTeleRecoverySystem::EPhonePriorityStandard, + CTeleRecoverySystem::EPhoneStateIdle ); + } + +// Constructor +CPhoneStatusPane* CPhoneStatusPane::NewL() + { + CPhoneStatusPane* self = new (ELeave) CPhoneStatusPane(); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// Destructor +CPhoneStatusPane::~CPhoneStatusPane() + { + if ( iTitlePaneList ) + { + iTitlePaneList->Reset(); + } + delete iTitlePaneList; + + iStatusPane = NULL; + iTitlePane = NULL; + + if( iTitlePanePicture ) + { + delete iTitlePanePicture; + iTitlePanePicture = NULL; + } + if( iTitlePanePictureMask ) + { + delete iTitlePanePictureMask; + iTitlePanePictureMask = NULL; + } + + iNaviPane = NULL; + + if ( iNaviDecorator ) + { + delete iNaviDecorator; + iNaviDecorator = NULL; + } + + CPhoneRecoverySystem::Remove( iUpdateTitlePaneRecoveryId ); + } + +// --------------------------------------------------------- +// CPhoneStatusPane::UpdateTitlePane +// --------------------------------------------------------- +// +void CPhoneStatusPane::UpdateTitlePane() + { + CPhoneRecoverySystem::Instance()->RecoverNow( + iUpdateTitlePaneRecoveryId, + CTeleRecoverySystem::EPhonePriorityStandard ); + } + +// --------------------------------------------------------- +// CPhoneStatusPane::UpdateTitlePaneCallBackL +// --------------------------------------------------------- +// +TInt CPhoneStatusPane::UpdateTitlePaneCallBackL( TAny* aAny ) + { + reinterpret_cast( aAny )->DoUpdateTitlePaneL(); + return KErrNone; + } + +// --------------------------------------------------------- +// CPhoneStatusPane::DoUpdateTitlePaneL +// --------------------------------------------------------- +// +void CPhoneStatusPane::DoUpdateTitlePaneL() + { + if ( iTitlePaneTextIsDisplayed ) + { + iTitlePane->SetTextL( iTitleText ); + } + else + { + // Title pane takes ownership of the picture + RenderBitmapOnTitlePaneL(); + } + } + + +// --------------------------------------------------------- +// CPhoneStatusPane::RenderBitmapOnTitlePaneL +// --------------------------------------------------------- +// +void CPhoneStatusPane::RenderBitmapOnTitlePaneL() + { + if( !iTitlePanePicture ) + { + return; + } + + TSize size; + + TRect titlePaneRect; + AknLayoutUtils::LayoutMetricsRect( + AknLayoutUtils::ETitlePane, titlePaneRect ); + + TAknLayoutRect oplogoLayout; + + // stacon + oplogoLayout.LayoutRect( titlePaneRect, + AknLayoutScalable_Avkon::title_pane_stacon_g2(0).LayoutLine() ); + + size = oplogoLayout.Rect().Size(); + + // CAknIcon takes ownership of bitmaps. + CFbsBitmap* dupMain = new ( ELeave ) CFbsBitmap; + CleanupStack::PushL( dupMain ); + User::LeaveIfError( + dupMain->Duplicate( iTitlePanePicture->Handle() ) ); + + CFbsBitmap* dupMask = NULL; + if ( iTitlePanePictureMask ) + { + dupMask = new ( ELeave ) CFbsBitmap; + CleanupStack::PushL( dupMask ); + User::LeaveIfError( + dupMask->Duplicate( iTitlePanePictureMask->Handle() ) ); + } + + //bitmapIcon is not pushed to cleanupstack, ownership + //is transferred later + CAknIcon* bitmapIcon = CAknIcon::NewL(); + bitmapIcon->SetMask( dupMask ); // ownership transferred + if ( iTitlePanePictureMask ) + { + CleanupStack::Pop( dupMask ); + } + + bitmapIcon->SetBitmap( dupMain ); // ownership transferred + CleanupStack::Pop( dupMain ); + + //ownership of bitmapIcon is transferred + CAknIcon* scalableIcon = AknIconUtils::CreateIconL( bitmapIcon ); + CleanupStack::PushL( scalableIcon ); + + AknIconUtils::SetSize( scalableIcon->Bitmap(), size, + EAspectRatioPreservedAndUnusedSpaceRemoved ); + AknIconUtils::SetSize( scalableIcon->Mask(), size, + EAspectRatioPreservedAndUnusedSpaceRemoved ); + + // Title pane takes ownership of icons. + CFbsBitmap* bitmap = new ( ELeave ) CFbsBitmap; + CleanupStack::PushL( bitmap ); + User::LeaveIfError( bitmap->Duplicate( scalableIcon->Bitmap()->Handle() ) ); + + // Check if icon has mask + CFbsBitmap* bitmapMask = NULL; + if ( scalableIcon->Mask() ) + { + bitmapMask = new ( ELeave ) CFbsBitmap; + CleanupStack::PushL( bitmapMask ); + User::LeaveIfError( + bitmapMask->Duplicate( scalableIcon->Mask()->Handle() ) ); + } + + // Set the icon in title pane... + iTitlePane->SetPicture( bitmap, bitmapMask ); + + if ( bitmapMask ) + { + CleanupStack::Pop( bitmapMask ); + } + CleanupStack::Pop( bitmap ); + CleanupStack::PopAndDestroy( scalableIcon ); + } + +// --------------------------------------------------------- +// CPhoneStatusPane::SetTitlePaneContentL +// --------------------------------------------------------- +// +void CPhoneStatusPane::SetTitlePaneContentL( const TDesC& aContent ) + { + iTitleText = aContent; + iTitlePane->SetTextL( iTitleText ); + iTitlePaneTextIsDisplayed = ETrue; + } + +// --------------------------------------------------------- +// CPhoneStatusPane::SetTitlePanePicture +// --------------------------------------------------------- +// +void CPhoneStatusPane::SetTitlePanePictureL( + TPhoneCommandParam* aCommandParam ) + { + if ( aCommandParam->ParamId() == TPhoneCommandParam::EPhoneParamIdBitmap ) + { + TPhoneCmdParamBitmap* bitmapParam = static_cast( + aCommandParam ); + + delete iTitlePanePicture; + iTitlePanePicture = NULL; + iTitlePanePicture = bitmapParam->Bitmap(); + + delete iTitlePanePictureMask; + iTitlePanePictureMask = NULL; + iTitlePanePictureMask = bitmapParam->MaskBitmap(); + + RenderBitmapOnTitlePaneL(); + iTitlePaneTextIsDisplayed = EFalse; + } + } + +// --------------------------------------------------------- +// CPhoneStatusPane::IsVisible +// --------------------------------------------------------- +// +TBool CPhoneStatusPane::IsVisible() const + { + return iStatusPane->IsVisible(); + } + +// --------------------------------------------------------- +// CPhoneStatusPane::TitlePane +// --------------------------------------------------------- +// +CAknTitlePane& CPhoneStatusPane::TitlePane() const + { + return *iTitlePane; + } + +// --------------------------------------------------------- +// CPhoneStatusPane::StatusPane +// --------------------------------------------------------- +// +CEikStatusPane& CPhoneStatusPane::StatusPane() const + { + return *iStatusPane; + } + +// --------------------------------------------------------- +// CPhoneStatusPane::NaviPane +// --------------------------------------------------------- +// +CAknNavigationControlContainer& CPhoneStatusPane::NaviPane() const + { + return *iNaviPane; + } + +// --------------------------------------------------------- +// CPhoneStatusPane::NaviDecorator +// --------------------------------------------------------- +// +CAknNavigationDecorator& CPhoneStatusPane::NaviDecorator() const + { + return *iNaviDecorator; + } + +// --------------------------------------------------------- +// CPhoneStatusPane::AddTitlePaneHandlerL +// --------------------------------------------------------- +// +void CPhoneStatusPane::AddTitlePaneHandlerL( + MPhoneStatusPaneObserver& aObserver ) + { + THandlerTag titleTag; + titleTag.iObserver = &aObserver; + titleTag.iLayer = -1; //-1 means it's not reserved + iTitlePaneList->AppendL( titleTag ); + } + +// --------------------------------------------------------- +// CPhoneStatusPane::ReserveTitlePane +// --------------------------------------------------------- +// +void CPhoneStatusPane::ReserveTitlePane( + MPhoneStatusPaneObserver& aObserver ) + { + //notify the inactive of the topmost handler + THandlerTag* topmostHandler = FindTopmostTitlePaneHandler(); + if ( topmostHandler && + topmostHandler->iObserver != &aObserver ) + { + NotifyHandlerOnActivation( *topmostHandler, EFalse ); + } + + THandlerTag* titleTag = FindTitlePaneHandler( aObserver ); + if ( titleTag ) + { + if ( topmostHandler ) + { + titleTag->iLayer = topmostHandler->iLayer+1; + } + else + { + titleTag->iLayer = 0; // 0 is the lowest one + } + } + } + +// --------------------------------------------------------- +// CPhoneStatusPane::ReleaseTitlePane +// --------------------------------------------------------- +// +void CPhoneStatusPane::ReleaseTitlePane( + MPhoneStatusPaneObserver& aObserver ) + { + THandlerTag* titleTag = FindTitlePaneHandler( aObserver ); + if ( titleTag ) + { + titleTag->iLayer = -1; //put it to the unreserved status + THandlerTag* topmostHandler = FindTopmostTitlePaneHandler(); + if ( topmostHandler ) + { + NotifyHandlerOnActivation( *topmostHandler, ETrue ); + } + } + } + +// --------------------------------------------------------- +// CPhoneStatusPane::RemoveTitlePaneHandler +// --------------------------------------------------------- +// +void CPhoneStatusPane::RemoveTitlePaneHandler( + MPhoneStatusPaneObserver& aObserver ) + { + TInt count = iTitlePaneList->Count(); + for ( TInt i = 0; iAt( i ); + if ( &aObserver == handler.iObserver ) + { + iTitlePaneList->Delete( i ); + break; + } + } + THandlerTag* topmostHandler = FindTopmostTitlePaneHandler(); + if ( topmostHandler ) + { + NotifyHandlerOnActivation( *topmostHandler, ETrue ); + } + return; + } + + +// --------------------------------------------------------- +// CPhoneStatusPane::IsTitlePaneVisible +// --------------------------------------------------------- +// +TBool CPhoneStatusPane::IsTitlePaneVisible( + MPhoneStatusPaneObserver& aObserver ) const + { + THandlerTag* titleTag = FindTitlePaneHandler( aObserver ); + if ( titleTag ) + { + return ( titleTag->iLayer != -1 ) && + ( titleTag->iLayer == LargestLayerInTitlePaneList() ); + } + return EFalse; + } + +// --------------------------------------------------------- +// CPhoneStatusPane::CreateTextTitlePaneLC +// --------------------------------------------------------- +// +CBase* CPhoneStatusPane::CreateTextTitlePaneLC( + TInt aTextResourceId ) + { + return CPhoneTextTitlePane::NewLC( *this, aTextResourceId ); + } + +// ----------------------------------------------------------------------------- +// CPhoneStatusPane::GetShape +// ----------------------------------------------------------------------------- +// +void CPhoneStatusPane::GetShape( TRegion& aRegion ) + { + TRAPD( err, iStatusPane->GetShapeL( aRegion, ETrue, ETrue ) ); + if ( err != KErrNone ) + { + aRegion.Clear(); + } + } + +// --------------------------------------------------------- +// CPhoneStatusPane::LargestLayerInTitlePaneList +// --------------------------------------------------------- +// +TInt CPhoneStatusPane::LargestLayerInTitlePaneList() const + { + THandlerTag* topmostHandler = FindTopmostTitlePaneHandler(); + if ( topmostHandler ) + { + return topmostHandler->iLayer; + } + return -1; //-1 means no item in the list yet + } + +// --------------------------------------------------------- +// CPhoneStatusPane::FindTopmostTitlePaneHandler +// --------------------------------------------------------- +// +THandlerTag* CPhoneStatusPane::FindTopmostTitlePaneHandler() const + { + TInt largest = -1; + THandlerTag* handler = NULL; + TInt count = iTitlePaneList->Count(); + for ( TInt i = 0; iAt( i ); + if ( largest < currentHandler.iLayer ) + { + largest = currentHandler.iLayer; + handler = ¤tHandler; + } + } + return handler; + } + +// --------------------------------------------------------- +// CPhoneStatusPane::FindTitlePaneHandler +// --------------------------------------------------------- +// +THandlerTag* CPhoneStatusPane::FindTitlePaneHandler( + MPhoneStatusPaneObserver& aObserver ) const + { + TInt count = iTitlePaneList->Count(); + for ( TInt i = 0; iAt( i ); + if ( &aObserver == handler->iObserver ) + { + return handler; + } + } + return NULL; + } + +// --------------------------------------------------------- +// CPhoneStatusPane::NotifyHandlerOnActivation +// --------------------------------------------------------- +// +void CPhoneStatusPane::NotifyHandlerOnActivation( + THandlerTag& aHandlerTag, + TBool aActive ) + { + TRAP_IGNORE( aHandlerTag.iObserver->HandleTitlePaneActiveL( aActive ) ); + } + +// --------------------------------------------------------- +// CPhoneStatusPane::CreateEmptyIndicatorContainerL +// --------------------------------------------------------- +// +CAknIndicatorContainer* CPhoneStatusPane::CreateEmptyIndicatorContainerL() + { + CCoeControl* container = StatusPane(). + ContainerControlL( TUid::Uid( EEikStatusPaneUidIndic ) ); + + CAknIndicatorContainer* indicatorContainer = + new (ELeave) CAknIndicatorContainer( + CAknIndicatorContainer::ENaviPaneEditorIndicators ); + + CleanupStack::PushL( indicatorContainer ); + + indicatorContainer->SetContainerWindowL( *container ); + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, + R_PHONEUI_EMPTY_INDICATORS ); + indicatorContainer->ConstructFromResourceL( reader ); + + CleanupStack::PopAndDestroy(); // resource reader + + TRect controlRect = StatusPane().PaneRectL( TUid::Uid( EEikStatusPaneUidIndic ) ); + indicatorContainer->SetRect( TRect( controlRect.Size() ) ); + indicatorContainer->ActivateL(); + + CleanupStack::Pop( indicatorContainer ); // indicatorContainer + + return indicatorContainer; + } + +// +// IMPLEMENTATION OF CPHONETEXTTITLEPANE +// +// --------------------------------------------------------- +// CPhoneTextTitlePane::NewLC +// --------------------------------------------------------- +// +CPhoneTextTitlePane* CPhoneTextTitlePane::NewLC( + CPhoneStatusPane& aStatusPaneManager, + TInt aTextResourceId ) + { + CPhoneTextTitlePane* self = + new (ELeave) CPhoneTextTitlePane( + aStatusPaneManager, + aTextResourceId ); + + CleanupStack::PushL( self ); + self->ConstructL(); + + return self; + } + +// Destructor +CPhoneTextTitlePane::~CPhoneTextTitlePane() + { + iStatusPaneManager.ReleaseTitlePane( *this ); + iStatusPaneManager.RemoveTitlePaneHandler( *this ); + } + +// --------------------------------------------------------- +// CPhoneTextTitlePane::HandleTitlePaneActiveL +// --------------------------------------------------------- +// +void CPhoneTextTitlePane::HandleTitlePaneActiveL( + TBool /*aActive*/ ) + { + if ( iStatusPaneManager.IsTitlePaneVisible( *this ) ) + { + HBufC* text = StringLoader::LoadL( iTextResourceId ); + iStatusPaneManager.TitlePane().SetText( text ); + } + } + +// ----------------------------------------------------------------------------- +// CPhoneTextTitlePane::CPhoneTextTitlePane +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPhoneTextTitlePane::CPhoneTextTitlePane( + CPhoneStatusPane& aStatusPaneManager, + TInt aTextResourceId ) : + iStatusPaneManager( aStatusPaneManager ), + iTextResourceId( aTextResourceId ) + { + } + +// ----------------------------------------------------------------------------- +// CPhoneTextTitlePane::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPhoneTextTitlePane::ConstructL() + { + iStatusPaneManager.AddTitlePaneHandlerL( *this ); + iStatusPaneManager.ReserveTitlePane( *this ); + + HandleTitlePaneActiveL( ETrue ); + } + +// End of File