uifw/EikStd/coctlsrc/EIKMENUP.CPP
branchRCL_3
changeset 10 3d340a0166ff
parent 9 0aa5fbdfbc30
child 12 941195f2d488
--- a/uifw/EikStd/coctlsrc/EIKMENUP.CPP	Tue Apr 27 16:55:05 2010 +0300
+++ b/uifw/EikStd/coctlsrc/EIKMENUP.CPP	Tue May 11 16:27:42 2010 +0300
@@ -143,7 +143,7 @@
     /**
      * Prepares cascade menu for item specific commands.
      */
-    void PrepareCascadeForItemCommands();
+    void PrepareCascadeForItemCommandsL();
 
     /**
      * Returns ETrue if this menu pane belongs to a CS menu.
@@ -237,7 +237,8 @@
         EHideItemSpecificCommands,
         EContextSensitive,
         ESkipScrollbarUpdate,
-        EHighlightEnabled
+        EHighlightEnabled,
+        EHideViewSpecificCommands
         };
 
     /**
@@ -839,6 +840,11 @@
         {
         cascadeMenuPane->SetParent( iControl );
         GfxTransEffect::Begin( cascadeMenuPane, KGfxControlAppearAction );
+        if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) )
+            {
+            ImmediateFeedback( ETouchFeedbackSubMenuOpened,
+                                            ETouchFeedbackVibra );
+            }
         cascadeMenuPane->StartDisplayingMenuPane( iControl->iHotKeyTable,
                                                   iControl->Position(),
                                                   NULL,
@@ -1248,6 +1254,7 @@
     iFlags.Clear( EHideItemSpecificCommands );
     iFlags.Clear( EContextSensitive );
     iFlags.Clear( EHighlightEnabled );
+    iFlags.Clear( EHideViewSpecificCommands );
     _AKNTRACE_FUNC_EXIT;
     }
 
@@ -1329,8 +1336,8 @@
     TTouchLogicalFeedback aType,
     TTouchFeedbackType aFbType  = TTouchFeedbackType( ETouchFeedbackAudio |
                                                       ETouchFeedbackVibra ))
-    {   
-    if ( iFeedback )
+    {
+    if( iFeedback && AknLayoutUtils::PenEnabled() )
         {
         iFeedback->InstantFeedback( iControl, aType, aFbType, TPointerEvent() );
         }
@@ -1338,10 +1345,10 @@
 
 
 // -----------------------------------------------------------------------------
-// CEikMenuPaneExtension::PrepareCascadeForItemCommands
-// -----------------------------------------------------------------------------
-//
-void CEikMenuPaneExtension::PrepareCascadeForItemCommands()
+// CEikMenuPaneExtension::PrepareCascadeForItemCommandsL
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPaneExtension::PrepareCascadeForItemCommandsL()
     {
     if ( iFlags.IsSet( ESingleClickEnabled )
             && iControl->iOwner
@@ -1354,7 +1361,7 @@
             }
         else if ( ownerFlags.IsSet( EHideItemSpecificCommands ) )
             {
-            iControl->SetItemCommandsDimmed();
+            iControl->SetItemCommandsStateL( ETrue );
             }
         }
     }
@@ -1795,6 +1802,13 @@
     {
     _AKNTRACE_FUNC_ENTER;
     AKNTASHOOK_REMOVE();
+
+    if ( iIsDeleted )
+        {
+        *iIsDeleted = ETrue;
+        iIsDeleted = NULL;
+        }
+    
     CloseCascadeMenu();
     if ( !ItemArrayOwnedExternally() )
         {
@@ -2246,7 +2260,7 @@
         iEditMenuObserver->DynInitMenuPaneL( aCascadeMenuId, iCascadeMenuPane );
         }
 
-    iCascadeMenuPane->iExtension->PrepareCascadeForItemCommands();
+    iCascadeMenuPane->iExtension->PrepareCascadeForItemCommandsL();
     iCascadeMenuPane->iExtension->EnableHighlight( EFalse );
     iCascadeMenuPane->FilterDimmedItems();
 
@@ -2259,13 +2273,7 @@
         {
         iExtension->StartCascadeMenuAppearTransition();
         }
-
-    TTouchLogicalFeedback fbLogicalType = ETouchFeedbackPopUp;
-    if ( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) )
-        {
-        fbLogicalType = ETouchFeedbackSubMenuOpened;
-        }
-    iExtension->ImmediateFeedback( fbLogicalType,
+    iExtension->ImmediateFeedback( ETouchFeedbackPopUp,
                                        ETouchFeedbackVibra );
     _AKNTRACE_FUNC_EXIT;
     }
@@ -3099,10 +3107,35 @@
         CEikMenuPane* menu = iOwner ? iOwner : this;
         MCoeControlObserver* observer = menu->Observer();
 
-        if ( commandId != EAknCmdTaskSwapper )
+        if ( commandId >= EAknCmdMarkingModeEnter 
+                && commandId <= EAknCmdMarkingModeUnmarkAll )
+            {
+            CEikMenuBar* menuBar = static_cast<CEikMenuBar*>( Parent() );
+            if ( menuBar && menuBar->MenuPane() == this )
+                {
+                static_cast<MEikCommandObserver*>(
+                        menuBar)->ProcessCommandL( commandId );
+                }
+            ReportCanceled();
+            }
+        else if ( commandId != EAknCmdTaskSwapper )
             {
             _AKNTRACE( "commandId = %d",  commandId );
+            TBool isDeleted = EFalse;
+            iIsDeleted = &isDeleted;
             iMenuObserver->ProcessCommandL( commandId ); 
+
+            if ( !isDeleted )
+                {
+                CEikMenuBar* menuBar = static_cast<CEikMenuBar*>( Parent() );
+                if ( menuBar && menuBar->MenuPane() == this )
+                    {
+                    static_cast<MEikCommandObserver*>(
+                            menuBar)->ProcessCommandL( commandId );
+                    }
+                }            
+
+            iIsDeleted = NULL;
             }
         else
             {
@@ -4014,10 +4047,10 @@
                 _AKNTRACE_FUNC_EXIT;
                 return iOwner->HandlePointerEventL( parentEvent );
                 }
-            iExtension->iDownOnMenuArea = EFalse;
 
             iExtension->iPanningActive = EFalse;
-            if ( !(iExtension->iSct &&  iExtension->iSct->Rect().Contains( iExtension->iStartPoint ) ) )
+            if ( !(iExtension->iSct &&  iExtension->iSct->Rect().Contains( iExtension->iStartPoint ) ) 
+                && iExtension->iDownOnMenuArea )
                 {
                 TPoint drag = iExtension->iStartPoint - aPointerEvent.iPosition;
                 if ( iExtension->iPhysics->StartPhysics( 
@@ -4027,6 +4060,7 @@
                     iExtension->ResetPressedHighlight();
                     }
                 }
+             iExtension->iDownOnMenuArea = EFalse;
             if ( iExtension->HighlightTimerActive() &&
                  !iExtension->iPressedDown )
                 {
@@ -4375,11 +4409,11 @@
             if( Abs( threshold ) > iExtension->iPhysics->DragThreshold() 
                 && iExtension->iDownOnMenuArea )
                 {
+                iExtension->EnableHighlight( EFalse );
                 iExtension->iButtonDownItem = KErrNotFound;
                 iExtension->ResetPressedHighlight();
                 iExtension->iNextHighlightItem = KErrNotFound;
                 iExtension->iPanningActive = ETrue;
-                iExtension->EnableHighlight( EFalse );
                 }    
                          
             if ( iExtension->iPanningActive && iExtension->iDownOnMenuArea )
@@ -6514,25 +6548,51 @@
 
 
 // -----------------------------------------------------------------------------
-// CEikMenuPane::SetItemCommandsDimmed
-// -----------------------------------------------------------------------------
-//
-void CEikMenuPane::SetItemCommandsDimmed()
+// CEikMenuPane::SetItemCommandsStateL
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPane::SetItemCommandsStateL( TBool aDimmed )
     {
     if ( iExtension && iExtension->iFlags.IsSet(
             CEikMenuPaneExtension::ESingleClickEnabled ) )
         {
-        iExtension->iFlags.Set(
-                CEikMenuPaneExtension::EHideItemSpecificCommands );
+        if ( aDimmed )
+            {
+            iExtension->iFlags.Set(
+                    CEikMenuPaneExtension::EHideItemSpecificCommands );
+            }
+        else
+            {
+            iExtension->iFlags.Set(
+                    CEikMenuPaneExtension::EHideViewSpecificCommands );
+            }
         for ( TInt i = 0; i < iItemArray->Count(); ++i )
             {
             CEikMenuPaneItem* item = iItemArray->At( i );
-            if ( item->iData.iFlags & EEikMenuItemAction
+            TBool itemSpecificItem(
+                    item->iData.iFlags & EEikMenuItemAction
                     || item->iData.iFlags & EEikMenuItemSpecific
-                    || item->iData.iFlags & EEikMenuItemSpecificListQuery )
+                    || item->iData.iFlags & EEikMenuItemSpecificListQuery );
+            // Dim item specific items
+            if ( aDimmed && itemSpecificItem )
                 {
                 item->iData.iFlags |= EEikMenuItemDimmed;
                 }
+            // Dim items not item specific
+            else if ( !aDimmed
+                        && ( !itemSpecificItem
+                        || item->iData.iFlags & EEikMenuItemAction ) )
+                {
+                item->iData.iFlags |= EEikMenuItemDimmed;
+                if ( item->iData.iCascadeId ) 
+                    {
+                    // i is not updated in AddCascadeMenuItemsToMenuL so going 
+                    // through added items again here. Then it goes through
+                    // also submenus of submenus. 
+                    AddCascadeMenuItemsToMenuL(
+                            item->iData.iCascadeId, ETrue, EFalse, NULL, i );
+                    }
+                }
             }
         }
     }
@@ -6560,8 +6620,8 @@
             if ( !( item->iData.iFlags & EEikMenuItemSpecificListQuery )
                     && item->iData.iCascadeId )
                 {
-                AddCascadeMenuItemsToActionMenuL(
-                        item->iData.iCascadeId, EFalse, aMenuData );
+                AddCascadeMenuItemsToMenuL(
+                        item->iData.iCascadeId, EFalse, ETrue, &aMenuData );
                 }
             // If menu item is list query or it does not have cascade menu
             else
@@ -6577,21 +6637,23 @@
         else if ( item->iData.iCascadeId && 
                 !( item->iData.iFlags & EEikMenuItemDimmed ) )
             {
-            AddCascadeMenuItemsToActionMenuL(
-                    item->iData.iCascadeId, ETrue, aMenuData );
+            AddCascadeMenuItemsToMenuL(
+                    item->iData.iCascadeId, ETrue, ETrue, &aMenuData );
             }
         }
     }
 
 
 // -----------------------------------------------------------------------------
-// CEikMenuPane::AddCascadeMenuItemsToActionMenuL
-// -----------------------------------------------------------------------------
-//
-void CEikMenuPane::AddCascadeMenuItemsToActionMenuL(
+// CEikMenuPane::AddCascadeMenuItemsToMenuL
+// -----------------------------------------------------------------------------
+//
+void CEikMenuPane::AddCascadeMenuItemsToMenuL(
         TInt aCascadeId,
         TBool aItemSpecific,
-        CAknItemActionMenuData& aMenuData )
+        TBool aAddToItemActionMenu,
+        CAknItemActionMenuData* aMenuData,
+        TInt aItemIndex )
     {
     if ( aCascadeId && iCoeEnv->IsResourceAvailableL( aCascadeId ) )
         {
@@ -6610,10 +6672,17 @@
                 || ( !aItemSpecific
                         && !( item->iData.iFlags & EEikMenuItemDimmed ) ) )
                 {
-                aMenuData.AddMenuItemToDataArrayL(
-                        item->iData.iCommandId,
-                        item->iData.iCascadeId,
-                        item->iData.iText );
+                if ( aAddToItemActionMenu )
+                    {
+                    aMenuData->AddMenuItemToDataArrayL(
+                            item->iData.iCommandId,
+                            item->iData.iCascadeId,
+                            item->iData.iText );
+                    }
+                else 
+                    {
+                    InsertMenuItemL( item->iData, ++aItemIndex );
+                    }
                 }
             }
         CleanupStack::PopAndDestroy( cascadeMenu );