textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutvkbkeyctrl.cpp
changeset 0 eb1f2e154e89
child 8 4eb1ae11334f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutvkbkeyctrl.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,906 @@
+/*
+* Copyright (c) 2007-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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:
+*
+* Description:  Implementation for PeninputLayoutControl
+*
+*/
+
+//#include <e32base.h>
+#include <AknIconUtils.h>
+#include <w32std.h>
+#include <AknsDrawUtils.h>
+#include <eikenv.h>
+#include <AknsConstants.h>
+#include <AknUtils.h>
+
+#include "peninputlayoutvirtualkeyctrl.h"
+#include "peninputlayoutvkb.h"
+#include "peninputlayout.h"
+#include "peninputpluginutils.h"
+
+_LIT( KKeyShiftCharacter, "\x2191");
+
+const TInt KDefaultKeyMargin = 10;
+
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::NewL
+// Static factory creator
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CVirtualKeyCtrl* CVirtualKeyCtrl::NewL(CVirtualKeyboard* aKeyboard,
+                                                        CVirtualKey* aKeyInfo)
+    {
+    if(!aKeyInfo || !aKeyboard)
+        return 0;
+    
+    CVirtualKeyCtrl* keyCtrl = new(ELeave) CVirtualKeyCtrl(aKeyboard,aKeyInfo);
+    CleanupStack::PushL(keyCtrl);
+    keyCtrl->ConstructL();
+    CleanupStack::Pop();    
+    return keyCtrl;    
+    }
+
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::CVirtualKeyCtrl
+// constuctor
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+CVirtualKeyCtrl::CVirtualKeyCtrl(CVirtualKeyboard* aKeyboard, CVirtualKey* aKeyInfo)
+                                 :CFepUiBaseCtrl(aKeyInfo->Rect(), aKeyboard->UiLayout(),-1),
+                                  iKeyInfo(aKeyInfo), iKeyboard(aKeyboard)
+    {
+    SetControlType(ECtrlVirtualKey);    
+    //virtual key postion is kept as relative to key board, so we must change the 
+    //key control's position relative to layout.
+    Move(aKeyboard->Rect().iTl);
+    
+#ifdef RD_TACTILE_FEEDBACK     
+    //register the key feedback area
+    //UiLayout()->RegisterFeedbackArea(reinterpret_cast<TInt>(this),Rect());    
+#endif // RD_TACTILE_FEEDBACK 
+    
+    aKeyInfo->iKeyCtrl = this;
+    iScanCode = aKeyInfo->ScanCode();
+    }
+
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::~CVirtualKeyCtrl
+// destructor
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+CVirtualKeyCtrl::~CVirtualKeyCtrl()
+    {
+    //Never uncomment the following statement. When this control is deleted,
+    //iKeyInfo may be already invalid!!!
+    //iKeyInfo->iKeyCtrl = 0;
+    
+#ifdef RD_TACTILE_FEEDBACK     
+    UiLayout()->DeRegisterFeedbackArea(reinterpret_cast<TInt>(this),Rect());            
+#endif // RD_TACTILE_FEEDBACK     
+    }
+    
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::ConsructL
+// 2nd phase constuctor
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//        
+void CVirtualKeyCtrl::ConstructL()
+    {
+    BaseConstructL();
+    }
+
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::DrawKeyText
+// Draw key text
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//        
+void CVirtualKeyCtrl::DrawKeyText()    
+    {
+    TBool textlineset = EFalse;
+
+    // if text line set
+    for (TInt i = 0; i <= EPosLast; i++)
+        {
+        if (iKeyboard->TextLineLayoutSet(TVirtualKeyTextPos(i)))
+            {
+            textlineset = ETrue;
+
+            if (iKeyInfo->KeyUnicodes(TVirtualKeyTextPos(i)) != KNullDesC)
+                {
+                TAknLayoutText textLayout;
+                textLayout.LayoutText(Rect(), 
+                                      iKeyboard->TextLineLayout(TVirtualKeyTextPos(i)));
+				TRgb color( KRgbBlack );  // sane default for nonskinned case			    
+			    if ( AknsUtils::AvkonSkinEnabled() )
+			        {
+			        AknsUtils::GetCachedColor( AknsUtils::SkinInstance(),
+				                               color, 
+				                               KAknsIIDQsnTextColors, 
+				                               iKeyboard->KeyTextColorGroup() );
+			        }
+			    
+			    // replace the shift text to shift icon			        
+				if( iKeyboard->ShiftIcon() &&
+					iKeyInfo->KeyUnicodes(TVirtualKeyTextPos(i)) == KKeyShiftCharacter )
+					{
+					CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+					AknPenInputDrawUtils::DrawColorIcon( iKeyboard->ShiftIcon(),
+														 *gc,
+														 textLayout.TextRect() );	
+					}
+				else				    
+				    {
+				    textLayout.DrawText(*BitGc(), iKeyInfo->KeyUnicodes(TVirtualKeyTextPos(i)), 
+                                    EFalse, color);
+				    }
+                }
+            }
+        }
+
+    if (!textlineset)
+        {
+		TAknLayoutText textLayout;
+		textLayout.LayoutText(Rect(), iKeyboard->iVKBTextLineLayout);
+	    
+	    CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());    
+	    
+	    //charRect.Move(keyboardRect.iTl);
+	    //if(iKeyInfo->Dimmed())
+	    //    {        
+	    //    gc->SetFadingParameters(iKeyboard->iFadingParamBlack, iKeyboard->iFadingParamWhite);
+	    //    gc->SetFaded(ETrue);            
+	    //    }
+		TRgb color( KRgbBlack );  // sane default for nonskinned case			    
+	    if ( AknsUtils::AvkonSkinEnabled() || 
+	    	 iKeyboard->KeyTextColorGroup() != INVALID_COLOR_GROUP )
+	        {
+	        AknsUtils::GetCachedColor( AknsUtils::SkinInstance(),
+		                               color, 
+		                               KAknsIIDQsnTextColors, 
+		                               iKeyboard->KeyTextColorGroup() );
+	        }
+	    else
+    		{
+			color = iKeyboard->iFontColor;
+    		}
+    		
+    	if( iKeyInfo->Dimmed() )
+			{			
+			color = KRgbGray;	
+			}	
+    	if( iKeyInfo->DisplayUnicode() && iKeyInfo->DisplayUnicode()->Length() != 0)
+    		{
+    		textLayout.DrawText(*BitGc(), *iKeyInfo->DisplayUnicode(), EFalse, color);		
+    		}
+    	else
+    		{
+    		textLayout.DrawText(*BitGc(), iKeyInfo->KeyUnicodes(), EFalse, color);		
+    		}		
+    		
+	    //if(iKeyInfo->Dimmed())
+	    //    gc->SetFaded(EFalse);            
+	    
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::DrawDimKey
+// Draw dimmed key
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//        
+void CVirtualKeyCtrl::DrawDimKey()
+    {
+    CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());    
+    TRect rect = Rect();
+    TRect bmpRect(TPoint(0,0),rect.Size());    
+    gc->Activate( BitmapDevice() );
+                
+    
+    if(iVirtualKeyDrawInfo.iVKDimLeftImgID.iMajor && 
+       iVirtualKeyDrawInfo.iVKDimMiddleImgID.iMajor &&
+       iVirtualKeyDrawInfo.iVKDimRightImgID.iMajor)
+        {
+        TRect innerRect = Rect();
+		innerRect.Shrink( 4, 0 );
+		    
+		AknPenInputDrawUtils::Draw3PiecesFrame(AknsUtils::SkinInstance(),
+								   *gc,
+								   Rect(),
+								   innerRect,
+								   iVirtualKeyDrawInfo.iVKDimLeftImgID,
+								   iVirtualKeyDrawInfo.iVKDimMiddleImgID,
+								   iVirtualKeyDrawInfo.iVKDimRightImgID);
+        }
+    else if (iKeyboard->IsIrregularKeyBoard())
+        {
+        DrawIrregularKey(EKeyStateDimmed, EKeyStateDimmedMask);
+        }
+    else if (iKeyboard->KeySkinId(EKeyBmpDim) != KAknsIIDNone)
+        {
+        TRect innerrect = rect;
+        innerrect.Shrink( KDefaultKeyMargin, KDefaultKeyMargin );
+        
+        AknsDrawUtils::DrawFrame(AknsUtils::SkinInstance(),
+                                 *gc,
+                                 rect,
+                                 innerrect,
+                                 iKeyboard->KeySkinId(EKeyBmpDim),
+                                 KAknsIIDDefault);
+        }
+    else if( iKeyboard->NonIrregularKeyBitmap( EKeyBmpDim ) )
+    	{
+        TRect srcRect(TPoint(0,0), iKeyboard->NonIrregularKeyBitmap( EKeyBmpDim )->SizeInPixels());
+        DrawBmp(rect,
+                srcRect,
+                iKeyboard->NonIrregularKeyBitmap( EKeyBmpDim ),
+                iKeyboard->NonIrregularKeyBitmap( EkeyBmpDimMask ),
+                ETrue); 
+    	}
+    else if (iKeyboard->iDimKeyBmp)
+        {
+        TRect srcRect(TPoint(0,0),iKeyboard->iDimKeyBmp->SizeInPixels());
+        DrawBmp(rect,srcRect,iKeyboard->iDimKeyBmp,
+                                            iKeyboard->iDimKeyMaskBmp,ETrue);
+        }    
+
+    else
+        {
+        gc->SetFaded(ETrue);
+
+        //use if keboard has background bitmap            
+        if (iKeyboard->BackgroundBmp())
+            {
+            TRect srcRect = Rect();
+            srcRect.Move(-iKeyboard->Rect().iTl);
+            DrawBmp(Rect(),srcRect,iKeyboard->BackgroundBmp(),iKeyboard->BkMaskBmp());
+            }
+        else
+            {
+            //self draw background if background bitmap
+            gc->SetBrushColor( BkColor());
+            gc->SetPenColor( BkColor() );
+            gc->SetBrushStyle( CGraphicsContext::ESolidBrush );                
+            gc->DrawRect(rect);		                      
+            }
+        }
+        
+    gc->SetPenColor(KRgbBlack);
+    gc->SetBrushStyle( CGraphicsContext::ENullBrush );    
+    //Draw text again.
+    DrawKeyText(); 
+    }
+
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::DrawBmp
+// Draw bitmap
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//        
+void CVirtualKeyCtrl::DrawBmp(const TRect& aDestRect,const TRect& aSourceRect,
+                                  const CFbsBitmap* aBmp,CFbsBitmap* aMask,
+                                  TBool aInvertFlag)
+    {
+    CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+    if(aMask)
+        {
+        //TRect bmpRect(TPoint(0,0),aMask->SizeInPixels());
+        gc->DrawBitmapMasked(aDestRect,aBmp,aSourceRect,aMask,aInvertFlag);        
+        }
+    else
+        {
+        gc->DrawBitmap(aDestRect,aBmp,aSourceRect);
+        }						     
+    }
+    
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::DrawNormalStateKey
+// Draw key in normal state
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//            
+void CVirtualKeyCtrl::DrawNormalStateKey()
+    {    
+    CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+ 
+    TRect rect = Rect();    
+    TRect bmpRect(TPoint(0,0),rect.Size());
+    
+    if(iVirtualKeyDrawInfo.iVKLeftImgID.iMajor && 
+       iVirtualKeyDrawInfo.iVKMiddleImgID.iMajor &&
+       iVirtualKeyDrawInfo.iVKRightImgID.iMajor)
+        {
+        TRect innerRect = Rect();
+		innerRect.Shrink( 4, 0 );
+		    
+		AknPenInputDrawUtils::Draw3PiecesFrame(AknsUtils::SkinInstance(),
+								   *gc,
+								   Rect(),
+								   innerRect,
+								   iVirtualKeyDrawInfo.iVKLeftImgID,
+								   iVirtualKeyDrawInfo.iVKMiddleImgID,
+								   iVirtualKeyDrawInfo.iVKRightImgID);
+        }
+    else if (iKeyboard->IsIrregularKeyBoard())
+        {
+        DrawIrregularKey(EKeyStateNormal, EKeyStateNormalMask);
+        }
+    else if (iKeyboard->KeySkinId(EKeyBmpNormal) != KAknsIIDNone)
+        {
+        TRect innerrect = rect;
+        innerrect.Shrink( KDefaultKeyMargin, KDefaultKeyMargin );
+
+        AknsDrawUtils::DrawFrame(AknsUtils::SkinInstance(), 
+                                 *gc, 
+                                 rect, 
+                                 innerrect,
+                                 iKeyboard->KeySkinId(EKeyBmpNormal), 
+                                 KAknsIIDDefault); 
+        }
+    else if( iKeyboard->NonIrregularKeyBitmap( EKeyBmpNormal ) )
+    	{
+        TRect srcRect(TPoint(0,0), 
+                      iKeyboard->NonIrregularKeyBitmap( EKeyBmpNormal )->SizeInPixels());
+        DrawBmp(rect,
+                srcRect,
+                iKeyboard->NonIrregularKeyBitmap( EKeyBmpNormal ),
+                iKeyboard->NonIrregularKeyBitmap( EKeyBmpNormalMask ),
+                ETrue); 
+    	}
+     
+    else
+        {
+        gc->SetFaded(EFalse);
+
+        //use if keboard has background bitmap            
+        if (iKeyboard->BackgroundBmp())
+            {
+            TRect srcRect = Rect();
+            srcRect.Move(-iKeyboard->Rect().iTl);
+            DrawBmp(Rect(),srcRect,iKeyboard->BackgroundBmp(),iKeyboard->BkMaskBmp());
+            }
+        else
+            {
+            //self draw background if background bitmap
+            gc->SetBrushColor( BkColor());
+            gc->SetPenColor( BkColor() );
+            gc->SetBrushStyle( CGraphicsContext::ESolidBrush );                
+            gc->DrawRect(rect);		                      
+            }
+        }        
+        
+    gc->SetPenColor( KRgbBlack );
+    gc->SetBrushStyle( CGraphicsContext::ENullBrush );    
+    gc->SetFaded(EFalse);            
+    DrawKeyText();        
+    }
+    
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::DrawHighlightKey
+// Draw key in highlight state
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//                
+void CVirtualKeyCtrl::DrawHighlightKey()
+    {    
+    CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+    TRect rect = Rect();
+    TPoint bmpPos = rect.iTl;
+    TRect bmpRect(TPoint(0,0),rect.Size());
+   
+    if(iVirtualKeyDrawInfo.iVKPressedLeftImgID.iMajor && 
+       iVirtualKeyDrawInfo.iVKPressedMiddleImgID.iMajor &&
+       iVirtualKeyDrawInfo.iVKPressedRightImgID.iMajor)
+        {
+        TRect innerRect = Rect();
+		innerRect.Shrink( 4, 0 );
+		    
+		AknPenInputDrawUtils::Draw3PiecesFrame(AknsUtils::SkinInstance(),
+								   *gc,
+								   Rect(),
+								   innerRect,
+								   iVirtualKeyDrawInfo.iVKPressedLeftImgID,
+								   iVirtualKeyDrawInfo.iVKPressedMiddleImgID,
+								   iVirtualKeyDrawInfo.iVKPressedRightImgID);
+
+        }
+    else if (iKeyboard->IsIrregularKeyBoard())
+        {
+        DrawIrregularKey(EKeyStatePressed, EKeyStatePressedMask);
+        }
+
+    //do we have highlight background bmp for this key?
+    else if (iKeyboard->KeySkinId(EKeyBmpHighlight) != KAknsIIDNone)
+        {
+        TRect innerrect = rect;
+        innerrect.Shrink( KDefaultKeyMargin, KDefaultKeyMargin );
+
+        AknsDrawUtils::DrawFrame(AknsUtils::SkinInstance(), 
+                                 *gc, 
+                                 rect, 
+                                 innerrect,
+                                 iKeyboard->KeySkinId(EKeyBmpHighlight), 
+                                 KAknsIIDDefault); 
+        }
+    else if( iKeyboard->NonIrregularKeyBitmap( EKeyBmpHighlight ) )
+    	{
+        TRect srcRect(TPoint(0,0), 
+                      iKeyboard->NonIrregularKeyBitmap( EKeyBmpHighlight )->SizeInPixels());
+        DrawBmp(rect,
+                srcRect,
+                iKeyboard->NonIrregularKeyBitmap( EKeyBmpHighlight ),
+                iKeyboard->NonIrregularKeyBitmap( EKeyBmpHighlightMask ),
+                ETrue); 
+    	}
+    else if(iKeyInfo->HighlightBmpIndex() >= 0 && 
+                 iKeyInfo->HighlightBmpIndex() < iKeyboard->iKeyHighLightBmpList.Count())
+        {
+        gc->DrawBitmap(rect,iKeyboard->iKeyHighLightBmpList[iKeyInfo->HighlightBmpIndex()]);
+        }
+    else //using fading
+        {
+        gc->SetFadingParameters(iKeyboard->iFadingParamBlack, iKeyboard->iFadingParamWhite);
+        gc->SetFaded(ETrue);            
+
+        if(iKeyboard->BackgroundBmp())//use keyboard background bitmap
+            {
+            gc->BitBlt(bmpPos, iKeyboard->BackgroundBmp(), iKeyInfo->Rect());                
+            }
+        else //draw background if not background bitmap
+            {              
+            gc->SetBrushColor( BkColor());
+            gc->SetPenColor( BkColor() );
+            gc->SetBrushStyle( CGraphicsContext::ESolidBrush );                
+            gc->DrawRect(rect);
+            }
+        }                    
+ 
+    gc->SetPenColor( KRgbBlack );
+
+    gc->SetBrushStyle( CGraphicsContext::ENullBrush );    
+    gc->SetFaded(EFalse);       
+    DrawKeyText();    
+
+    }
+    
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::Draw
+// Draw key
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//                    
+void CVirtualKeyCtrl::Draw()
+    {
+    if(!AbleToDraw())
+    	return;    
+    
+    CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+    
+    //mask bitmaps
+  	DrawOpaqueMaskBackground();  
+        
+    // ----- draw bitmaps -----
+    gc->Activate( BitmapDevice() );                
+    
+/*    if (iScanCode == -1 && !iKeyInfo->Dimmed() && iKeyboard)
+    	{
+    	iKeyboard->DimKey(iKeyInfo, ETrue);
+    	}*/
+
+    if(iKeyInfo->Dimmed())
+        {
+        DrawDimKey();
+        return;
+        }
+    
+    if(iKeyInfo->Latched()||(PointerDown()&&!iKeyInfo->IsLatchKey()))
+        {        
+        DrawHighlightKey();
+        
+// remove DrawBubble() into HandlePointerDownEventL()
+// to avoid showing more than one bubble at the same time.        
+//        iKeyboard->DrawBubble(iKeyInfo);
+        }
+    else
+        {                
+        DrawNormalStateKey();
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::HandlePointerDownEventL
+// Handle pointer down event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//                    
+CFepUiBaseCtrl* CVirtualKeyCtrl::HandlePointerDownEventL(const TPoint& aPoint)
+    {
+    //do nothing if key is dimmed.
+    if(iKeyInfo->Dimmed())
+        return this;
+    
+    CFepUiBaseCtrl::HandlePointerDownEventL(aPoint);
+    
+    //draw key new state
+    iKeyboard->DrawBubble(iKeyInfo);
+    ReDraw();            	
+    UpdateArea( Rect() );
+
+    if(iKeyInfo->IsLatchKey())
+        {
+        // Only set latch status, not generate event for latch key
+        iKeyInfo->SetLatched(!iKeyInfo->Latched());       
+        }
+    else
+        {
+        ReportKeyEvent(GetKeyEventType(EVirtualKeyControlDown));
+        }     
+ 
+    return this;
+    }
+
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::HandlePointerUpEventL
+// Handle pointer up event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CFepUiBaseCtrl* CVirtualKeyCtrl::HandlePointerUpEventL(const TPoint& aPoint)
+    {
+    if(!PointerDown() || iKeyInfo->Dimmed())
+        {
+        return this;
+        }
+    CFepUiBaseCtrl::HandlePointerUpEventL(aPoint);
+    
+    iKeyboard->ClearBubble(ETrue);
+    
+	TControlEvent  eventType = GetKeyEventType(EVirtualKeyControlUp);
+    if(iKeyInfo->IsLatchKey())
+        {
+        // When key up, latch key will generate event. 
+        // When key down, latch key won't generate event.
+        eventType = iKeyInfo->Latched() ? EEventVirtualKeyLatched : EEventVirtualKeyUnLatched;
+        }     
+    ReDraw();            
+    UpdateAreaImmed( Rect() );
+    ReportKeyEvent(eventType); 
+    
+    
+    //Advanced tactile feedback REQ 417-47932
+	#ifdef RD_TACTILE_FEEDBACK
+    if (UiLayout()->SupportTactileFeedback())
+    	{
+   		UiLayout()->DoTactileFeedback(ETouchFeedbackSensitiveInput, ETrue, EFalse);
+        }
+	#endif // RD_TACTILE_FEEDBACK 
+    return this;
+    }
+	
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::HandlePointerEnter
+// Handle pointer enter event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CVirtualKeyCtrl::HandlePointerEnter(const TPoint& aPoint)
+    {
+    //do nothing if key is dimmed.
+    if(iKeyInfo->Dimmed())
+        return;
+    
+    CFepUiBaseCtrl::HandlePointerEnter(aPoint);
+    if(iKeyInfo->IsLatchKey())
+        {
+        iKeyInfo->SetLatched(!iKeyInfo->Latched());       
+        }
+        
+    iKeyboard->DrawBubble(iKeyInfo);    
+    ReDraw();
+    UpdateArea( Rect() );
+      
+    }
+
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::HandlePointerLeave
+// Handle pointer left event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CVirtualKeyCtrl::HandlePointerLeave(const TPoint& aPoint)
+    {    
+    //do nothing if key is dimmed.
+    if(iKeyInfo->Dimmed())
+        return;
+    
+    CFepUiBaseCtrl::HandlePointerLeave(aPoint);
+    if(iKeyInfo->IsLatchKey())
+        {
+        iKeyInfo->SetLatched(!iKeyInfo->Latched());       
+        }
+        
+    iKeyboard->ClearBubble(ETrue);
+	ReDraw();
+    UpdateArea( Rect() );
+	
+#ifdef RD_TACTILE_FEEDBACK
+    if ( iKeyboard->GowithPointerDown() )
+		{
+	    
+		if (UiLayout()->SupportTactileFeedback())
+			{
+			if (!Hiden())
+				{				
+				UiLayout()->DoTactileFeedback(ETouchFeedbackCharacterInputButton, ETrue, EFalse);				
+				}
+			}
+		}
+#endif //RD_TACTILE_FEEDBACK
+    }
+
+void CVirtualKeyCtrl::CancelPointerDownL()
+	{
+	CFepUiBaseCtrl::CancelPointerDownL();
+	iKeyboard->ClearBubble(ETrue);
+	ReDraw();
+    UpdateArea( Rect() );
+	}
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::ReDraw
+// Redraw and updates the key
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+void CVirtualKeyCtrl::ReDraw()
+    {
+    Draw();    
+    UpdateArea(Rect(), EFalse);            
+    }
+    
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::ReportKeyEvent
+// Report current key event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//   
+void CVirtualKeyCtrl::ReportKeyEvent(TControlEvent aEventType)
+    {
+    if (iKeyInfo->ScanCode() == 0xffffffff ||
+        iKeyInfo->ScanCode() == 0xffff)
+    	{
+    	return;	
+    	}
+
+    TVirtualKeyEventData eventData;
+
+    eventData.iKeyEvent.iCode = iKeyInfo->KeyCode();
+    eventData.iKeyEvent.iScanCode = iKeyInfo->ScanCode();
+    
+    TInt unicodeidx;
+
+    if (iKeyInfo->UnicodesListEmpty(unicodeidx))
+        {
+        eventData.iKeyData.Set(iKeyInfo->KeyUnicodes());
+        }
+    else
+        {
+        eventData.iKeyData.Set(iKeyInfo->KeyUnicodes(TVirtualKeyTextPos(unicodeidx)));
+        }    
+    eventData.iKey = iKeyInfo;
+    TPtrC eventDataPtr;
+    eventDataPtr.Set(reinterpret_cast<TUint16*>(&eventData),sizeof(eventData)/sizeof(TUint16));
+    
+    iKeyboard->ReportEvent(aEventType,eventDataPtr);	    
+    }
+    
+// ---------------------------------------------------------------------------
+// CVirtualKeyCtrl::GetKeyEventType
+// Convert event type
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//       
+TControlEvent CVirtualKeyCtrl::GetKeyEventType(TVirtualKeyEventType aEvent)
+    {
+    TControlEvent event = EEventVirtualKeyUp;
+    switch(aEvent)
+        {
+        case EVirtualKeyControlUp:
+            event = EEventVirtualKeyUp;
+            break;
+        case EVirtualKeyControlDown:
+            event = EEventVirtualKeyDown;
+            break;
+        default:
+            __ASSERT_DEBUG(EFalse, User::Panic(_L("peninputserver"), EUiLayoutBadEvent));    
+        }
+    return event;
+    }
+
+TBool CVirtualKeyCtrl::Contains(const TPoint& aPt)
+    {
+    if  (!CFepUiBaseCtrl::Contains(aPt))   // OR:  if (!iRect.Contains(aPt))
+        {
+        return EFalse;
+        }
+    
+    if (iKeyboard->IsIrregularKeyBoard())
+        {
+        return MaskBmpContains(aPt);    
+        }
+        
+    return ETrue; 
+    }
+
+TBool CVirtualKeyCtrl::MaskBmpContains(const TPoint& aPt)
+    {
+    // judge if mask bitmap contains a point
+    TRgb ptColor;
+
+    // map aPt to maskbmp's point
+    TPoint ptInBmp = TPoint(aPt.iX - iRect.iTl.iX, aPt.iY - iRect.iTl.iY);
+
+    CFbsBitmap* maskbmp = MaskBmp();
+    if (!maskbmp)
+        {
+        return EFalse;
+        }
+
+       //  before following call, when mask bitmap created, you must call IMPORT_C static void DisableCompression( CFbsBitmap* aBitmap ); in akniconutils.h to make sure following call not crash
+   maskbmp->GetPixel(ptColor, ptInBmp);    
+
+    return (ptColor != KRgbBlack);
+    }
+
+CFbsBitmap* CVirtualKeyCtrl::MaskBmp()  // there may be other method to get mask bitmap
+    {
+    if (iKeyInfo->Dimmed())
+        {
+        return iKeyboard->IrregularKeyBitmap(iKeyInfo->IrregualrKeyType(),EKeyStateDimmedMask);
+        }
+
+    if (PointerDown() || iKeyInfo->Latched())
+        {
+        return iKeyboard->IrregularKeyBitmap(iKeyInfo->IrregualrKeyType(),EKeyStatePressedMask);
+        }
+    return iKeyboard->IrregularKeyBitmap(iKeyInfo->IrregualrKeyType(),EKeyStateNormalMask);
+    }
+ 
+ void CVirtualKeyCtrl::DrawIrregularKey(TVirtualKeyIrregularKeyState aKeyState, 
+                                        TVirtualKeyIrregularKeyState aKeyStateMask)
+    {
+    TRect rect = Rect();
+        
+    if( rect.IsEmpty()	)    
+        {
+        return;
+        }
+    TSize bitmapSize = 
+             iKeyboard->IrregularKeyBitmap(iKeyInfo->IrregualrKeyType(),aKeyState)->SizeInPixels();
+    
+    
+    TRect srcRect(TPoint(0,0), bitmapSize);
+
+    DrawBmp(rect,
+            srcRect,
+            iKeyboard->IrregularKeyBitmap(iKeyInfo->IrregualrKeyType(),aKeyState),
+            iKeyboard->IrregularKeyBitmap(iKeyInfo->IrregualrKeyType(),aKeyStateMask),
+            ETrue);
+
+    }
+ 
+void CVirtualKeyCtrl::SetVirtualKeyImgID(TVirtualKeyDrawInfo aVirtualKeyDrawInfo)
+    {
+    iVirtualKeyDrawInfo = aVirtualKeyDrawInfo;
+    }
+    
+//implementation for class CVirtualRawKeyCtrl
+// ---------------------------------------------------------------------------
+// CVirtualRawKeyCtrl::NewL
+// Factory function
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+// 
+CVirtualRawKeyCtrl* CVirtualRawKeyCtrl::NewL(CVirtualKeyboard* aKeyboard,
+                                                          CVirtualKey* aKeyInfo)
+    {
+    if(!aKeyInfo)
+        return 0;
+    
+    CVirtualRawKeyCtrl* keyCtrl = 
+                            new(ELeave) CVirtualRawKeyCtrl(aKeyboard,aKeyInfo);
+    CleanupStack::PushL(keyCtrl);
+    keyCtrl->ConstructL();
+    CleanupStack::Pop();    
+    return keyCtrl;        
+    }
+   
+// ---------------------------------------------------------------------------
+// CVirtualRawKeyCtrl::CVirtualRawKeyCtrl
+// Constructor
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//     
+CVirtualRawKeyCtrl::CVirtualRawKeyCtrl(CVirtualKeyboard* aKeyboard,
+                                                        CVirtualKey* aKeyInfo)
+                                      :CVirtualKeyCtrl(aKeyboard,aKeyInfo)
+    {
+    SetControlType(ECtrlVirtualItutKey);
+    }
+    
+// ---------------------------------------------------------------------------
+// CVirtualRawKeyCtrl::GetKeyEventType
+// Convert key event type
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//         
+TControlEvent CVirtualRawKeyCtrl::GetKeyEventType(TVirtualKeyEventType aEvent)
+    {
+    TControlEvent event = EEventVirtualKeyUp;
+    switch(aEvent)
+        {
+            case EVirtualKeyControlUp:
+                event = EEventRawKeyUpEvent;
+                break;
+            case EVirtualKeyControlDown:
+                event = EEventRawKeyDownEvent;
+                break;
+            default:
+                __ASSERT_DEBUG(EFalse, User::Panic(_L("peninputserver"), EUiLayoutBadEvent));    
+        }
+    return event;
+    }
+    
+// ---------------------------------------------------------------------------
+// CVirtualRawKeyCtrl::CancelPointerDownL
+// Handle cancel pointer down event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//             
+void CVirtualRawKeyCtrl::CancelPointerDownL()
+    {
+    CFepUiBaseCtrl::CancelPointerDownL();
+
+    //simulates key up event
+    ReportKeyEvent(EEventRawKeyUpEvent);
+    }
+    
+// ---------------------------------------------------------------------------
+// CVirtualRawKeyCtrl::HandlePointerLeave
+// Handle pointer left event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CVirtualRawKeyCtrl::HandlePointerLeave(const TPoint& aPoint)
+    {    
+    TRawEvent event;
+    event.Set(TRawEvent::EButton1Up,aPoint.iX,aPoint.iY);
+    
+    SimulateRawEvent(event);
+    
+	// Advanced tactile feedback REQ 417-47932
+#ifdef RD_TACTILE_FEEDBACK
+	if (UiLayout()->SupportTactileFeedback())
+		{		
+		if (!VirtualKey()->Dimmed() && !Hiden())
+			{
+			UiLayout()->DoTactileFeedback(ETouchFeedbackSensitiveInput, ETrue, EFalse);
+			}
+        }
+#endif //RD_TACTILE_FEEDBACK     
+	}
+//end of file