uifw/EikStd/coctlsrc/aknitemactionmenu.cpp
branchRCL_3
changeset 56 d48ab3b357f1
parent 55 aecbbf00d063
child 64 85902f042028
--- 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
+