diff -r ebd48d2de13c -r ecbabf52600f textinput/peninputcommonctrls/src/peninputbuttons/peninputbutton.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputcommonctrls/src/peninputbuttons/peninputbutton.cpp Wed Sep 01 12:23:33 2010 +0100 @@ -0,0 +1,4293 @@ +/* +* Copyright (c) 2002-2005 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 of button +* +*/ + + +// system includes +#include +#include +#include +#include +#include +#include +#include +// user includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const TInt KInvalidBmp = -1 ; + +//default value for long press timer +const TInt KLongPressInterval = 600000; + +//default value for repeat timer +const TInt KRepeatInterval = 100000; + +//default text color and shadow text color +const TUint32 KDefaultTextColor = 0x000000; +const TUint32 KDefaultShadowTextColor = 0xffffff; +const TInt32 KInvalidResId = -1; +const TInt KInvalidEventId = 0xffff; +//const TInt KFadingParamBlack = 255; +//const TInt KFadingParamWhite = 0; + +const TInt KTransparency[256] = + { + 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, + 14, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 19, + 19, 19, 20, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 23, 24, 24, + 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, + 30, 30, 30, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, + 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 40, 40, 40, + 41, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 46, + 46, 46, 47, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50, 51, 51, + 51, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 56, + 57, 57, 57, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, + 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 67, 67, 67, + 68, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 71, 72, 72, 72, 73, + 73, 73, 74, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77 + }; +// Invalid function icon color group +const TInt KInvalidColorGroup = -1; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CAknFepCtrlButton::CAknFepCtrlButton +// C++ default constructor can NOT contain any code, that +// might leave. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlButton::CAknFepCtrlButton(CFepUiLayout* aUiLayout, TInt aControlId) +: CButtonBase(TRect(), aUiLayout, aControlId), iFirstTimeConstruct(ETrue), iHighlight(EFalse) + { + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlButton::NewL +// Two-phased constructor. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlButton* CAknFepCtrlButton::NewL(CFepUiLayout* aUiLayout, TInt aControlId) + { + CAknFepCtrlButton* self = NewLC(aUiLayout, aControlId); + CleanupStack::Pop(self); + + return self; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlButton::NewLC +// Two-phased constructor. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlButton* CAknFepCtrlButton::NewLC(CFepUiLayout* aUiLayout, TInt aControlId) + { + CAknFepCtrlButton* self = new (ELeave) CAknFepCtrlButton(aUiLayout, aControlId); + CleanupStack::PushL(self); + self->BaseConstructL(); + + return self; + } + +// ----------------------------------------------------------------------------- +// Destructor. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlButton::~CAknFepCtrlButton() + { + iBmpList.Close(); + iMaskBmpList.Close(); + } +// --------------------------------------------------------------------------- +// CAknFepCtrlButton::ConstructFromResourceL +// The order of the image ids in the CButtonBase class must not be changed +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlButton::ConstructFromResourceL(TResourceReader& aReader) + { + if (!iFirstTimeConstruct) + { + iBmpList.Close(); + iMaskBmpList.Close(); + ResetBmpPool(); + } + + TPtrC bmpFileName = aReader.ReadTPtrC(); // Read the file name of the bmps + TInt32 imgMajorSkinId = aReader.ReadInt32(); + TInt colorgroup = aReader.ReadInt16(); + TAknsItemID id; + + for (TInt ii = 0; ii < EBtnBmpLastType + 1; ++ii) + { + // Get the image ids and mask ids from resource + TInt bmpId = aReader.ReadInt16(); + TInt bmpMskId = aReader.ReadInt16(); + + // read skin item id + const TInt skinitemid = aReader.ReadInt16(); + id.Set(TInt(imgMajorSkinId), skinitemid); + + if (bmpId != KInvalidBmp) + { + CFbsBitmap* bmp = NULL; + CFbsBitmap* maskbmp = NULL; + + if (bmpMskId != KInvalidBmp) + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + bmp, + maskbmp, + bmpFileName, + bmpId, + bmpMskId); + + // set maskbmp and size + SetMaskBitmapL(maskbmp, TButtonBmpType(EBtnBmpNonActive + ii)); + iMaskBmpList.Append(maskbmp); + } + else + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + bmp, + bmpFileName, + bmpId); + } + + // set bmp and size + SetBitmapL(bmp, TButtonBmpType(EBtnBmpNonActive + ii)); + iBmpList.Append(bmp); + } + } + + if (!iFirstTimeConstruct) + { + ResizeBitmaps(Rect().Size()); + Draw(); + } + + iFirstTimeConstruct = EFalse; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlButton::ConstructFromResourceL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlButton::ConstructFromResourceL() + { + if (iResourceId == KInvalidResId) + { + User::Leave(KErrArgument); + } + + if (!iFirstTimeConstruct) + { + // need to remove original bmp and maskbmp + iBmpList.Close(); + iMaskBmpList.Close(); + ResetBmpPool(); + } + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId); + + TPtrC bmpFileName = reader.ReadTPtrC(); // Read the file name of the bmps + TInt32 imgMajorSkinId = reader.ReadInt32(); + TInt colorgroup = reader.ReadInt16(); + TAknsItemID id; + + for (TInt ii = 0; ii < EBtnBmpLastType + 1; ++ii) + { + // Get the image ids and mask ids from resource + TInt bmpId = reader.ReadInt16(); + TInt bmpMskId = reader.ReadInt16(); + + // read skin item id + const TInt skinitemid = reader.ReadInt16(); + id.Set(TInt(imgMajorSkinId), skinitemid); + + if (bmpId != KInvalidBmp) + { + CFbsBitmap* bmp = NULL; + CFbsBitmap* maskbmp = NULL; + + if (bmpMskId != KInvalidBmp) + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + bmp, + maskbmp, + bmpFileName, + bmpId, + bmpMskId); + + // set maskbmp and size + SetMaskBitmapL(maskbmp, TButtonBmpType(EBtnBmpNonActive + ii)); + iMaskBmpList.Append(maskbmp); + } + else + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + bmp, + bmpFileName, + bmpId); + } + + // set bmp and size + SetBitmapL(bmp, TButtonBmpType(EBtnBmpNonActive + ii)); + iBmpList.Append(bmp); + } + } + + CleanupStack::PopAndDestroy(); // reader + + if (!iFirstTimeConstruct) + { + ResizeBitmaps(Rect().Size()); + Draw(); + } + + iFirstTimeConstruct = EFalse; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlButton::Draw +// Draws UI +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlButton::Draw() + { + if(!AbleToDraw()) + return; + + if ( !BackgroundBmp() ) + { + CButtonBase::Draw(); + } + + CFbsBitGc* gc = static_cast(BitGc()); + + //mask bitmaps + gc->Activate( MaskBitmapDevice() ); + + gc->SetBrushStyle( CGraphicsContext::ESolidBrush ); + gc->SetBrushColor( TRgb(KOpaqueColor));//Non transparent at all + gc->SetPenStyle(CGraphicsContext::ESolidPen ); + gc->SetPenSize( PenSize()); + gc->SetPenColor( TRgb(KOpaqueColor) ); + gc->DrawRect(Rect()); + + // ----- draw bitmaps ----- + gc->Activate( BitmapDevice() ); + if ( BackgroundBmp() ) + { + TSize size=BackgroundBmp()->SizeInPixels(); + + gc->DrawBitmap(Rect(), BackgroundBmp(),size); + } + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlButton::SetActive +// Set active for the button +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlButton::SetActive(TBool aActiveFlag) + { + if( IsDimmed() ) + { + return; + } + + if(IsActive() != aActiveFlag) + { + CFepUiBaseCtrl::SetActive(aActiveFlag); + if(aActiveFlag || iHighlight) + { + SetBackgroundBmp(Bitmap(EBtnBmpActive,EFalse)); + SetBackgroundMaskBmp(Bitmap(EBtnBmpActive,ETrue)); + //Hide(EFalse); //active button won't be Hiden ??? + } + else + { + SetBackgroundBmp(Bitmap(EBtnBmpNonActive,EFalse)); + SetBackgroundMaskBmp(Bitmap(EBtnBmpNonActive,ETrue)); + } + if(BitGc()) + { + Draw(); + UpdateArea(Rect(),EFalse); + } + } + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlButton::SetHighlight +// Set highlight for the button +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlButton::SetHighlight(TBool aIsHighlight) + { + iHighlight = aIsHighlight; + + if ( iHighlight ) + { + SetBackgroundBmp(Bitmap(EBtnBmpActive,EFalse)); + SetBackgroundMaskBmp(Bitmap(EBtnBmpActive,ETrue)); + } + else + { + SetBackgroundBmp(Bitmap(EBtnBmpNonActive,EFalse)); + SetBackgroundMaskBmp(Bitmap(EBtnBmpNonActive,ETrue)); + } + Draw(); + UpdateArea(Rect(), EFalse); + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlButton::ResizeBitmaps +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepCtrlButton::ResizeBitmaps(TSize aSize) + { + if (iMaskBmpList.Count() >= 1 && + iMaskBmpList[0]->SizeInPixels() != aSize) + { + for( int ii = 0; ii < iMaskBmpList.Count(); ++ii ) + { + AknIconUtils::SetSize(iMaskBmpList[ii], aSize, EAspectRatioNotPreserved); + } + } + + if (iBmpList.Count() >= 1 && + iBmpList[0]->SizeInPixels() != aSize) + { + for( int ii = 0; ii < iBmpList.Count(); ++ii ) + { + AknIconUtils::SetSize(iBmpList[ii], aSize, EAspectRatioNotPreserved); + } + } + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlButton::SizeChanged +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlButton::SizeChanged(TRect aNewRect, TBool aIsReloadImages) + { + if ((aNewRect.Size().iWidth == 0 || aNewRect.Size().iHeight == 0) && + (ControlId() != EPeninupWindowCtrlIdArrowLeftBtn && + ControlId() != EPeninupWindowCtrlIdArrowRightBtn)) + { + return; + } + + SetRect(aNewRect); + + //if (aIsReloadImages) + { + ResizeBitmaps(aNewRect.Size()); + } + + Draw(); + UpdateArea(Rect(), EFalse); + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlButton::HandlePointerLeave +// Handle pointer leave event +// --------------------------------------------------------------------------- +// +void CAknFepCtrlButton::HandlePointerLeave(const TPoint& aPt) + { + if( IsDimmed() ) + return; + if( iHighlight ) + { + SetBackgroundBmp(iActiveBmp); + SetBackgroundMaskBmp(iActiveMaskBmp); + } + + else + { + SetBackgroundBmp(iNonActiveBkBmp); + SetBackgroundMaskBmp(iNonActiveBkMaskBmp); + } + Draw(); + UpdateArea(Rect(), EFalse); + CFepUiBaseCtrl::HandlePointerLeave(aPt); + return ; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlDragButton::CAknFepCtrlDragButton +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlDragButton::CAknFepCtrlDragButton(CFepUiLayout* aUiLayout, TInt aControlId) +: CDragBar(TRect(), aUiLayout, aControlId), iFirstTimeConstruct(ETrue) + { + } + +// ----------------------------------------------------------------------------- +// Destructor. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlDragButton::~CAknFepCtrlDragButton() + { + iBmpList.Close(); + iMaskBmpList.Close(); + + DeleteForgroundRes(); + delete iText; + } + + +// ----------------------------------------------------------------------------- +// CAknFepCtrlDragButton::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlDragButton* CAknFepCtrlDragButton::NewL(CFepUiLayout* aUiLayout, + TInt aControlId) + { + CAknFepCtrlDragButton* self = NewLC(aUiLayout, aControlId); + CleanupStack::Pop(self); + + return self; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlDragButton::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlDragButton* CAknFepCtrlDragButton::NewLC(CFepUiLayout* aUiLayout, + TInt aControlId) + { + CAknFepCtrlDragButton* self = new (ELeave) CAknFepCtrlDragButton(aUiLayout, aControlId); + CleanupStack::PushL(self); + self->ConstructL(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlDragButton::ConstructFromResourceL +// The order of the image ids in the CButtonBase class must not be changed +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlDragButton::ConstructFromResourceL(TResourceReader& aReader) + { + /* + if (!iFirstTimeConstruct) + { + iBmpList.Close(); + iMaskBmpList.Close(); + ResetBmpPool(); + } + + TPtrC bmpFileName = aReader.ReadTPtrC(); + TInt32 imgMajorSkinId = aReader.ReadInt32(); + TAknsItemID id; + + for (TInt ii = 0; ii < EBtnBmpLastType + 1; ++ii) + { + const TInt16 bmpId = aReader.ReadInt16(); + const TInt16 bmpMskId = aReader.ReadInt16(); + + // read skin item id + const TInt skinitemid = aReader.ReadInt16(); + id.Set(TInt(imgMajorSkinId), skinitemid); + + if (bmpId != KInvalidBmp) + { + CFbsBitmap* bmp = NULL; + CFbsBitmap* maskbmp = NULL; + + if (bmpMskId != KInvalidBmp) + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + bmp, + maskbmp, + bmpFileName, + bmpId, + bmpMskId); + + SetMaskBitmapL(maskbmp, TButtonBmpType(EBtnBmpNonActive + ii)); + iMaskBmpList.Append(maskbmp); + } + else + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + bmp, + bmpFileName, + bmpId); + } + + SetBitmapL(bmp, TButtonBmpType(EBtnBmpNonActive + ii)); + iBmpList.Append(bmp); + } + } + + if (!iFirstTimeConstruct) + { + ResizeBitmaps(Rect().Size()); + Draw(); + } + + iFirstTimeConstruct = EFalse;*/ + if (!iFirstTimeConstruct) + { + DeleteForgroundRes(); + } + + TPtrC bmpFileName = aReader.ReadTPtrC(); // Read the file name of the bmps + TInt32 imgMajorSkinId = aReader.ReadInt32(); + TInt colorGroup = aReader.ReadInt16(); + TAknsItemID id; + + // Get the image ids and mask ids from resource + TInt bmpId = aReader.ReadInt16(); + TInt bmpMskId = aReader.ReadInt16(); + + // read skin item id + const TInt skinitemid = aReader.ReadInt16(); + id.Set(TInt(imgMajorSkinId), skinitemid); + + if (bmpId != KInvalidBmp) + { + if (bmpMskId != KInvalidBmp) + { + if( colorGroup == KInvalidColorGroup ) + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + iForgroundBmp, + iForgroundBmpMask, + bmpFileName, + bmpId, + bmpMskId); + } + else + { + AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(), + id, + KAknsIIDQsnIconColors, + colorGroup, + iForgroundBmp, + iForgroundBmpMask, + bmpFileName, + bmpId, + bmpMskId, + AKN_LAF_COLOR( 0 ) ); + } + + AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize(iForgroundBmpMask, iForgroundBmpRect.Size(), + EAspectRatioNotPreserved); + + /*CreateDimmedMaskL( iForgroundDimBmpMask, + iForgroundBmpMask ); + AknIconUtils::SetSize(iForgroundDimBmpMask, iForgroundBmpRect.Size(), + EAspectRatioNotPreserved);*/ + } + else + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + iForgroundBmp, + bmpFileName, + bmpId); + AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved); + } + } + + if (!iFirstTimeConstruct) + { + //ResizeBitmaps(iForgroundBmpRect.Size()); + Draw(); + } + + iFirstTimeConstruct = EFalse; + + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlDragButton::ConstructFromResourceL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlDragButton::ConstructFromResourceL() + { + /* + if (iResourceId == KInvalidResId) + { + User::Leave(KErrArgument); + } + + if (!iFirstTimeConstruct) + { + iBmpList.Close(); + iMaskBmpList.Close(); + ResetBmpPool(); + } + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId); + + TPtrC bmpFileName = reader.ReadTPtrC(); + TInt32 imgMajorSkinId = reader.ReadInt32(); + TAknsItemID id; + + for (TInt ii = 0; ii < EBtnBmpLastType + 1; ++ii) + { + const TInt16 bmpId = reader.ReadInt16(); + const TInt16 bmpMskId = reader.ReadInt16(); + + // read skin item id + const TInt skinitemid = reader.ReadInt16(); + id.Set(TInt(imgMajorSkinId), skinitemid); + + if (bmpId != KInvalidBmp) + { + CFbsBitmap* bmp = NULL; + CFbsBitmap* maskbmp = NULL; + + if (bmpMskId != KInvalidBmp) + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + bmp, + maskbmp, + bmpFileName, + bmpId, + bmpMskId); + + SetMaskBitmapL(maskbmp, TButtonBmpType(EBtnBmpNonActive + ii)); + iMaskBmpList.Append(maskbmp); + } + else + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + bmp, + bmpFileName, + bmpId); + } + + SetBitmapL(bmp, TButtonBmpType(EBtnBmpNonActive + ii)); + iBmpList.Append(bmp); + } + } + + CleanupStack::PopAndDestroy(); // reader + + if (!iFirstTimeConstruct) + { + ResizeBitmaps(Rect().Size()); + Draw(); + } + + iFirstTimeConstruct = EFalse;*/ + if (iResourceId == KInvalidResId) + { + return; + } + + if (!iFirstTimeConstruct) + { + // need to remove original bmp and maskbmp + DeleteForgroundRes(); + } + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId); + + TPtrC bmpFileName = reader.ReadTPtrC(); // Read the file name of the bmps + TInt32 imgMajorSkinId = reader.ReadInt32(); + TInt colorGroup = reader.ReadInt16(); + TAknsItemID id; + + // Get the image ids and mask ids from resource + TInt bmpId = reader.ReadInt16(); + TInt bmpMskId = reader.ReadInt16(); + + // Read skin item id + const TInt skinitemid = reader.ReadInt16(); + id.Set(TInt(imgMajorSkinId), skinitemid); + + if (bmpId != KInvalidBmp) + { + if (bmpMskId != KInvalidBmp) + { + if( colorGroup == KInvalidColorGroup ) + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + iForgroundBmp, + iForgroundBmpMask, + bmpFileName, + bmpId, + bmpMskId); + } + else + { + AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(), + id, + KAknsIIDQsnIconColors, + colorGroup, + iForgroundBmp, + iForgroundBmpMask, + bmpFileName, + bmpId, + bmpMskId, + AKN_LAF_COLOR( 0 ) ); + } + + AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize(iForgroundBmpMask, iForgroundBmpRect.Size(), + EAspectRatioNotPreserved); + + /*CreateDimmedMaskL( iForgroundDimBmpMask, iForgroundBmpMask ); + AknIconUtils::SetSize(iForgroundDimBmpMask, iForgroundBmpRect.Size(), + EAspectRatioNotPreserved);*/ + } + else + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + iForgroundBmp, + bmpFileName, + bmpId); + AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved); + } + } + + CleanupStack::PopAndDestroy(); // reader + + if (!iFirstTimeConstruct) + { + //ResizeBitmaps(iForgroundBmpRect.Size()); + Draw(); + } + + iFirstTimeConstruct = EFalse; + + } + + +// --------------------------------------------------------------------------- +// CAknFepCtrlDragButton::DeleteForgroundRes +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepCtrlDragButton::DeleteForgroundRes() + { + if( iForgroundBmp ) + { + delete iForgroundBmp; + iForgroundBmp = NULL; + } + if( iForgroundBmpMask ) + { + delete iForgroundBmpMask; + iForgroundBmpMask = NULL; + } + if( iForgroundDimBmpMask ) + { + delete iForgroundDimBmpMask; + iForgroundDimBmpMask = NULL; + } + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlDragButton::CreateDimmedMaskL +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepCtrlDragButton::CreateDimmedMaskL( CFbsBitmap*& aDimmedMask, + const CFbsBitmap* aMask + /*TScaleMode aScaleMode*/ ) + { + if (aMask && aMask->DisplayMode() == EGray256) + { + delete aDimmedMask; + aDimmedMask = NULL; + + aDimmedMask = new (ELeave) CFbsBitmap; + + User::LeaveIfError(aDimmedMask->Create(aMask->SizeInPixels(), EGray256)); + CleanupStack::PushL(aDimmedMask); + + CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(aDimmedMask); + CleanupStack::PushL(bitmapDevice); + + CFbsBitGc* bitGc(NULL); + User::LeaveIfError(bitmapDevice->CreateContext(bitGc)); + CleanupStack::PushL(bitGc); + + bitGc->SetPenStyle(CGraphicsContext::ESolidPen); + bitGc->BitBlt(TPoint(0, 0), aMask); + + aDimmedMask->LockHeap(); + TInt w = aMask->SizeInPixels().iWidth; + TInt h = aMask->SizeInPixels().iHeight; + TInt dataStride = aMask->DataStride() - w; + unsigned char* address = (unsigned char *)aDimmedMask->DataAddress(); + + for ( TInt i = 0; i < h; ++i ) + { + for ( TInt j = 0; j < w; ++j ) + { + *address = KTransparency[*address]; + ++address; + } + address += dataStride; + } + + aDimmedMask->UnlockHeap(); + + //AknIconUtils::SetSize(aDimmedMask, aMask->SizeInPixels(), aScaleMode); + + CleanupStack::PopAndDestroy(2); // bitmapDevice, bitGc + CleanupStack::Pop(1); // aDimmedMask + } + + } + + +// --------------------------------------------------------------------------- +// CAknFepCtrlDragButton::SetForgroundBmpRect +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlDragButton::SetForgroundBmpRect(const TRect& aRect) + { + iForgroundBmpRect = aRect; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlDragButton::SetForegroundBmpL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlDragButton::SetForegroundBmpL(CFbsBitmap* aBmp, + CFbsBitmap* aMaskBmp) + { + DeleteForgroundRes(); + + iForgroundBmp = aBmp; + iForgroundBmpMask = aMaskBmp; + + ResizeBitmaps(iForgroundBmpRect.Size()); + } + +EXPORT_C void CAknFepCtrlDragButton::Move(const TPoint& aOffset) + { + CButtonBase::Move(aOffset); + iForgroundBmpRect.Move( aOffset ); + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlDragButton::HandlePointerDownEventL +// Handle button down event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CAknFepCtrlDragButton::HandlePointerDownEventL(const TPoint& aPt) + { + if( IsDimmed() ) + return NULL; + + CDragBar::HandlePointerDownEventL(aPt); + + SetReady(ETrue); + Draw(); + UpdateArea(Rect(),EFalse); + ReportEvent(EEventButtonDown); + return this; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlDragButton::Draw +// Draws UI +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlDragButton::Draw() + { + if(!AbleToDraw()) + return; + + CFbsBitGc* gc = static_cast(BitGc()); + + //mask bitmaps + DrawOpaqueMaskBackground(); + TRect rect = Rect(); + TRect innerRect = rect; + innerRect.Shrink( 10, 10 ); + + // ----- draw bitmaps ----- + gc->Activate( BitmapDevice() ); + //gc->Clear(rect); + + CFbsBitmap* bmpMask = NULL; + + // Draw background + if( IsDimmed() ) // Dimmed state + { + AknsDrawUtils::DrawFrame( UiLayout()->SkinInstance(), + *gc, + rect, + innerRect, + iInactiveImgID, + KAknsIIDDefault ); + if( iForgroundDimBmpMask ) + { + delete iForgroundDimBmpMask; + iForgroundDimBmpMask = NULL; + } + TRAP_IGNORE(CreateDimmedMaskL( iForgroundDimBmpMask, + iForgroundBmpMask )); + AknIconUtils::SetSize(iForgroundDimBmpMask, iForgroundBmpRect.Size(), + EAspectRatioNotPreserved); + bmpMask = iForgroundDimBmpMask; + } + else + { + // Normal state or pressed state + TAknsItemID ImgID = (IsDragging() | PointerDown()) ? iPressedImgID : iNormalImgID; + AknsDrawUtils::DrawFrame( UiLayout()->SkinInstance(), + *gc, + rect, + innerRect, + ImgID, + KAknsIIDDefault ); + bmpMask = iForgroundBmpMask; + } + + // Draw forground + if( iForgroundBmp ) + { + TRect srcRect( TPoint( 0, 0 ), iForgroundBmp->SizeInPixels() ); + if( bmpMask ) + { + gc->BitBltMasked( iForgroundBmpRect.iTl, + iForgroundBmp, + srcRect, + bmpMask, + EFalse); + } + else + { + gc->BitBlt( iForgroundBmpRect.iTl, + iForgroundBmp, + srcRect ); + } + } + + if (iText) + { + TAknLayoutText textLayout; + textLayout.LayoutText(Rect(), iTextFormat); + textLayout.DrawText(*gc, *iText); + } + } + + +// ----------------------------------------------------------------------------- +// CAknFepCtrlDragButton::ResizeBitmaps +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepCtrlDragButton::ResizeBitmaps(TSize aInnerSize) + { + /* + if (iMaskBmpList.Count() >= 1 && + iMaskBmpList[0]->SizeInPixels() != aSize) + { + for( TInt ii = 0; ii < iMaskBmpList.Count(); ++ii ) + { + AknIconUtils::SetSize(iMaskBmpList[ii], aSize, EAspectRatioNotPreserved); + } + } + + if (iBmpList.Count() >= 1 && + iBmpList[0]->SizeInPixels() != aSize) + { + for( TInt ii = 0; ii < iBmpList.Count(); ++ii ) + { + AknIconUtils::SetSize(iBmpList[ii], aSize, EAspectRatioNotPreserved); + } + }*/ + if( iForgroundBmp && ( iForgroundBmp->SizeInPixels() != aInnerSize ) ) + { + AknIconUtils::SetSize( iForgroundBmp, aInnerSize, EAspectRatioNotPreserved ); + } + if( iForgroundBmpMask && ( iForgroundBmpMask->SizeInPixels() != aInnerSize ) ) + { + AknIconUtils::SetSize( iForgroundBmpMask, aInnerSize, EAspectRatioNotPreserved ); + } + + /*TRAP_IGNORE(CreateDimmedMaskL(iForgroundDimBmpMask, + iForgroundBmpMask)); */ + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlDragButton::SizeChanged +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlDragButton::SizeChanged(TRect aNewRect, + TRect aInnerRect, + TBool aIsReloadImages) + { + // Reset the position and the extent of the button aera + /*if (aNewRect.Size().iWidth == 0 || aNewRect.Size().iHeight == 0) + { + return; + } + + SetRect(aNewRect); + + if (aIsReloadImages) + { + ResizeBitmaps(aNewRect.Size()); + } + + Draw(); + UpdateArea(Rect(), ETrue);*/ + + if (aNewRect.Size().iWidth == 0 || aNewRect.Size().iHeight == 0) + { + return; + } + + TRect oriRect = Rect(); + SetRect(aNewRect); + iForgroundBmpRect = aInnerRect; + + if (aIsReloadImages) + { + ResizeBitmaps(aInnerRect.Size() ); + } + RootControl()->ReDrawRect( oriRect ); + UpdateArea(oriRect, EFalse); + Draw(); + UpdateArea(Rect(), EFalse); + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::CAknFepCtrlMultiModeButton +// C++ default constructor can NOT contain any code, that +// might leave. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlMultiModeButton::CAknFepCtrlMultiModeButton(CFepUiLayout* aUiLayout, + TInt aControlId,TAknsItemID aNormalID, + TAknsItemID aPressedID,TAknsItemID aInactiveID) + : CAknFepCtrlCommonButton(aUiLayout, aControlId, aNormalID, aPressedID, aInactiveID) + { + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::NewL +// Two-phased constructor. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlMultiModeButton* CAknFepCtrlMultiModeButton::NewL(CFepUiLayout* aUiLayout, + TInt aControlId,TAknsItemID aNormalID, + TAknsItemID aPressedID,TAknsItemID aInactiveID) + { + CAknFepCtrlMultiModeButton* self = NewLC(aUiLayout, aControlId, + aNormalID, aPressedID, aInactiveID); + CleanupStack::Pop(self); + + return self; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::NewLC +// Two-phased constructor. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlMultiModeButton* CAknFepCtrlMultiModeButton::NewLC(CFepUiLayout* aUiLayout, + TInt aControlId,TAknsItemID aNormalID, + TAknsItemID aPressedID,TAknsItemID aInactiveID) + { + CAknFepCtrlMultiModeButton* self = new (ELeave) CAknFepCtrlMultiModeButton(aUiLayout, + aControlId, + aNormalID, + aPressedID, + aInactiveID); + CleanupStack::PushL(self); + self->BaseConstructL(); + + return self; + } + +// ----------------------------------------------------------------------------- +// Destructor. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlMultiModeButton::~CAknFepCtrlMultiModeButton() + { + iImageResIdList.Close(); + iForegroundBmpList.ResetAndDestroy(); + iForegroundBmpList.Close(); + iForegroundMaskBmpList.ResetAndDestroy(); + iForegroundMaskBmpList.Close(); + + iModeTextList.ResetAndDestroy(); + iModeTextList.Close(); + + iModesList.ResetAndDestroy(); + iModesList.Close(); + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::ConstructFromResourceL +// The order of the image ids in the CButtonBase class must not be changed +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + +EXPORT_C void CAknFepCtrlMultiModeButton::ConstructFromResourceL(TResourceReader& aReader) + { + if (!iFirstTimeConstruct) + { + iImageResIdList.Close(); + iForegroundBmpList.ResetAndDestroy(); + iForegroundBmpList.Close(); + iForegroundMaskBmpList.ResetAndDestroy(); + iForegroundMaskBmpList.Close(); + + iModeTextList.ResetAndDestroy(); + iModeTextList.Close(); + + + iModesList.ResetAndDestroy(); + iModesList.Close(); + + ResetBmpPool(); + } + + // read text color and shadow text color + TInt32 colorMajorSkinId = aReader.ReadInt32(); + const TInt skinitemid = aReader.ReadInt16(); + TInt textcoloridx = aReader.ReadInt16(); + TInt shadowtextcoloridx = aReader.ReadInt16(); + + TAknsItemID id; + + id.Set(TInt(colorMajorSkinId), skinitemid); + TInt error = AknsUtils::GetCachedColor(UiLayout()->SkinInstance(), + iFontColor, + id, + textcoloridx); + + if (error != KErrNone) + { + iFontColor = TRgb(KDefaultTextColor); + } + + SetFontColor(iFontColor); + + error = AknsUtils::GetCachedColor(UiLayout()->SkinInstance(), + iShadowFontColor, + id, + shadowtextcoloridx); + + if (error != KErrNone) + { + iShadowFontColor = TRgb(KDefaultShadowTextColor); + } + + SetShadowFontColor(iShadowFontColor); + + const TInt16 countModes = aReader.ReadInt16(); // Read the count of different cases + + if (countModes <= 0) + { + User::Leave(KErrArgument); + } + + iNumberOfModes = 0; + + for (TInt ii = 0; ii < countModes; ii++) + { + AddModeL(aReader); + iNumberOfModes++; + } + + if (iFirstTimeConstruct) + { + if (iImageResIdList.Count() == 1) + { + // set background bimap for button + SetButtonBmpL(EBtnBmpNonActive, 0); + iCurrentBmpType = EBtnBmpNonActive; + } + + const TInt16 defaultModeIndex = aReader.ReadInt16(); + SetCurrentModeL(EBtnBmpNonActive, defaultModeIndex); + } + else + { + SetButtonBmpL(iCurrentBmpType, iCurrentMode); + Draw(); + } + + iFirstTimeConstruct = EFalse; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::ConstructFromResourceL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + +EXPORT_C void CAknFepCtrlMultiModeButton::ConstructFromResourceL() + { + if (iResourceId == KInvalidResId) + { + return; + } + + if (!iFirstTimeConstruct) + { + iImageResIdList.Close(); + iForegroundBmpList.ResetAndDestroy(); + iForegroundBmpList.Close(); + iForegroundMaskBmpList.ResetAndDestroy(); + iForegroundMaskBmpList.Close(); + + iModeTextList.ResetAndDestroy(); + iModeTextList.Close(); + + + iModesList.ResetAndDestroy(); + iModesList.Close(); + + ResetBmpPool(); + } + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId); + + // read text color and shadow text color + TInt32 colorMajorSkinId = reader.ReadInt32(); + const TInt skinitemid = reader.ReadInt16(); + TInt textcoloridx = reader.ReadInt16(); + TInt shadowtextcoloridx = reader.ReadInt16(); + + TAknsItemID id; + + id.Set(TInt(colorMajorSkinId), skinitemid); + TInt error = AknsUtils::GetCachedColor(UiLayout()->SkinInstance(), + iFontColor, + id, + textcoloridx); + + if (error != KErrNone) + { + iFontColor = TRgb(KDefaultTextColor); + } + + SetFontColor(iFontColor); + + error = AknsUtils::GetCachedColor(UiLayout()->SkinInstance(), + iShadowFontColor, + id, + shadowtextcoloridx); + + if (error != KErrNone) + { + iShadowFontColor = TRgb(KDefaultShadowTextColor); + } + + SetShadowFontColor(iShadowFontColor); + + const TInt16 countModes = reader.ReadInt16(); + + if (countModes <= 0) + { + User::Leave(KErrArgument); + } + + iNumberOfModes = 0; + + for (TInt ii = 0; ii < countModes; ii++) + { + AddModeL(reader); + iNumberOfModes++; + } + + + if (iFirstTimeConstruct) + { + if (iImageResIdList.Count() == 1) + { + // set background bimap for button + SetButtonBmpL(EBtnBmpNonActive, 0); + iCurrentBmpType = EBtnBmpNonActive; + } + + const TInt16 defaultModeIndex = reader.ReadInt16(); + SetCurrentModeL(EBtnBmpNonActive, defaultModeIndex); + } + else + { + ResizeBitmaps(iForgroundBmpRect.Size()); + SetButtonBmpL(iCurrentBmpType, iCurrentMode); + Draw(); + } + + CleanupStack::PopAndDestroy(); // reader + + iFirstTimeConstruct = EFalse; + + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::AddModeL +// Add new display mode from resource reader +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlMultiModeButton::AddModeL(TResourceReader& aReader) + { + const TInt32 imageResId = aReader.ReadInt32(); + iModeTextList.Append(aReader.ReadHBufCL()); + const TInt rangeId = aReader.ReadInt16(); + const TInt modeId = aReader.ReadInt16(); + + TAknFepModeIndicator* modeIndicator = new (ELeave) TAknFepModeIndicator; + CleanupStack::PushL(modeIndicator); + + modeIndicator->iRangeId = rangeId; + modeIndicator->iModeId = modeId; + modeIndicator->iPermitted = ETrue; + + iModesList.AppendL(modeIndicator); + CleanupStack::Pop(modeIndicator); // indicator + + if ( imageResId != KInvalidBmp ) + { + // switch mode means change image + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, imageResId); + + TPtrC bmpFileName = reader.ReadTPtrC(); + TInt32 imgMajorSkinId = reader.ReadInt32(); + TInt colorGroup = reader.ReadInt16(); + TAknsItemID id; + + for (TInt jj = 0; jj < /*EBtnBmpLastType +*/ 1; jj++) + { + const TInt16 bmpId = reader.ReadInt16(); + const TInt16 bmpMskId = reader.ReadInt16(); + const TInt16 skinitemid = reader.ReadInt16(); + id.Set(TInt(imgMajorSkinId), skinitemid); + + if (bmpId != KInvalidBmp) + { + CFbsBitmap* bmp = NULL; + CFbsBitmap* maskbmp = NULL; + + if (bmpMskId != KInvalidBmp) + { + if( colorGroup == KInvalidColorGroup ) + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + bmp, + maskbmp, + bmpFileName, + bmpId, + bmpMskId); + } + else + { + AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(), + id, + KAknsIIDQsnIconColors, + colorGroup, + bmp, + maskbmp, + bmpFileName, + bmpId, + bmpMskId, + AKN_LAF_COLOR( 0 ) ); + + } + CleanupStack::PushL(maskbmp); + AknIconUtils::SetSize(maskbmp, iForgroundBmpRect.Size(), + EAspectRatioNotPreserved); + iForegroundMaskBmpList.AppendL(maskbmp); + CleanupStack::Pop(maskbmp); + + } + else + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + bmp, + bmpFileName, + bmpId); + + } + + CleanupStack::PushL(bmp); + AknIconUtils::SetSize(bmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved); + iForegroundBmpList.AppendL(bmp); + CleanupStack::Pop(bmp); + + } + } + + CleanupStack::PopAndDestroy(); //reader + + iImageResIdList.Append(imageResId); + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::SetButtonBmp +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlMultiModeButton::SetButtonBmpL(const TButtonBmpType aType , + const TInt aMode) + { + if ( !ForgroundBmp() || + ForgroundBmp()->Handle() != iForegroundBmpList[aMode]->Handle() || + !ForgroundBmpMask() || + ForgroundBmpMask()->Handle() != iForegroundMaskBmpList[aMode]->Handle() ) + { + CFbsBitmap* bmp = new (ELeave) CFbsBitmap; + if(iForegroundMaskBmpList.Count() > 0 && iForegroundBmpList[aMode]) + { + CleanupStack::PushL( bmp ); + + User::LeaveIfError(bmp->Duplicate(iForegroundBmpList[aMode]->Handle())); + + CleanupStack::Pop( bmp ); + } + else + { + delete bmp; + bmp = NULL; + } + CFbsBitmap* maskbmp = new (ELeave) CFbsBitmap; + + if(iForegroundMaskBmpList.Count() > 0 && iForegroundMaskBmpList[aMode]) + { + CleanupStack::PushL( maskbmp ); + User::LeaveIfError(maskbmp->Duplicate(iForegroundMaskBmpList[aMode]->Handle())); + CleanupStack::Pop( maskbmp ); + } + else + { + delete maskbmp; + maskbmp = NULL; + } + SetForegroundBmpL(bmp,maskbmp); + } + else if ( ForgroundBmp()->SizeInPixels() != iForegroundBmpList[aMode]->SizeInPixels() || + ForgroundBmpMask()->SizeInPixels() != iForegroundMaskBmpList[aMode]->SizeInPixels()) + { + ResizeBitmaps(iForegroundBmpList[aMode]->SizeInPixels()); + } + + if(aType == EBtnBmpActivePressed + || aType == EBtnBmpNonActivePressed) + { + SetHighlight(ETrue); + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::SetCurrentModeL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlMultiModeButton::SetCurrentModeL(const TButtonBmpType aType, + const TInt aModeIndex) + { + if ((aModeIndex >= 0) && + (aModeIndex <= NumberOfModes()-1) && + (iModesList[aModeIndex]->iPermitted)) + { + iCurrentMode = aModeIndex; + + if (iImageResIdList.Count() > 1) + { + // change mode means change image + SetButtonBmpL(aType, iCurrentMode); + iCurrentBmpType = aType; + } + + Draw(); + UpdateArea(Rect()); + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::NextMode +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CAknFepCtrlMultiModeButton::NextMode() const + { + TInt startIndex = 0; + + if (iCurrentMode < (NumberOfModes() -1)) + { + startIndex = iCurrentMode + 1; + } + + TBool find = EFalse; + + while (!find && (startIndex != iCurrentMode)) + { + if (iModesList[startIndex]->iPermitted) + { + find = ETrue; + } + else + { + startIndex++; + + if (startIndex > (NumberOfModes()-1)) + { + startIndex = 0; + } + } + } + + if (find) + { + return startIndex; + } + else + { + return iCurrentMode; + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::ImageAlreadyExist +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CAknFepCtrlMultiModeButton::ImageAlreadyExist(const TInt32 aResId) + { + TBool findResId = EFalse; + + for (TInt i=0; iUseFont(iShadowFont); + + BitGc()->SetBrushStyle( CGraphicsContext::ENullBrush ); + BitGc()->SetBrushColor( KRgbBlack);//Non transparent at all + BitGc()->SetPenColor(iShadowFontColor); + BitGc()->SetPenStyle(CGraphicsContext::ESolidPen); + BitGc()->SetPenSize( PenSize()); + + TPoint pointText; + TPoint pointShadowText; + + TInt leftMarginOfText = + (Rect().Width() - iFont->TextWidthInPixels(*(iModeTextList[iCurrentMode])))/2; + + pointText.iX = Rect().iTl.iX + leftMarginOfText; + pointText.iY = Rect().iTl.iY + Rect().Height()*3/4; + + pointShadowText.iX = pointText.iX + 1; + pointShadowText.iY = pointText.iY + 1; + + //BitGc()->DrawText(*(iModeTextList[iCurrentMode]), Rect(), Rect().Height()*3/4, CGraphicsContext::ECenter, Rect().Width()/2 - iFont->TextWidthInPixels(*(iModeTextList[iCurrentMode]))/2); + BitGc()->DrawText(*(iModeTextList[iCurrentMode]), pointShadowText); + + BitGc()->DiscardFont(); + + // draw text + BitGc()->UseFont(iFont); + + BitGc()->SetBrushStyle( CGraphicsContext::ENullBrush ); + BitGc()->SetBrushColor( KRgbBlack);//Non transparent at all + BitGc()->SetPenColor(iFontColor); + BitGc()->SetPenStyle(CGraphicsContext::ESolidPen); + BitGc()->SetPenSize( PenSize()); + + //BitGc()->DrawText(*(iModeTextList[iCurrentMode]), Rect(), Rect().Height()*3/4+1, CGraphicsContext::ECenter, Rect().Width()/2 - iFont->TextWidthInPixels(*(iModeTextList[iCurrentMode]))/2-1); + BitGc()->DrawText(*(iModeTextList[iCurrentMode]), pointText); + + BitGc()->DiscardFont(); + + //BitGc()->SetPenStyle(CGraphicsContext::ENullPen); + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::Draw +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlMultiModeButton::Draw() + { + if(!AbleToDraw()) + return; + + CAknFepCtrlCommonButton::Draw(); + //CButtonBase::Draw(); + if ( iModeTextList.Count() ) + { + if ((iModeTextList[iCurrentMode]) && (iModeTextList[iCurrentMode]->Length() > 0)) + { + DisplayText(); + } + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::SetFontColor +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlMultiModeButton::SetFontColor(const TRgb aFontColor) + { + iFontColor = aFontColor; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::SetShadowFontColor +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlMultiModeButton::SetShadowFontColor(const TRgb aShadowFontColor) + { + iShadowFontColor = aShadowFontColor; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::SetPermittedModes +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CAknFepCtrlMultiModeButton::SetPermittedModes(const TInt aRangeId, + const TInt aRealCaseId, + TBool aPermit) + { + for (TInt i = 0; i < iModesList.Count(); i++) + { + if ((iModesList[i]->iRangeId == aRangeId) && (iModesList[i]->iModeId == aRealCaseId)) + { + iModesList[i]->iPermitted = aPermit; + + return KErrNone; + } + } + + return KErrNotSupported; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::SetPermittedRange +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CAknFepCtrlMultiModeButton::SetPermittedRange(const TInt aRangeId, TBool aPermit) + { + TBool findRangeId = EFalse; + + for (TInt i = 0; i < iModesList.Count(); i++) + { + if ((iModesList[i]->iRangeId == aRangeId) && (iModesList[i]->iPermitted != aPermit)) + { + iModesList[i]->iPermitted = aPermit; + findRangeId = ETrue; + } + } + + if (!findRangeId) + { + return KErrNotSupported; + } + else + { + return KErrNone; + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::EnableAllModes +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlMultiModeButton::EnableAllModes() + { + for (TInt i = 0; i < iModesList.Count(); i++) + { + iModesList[i]->iPermitted = ETrue; + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::DisableAllModes +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlMultiModeButton::DisableAllModes() + { + for (TInt i = 0; i < iModesList.Count(); i++) + { + iModesList[i]->iPermitted = EFalse; + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::DisableAllModes +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlMultiModeButton::DisableOneModes(const TInt aRangeId) + { + for (TInt i = 0; i < iModesList.Count(); i++) + { + if(iModesList[i]->iRangeId == aRangeId) + { + iModesList[i]->iPermitted = EFalse; + TRAP_IGNORE(SetCurrentModeL(EBtnBmpNonActive, NextMode())); + } + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::IsGivenRangeSupported +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CAknFepCtrlMultiModeButton::IsGivenRangeSupported(const TInt aRange) + { + for (TInt i = 0; i < iModesList.Count(); i++) + { + // judge if aRange is supported by at least 1 mode + if ((iModesList[i]->iRangeId == aRange) && (iModesList[i]->iPermitted)) + { + return ETrue; + } + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::SetRange +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CAknFepCtrlMultiModeButton::SetRange(const TInt aRange) + { + if (CurrentRange() != aRange) + { + for (TInt i = 0; i < iModesList.Count(); i++) + { + if ((iModesList[i]->iRangeId == aRange) && + (iModesList[i]->iPermitted)) + { + TRAP_IGNORE(SetCurrentModeL(EBtnBmpActive, i)); + return KErrNone; + } + } + } + + return KErrNotSupported; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::CurrentRange +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CAknFepCtrlMultiModeButton::CurrentRange() const + { + if ((iCurrentMode >= 0) && (iCurrentMode <= (NumberOfModes()-1))) + { + return iModesList[iCurrentMode]->iRangeId; + } + else + { + return KErrNotFound; + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::RangeOfGivenMode() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CAknFepCtrlMultiModeButton::RangeOfGivenMode(TInt aModeIndex) const + { + if ((aModeIndex >= 0) && (aModeIndex <= NumberOfModes()-1)) + { + return iModesList[aModeIndex]->iRangeId; + } + + return KErrNotSupported; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::GetRealCaseByMode() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CAknFepCtrlMultiModeButton::GetRealCaseByMode(TInt aModeIndex) const + { + if ((aModeIndex >= 0) && (aModeIndex <= NumberOfModes() -1)) + { + return iModesList[aModeIndex]->iModeId; + } + + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::GetRangeListL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepCtrlMultiModeButton::GetRangeListL(RArray& aList) + { + CleanupClosePushL( aList ); + for (TInt i = 0; i < NumberOfModes(); i++) + { + if (aList.Find(iModesList[i]->iRangeId) == KErrNotFound) + { + aList.AppendL(iModesList[i]->iRangeId); + } + } + CleanupStack::Pop(); + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::DuplicateBitmapL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CFbsBitmap* CAknFepCtrlMultiModeButton::DuplicateBitmapL(CFbsBitmap* aSourceBmp) + { + CFbsBitmap* bmp = new (ELeave) CFbsBitmap; + CleanupStack::PushL( bmp ); + + User::LeaveIfError(bmp->Duplicate(aSourceBmp->Handle())); + + CleanupStack::Pop( bmp ); + //iOwnedBitmaps.InsertInAddressOrder(bmp); + return bmp; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlMultiModeButton::ResizeBitmaps +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepCtrlMultiModeButton::ResizeBitmaps(TSize aSize) + { + if(iForegroundBmpList.Count() >= 1 && iForegroundBmpList[0]->SizeInPixels() != aSize + || iForegroundMaskBmpList.Count() >= 1 && iForegroundMaskBmpList[0]->SizeInPixels() != aSize) + { + for (TInt i=0; iBaseConstructL(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::CAknFepCtrlEventButton +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlEventButton::CAknFepCtrlEventButton(CFepUiLayout* aUiLayout, + TInt aControlId, + TInt aEvent, + TInt aUnicode, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID) + : CAknFepCtrlCommonButton(aUiLayout, aControlId, aNormalID, aPressedID, aInactiveID), + iEvent(aEvent),iUnicode(aUnicode),iText(NULL) + { + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::~CAknFepCtrlEventButton +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlEventButton::~CAknFepCtrlEventButton() + { + delete iText; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::HandlePointerUpEventL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CAknFepCtrlEventButton::HandlePointerUpEventL(const TPoint& aPoint) + { + if (iEvent == 0xFFFF) + { + return CAknFepCtrlCommonButton::HandlePointerUpEventL(aPoint); + } + else + { + CAknFepCtrlCommonButton::HandlePointerUpEventL(aPoint); + if(IsDimmed()) + { + return NULL; + } + + if(IsActive()) + { + SetBackgroundBmp(Bitmap(EBtnBmpActive,EFalse)); + SetBackgroundMaskBmp(Bitmap(EBtnBmpActive,ETrue)); + } + else + { + SetBackgroundBmp(Bitmap(EBtnBmpNonActive,EFalse)); + SetBackgroundMaskBmp(Bitmap(EBtnBmpNonActive,ETrue)); + } + + SetActive(ETrue); + Draw(); + UpdateArea(Rect(),EFalse); + + TPtrC ptr = (TUint16*)(&iUnicode); + ReportEvent(iEvent,ptr); + + return this; + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::DisplayText +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlEventButton::DisplayText() + { + if ((iFont) && (iShadowFont)) + { + CFbsBitGc* gc = static_cast(BitGc()); + + gc->Activate(BitmapDevice()); + + // draw shadow text + gc->UseFont(iShadowFont); + + gc->SetBrushStyle( CGraphicsContext::ENullBrush ); + gc->SetBrushColor( KRgbBlack);//Non transparent at all + gc->SetPenColor(iShadowFontColor); + gc->SetPenStyle(CGraphicsContext::ESolidPen); + gc->SetPenSize( PenSize()); + + TPoint pointText; + TPoint pointShadowText; + + TInt leftMarginOfText = (Rect().Width() - iFont->TextWidthInPixels(*iText))/2; + + pointText.iX = Rect().iTl.iX + leftMarginOfText; + pointText.iY = Rect().iTl.iY + Rect().Height()*3/4; + + pointShadowText.iX = pointText.iX + 1; + pointShadowText.iY = pointText.iY + 1; + + gc->DrawText(*iText, pointShadowText); + + gc->DiscardFont(); + + // draw text + gc->UseFont(iFont); + + gc->SetBrushStyle( CGraphicsContext::ENullBrush ); + gc->SetBrushColor( KRgbBlack);//Non transparent at all + gc->SetPenColor(iFontColor); + gc->SetPenStyle(CGraphicsContext::ESolidPen); + gc->SetPenSize( PenSize()); + + gc->DrawText(*iText, pointText); + + gc->DiscardFont(); + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::SetFontColor +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlEventButton::SetFontColor(const TRgb aColor) + { + iFontColor = aColor; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::SetShadowFontColor +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlEventButton::SetShadowFontColor(const TRgb aColor) + { + iShadowFontColor = aColor; + } + + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::Draw +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlEventButton::Draw() + { + if(!AbleToDraw()) + return; + + CAknFepCtrlCommonButton::Draw(); + + if ( iText && (iText->Length() > 0 ) ) + { + DisplayText(); + } + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::SetText +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlEventButton::SetText(const TDesC& aText) + { + if ( iText ) + { + delete iText; + iText = NULL; + } + TRAPD(err, iText = aText.AllocL()); + if (err != KErrNone) + { + iText = NULL; + } + Draw(); + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::SetFont +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlEventButton::SetFont(const CFont* aFont) + { + iFont = aFont; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::SetShadowFont +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlEventButton::SetShadowFont(const CFont* aFont) + { + iShadowFont = aFont; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::Event +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CAknFepCtrlEventButton::Event() const + { + return iEvent; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::Unicode +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CAknFepCtrlEventButton::Unicode() const + { + return iUnicode; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::SetEvent +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlEventButton::SetEvent(TInt aEvent) + { + iEvent = aEvent; + } + +// ----------------------------------------------------------------------------- +// CAknFepCtrlEventButton::SetUnicode +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlEventButton::SetUnicode(TInt aUnicode) + { + iUnicode = aUnicode; + } + +// --------------------------------------------------------- +// Constructor +// --------------------------------------------------------- +// +EXPORT_C CAknFepCtrlRepeatButton* CAknFepCtrlRepeatButton::NewLC(CFepUiLayout* aUiLayout, + TInt aCtrlId, + TInt aEvent, + TInt aUnicode, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID) + { + //PRINTF((_L("CAknFepCtrlRepeatButton::NewLC(), aCtrlId = %d\n"), aCtrlId)); + CAknFepCtrlRepeatButton *self = new(ELeave) CAknFepCtrlRepeatButton(aUiLayout, + aCtrlId, + aEvent, + aUnicode, + aNormalID, + aPressedID, + aInactiveID); + + CleanupStack::PushL(self); + self->ConstructL(); + + return self; + } + +// --------------------------------------------------------- +// Constructor +// --------------------------------------------------------- +// +EXPORT_C CAknFepCtrlRepeatButton* CAknFepCtrlRepeatButton::NewL(CFepUiLayout* aUiLayout, + TInt aCtrlId, + TInt aEvent, + TInt aUnicode, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID) + { + //PRINTF((_L("CAknFepCtrlRepeatButton::NewL(), aCtrlId = %d\n"), aCtrlId)); + CAknFepCtrlRepeatButton *self = NewLC(aUiLayout, aCtrlId, aEvent, aUnicode, + aNormalID, aPressedID, aInactiveID); + CleanupStack::Pop(self); + + return self; + } + +// --------------------------------------------------------- +// Destructor +// --------------------------------------------------------- +// +EXPORT_C CAknFepCtrlRepeatButton::~CAknFepCtrlRepeatButton() + { + //PRINTF((_L("CAknFepCtrlRepeatButton::~CAknFepCtrlRepeatButton()\n"))); + CancelRepeat(); + + delete iLongPressTimer; + delete iRepeatTimer; + } + +// --------------------------------------------------------- +// Constructor +// --------------------------------------------------------- +// +EXPORT_C CAknFepCtrlRepeatButton::CAknFepCtrlRepeatButton(CFepUiLayout* aUiLayout, + TInt aCtrlId, + TInt aEvent, + TInt aUnicode, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID) + :CAknFepCtrlEventButton(aUiLayout, aCtrlId, aEvent, aUnicode, + aNormalID, + aPressedID, + aInactiveID) + { + iLongPressInterval = KLongPressInterval; + iRepeatInterval = KRepeatInterval; + } + +// --------------------------------------------------------- +// Constructor +// --------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlRepeatButton::ConstructL() + { + //PRINTF((_L("CAknFepCtrlRepeatButton::ConstructL()\n"))); + BaseConstructL(); + + iLongPressTimer = CAknFepTimer::NewL(this); + iRepeatTimer = CAknFepTimer::NewL(this); + } + +// --------------------------------------------------------- +// Time out event handler of both long press timer & repeat timer +// --------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlRepeatButton::HandleTimerOut(const CAknFepTimer* aTimer) + { + //PRINTF((_L("CAknFepCtrlRepeatButton::HandleTimerOut()--"))); + if (aTimer == iLongPressTimer) + { + //PRINTF((_L("long press timer timeout\n"))); + iRepeatTimer->SetTimer(iRepeatInterval); + } + else + { + if (aTimer == iRepeatTimer) + { + //PRINTF((_L("repeat timer timeout: EEventButtonUp reported\n"))); + if ( Unicode() ) + { + TInt unicode = Unicode(); + TPtrC ptr = (TUint16*)(&unicode ) ; + ReportEvent(Event(),ptr); +#ifdef RD_TACTILE_FEEDBACK + if (UiLayout()->SupportTactileFeedback()) + { + UiLayout()->DoTactileFeedback(ETouchFeedbackSensitiveInput); + } +#endif //RD_TACTILE_FEEDBACK + } + else + { + ReportEvent(EEventButtonUp); + } + iRepeatTimer->SetTimer(iRepeatInterval); + } + } + } + +// --------------------------------------------------------- +// Handle button down start long press timer +// --------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CAknFepCtrlRepeatButton::HandlePointerDownEventL(const TPoint& aPt) + { + //PRINTF((_L("CAknFepCtrlRepeatButton::HandleButtonDown()\n"))); + + //PRINTF((_L("Set long press Timer\n"))); + if( IsDimmed() ) + { + return NULL; + } + iLongPressTimer->SetTimer(iLongPressInterval); + TInt unicode = Unicode(); + TPtrC ptr = (TUint16*)(&unicode); + ReportEvent(Event(), ptr); + return CAknFepCtrlCommonButton::HandlePointerDownEventL(aPt); + } + +// --------------------------------------------------------- +// Handle button up cancel timers +// --------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CAknFepCtrlRepeatButton::HandlePointerUpEventL(const TPoint& aPt) + { + //PRINTF((_L("CAknFepCtrlRepeatButton::HandleButtonUp()\n"))); + + CancelRepeat(); + + return CAknFepCtrlCommonButton::HandlePointerUpEventL(aPt); + } + +// --------------------------------------------------------- +// Handle pointer levae event cancel timers +// --------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlRepeatButton::HandlePointerLeave(const TPoint& aPoint) + { + CAknFepCtrlCommonButton::HandlePointerLeave(aPoint); + + CancelRepeat(); + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlRepeatButton::CancelPointerDownL +// Cancel pointer down event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlRepeatButton::CancelPointerDownL() + { + CAknFepCtrlCommonButton::CancelPointerDownL(); + + CancelRepeat(); + } + +// --------------------------------------------------------- +// Set the repeat interval of repeat timer +// --------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlRepeatButton::SetRepeatInterval(const TTimeIntervalMicroSeconds32& aTime) + { + iRepeatInterval = aTime; + } + +// --------------------------------------------------------- +// Cancel timers +// --------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlRepeatButton::CancelRepeat() + { + //PRINTF((_L("CAknFepCtrlRepeatButton::CancelRepeat()\n"))); + iLongPressTimer->Cancel(); + iRepeatTimer->Cancel(); + } + +EXPORT_C CAknFepCtrlRawKeyButton* CAknFepCtrlRawKeyButton::NewL(CFepUiLayout* aUiLayout, + TInt aControlId, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID, + TInt aDownEvent, + TInt aUpEvent, + TInt aScanCode) + { + CAknFepCtrlRawKeyButton* self = NewLC(aUiLayout, + aControlId, + aNormalID, + aPressedID, + aInactiveID, + aDownEvent, + aUpEvent, + aScanCode); + CleanupStack::Pop(self); + + return self; + } + +EXPORT_C CAknFepCtrlRawKeyButton* CAknFepCtrlRawKeyButton::NewLC(CFepUiLayout* aUiLayout, + TInt aControlId, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID, + TInt aDownEvent, + TInt aUpEvent, + TInt aScanCode) + { + CAknFepCtrlRawKeyButton* self = new (ELeave) CAknFepCtrlRawKeyButton(aUiLayout, + aControlId, + aNormalID, + aPressedID, + aInactiveID, + aDownEvent, + aUpEvent, + aScanCode); + CleanupStack::PushL(self); + self->BaseConstructL(); + return self; + } + +EXPORT_C CAknFepCtrlRawKeyButton::CAknFepCtrlRawKeyButton(CFepUiLayout* aUiLayout, + TInt aControlId, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID, + TInt aDownEvent, + TInt aUpEvent, + TInt aScanCode) + : CAknFepCtrlCommonButton(aUiLayout, aControlId, aNormalID, aPressedID, aInactiveID), + iDownEvent(aDownEvent), + iUpEvent(aUpEvent), + iScanCode(aScanCode), + iLastPntDownEvent(EFalse) + { + } + +EXPORT_C CAknFepCtrlRawKeyButton::~CAknFepCtrlRawKeyButton() + { + } + +EXPORT_C CFepUiBaseCtrl* CAknFepCtrlRawKeyButton::HandlePointerDownEventL(const TPoint& aPoint) + { +/* if (iDownEvent == KInvalidEventId) + { + return CButtonBase::HandlePointerDownEventL(aPoint); + } + + if(IsDimmed()) + { + return NULL; + } + + CAknFepCtrlButton::HandlePointerDownEventL(aPoint); + if(IsActive()) + { + SetBackgroundBmp(iActiveBmpPressed); + SetBackgroundMaskBmp(iActiveMaskBmpPressed); + } + else + { + SetBackgroundBmp(iNonActiveBkBmpPressed); + SetBackgroundMaskBmp(iNonActiveBkMaskBmpPressed); + } + + Draw(); + UpdateArea(Rect(),ETrue); +*/ + if(IsDimmed()) + { + return NULL; + } + + CAknFepCtrlCommonButton::HandlePointerDownEventL(aPoint); + TKeyEvent event= {0,0,0,0}; + TPtrC eventDataPtr; + event.iScanCode = iScanCode; + eventDataPtr.Set(reinterpret_cast(&event),sizeof(event)); + + ReportEvent(iDownEvent,eventDataPtr); + + iLastPntDownEvent = ETrue; + + return this; + } + +EXPORT_C CFepUiBaseCtrl* CAknFepCtrlRawKeyButton::HandlePointerUpEventL(const TPoint& aPoint) + { + if (iUpEvent == KInvalidEventId) + { + return CButtonBase::HandlePointerUpEventL(aPoint); + } + +/* if(IsDimmed()) + { + return NULL; + } + + if(IsActive()) + { + SetBackgroundBmp(Bitmap(EBtnBmpActive,EFalse)); + SetBackgroundMaskBmp(Bitmap(EBtnBmpActive,ETrue)); + } + else + { + SetBackgroundBmp(Bitmap(EBtnBmpNonActive,EFalse)); + SetBackgroundMaskBmp(Bitmap(EBtnBmpNonActive,ETrue)); + } + + SetActive(ETrue); + Draw(); + UpdateArea(Rect(),ETrue); +*/ + if(IsDimmed()) + { + return NULL; + } + + CAknFepCtrlCommonButton::HandlePointerUpEventL(aPoint); + if (iLastPntDownEvent) + { + // only when last event is pointer down event, there is need to simulate + // pointer up event + TKeyEvent event= {0,0,0,0}; + TPtrC eventDataPtr; + event.iScanCode = iScanCode; + eventDataPtr.Set(reinterpret_cast(&event),sizeof(event)); + + ReportEvent(iUpEvent,eventDataPtr); + + iLastPntDownEvent = EFalse; + } + + return this; + } + +EXPORT_C void CAknFepCtrlRawKeyButton::ConstructFromResourceL(TResourceReader& aReader) + { + TInt scancode = aReader.ReadInt16(); + SetScanCode(scancode); + + TInt32 btnimgResId = aReader.ReadInt32(); + TResourceReader imgreader; + CCoeEnv::Static()->CreateResourceReaderLC(imgreader, btnimgResId); + CAknFepCtrlCommonButton::ConstructFromResourceL(imgreader); + CleanupStack::PopAndDestroy(); // imgreader + + //ResizeBitmaps(Rect().Size()); + iFirstTimeConstruct = EFalse; + } + +EXPORT_C void CAknFepCtrlRawKeyButton::ConstructFromResourceL() + { + if (iResourceId == KInvalidResId) + { + return; + } + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId); + + TInt scancode = reader.ReadInt16(); + SetScanCode(scancode); + + TInt32 btnimgResId = reader.ReadInt32(); + TResourceReader imgreader; + CCoeEnv::Static()->CreateResourceReaderLC(imgreader, btnimgResId); + CAknFepCtrlCommonButton::ConstructFromResourceL(imgreader); + CleanupStack::PopAndDestroy(2); // reader, imgreader + + //ResizeBitmaps(Rect().Size()); + iFirstTimeConstruct = EFalse; + } + +EXPORT_C void CAknFepCtrlRawKeyButton::HandlePointerLeave(const TPoint& aPoint) + { + if (!Rect().Contains(aPoint)) + { + TRAP_IGNORE(HandlePointerUpEventL(Rect().Center())); + } + } + +EXPORT_C void CAknFepCtrlRawKeyButton::OnDeActivate() + { + CButtonBase::OnDeActivate(); + + if (iLastPntDownEvent) + { + TRAP_IGNORE(HandlePointerUpEventL(Rect().Center())); + } + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::CAknFepCtrlCommonButton +// C++ default constructor can NOT contain any code, that +// might leave. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlCommonButton::CAknFepCtrlCommonButton(CFepUiLayout* aUiLayout, + TInt aControlId, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID) +: CButtonBase(TRect(), aUiLayout, aControlId), + iFirstTimeConstruct(ETrue), + iHighlight(EFalse), + iPressed(EFalse), + iTextColorIndex( KInvalidColorGroup ) + { + iNormalImgID = aNormalID; + iPressedImgID = aPressedID; + iInactiveImgID = aInactiveID; + CFepUiBaseCtrl::SetActive( ETrue ); + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::NewL +// Two-phased constructor. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlCommonButton* CAknFepCtrlCommonButton::NewL(CFepUiLayout* aUiLayout, + TInt aControlId, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID) + { + CAknFepCtrlCommonButton* self = NewLC(aUiLayout, + aControlId, + aNormalID, + aPressedID, + aInactiveID); + CleanupStack::Pop(self); + + return self; + } +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::NewLC +// Two-phased constructor. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlCommonButton* CAknFepCtrlCommonButton::NewLC(CFepUiLayout* aUiLayout, + TInt aControlId, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID) + { + CAknFepCtrlCommonButton* self = new (ELeave) CAknFepCtrlCommonButton(aUiLayout, + aControlId, + aNormalID, + aPressedID, + aInactiveID); + CleanupStack::PushL(self); + self->BaseConstructL(); + + return self; + } + +// ----------------------------------------------------------------------------- +// Destructor. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlCommonButton::~CAknFepCtrlCommonButton() + { + DeleteForgroundRes(); + delete iColorIcons; + delete iText; + } +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::ConstructFromResourceL +// The order of the image ids in the CButtonBase class must not be changed +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlCommonButton::ConstructFromResourceL(TResourceReader& aReader) + { + if (!iFirstTimeConstruct) + { + DeleteForgroundRes(); + if( iColorIcons ) + iColorIcons->ReConstructL(); + } + + TPtrC bmpFileName = aReader.ReadTPtrC(); // Read the file name of the bmps + TInt32 imgMajorSkinId = aReader.ReadInt32(); + TInt colorGroup = aReader.ReadInt16(); + TAknsItemID id; + + // Get the image ids and mask ids from resource + TInt bmpId = aReader.ReadInt16(); + TInt bmpMskId = aReader.ReadInt16(); + + // read skin item id + const TInt skinitemid = aReader.ReadInt16(); + id.Set(TInt(imgMajorSkinId), skinitemid); + + if (bmpId != KInvalidBmp) + { + if (bmpMskId != KInvalidBmp) + { + if( colorGroup == KInvalidColorGroup ) + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + iForgroundBmp, + iForgroundBmpMask, + bmpFileName, + bmpId, + bmpMskId); + } + else + { + AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(), + id, + KAknsIIDQsnIconColors, + colorGroup, + iForgroundBmp, + iForgroundBmpMask, + bmpFileName, + bmpId, + bmpMskId, + AKN_LAF_COLOR( 0 ) ); + } + + AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize(iForgroundBmpMask, iForgroundBmpRect.Size(), + EAspectRatioNotPreserved); + + /*CreateDimmedMaskL( iForgroundDimBmpMask, iForgroundBmpMask ); + AknIconUtils::SetSize(iForgroundDimBmpMask, iForgroundBmpRect.Size(), + EAspectRatioNotPreserved);*/ + } + else + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + iForgroundBmp, + bmpFileName, + bmpId); + AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved); + } + } + + if (!iFirstTimeConstruct) + { + //ResizeBitmaps(iForgroundBmpRect.Size()); + Draw(); + } + + iFirstTimeConstruct = EFalse; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::ConstructFromResourceL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlCommonButton::ConstructFromResourceL() + { + if (iResourceId == KInvalidResId) + { + return; + } + + if (!iFirstTimeConstruct) + { + // need to remove original bmp and maskbmp + DeleteForgroundRes(); + if( iColorIcons ) + iColorIcons->ReConstructL(); + } + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId); + + TPtrC bmpFileName = reader.ReadTPtrC(); // Read the file name of the bmps + TInt32 imgMajorSkinId = reader.ReadInt32(); + TInt colorGroup = reader.ReadInt16(); + TAknsItemID id; + + // Get the image ids and mask ids from resource + TInt bmpId = reader.ReadInt16(); + TInt bmpMskId = reader.ReadInt16(); + + // Read skin item id + const TInt skinitemid = reader.ReadInt16(); + id.Set(TInt(imgMajorSkinId), skinitemid); + + if (bmpId != KInvalidBmp) + { + if (bmpMskId != KInvalidBmp) + { + if( colorGroup == KInvalidColorGroup ) + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + iForgroundBmp, + iForgroundBmpMask, + bmpFileName, + bmpId, + bmpMskId); + } + else + { + AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(), + id, + KAknsIIDQsnIconColors, + colorGroup, + iForgroundBmp, + iForgroundBmpMask, + bmpFileName, + bmpId, + bmpMskId, + AKN_LAF_COLOR( 0 ) ); + } + + AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize(iForgroundBmpMask, iForgroundBmpRect.Size(), + EAspectRatioNotPreserved); + + /*CreateDimmedMaskL( iForgroundDimBmpMask, + iForgroundBmpMask ); + AknIconUtils::SetSize(iForgroundDimBmpMask, iForgroundBmpRect.Size(), EAspectRatioNotPreserved);*/ + } + else + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + iForgroundBmp, + bmpFileName, + bmpId); + AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved); + } + } + + CleanupStack::PopAndDestroy(); // reader + + if (!iFirstTimeConstruct) + { + //ResizeBitmaps(iForgroundBmpRect.Size()); + Draw(); + } + + iFirstTimeConstruct = EFalse; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::Draw +// Draws UI +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlCommonButton::Draw() + { + if(!AbleToDraw()) + return; + + CFbsBitGc* gc = static_cast(BitGc()); + + //mask bitmaps + DrawOpaqueMaskBackground(); + TRect rect = Rect(); + TRect innerRect = rect; + innerRect.Shrink( 10, 10 ); + + // ----- draw bitmaps ----- + gc->Activate( BitmapDevice() ); + // gc->SetClippingRegion( &ValidClipRegion() ); + //gc->Clear(rect); + + CFbsBitmap* bmpMask = NULL; + + // Draw background + if( IsDimmed() ) // Dimmed state + { + AknsDrawUtils::DrawFrame( UiLayout()->SkinInstance(), + *gc, + rect, + innerRect, + iInactiveImgID, + KAknsIIDDefault ); + if( iForgroundDimBmpMask ) + { + delete iForgroundDimBmpMask; + iForgroundDimBmpMask = NULL; + } + TRAP_IGNORE(CreateDimmedMaskL( iForgroundDimBmpMask, + iForgroundBmpMask )); + AknIconUtils::SetSize(iForgroundDimBmpMask, iForgroundBmpRect.Size(), + EAspectRatioNotPreserved); + + bmpMask = iForgroundDimBmpMask; + } + else + { + // Normal state or pressed state + TAknsItemID ImgID; + if (iHighlight) + { + ImgID = iPressedImgID; + } + else + { + ImgID = /*iPressed*/PointerDown()? iPressedImgID : iNormalImgID; + } + + AknsDrawUtils::DrawFrame( UiLayout()->SkinInstance(), + *gc, + rect, + innerRect, + ImgID, + KAknsIIDDefault ); + bmpMask = iForgroundBmpMask; + } + + // Draw forground + if ( iColorIcons ) // 3-pieces color icon + { + AknPenInputDrawUtils::Draw3PiecesColorIcon( iColorIcons, + *gc, + iForgroundBmpRect, + iDraw3PiecesInfo.iInnerRect ); + } + else if( iForgroundBmp ) + { + TRect srcRect( TPoint( 0, 0 ), iForgroundBmp->SizeInPixels() ); + if( bmpMask ) + { + gc->BitBltMasked( iForgroundBmpRect.iTl, + iForgroundBmp, + srcRect, + bmpMask, + EFalse); + } + else + { + gc->BitBlt( iForgroundBmpRect.iTl, + iForgroundBmp, + srcRect ); + } + } + + if (iText) + { + //if( IsDimmed() ) + // { + // gc->SetFadingParameters( KFadingParamBlack, KFadingParamWhite ); + // gc->SetFaded( ETrue ); + // } + + TAknLayoutText textLayout; + textLayout.LayoutText(Rect(), iTextFormat); + if( iTextColorIndex == KInvalidColorGroup ) + textLayout.DrawText(*gc, *iText); + else + { + TRgb color( KRgbBlack ); // sane default for nonskinned case + if ( AknsUtils::AvkonSkinEnabled() ) + { + AknsUtils::GetCachedColor( UiLayout()->SkinInstance(), + color, KAknsIIDQsnTextColors, iTextColorIndex ); + } + if( IsDimmed() ) + { + color = KRgbGray; + } + textLayout.DrawText(*gc, *iText, ETrue, color); + } + //if( IsDimmed() ) + // gc->SetFaded( EFalse ); + } + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::SetActive +// Set active for the button +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlCommonButton::SetActive(TBool aActiveFlag) + { + if( IsDimmed() ) + { + return; + } + + if(IsActive() != aActiveFlag) + { + CFepUiBaseCtrl::SetActive(aActiveFlag); +/* if(BitGc()) + { + Draw(); + UpdateArea(Rect(),EFalse); + }*/ + } + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::SetHighlight +// Set highlight for the button +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlCommonButton::SetHighlight(TBool aIsHighlight) + { + iHighlight = aIsHighlight; + + Draw(); + UpdateArea(Rect(),EFalse); + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::ResizeBitmaps +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepCtrlCommonButton::ResizeBitmaps(TSize aInnerSize) + { + if( iForgroundBmp && ( iForgroundBmp->SizeInPixels() != aInnerSize ) ) + { + AknIconUtils::SetSize( iForgroundBmp, aInnerSize, EAspectRatioNotPreserved ); + } + if( iForgroundBmpMask && ( iForgroundBmpMask->SizeInPixels() != aInnerSize ) ) + { + AknIconUtils::SetSize( iForgroundBmpMask, aInnerSize, EAspectRatioNotPreserved ); + } + + /*TRAP_IGNORE(CreateDimmedMaskL(iForgroundDimBmpMask, + iForgroundBmpMask));*/ + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::SizeChanged +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlCommonButton::SizeChanged(TRect aNewRect, + TRect aInnerRect, + TBool aIsReloadImages) + { + if (aNewRect.Size().iWidth == 0 || aNewRect.Size().iHeight == 0) + { + return; + } + + TRect oriRect = Rect(); + + if( oriRect == aNewRect && iForgroundBmpRect == aInnerRect ) + { + return; + } + + SetRect(aNewRect); + + if (aIsReloadImages) + { + iForgroundBmpRect = aInnerRect; + ResizeBitmaps(aInnerRect.Size() ); + } + RootControl()->ReDrawRect( Rect() ); + UpdateArea(Rect(), EFalse); + Draw(); + UpdateArea(Rect(), EFalse); + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::SetForgroundBmpRect +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlCommonButton::SetForgroundBmpRect(const TRect& aRect) + { + iForgroundBmpRect = aRect; + } + +EXPORT_C void CAknFepCtrlCommonButton::SetDraw3PieceFrameInfo(TDraw3PiecesFrame a3PiecesFrameInfo) + { + iDraw3PiecesInfo = a3PiecesFrameInfo; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::DeleteForgroundRes +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepCtrlCommonButton::DeleteForgroundRes() + { + if( iForgroundBmp ) + { + delete iForgroundBmp; + iForgroundBmp = NULL; + } + if( iForgroundBmpMask ) + { + delete iForgroundBmpMask; + iForgroundBmpMask = NULL; + } + if( iForgroundDimBmpMask ) + { + delete iForgroundDimBmpMask; + iForgroundDimBmpMask = NULL; + } + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::CreateDimmedMaskL +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepCtrlCommonButton::CreateDimmedMaskL( CFbsBitmap*& aDimmedMask, + const CFbsBitmap* aMask + /*TScaleMode aScaleMode*/ ) + { + if (aMask && aMask->DisplayMode() == EGray256) + { + delete aDimmedMask; + aDimmedMask = NULL; + + aDimmedMask = new (ELeave) CFbsBitmap; + + User::LeaveIfError(aDimmedMask->Create(aMask->SizeInPixels(), EGray256)); + CleanupStack::PushL(aDimmedMask); + + CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(aDimmedMask); + CleanupStack::PushL(bitmapDevice); + + CFbsBitGc* bitGc(NULL); + User::LeaveIfError(bitmapDevice->CreateContext(bitGc)); + CleanupStack::PushL(bitGc); + + bitGc->SetPenStyle(CGraphicsContext::ESolidPen); + bitGc->BitBlt(TPoint(0, 0), aMask); + + aDimmedMask->LockHeap(); + TInt w = aMask->SizeInPixels().iWidth; + TInt h = aMask->SizeInPixels().iHeight; + TInt dataStride = aMask->DataStride() - w; + unsigned char* address = (unsigned char *)aDimmedMask->DataAddress(); + + for ( TInt i = 0; i < h; ++i ) + { + for ( TInt j = 0; j < w; ++j ) + { + *address = KTransparency[*address]; + ++address; + } + address += dataStride; + } + + aDimmedMask->UnlockHeap(); + + //AknIconUtils::SetSize(aDimmedMask, aMask->SizeInPixels(), aScaleMode); + + CleanupStack::PopAndDestroy(2); // bitmapDevice, bitGc + CleanupStack::Pop(1); // aDimmedMask + } + + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::HandlePointerDownEventL +// Handle button down event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CAknFepCtrlCommonButton::HandlePointerDownEventL(const TPoint& aPt) + { + if( IsDimmed() ) + return NULL; + + CFepUiBaseCtrl::HandlePointerDownEventL(aPt); + iPressed = ETrue; + + Draw(); + UpdateArea(Rect(),EFalse); + ReportEvent(EEventButtonDown); + return this; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::HandlePointerLeave +// Handle pointer leave event +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlCommonButton::HandlePointerLeave(const TPoint& aPt) + { + if( IsDimmed() ) + return; + + CFepUiBaseCtrl::HandlePointerLeave(aPt); + iPressed = EFalse; + + RootControl()->ReDrawRect( Rect() ); + UpdateArea(Rect(),EFalse); + + return ; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::HandleButtonUpEventL +// Handle button up event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CAknFepCtrlCommonButton::HandlePointerUpEventL(const TPoint& aPt) + { + CFepUiBaseCtrl::HandlePointerUpEventL(aPt); + if( IsDimmed() ) + return NULL; + + iPressed = EFalse; + SetActive(ETrue); + RootControl()->ReDrawRect( Rect() ); + //Draw(); + UpdateArea(Rect(),EFalse); + + ReportEvent(EEventButtonUp); + +#ifdef RD_TACTILE_FEEDBACK + { + UiLayout()->DoTactileFeedback(ETouchFeedbackSensitiveInput, ETrue, EFalse); + } +#endif // RD_TACTILE_FEEDBACK + + return this; + } + +EXPORT_C void CAknFepCtrlCommonButton::HandlePointerEnter(const TPoint& aPt) + { + if( IsDimmed() ) + return; + + CFepUiBaseCtrl::HandlePointerEnter(aPt); + iPressed = ETrue; + Draw(); + UpdateArea(Rect(),EFalse); + + return ; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::CancelPointerDownL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlCommonButton::CancelPointerDownL() + { + CFepUiBaseCtrl::CancelPointerDownL(); + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlCommonButton::SetForegroundBmpL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlCommonButton::SetForegroundBmpL(CFbsBitmap* aBmp, + CFbsBitmap* aMaskBmp) + { + DeleteForgroundRes(); + + iForgroundBmp = aBmp; + iForgroundBmpMask = aMaskBmp; + + ResizeBitmaps(iForgroundBmpRect.Size()); + } + +EXPORT_C void CAknFepCtrlCommonButton::Move(const TPoint& aOffset) + { + CButtonBase::Move(aOffset); + iForgroundBmpRect.Move( aOffset ); + + if ( iColorIcons ) + { + iDraw3PiecesInfo.iInnerRect.Move( aOffset ); + } + } + + + +// --------------------------------------------------------------------------- +// CAknFepCtrlMultiImageButton::CAknFepCtrlMultiImageButton +// C++ default constructor can NOT contain any code, that +// might leave. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlMultiImageButton::CAknFepCtrlMultiImageButton(CFepUiLayout* aUiLayout, + TInt aControlId, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID) + : CAknFepCtrlCommonButton(aUiLayout, aControlId, aNormalID, aPressedID, aInactiveID) + { + iNormalImgID = aNormalID; + iPressedImgID = aPressedID; + iInactiveImgID = aInactiveID; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlMultiImageButton::NewL +// Two-phased constructor. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlMultiImageButton* CAknFepCtrlMultiImageButton::NewL(CFepUiLayout* aUiLayout, + TInt aControlId, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID) + { + CAknFepCtrlMultiImageButton* self = NewLC(aUiLayout, + aControlId, + aNormalID, + aPressedID, + aInactiveID); + CleanupStack::Pop(self); + + return self; + } +// --------------------------------------------------------------------------- +// CAknFepCtrlMultiImageButton::NewLC +// Two-phased constructor. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlMultiImageButton* CAknFepCtrlMultiImageButton::NewLC(CFepUiLayout* aUiLayout, + TInt aControlId, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID) + { + CAknFepCtrlMultiImageButton* self = new (ELeave) CAknFepCtrlMultiImageButton(aUiLayout, + aControlId, + aNormalID, + aPressedID, + aInactiveID); + CleanupStack::PushL(self); + self->BaseConstructL(); + + return self; + } + +// ----------------------------------------------------------------------------- +// Destructor. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknFepCtrlMultiImageButton::~CAknFepCtrlMultiImageButton() + { + DeleteForgroundRes(); + delete iText; + } +// --------------------------------------------------------------------------- +// CAknFepCtrlMultiImageButton::ConstructFromResourceL +// The order of the image ids in the CButtonBase class must not be changed +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlMultiImageButton::ConstructFromResourceL(TResourceReader& aReader) + { + if (!iFirstTimeConstruct) + { + DeleteForgroundRes(); + } + + TPtrC bmpFileName = aReader.ReadTPtrC(); // Read the file name of the bmps + TInt32 imgMajorSkinId = aReader.ReadInt32(); + TInt colorGroup = aReader.ReadInt16(); + TAknsItemID id; + + // Get the image ids and mask ids from resource + TInt bmpId = aReader.ReadInt16(); + TInt bmpMskId = aReader.ReadInt16(); + + // read skin item id + const TInt skinitemid = aReader.ReadInt16(); + id.Set(TInt(imgMajorSkinId), skinitemid); + + if (bmpId != KInvalidBmp) + { + if (bmpMskId != KInvalidBmp) + { + if( colorGroup == KInvalidColorGroup ) + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + iForground1Bmp, + iForground1BmpMask, + bmpFileName, + bmpId, + bmpMskId); + } + else + { + AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(), + id, + KAknsIIDQsnIconColors, + colorGroup, + iForground1Bmp, + iForground1BmpMask, + bmpFileName, + bmpId, + bmpMskId, + AKN_LAF_COLOR( 0 ) ); + } + + AknIconUtils::SetSize(iForground1Bmp, iForground1BmpRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize(iForground1BmpMask, iForground1BmpRect.Size(), + EAspectRatioNotPreserved); + + /*CreateDimmedMaskL( iForground1DimBmpMask, iForground1BmpMask ); + AknIconUtils::SetSize(iForground1DimBmpMask, iForground1BmpRect.Size(), + EAspectRatioNotPreserved);*/ + } + else + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + iForground1Bmp, + bmpFileName, + bmpId); + AknIconUtils::SetSize(iForground1Bmp, iForground1BmpRect.Size(), EAspectRatioNotPreserved); + } + } + + + + TAknsItemID id2; + + // Get the image ids and mask ids from resource + TInt bmp2Id = aReader.ReadInt16(); + TInt bmp2MskId = aReader.ReadInt16(); + + // read skin item id + const TInt skinitem2id = aReader.ReadInt16(); + id2.Set(TInt(imgMajorSkinId), skinitem2id); + + if (bmp2Id != KInvalidBmp) + { + if (bmp2MskId != KInvalidBmp) + { + if( colorGroup == KInvalidColorGroup ) + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id2, + iForground2Bmp, + iForground2BmpMask, + bmpFileName, + bmp2Id, + bmp2MskId); + } + else + { + AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(), + id2, + KAknsIIDQsnIconColors, + colorGroup, + iForground2Bmp, + iForground2BmpMask, + bmpFileName, + bmp2Id, + bmp2MskId, + AKN_LAF_COLOR( 0 ) ); + } + + AknIconUtils::SetSize(iForground2Bmp, iForground2BmpRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize(iForground2BmpMask, iForground2BmpRect.Size(), + EAspectRatioNotPreserved); + + /*CreateDimmedMaskL( iForground2DimBmpMask, iForground2BmpMask ); + AknIconUtils::SetSize(iForground2DimBmpMask, iForground2BmpRect.Size(), + EAspectRatioNotPreserved);*/ + } + else + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id2, + iForground2Bmp, + bmpFileName, + bmp2Id); + AknIconUtils::SetSize(iForground2Bmp, iForground2BmpRect.Size(), EAspectRatioNotPreserved); + } + } + + if (!iFirstTimeConstruct) + { + Draw(); + } + + iFirstTimeConstruct = EFalse; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlMultiImageButton::ConstructFromResourceL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlMultiImageButton::ConstructFromResourceL() + { + if (iResourceId == KInvalidResId) + { + User::Leave(KErrArgument); + } + + if (!iFirstTimeConstruct) + { + // need to remove original bmp and maskbmp + DeleteForgroundRes(); + } + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId); + + TPtrC bmpFileName = reader.ReadTPtrC(); // Read the file name of the bmps + TInt32 imgMajorSkinId = reader.ReadInt32(); + TInt colorGroup = reader.ReadInt16(); + TAknsItemID id; + + // Get the image ids and mask ids from resource + TInt bmpId = reader.ReadInt16(); + TInt bmpMskId = reader.ReadInt16(); + + // Read skin item id + const TInt skinitemid = reader.ReadInt16(); + id.Set(TInt(imgMajorSkinId), skinitemid); + + if (bmpId != KInvalidBmp) + { + if (bmpMskId != KInvalidBmp) + { + if( colorGroup == KInvalidColorGroup ) + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + iForground1Bmp, + iForground1BmpMask, + bmpFileName, + bmpId, + bmpMskId); + } + else + { + AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(), + id, + KAknsIIDQsnIconColors, + colorGroup, + iForground1Bmp, + iForground1BmpMask, + bmpFileName, + bmpId, + bmpMskId, + AKN_LAF_COLOR( 0 ) ); + } + + AknIconUtils::SetSize(iForground1Bmp, iForground1BmpRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize(iForground1BmpMask, iForground1BmpRect.Size(), EAspectRatioNotPreserved); + + /*CreateDimmedMaskL( iForground1DimBmpMask, + iForground1BmpMask ); + AknIconUtils::SetSize(iForground1DimBmpMask, iForground1BmpRect.Size(), EAspectRatioNotPreserved);*/ + } + else + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + iForground1Bmp, + bmpFileName, + bmpId); + AknIconUtils::SetSize(iForground1Bmp, iForground1BmpRect.Size(), EAspectRatioNotPreserved); + } + } + + + + + + + + + + + + + TAknsItemID id2; + + // Get the image ids and mask ids from resource + TInt bmp2Id = reader.ReadInt16(); + TInt bmp2MskId = reader.ReadInt16(); + + // Read skin item id + const TInt skinitem2id = reader.ReadInt16(); + id2.Set(TInt(imgMajorSkinId), skinitem2id); + + if (bmp2Id != KInvalidBmp) + { + if (bmp2MskId != KInvalidBmp) + { + if( colorGroup == KInvalidColorGroup ) + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id2, + iForground2Bmp, + iForground2BmpMask, + bmpFileName, + bmp2Id, + bmp2MskId); + } + else + { + AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(), + id, + KAknsIIDQsnIconColors, + colorGroup, + iForground2Bmp, + iForground2BmpMask, + bmpFileName, + bmp2Id, + bmp2MskId, + AKN_LAF_COLOR( 0 ) ); + } + + AknIconUtils::SetSize(iForground2Bmp, iForground2BmpRect.Size(), EAspectRatioPreserved); + AknIconUtils::SetSize(iForground2BmpMask, iForground2BmpRect.Size(), EAspectRatioPreserved); + + /*CreateDimmedMaskL( iForground2DimBmpMask, iForground2BmpMask ); + AknIconUtils::SetSize(iForground2DimBmpMask, iForground2BmpRect.Size(), + EAspectRatioNotPreserved);*/ + } + else + { + AknsUtils::CreateIconL(UiLayout()->SkinInstance(), + id, + iForground2Bmp, + bmpFileName, + bmp2Id); + AknIconUtils::SetSize(iForground2Bmp, iForground2BmpRect.Size(), EAspectRatioPreserved); + } + } + + + + + + + CleanupStack::PopAndDestroy(); // reader + + if (!iFirstTimeConstruct) + { + //ResizeBitmaps(iForgroundBmpRect.Size()); + Draw(); + } + + iFirstTimeConstruct = EFalse; + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlMultiImageButton::Draw +// Draws UI +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlMultiImageButton::Draw() + { + if(!AbleToDraw()) + return; + + CFbsBitGc* gc = static_cast(BitGc()); + + //mask bitmaps + DrawOpaqueMaskBackground(); + TRect rect = Rect(); + TRect innerRect = rect; + innerRect.Shrink( 10, 10 ); + + // ----- draw bitmaps ----- + gc->Activate( BitmapDevice() ); + // gc->SetClippingRegion( &ValidClipRegion() ); + //gc->Clear(rect); + + CFbsBitmap* bmpMask1 = NULL; + CFbsBitmap* bmpMask2 = NULL; + + // Draw background + if( IsDimmed() ) // Dimmed state + { + AknsDrawUtils::DrawFrame( UiLayout()->SkinInstance(), + *gc, + rect, + innerRect, + iInactiveImgID, + KAknsIIDDefault ); + if( iForground1DimBmpMask ) + { + delete iForground1DimBmpMask; + iForground1DimBmpMask = NULL; + } + TRAP_IGNORE(CreateDimmedMaskL( iForground1DimBmpMask, + iForground1BmpMask )); + AknIconUtils::SetSize(iForground1DimBmpMask, iForground1BmpRect.Size(), + EAspectRatioNotPreserved); + bmpMask1 = iForground1DimBmpMask; + + if( iForground2DimBmpMask ) + { + delete iForground2DimBmpMask; + iForground2DimBmpMask = NULL; + } + TRAP_IGNORE(CreateDimmedMaskL( iForground2DimBmpMask, + iForground2BmpMask )); + AknIconUtils::SetSize(iForground2DimBmpMask, iForground2BmpRect.Size(), + EAspectRatioNotPreserved); + bmpMask2 = iForground2DimBmpMask; + } + else + { + // Normal state or pressed state + TAknsItemID ImgID; + if (iHighlight) + { + ImgID = iPressedImgID; + } + else + { + ImgID = /*iPressed*/PointerDown()? iPressedImgID : iNormalImgID; + } + + AknsDrawUtils::DrawFrame( UiLayout()->SkinInstance(), + *gc, + rect, + innerRect, + ImgID, + KAknsIIDDefault ); + bmpMask1 = iForground1BmpMask; + bmpMask2 = iForground2BmpMask; + } + + // Draw forground + if( iForground1Bmp && iForground2Bmp) + { + TRect srcRect( TPoint( 0, 0 ), iForground1Bmp->SizeInPixels() ); + if( bmpMask1 ) + { + gc->BitBltMasked( iForground1BmpRect.iTl, + iForground1Bmp, + srcRect, + bmpMask1, + EFalse); + } + else + { + gc->BitBlt( iForground1BmpRect.iTl, + iForground1Bmp, + srcRect ); + } + + TRect src2Rect( TPoint( 0, 0 ), iForground2Bmp->SizeInPixels() ); + if( bmpMask2 ) + { + gc->BitBltMasked( rect.iTl, // layout of 2nd foreground is determined by image itself, but not hard code. + iForground2Bmp, + src2Rect, + bmpMask2, + EFalse); + } + else + { + gc->BitBlt( rect.iTl, + iForground2Bmp, + src2Rect ); + } + } + + if (iText) + { + TAknLayoutText textLayout; + textLayout.LayoutText(Rect(), iTextFormat); + textLayout.DrawText(*gc, *iText); + } + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlMultiImageButton::ResizeBitmaps +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepCtrlMultiImageButton::ResizeBitmaps(TSize aInnerSize) + { + if( iForground1Bmp && ( iForground1Bmp->SizeInPixels() != aInnerSize ) ) + { + AknIconUtils::SetSize( iForground1Bmp, aInnerSize, EAspectRatioNotPreserved ); + } + if( iForground1BmpMask && ( iForground1BmpMask->SizeInPixels() != aInnerSize ) ) + { + AknIconUtils::SetSize( iForground1BmpMask, aInnerSize, EAspectRatioNotPreserved ); + } + + //TRAP_IGNORE(CreateDimmedMaskL(iForground1DimBmpMask, iForground1BmpMask)); + + + + + if( iForground2Bmp && ( iForground2Bmp->SizeInPixels() != Rect().Size() ) ) + { + AknIconUtils::SetSize( iForground2Bmp, Rect().Size(), EAspectRatioNotPreserved ); + } + if( iForground2BmpMask && ( iForground2BmpMask->SizeInPixels() != Rect().Size() ) ) + { + AknIconUtils::SetSize( iForground2BmpMask, Rect().Size(), EAspectRatioNotPreserved ); + } + + //TRAP_IGNORE(CreateDimmedMaskL(iForground2DimBmpMask, iForground2BmpMask)); + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlMultiImageButton::SizeChanged +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlMultiImageButton::SizeChanged(TRect aNewRect, + TRect aInnerRect, + TBool aIsReloadImages) + { + if (aNewRect.Size().iWidth == 0 || aNewRect.Size().iHeight == 0) + { + return; + } + + TRect oriRect = Rect(); + SetRect(aNewRect); + iForground1BmpRect = aInnerRect; + iForground2BmpRect = aInnerRect; + + if (aIsReloadImages) + { + ResizeBitmaps(aInnerRect.Size() ); + } + RootControl()->ReDrawRect( oriRect ); + UpdateArea(oriRect, EFalse); + Draw(); + UpdateArea(Rect(), EFalse); + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlMultiImageButton::DeleteForgroundRes +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepCtrlMultiImageButton::DeleteForgroundRes() + { + if( iForground1Bmp ) + { + delete iForground1Bmp; + iForground1Bmp = NULL; + } + if( iForground1BmpMask ) + { + delete iForground1BmpMask; + iForground1BmpMask = NULL; + } + if( iForground1DimBmpMask ) + { + delete iForground1DimBmpMask; + iForground1DimBmpMask = NULL; + } + + + if( iForground2Bmp ) + { + delete iForground2Bmp; + iForground2Bmp = NULL; + } + if( iForground2BmpMask ) + { + delete iForground2BmpMask; + iForground2BmpMask = NULL; + } + if( iForground2DimBmpMask ) + { + delete iForground2DimBmpMask; + iForground2DimBmpMask = NULL; + } + + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlMultiImageButton::CreateDimmedMaskL +// This methods shall be called by the container's SizeChanged handler +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepCtrlMultiImageButton::CreateDimmedMaskL( CFbsBitmap*& aDimmedMask, + const CFbsBitmap* aMask + /*TScaleMode aScaleMode*/ ) + { + if (aMask && aMask->DisplayMode() == EGray256) + { + delete aDimmedMask; + aDimmedMask = NULL; + + aDimmedMask = new (ELeave) CFbsBitmap; + + User::LeaveIfError(aDimmedMask->Create(aMask->SizeInPixels(), EGray256)); + CleanupStack::PushL(aDimmedMask); + + CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(aDimmedMask); + CleanupStack::PushL(bitmapDevice); + + CFbsBitGc* bitGc(NULL); + User::LeaveIfError(bitmapDevice->CreateContext(bitGc)); + CleanupStack::PushL(bitGc); + + bitGc->SetPenStyle(CGraphicsContext::ESolidPen); + bitGc->BitBlt(TPoint(0, 0), aMask); + + aDimmedMask->LockHeap(); + TInt w = aMask->SizeInPixels().iWidth; + TInt h = aMask->SizeInPixels().iHeight; + TInt dataStride = aMask->DataStride() - w; + unsigned char* address = (unsigned char *)aDimmedMask->DataAddress(); + + for ( TInt i = 0; i < h; ++i ) + { + for ( TInt j = 0; j < w; ++j ) + { + *address = KTransparency[*address]; + ++address; + } + address += dataStride; + } + + aDimmedMask->UnlockHeap(); + + //AknIconUtils::SetSize(aDimmedMask, aMask->SizeInPixels(), aScaleMode); + + CleanupStack::PopAndDestroy(2); // bitmapDevice, bitGc + CleanupStack::Pop(1); // aDimmedMask + } + + } + +EXPORT_C void CAknFepCtrlMultiImageButton::Move(const TPoint& aOffset) + { + CButtonBase::Move(aOffset); + iForground1BmpRect.Move( aOffset ); + iForground2BmpRect.Move( aOffset ); + } + +// --------------------------------------------------------- +// Constructor +// --------------------------------------------------------- +// +EXPORT_C CAknFepCtrlLongPressButton* CAknFepCtrlLongPressButton::NewLC(CFepUiLayout* aUiLayout, + TInt aCtrlId, + TInt aEvent, + TInt aUnicode, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID) + { + //PRINTF((_L("CAknFepCtrlLongPressButton::NewLC(), aCtrlId = %d\n"), aCtrlId)); + CAknFepCtrlLongPressButton *self = new(ELeave) CAknFepCtrlLongPressButton(aUiLayout, + aCtrlId, + aEvent, + aUnicode, + aNormalID, + aPressedID, + aInactiveID); + + CleanupStack::PushL(self); + self->ConstructL(); + + return self; + } + +// --------------------------------------------------------- +// Constructor +// --------------------------------------------------------- +// +EXPORT_C CAknFepCtrlLongPressButton* CAknFepCtrlLongPressButton::NewL(CFepUiLayout* aUiLayout, + TInt aCtrlId, + TInt aEvent, + TInt aUnicode, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID) + { + //PRINTF((_L("CAknFepCtrlLongPressButton::NewL(), aCtrlId = %d\n"), aCtrlId)); + CAknFepCtrlLongPressButton *self = NewLC(aUiLayout, aCtrlId, aEvent, aUnicode, + aNormalID, aPressedID, aInactiveID); + CleanupStack::Pop(self); + + return self; + } + +// --------------------------------------------------------- +// Destructor +// --------------------------------------------------------- +// +EXPORT_C CAknFepCtrlLongPressButton::~CAknFepCtrlLongPressButton() + { + //PRINTF((_L("CAknFepCtrlLongPressButton::~CAknFepCtrlLongPressButton()\n"))); + CancelTimer(); + + delete iLongPressTimer; + } + +// --------------------------------------------------------- +// Constructor +// --------------------------------------------------------- +// +EXPORT_C CAknFepCtrlLongPressButton::CAknFepCtrlLongPressButton(CFepUiLayout* aUiLayout, + TInt aCtrlId, + TInt aEvent, + TInt aUnicode, + TAknsItemID aNormalID, + TAknsItemID aPressedID, + TAknsItemID aInactiveID) + :CAknFepCtrlEventButton(aUiLayout, aCtrlId, aEvent, aUnicode, + aNormalID, + aPressedID, + aInactiveID) + { + iLongPressInterval = KLongPressInterval; + } + +// --------------------------------------------------------- +// Constructor +// --------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlLongPressButton::ConstructL() + { + //PRINTF((_L("CAknFepCtrlLongPressButton::ConstructL()\n"))); + BaseConstructL(); + iIsLongPress = EFalse; + iLongPressTimer = CAknFepTimer::NewL(this); + } + +// --------------------------------------------------------- +// Time out event handler of long press timer +// --------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlLongPressButton::HandleTimerOut(const CAknFepTimer* aTimer) + { + //PRINTF((_L("CAknFepCtrlLongPressButton::HandleTimerOut()--"))); + if (aTimer == iLongPressTimer) + { + iIsLongPress = ETrue; + CancelTimer(); + TInt unicode = Unicode(); + TPtrC ptr = (TUint16*)(&unicode); + ReportEvent(EPeninputLayoutEventMultiRangeLongPress, ptr); + } + } + +// --------------------------------------------------------- +// Handle button down start long press timer +// --------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CAknFepCtrlLongPressButton::HandlePointerDownEventL(const TPoint& aPt) + { + //PRINTF((_L("CAknFepCtrlLongPressButton::HandleButtonDown()\n"))); + //PRINTF((_L("Set long press Timer\n"))); + if ( IsDimmed() ) + { + return NULL; + } + + iLongPressTimer->SetTimer(iLongPressInterval); + iIsLongPress = EFalse; + + return CAknFepCtrlCommonButton::HandlePointerDownEventL(aPt); + } + +// --------------------------------------------------------- +// Handle button up cancel timer +// --------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CAknFepCtrlLongPressButton::HandlePointerUpEventL(const TPoint& aPt) + { + //PRINTF((_L("CAknFepCtrlLongPressButton::HandleButtonUp()\n"))); + + if ( IsDimmed() ) + { + return NULL; + } + + CancelTimer(); + + if (!iIsLongPress) + { + TInt unicode = Unicode(); + TPtrC ptr = (TUint16*)(&unicode); + ReportEvent(EPeninputLayoutEventMultiRange, ptr); + } + + iIsLongPress = EFalse; + + + return CAknFepCtrlCommonButton::HandlePointerUpEventL(aPt); + } + +// --------------------------------------------------------- +// Handle pointer leave event cancel timer +// --------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlLongPressButton::HandlePointerLeave(const TPoint& aPoint) + { + CAknFepCtrlCommonButton::HandlePointerLeave(aPoint); + + CancelTimer(); + } + +// --------------------------------------------------------------------------- +// CAknFepCtrlLongPressButton::CancelPointerDownL +// Cancel pointer down event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlLongPressButton::CancelPointerDownL() + { + // No implementation needed + CAknFepCtrlCommonButton::CancelPointerDownL(); + } + +// --------------------------------------------------------- +// Cancel timer +// --------------------------------------------------------- +// +EXPORT_C void CAknFepCtrlLongPressButton::CancelTimer() + { + //PRINTF((_L("CAknFepCtrlLongPressButton::CancelTimer()\n"))); + iLongPressTimer->Cancel(); + } +// End Of File