diff -r ebd48d2de13c -r ecbabf52600f textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutvkb.cpp --- a/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutvkb.cpp Tue Aug 31 15:31:50 2010 +0300 +++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutvkb.cpp Wed Sep 01 12:23:33 2010 +0100 @@ -27,6 +27,7 @@ #include "peninputlayoutvkb.h" #include "peninputpluginutils.h" +#include "peninputvkbpreviewbubblerenderer.h" const TInt KFadingParamBlack = 128; const TInt KFadingParamWhite = 192; const TInt KDefaultBubbleSize = 50; @@ -94,7 +95,6 @@ iKeyNormalSkinId(KAknsIIDNone), iKeyHighlightSkinId(KAknsIIDNone), iKeyDimSkinId(KAknsIIDNone), - iNeedDrawBackground(ETrue), iIrregularKey(aIrregular), iBubbleCtrl(NULL), iBubbleVerticalMargin(0), @@ -102,6 +102,7 @@ { iFontSpec = aFontSpec; SetControlType(ECtrlVirtualKeyboard); + iBubbleSize = TSize( KDefaultBubbleSize, KDefaultBubbleSize ); } // --------------------------------------------------------------------------- @@ -111,8 +112,14 @@ // EXPORT_C CVirtualKeyboard::~CVirtualKeyboard() { + delete iExt; if ( iBubbleCtrl ) delete iBubbleCtrl; + if ( iPreviewBubbleRenderer ) + { + iPreviewBubbleRenderer->Detach(); + iPreviewBubbleRenderer = NULL; + } //free keys iKeyArray.ResetAndDestroy(); @@ -150,6 +157,7 @@ DestroyIrregularBmps(); delete iShiftIcon; + delete iStarIcon; } // --------------------------------------------------------------------------- @@ -181,7 +189,8 @@ if (iIrregularKey) { ConstructIrregularBmps(); - } + } + iExt = new(ELeave) CFepUiKeyboardExt; } // --------------------------------------------------------------------------- @@ -199,8 +208,8 @@ CVirtualKeyCtrl* ctrl = CreateKeyCtrlL(aKey,EFalse);//CVirtualKeyCtrl::NewL(this,aKey); #ifdef RD_TACTILE_FEEDBACK //Advanced Tactile feedback REQ417-47932 - ctrl->SetTactileFeedbackType(ETouchFeedbackSensitiveKeypad); - UiLayout()->RegisterFeedbackArea(reinterpret_cast(ctrl),ctrl->Rect(),ETouchFeedbackSensitiveKeypad); + ctrl->SetTactileFeedbackType(ETouchFeedbackSensitiveInput); + UiLayout()->RegisterFeedbackArea(reinterpret_cast(ctrl),ctrl->Rect(),ETouchFeedbackSensitiveInput); #endif CleanupStack::PushL(ctrl); AddKeyControlL(ctrl); @@ -228,8 +237,8 @@ CVirtualRawKeyCtrl* ctrl = static_cast(CreateKeyCtrlL(aKey,ETrue)); #ifdef RD_TACTILE_FEEDBACK //Advanced Tactile feedback REQ417-47932 - ctrl->SetTactileFeedbackType(ETouchFeedbackSensitiveKeypad); - UiLayout()->RegisterFeedbackArea(reinterpret_cast(ctrl),ctrl->Rect(),ETouchFeedbackSensitiveKeypad); + ctrl->SetTactileFeedbackType(ETouchFeedbackSensitiveInput); + UiLayout()->RegisterFeedbackArea(reinterpret_cast(ctrl),ctrl->Rect(),ETouchFeedbackSensitiveInput); #endif CleanupStack::PushL(ctrl); @@ -379,7 +388,12 @@ return; const TRect& keyboardRect = Rect(); - if (iNeedDrawBackground) + if(UiLayout()->NotDrawToLayoutDevice() && !Bitmap()) + { + TRAP_IGNORE(CreateBmpDevL()); + } + + if ( NeedRedrawBg()) { CFbsBitGc* gc = static_cast(BitGc()); @@ -441,10 +455,24 @@ { iBubbleCtrl->Close(); } + if( iPreviewBubbleRenderer ) + { + iPreviewBubbleRenderer->ClearBubble(); + } } void CVirtualKeyboard::DrawBubble(CVirtualKey* aKey) { + if( iPreviewBubbleRenderer ) + { + if ( iIsShowBubble ) + { + TPoint org = UiLayout()->Position(); + TPoint vkbpos = Rect().iTl; + iPreviewBubbleRenderer->DrawBubble( aKey, vkbpos, org, iBubbleSize ); + } + return; + } if ( aKey && !aKey->Dimmed() && iBubbleCtrl && iIsShowBubble) { @@ -466,12 +494,18 @@ { rect.iTl.iX = x1; rect.iBr.iX = x2; + + TPoint vkbpos = Rect().iTl; + rect.Move( vkbpos.iX, 0 ); } rect.iTl.iY = iBubbleVerticalMargin + aKey->Rect().iTl.iY - iBubbleSize.iHeight + Rect().iTl.iY; rect.iBr.iY = iBubbleVerticalMargin + aKey->Rect().iTl.iY + Rect().iTl.iY; - + + TPoint org = UiLayout()->Position(); + rect.Move( org.iX, org.iY ); //now is in screen coord-sys + if( aKey->DisplayUnicode() && aKey->DisplayUnicode()->Length() != 0 ) { TRAP_IGNORE(iBubbleCtrl->SetTextL(*aKey->DisplayUnicode())); @@ -485,14 +519,24 @@ } EXPORT_C void CVirtualKeyboard::ShowBubble(TBool aFlag) - { + { + iIsShowBubble = aFlag; + + if( iPreviewBubbleRenderer ) + { + iPreviewBubbleRenderer->ShowBubble( aFlag ); + return; + } TBool flag = iBubbleCtrl ? ETrue : EFalse; - iIsShowBubble = aFlag; if ( flag != aFlag ) { if(!flag) { TRAP_IGNORE(iBubbleCtrl = CBubbleCtrl::NewL(TRect(0,0,0,0),UiLayout(),-0xFFFF)); + if(iBubbleCtrl && UiLayout()->NotDrawToLayoutDevice()) + { + TRAP_IGNORE(iBubbleCtrl->CreateBmpDevL()); + } iBubbleSize = TSize(KDefaultBubbleSize,KDefaultBubbleSize); } } @@ -516,6 +560,10 @@ { iBubbleCtrl->SetBitmapParam(aBmpId,aMaskBmpId,aBgSkinId); } + if( iPreviewBubbleRenderer ) + { + iPreviewBubbleRenderer->SetBubbleBitmapParam( aBmpId,aMaskBmpId,aBgSkinId ); + } } EXPORT_C void CVirtualKeyboard::SetBubbleSize(const TSize& aSize) @@ -534,6 +582,10 @@ { iBubbleCtrl->SetTextFormat(aTextFormat); } + if( iPreviewBubbleRenderer ) + { + iPreviewBubbleRenderer->SetTextFormat( aTextFormat ); + } } EXPORT_C void CVirtualKeyboard::SetFrameDiff(TInt aLeftDiff, TInt aTopDiff, @@ -542,7 +594,11 @@ if ( iBubbleCtrl ) { iBubbleCtrl->SetFrameDiff(aLeftDiff,aTopDiff,aRightDiff,aBottomDiff); - } + } + if ( iPreviewBubbleRenderer ) + { + iPreviewBubbleRenderer->SetFrameDiff( aLeftDiff, aTopDiff, aRightDiff, aBottomDiff ); + } } EXPORT_C CFepUiBaseCtrl* CVirtualKeyboard::HandlePointerMoveEventL(const TPoint& aPt) @@ -1090,6 +1146,13 @@ delete iShiftIcon; iShiftIcon = aIcon; } + +EXPORT_C void CVirtualKeyboard::SetStarIcon( CPenInputColorIcon* aIcon ) + { + delete iStarIcon; + iStarIcon = aIcon; + } + /* EXPORT_C CFepUiBaseCtrl* CVirtualKeyboard::HandlePointerDownEventL(const TPoint& aPoint) { @@ -1105,7 +1168,25 @@ { return CControlGroup::HandlePointerMoveEventL(aPoint); } - */ + */ +EXPORT_C void CVirtualKeyboard::SetPreviewBubbleRenderer( MPeninputVkbPreviewBubbleRenderer* aRenderer ) + { + if ( ( NULL != aRenderer ) && ( aRenderer == iPreviewBubbleRenderer ) ) + { + return; + } + + if( iPreviewBubbleRenderer ) + { + iPreviewBubbleRenderer->Detach(); + } + + iPreviewBubbleRenderer = aRenderer; + if ( aRenderer ) + { + aRenderer->Attach(); + } + } //end of implementation of class CVirtualKeyboard // Implementation of Class CVirtualKey @@ -1268,6 +1349,10 @@ { //find key //iKeyboard->DrawKey(this); + if ( !aFlag ) + { + iKeyCtrl->UpdateChangedArea(EFalse); + } iKeyCtrl->Draw(); } } @@ -1370,4 +1455,191 @@ iKeyCtrl->Hide( aHide ); } } + +void CFepUiKeyboardExt::CreateBmpDevL(const TDisplayMode &aMode ) + { + if(iBitmap && iHighlightDev && iHighlightGc && iHighlightKeyBmp && iHighlightKeyDev && + iNormalKeyBmp && iNormalKeyDev && iDimmedKeyBmp && iDimmedKeyDev && iKeyGc) + return; + + delete iBitmap; + delete iHighlightDev; + delete iHighlightGc; + delete iHighlightKeyBmp; + delete iHighlightKeyDev; + delete iNormalKeyBmp; + delete iNormalKeyDev; + delete iDimmedKeyBmp; + delete iDimmedKeyDev; + delete iKeyGc; + + iBitmap = 0; + iHighlightDev = 0 ; + iHighlightGc = 0 ; + iHighlightKeyBmp = 0 ; + iHighlightKeyDev = 0 ; + iNormalKeyBmp = 0 ; + iNormalKeyDev = 0 ; + iDimmedKeyBmp = 0 ; + iDimmedKeyDev = 0; + iKeyGc = 0; + + iBitmap = new ( ELeave ) CFbsBitmap; + User::LeaveIfError( iBitmap->Create( TSize(1,1), aMode) ); + + iHighlightDev = CFbsBitmapDevice::NewL(iBitmap); + + iHighlightGc = CFbsBitGc::NewL(); + iHighlightGc->Reset(); + + + iHighlightKeyBmp = new ( ELeave ) CFbsBitmap; + User::LeaveIfError( iHighlightKeyBmp->Create( TSize(1,1), aMode) ); + iHighlightKeyDev = CFbsBitmapDevice::NewL(iHighlightKeyBmp); + + iNormalKeyBmp = new ( ELeave ) CFbsBitmap; + User::LeaveIfError( iNormalKeyBmp->Create( TSize(1,1), aMode) ); + iNormalKeyDev = CFbsBitmapDevice::NewL(iNormalKeyBmp); + + iDimmedKeyBmp = new ( ELeave ) CFbsBitmap; + User::LeaveIfError( iDimmedKeyBmp->Create( TSize(1,1), aMode) ); + iDimmedKeyDev = CFbsBitmapDevice::NewL(iDimmedKeyBmp); + + iKeyGc = CFbsBitGc::NewL(); + iKeyGc->Reset(); + + iHighlightKeyResourceChanged = ETrue; + iNormalKeyResourceChanged = ETrue; + } + +void CVirtualKeyboard::CreateBmpDevL() + { + iExt->CreateBmpDevL(UiLayout()->LayoutOwner()->BitmapDevice()->DisplayMode()); + } + +EXPORT_C void CVirtualKeyboard::HandleResourceChange(TInt aType) + { + if(aType == KPenInputOwnDeviceChange) + { + if(UiLayout()->NotDrawToLayoutDevice()) + { + TRAP_IGNORE(CreateBmpDevL()); + } + } + else if(aType == KPenInputOwnDeviceResourceChange) + { + iExt->iHighlightKeyResourceChanged = ETrue; + iExt->iNormalKeyResourceChanged = ETrue; + } + else + { + CControlGroup::HandleResourceChange(aType); + } + } + +CFbsBitmap* CVirtualKeyboard::PrepareMaskBmpL(CFbsBitGc* aGc, const TDisplayMode& aMode, const TRect& aRect) + { + CFbsBitmap* mask = new(ELeave) CFbsBitmap(); + CleanupStack::PushL(mask); + User::LeaveIfError( mask->Create( aRect.Size(), aMode) ); + CFbsBitmapDevice* maskDev = CFbsBitmapDevice::NewL(mask); + const TRgb KOpaqueMask = TRgb(KOpaqueColor); + DrawBackgroundToDevice(aRect,maskDev,NULL,KOpaqueMask,KOpaqueMask,EFalse); + delete maskDev; + CleanupStack::Pop(mask); + return mask; + } +CFbsBitmap* CVirtualKeyboard::PrepareKeyBmpL(CFbsBitGc* aGc, const TDisplayMode& aMode, const TRect& aRect, + const TRect& aInnerRect,const TAknsItemID& aFrameID, const TAknsItemID& aCenterID, const TRect& aKeyRect) + { + CFbsBitmap* key = new(ELeave) CFbsBitmap(); + CleanupStack::PushL(key); + User::LeaveIfError( key->Create( aRect.Size(), aMode) ); + + CFbsBitmapDevice* dev = CFbsBitmapDevice::NewL(key); + CleanupStack::PushL(dev); + + CFbsBitGc* keyGc = CFbsBitGc::NewL(); + keyGc->Reset(); + CleanupStack::PushL(keyGc); + + keyGc->Activate(dev); + + CFbsBitGc* layoutGc = static_cast( + UiLayout()->LayoutOwner()->BitmapContext()); + layoutGc->Activate(UiLayout()->LayoutOwner()->BitmapDevice()); + + keyGc->BitBlt(TPoint(0,0),*layoutGc,aKeyRect); + + AknsDrawUtils::DrawFrame(AknsUtils::SkinInstance(), + *keyGc, + aRect, + aInnerRect, + aFrameID, + aCenterID); + + layoutGc->Activate(UiLayout()->LayoutOwner()->BitmapDevice()); + + CleanupStack::PopAndDestroy(2); + CleanupStack::Pop(key); + + return key; + } + +TBool CVirtualKeyboard::PrepareKeyBmp(CFbsBitmap* aBmp,CFbsBitmapDevice* aDev,const TRect& aRect, + const TRect& aInnerRect,const TAknsItemID& aFrameID, const TAknsItemID& aCenterID, const TRect& aKeyRect) + { + + aBmp->Resize(aRect.Size()); + aDev->Resize(aRect.Size()); + iExt->iKeyGc->Activate(aDev); + iExt->iKeyGc->Resized(); + + TRect r = aRect; + r.Move(-r.iTl.iX, -r.iTl.iY); + + CFbsBitmap* keyBmp = NULL; + TRect inner = aInnerRect; + TPoint off = aInnerRect.iTl - aRect.iTl; + inner.Move(-inner.iTl.iX + off.iX, -inner.iTl.iY + off.iY); + TRAP_IGNORE(keyBmp = PrepareKeyBmpL(iExt->iKeyGc, + UiLayout()->LayoutOwner()->BitmapDevice()->DisplayMode(), + r,inner,aFrameID,aCenterID,aKeyRect)); + if(!keyBmp) + { + return EFalse; + } + + iExt->iKeyGc->BitBlt(TPoint(0,0), keyBmp,r); + + delete keyBmp; + return ETrue; + } + +TBool CVirtualKeyboard::PrepareHighlightKeyBmp(const TRect& aRect, const TRect& aInnerRect, const TRect& aKeyRect) + { + if(HighightKeyBmp()->SizeInPixels() != aRect.Size() || iExt->iHighlightKeyResourceChanged) + { + iExt->iHighlightKeyResourceChanged = EFalse; + return PrepareKeyBmp(HighightKeyBmp(),HighlightKeyDev(),aRect,aInnerRect + ,KeySkinId(EKeyBmpHighlight),KAknsIIDDefault,aKeyRect); + + } + + return ETrue; + } + +TBool CVirtualKeyboard::PrepareNormalKeyBmp(const TRect& aRect, const TRect& aInnerRect, const TRect& aKeyRect) + { + if(NormalKeyBmp()->SizeInPixels() != aRect.Size() || iExt->iNormalKeyResourceChanged) + { + iExt->iNormalKeyResourceChanged = EFalse; + return PrepareKeyBmp(NormalKeyBmp(),NormalKeyDev(),aRect,aInnerRect + ,KeySkinId(EKeyBmpNormal),KAknsIIDDefault,aKeyRect); + + } + + return ETrue; + } + //end of implementation of Class CVirtualKey