javauis/lcdui_akn/lcdui/src/CMIDDisplayable.cpp
branchRCL_3
changeset 60 6c158198356e
parent 59 e5618cc85d74
--- a/javauis/lcdui_akn/lcdui/src/CMIDDisplayable.cpp	Thu Jul 15 18:31:06 2010 +0300
+++ b/javauis/lcdui_akn/lcdui/src/CMIDDisplayable.cpp	Thu Aug 19 09:48:13 2010 +0300
@@ -272,7 +272,8 @@
         iSKPositionWithQwerty = ESoftkeysBottom;
     }
     else
-    {//default value
+    {
+        //default value
         iSKPositionWithQwerty = ESoftkeysRight;
     }
 
@@ -291,6 +292,8 @@
         ,iPenInputServerConnected(EFalse)
 #endif //RD_TACTILE_FEEDBACK
         ,iIdOfMSKCommand(KErrNotFound)
+        ,iRestoreOrientation(EFalse)
+        ,iReleaseCnt(0)
 {
 #ifdef RD_JAVA_S60_RELEASE_9_2
     iSplitScreenKeyboard = EFalse;
@@ -359,7 +362,8 @@
     delete iCommandList;
 
     if (iMenuHandler->GetDisplayable() == this)
-    {//this may happen when the application is exiting
+    {
+        //this may happen when the application is exiting
         iMenuHandler->SetDisplayable(NULL);
     }
 
@@ -372,10 +376,6 @@
  **/
 void CMIDDisplayable::Dispose()
 {
-    if (iAppUi)
-    {
-        iAppUi->UnSetEnv();
-    }
     ReplaceBehindAlertIfNeeded();
 
     delete this;
@@ -396,7 +396,8 @@
             && IsVisible()
             && (iMenuHandler->GetDisplayable())
             && (iMenuHandler->GetDisplayable()->Component()->Type() == EAlert))
-    {// In this case we are a faded displayable behind a dialog
+    {
+        // In this case we are a faded displayable behind a dialog
         TInt numDisplayables = iAppUi->Displayables().Count();
         TInt index = -1;
         TInt currentPosition = 999;
@@ -632,7 +633,7 @@
             }
 #else
             User::LeaveIfError(aItems.Append(item));
-#endif // RD_JAVA_S60_RELEASE_9_2        
+#endif // RD_JAVA_S60_RELEASE_9_2
         }
     }
 }
@@ -671,7 +672,8 @@
         PopulateMenuItemsWithListL(aMenuType, aMenuItems, iCommandList, EFalse);
     }
     else if (aMenuType == CMIDMenuHandler::EHelpMenu)
-    { // Add the Help commands only
+    {
+        // Add the Help commands only
         PopulateMenuItemsWithListL(aMenuType, aMenuItems, iCommandList, EFalse);
     }
     else if (aMenuType == CMIDMenuHandler::EOptionsMenu)
@@ -693,7 +695,8 @@
     }
 
     if (aCommandId == EAknSoftkeyContextOptions)
-    { // MSK command to show context sensitive menu -> open it
+    {
+        // MSK command to show context sensitive menu -> open it
         ShowOkOptionsMenuL();
     }
     else if (aCommandId == KBuiltInMSKCommandId)
@@ -730,7 +733,7 @@
             form->PostPendingUpEventL();
         }
     }
-#endif // RD_JAVA_S60_RELEASE_9_2    
+#endif // RD_JAVA_S60_RELEASE_9_2
 }
 
 #ifdef RD_SCALABLE_UI_V2
@@ -752,7 +755,8 @@
 {
     TBool postJavaEvent = ETrue;
     if (aCmdEntry.iCommand->Id() < 0)
-    { //non-midlet command, see if there is an observer
+    {
+        //non-midlet command, see if there is an observer
         if (aCmdEntry.iCommand->Observer())
         {
             postJavaEvent = !(aCmdEntry.iCommand->Observer()->ProcessCommandL(aCmdEntry.iCommand));
@@ -770,7 +774,8 @@
 {
     TBool postJavaEvent = ETrue;
     if (aCmdEntry.iCommand->Id() < 0)
-    { //non-midlet command, see if there is an observer
+    {
+        //non-midlet command, see if there is an observer
         if (aCmdEntry.iCommand->Observer())
         {
             postJavaEvent = !(aCmdEntry.iCommand->Observer()->ProcessCommandL(aCmdEntry.iCommand));
@@ -990,32 +995,40 @@
         form->HandleForegroundL(aForeground);
     }
 
-    HandleCanvasForeground(aForeground);
+    // Notify canvas about gained foreground only if it is the current displayable
+    if (!aForeground || iActive)
+    {
+        HandleCanvasForeground(aForeground);
+    }
 
     if (aForeground)
     {
-        //If MIDlet is sent to foreground and JAD-attribute BackgroundEvent=Pause,
-        //then call startApp() method for the MIDlet.
+        // If MIDlet is sent to foreground and JAD-attribute BackgroundEvent=Pause,
+        // then call startApp() method for the MIDlet.
 
         if (iEnv.MidletAttributeIsSetToVal(LcduiMidletAttributes::KAttribBackgroundEvent,
                                            LcduiMidletAttributeValues::KPauseValue))
 
         {
             iEnv.PostMidletEvent(EStart);
+            iAppUi->SetPauseAppState(EFalse);
         }
     }
     else //to background
     {
 
-        //If MIDlet is sent to background and JAD-attribute BackgroundEvent=Pause,
-        //then call pauseApp() method for the MIDlet.
+        // If MIDlet is sent to background and JAD-attribute BackgroundEvent=Pause,
+        // and window is not faded yet or window is already faded but pauseApp was not called yet,
+        // then call pauseApp() method for the MIDlet.
+        TBool isfaded = this->DrawableWindow()->IsFaded();
 
         if (iEnv.MidletAttributeIsSetToVal(LcduiMidletAttributes::KAttribBackgroundEvent,
-                                           LcduiMidletAttributeValues::KPauseValue) &&
-                !this->DrawableWindow()->IsFaded())
+                                           LcduiMidletAttributeValues::KPauseValue) && (!isfaded ||
+                                                   (isfaded && !iAppUi->GetPauseAppState())))
 
         {
             iEnv.PostMidletEvent(EPause);
+            iAppUi->SetPauseAppState(ETrue);
         }
     }
     DEBUG("- CMIDDisplayable::HandleForegroundL");
@@ -1030,11 +1043,13 @@
     DEBUG("+ CMIDDisplayable::HandleResourceChangeL");
 
     if (aType == KEikDynamicLayoutVariantSwitch)
-    { // dynamic orientation change
+    {
+        // dynamic orientation change
 
         // Correct rect is set for displayable
         if (iActive && iCanvasKeypad)
-        { //Update correct On-Screen Keypad type
+        {
+            //Update correct On-Screen Keypad type
             UpdateOnScreenKeypadSettings();
         }
         UpdateDisplayableRect();
@@ -1042,15 +1057,53 @@
 
         // MIDlet icon is resized in cpane SizeChanged()
         if (!iActive && iContentControl)
-        {//The active displayable already gets this call by the CONE framework but
+        {
+            //The active displayable already gets this call by the CONE framework but
             //background displayables don't, so for example a background form won't be
             //re-laid-out if we don't call this here
             iContentControl->HandleResourceChange(aType);
         }
 #ifdef RD_SCALABLE_UI_V2
+        // When current Displayble is Canvas or popup Displayable and the last
+        // Displayble was Canvas, then OSK visual appearance is needed
+        //  to be change.
         if (iUseOnScreenKeypad && iCanvasKeypad && (iActive || this->DrawableWindow()->IsFaded()))
         {
-            iCanvasKeypad->UpdateVisualAppearanceL(*iCanvas, iOnScreenKeyboardType, *this);
+            if (iActive)
+            {
+                // Current is Canvas.
+                iCanvasKeypad->UpdateVisualAppearanceL(*iCanvas, iOnScreenKeyboardType, *this);
+            }
+            else
+            {
+                // Get current Displayable and the last fullscreen Displayble.
+                MMIDDisplayable* current = iEnv.Current();
+                const MMIDDisplayable* last = iEnv.LastFullscreenDisplayable();
+                if (current && last && current->Component()
+                        && last->Component())
+                {
+                    // Get types of Displayables.
+                    MMIDComponent::TType lastType = last->Component()->Type();
+                    MMIDComponent::TType currentType = current->Component()->Type();
+                    if (lastType == ECanvas)
+                    {
+                        if (currentType == EAlert)
+                        {
+                            // Current is Alert and the last fullscreen
+                            // Displayable was Canvas.
+                            iCanvasKeypad->UpdateVisualAppearanceL(
+                                *iCanvas, iOnScreenKeyboardType, *this);
+                        }
+                        else if (currentType == ETextBox && current->IsPopupTextBox())
+                        {
+                            // Current is popup TextBox and the last fullscreen
+                            // Displayable was Canvas.
+                            iCanvasKeypad->UpdateVisualAppearanceL(
+                                *iCanvas, iOnScreenKeyboardType, *this);
+                        }
+                    }
+                }
+            }
         }
 #endif // RD_SCALABLE_UI_V2
         iFullscreenCanvasLabelCacheIsValid = EFalse;
@@ -1058,7 +1111,8 @@
     else if (aType == KEikColorResourceChange ||
              aType == KAknsMessageSkinChange  ||
              aType == KUidValueCoeColorSchemeChangeEvent)
-    { //skin or color change, may need to recreate ctx icon
+    {
+        //skin or color change, may need to recreate ctx icon
         // send skin change event to non-active controls so they can also
         // reload graphics
         if (!iActive && iContentControl)
@@ -1083,6 +1137,26 @@
     }
 }
 
+#ifdef RD_JAVA_NGA_ENABLED
+void CMIDDisplayable::HandleFullOrPartialForegroundL(TBool aFullOrPartialFg)
+{
+    CMIDCanvas* canvas = GetContentCanvas();
+    if (canvas)
+    {
+        canvas->HandleFullOrPartialForegroundL(aFullOrPartialFg, iActive);
+    }
+}
+
+void CMIDDisplayable::HandleFreeGraphicsMemory()
+{
+    CMIDCanvas* canvas = GetContentCanvas();
+    if (canvas)
+    {
+        canvas->FreeGraphicsMemory(ETrue);
+    }
+}
+#endif // RD_JAVA_NGA_ENABLED
+
 /**
  * The container has changed it available drawing space, so resize
  * the displayable to fit and post a size changed event.
@@ -1150,122 +1224,133 @@
 {
     DEBUG("+ CMIDDisplayable::GetCanvasRectFromLaf");
 
-    TRect resultRect;
+    TRect resultRect = TRect(0,0,0,0);
     AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EScreen, resultRect);
     TAknLayoutRect canvasRect;
     TAknLayoutRect mainPane;
     TAknLayoutRect mainMidpPane;
 
-    //Read canvasRect from LAF depending on keyboard type
-    switch (iOnScreenKeyboardType)
+#ifdef RD_JAVA_S60_RELEASE_9_2
+    // If split screen is open, then it is needed return current size of Canvas.
+    if (iSplitScreenKeyboard)
     {
-    case EOnScreenKeypadValueNo:
-        break;
-    case EOnScreenKeypadValueNavigationKeys:
-    {
-        if (iIsFullScreenMode)
+        CMIDCanvas* canvas = GetContentCanvas();
+        if (canvas)
         {
-            if (!Layout_Meta_Data::IsLandscapeOrientation())  //portrait
-            {
-                canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(1).LayoutLine());
-            }
-            else //landscape
-            {
-                canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(8).LayoutLine());
-            }
+            resultRect = canvas->ViewRect();
         }
-        else //normal mode
+    }
+    else
+    {
+#endif // RD_JAVA_S60_RELEASE_9_2    
+        //Read canvasRect from LAF depending on keyboard type
+        switch (iOnScreenKeyboardType)
         {
-            if (!Layout_Meta_Data::IsLandscapeOrientation())  //portrait
+        case EOnScreenKeypadValueNo:
+            break;
+        case EOnScreenKeypadValueNavigationKeys:
+        {
+            if (iIsFullScreenMode)
             {
-                mainPane.LayoutRect(resultRect, AknLayoutScalable_Avkon::main_pane(3).LayoutLine());
-                mainMidpPane.LayoutRect(mainPane.Rect(), AknLayoutScalable_Avkon::main_midp_pane(0).LayoutLine());
-                canvasRect.LayoutRect(mainMidpPane.Rect(), AknLayoutScalable_Avkon::midp_canvas_pane(4).LayoutLine());
-            }
-            else //landscape
-            {
-                mainPane.LayoutRect(resultRect, AknLayoutScalable_Avkon::main_pane(4).LayoutLine());
-                mainMidpPane.LayoutRect(mainPane.Rect(), AknLayoutScalable_Avkon::main_midp_pane(1).LayoutLine());
-                canvasRect.LayoutRect(mainMidpPane.Rect(), AknLayoutScalable_Avkon::midp_canvas_pane(7).LayoutLine());
-            }
-        }
-        resultRect = canvasRect.Rect();
-        break;
-    }
-    case EOnScreenKeypadValueGameActions:
-    {
-        if (iIsFullScreenMode)
-        {
-            if (!Layout_Meta_Data::IsLandscapeOrientation())  //portrait
-            {
-                canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(2).LayoutLine());
+                if (!Layout_Meta_Data::IsLandscapeOrientation())  //portrait
+                {
+                    canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(1).LayoutLine());
+                }
+                else //landscape
+                {
+                    canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(8).LayoutLine());
+                }
             }
-            else //landscape
-            {
-                canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(3).LayoutLine());
-            }
-        }
-        else //normal mode
-        {
-            if (!Layout_Meta_Data::IsLandscapeOrientation())  //portrait
-            {
-                mainPane.LayoutRect(resultRect, AknLayoutScalable_Avkon::main_pane(3).LayoutLine());
-                mainMidpPane.LayoutRect(mainPane.Rect(), AknLayoutScalable_Avkon::main_midp_pane(0).LayoutLine());
-                canvasRect.LayoutRect(mainMidpPane.Rect(), AknLayoutScalable_Avkon::midp_canvas_pane(5).LayoutLine());
-            }
-            else//landscape
+            else //normal mode
             {
-                mainPane.LayoutRect(resultRect, AknLayoutScalable_Avkon::main_pane(4).LayoutLine());
-                mainMidpPane.LayoutRect(mainPane.Rect(), AknLayoutScalable_Avkon::main_midp_pane(1).LayoutLine());
-                canvasRect.LayoutRect(mainMidpPane.Rect(), AknLayoutScalable_Avkon::midp_canvas_pane(6).LayoutLine());
-            }
-        }
-        resultRect = canvasRect.Rect();
-        break;
-    }
-    case EOnScreenKeypadValueLskRsk:
-    {
-        if (iIsFullScreenMode)
-        {
-            if (!Layout_Meta_Data::IsLandscapeOrientation())  //portrait
-            {
-                canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(11).LayoutLine());
-            }
-            else //landscape
-            {
-                if (iSKPositionWithQwerty == ESoftkeysRight)
+                if (!Layout_Meta_Data::IsLandscapeOrientation())  //portrait
                 {
-                    canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(10).LayoutLine());
+                    mainPane.LayoutRect(resultRect, AknLayoutScalable_Avkon::main_pane(3).LayoutLine());
+                    mainMidpPane.LayoutRect(mainPane.Rect(), AknLayoutScalable_Avkon::main_midp_pane(0).LayoutLine());
+                    canvasRect.LayoutRect(mainMidpPane.Rect(), AknLayoutScalable_Avkon::midp_canvas_pane(4).LayoutLine());
                 }
-                else
+                else //landscape
                 {
-#ifdef RD_JAVA_S60_RELEASE_9_2
-                    canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(9).LayoutLine());
-#else
-                    resultRect = TRect(80,0,560,360); // Layout data not defined in older releases.
-                    DEBUG("- CMIDDisplayable::GetCanvasRectFromLaf");
-                    return resultRect;
-#endif // RD_JAVA_S60_RELEASE_9_2
+                    mainPane.LayoutRect(resultRect, AknLayoutScalable_Avkon::main_pane(4).LayoutLine());
+                    mainMidpPane.LayoutRect(mainPane.Rect(), AknLayoutScalable_Avkon::main_midp_pane(1).LayoutLine());
+                    canvasRect.LayoutRect(mainMidpPane.Rect(), AknLayoutScalable_Avkon::midp_canvas_pane(7).LayoutLine());
                 }
             }
+            resultRect = canvasRect.Rect();
+            break;
         }
-        else//normal mode
+        case EOnScreenKeypadValueGameActions:
         {
-            //no need to present LSK&RSK in OSK when in normal mode Canvas
-            resultRect = TRect(0,0,0,0);
-
-            DEBUG("- CMIDDisplayable::GetCanvasRectFromLaf");
-            return resultRect;
+            if (iIsFullScreenMode)
+            {
+                if (!Layout_Meta_Data::IsLandscapeOrientation())  //portrait
+                {
+                    canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(2).LayoutLine());
+                }
+                else //landscape
+                {
+                    canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(3).LayoutLine());
+                }
+            }
+            else //normal mode
+            {
+                if (!Layout_Meta_Data::IsLandscapeOrientation())  //portrait
+                {
+                    mainPane.LayoutRect(resultRect, AknLayoutScalable_Avkon::main_pane(3).LayoutLine());
+                    mainMidpPane.LayoutRect(mainPane.Rect(), AknLayoutScalable_Avkon::main_midp_pane(0).LayoutLine());
+                    canvasRect.LayoutRect(mainMidpPane.Rect(), AknLayoutScalable_Avkon::midp_canvas_pane(5).LayoutLine());
+                }
+                else//landscape
+                {
+                    mainPane.LayoutRect(resultRect, AknLayoutScalable_Avkon::main_pane(4).LayoutLine());
+                    mainMidpPane.LayoutRect(mainPane.Rect(), AknLayoutScalable_Avkon::main_midp_pane(1).LayoutLine());
+                    canvasRect.LayoutRect(mainMidpPane.Rect(), AknLayoutScalable_Avkon::midp_canvas_pane(6).LayoutLine());
+                }
+            }
+            resultRect = canvasRect.Rect();
+            break;
         }
-        resultRect = canvasRect.Rect();
-        break;
+        case EOnScreenKeypadValueLskRsk:
+        {
+            if (iIsFullScreenMode)
+            {
+                if (!Layout_Meta_Data::IsLandscapeOrientation())  //portrait
+                {
+                    canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(11).LayoutLine());
+                }
+                else //landscape
+                {
+                    if (iSKPositionWithQwerty == ESoftkeysRight)
+                    {
+                        canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(10).LayoutLine());
+                    }
+                    else
+                    {
+#ifdef RD_JAVA_S60_RELEASE_9_2
+                        canvasRect.LayoutRect(resultRect, AknLayoutScalable_Avkon::midp_canvas_pane(9).LayoutLine());
+#else
+                        resultRect = TRect(80,0,560,360); // Layout data not defined in older releases.
+                        DEBUG("- CMIDDisplayable::GetCanvasRectFromLaf");
+                        return resultRect;
+#endif // RD_JAVA_S60_RELEASE_9_2
+                    }
+                }
+            }
+            else//normal mode
+            {
+                //no need to present LSK&RSK in OSK when in normal mode Canvas
+                resultRect = TRect(0,0,0,0);
+
+                DEBUG("- CMIDDisplayable::GetCanvasRectFromLaf");
+                return resultRect;
+            }
+            resultRect = canvasRect.Rect();
+            break;
+        }
+        }
+#ifdef RD_JAVA_S60_RELEASE_9_2
     }
-    default:
-    {
-        resultRect = TRect(0,0,0,0);
-        break;
-    }
-    }
+#endif // RD_JAVA_S60_RELEASE_9_2
 
     DEBUG("- CMIDDisplayable::GetCanvasRectFromLaf");
     return resultRect;
@@ -1371,10 +1456,10 @@
     iActive = aCurrent;
     const TType type = iContent->Type();
 
-    HandleCanvasForeground(aCurrent);
-
     if (aCurrent)
     {
+        HandleCanvasForeground(aCurrent);
+
         // when setting displayable as current remember to deactivate
         // the default displayable if it has not been done yet
         CMIDDisplayable* defaultDisplayable =
@@ -1406,14 +1491,16 @@
     }
 
     if (type == EAlert)
-    {// alerts do their on thing, they rely on sleeping dialogs in fact
+    {
+        // alerts do their on thing, they rely on sleeping dialogs in fact
         CMIDAlert* alert = static_cast<CMIDAlert*>(iContentControl);
         TRAP_IGNORE(alert->HandleCurrentL(aCurrent));
 
         UpdateTickerL();
     }
     else if (type == ETextBox && iIsPopupTextBox)
-    {// Pop-up TextBox do their on thing, they rely on sleeping dialogs in fact
+    {
+        // Pop-up TextBox do their on thing, they rely on sleeping dialogs in fact
         CMIDTextBoxDialogControl* textBoxDialogControl =
             static_cast<CMIDTextBoxDialogControl*>(iContentControl);
         TRAP_IGNORE(textBoxDialogControl->HandleCurrentL(aCurrent));
@@ -1436,6 +1523,9 @@
             {
                 MakeVisible(EFalse);
             }
+
+            // Notify canvas after changing the visibility
+            HandleCanvasForeground(aCurrent);
         }
 
         iContentControl->SetFocus(aCurrent);
@@ -1993,7 +2083,8 @@
         }
 #endif //RD_SCALABLE_UI_V2
         if (!iActive)
-        { // Restore pane visibility. There is one pane for all displayables.
+        {
+            // Restore pane visibility. There is one pane for all displayables.
             // Only active displayable can decide about the pane visibility.
             // Others should not change it.
             pane->MakeVisible(paneVisible);
@@ -2012,7 +2103,8 @@
             iCba->ReduceRect(iDisplayableRect);
 
             if (!iActive)
-            { // Restore cba visibility. There is one cba for all displayables.
+            {
+                // Restore cba visibility. There is one cba for all displayables.
                 // Only active displayable can decide about the cba visibility.
                 // Others should not change it.
                 iCba->MakeVisible(cbaVisible);
@@ -2050,7 +2142,8 @@
     SetRect(iDisplayableRect);
 
     if (iActive)
-    { //this means we are the active displayable
+    {
+        //this means we are the active displayable
         UpdateVisualAppearanceL();
     }
 
@@ -2119,7 +2212,8 @@
     CMIDCommand* oldMSKCommand = iMSKCommand;
     iMSKCommand = aMSKCommand;
     if (oldMSKCommand != iMSKCommand)
-    { // avoid unnecessary updating to avoid flickering
+    {
+        // avoid unnecessary updating to avoid flickering
         TRAP_IGNORE(InitializeCbasL());
     }
 }
@@ -2127,7 +2221,8 @@
 void CMIDDisplayable::SetSelectCommand(CMIDCommand* aSelectCommand)
 {
     if (aSelectCommand != iSelectCommand)
-    { // avoid unnecessary updating to avoid flickering
+    {
+        // avoid unnecessary updating to avoid flickering
         iSelectCommand = aSelectCommand;
         TRAP_IGNORE(InitializeCbasL());
     }
@@ -2239,7 +2334,7 @@
     if (iSelectCommand)
 #else
     if (!iSelectCommandEnabled && iSelectCommand)
-#endif // RD_JAVA_S60_RELEASE_9_2        
+#endif // RD_JAVA_S60_RELEASE_9_2
     {
         // remove the select command
         for (TInt j = 0; j < lists.Count(); j++)
@@ -2346,7 +2441,8 @@
             // There is a explicitly set MSK command -> it takes the precedence and gets MSK
             TInt commandId = GetInternalCommandIdFor(iMSKCommand);
             if (commandId == KCommandIdNotFound)
-            {// it must be a built-in command, it is the only command not contained in the command lists
+            {
+                // it must be a built-in command, it is the only command not contained in the command lists
                 commandId = KBuiltInMSKCommandId;
             }
             iCba->SetCommandL(KMSKPositionInCBA, commandId, iMSKCommand->ShortLabel());
@@ -2357,7 +2453,7 @@
             // There is no explicitly set MSK command and just one for the context menu.
             // Instead of a menu, put the command to MSK directly.
             RPointerArray<CMIDCommand> commands;
-            GetOkOptionsMenuCommands(commands);
+            GetOkOptionsMenuCommandsL(commands);
             ASSERT(commands.Count() == 1);
             CMIDCommand* command = commands[0];
             commands.Close();
@@ -2475,7 +2571,8 @@
         cmd.iCommand = NULL;
 
         if (iItemCommandList && iItemCommandList->Count() > 0)
-        {// there can only be one so pick the first one
+        {
+            // there can only be one so pick the first one
             cmd = iItemCommandList->At(0);
 
             if (cmd.iCommand->IsMappedToSoftKey())
@@ -2488,7 +2585,8 @@
         {
             TInt index = iCommandList->HighestPriorityCommand(MMIDCommand::EOk);
             if (index == KErrNotFound)
-            {// there can only be one so if the other one was KErrNotFound, this must be it
+            {
+                // there can only be one so if the other one was KErrNotFound, this must be it
                 index = iCommandList->HighestPriorityCommand(MMIDCommand::EItem);
             }
             cmd = iCommandList->At(index);
@@ -2510,6 +2608,47 @@
     return EFalse;
 }
 
+// ---------------------------------------------------------------------------
+// See how many commands eligible for the screen or help - optins menu we have.
+// If we have only one command call ProcessCommandL. Otherwise show
+// options menu. In these two cases return ETrue. If zero or negative
+// commands do nothing and return EFalse.
+// ---------------------------------------------------------------------------
+TBool CMIDDisplayable::ShowScreenOrHelpOptionsMenuL()
+{
+    TBool ret = EFalse;
+    TInt numOkCommands = NumCommandsForOkOptionsMenu();
+    TInt numScreenOrHelpCommands = NumCommandsForScreenOrHelpOptionsMenu();
+    TInt screenOrHelpCmdIndex = GetHighestPriorityScreenOrHelpCommand();
+
+    // There is no OK or ITEM command defined on form
+    // There are SCREEN or HELP commands
+    if (iCommandList && screenOrHelpCmdIndex != KErrNotFound && numOkCommands == 0)
+    {
+        CMIDCommand *command = NULL;
+        if (iCommandList->IsValidIndex(screenOrHelpCmdIndex))
+        {
+            command = iCommandList->At(screenOrHelpCmdIndex).iCommand;
+        }
+
+        if (command && (command->CommandType() == MMIDCommand::EScreen ||
+                        command->CommandType() == MMIDCommand::EHelp) && iMenuHandler)
+        {
+            if (numScreenOrHelpCommands > 1)
+            {
+                iMenuHandler->ShowMenuL(CMIDMenuHandler::EOptionsMenu);
+                ret = ETrue;
+            }
+            else if (numScreenOrHelpCommands == 1)
+            {
+                ProcessCommandL(iCommandList->CommandOffset());
+                ret = ETrue;
+            }
+        }
+    }
+
+    return ret;
+}
 
 // ---------------------------------------------------------------------------
 // Return the number of commands that can be displayed in the ok-options menu.
@@ -2572,6 +2711,47 @@
 }
 
 // ---------------------------------------------------------------------------
+// Return the number of commands that can be displayed in the screen or help - options menu.
+// Form item screen or help commands are ignored
+//
+// TextBox/TextField device-provided commands:
+// - "Fetch number"
+// - "Call"
+// - "Fetch e-mail address"
+// are exception. Those are visible ONLY in Options menu so here they are
+// removed from context menu commands count.
+// ---------------------------------------------------------------------------
+TInt CMIDDisplayable::NumCommandsForScreenOrHelpOptionsMenu() const
+{
+    TInt ret = 0;
+
+    // Add SCREEN and HELP commands from form
+    if (iCommandList)
+    {
+        TInt numCommands = iCommandList->Count();
+        for (TInt i = 0; i < numCommands; i++)
+        {
+            const CMIDCommand& command = *(iCommandList->At(i).iCommand);
+
+            if (((command.CommandType() == MMIDCommand::EScreen) ||
+                    (command.CommandType() == MMIDCommand::EHelp)) &&
+                    (command.Id() != CMIDEdwinUtils::EMenuCommandFetchPhoneNumber) &&
+                    (command.Id() != CMIDEdwinUtils::EMenuCommandFetchEmailAddress) &&
+                    (command.Id() != CMIDEdwinUtils::EMenuCommandCreatePhoneCall))
+            {
+                TBool selectCommand = (&command == iSelectCommand);
+                if (selectCommand && !iSelectCommandEnabled)
+                {
+                    continue;
+                }
+                ret++;
+            }
+        }
+    }
+    return ret;
+}
+
+// ---------------------------------------------------------------------------
 // Returns a pointer to the command in the iCommandList with the specified
 // ID number. If such command is not found, returns NULL.
 // ---------------------------------------------------------------------------
@@ -2603,7 +2783,7 @@
 // If there are item commands, there are placed first. Form commands of ITEM
 // and OK type are then included always.
 // ---------------------------------------------------------------------------
-void CMIDDisplayable::GetOkOptionsMenuCommands(RPointerArray<CMIDCommand>& aCommands) const
+void CMIDDisplayable::GetOkOptionsMenuCommandsL(RPointerArray<CMIDCommand>& aCommands) const
 {
     aCommands.Reset();
     if (iItemCommandList && iItemCommandList->Count() > 0)
@@ -2615,7 +2795,7 @@
                     (command->Id() != CMIDEdwinUtils::EMenuCommandFetchEmailAddress) &&
                     (command->Id() != CMIDEdwinUtils::EMenuCommandCreatePhoneCall))
             {
-                aCommands.Append(command);
+                aCommands.AppendL(command);
             }
         }
     }
@@ -2635,7 +2815,7 @@
             {
                 continue;
             }
-            aCommands.Append(command);
+            aCommands.AppendL(command);
         }
     }
 }
@@ -2725,7 +2905,7 @@
     if (NumCommandsForOkOptionsMenu() > 0)
 #else
     if (NumCommandsForOkOptionsMenu() > 1)
-#endif // RD_JAVA_S60_RELEASE_9_2        
+#endif // RD_JAVA_S60_RELEASE_9_2
     {
         iLongTapDetector->PointerEventL(aPointerEvent);
     }
@@ -2758,7 +2938,7 @@
         PopulateMenuItemsWithListL(CMIDMenuHandler::EPopUpMenu, menuItems, iItemCommandList, EFalse);
 #else
         PopulateMenuItemsWithListL(CMIDMenuHandler::EOkMenu, menuItems, iItemCommandList, EFalse);
-#endif // RD_JAVA_S60_RELEASE_9_2        
+#endif // RD_JAVA_S60_RELEASE_9_2
     }
 
     // Add form commands always
@@ -2766,12 +2946,12 @@
     PopulateMenuItemsWithListL(CMIDMenuHandler::EPopUpMenu, menuItems, iCommandList, EFalse);
 #else
     PopulateMenuItemsWithListL(CMIDMenuHandler::EOkMenu, menuItems, iCommandList, EFalse);
-#endif // RD_JAVA_S60_RELEASE_9_2    
+#endif // RD_JAVA_S60_RELEASE_9_2
 #ifdef RD_JAVA_S60_RELEASE_9_2
     if (menuItems.Count() > 0)
 #else
     if (menuItems.Count() > 1)
-#endif // RD_JAVA_S60_RELEASE_9_2        
+#endif // RD_JAVA_S60_RELEASE_9_2
     {
         // recreate stylus popup menu because it does not have method
         // for clearing the menu items
@@ -2975,8 +3155,15 @@
                      rect, TIdentityRelation< TDirectContentsRect >(CMIDDisplayable::MatchDirectContentsRects));
     if (index == KErrNotFound)
     {
-        iDirectContentsRects.Append(rect);
-        UpdateDirectContentsRegion();
+        TInt err = iDirectContentsRects.Append(rect);
+        if (KErrNone == err)
+        {
+            UpdateDirectContentsRegion();
+        }
+        else
+        {
+            DEBUG_INT("CMIDDisplayable::AddDirectContentArea - RArray append error %d", err);
+        }
     }
     else
     {
@@ -3161,11 +3348,9 @@
 
 void CMIDDisplayable::HandleCanvasForeground(TBool aForeground)
 {
-    if (iContent && iContentControl &&
-            (iContent->Type() == MMIDComponent::ECanvas ||
-             iContent->Type() == MMIDComponent::EGameCanvas))
+    CMIDCanvas* canvas = GetContentCanvas();
+    if (canvas)
     {
-        CMIDCanvas* canvas = static_cast<CMIDCanvas*>(iContentControl);
         canvas->HandleForeground(aForeground);
     }
 }
@@ -3225,6 +3410,18 @@
     HideIndicator(pane, EEikStatusPaneUidDigitalClock);
 }
 
+CMIDCanvas* CMIDDisplayable::GetContentCanvas()
+{
+    CMIDCanvas* ret = NULL;
+    if (iContent && iContentControl &&
+            (iContent->Type() == MMIDComponent::ECanvas ||
+             iContent->Type() == MMIDComponent::EGameCanvas))
+    {
+        ret = static_cast<CMIDCanvas*>(iContentControl);
+    }
+    return ret;
+}
+
 CPropertyWatch* CPropertyWatch::NewL(MMIDDisplayable* aDisplayable)
 {
     DEBUG("+ CPropertyWatch::NewL");
@@ -3239,6 +3436,48 @@
     return self;
 }
 
+void CMIDDisplayable::FixOrientation()
+{
+    TBool tmpRestoreOrientation;
+
+    if (!iAvkonAppUi)
+    {
+        return;
+    }
+
+    iOldUiOrientation = iAvkonAppUi->Orientation();
+    tmpRestoreOrientation = (iOldUiOrientation == CAknAppUiBase::EAppUiOrientationUnspecified) ? ETrue : EFalse;
+
+    // Fix the orientation when was set to unspecified only
+    if (tmpRestoreOrientation)
+    {
+        TRAP_IGNORE(iAvkonAppUi->SetOrientationL(CAknAppUiBase::EAppUiOrientationLandscape));
+
+        iRestoreOrientation = ETrue;
+        ++iReleaseCnt;
+    }
+
+}
+
+void CMIDDisplayable::ReleaseOrientation()
+{
+    if (!iAvkonAppUi)
+    {
+        return;
+    }
+
+    if (iReleaseCnt > 0)
+    {
+        --iReleaseCnt;
+        if (iReleaseCnt == 0 && iRestoreOrientation)
+        {
+            TRAP_IGNORE(iAvkonAppUi->SetOrientationL(iOldUiOrientation));
+            iRestoreOrientation = EFalse;
+        }
+
+    }
+}
+
 CPropertyWatch::CPropertyWatch()
         : CActive(0)
 {