diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/akndiscreetpopup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/akndiscreetpopup.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,481 @@ +/* +* Copyright (c) 2009 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: Discreet popup +* +*/ + +#include +#include +#include +#include + +#include "akndiscreetpopupcontrol.h" +#include "akndiscreetpopupserverhandler.h" + +const TUid KDiscreetPopupSingleton = { 537001156 }; +const TInt KInitialPopupId( 1 ); + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::~CAknDiscreetPopup +// --------------------------------------------------------------------------- +// +CAknDiscreetPopup::~CAknDiscreetPopup() + { + if ( iUseCoeEnv ) + { + AKNTASHOOK_REMOVE(); + } + CAknDiscreetPopupControl* popup( NULL ); + for ( TInt j = 0; j < iLocalPopups.Count(); j++ ) + { + popup = iLocalPopups[ j ]; + delete popup; + popup = NULL; + } + iLocalPopups.Close(); + delete iServerHandler; + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::ShowLocalPopupL +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CAknDiscreetPopup::ShowLocalPopupL( + const TDesC& aTitle, + const TDesC& aText, + CGulIcon* aIcon, + const TAknsItemID& aSkinId, + const TDesC& aBitmapFile, + const TInt aBitmapId, + const TInt aMaskId, + const TInt aFlags, + const TInt aCommand, + MEikCommandObserver* aCommandObserver ) + { + __ASSERT_ALWAYS( CCoeEnv::Static(), Panic( EAknPanicNotSupported ) ); + TInt popupId = 0; + CAknDiscreetPopup* instance = InstanceL(); + if( instance ) + { + popupId = instance->DoShowLocalL( aTitle, + aText, + aIcon, + aSkinId, + aBitmapFile, + aBitmapId, + aMaskId, + aFlags, + aCommand, + aCommandObserver ); + } + return popupId; + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::ShowLocalPopupL +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CAknDiscreetPopup::ShowLocalPopupL( + const TInt aResourceId, + const TInt aCommand, + MEikCommandObserver* aCommandObserver ) + { + __ASSERT_ALWAYS( CCoeEnv::Static(), Panic( EAknPanicNotSupported ) ); + TInt popupId = 0; + CAknDiscreetPopup* instance = InstanceL(); + if( instance ) + { + popupId = instance->DoShowLocalL( aResourceId, KNullDesC, aCommand, aCommandObserver ); + } + return popupId; + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::ShowGlobalPopupL +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CAknDiscreetPopup::ShowGlobalPopupL( + const TDesC& aTitle, + const TDesC& aText, + const TAknsItemID& aSkinId, + const TDesC& aBitmapFile, + const TInt aBitmapId, + const TInt aMaskId, + const TInt aFlags, + const TInt aCommandId, + MEikCommandObserver* aCommandObserver, + const TUid& aAppUid, + const TUid& aViewUid ) + { + TInt popupId = 0; + CAknDiscreetPopup* instance = InstanceL(); + if ( instance ) + { + popupId = instance->DoShowGlobalL(aTitle, aText, aSkinId, aBitmapFile, + aBitmapId, aMaskId, aFlags, aCommandId, aCommandObserver, aAppUid, + aViewUid); + } + return popupId; + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::ShowGlobalPopupL +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CAknDiscreetPopup::ShowGlobalPopupL( + const TInt aResourceId, + const TDesC& aResourceFile, + const TInt aCommandId, + MEikCommandObserver* aCommandObserver, + const TUid& aAppUid, + const TUid& aViewUid ) + { + TInt popupId = 0; + CAknDiscreetPopup* instance = InstanceL(); + if( instance ) + { + popupId = instance->DoShowGlobalL( aResourceId, + aResourceFile, + aCommandId, + aCommandObserver, + aAppUid, + aViewUid ); + } + return popupId; + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::InitL +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknDiscreetPopup::InitL() + { + __ASSERT_ALWAYS( !CCoeEnv::Static(), Panic( EAknPanicNotSupported ) ); + + // Create popup instance and store it to TLS + if ( !Dll::Tls() ) + { + CAknDiscreetPopup* instance = new ( ELeave ) CAknDiscreetPopup; + CleanupStack::PushL( instance ); + instance->ConstructL(); + User::LeaveIfError( Dll::SetTls( instance ) ); + CleanupStack::Pop( instance ); + } + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::Release +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknDiscreetPopup::Release() + { + __ASSERT_ALWAYS( !CCoeEnv::Static(), Panic( EAknPanicNotSupported ) ); + + // Delete popup instance from TLS + CAknDiscreetPopup* instance = + static_cast( Dll::Tls() ); + if ( instance ) + { + delete instance; + instance = NULL; + Dll::SetTls( NULL ); + } + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::CAknDiscreetPopup +// --------------------------------------------------------------------------- +// +CAknDiscreetPopup::CAknDiscreetPopup() + { + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::CAknDiscreetPopup +// --------------------------------------------------------------------------- +// +CAknDiscreetPopup::CAknDiscreetPopup( TBool aUseCoeEnv ) + : CCoeStatic( KDiscreetPopupSingleton, CCoeStatic::EThread ), + iUseCoeEnv( aUseCoeEnv ) + { + AKNTASHOOK_ADD( this, "CAknDiscreetPopup" ); + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::ConstructL +// --------------------------------------------------------------------------- +// +void CAknDiscreetPopup::ConstructL() + { + iServerHandler = CAknDiscreetPopupServerHandler::NewL(); + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::InstanceL +// --------------------------------------------------------------------------- +// +CAknDiscreetPopup* CAknDiscreetPopup::InstanceL() + { + CAknDiscreetPopup* instance( NULL ); + if ( CCoeEnv::Static() ) + { + instance = static_cast< CAknDiscreetPopup* > + ( CCoeEnv::Static( KDiscreetPopupSingleton ) ); + if ( !instance ) + { + instance = new ( ELeave ) CAknDiscreetPopup( ETrue ); + CleanupStack::PushL( instance ); + instance->ConstructL(); + CleanupStack::Pop( instance ); + } + } + else + { + instance = static_cast( Dll::Tls() ); + } + return instance; + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::DoShowLocalL +// --------------------------------------------------------------------------- +// +TInt CAknDiscreetPopup::DoShowLocalL( + const TDesC& aTitle, + const TDesC& aText, + CGulIcon* aIcon, + const TAknsItemID& aSkinId, + const TDesC& aBitmapFile, + const TInt& aBitmapId, + const TInt& aMaskId, + const TInt& aFlags, + const TInt& aCommand, + MEikCommandObserver* aCommandObserver ) + { + TInt popupId( NextPopupId() ); + CAknDiscreetPopupControl* popup = CAknDiscreetPopupControl::NewL( + EFalse, aTitle, aText, aIcon, aSkinId, aBitmapFile, + aBitmapId, aMaskId, aFlags, aCommand, popupId, aCommandObserver ); + CleanupStack::PushL( popup ); + ShowPopupL( popup ); + CleanupStack::Pop( popup ); + return popupId; + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::DoShowLocalL +// --------------------------------------------------------------------------- +// +TInt CAknDiscreetPopup::DoShowLocalL( + const TInt& aResourceId, + const TDesC& aResourceFile, + const TInt& aCommand, + MEikCommandObserver* aCommandObserver ) + { + TInt popupId( NextPopupId() ); + CAknDiscreetPopupControl* popup = CAknDiscreetPopupControl::NewL( + EFalse, aResourceId, aResourceFile, + aCommand, popupId, aCommandObserver ); + CleanupStack::PushL( popup ); + ShowPopupL( popup ); + CleanupStack::Pop( popup ); + return popupId; + } + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::DoShowGlobalL +// --------------------------------------------------------------------------- +// +TInt CAknDiscreetPopup::DoShowGlobalL( + const TDesC& aTitle, + const TDesC& aText, + const TAknsItemID& aSkinId, + const TDesC& aBitmapFile, + const TInt& aBitmapId, + const TInt& aMaskId, + const TInt& aFlags, + const TInt& aCommandId, + MEikCommandObserver* aCommandObserver, + const TUid& aAppUid, + const TUid& aViewUid ) + { + TInt popupId; + RThread thread; + if ( thread.Name() != EIKAPPUI_SERVER_THREAD_NAME && iServerHandler ) + { + popupId = NextPopupId(); + iServerHandler->LaunchGlobalPopupL( + aTitle, + aText, + aSkinId, + aBitmapFile, + aBitmapId, + aMaskId, + aFlags, + aCommandId, + popupId, + aCommandObserver, + aAppUid, + aViewUid ); + } + else + { + CGulIcon* icon = NULL; + DoShowLocalL( aTitle, aText, icon, aSkinId, aBitmapFile, + aBitmapId, aMaskId, aFlags, aCommandId, aCommandObserver ); + } + return popupId; + } + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::DoShowGlobalL +// --------------------------------------------------------------------------- +// +TInt CAknDiscreetPopup::DoShowGlobalL( + const TInt& aResourceId, + const TDesC& aResourceFile, + const TInt& aCommandId, + MEikCommandObserver* aCommandObserver, + const TUid& aAppUid, + const TUid& aViewUid ) + { + TInt popupId; + RThread thread; + if ( thread.Name() != EIKAPPUI_SERVER_THREAD_NAME && iServerHandler ) + { + popupId = NextPopupId(); + iServerHandler->LaunchGlobalPopupL( + aResourceId, + aResourceFile, + aCommandId, + popupId, + aCommandObserver, + aAppUid, + aViewUid ); + } + else + { + DoShowLocalL( aResourceId, aResourceFile, + aCommandId, aCommandObserver ); + } + return popupId; + } + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::ShowPopupL +// --------------------------------------------------------------------------- +// +void CAknDiscreetPopup::ShowPopupL( CAknDiscreetPopupControl* aControl ) + { + if ( !aControl ) + { + return; + } + + // Inform other popups that new popup is launched + for ( TInt i = 0; i < iLocalPopups.Count(); i++ ) + { + iLocalPopups[ i ]->HandleDiscreetPopupActionL( + CAknDiscreetPopupControl::EAknDiscreetPopupAnotherLaunched ); + } + // Show popup and add it to popup list + aControl->SetObserver( this ); + aControl->HandleDiscreetPopupActionL( + CAknDiscreetPopupControl::EAknDiscreetPopupShow ); + iLocalPopups.AppendL( aControl ); + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::DeletePopup +// --------------------------------------------------------------------------- +// +void CAknDiscreetPopup::DeletePopup( CAknDiscreetPopupControl* aControl ) + { + if ( !aControl ) + { + return; + } + + TInt index = iLocalPopups.Find( aControl ); + iLocalPopups.Remove( index ); + delete aControl; + aControl = NULL; + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::NextPopupId +// --------------------------------------------------------------------------- +// +TInt CAknDiscreetPopup::NextPopupId() + { + TInt popupId( KInitialPopupId ); + while ( PopupIdInUse( popupId ) ) + { + popupId++; + } + if ( iServerHandler ) + { + popupId = iServerHandler->CheckPopupId( popupId ); + } + return popupId; + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::PopupIdInUse +// --------------------------------------------------------------------------- +// +TBool CAknDiscreetPopup::PopupIdInUse( const TInt& aPopupId ) + { + for ( TInt i = 0; i < iLocalPopups.Count(); i++ ) + { + if ( iLocalPopups[ i ]->PopupId() == aPopupId ) + { + return ETrue; + } + } + return EFalse; + } + + +// --------------------------------------------------------------------------- +// CAknDiscreetPopup::HandleControlEventL +// --------------------------------------------------------------------------- +// +void CAknDiscreetPopup::HandleControlEventL( + CCoeControl* aControl, TCoeEvent aEventType ) + { + if ( aEventType == EEventRequestExit || aEventType == EEventRequestCancel ) + { + DeletePopup( static_cast( aControl ) ); + } + } + +