diff -r 000000000000 -r 2f259fa3e83a uifw/EikStd/coctlsrc/aknstyluspopupmenu.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/EikStd/coctlsrc/aknstyluspopupmenu.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,426 @@ +/* +* Copyright (c) 2005-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: Interface for controlling stylus popup menu. +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "aknstyluspopupmenu.h" +#include "aknstyluspopupmenucontent.h" + +const TInt KDefaultPopUpShowDelay = 0; +const TInt KDefaultPopUpHideDelay = 6000000; // 6 seconds + +enum TStylusPopUpFlags + { + EIdleDisabled // usage of iControllerIdle is disabled + }; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Default constructor +// --------------------------------------------------------------------------- +// +CAknStylusPopUpMenu::CAknStylusPopUpMenu( MEikMenuObserver* aObserver, + const TPoint& aPoint, + CAknPreviewPopUpController* aPopup ) + : iPosition ( aPoint ), + iMenuObserver( aObserver ), + iPreviewPopup( aPopup ), + iPositionType( EPositionTypeLeftTop ) + { + } + + +// --------------------------------------------------------------------------- +// CAknStylusPopUpMenu::ConstructL +// --------------------------------------------------------------------------- +// + +void CAknStylusPopUpMenu::ConstructL() + { + iContent = CAknStylusPopUpMenuContent::NewL( *this ); + + iContent->SetObserver(this); + } + + +// --------------------------------------------------------------------------- +// CAknStylusPopUpMenu::NewL +// --------------------------------------------------------------------------- +// +EXPORT_C CAknStylusPopUpMenu* CAknStylusPopUpMenu::NewL( + MEikMenuObserver* aObserver, const TPoint& aPoint, + CAknPreviewPopUpController* aPopup ) + { + CAknStylusPopUpMenu* self = CAknStylusPopUpMenu::NewLC( aObserver, + aPoint, + aPopup ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CAknStylusPopUpMenu::NewL +// --------------------------------------------------------------------------- +// +EXPORT_C CAknStylusPopUpMenu* CAknStylusPopUpMenu::NewL( + MEikMenuObserver* aObserver, const TPoint& aPoint ) + { + CAknStylusPopUpMenu* self = CAknStylusPopUpMenu::NewLC( aObserver, + aPoint, NULL ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CAknStylusPopUpMenu::NewLC +// --------------------------------------------------------------------------- +// +EXPORT_C CAknStylusPopUpMenu* CAknStylusPopUpMenu::NewLC( + MEikMenuObserver* aObserver, const TPoint& aPoint, + CAknPreviewPopUpController* aPopup ) + { + CAknStylusPopUpMenu* self = new ( ELeave ) CAknStylusPopUpMenu( aObserver, + aPoint, + aPopup ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CAknStylusPopUpMenu::~CAknStylusPopUpMenu() + { + if ( iIsDeleted ) + { + *iIsDeleted = ETrue; + iIsDeleted = NULL; + } + + if ( iControllerIdle ) + { + iControllerIdle->Cancel(); + } + delete iControllerIdle; + delete iController; + delete iContent; + } + + +// --------------------------------------------------------------------------- +// CAknStylusPopUpMenu::AddMenuItemL +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknStylusPopUpMenu::AddMenuItemL( const TDesC& aItem, + const TInt aCommandId ) + { + iContent->AddMenuItemL( aItem, aCommandId ); + } + + +// --------------------------------------------------------------------------- +// CAknStylusPopUpMenu::RemoveMenuItem +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknStylusPopUpMenu::RemoveMenuItem( const TInt aCommandId ) + { + iContent->RemoveMenuItem( aCommandId ); + } + + +// --------------------------------------------------------------------------- +// CAknStylusPopUpMenu::SetItemDimmed +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknStylusPopUpMenu::SetItemDimmed( const TInt aCommandId, const TBool aDimmed ) + { + iContent->SetItemDimmed( aCommandId, aDimmed ); + } + + +// --------------------------------------------------------------------------- +// CAknStylusPopUpMenu::ShowMenu +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknStylusPopUpMenu::ShowMenu() + { + TRAPD( err, + iController = CAknPreviewPopUpController::NewL( *iContent, + CAknPreviewPopUpController::ELayoutSubMenu | + CAknPreviewPopUpController::EAutoMirror | + CAknPreviewPopUpController::EDontClose ) ); + if ( err ) + { + return; + } + + iController->SetPopUpShowDelay( KDefaultPopUpShowDelay ); + iController->SetPopUpHideDelay( KDefaultPopUpHideDelay ); + iContent->Parent()->DrawableWindow()->SetNonFading(ETrue); + + TSize size(iController->Size()); + iController->ShowPopUp(); + + if ( size.iWidth == 0 && size.iHeight == 0 ) + { + if ( iPositionType != KErrNotFound ) + { + SetPosition( iPosition, TPositionType( iPositionType ) ); + } + else + { + SetPosition( iPosition ); + } + } + else + { + //position already adjusted. + iController->SetPosition( iPosition ); + } + + } + + +// --------------------------------------------------------------------------- +// CAknStylusPopUpMenu::SetPosition +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknStylusPopUpMenu::SetPosition( const TPoint& aPoint ) + { + SetPosition( aPoint, EPositionTypeLeftTop ); + } + + +// --------------------------------------------------------------------------- +// CAknStylusPopUpMenu::SetPosition +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknStylusPopUpMenu::SetPosition( const TPoint& aPoint, TPositionType aPosType ) + { + TPoint adjustedPoint( aPoint ); + if ( !iController ) + { + iPosition = aPoint; + iPositionType = aPosType; + return; + } + iController->UpdateContentSize(); + TSize menuSize = iController->Size(); + // calculate to right-top corner by aPosType and popup menu size + switch ( aPosType ) + { + case EPositionTypeRightTop: + break; + case EPositionTypeLeftTop: + if( AknLayoutUtils::LayoutMirrored() ) + { + adjustedPoint.iX -= menuSize.iWidth; + } + else + { + adjustedPoint.iX += menuSize.iWidth; + } + break; + case EPositionTypeRightBottom: + adjustedPoint.iY -= menuSize.iHeight; + break; + case EPositionTypeLeftBottom: + if( AknLayoutUtils::LayoutMirrored() ) + { + adjustedPoint.iX -= menuSize.iWidth; + } + else + { + adjustedPoint.iX += menuSize.iWidth; + } + adjustedPoint.iY -= menuSize.iHeight; + break; + default: + break; + + } + iPosition = adjustedPoint; + iController->SetPosition( adjustedPoint ); + } + + +// --------------------------------------------------------------------------- +// CAknStylusPopUpMenu::ConstructFromResourceL +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknStylusPopUpMenu::ConstructFromResourceL( TResourceReader& + aReader ) + { + TInt count = aReader.ReadInt16(); + TInt commandId; + for ( TInt i = 0; i < count; i++ ) + { + TPtrC text = aReader.ReadTPtrC(); + commandId = aReader.ReadInt32(); + iContent->AddMenuItemL( text, commandId ); + aReader.ReadInt32(); // extension link + } + } + + +// --------------------------------------------------------------------------- +// From class MCoeControlObserver. +// Handles stylus tap events by forwarding the event to the observer. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknStylusPopUpMenu::HandleControlEventL( CCoeControl* aControl, + TCoeEvent aEventType ) + { + if ( aControl && aEventType == EEventStateChanged ) + { + if ( iPreviewPopup ) + { + iPreviewPopup->HidePopUp(); + } + if ( iController ) + { + iController->HidePopUp(); + } + + if ( iMenuObserver ) + { + iFlags.Set( EIdleDisabled ); + TBool isDeleted = EFalse; + iIsDeleted = &isDeleted; + + iMenuObserver->ProcessCommandL( iContent->CurrentCommandId() ); + + if ( isDeleted ) + { + return; + } + + iIsDeleted = NULL; + iFlags.Clear( EIdleDisabled ); + } + + StartControllerIdleL(); + } + else if ( aControl && aEventType == EEventRequestExit ) + { + if ( iPreviewPopup ) + { + iPreviewPopup->HidePopUp(); + } + if ( iController ) + { + iController->HidePopUp(); + } + + StartControllerIdleL(); + } + else if ( aControl && aEventType == EEventRequestCancel ) + { + if ( iMenuObserver ) + { + iFlags.Set( EIdleDisabled ); + iMenuObserver->ProcessCommandL( KErrCancel ); + iFlags.Clear( EIdleDisabled ); + } + + StartControllerIdleL(); + } + } + + +// --------------------------------------------------------------------------- +// CAknStylusPopUpMenu::UpdatePosition +// --------------------------------------------------------------------------- +// +void CAknStylusPopUpMenu::UpdatePosition() + { + SetPosition( iPosition ); + } + + +// --------------------------------------------------------------------------- +// CAknStylusPopUpMenu::Clear +// --------------------------------------------------------------------------- +// +void CAknStylusPopUpMenu::Clear() + { + iContent->Clear(); + if ( iController ) + { + iController->UpdateContentSize(); + } + } + +// ----------------------------------------------------------------------------- +// CAknStylusPopUpMenu::StartControllerIdleL +// ----------------------------------------------------------------------------- +// +void CAknStylusPopUpMenu::StartControllerIdleL() + { + if ( !iFlags.IsSet( EIdleDisabled ) ) + { + if ( !iControllerIdle ) + { + iControllerIdle = CIdle::NewL( CActive::EPriorityIdle ); + } + + if ( !iControllerIdle->IsActive() && iController ) + { + iControllerIdle->Start( TCallBack( ControllerCallBack, this ) ); + } + } + } + +// ----------------------------------------------------------------------------- +// CAknStylusPopUpMenu::ControllerCallBack +// ----------------------------------------------------------------------------- +// +TInt CAknStylusPopUpMenu::ControllerCallBack( TAny* aThis ) + { + CAknStylusPopUpMenu* self = static_cast( aThis ); + self->RemoveController(); + self->iFlags.Clear( EIdleDisabled ); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CAknStylusPopUpMenu::RemoveController +// ----------------------------------------------------------------------------- +// +void CAknStylusPopUpMenu::RemoveController() + { + if ( iController ) + { + delete iController; + iController = NULL; + } + }