imageeditor/ImageEditorUI/src/PluginGrid.cpp
changeset 1 edfc90759b9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imageeditor/ImageEditorUI/src/PluginGrid.cpp	Fri Jan 29 13:53:17 2010 +0200
@@ -0,0 +1,962 @@
+/*
+* 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:
+* Effect plugin selection dialog that shows icons of available
+* plugins in a grid.
+*
+*/
+
+
+// INCLUDES
+#include <fbs.h> 
+#include <avkon.hrh>
+#include <eikspane.h>
+#include <aknutils.h>
+#include <avkon.hrh>
+#include <AknBidiTextUtils.h>
+#include <BidiText.h> 
+#include <AknIconUtils.h>
+#include <AknInfoPopupNoteController.h>
+#include <AknLayoutScalable_Avkon.cdl.h>
+#include <AknLayoutScalable_Apps.cdl.h>
+#include <eiklabel.h>
+#include <ImageEditorUi.mbg>
+#include <layoutmetadata.cdl.h>
+
+#ifdef RD_TACTILE_FEEDBACK 
+#include <touchfeedback.h>
+#endif /* RD_TACTILE_FEEDBACK  */
+
+#include "PluginGrid.h"
+#include "PluginInfo.h"
+#include "ResolutionUtil.h"
+#include <ImageEditorUI.rsg>
+#include "ImageEditorUI.hrh"
+#include "ImageEditorUIDefs.h" 
+#include "DrawUtils.h"
+
+// CONSTANTS
+const TInt KDefaultCurrentItem = 7;
+const TInt KPortraitNumberOfRows = 5;
+const TInt KPortraitNumberOfColumns = 3;
+const TInt KLandscapeNumberOfRows = 3;
+const TInt KLandscapeNumberOfColumns = 5;
+const TInt KBorderPartsNum = 9;
+const TInt KTooltipDelayBeforeShow = 200;
+
+//=============================================================================
+CPluginGrid::CPluginGrid (CFbsBitmap** aBitmap, 
+                          const RPluginArray* aItems)
+: iBitmap( aBitmap ), 
+  iPluginItems( aItems ), 
+  iCurrentItem( KDefaultCurrentItem ),
+  iNumberOfRows( KPortraitNumberOfRows ),
+  iNumberOfColumns( KPortraitNumberOfColumns ),
+  iCellSize(0,0),
+  iTouchGridRect(0,0,0,0),
+  iHighlightPos(0,0),
+  iParentRect(0,0,0,0)
+    {
+    }
+
+//=============================================================================
+CPluginGrid::~CPluginGrid ()
+    {
+    iBorders.ResetAndDestroy();
+    iHighlight.ResetAndDestroy();
+    iIcons.ResetAndDestroy();
+    delete iText;
+
+    iBitmap = NULL;
+    iPluginItems = NULL;
+    }
+
+//=============================================================================
+void CPluginGrid::ConstructL ()
+    {
+    TFileName iconFile (KImageEditorUiMifFile);
+
+	// create popup graphics
+    for ( TInt i = 0; i < KBorderPartsNum; ++i )
+        {
+        CEikImage* image = new (ELeave) CEikImage;
+
+		image->CreatePictureFromFileL(iconFile,
+										EMbmImageeditoruiQgn_graf_popup_trans_center + 2*i,
+										EMbmImageeditoruiQgn_graf_popup_trans_center_mask + 2*i);
+
+        CleanupStack::PushL( image );
+        image->SetContainerWindowL( *this );
+        iBorders.AppendL( image );
+        CleanupStack::Pop( image );
+        }
+
+	// create highlight graphics
+    for ( TInt i = 0; i < KBorderPartsNum; ++i )
+        {
+        CEikImage* image = new (ELeave) CEikImage;
+
+		image->CreatePictureFromFileL(iconFile,
+										EMbmImageeditoruiQgn_graf_popup_trans_center + 2*i,
+										EMbmImageeditoruiQgn_graf_popup_trans_center_mask + 2*i);
+//										EMbmImageeditoruiQsn_fr_imed_grid_center + 2*i,
+//										EMbmImageeditoruiQsn_fr_imed_grid_center_mask + 2*i);
+
+        CleanupStack::PushL( image );
+        image->SetContainerWindowL( *this );
+        iHighlight.AppendL( image );
+        CleanupStack::Pop( image );
+        }
+
+	// title text
+	iText = new (ELeave) CEikLabel;
+	iText->SetContainerWindowL( *this );
+    HBufC* heading = CEikonEnv::Static()->AllocReadResourceLC( R_HEADING_APPLY_EFFECT );
+	iText->SetTextL( heading->Des() );
+	CleanupStack::PopAndDestroy( heading );
+
+	// plugin graphics
+    for (TInt i = 0; i < iPluginItems->Count(); ++i)
+        {
+        CPluginInfo * pgn_info = (*iPluginItems)[i];
+
+        CEikImage* image = new (ELeave) CEikImage;
+
+		image->SetPicture(pgn_info->Icon(), pgn_info->Mask());
+		image->SetPictureOwnedExternally(ETrue);
+
+        CleanupStack::PushL( image );
+        image->SetContainerWindowL( *this );
+        iIcons.AppendL( image );
+        CleanupStack::Pop( image );
+        }
+
+    ActivateL();
+    }
+
+//=============================================================================
+TInt CPluginGrid::GetSelectedItemIndex() const
+    {
+    return iCurrentItem;
+    }
+
+
+//=============================================================================
+void CPluginGrid::SizeChanged()
+    {
+    
+    TBool variant = Layout_Meta_Data::IsLandscapeOrientation();    
+    if( variant )
+        {
+        iNumberOfRows = KLandscapeNumberOfRows;
+        iNumberOfColumns =  KLandscapeNumberOfColumns;
+        }
+    else
+        {
+        iNumberOfRows = KPortraitNumberOfRows; 
+        iNumberOfColumns = KPortraitNumberOfColumns;
+        }  
+        
+    TAknLayoutRect layoutRect;
+    
+    if(variant) 
+        {
+        layoutRect.LayoutRect( Rect(), AknLayoutScalable_Apps::popup_imed_trans_window(4) );        
+        }
+    else
+        {
+        layoutRect.LayoutRect( Rect(), AknLayoutScalable_Apps::bg_tb_trans_pane_cp02(1) );
+        }        
+    iParentRect = layoutRect.Rect();
+
+	// determine grid cell size
+    layoutRect.LayoutRect( iParentRect, AknLayoutScalable_Apps::cell_imed_effect_pane(1,1,variant) );
+	iCellSize = layoutRect.Rect().Size();
+
+	TInt delta = 0;
+
+	// determine caption layout
+    layoutRect.LayoutRect( iParentRect, AknLayoutScalable_Apps::heading_imed_pane(variant) );
+    TAknLayoutText layoutText;
+    layoutText.LayoutText( layoutRect.Rect(), AknLayoutScalable_Apps::heading_imed_pane_t1(variant) );
+    TRgb color = layoutText.Color();
+	iText->SetFont(layoutText.Font());
+	iText->OverrideColorL( EColorLabelText, color );
+	iText->SetExtent(layoutText.TextRect().iTl, layoutText.TextRect().Size());
+	if(AknLayoutUtils::LayoutMirrored())
+		{
+		iText->SetAlignment( EHRightVCenter );    
+		}
+	else
+		{
+		iText->SetAlignment( EHLeftVCenter );
+		}
+
+	// determine popup border layouts
+    if( !AknLayoutUtils::LayoutMirrored() )
+        {                  
+        AknLayoutUtils::LayoutControl( iBorders[1], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g2().LayoutLine() );
+        AknLayoutUtils::LayoutControl( iBorders[2], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g3().LayoutLine() );
+        AknLayoutUtils::LayoutControl( iBorders[3], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g4().LayoutLine() );
+        AknLayoutUtils::LayoutControl( iBorders[4], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g5().LayoutLine() );
+        AknLayoutUtils::LayoutControl( iBorders[5], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g6().LayoutLine() );
+        AknLayoutUtils::LayoutControl( iBorders[6], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g7().LayoutLine() );
+        }
+    else
+        {
+        AknLayoutUtils::LayoutControl( iBorders[1], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g3().LayoutLine() );
+        AknLayoutUtils::LayoutControl( iBorders[2], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g2().LayoutLine() );
+        AknLayoutUtils::LayoutControl( iBorders[3], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g5().LayoutLine() );
+        AknLayoutUtils::LayoutControl( iBorders[4], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g4().LayoutLine() );
+        AknLayoutUtils::LayoutControl( iBorders[5], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g7().LayoutLine() );
+        AknLayoutUtils::LayoutControl( iBorders[6], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g6().LayoutLine() );
+        }
+    AknLayoutUtils::LayoutControl( iBorders[0], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g1().LayoutLine() );
+    AknLayoutUtils::LayoutControl( iBorders[7], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g8().LayoutLine() );
+    AknLayoutUtils::LayoutControl( iBorders[8], iParentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g9().LayoutLine() );
+    // Images need to be resized separately, because the standard LayoutImage
+    // tries to preserve the aspect ratio and we don't want that.
+    //
+    for ( TInt i = 0; i < iBorders.Count(); ++i )
+        {
+        AknIconUtils::SetSize(
+            const_cast<CFbsBitmap*>( iBorders[i]->Bitmap() ),
+            iBorders[i]->Size(), EAspectRatioNotPreserved );
+        }
+
+	// plugin graphics sizes
+    layoutRect.LayoutRect( iParentRect, AknLayoutScalable_Apps::cell_imed_effect_pane_g1(variant) );
+    TRect iconRect = layoutRect.Rect();
+    TSize iconSize = iconRect.Size();
+    for (TInt i = 0; i < iPluginItems->Count(); ++i)
+        {
+        CPluginInfo * pgn_info = (*iPluginItems)[i];
+
+        // Set size for scalable icons - MUST BE CALLED BEFORE ICON IS USABLE
+        if (pgn_info->Icon())
+            {
+            AknIconUtils::SetSize(pgn_info->Icon(), iconSize);
+            }
+        if (pgn_info->Mask())
+            {
+            AknIconUtils::SetSize(pgn_info->Mask(), iconSize);
+            }
+        }
+
+	// touch area
+    layoutRect.LayoutRect( iParentRect, AknLayoutScalable_Apps::listscroll_imed_pane (variant) );
+	iTouchGridRect = layoutRect.Rect();
+	delta = layoutRect.Rect().Width();
+    layoutRect.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Apps::cell_imed_effect_pane(0,0,variant) );            
+	iTouchGridRect.SetWidth(layoutRect.Rect().Width() * iNumberOfColumns);
+	iTouchGridRect.SetHeight(layoutRect.Rect().Height() * iNumberOfRows);
+	delta = (delta - iTouchGridRect.Width()) / 2;
+    if( AknLayoutUtils::LayoutMirrored() )
+        {                  
+		delta = -delta;
+        }
+	iTouchGridRect.iTl.iX += delta;
+
+	// plugin graphics positions
+    layoutRect.LayoutRect( iParentRect, AknLayoutScalable_Apps::listscroll_imed_pane (variant) );
+    TAknLayoutRect iconLayoutRect;
+                  
+    for ( TInt i = 0; i <iNumberOfRows; ++i )
+        {
+	    for ( TInt j = 0; j <iNumberOfColumns; ++j )
+	        {
+		    iconLayoutRect.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Apps::cell_imed_effect_pane(j, i,variant) );
+		    iconLayoutRect.LayoutRect( iconLayoutRect.Rect(), AknLayoutScalable_Apps::cell_imed_effect_pane_g1(variant) );
+			TPoint iconPos = iconLayoutRect.Rect().iTl;
+			iconPos.iX += delta;
+
+			iIcons[j + iNumberOfColumns * i]->SetSize(iconSize);
+			iIcons[j + iNumberOfColumns * i]->SetPosition(iconPos);
+	        }
+        }
+
+	// determine highlight layouts
+    layoutRect.LayoutRect( iParentRect, AknLayoutScalable_Apps::listscroll_imed_pane (variant) );
+    layoutRect.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Apps::cell_imed_effect_pane(0,0,variant) );
+	iHighlightPos = layoutRect.Rect().iTl;
+    layoutRect.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Apps::grid_highlight_pane_cp017(variant) );
+	TRect highlightRect = layoutRect.Rect();
+	highlightRect.iTl.iX += delta;
+	highlightRect.iBr.iX += delta;
+    if( !AknLayoutUtils::LayoutMirrored() )
+        {                  
+	    AknLayoutUtils::LayoutControl( iHighlight[1], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g2().LayoutLine() );
+	    AknLayoutUtils::LayoutControl( iHighlight[2], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g3().LayoutLine() );
+	    AknLayoutUtils::LayoutControl( iHighlight[3], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g4().LayoutLine() );
+	    AknLayoutUtils::LayoutControl( iHighlight[4], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g5().LayoutLine() );
+	    AknLayoutUtils::LayoutControl( iHighlight[5], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g6().LayoutLine() );
+	    AknLayoutUtils::LayoutControl( iHighlight[6], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g7().LayoutLine() );
+        }
+    else
+        {
+	    AknLayoutUtils::LayoutControl( iHighlight[1], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g3().LayoutLine() );
+	    AknLayoutUtils::LayoutControl( iHighlight[2], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g2().LayoutLine() );
+	    AknLayoutUtils::LayoutControl( iHighlight[3], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g5().LayoutLine() );
+	    AknLayoutUtils::LayoutControl( iHighlight[4], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g4().LayoutLine() );
+	    AknLayoutUtils::LayoutControl( iHighlight[5], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g7().LayoutLine() );
+	    AknLayoutUtils::LayoutControl( iHighlight[6], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g6().LayoutLine() );
+        }
+    AknLayoutUtils::LayoutControl( iHighlight[0], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g1().LayoutLine() );
+    AknLayoutUtils::LayoutControl( iHighlight[7], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g8().LayoutLine() );
+    AknLayoutUtils::LayoutControl( iHighlight[8], highlightRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g9().LayoutLine() );
+    // Images need to be resized separately, because the standard LayoutImage
+    // tries to preserve the aspect ratio and we don't want that.
+    //
+    for ( TInt i = 0; i < iHighlight.Count(); ++i )
+        {
+        AknIconUtils::SetSize(
+            const_cast<CFbsBitmap*>( iHighlight[i]->Bitmap() ),
+            iHighlight[i]->Size(), EAspectRatioNotPreserved );
+        }
+
+	iHighlightPos = highlightRect.iTl - iHighlightPos;
+    }
+
+//=============================================================================    
+void CPluginGrid::Draw(const TRect& /*aRect*/) const
+    {
+    //  Get graphics context
+    CWindowGc & gc = SystemGc();
+
+	//	Draw preview image if found
+	if ( (*iBitmap)->Handle() )
+	    {
+		gc.BitBlt (Rect().iTl, *iBitmap);
+        }
+    
+    TBool variant = Layout_Meta_Data::IsLandscapeOrientation();  
+    TAknLayoutRect layoutRect;
+    for ( TInt i = 0; i < iNumberOfRows; ++i )
+        {
+	    for ( TInt j = 0; j < iNumberOfColumns; ++j )
+	        {
+	        if(j + iNumberOfColumns * i == iCurrentItem)
+	        	{
+			    layoutRect.LayoutRect( iParentRect, AknLayoutScalable_Apps::listscroll_imed_pane (variant) );
+			    layoutRect.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Apps::cell_imed_effect_pane(j, i,variant) );
+				TPoint deltaPos = iHighlight[1]->Position() - (layoutRect.Rect().iTl + iHighlightPos);
+
+			    for ( TInt ii = 0; ii < iHighlight.Count(); ++ii )
+					{
+			            iHighlight[ii]->SetPosition(iHighlight[ii]->Position() - deltaPos);
+			        }
+	        	}
+	        }
+        }
+    }
+
+//=============================================================================    
+TKeyResponse CPluginGrid::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() )
+			        {                  
+	                iCurrentItem++;
+	                if (iCurrentItem >= iPluginItems->Count())
+	                    {
+	                    iCurrentItem = 0; 
+	                    }
+			        }
+				else
+			        {                  
+	                if (iCurrentItem == 0)
+	                    {
+	                    iCurrentItem = iPluginItems->Count() - 1; 
+	                    }
+	                else
+	                    {
+	                    iCurrentItem--;
+	                    }
+			        }
+
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case EKeyRightArrow:
+            case 54: // numeric keypad '6'
+                {
+			    if( AknLayoutUtils::LayoutMirrored() )
+			        {                  
+	                if (iCurrentItem == 0)
+	                    {
+	                    iCurrentItem = iPluginItems->Count() - 1; 
+	                    }
+	                else
+	                    {
+	                    iCurrentItem--;
+	                    }
+			        }
+				else
+			        {                  
+	                iCurrentItem++;
+	                if (iCurrentItem >= iPluginItems->Count())
+	                    {
+	                    iCurrentItem = 0; 
+	                    }
+			        }
+
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case EKeyDownArrow:
+            case 56: // numeric keypad '8'
+                {
+                iCurrentItem += iNumberOfColumns;
+                if (iCurrentItem >= iPluginItems->Count())
+                    {
+                    iCurrentItem = iCurrentItem - iPluginItems->Count();
+                    }
+
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case EKeyUpArrow:
+            case 50: // numeric keypad '2'
+                {
+                iCurrentItem -= iNumberOfColumns;
+                if (iCurrentItem < 0)
+                    {
+                    iCurrentItem = iPluginItems->Count() + iCurrentItem;
+                    }
+
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case 49: // numeric keypad '1'
+                {
+                // Move up and left
+                iCurrentItem -= iNumberOfColumns;
+			    if( AknLayoutUtils::LayoutMirrored() )
+			    if( AknLayoutUtils::LayoutMirrored() )
+			        {                  
+	                iCurrentItem ++;
+			        }
+				else
+			        {                  
+	                iCurrentItem --;
+			        }
+                if (iCurrentItem < 0)
+                    {
+                    iCurrentItem = iPluginItems->Count() + iCurrentItem;
+                    }
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case 51: // numeric keypad '3'
+                {
+                // Move up and right
+                iCurrentItem -= iNumberOfColumns;
+			    if( AknLayoutUtils::LayoutMirrored() )
+			        {                  
+	                iCurrentItem --;
+			        }
+				else
+			        {                  
+	                iCurrentItem ++;
+			        }
+                if (iCurrentItem < 0)
+                    {
+                    iCurrentItem = iPluginItems->Count() + iCurrentItem;
+                    }
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case 55: // numeric keypad '7'
+                {
+                // Move down and left
+                iCurrentItem += iNumberOfColumns;
+			    if( AknLayoutUtils::LayoutMirrored() )
+			        {                  
+	                iCurrentItem++;
+			        }
+				else
+			        {                  
+	                iCurrentItem--;
+			        }
+                if (iCurrentItem >= iPluginItems->Count())
+                    {
+                    iCurrentItem = iCurrentItem - iPluginItems->Count();
+                    }
+                res = EKeyWasConsumed;
+                break;
+                }
+
+            case 57: // numeric keypad '9'
+                {
+                // Move down and left
+                iCurrentItem += iNumberOfColumns;
+			    if( AknLayoutUtils::LayoutMirrored() )
+			        {                  
+	                iCurrentItem--;
+			        }
+				else
+			        {                  
+	                iCurrentItem++;
+			        }
+                if (iCurrentItem >= iPluginItems->Count())
+                    {
+                    iCurrentItem = iCurrentItem - iPluginItems->Count();
+                    }
+                res = EKeyWasConsumed;
+                break;
+                }
+
+             default:
+                {
+                break;
+                }
+
+            }
+
+        }
+
+    return res;
+    }
+    
+//=============================================================================
+void CPluginGrid::HandlePointerEventL( const TPointerEvent &aPointerEvent )
+    {	
+    if( AknLayoutUtils::PenEnabled() )
+		{
+		switch( aPointerEvent.iType )
+			{
+			case TPointerEvent::EButton1Down:
+			case TPointerEvent::EDrag:
+				{
+				TBool variant = Layout_Meta_Data::IsLandscapeOrientation(); 	
+			    TAknLayoutRect layoutRect;
+			    for ( TInt i = 0; i < iNumberOfRows; ++i )
+			        {
+				    for ( TInt j = 0; j < iNumberOfColumns; ++j )
+				        {
+					    layoutRect.LayoutRect( iParentRect, AknLayoutScalable_Apps::listscroll_imed_pane (variant) );
+					    layoutRect.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Apps::cell_imed_effect_pane(j, i, variant) );
+
+						if( layoutRect.Rect().Contains( aPointerEvent.iPosition ) )
+							{
+							// set new highlighted item
+							iCurrentItem = j + iNumberOfColumns * i;
+							return;
+							}
+				        }
+			        }
+
+				break;
+				}
+			case TPointerEvent::EButton1Up:
+				{
+				break;
+				}
+			default:
+				{
+				break;	
+				}	
+			}
+		}
+    }
+
+//=============================================================================    
+TRect CPluginGrid::GridRect() const
+    {
+    TRect boundingRect( iTouchGridRect );
+//    boundingRect.BoundingRect( iTitleboxBorderRect );
+    return boundingRect;
+    }
+
+//=============================================================================    
+TBool CPluginGrid::HighlightedItemPressed( TPoint aPosition ) const
+    {	
+    TAknLayoutRect layoutRect;
+    TBool variant = Layout_Meta_Data::IsLandscapeOrientation(); 
+    for ( TInt i = 0; i < iNumberOfRows; ++i )
+        {
+	    for ( TInt j = 0; j < iNumberOfColumns; ++j )
+	        {
+	        if(j + iNumberOfColumns * i == iCurrentItem)
+	        	{
+			    layoutRect.LayoutRect( iParentRect, AknLayoutScalable_Apps::listscroll_imed_pane (variant) );
+			    layoutRect.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Apps::cell_imed_effect_pane(j, i, variant) );
+	        	}
+	        }
+        }
+                    
+    if (layoutRect.Rect().Contains( aPosition ))  
+        {
+        return ETrue;
+        }
+    else 
+        {
+        return EFalse;
+        }       
+    }
+
+//=============================================================================
+void CPluginGrid::ShowTooltip ( CAknInfoPopupNoteController* aPopupController,
+                                CCoeControl* aCallingControl )
+    {
+    TAknLayoutRect layoutRect;
+    TBool variant = Layout_Meta_Data::IsLandscapeOrientation();
+    
+    TBool layoutFound = EFalse; 
+    for ( TInt i = 0; i < iNumberOfRows; ++i )
+        {
+	    for ( TInt j = 0; j < iNumberOfColumns; ++j )
+	        {
+	        if(j + iNumberOfColumns * i == iCurrentItem)
+	        	{
+			    layoutRect.LayoutRect( iParentRect, AknLayoutScalable_Apps::listscroll_imed_pane (variant) );
+			    layoutRect.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Apps::cell_imed_effect_pane(j, i, variant) );
+			    layoutFound = ETrue;
+	        	}
+	        }
+        }
+    
+    if( layoutFound )    
+        {
+        CPluginInfo * pgn_info = ( *iPluginItems )[ iCurrentItem ];
+    
+        // change default time to shorter one
+        aPopupController->SetTimeDelayBeforeShow( KTooltipDelayBeforeShow );
+            
+        SDrawUtils::ShowToolTip( aPopupController,
+                                 aCallingControl,
+                                 layoutRect.Rect(),
+                                 pgn_info->PluginName()->Des() );    
+        }
+    
+    }
+
+//=============================================================================    
+TInt CPluginGrid::CountComponentControls() const
+    {
+    TInt count = iBorders.Count();
+    count += iHighlight.Count();
+    count += iIcons.Count();
+	count++;
+
+    return count;
+    }
+
+//=============================================================================    
+CCoeControl* CPluginGrid::ComponentControl(TInt aIndex) const
+    {
+    if ( aIndex < iBorders.Count() )
+        {
+        return iBorders[aIndex];
+        }
+    if ( aIndex < iBorders.Count() + iHighlight.Count())
+        {
+        return iHighlight[aIndex - iBorders.Count()];
+        }
+    if ( aIndex < iBorders.Count() + iHighlight.Count() + iIcons.Count())
+        {
+        return iIcons[aIndex - iBorders.Count() - iHighlight.Count()];
+        }
+
+    return iText;
+    }
+
+//=============================================================================
+TInt CPluginSelectionDialog::RunDlgLD(CFbsBitmap** aBitmap, 
+                                       TInt& aSelectedItem, 
+                                       const RPluginArray* aItems,
+                                       const TRect& aRect)
+    {
+    CPluginSelectionDialog* dialog = 
+        new (ELeave) CPluginSelectionDialog (aBitmap, aSelectedItem, aItems);
+    dialog->ConstructL(aRect);
+    return dialog->ExecuteLD(R_IMAGE_EDITOR_PLUGIN_DIALOG);
+    }
+
+//=============================================================================
+CPluginSelectionDialog::CPluginSelectionDialog(CFbsBitmap** aBitmap, 
+                                               TInt& aSelectedItem, 
+                                               const RPluginArray* aItems)
+ : iBitmap(aBitmap), iItems(aItems), iSelectedItem(aSelectedItem)
+    {
+
+    }
+//=============================================================================
+CPluginSelectionDialog::~CPluginSelectionDialog()
+    {
+    delete iGrid;
+    iBitmap = NULL;
+    iItems = NULL;
+    delete iPopupController;
+    iPopupController = NULL;
+    }
+
+//=============================================================================
+
+void CPluginSelectionDialog::ConstructL(const TRect& aRect)
+    {
+    SetRect(aRect);
+
+    iGrid = new (ELeave) CPluginGrid(iBitmap, iItems);
+    iGrid->ConstructL();
+
+    iGrid->SetSize(aRect.Size());
+    iGrid->SetPosition(TPoint(0,0));
+
+    iPopupController = CAknInfoPopupNoteController::NewL(); 
+    
+#ifdef RD_TACTILE_FEEDBACK 
+    iTouchFeedBack = MTouchFeedback::Instance();
+#endif /* RD_TACTILE_FEEDBACK  */
+    
+    }
+
+//=============================================================================
+TBool CPluginSelectionDialog::OkToExitL( TInt aButtonId )
+    {
+    if ( aButtonId == EAknSoftkeyOk || aButtonId == EAknSoftkeySelect)
+        {
+        if (iGrid)
+            {
+            iSelectedItem = iGrid->GetSelectedItemIndex();
+            }
+        return ETrue;
+        }
+    else
+        {
+        iSelectedItem = KErrCancel;
+        return EFalse;
+        }
+    }
+
+//=============================================================================    
+void CPluginSelectionDialog::Draw(const TRect& /*aRect*/) const
+    {
+    }
+
+//=============================================================================    
+void CPluginSelectionDialog::SizeChanged()
+    {
+    if (iGrid)
+	    {
+	    iGrid->SetRect( Rect() );
+	    iGrid->SizeChanged();
+	    
+		if ( iPopupController )
+		    {
+		    // Shows the first tooltip when effect grid is entered
+		    iGrid->ShowTooltip( iPopupController, this );
+		    }		
+	    }  
+    }
+
+//=============================================================================    
+TInt CPluginSelectionDialog::CountComponentControls() const
+    {
+    return 1;
+    }
+
+//=============================================================================    
+CCoeControl* CPluginSelectionDialog::ComponentControl(TInt /*aIndex*/) const
+    {
+    return iGrid;
+    }
+
+//=============================================================================    
+TKeyResponse CPluginSelectionDialog::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 = iGrid->OfferKeyEventL(aKeyEvent, aType);
+        if (res == EKeyWasConsumed)
+            {
+            DrawDeferred();
+            iGrid->ShowTooltip( iPopupController, this );
+            }
+
+        }
+        
+    return res;
+    }
+
+//=============================================================================
+void CPluginSelectionDialog::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 ( iGrid->GridRect().Contains( aPointerEvent.iPosition ) )
+			        {
+			        iPopupController->HideInfoPopupNote();
+#ifdef RD_TACTILE_FEEDBACK 
+					if ( iTouchFeedBack )
+	                	{
+			            iTouchFeedBack->InstantFeedback( ETouchFeedbackBasic );
+			            RDebug::Printf( "ImageEditor::CPluginSelectionDialog: ETouchFeedback" );
+	                	}
+#endif /* RD_TACTILE_FEEDBACK  */
+			        iGrid->HandlePointerEventL( aPointerEvent );			        
+			        draw = ETrue;
+			        }    
+		        else
+		            {
+		            // Cancel if tapped outside of the grid
+		            TryExitL( EAknSoftkeyCancel );
+		            }
+				break;
+				}
+			case TPointerEvent::EDrag:
+				{
+			    if ( iGrid->GridRect().Contains( aPointerEvent.iPosition ) )
+			        {
+			        TBool highlightedBefore = 
+			            iGrid->HighlightedItemPressed( aPointerEvent.iPosition );
+			        
+			        iGrid->HandlePointerEventL( aPointerEvent );
+			        
+			        TBool highlightedAfter = 
+			            iGrid->HighlightedItemPressed( aPointerEvent.iPosition );
+			        
+			        // if these two values differ from each other, it indicates
+			        // that focus has changed in the grid to a new item    
+			        if ( highlightedBefore != highlightedAfter )
+			            {
+#ifdef RD_TACTILE_FEEDBACK 
+                        if ( iTouchFeedBack )
+                            {
+                            iTouchFeedBack->InstantFeedback( ETouchFeedbackSensitive );
+                            RDebug::Printf( "ImageEditor::CPluginSelectionDialog: ETouchFeedbackSensitive" );
+                            }
+#endif /* RD_TACTILE_FEEDBACK  */
+			        
+			            draw = ETrue;			                
+			            }			        			        
+			        }
+				break;		
+				}
+			case TPointerEvent::EButton1Up:
+				{
+				// already highlighted item is pressed
+			    if ( iGrid->HighlightedItemPressed( aPointerEvent.iPosition ) )
+			        {
+			        TryExitL (EAknSoftkeyOk);
+			        }
+				break;
+				}
+			default:
+				{
+				break;	
+				}	
+			}
+			
+	    if ( draw )
+	        {
+		    DrawDeferred();
+		    iGrid->ShowTooltip( iPopupController, this );
+	        }	
+        }
+    }
+    
+// End of File