uifw/AvKon/src/aknutils.cpp
branchRCL_3
changeset 10 9f56a4e1b8ab
parent 4 8ca85d2f0db7
child 15 08e69e956a8c
--- a/uifw/AvKon/src/aknutils.cpp	Fri Mar 12 15:43:43 2010 +0200
+++ b/uifw/AvKon/src/aknutils.cpp	Mon Mar 15 12:41:34 2010 +0200
@@ -119,7 +119,7 @@
 #include "AknAdaptiveSearch.h"
 #include <PtiEngine.h>
 
-#include <akntrace.h> 
+#include "akntrace.h"
 
 #ifdef RD_HINDI_PHONETIC_INPUT
 #include <ptiindicdefs.h>
@@ -134,6 +134,10 @@
 const TInt KFontHeightComparisonDivisor = 20;
 const TInt KInvalidIndex = -1;
 
+// Default for list separator line color's alpha value, used if not
+// found from skin.
+const TInt KDefaultSeparatorAlpha = 32;
+
 enum TAknLayoutEdwinPanic
     {
     EAknLayoutEdwinPanicNoEdwin,
@@ -3407,24 +3411,28 @@
     {
     TAknWindowComponentLayout line;
     TAknLayoutRect rect;
-    TRect screenRect(0, 0, AKN_LAYOUT_WINDOW_screen.iW, AKN_LAYOUT_WINDOW_screen.iH);
-    aRect.SetRect( 0, 0, 0, 0 );
+    rect.LayoutRect( TRect( 0, 0, 0, 0 ), AknLayoutScalable_Avkon::Screen() );
+    TRect screenRect( rect.Rect() );
     
     // No stacon pane active etc. cheking is done here before the switch-case so that we can 
     // have slightly better performance for some other lookups (e.g. screen).
     
-    switch (aParam)
+    switch ( aParam )
         {
         case EScreen:
+            {
             aRect = screenRect;
             return ETrue;
+            }
 
         case EApplicationWindow:
-            rect.LayoutRect(
-                screenRect,
-                AknLayoutScalable_Avkon::application_window( 0 ) );
-            aRect = rect.Rect();
+            {
+            // Application window is always the same as screen, so skip
+            // reading the application_window from layout data for
+            // performance improvement.
+            aRect = screenRect;
             return ETrue;
+            }
 
         case EStatusPane:
             {
@@ -3433,118 +3441,126 @@
             if ( statusPane )
                 {
                 TInt currentStatusPaneLayoutResId = statusPane->CurrentLayoutResId();
-                
-                if ( AknStatuspaneUtils::StaconPaneActive() )
+
+                TAknWindowComponentLayout parent;
+
+                switch ( currentStatusPaneLayoutResId )
                     {
-                    // flat status pane in landscape mode is the whole top pane area  
-                    if ( currentStatusPaneLayoutResId == R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT ||
-                         currentStatusPaneLayoutResId == R_AVKON_STATUS_PANE_LAYOUT_IDLE_FLAT )
+                    case R_AVKON_STATUS_PANE_LAYOUT_USUAL_WITH_BATTERY_PANE:
+                    case R_AVKON_STATUS_PANE_LAYOUT_USUAL:
+                    case R_AVKON_STATUS_PANE_LAYOUT_POWER_OFF_RECHARGE:
+                    case R_AVKON_STATUS_PANE_LAYOUT_USUAL_MIRRORED:
+                    case R_AVKON_STATUS_PANE_LAYOUT_POWER_OFF_RECHARGE_MIRRORED:
+                    case R_AVKON_STATUS_PANE_LAYOUT_VT:
+                    case R_AVKON_STATUS_PANE_LAYOUT_VT_MIRRORED:
+                    case R_AVKON_STATUS_PANE_LAYOUT_USUAL_EXT:
+                    default:
+                        {
+                        parent = AknLayoutScalable_Avkon::area_top_pane( 0 );
+                        line = AknLayoutScalable_Avkon::status_pane( 0 );
+                        break;
+                        }
+                    
+                    case R_AVKON_STATUS_PANE_LAYOUT_IDLE:
+                    case R_AVKON_STATUS_PANE_LAYOUT_IDLE_MIRRORED:
+                        {
+                        parent = AknLayoutScalable_Avkon::area_top_pane( 7 );
+                        line = AknLayoutScalable_Avkon::status_idle_pane(); // idle status pane
+                        break;
+                        }
+                        
+                    case R_AVKON_STATUS_PANE_LAYOUT_SMALL:
+                    case R_AVKON_STATUS_PANE_LAYOUT_SMALL_WITH_SIGNAL_PANE:
+                    case R_AVKON_STATUS_PANE_LAYOUT_SMALL_WITH_SIGNAL_PANE_MIRRORED:
+                        {
+                        // Small status pane is the whole top area.
+                        parent = AknLayoutScalable_Avkon::application_window( 0 );
+                        if ( Layout_Meta_Data::IsLandscapeOrientation() &&
+                             AknLayoutUtils::CbaLocation() == AknLayoutUtils::EAknCbaLocationBottom )
+                            {
+                            line = AknLayoutScalable_Avkon::area_top_pane( 2 );
+                            }
+                        else
+                            {
+                            line = AknLayoutScalable_Avkon::area_top_pane( 1 );
+                            }
+                            
+                        break;
+                        }
+                        
+                    case R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT:
+                    case R_AVKON_STATUS_PANE_LAYOUT_IDLE_FLAT: // fallthrough
                         {
-                        rect.LayoutRect( screenRect, AknLayoutScalable_Avkon::area_top_pane(8) ); // flat area_top_pane in lsc
+                        if ( Layout_Meta_Data::IsLandscapeOrientation() )
+                            {
+                            parent = AknLayoutScalable_Avkon::area_top_pane( 2 );
+                            }
+                        else
+                            {
+                            parent = AknLayoutScalable_Avkon::area_top_pane( 6 );
+                            }
+                        line   = AknLayoutScalable_Avkon::status_pane( 1 ); // flat status pane
+                        break;
+                        }
+
+                    case R_AVKON_WIDESCREEN_PANE_LAYOUT_USUAL:
+                    case R_AVKON_WIDESCREEN_PANE_LAYOUT_IDLE: // fallthrough
+                        {
+                        parent = AknLayoutScalable_Avkon::area_top_pane( 8 );
+                        line   = AknLayoutScalable_Avkon::status_pane( 1 );
+                        break;
+                        }
+
+                    case R_AVKON_WIDESCREEN_PANE_LAYOUT_USUAL_FLAT:
+                    case R_AVKON_WIDESCREEN_PANE_LAYOUT_IDLE_FLAT: // fallthrough
+                        {
+                        parent = AknLayoutScalable_Avkon::area_top_pane( 2 );
+                        line   = AknLayoutScalable_Avkon::status_pane( 1 );
+                        break;
+                        }
+                        
+                    case R_AVKON_WIDESCREEN_PANE_LAYOUT_USUAL_FLAT_NO_SOFTKEYS:
+                    case R_AVKON_WIDESCREEN_PANE_LAYOUT_IDLE_FLAT_NO_SOFTKEYS: // fallthrough
+                        {
+                        parent = AknLayoutScalable_Avkon::area_top_pane( 20 );
+                        line   = AknLayoutScalable_Avkon::status_pane( 5 );
+                        break;
+                        }
+                        
+                    case R_AVKON_STACON_PANE_LAYOUT_USUAL_SOFTKEYS_RIGHT:
+                    case R_AVKON_STACON_PANE_LAYOUT_USUAL_SOFTKEYS_LEFT:
+                    case R_AVKON_STACON_PANE_LAYOUT_EMPTY_SOFTKEYS_RIGHT:
+                    case R_AVKON_STACON_PANE_LAYOUT_EMPTY_SOFTKEYS_LEFT:        
+                    case R_AVKON_STACON_PANE_LAYOUT_IDLE_SOFTKEYS_RIGHT:
+                    case R_AVKON_STACON_PANE_LAYOUT_IDLE_SOFTKEYS_LEFT:
+                        {
+                        rect.LayoutRect(
+                            screenRect,
+                            TAknWindowComponentLayout::Compose(
+                                AknLayoutScalable_Avkon::area_top_pane( 2 ),
+                                AknLayoutScalable_Avkon::stacon_top_pane() ) );
                         aRect = rect.Rect();
+
+                        rect.LayoutRect(
+                            aRect,
+                            AknLayoutScalable_Avkon::control_top_pane_stacon( 0 ) );
+
+                        // Status pane top = stacon top - control pane top.
+                        aRect.iBr.iX = rect.Rect().iTl.iX;
                         return ETrue;
-                        }    
-                    else
-                        {
-                        rect.LayoutRect( screenRect, AknLayoutScalable_Avkon::area_top_pane(2) ); // classic area_top_pane in lsc
-                        aRect = rect.Rect();
-                        rect.LayoutRect( aRect, AknLayoutScalable_Avkon::stacon_top_pane() );
-                        aRect = rect.Rect();
-                        rect.LayoutRect( aRect, AknLayoutScalable_Avkon::control_top_pane_stacon(0) );
-                        aRect.iBr.iX = rect.Rect().iTl.iX;  // Status pane top = stacon top - control pane top.
-                        return ETrue;   
                         }
                     }
-                else
-                    {
-                    TAknWindowComponentLayout parent;
-                        
-                    switch ( currentStatusPaneLayoutResId )
-                        {
-                        case R_AVKON_STATUS_PANE_LAYOUT_USUAL_WITH_BATTERY_PANE:
-                        case R_AVKON_STATUS_PANE_LAYOUT_USUAL:
-                        case R_AVKON_STATUS_PANE_LAYOUT_POWER_OFF_RECHARGE:
-                        case R_AVKON_STATUS_PANE_LAYOUT_USUAL_MIRRORED:
-                        case R_AVKON_STATUS_PANE_LAYOUT_POWER_OFF_RECHARGE_MIRRORED:
-                        case R_AVKON_STATUS_PANE_LAYOUT_VT:
-                        case R_AVKON_STATUS_PANE_LAYOUT_VT_MIRRORED:
-                        case R_AVKON_STATUS_PANE_LAYOUT_USUAL_EXT:
-                        default:
-                            parent = AknLayoutScalable_Avkon::area_top_pane(0);
-                            line = AknLayoutScalable_Avkon::status_pane(0); // classic status pane
-                            break;
-                        
-                        case R_AVKON_STATUS_PANE_LAYOUT_IDLE:
-                        case R_AVKON_STATUS_PANE_LAYOUT_IDLE_MIRRORED:
-                            parent = AknLayoutScalable_Avkon::area_top_pane(7);
-                            line = AknLayoutScalable_Avkon::status_idle_pane(); // idle status pane
-                            break;
-                            
-                        case R_AVKON_STATUS_PANE_LAYOUT_SMALL:
-                        case R_AVKON_STATUS_PANE_LAYOUT_SMALL_WITH_SIGNAL_PANE:
-                        case R_AVKON_STATUS_PANE_LAYOUT_SMALL_WITH_SIGNAL_PANE_MIRRORED:
-                            // Small status pane is the whole top area.
-                            parent = AknLayoutScalable_Avkon::application_window(0);
-                            if ( Layout_Meta_Data::IsLandscapeOrientation() &&
-                                 AknLayoutUtils::CbaLocation() == AknLayoutUtils::EAknCbaLocationBottom )
-                                {
-                                line = AknLayoutScalable_Avkon::area_top_pane(2);
-                                }
-                            else
-                                {
-                                line = AknLayoutScalable_Avkon::area_top_pane(1);
-                                }
-                                
-                            break;
-                            
-                        case R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT:
-                        case R_AVKON_STATUS_PANE_LAYOUT_IDLE_FLAT: // fallthrough
-                            {
-                            if ( Layout_Meta_Data::IsLandscapeOrientation() &&
-                                 Layout_Meta_Data::IsPenEnabled() )
-                                {
-                                parent = AknLayoutScalable_Avkon::area_top_pane( 2 );
-                                }
-                            else
-                                {
-                                parent = AknLayoutScalable_Avkon::area_top_pane( 6 );
-                                }
-                            line   = AknLayoutScalable_Avkon::status_pane( 1 ); // flat status pane
-                            break;
-                            }
-
-                        case R_AVKON_WIDESCREEN_PANE_LAYOUT_USUAL:
-                        case R_AVKON_WIDESCREEN_PANE_LAYOUT_IDLE: // fallthrough
-                            {
-                            parent = AknLayoutScalable_Avkon::area_top_pane( 8 );
-                            line   = AknLayoutScalable_Avkon::status_pane( 1 );
-                            break;
-                            }
-
-                        case R_AVKON_WIDESCREEN_PANE_LAYOUT_USUAL_FLAT:
-                        case R_AVKON_WIDESCREEN_PANE_LAYOUT_IDLE_FLAT: // fallthrough
-                            {
-                            parent = AknLayoutScalable_Avkon::area_top_pane( 2 );
-                            line   = AknLayoutScalable_Avkon::status_pane( 1 );
-                            break;
-                            }
-                            
-                        case R_AVKON_WIDESCREEN_PANE_LAYOUT_USUAL_FLAT_NO_SOFTKEYS:
-                        case R_AVKON_WIDESCREEN_PANE_LAYOUT_IDLE_FLAT_NO_SOFTKEYS: // fallthrough
-                            {
-                            parent = AknLayoutScalable_Avkon::area_top_pane( 20 );
-                            line   = AknLayoutScalable_Avkon::status_pane( 5 );
-                            break;
-                            }
-                        }
-                        
-                    rect.LayoutRect( screenRect, TAknWindowComponentLayout::Compose( parent, line ) );
-                    aRect = rect.Rect();
-                    }
+                
+                rect.LayoutRect(
+                    screenRect,
+                    TAknWindowComponentLayout::Compose( parent, line ) );
+                aRect = rect.Rect();
                 return ETrue;
                 }
-            return EFalse;
+
+            return EFalse; // no status pane
             }
+
         case EPopupParent:
             {
             if ( screenRect.iBr.iX == 640 && screenRect.iBr.iY == 360 )
@@ -3578,6 +3594,7 @@
                 return LayoutMetricsRect( EMainPane, aRect );
                 }
             }
+
         case EMainPane:
             {
             TInt variety = 3; // classic main pane variety by default
@@ -3626,30 +3643,24 @@
                 case R_AVKON_STATUS_PANE_LAYOUT_VT_MIRRORED:
                 case R_AVKON_STATUS_PANE_LAYOUT_USUAL_EXT:
                     {
-                    // main pane variety for usual portrait main pane with
-                    // 'area_top_pane' and 'area_bottom_pane'
-#ifdef RD_SCALABLE_UI_V2
-                    variety = 3; 
-                    if ( iAvkonAppUi && iAvkonAppUi->TouchPane() && iAvkonAppUi->TouchPane()->IsVisible() )
+                    // Main pane variety for usual portrait main pane with
+                    // 'area_top_pane' and 'area_bottom_pane'.
+                    variety = 3;
+
+                    if ( iAvkonAppUi )
                         {
-                        variety = 15;
-                        }
-                    else if ( iAvkonAppUi && iAvkonAppUi->CurrentFixedToolbar() )
-                        {
-                        if ( AknLayoutUtils::PenEnabled() )
-                             {
-                             CAknToolbar* toolbar = iAvkonAppUi->CurrentFixedToolbar(); 
-                             TInt flags = toolbar->ToolbarFlags(); 
-                             if ( flags & KAknToolbarFixed && !( flags & KAknToolbarDefault )
-                                && toolbar->IsShown() ) 
+                        CAknToolbar* toolbar = iAvkonAppUi->CurrentFixedToolbar(); 
+                        if ( toolbar )
+                            {
+                            TInt flags = toolbar->ToolbarFlags(); 
+                            if ( flags & KAknToolbarFixed &&
+                                 !( flags & KAknToolbarDefault ) &&
+                                 toolbar->IsShown() ) 
                                  {
                                  variety = 18; 
                                  }
-                             }
+                            }
                         }
-#else
-                    variety = 3;
-#endif // RD_SCALABLE_UI_V2    
                     }
                     break;
 
@@ -3684,19 +3695,10 @@
                     {
                     if ( Layout_Meta_Data::IsLandscapeOrientation() )
                         {
-                        if ( PenEnabled() )
-                            {
-                            // main pane variety with small status pane in landscape
-                            // mode with 'area_top_pane', 'area_bottom_pane' and
-                            // touch pane
-                            variety = 4;
-                            }
-                        else
-                            {
-                            // main pane variety with 'area_top_pane' and
-                            // 'area_bottom_pane' in landscape (without touch pane)
-                            variety = 9;
-                            }
+                        // main pane variety with small status pane in landscape
+                        // mode with 'area_top_pane', 'area_bottom_pane' and
+                        // touch pane
+                        variety = 4;
                         }
                     else
                         {
@@ -3704,8 +3706,9 @@
                         // (with 'area_top_pane' and 'area_bottom_pane').
                         variety = 6;                    
                         }
+
+                    break;
                     }
-                    break;
 
                 case R_AVKON_STATUS_PANE_EMPTY:
                 case R_AVKON_STATUS_PANE_LAYOUT_EMPTY:
@@ -3781,9 +3784,11 @@
                     break;
                 }
 
-            rect.LayoutRect( screenRect, TAknWindowComponentLayout::Compose(
-                                     AknLayoutScalable_Avkon::application_window( 0 ),
-                                     AknLayoutScalable_Avkon::main_pane( variety ) ) );
+            // Application window is always the same as screen, so use screen
+            // as parent and skip reading the application_window from layout
+            // data for performance improvement.
+            rect.LayoutRect( screenRect,
+                             AknLayoutScalable_Avkon::main_pane( variety ) );
                 
             aRect = rect.Rect();
             return ETrue;
@@ -6548,13 +6553,19 @@
     else
         {
         // On portrait popup is located on top of the control pane if it doesn't
-        // have softkeys visible.
+        // have softkeys visible and there's enough room i.e. the popup still
+        // fits to the screen.
         if ( !aSoftkeysVisible )
             {
             TSize controlPane;
             AknLayoutUtils::LayoutMetricsSize( AknLayoutUtils::EControlPane,
                     controlPane );
             y -= controlPane.iHeight;
+            
+            if ( y < 0 )
+                {
+                y = 0;
+                }
             }
         }
 
@@ -6586,16 +6597,26 @@
 
 
 // -----------------------------------------------------------------------------
-// AknListUtils::DrawSeparator
+// Draws the separator line between list items.
 // -----------------------------------------------------------------------------
 //
 EXPORT_C void AknListUtils::DrawSeparator( CGraphicsContext& aGc, 
-        const TRect& aRect, const TRgb& aColor )
+                                           const TRect& aRect,
+                                           const TRgb& aColor,
+                                           MAknsSkinInstance* aSkin )
     {
     aGc.SetBrushStyle( CGraphicsContext::ENullBrush );
     aGc.SetPenStyle( CGraphicsContext::ESolidPen );
     TRgb color( aColor );
-    color.SetAlpha( 32 );
+    
+    // Get the alpha value from skin.
+    TRgb colorFromSkin;
+    TInt err = AknsUtils::GetCachedColor( aSkin ? aSkin : AknsUtils::SkinInstance(),
+                                          colorFromSkin,
+                                          KAknsIIDQsnLineColors,
+                                          EAknsCIQsnLineColorsCG15 );
+    
+    color.SetAlpha( !err ? colorFromSkin.Red() : KDefaultSeparatorAlpha );
     aGc.SetPenColor( color );
     TRect lineRect( aRect );
     
@@ -6603,7 +6624,7 @@
     lineRect.Shrink( gap, 0 );
     lineRect.Move( 0, -1 );
     aGc.DrawLine( TPoint( lineRect.iTl.iX, lineRect.iBr.iY ), 
-            TPoint( lineRect.iBr.iX, lineRect.iBr.iY ) );
+                  TPoint( lineRect.iBr.iX, lineRect.iBr.iY ) );
     }
 
 // End of file