diff -r 000000000000 -r eb1f2e154e89 textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutvkbkeyctrl.cpp --- /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 +#include +#include +#include +#include +#include +#include + +#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(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(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(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(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(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(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(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(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(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(&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