imageeditor/ImageEditorUI/src/ColorSelectionPopup.cpp
changeset 1 edfc90759b9f
child 12 18b321db4884
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imageeditor/ImageEditorUI/src/ColorSelectionPopup.cpp	Fri Jan 29 13:53:17 2010 +0200
@@ -0,0 +1,966 @@
+/*
+* Copyright (c) 2010 Ixonos Plc.
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - Initial contribution
+*
+* Contributors:
+* Ixonos Plc
+*
+* Description: 
+* Color selection popup dialog that shows a color grid.
+*
+*/
+
+
+// INCLUDES
+#include <ImageEditorUI.rsg>
+#include <avkon.hrh>
+#include <AknLayoutScalable_Avkon.cdl.h>
+#include <AknLayoutScalable_Apps.cdl.h>
+#include <fbs.h>
+#include <AknIconUtils.h> 
+#include <AknUtils.h> 
+
+#include <AknBidiTextUtils.h>
+#include <BidiText.h> 
+
+#ifdef RD_TACTILE_FEEDBACK 
+#include <touchfeedback.h>
+#endif /* RD_TACTILE_FEEDBACK  */
+
+#include <ImageEditorUi.mbg>
+#include <ImageEditorUI.rsg>
+
+#include "ResolutionUtil.h"
+#include "ColorSelectionPopup.h"
+#include "ImageEditorUiDefs.h"
+
+// CONSTANTS
+const TInt KGridColumnCount = 7;
+const TInt KGridRowCount = 5;
+const TInt KInitialItemIndex = 0;
+
+//=============================================================================
+CColorSelectionPopup::CColorSelectionPopup()
+    {
+    
+    }
+
+//=============================================================================
+CColorSelectionPopup::~CColorSelectionPopup()
+    {
+    
+    delete iPopupCenter;
+    delete iPopupCenterMask;
+    delete iPopupCornerTL;
+    delete iPopupCornerTLMask;
+    delete iPopupCornerTR;
+    delete iPopupCornerTRMask;
+    delete iPopupCornerBL;
+    delete iPopupCornerBLMask;
+    delete iPopupCornerBR;
+    delete iPopupCornerBRMask;
+    delete iPopupSideL;
+    delete iPopupSideLMask;
+    delete iPopupSideR;
+    delete iPopupSideRMask;
+    delete iPopupSideT;
+    delete iPopupSideTMask;
+    delete iPopupSideB;
+    delete iPopupSideBMask;     
+           
+    iHighlightRectsArray.Close();
+    iGridRectsArray.Close();
+    iColorBitmapsArray.ResetAndDestroy();
+    iRGBArray.Close();
+    }
+
+//=============================================================================
+void CColorSelectionPopup::ConstructL (	CCoeControl* aParent )
+    {
+	// Set parent
+	SetContainerWindowL( *aParent );  
+    TFileName iconFile( KImageEditorUiMifFile );
+    
+    // Create trans popup window graphics
+    // Center
+    AknIconUtils::CreateIconL( iPopupCenter, iPopupCenterMask, iconFile, 
+            EMbmImageeditoruiQgn_graf_popup_trans_center, 
+			EMbmImageeditoruiQgn_graf_popup_trans_center_mask );
+	
+	// Top-left corner
+    AknIconUtils::CreateIconL( iPopupCornerTL, iPopupCornerTLMask, iconFile, 
+            EMbmImageeditoruiQgn_graf_popup_trans_corner_tl, 
+			EMbmImageeditoruiQgn_graf_popup_trans_corner_tl_mask );		
+    
+    // Top-right corner
+    AknIconUtils::CreateIconL( iPopupCornerTR, iPopupCornerTRMask, iconFile, 
+            EMbmImageeditoruiQgn_graf_popup_trans_corner_tr, 
+			EMbmImageeditoruiQgn_graf_popup_trans_corner_tr_mask );
+    
+    // Bottom-left corner
+    AknIconUtils::CreateIconL( iPopupCornerBL, iPopupCornerBLMask, iconFile, 
+            EMbmImageeditoruiQgn_graf_popup_trans_corner_bl, 
+			EMbmImageeditoruiQgn_graf_popup_trans_corner_bl_mask );
+			
+	// Bottom-right corner
+    AknIconUtils::CreateIconL( iPopupCornerBR, iPopupCornerBRMask, iconFile, 
+            EMbmImageeditoruiQgn_graf_popup_trans_corner_br, 
+			EMbmImageeditoruiQgn_graf_popup_trans_corner_br_mask );
+    
+    // left side
+    AknIconUtils::CreateIconL( iPopupSideL, iPopupSideLMask, iconFile, 
+            EMbmImageeditoruiQgn_graf_popup_trans_side_l, 
+			EMbmImageeditoruiQgn_graf_popup_trans_side_l_mask );
+			
+	// left side
+    AknIconUtils::CreateIconL( iPopupSideR, iPopupSideRMask, iconFile, 
+            EMbmImageeditoruiQgn_graf_popup_trans_side_r, 
+			EMbmImageeditoruiQgn_graf_popup_trans_side_r_mask );
+	
+	// top side
+    AknIconUtils::CreateIconL( iPopupSideT, iPopupSideTMask, iconFile, 
+            EMbmImageeditoruiQgn_graf_popup_trans_side_t, 
+			EMbmImageeditoruiQgn_graf_popup_trans_side_t_mask );
+	
+	// bottom side
+    AknIconUtils::CreateIconL( iPopupSideB, iPopupSideBMask, iconFile, 
+            EMbmImageeditoruiQgn_graf_popup_trans_side_b, 
+			EMbmImageeditoruiQgn_graf_popup_trans_side_b_mask );						                                   
+                
+    iCurrentItem = KInitialItemIndex;
+        					
+	//	Activate control
+    ActivateL();
+    
+    }
+
+//=============================================================================
+void CColorSelectionPopup::CreateColorBitmapsL( TSize aSize )
+    {
+    // Color constants shown on the grid
+    // R indicates the row index and C the column index
+    const TRgb KColor_R1C1 (0, 0, 0);
+    const TRgb KColor_R1C2 (65, 0, 175);
+    const TRgb KColor_R1C3 (0, 30, 128);
+    const TRgb KColor_R1C4 (0, 80, 100);
+    const TRgb KColor_R1C5 (0, 65, 0);
+    const TRgb KColor_R1C6 (85, 55, 0);
+    const TRgb KColor_R1C7 (120, 0, 0);
+    const TRgb KColor_R2C1 (75, 75, 75);
+    const TRgb KColor_R2C2 (128, 0, 255);
+    const TRgb KColor_R2C3 (0, 65, 175);
+    const TRgb KColor_R2C4 (0, 145, 165);
+    const TRgb KColor_R2C5 (0, 128, 0);
+    const TRgb KColor_R2C6 (128, 65, 0);
+    const TRgb KColor_R2C7 (128, 0, 65);
+    const TRgb KColor_R3C1 (150, 150, 150);
+    const TRgb KColor_R3C2 (255, 0, 128);
+    const TRgb KColor_R3C3 (0, 50, 255);
+    const TRgb KColor_R3C4 (0, 165, 255);
+    const TRgb KColor_R3C5 (0, 255, 0);
+    const TRgb KColor_R3C6 (255, 128, 0);
+    const TRgb KColor_R3C7 (255, 0, 0);
+    const TRgb KColor_R4C1 (225, 225, 225);
+    const TRgb KColor_R4C2 (255, 0, 255);
+    const TRgb KColor_R4C3 (50, 145, 255);
+    const TRgb KColor_R4C4 (0, 255, 255);
+    const TRgb KColor_R4C5 (128, 255, 0);
+    const TRgb KColor_R4C6 (255, 255, 0);
+    const TRgb KColor_R4C7 (255, 115, 115);
+    const TRgb KColor_R5C1 (255, 255, 255);
+    const TRgb KColor_R5C2 (255, 128, 255);
+    const TRgb KColor_R5C3 (180, 210, 255);
+    const TRgb KColor_R5C4 (128, 255, 255);
+    const TRgb KColor_R5C5 (180, 255, 180);
+    const TRgb KColor_R5C6 (255, 255, 128);
+    const TRgb KColor_R5C7 (255, 128, 180);
+
+    // Read rgb values into an array
+    iRGBArray.Reset();
+    iRGBArray.Append( KColor_R1C1 );
+    iRGBArray.Append( KColor_R1C2 );
+    iRGBArray.Append( KColor_R1C3 );
+    iRGBArray.Append( KColor_R1C4 );
+    iRGBArray.Append( KColor_R1C5 );
+    iRGBArray.Append( KColor_R1C6 );
+    iRGBArray.Append( KColor_R1C7 );
+    iRGBArray.Append( KColor_R2C1 );
+    iRGBArray.Append( KColor_R2C2 );
+    iRGBArray.Append( KColor_R2C3 );
+    iRGBArray.Append( KColor_R2C4 );
+    iRGBArray.Append( KColor_R2C5 );
+    iRGBArray.Append( KColor_R2C6 );
+    iRGBArray.Append( KColor_R2C7 );
+    iRGBArray.Append( KColor_R3C1 );
+    iRGBArray.Append( KColor_R3C2 );
+    iRGBArray.Append( KColor_R3C3 );
+    iRGBArray.Append( KColor_R3C4 );
+    iRGBArray.Append( KColor_R3C5 );
+    iRGBArray.Append( KColor_R3C6 );
+    iRGBArray.Append( KColor_R3C7 );
+    iRGBArray.Append( KColor_R4C1 );
+    iRGBArray.Append( KColor_R4C2 );
+    iRGBArray.Append( KColor_R4C3 );
+    iRGBArray.Append( KColor_R4C4 );
+    iRGBArray.Append( KColor_R4C5 );
+    iRGBArray.Append( KColor_R4C6 );
+    iRGBArray.Append( KColor_R4C7 );
+    iRGBArray.Append( KColor_R5C1 );
+    iRGBArray.Append( KColor_R5C2 );
+    iRGBArray.Append( KColor_R5C3 );
+    iRGBArray.Append( KColor_R5C4 );
+    iRGBArray.Append( KColor_R5C5 );
+    iRGBArray.Append( KColor_R5C6 );
+    iRGBArray.Append( KColor_R5C7 );    
+    
+    // Generate color bitmaps    
+    iColorBitmapsArray.ResetAndDestroy();    
+    for( TInt i = 0; i < iRGBArray.Count(); i++ )
+        {
+        CFbsBitmap* bitmap = new ( ELeave ) CFbsBitmap;
+        CleanupStack::PushL( bitmap );
+        User::LeaveIfError ( bitmap->Create ( aSize, EColor64K ) );
+
+        //  Compute color for bitmap
+        TRgb color( iRGBArray[i] );		
+         
+    	//	Fill the bitmap with the correct color
+    	TUint16 color_64k = ( TUint16 )
+    		(0 | 
+    		((( TUint8 )color.Red() >> 3) << 11) | 
+    		((( TUint8 )color.Green() >> 2) << 5) | 
+    		(( TUint8 )color.Blue() >> 3));
+
+        bitmap->LockHeapLC();
+    	TUint16 * pd = (TUint16 *)bitmap->DataAddress();
+    	TSize size = bitmap->SizeInPixels();
+    	TInt w = (bitmap->ScanLineLength(size.iWidth, EColor64K) >> 1) 
+    	                                                * size.iHeight;
+    	for( TInt k = w; k != 0; --k)
+    	    {
+    		*pd++ = color_64k;
+    	    }
+    	
+    	iColorBitmapsArray.Append( bitmap );
+    	
+        CleanupStack::PopAndDestroy(); // LockHeapLC()
+        CleanupStack::Pop(); // bitmap
+                
+        }    
+    
+    }
+    
+//=============================================================================
+void CColorSelectionPopup::Draw( const TRect& /*aRect*/ ) const
+    {
+    const TRgb KHighlightCenterColor (229, 229, 229);
+    
+    CWindowGc& gc = SystemGc();
+    
+    CPreviewControlBase::DrawPreviewImage (Rect());
+    
+    // Change brush to null to enable transparent drawing
+    gc.SetBrushStyle (CGraphicsContext::ENullBrush);
+                
+    // draw center of the borders
+    gc.BitBltMasked( iPopupCenterRect.iTl, iPopupCenter, 
+                     iPopupCenterRect.Size(), iPopupCenterMask, EFalse );    
+    // draw Top left corner
+	gc.BitBltMasked( iPopupCornerTLRect.iTl, iPopupCornerTL, 
+	                 iPopupCornerTLRect.Size(), iPopupCornerTLMask, EFalse );
+	// draw Top right corner		
+	gc.BitBltMasked( iPopupCornerTRRect.iTl, iPopupCornerTR, 
+	                 iPopupCornerTRRect.Size(), iPopupCornerTRMask, EFalse );			
+    // draw Bottom left corner
+	gc.BitBltMasked( iPopupCornerBLRect.iTl, iPopupCornerBL, 
+	                 iPopupCornerBLRect.Size(), iPopupCornerBLMask, EFalse );
+	// draw Bottom right corner		
+	gc.BitBltMasked( iPopupCornerBRRect.iTl, iPopupCornerBR, 
+	                 iPopupCornerBRRect.Size(), iPopupCornerBRMask, EFalse );
+    // draw Left side
+	gc.BitBltMasked( iPopupSideLRect.iTl, iPopupSideL, 
+	                 iPopupSideLRect.Size(), iPopupSideLMask, EFalse );
+	// draw Right side		
+    gc.BitBltMasked( iPopupSideRRect.iTl, iPopupSideR, 
+                     iPopupSideRRect.Size(), iPopupSideRMask, EFalse );			
+    // draw Top side
+    gc.BitBltMasked( iPopupSideTRect.iTl, iPopupSideT, 
+                     iPopupSideTRect.Size(), iPopupSideTMask, EFalse );			
+    // draw Bottom side
+    gc.BitBltMasked( iPopupSideBRect.iTl, iPopupSideB, 
+                     iPopupSideBRect.Size(), iPopupSideBMask, EFalse );			
+    
+    // Draw color items and selection indicator
+    for( TInt index = 0; index < iGridRectsArray.Count(); index++ )
+        {
+        // Draw selection indicator for current item
+        if( index == iCurrentItem )
+            {
+            gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+            gc.SetBrushColor( KHighlightCenterColor );
+            gc.SetPenColor( KRgbBlack );
+            
+            // a trick that sets the highligh more or less to correct position in 
+            // right-to-left languages. 
+            if ( !AknLayoutUtils::LayoutMirrored() )
+                {
+                gc.SetPenSize( TSize(2,2) );
+                }
+            else
+                {
+                gc.SetPenSize( TSize(1,1) );
+                }    
+                                 
+            gc.DrawRect( iHighlightRectsArray[ iCurrentItem ] );
+            
+            gc.SetBrushStyle (CGraphicsContext::ENullBrush);            
+            }
+            
+        // draw color bitmap    
+        TRect currentRect = iGridRectsArray[index];
+        gc.BitBlt(currentRect.iTl, iColorBitmapsArray[index]);
+        }
+                  
+     // Draw heading  
+     // Convert the plug-in name to visual representation
+     // (in case would be right-to-left)
+     const CFont* font = NULL;
+     font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimaryFont );
+     TBuf<256> visual;            
+     // Text to be converted
+     HBufC * heading = CEikonEnv::Static()->AllocReadResourceLC ( R_SELECT_COLOUR );
+     
+     AknBidiTextUtils::ConvertToVisualAndClip( 
+         heading->Des(), 
+         visual,
+         *font,
+         iHeadingRect.Width(),
+         iHeadingRect.Width()
+         );
+            
+     CleanupStack::PopAndDestroy( heading );
+        
+     gc.UseFont( font );
+     gc.SetBrushStyle ( CGraphicsContext::ENullBrush );
+
+     TInt baseline = iHeadingRect.Height() / 2 + font->AscentInPixels() / 2; 
+
+     // Check the directionality of the current language and set the alignment
+     // according the directionality
+     TBidiText::TDirectionality dir = TBidiText::ScriptDirectionality(User::Language());
+     CGraphicsContext::TTextAlign align = CGraphicsContext::ELeft;
+
+     if( dir == TBidiText::ERightToLeft )
+        {
+        align = CGraphicsContext::ERight;
+        }
+        gc.SetPenColor(KRgbWhite);
+        gc.DrawText(
+            visual,
+            iHeadingRect,
+            baseline,
+            align,
+            0);
+    }
+    
+//=============================================================================    
+void CColorSelectionPopup::SizeChanged()
+    {
+    
+    TAknLayoutRect layoutRect;
+    layoutRect.LayoutRect( Rect(), AknLayoutScalable_Apps::popup_imed_trans_window(0) );
+    TRect parentRect = layoutRect.Rect();
+    
+    TAknLayoutRect iconLayout;
+    if ( !AknLayoutUtils::LayoutMirrored() )
+        {        
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g1());
+    	iPopupCenterRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g2());
+    	iPopupCornerTLRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g3());
+    	iPopupCornerTRRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g4());
+    	iPopupCornerBLRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g5());
+    	iPopupCornerBRRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g6());
+    	iPopupSideLRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g7());
+    	iPopupSideRRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g8());
+    	iPopupSideTRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g9());
+    	iPopupSideBRect = iconLayout.Rect();    
+        }
+    else
+        {        
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g1());
+    	iPopupCenterRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g3());
+    	iPopupCornerTLRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g2());
+    	iPopupCornerTRRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g5());
+    	iPopupCornerBLRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g4());
+    	iPopupCornerBRRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g7());
+    	iPopupSideLRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g6());
+    	iPopupSideRRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g8());
+    	iPopupSideTRect = iconLayout.Rect();
+    	
+    	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g9());
+    	iPopupSideBRect = iconLayout.Rect();    
+        }	
+        		
+	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Apps::listscroll_imed_pane());
+	TRect listscrollPaneRect = iconLayout.Rect();
+	
+	iconLayout.LayoutRect( listscrollPaneRect, AknLayoutScalable_Apps::grid_imed_colour_35_pane( 1 ));
+	TRect gridPaneRect = iconLayout.Rect();
+	
+	// Calculate grid's cell rects
+	iHighlightRectsArray.Reset();
+	iGridRectsArray.Reset();
+	for( TInt row = 0; row < KGridRowCount; row++ )
+	    {
+	    for( TInt column = 0; column < KGridColumnCount; column++ )
+	        {
+	        iconLayout.LayoutRect( gridPaneRect, 
+	                               AknLayoutScalable_Apps::cell_imed_colour_pane(0 , column, row ));
+            TRect cellRect = iconLayout.Rect();
+            
+	        iconLayout.LayoutRect( cellRect, 
+	                               AknLayoutScalable_Apps::hgihlgiht_grid_pane_cp016(0));
+	                               
+	        TRect highlightRect = iconLayout.Rect();
+	        iHighlightRectsArray.Append( highlightRect );
+	        
+	        iconLayout.LayoutRect( cellRect, 
+	                               AknLayoutScalable_Apps::cell_imed_colour_pane_g1(0) );	       
+	        
+	        iGridRectsArray.Append( iconLayout.Rect() );
+	        
+	        }
+	    }	
+
+    CreateColorBitmapsL( iconLayout.Rect().Size() );
+    
+    //Heading rect
+	iconLayout.LayoutRect( parentRect, AknLayoutScalable_Apps::heading_imed_pane());
+	TRect heading = iconLayout.Rect();
+	
+    TAknLayoutText layoutText;
+    layoutText.LayoutText( heading, AknLayoutScalable_Apps::heading_imed_pane_t1() );
+    iHeadingRect = layoutText.TextRect();
+    iLayoutTextHeading = layoutText;            		
+    
+    // Resize graphics to correct size
+	AknIconUtils::SetSize( iPopupCenter, iPopupCenterRect.Size(), EAspectRatioNotPreserved);
+	AknIconUtils::SetSize( iPopupCornerTL, iPopupCornerTLRect.Size(), EAspectRatioNotPreserved);
+	AknIconUtils::SetSize( iPopupCornerTR, iPopupCornerTRRect.Size(), EAspectRatioNotPreserved);
+	AknIconUtils::SetSize( iPopupCornerBL, iPopupCornerBLRect.Size(), EAspectRatioNotPreserved);
+	AknIconUtils::SetSize( iPopupCornerBR, iPopupCornerBRRect.Size(), EAspectRatioNotPreserved);
+	AknIconUtils::SetSize( iPopupSideL, iPopupSideLRect.Size(), EAspectRatioNotPreserved);
+	AknIconUtils::SetSize( iPopupSideR, iPopupSideRRect.Size(), EAspectRatioNotPreserved);
+    AknIconUtils::SetSize( iPopupSideT, iPopupSideTRect.Size(), EAspectRatioNotPreserved);
+    AknIconUtils::SetSize( iPopupSideB, iPopupSideBRect.Size(), EAspectRatioNotPreserved);
+	
+    }
+
+//=============================================================================      
+TKeyResponse CColorSelectionPopup::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+                                                   TEventCode aType )
+    {
+    TKeyResponse res = EKeyWasNotConsumed;
+
+    if (aType == EEventKey) 
+        {
+        // If in landscape mode, do different mapping for the number keys.
+        TUint keyCode = aKeyEvent.iCode;
+        TBool landscape = CResolutionUtil::Self()->GetLandscape();
+        if (landscape)
+        	{
+            switch (keyCode)
+                {
+                case 49: // numeric keypad '1'
+                    keyCode = 55;
+                    break;
+                case 50: // numeric keypad '2'
+                    keyCode = 52;
+                    break;
+                case 51: // numeric keypad '3'
+                    keyCode = 49;
+                    break;
+                case 52: // numeric keypad '4'
+                    keyCode = 56;
+                    break;
+                case 54: // numeric keypad '6'
+                    keyCode = 50;
+                    break;
+                case 55: // numeric keypad '7'
+                    keyCode = 57;
+                    break;
+                case 56: // numeric keypad '8'
+                    keyCode = 54;
+                    break;
+                case 57: // numeric keypad '9'
+                    keyCode = 51;
+                    break;
+                default:
+                    break;
+                }
+        	}
+
+        switch (keyCode)
+            {
+            case EKeyLeftArrow:
+            case 52: // numeric keypad '4'
+                {
+                if ( !AknLayoutUtils::LayoutMirrored() )
+                    {
+                    if (iCurrentItem == 0)
+                        {
+                        iCurrentItem = iGridRectsArray.Count() - 1; 
+                        }
+                    else
+                        {
+                        iCurrentItem--;
+                        }
+                    }
+                else
+                    {
+                    iCurrentItem++;
+                    if (iCurrentItem >= iGridRectsArray.Count())
+                        {
+                        iCurrentItem = 0; 
+                        }
+                    }
+                                                            
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case EKeyRightArrow:
+            case 54: // numeric keypad '6'
+                {
+                if ( !AknLayoutUtils::LayoutMirrored() )
+                    {
+                    iCurrentItem++;
+                    if (iCurrentItem >= iGridRectsArray.Count())
+                        {
+                        iCurrentItem = 0; 
+                        }
+                    }
+                else
+                    {
+                    if (iCurrentItem == 0)
+                        {
+                        iCurrentItem = iGridRectsArray.Count() - 1; 
+                        }
+                    else
+                        {
+                        iCurrentItem--;
+                        }
+                    }
+                                    
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case EKeyDownArrow:
+            case 56: // numeric keypad '8'
+                {
+                iCurrentItem += KGridColumnCount;
+                if (iCurrentItem >= iGridRectsArray.Count())
+                    {
+                    iCurrentItem = iCurrentItem - iGridRectsArray.Count();
+                    }
+
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case EKeyUpArrow:
+            case 50: // numeric keypad '2'
+                {
+                iCurrentItem -= KGridColumnCount;
+                if (iCurrentItem < 0)
+                    {
+                    iCurrentItem = iGridRectsArray.Count() + iCurrentItem;
+                    }
+
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case 49: // numeric keypad '1'
+                {
+                // Move up and left
+                iCurrentItem -= KGridColumnCount;
+                iCurrentItem --;
+                if (iCurrentItem < 0)
+                    {
+                    iCurrentItem = iGridRectsArray.Count() + iCurrentItem;
+                    }
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case 51: // numeric keypad '3'
+                {
+                // Move up and right
+                iCurrentItem -= KGridColumnCount;
+                iCurrentItem ++;
+                if (iCurrentItem < 0)
+                    {
+                    iCurrentItem = iGridRectsArray.Count() + iCurrentItem;
+                    }
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case 55: // numeric keypad '7'
+                {
+                // Move down and left
+                iCurrentItem += KGridColumnCount;
+                iCurrentItem--;
+                if (iCurrentItem >= iGridRectsArray.Count())
+                    {
+                    iCurrentItem = iCurrentItem - iGridRectsArray.Count();
+                    }
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case 57: // numeric keypad '9'
+                {
+                // Move down and left
+                iCurrentItem += KGridColumnCount;
+                iCurrentItem++;
+                if (iCurrentItem >= iGridRectsArray.Count())
+                    {
+                    iCurrentItem = iCurrentItem - iGridRectsArray.Count();
+                    }
+                res = EKeyWasConsumed;
+                break;
+                }
+
+             default:
+                {
+                break;
+                }
+            }
+        }
+
+    return res;
+    
+    }
+
+//=============================================================================
+void CColorSelectionPopup::HandlePointerEventL( const TPointerEvent &aPointerEvent )
+    {
+    if( AknLayoutUtils::PenEnabled() )
+		{
+		switch( aPointerEvent.iType )
+			{
+			case TPointerEvent::EButton1Down:
+			case TPointerEvent::EDrag:
+				{	
+				// calculate which one of the grid items was pressed by
+				// by comparing item rects and pressed position						
+				for (TInt i = 0; i < iHighlightRectsArray.Count(); ++i)
+                    {
+                    TRect iconRect( iHighlightRectsArray[i] );
+                    
+                    if( iconRect.Contains( aPointerEvent.iPosition ) )
+                        {
+                        // set new highlighted item
+                        iCurrentItem = i;
+                        break;
+                        }                        
+                    }        
+				break;
+				}
+			case TPointerEvent::EButton1Up:
+				{
+				break;
+				}
+			default:
+				{
+				break;	
+				}	
+			}
+		}
+    }
+
+//=============================================================================    
+TRect CColorSelectionPopup::GridRect() const
+    {    
+    return iPopupCenterRect;
+    }
+
+//=============================================================================    
+TBool CColorSelectionPopup::HighlightedItemPressed( TPoint aPosition ) const
+    {	    
+	TRect iconRect = iHighlightRectsArray[ iCurrentItem ];		
+	                   
+    if (iconRect.Contains( aPosition ))  
+        {
+        return ETrue;
+        }
+    else 
+        {
+        return EFalse;
+        }       
+    }
+
+//=============================================================================    
+TRgb CColorSelectionPopup::GetSelectedColor() const
+    {
+    return iRGBArray[iCurrentItem];
+    }
+
+//=============================================================================    
+void CColorSelectionPopup::SetSelectedColor(TRgb aRgb)
+    {
+    for( TInt i = 0; i < iRGBArray.Count(); i++ )
+        {
+		if (iRGBArray[i] == aRgb)
+			{
+			iCurrentItem = i;
+			break;
+			}
+        }
+    }
+
+
+//=============================================================================
+// DIALOG
+//=============================================================================
+TInt CColorSelectionDialog::RunDlgLD( const CFbsBitmap* aBitmap, 
+                                      const TRect& aRect, 
+                                      TRgb& aRgb )
+    {
+    CColorSelectionDialog* dialog = 
+        new (ELeave) CColorSelectionDialog ( aRgb );
+    dialog->ConstructL( aBitmap, aRect);
+    return dialog->ExecuteLD( R_IMAGE_EDITOR_COLOR_DIALOG );
+    }
+
+//=============================================================================
+CColorSelectionDialog::CColorSelectionDialog( TRgb& aRgb )
+: iCurrentRgb( aRgb )
+    {
+    }
+    
+//=============================================================================
+CColorSelectionDialog::~CColorSelectionDialog()
+    {
+    delete iPopup;
+    }
+
+//=============================================================================
+
+void CColorSelectionDialog::ConstructL( const CFbsBitmap* aBitmap,
+                                        const TRect& aRect )
+    {    
+    iPopup = new ( ELeave ) CColorSelectionPopup();
+    iPopup->ConstructL( this );
+    
+    SetRect(aRect);   
+    
+    // Not drawn correctly if calling SetRect()
+    iPopup->SetSize(aRect.Size());
+    iPopup->SetPosition(TPoint(0,0));
+    iPopup->SetImageL( aBitmap );
+    iPopup->SetSelectedColor( iCurrentRgb );
+
+#ifdef RD_TACTILE_FEEDBACK 
+    iTouchFeedBack = MTouchFeedback::Instance();    
+#endif /* RD_TACTILE_FEEDBACK  */     
+    }
+
+//=============================================================================
+TBool CColorSelectionDialog::OkToExitL( TInt aButtonId )
+    {
+    if ( aButtonId == EAknSoftkeyOk || aButtonId == EAknSoftkeySelect)
+        {
+        iCurrentRgb = iPopup->GetSelectedColor();
+        return ETrue;
+        }
+    else
+        {
+        return EFalse;
+        }
+    }
+
+//=============================================================================    
+void CColorSelectionDialog::Draw(const TRect& /*aRect*/) const
+    {
+    }
+
+//=============================================================================    
+void CColorSelectionDialog::SizeChanged()
+    {  
+    iPopup->SetSize( Rect().Size() );
+    }
+
+//=============================================================================    
+void CColorSelectionDialog::PreLayoutDynInitL() 
+    { 
+    }
+
+
+//=============================================================================    
+TInt CColorSelectionDialog::CountComponentControls() const
+    {
+    return 1;
+    }
+
+//=============================================================================    
+CCoeControl* CColorSelectionDialog::ComponentControl(TInt /*aIndex*/) const
+    {
+    return iPopup;
+    }
+
+//=============================================================================    
+TKeyResponse CColorSelectionDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+    {
+    // Selection key or numeric keypad '5' close the dialog
+    TKeyResponse res = EKeyWasNotConsumed;
+    if (aType == EEventKey && 
+        (aKeyEvent.iCode == EKeyOK || aKeyEvent.iCode == 53 || aKeyEvent.iScanCode == EStdKeyEnter) )
+        {
+        TryExitL (EAknSoftkeyOk);
+        res = EKeyWasConsumed;
+        }
+    else if (aType == EEventKey && aKeyEvent.iCode == EKeyNo || aKeyEvent.iCode == EKeyEscape) // Do not exit if dialog active
+		{
+		TryExitL (EAknSoftkeyCancel);
+		res = EKeyWasNotConsumed;
+        }
+#ifdef FULLSCREEN_AVAILABLE        
+    else if (aType == EEventKey && aKeyEvent.iCode == 48 ) // 0             
+      {
+      // Switch normal screen / full screen
+      if (CResolutionUtil::Self()->GetFullScreen())
+          {
+          iEikonEnv->EikAppUi()->HandleCommandL(EImageEditorMenuCmdNormalScreen);
+	      SetRect(iEikonEnv->EikAppUi()->ClientRect());
+	      SizeChanged();
+	      DrawNow();
+          }
+      else
+	      {      
+	      iEikonEnv->EikAppUi()->HandleCommandL(EImageEditorMenuCmdFullScreen);			  
+	      SetExtentToWholeScreen();
+	      SizeChanged();
+	      DrawNow();
+	      }              
+      res = EKeyWasConsumed;              
+      }
+#endif // FULLSCREEN_AVAILABLE      						 
+    else 
+        {
+        res = iPopup->OfferKeyEventL(aKeyEvent, aType);
+        if (res == EKeyWasConsumed)
+            {
+            DrawDeferred();
+            }
+        }
+         
+    return res;
+    }
+
+//=============================================================================
+void CColorSelectionDialog::HandlePointerEventL( 
+                                           const TPointerEvent &aPointerEvent )
+    {    
+    if( AknLayoutUtils::PenEnabled() )
+	    {
+        TBool draw( EFalse );
+        switch( aPointerEvent.iType )
+			{
+			case TPointerEvent::EButton1Down:
+				{				
+			    // forward event only if grid area was pressed    
+			    if ( iPopup->GridRect().Contains( aPointerEvent.iPosition ) )
+			        {		
+#ifdef RD_TACTILE_FEEDBACK 
+					if ( iTouchFeedBack )
+	                	{
+			            iTouchFeedBack->InstantFeedback( ETouchFeedbackBasic );
+			            RDebug::Printf( "ImageEditor::CColorSelectionDialog: ETouchFeedback" );
+	                	}
+#endif /* RD_TACTILE_FEEDBACK  */			        	        
+			        iPopup->HandlePointerEventL( aPointerEvent );			        
+			        draw = ETrue;
+			        }    		        
+				break;
+				}
+			case TPointerEvent::EDrag:
+				{
+			    if ( iPopup->GridRect().Contains( aPointerEvent.iPosition ) )
+			        {
+#ifdef RD_TACTILE_FEEDBACK 
+					if ( iTouchFeedBack )
+	                	{
+			            iTouchFeedBack->InstantFeedback( ETouchFeedbackSensitive );
+			            RDebug::Printf( "ImageEditor::CColorSelectionDialog: ETouchFeedbackSensitive" );
+	                	}
+#endif /* RD_TACTILE_FEEDBACK  */
+			        iPopup->HandlePointerEventL( aPointerEvent );
+			        draw = ETrue;
+			        }
+				break;		
+				}
+			case TPointerEvent::EButton1Up:
+				{
+				// already highlighted item is pressed
+			    if ( iPopup->HighlightedItemPressed( aPointerEvent.iPosition ) )
+			        {
+			        TryExitL (EAknSoftkeyOk);
+			        }
+				break;
+				}
+			default:
+				{
+				break;	
+				}	
+			}
+			
+	    if ( draw )
+	        {
+		    DrawDeferred();    
+	        }	
+        }
+    }
+    
+// End of file 
+