diff -r aecbbf00d063 -r d48ab3b357f1 uifw/EikStd/coctlsrc/aknitemactionmenu.cpp --- a/uifw/EikStd/coctlsrc/aknitemactionmenu.cpp Tue Aug 31 15:28:30 2010 +0300 +++ b/uifw/EikStd/coctlsrc/aknitemactionmenu.cpp Wed Sep 01 12:16:19 2010 +0100 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2009-2010 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" @@ -28,6 +28,8 @@ #include "akncollectionobserver.h" #include "aknitemactionmenudata.h" #include "aknitemactionmenuregister.h" +#include "akntrace.h" +#include "aknmarkingmode.h" /** * Index for invalid list index. @@ -39,10 +41,13 @@ // --------------------------------------------------------------------------- // CAknItemActionMenu* CAknItemActionMenu::NewL( - MAknCollection& aCollection ) + MAknCollection& aCollection, MObjectProvider* aOwner ) { - CAknItemActionMenu* self = CAknItemActionMenu::NewLC( aCollection ); + _AKNTRACE_FUNC_ENTER; + CAknItemActionMenu* self = CAknItemActionMenu::NewLC( + aCollection, aOwner ); CleanupStack::Pop( self ); + _AKNTRACE_FUNC_EXIT; return self; } @@ -51,11 +56,14 @@ // CAknItemActionMenu::NewLC // --------------------------------------------------------------------------- // -CAknItemActionMenu* CAknItemActionMenu::NewLC( MAknCollection& aCollection ) +CAknItemActionMenu* CAknItemActionMenu::NewLC( + MAknCollection& aCollection, MObjectProvider* aOwner ) { - CAknItemActionMenu* self = new ( ELeave ) CAknItemActionMenu(); + _AKNTRACE_FUNC_ENTER; + CAknItemActionMenu* self = new ( ELeave ) CAknItemActionMenu( aOwner ); CleanupStack::PushL( self ); self->ConstructL( aCollection ); + _AKNTRACE_FUNC_EXIT; return self; } @@ -66,12 +74,21 @@ // CAknItemActionMenu::~CAknItemActionMenu() { + _AKNTRACE_FUNC_ENTER; AKNTASHOOK_REMOVE(); delete iPopupMenu; delete iMenuPane; delete iMenuData; + delete iMarking; iStates.Close(); + + for ( TInt i = 0; i < iObservers.Count(); ++i ) + { + iObservers[i]->SetItemActionMenu( NULL ); + } + iObservers.Close(); + _AKNTRACE_FUNC_EXIT; } @@ -82,7 +99,24 @@ EXPORT_C CAknItemActionMenu* CAknItemActionMenu::RegisterCollectionL( MAknCollection& aCollection ) { - return AknItemActionMenuRegister::RegisterCollectionL( aCollection ); + _AKNTRACE_FUNC_ENTER; + _AKNTRACE_FUNC_EXIT; + return AknItemActionMenuRegister::RegisterCollectionL( + aCollection, NULL ); + } + + +// --------------------------------------------------------------------------- +// CAknItemActionMenu::RegisterCollectionL +// --------------------------------------------------------------------------- +// +EXPORT_C CAknItemActionMenu* CAknItemActionMenu::RegisterCollectionL( + MAknCollection& aCollection, MObjectProvider* aMenuBarOwner ) + { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE_FUNC_EXIT; + return AknItemActionMenuRegister::RegisterCollectionL( + aCollection, aMenuBarOwner ); } @@ -93,6 +127,7 @@ EXPORT_C void CAknItemActionMenu::RemoveCollection( MAknCollection& aCollection ) { + _AKNTRACE_FUNC_ENTER; for ( TInt i = 0; i < iStates.Count(); i++ ) { MAknCollection* state( iStates[ i ] ); @@ -103,6 +138,7 @@ } } UnregisterMenu(); + _AKNTRACE_FUNC_EXIT; } @@ -112,6 +148,7 @@ // EXPORT_C TBool CAknItemActionMenu::InitMenuL() { + _AKNTRACE_FUNC_ENTER; iMenuData->Reset(); if ( !iMenuBar ) { @@ -131,6 +168,7 @@ return EFalse; } + _AKNTRACE_FUNC_EXIT; return iMenuData->Count(); } @@ -143,11 +181,13 @@ const TPoint& aPosition, TUint /*aFlags*/ ) { + _AKNTRACE_FUNC_ENTER; if ( iMenuData->Count() ) { if ( !iPopupMenu ) { - iPopupMenu = CAknStylusPopUpMenu::NewL( this, TPoint() ); + iPopupMenu = CAknStylusPopUpMenu::NewL( this, TPoint(), NULL, + CAknStylusPopUpMenu::EConsumeKeyEvents ); } iPopupMenu->Clear(); iMenuData->AddMenuItemsToStylusPopupMenuL( iPopupMenu ); @@ -156,6 +196,7 @@ CAknStylusPopUpMenu::EPositionTypeRightBottom ); iPopupMenu->ShowMenu(); } + _AKNTRACE_FUNC_EXIT; } @@ -166,12 +207,14 @@ EXPORT_C void CAknItemActionMenu::CollectionChanged( MAknCollection& aCollection ) { + _AKNTRACE_FUNC_ENTER; if ( iObservers.Count() && iStates.Find( &aCollection ) != KErrNotFound ) { TBool collectionVisible( aCollection.CollectionState() & MAknCollection::EStateCollectionVisible ); NotifyChangeToActiveObserver( collectionVisible ); } + _AKNTRACE_FUNC_EXIT; } @@ -182,10 +225,12 @@ void CAknItemActionMenu::AddCollectionStateL( MAknCollection& aCollection ) { + _AKNTRACE_FUNC_ENTER; if ( iStates.Find( &aCollection ) == KErrNotFound ) { iStates.InsertL( &aCollection, 0 ); } + _AKNTRACE_FUNC_EXIT; } @@ -197,8 +242,10 @@ MEikMenuObserver* aMenuObserver, CEikMenuBar* aMenuBar ) { + _AKNTRACE_FUNC_ENTER; iMenuBarObserver = aMenuObserver; iMenuBar = aMenuBar; + _AKNTRACE_FUNC_EXIT; } @@ -208,18 +255,23 @@ // TBool CAknItemActionMenu::CollectionHighlightVisible() const { + _AKNTRACE_FUNC_ENTER; TBool highlightVisible( ETrue ); for ( TInt i = 0; i < iStates.Count(); i++ ) { - MAknCollection* state( iStates[ i ] ); - if ( state->CollectionState() & - MAknCollection::EStateCollectionVisible ) + MAknCollection* collection( iStates[ i ] ); + TUint state = collection->CollectionState(); + + highlightVisible = state & MAknCollection::EStateHighlightVisible; + + if ( highlightVisible ) { - highlightVisible = state->CollectionState() - & MAknCollection::EStateHighlightVisible; + // Highlight can't be visible if the collection is not visible. + highlightVisible = state & MAknCollection::EStateCollectionVisible; break; } } + _AKNTRACE_FUNC_EXIT; return highlightVisible; } @@ -231,6 +283,7 @@ TBool CAknItemActionMenu::CollectionSoftkeyVisible( TBool aVisibleCollection ) const { + _AKNTRACE_FUNC_ENTER; TBool softkeyVisible( ETrue ); for ( TInt i = 0; i < iStates.Count(); i++ ) { @@ -251,6 +304,7 @@ break; } } + _AKNTRACE_FUNC_EXIT; return softkeyVisible; } @@ -261,6 +315,8 @@ // CAknItemActionMenuData& CAknItemActionMenu::MenuData() { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE_FUNC_EXIT; return *iMenuData; } @@ -272,11 +328,13 @@ void CAknItemActionMenu::RegisterCollectionObserverL( MAknCollectionObserver& aObserver ) { + _AKNTRACE_FUNC_ENTER; if ( iObservers.Find( &aObserver ) == KErrNotFound ) { iObservers.InsertL( &aObserver, 0 ); aObserver.SetItemActionMenu( this ); } + _AKNTRACE_FUNC_EXIT; } @@ -287,12 +345,14 @@ void CAknItemActionMenu::RemoveCollectionObserver( MAknCollectionObserver& aObserver ) { + _AKNTRACE_FUNC_ENTER; TInt index( iObservers.Find( &aObserver ) ); if ( index != KErrNotFound ) { iObservers.Remove( index ); UnregisterMenu(); } + _AKNTRACE_FUNC_EXIT; } @@ -302,22 +362,89 @@ // TInt CAknItemActionMenu::CollectionCount() const { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE_FUNC_EXIT; return iStates.Count(); } // --------------------------------------------------------------------------- +// CAknItemActionMenu::Owner +// --------------------------------------------------------------------------- +// + MObjectProvider* CAknItemActionMenu::Owner() const + { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE_FUNC_EXIT; + return iOwner; + } + + +// --------------------------------------------------------------------------- +// CAknItemActionMenu::MarkingMode +// --------------------------------------------------------------------------- +// +CAknMarkingMode& CAknItemActionMenu::MarkingMode() + { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE_FUNC_EXIT; + return *iMarking; + } + + +// --------------------------------------------------------------------------- +// CAknItemActionMenu::CollectionHasMarkedItems +// --------------------------------------------------------------------------- +// +TBool CAknItemActionMenu::CollectionHasMarkedItems() + { + _AKNTRACE_FUNC_ENTER; + TBool markedItems( EFalse ); + for ( TInt i = 0; i < iStates.Count(); i++ ) + { + TInt state( iStates[ i ]->CollectionState() ); + if ( state & MAknCollection::EStateCollectionVisible ) + { + if ( state & MAknCollection::EStateMarkedItems ) + { + markedItems = ETrue; + } + } + } + _AKNTRACE_FUNC_EXIT; + return markedItems; + } + + +// --------------------------------------------------------------------------- +// CAknItemActionMenu::HideMenu +// --------------------------------------------------------------------------- +// +void CAknItemActionMenu::HideMenu() + { + if ( iPopupMenu && !iProcessingCommand ) + { + iPopupMenu->HideMenu(); + } + } + + +// --------------------------------------------------------------------------- // CAknItemActionMenu::CAknItemActionMenu // --------------------------------------------------------------------------- // -CAknItemActionMenu::CAknItemActionMenu() +CAknItemActionMenu::CAknItemActionMenu( MObjectProvider* aOwner ) : iPopupMenu( NULL ), iMenuBarObserver( NULL ), iMenuBar( NULL ), iMenuPane( NULL ), - iMenuData( NULL ) + iMenuData( NULL ), + iOwner( aOwner ), + iMarking( NULL ) { + _AKNTRACE_FUNC_ENTER; AKNTASHOOK_ADD( this, "CAknItemActionMenu" ); + _AKNTRACE_FUNC_EXIT; } @@ -327,8 +454,11 @@ // void CAknItemActionMenu::ConstructL( MAknCollection& aCollection ) { + _AKNTRACE_FUNC_ENTER; AddCollectionStateL( aCollection ); iMenuData = CAknItemActionMenuData::NewL(); + iMarking = CAknMarkingMode::NewL( *this, iStates ); + _AKNTRACE_FUNC_EXIT; } @@ -338,6 +468,7 @@ // TInt CAknItemActionMenu::LaunchSubMenuQueryL( const TDesC& aHeading ) { + _AKNTRACE_FUNC_ENTER; TInt selectedIndex( KInvalidListIndex ); if ( iMenuData->Count() ) { @@ -353,6 +484,7 @@ } queryDialog->RunLD(); } + _AKNTRACE_FUNC_EXIT; return ++selectedIndex; } @@ -364,6 +496,7 @@ void CAknItemActionMenu::NotifyChangeToActiveObserver( TBool aCollectionVisible ) { + _AKNTRACE_FUNC_ENTER; for ( TInt i = 0; i < iObservers.Count(); i++ ) { MAknCollectionObserver* observer( iObservers[ i ] ); @@ -373,6 +506,7 @@ break; } } + _AKNTRACE_FUNC_EXIT; } @@ -384,6 +518,8 @@ CCoeControl* /*aMenuControl*/, TBool /*aEmphasis*/ ) { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE_FUNC_EXIT; } @@ -393,6 +529,7 @@ // void CAknItemActionMenu::ProcessCommandL( TInt aCommandId ) { + _AKNTRACE_FUNC_ENTER; MAknCollection* informState ( NULL ); // Store collection state before sending the command for ( TInt i = 0; i < iStates.Count(); i++ ) @@ -413,25 +550,33 @@ { TMenuItemTextBuf text = iMenuData->MenuItemText( aCommandId ); iMenuData->Reset(); - iMenuPane->AddCascadeMenuItemsToActionMenuL( - cascadeId, EFalse, *iMenuData ); + iMenuPane->AddCascadeMenuItemsToMenuL( + cascadeId, EFalse, ETrue, iMenuData ); aCommandId = LaunchSubMenuQueryL( text ); } - if ( aCommandId > 0 && iMenuBarObserver ) + if ( aCommandId > 0 && iMenuData->MenuItemCommandId( aCommandId ) + == EAknCmdMarkingModeMarkOne && iMenuBar ) + { + MarkingMode().MarkCurrentItemL(); + } + else if ( aCommandId > 0 && iMenuBarObserver ) { iProcessingCommand = ETrue; iMenuBarObserver->ProcessCommandL( iMenuData->MenuItemCommandId( aCommandId ) ); iProcessingCommand = EFalse; + // Try exit marking mode + MarkingMode().TryExitMarkingMode(); } } // Inform collection that submenu was closed - if ( iStates.Find( informState ) != KErrNotFound ) + if ( informState && iStates.Find( informState ) != KErrNotFound ) { informState->ItemActionMenuClosed(); } UnregisterMenu(); + _AKNTRACE_FUNC_EXIT; } @@ -441,6 +586,7 @@ // void CAknItemActionMenu::UnregisterMenu() { + _AKNTRACE_FUNC_ENTER; if ( !iProcessingCommand && !iStates.Count() && !iObservers.Count() ) { delete iPopupMenu; @@ -449,6 +595,8 @@ iMenuPane = NULL; AknItemActionMenuRegister::UnregisterItemActionMenu( *this ); } + _AKNTRACE_FUNC_EXIT; } // End of File +