--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutbasecontrol.cpp Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,1373 @@
+/*
+* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0""
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Implementation for base control
+*
+*/
+
+
+#include <AknIconUtils.h>
+#include "peninputlayouttimer.h"
+#include "peninputlayoutbasecontrol.h"
+#include "peninputlayoutbutton.h"
+#include "peninputlayouthwrwnd.h"
+#include "peninputlayoutcandidatewnd.h"
+#include "peninputlayoutrootctrl.h"
+#include "peninputlayout.h"
+#include <coecntrl.h>
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// Implementation of Class CFepUiBaseCtrl
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::CFepUiBaseCtrl
+// C++ default constructor
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl::CFepUiBaseCtrl(const TRect& aRect,CFepUiLayout* aUiLayout,
+ TInt aControlId):
+ iPointerLeft(EFalse),
+ iRect(aRect),
+ iShadowRect(TRect(0,0,0,0)),
+ iResourceId(-1),
+ iBorderColor(KRgbBlack),
+ iUpdateFlagEnabled(ETrue),
+ iControlId(aControlId),
+ iControlType( ECtrlBaseCtrl),
+ iBackgroundCol( KRgbWhite),
+ iMaskBkCol(KOpaqueColor),
+ iPenColor(KRgbBlack),
+ iHiden(EFalse),
+ iPointerDown(EFalse),
+ iReady( EFalse),
+ iIsActive(EFalse),
+ iAllowOverlap(EFalse),
+ iUiLayout(aUiLayout),
+ iOwnWndCtrl(ETrue),
+ iOrdinalPos(EOrderNomal)
+ {
+#ifdef RD_TACTILE_FEEDBACK
+ iReservered1 = reinterpret_cast<TInt>(new CFepUiBaseCtrlExtension(ETouchFeedbackNone));
+#endif // RD_TACTILE_FEEDBACK
+ iPenSize.SetSize(1,1);
+ iBorderSize.SetSize(KDefaultFrameWidth,KDefaultFrameWidth);
+ iValidRegion.AddRect(iRect);
+ iClipRegion.AddRect(iRect);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::CFepUiBaseCtrl
+// C++ constructor
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CFepUiBaseCtrl::CFepUiBaseCtrl(CCoeControl* aControl, CFepUiLayout* aUiLayout,
+ TBool aOwnership)
+ : iPointerLeft(EFalse),
+ //iRect(aRect),
+ iShadowRect(TRect(0,0,0,0)),
+ iWndControl(aControl),
+ iBorderColor(KRgbBlack),
+ //iControlId(aControlId),
+ iControlType( ECtrlBaseCtrl|ECtrlWndBasedCtrl),
+ iBackgroundCol( KRgbWhite),
+ iMaskBkCol(KOpaqueColor),
+ iPenColor(KRgbBlack),
+ iHiden(EFalse),
+ iPointerDown(EFalse),
+ iReady( EFalse),
+ iIsActive(EFalse),
+ iAllowOverlap(EFalse),
+ iUiLayout(aUiLayout),
+ iOwnWndCtrl(aOwnership)
+ {
+#ifdef RD_TACTILE_FEEDBACK
+ iReservered1 = reinterpret_cast<TInt>(new CFepUiBaseCtrlExtension(ETouchFeedbackNone));
+#endif // RD_TACTILE_FEEDBACK
+ iRect = aControl->Rect();
+ iControlId = aControl->UniqueHandle();
+ iValidRegion.AddRect(iRect);
+ iClipRegion.AddRect(iRect);
+ }
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::~CFepUiBaseCtrl
+// C++ destructor
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl::~CFepUiBaseCtrl()
+ {
+ iEventObserverList.Close();
+ iValidRegion.Close();
+ iClipRegion.Close();
+ iClipRegionWithoutLockedArea.Clear();
+ iClipRegionWithoutLockedArea.Close();
+ delete iBackgroundBmp;
+ delete iBkMaskBmp;
+ //delete [] iEventData;
+ for(TInt i = 0; i< 2*KShadowBitmapTotalNum; i++)
+ delete iShadowBmp[i];
+
+ if(iOwnWndCtrl)
+ delete iWndControl;
+
+#ifdef RD_TACTILE_FEEDBACK
+ //de-register the area for tactile feedback
+ //if(aUiLayout) //there must be aUiLayout
+ UiLayout()->DeRegisterFeedbackArea(reinterpret_cast<TInt>(this), Rect());
+ delete reinterpret_cast<CFepUiBaseCtrlExtension*>(iReservered1);
+#endif // RD_TACTILE_FEEDBACK
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::BaseConstructL
+// Handle UI event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::BaseConstructL()
+ {
+ __ASSERT_DEBUG(iUiLayout,User::Leave(EUiLayoutNotReady));
+
+ iRootCtrl = iUiLayout->RootControl();
+ iLayoutOwner = iUiLayout->LayoutOwner();
+
+ //__ASSERT_DEBUG(iLayoutOwner,User::Leave(EUiLayoutOwnerNotReady));
+
+ iReady = ETrue;
+
+ for(TInt i = 0; i< 2*KShadowBitmapTotalNum; i++)
+ iShadowBmp[i] = NULL;
+ __ASSERT_DEBUG(iControlType != ECtrlBaseCtrl,
+ User::Leave(EUiLayoutBadControlType));
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::BaseConstructL
+// Handle UI event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CFepUiBaseCtrl::BaseConstructL(CFepUiLayoutRootCtrl* aRoot)
+ {
+ iRootCtrl = aRoot;
+ iLayoutOwner = iUiLayout->LayoutOwner();
+
+ __ASSERT_DEBUG(iLayoutOwner,User::Leave(EUiLayoutOwnerNotReady));
+ iReady = ETrue;
+
+ for(TInt i = 0; i< 2*KShadowBitmapTotalNum; i++)
+ iShadowBmp[i] = NULL;
+ __ASSERT_DEBUG(iControlType != ECtrlBaseCtrl,
+ User::Leave(EUiLayoutBadControlType));
+ }
+
+
+// ---------------------------------------------------------------------------
+// Set tactile feedback type
+// Advanced Tactile feedback REQ417-47932
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::SetTactileFeedbackType(TInt aTactileType)
+ {
+#ifdef RD_TACTILE_FEEDBACK
+ reinterpret_cast<CFepUiBaseCtrlExtension*>(iReservered1)->SetTactileFeedbackType(aTactileType);
+#endif // RD_TACTILE_FEEDBACK
+ }
+
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::CapturePointer
+// Capture or release the pointer
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl* CFepUiBaseCtrl::CapturePointer(TBool aFlag)
+ {
+ return RootControl()->CapturePointer(this,aFlag);
+ }
+
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::Clear
+// Clear the whole control area
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::Clear()
+ {
+ if(iShadowRect.Size().iWidth > iRect.Size().iWidth ||
+ iShadowRect.Size().iHeight > iRect.Size().iHeight)
+ ClearRect(iShadowRect);
+ else
+ ClearRect(iRect);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::DrawBackgroundToDevice
+// Draw background to a device
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CFepUiBaseCtrl::DrawBackgroundToDevice(const TRect aRect,CFbsDevice *aDevice,
+ CFbsBitmap* aBmp, const TRgb& aBrushCol,
+ const TRgb& aPenCol,TBool aBmpStretchFlag)
+ {
+ CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+ gc->Activate( aDevice);
+ if(aBmp)
+ {
+ DrawBitmap(aRect,aBmp,aBmpStretchFlag);
+ }
+ else
+ {
+ gc->SetBrushStyle( CGraphicsContext::ESolidBrush );
+ gc->SetBrushColor( aBrushCol);
+ gc->SetPenSize(iBorderSize);
+ gc->SetPenColor( aPenCol);
+ gc->SetPenStyle(CGraphicsContext::ESolidPen);
+ gc->DrawRect(aRect);
+ }
+
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::DrawBackground
+// Draw background
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::DrawBackground(TBool aBmpStretchFlag)
+ {
+ DrawBackgroundToDevice(iRect,BitmapDevice(), iBackgroundBmp, iBackgroundCol,
+ iBorderColor, aBmpStretchFlag);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::DrawBackground
+// Draw background
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::DrawBackground(const TRect aRect, TBool /*aBmpStretchFlag*/)
+ {
+ if( !AbleToDraw() )
+ {
+ return;
+ }
+ TRect rtDraw = Rect();
+ rtDraw.Intersection( aRect );
+ if( rtDraw.IsEmpty() )
+ {
+ return;
+ }
+
+ //draw mask
+ CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+ gc->Activate( MaskBitmapDevice() );
+ gc->SetClippingRect( rtDraw );
+
+ gc->SetBrushStyle( CGraphicsContext::ESolidBrush );
+ gc->SetBrushColor( iMaskBkCol);
+ gc->SetPenSize(iBorderSize);
+ gc->SetPenColor( iMaskBkCol);
+ gc->SetPenStyle(CGraphicsContext::ESolidPen);
+ gc->DrawRect(rtDraw);
+ //draw foreground
+ gc->Activate( BitmapDevice() );
+ gc->SetClippingRect( rtDraw );
+
+ if(!BackgroundBmp())
+ {
+ gc->SetBrushColor( iBackgroundCol );
+ gc->SetPenColor( iPenColor );
+ gc->SetPenSize(iBorderSize);
+ gc->SetPenStyle(CGraphicsContext::ESolidPen);
+ gc->DrawRect( Rect() );
+ }
+ else
+ {
+ // ----- draw bitmaps -----
+ if(BkMaskBmp())
+ {
+ TRect bmpRect(TPoint(0,0),BkMaskBmp()->SizeInPixels());
+ gc->DrawBitmapMasked( Rect(), BackgroundBmp(),bmpRect,BkMaskBmp(),EFalse);
+ }
+ else
+ {
+ gc->DrawBitmap( Rect(),BackgroundBmp());
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::DrawMaskBackground
+// Draw mask background
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::DrawMaskBackground(TBool aBmpStretchFlag)
+ {
+ DrawBackgroundToDevice(iRect,MaskBitmapDevice(), iBkMaskBmp, iMaskBkCol,
+ iBorderColor,aBmpStretchFlag);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::DrawOpaqueMaskBackground
+// Draw opaque mask background
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::DrawOpaqueMaskBackground(TBool aBmpStretchFlag)
+ {
+ const TRgb KOpaqueMask = TRgb(KOpaqueColor);
+ DrawBackgroundToDevice(iRect,MaskBitmapDevice(), iBkMaskBmp, KOpaqueMask,
+ KOpaqueMask,aBmpStretchFlag);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::DrawOpaqueMaskBackground
+// Draw opaque mask background
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::DrawOpaqueMaskBackground(const TRect aRect, TBool aBmpStretchFlag)
+ {
+ const TRgb KOpaqueMask = TRgb(KOpaqueColor);
+ DrawBackgroundToDevice(aRect, MaskBitmapDevice(), iBkMaskBmp,
+ KOpaqueMask, KOpaqueMask, aBmpStretchFlag);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::DrawTransparentMaskBackground
+// Draw transparent mask background
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::DrawTransparentMaskBackground(const TRect& aRect,
+ TBool aBmpStretchFlag)
+ {
+ const TRgb KOpaqueMask = TRgb(KTransparentColor);
+ DrawBackgroundToDevice(aRect, MaskBitmapDevice(), iBkMaskBmp, KTransparentColor,
+ KTransparentColor, aBmpStretchFlag);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::ClearRect
+// Clear a rect in control
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::ClearRect(const TRect& aRect)
+ {
+ if(!AbleToDraw())
+ return;
+ TRect r = iRect;
+ r.BoundingRect(iShadowRect);
+ r.Intersection(aRect);
+ //only clears the rect belongs to this control
+ if(!r.IsEmpty())
+ {
+ DrawBackgroundToDevice(r,BitmapDevice(),NULL,KRgbWhite,KRgbWhite,EFalse);
+ DrawTransparentMaskBackground(r);
+ return;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::BringToTop
+// Show the control and brings to top most in current control group
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::BringToTop()
+ {
+ CControlGroup* grp = RootControl();
+ if(ParentCtrl())
+ grp = static_cast<CControlGroup*>(ParentCtrl());
+ grp->BringToTopInGroup(this);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::BringToBack
+// Bring the control to the back
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::BringToBack()
+ {
+ CControlGroup* grp = RootControl();
+ if(ParentCtrl())
+ grp = static_cast<CControlGroup*>(ParentCtrl());
+ grp->BringToBackInGroup(this);
+ }
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::Hide
+// Hide the control
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::Hide(TBool aFlag)
+ {
+ if(iHiden == aFlag)
+ return;
+
+ iHiden = aFlag;
+
+ if(!iReady)
+ return;
+
+ if(iHiden)
+ {
+ TBool needClear;
+ if(!iParentCtrl)
+ {
+ needClear = ETrue;
+ }
+ else
+ {
+ //no need to clear again if group is alreay hiden. There won't be the case
+ // that a group is hiden but sub control is shown.
+ needClear = iParentCtrl->Hiden() ? EFalse : ETrue;
+ }
+ if(needClear)
+ {
+ /*Hide a control should remove its old image, however in fact, the clear sounds reduntant, as each
+ control inside one group, and the background will be redrawn when ReDrawRect() is called, so in
+ order to ensure performance, comments it now*/
+ /*iHiden = EFalse;
+ Clear();
+ iHiden = ETrue;
+ */
+ //must redraw the cleared rect as it may clear overlapped control also.
+ iUiLayout->RootControl()->ReDrawRect(Rect());
+ UpdateArea(iRect, EFalse);
+ }
+ }
+ else
+ {
+ if(!iParentCtrl || !iParentCtrl->Hiden())
+ {
+ Draw();
+ UpdateArea(iRect,EFalse);
+ }
+ }
+
+ //rect in layout might be changed, update it.
+ //RootControl()->UpdateValidRegion(this,aFlag);
+ if(iParentCtrl)
+ iParentCtrl->UpdateValidRegion(this,aFlag);
+
+ //report size chage event
+ ReportEvent(EEventSizeChanged);
+
+
+#ifdef RD_TACTILE_FEEDBACK
+ if(IsKindOfControl(ECtrlTactileFeedback))
+ {
+ if(aFlag)
+ UiLayout()->DeRegisterFeedbackArea(reinterpret_cast<TInt>(this),Rect());
+ else if (iReady)
+ UiLayout()->RegisterFeedbackArea(reinterpret_cast<TInt>(this),Rect(),TactileFeedbackType());
+ }
+#endif
+
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::SetBackgroundBitmapL
+// Set back ground bitmap
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::SetBackgroundBitmapL(CFbsBitmap* aBmp)
+ {
+ if(!aBmp)
+ return;
+/*
+ if(IsKindOfControl(ECtrlButton))
+ {
+ //special handling to button as button does not use iBackgroundBmp directly.
+ return;
+ }
+ */
+ delete iBackgroundBmp;
+ iBackgroundBmp = aBmp;
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::SetBackgroundMaskBitmapL
+// Set back ground mask bitmap
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::SetBackgroundMaskBitmapL(CFbsBitmap* aBmp)
+ {
+ if(!aBmp)
+ return;
+/*
+ if(IsKindOfControl(ECtrlButton))
+ {
+ //special handling to button as button does not use iBackgroundBmp directly.
+ return;
+ }*/
+ delete iBkMaskBmp;
+ iBkMaskBmp = aBmp;
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::Contains
+// Check whether the point is in control region
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CFepUiBaseCtrl::Contains(const TPoint& aPt)
+ {
+ return iRect.Contains(aPt);
+ //return iValidRegion.Contains(aPt);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::SetRect
+// Set the control rect
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::SetRect(const TRect& aRect)
+ {
+ if(iRect == aRect)
+ return;
+ TRect oldRect = iRect;
+ iRect = aRect;
+ iValidRegion.Clear();
+ iClipRegion.Clear();
+ iValidRegion.AddRect(iRect);
+ iClipRegion.AddRect(iRect);
+ if(iParentCtrl && iParentCtrl->IsKindOfControl(ECtrlControlGroup))
+ {
+ iParentCtrl->UpdateValidRegion(this,EFalse);
+ //iParentCtrl->UpdateClipRegion(this);
+ }
+
+ if(iWndControl)
+ iWndControl->SetRect(iRect);
+ ReportEvent(EEventSizeChanged);
+
+#ifdef RD_TACTILE_FEEDBACK
+ if(IsKindOfControl(ECtrlTactileFeedback) && !Hiden())
+ {
+ UiLayout()->ChangeFeedbackArea(reinterpret_cast<TInt>(this),iRect,oldRect);
+ }
+#endif
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::SetShadowRect
+// Set the control shadow rect
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::SetShadowRect(const TRect& aRect)
+ {
+ iShadowRect = aRect;
+ //calculate the shadow area rect
+ TRect shadowAreaRect;
+ if(!iRect.IsEmpty())
+ {
+ for (TInt i = 0; i < KShadowBitmapTotalNum; i ++)
+ {
+ switch (i)
+ {
+ case KShadowBmpTl:
+ iShadowAreaRect[i] = TRect( iShadowRect.iTl, iRect.iTl );
+ break;
+ case KShadowBmpTr:
+ iShadowAreaRect[i] = TRect( iRect.iBr.iX, iShadowRect.iTl.iY,
+ iShadowRect.iBr.iX, iRect.iTl.iY );
+ break;
+ case KShadowBmpBl:
+ iShadowAreaRect[i] = TRect( iShadowRect.iTl.iX, iRect.iBr.iY,
+ iRect.iTl.iX, iShadowRect.iBr.iY );
+ break;
+ case KShadowBmpBr:
+ iShadowAreaRect[i] = TRect( iRect.iBr, iShadowRect.iBr );
+ break;
+ case KShadowBmpTm:
+ iShadowAreaRect[i] = TRect( iRect.iTl.iX, iShadowRect.iTl.iY,
+ iRect.iBr.iX, iRect.iTl.iY );
+ break;
+ case KShadowBmpBm:
+ iShadowAreaRect[i] = TRect( iRect.iTl.iX, iRect.iBr.iY,
+ iRect.iBr.iX, iShadowRect.iBr.iY );
+ break;
+ case KShadowBmpLm:
+ iShadowAreaRect[i] = TRect( iShadowRect.iTl.iX, iRect.iTl.iY,
+ iRect.iTl.iX, iRect.iBr.iY );
+ break;
+ case KShadowBmpRm:
+ iShadowAreaRect[i] = TRect( iRect.iBr.iX, iRect.iTl.iY,
+ iShadowRect.iBr.iX, iRect.iBr.iY );
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ else
+ {
+ //empty the shadow area since we can't calculate it right now.
+ for (TInt i = 0; i < KShadowBitmapTotalNum; i ++)
+ {
+ iShadowAreaRect[i].SetRect(0,0,0,0);
+ }
+ }
+
+ RootControl()->UpdateValidRegion(this,EFalse);
+ if(iShadowRect.Size().iWidth > UiLayout()->Rect().Size().iWidth ||
+ iShadowRect.Size().iHeight > UiLayout()->Rect().Size().iHeight)
+ {
+ UiLayout()->LayoutOwner()->LayoutSizeChanged(iShadowRect.Size());
+ }
+ }
+// CFepUiBaseCtrl::AddEventObserver
+// Add a event observer
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::AddEventObserver(MEventObserver* aObserver)
+ {
+ if(!aObserver)
+ return;
+ //add only when it's not an observer
+ if(KErrNotFound == iEventObserverList.Find(aObserver))
+ iEventObserverList.Append(aObserver);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::RemoveEventObserver
+// remove a event observer
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::RemoveEventObserver(MEventObserver* aObserver)
+ {
+ TInt index = iEventObserverList.Find(aObserver);
+ if(KErrNotFound != index)
+ iEventObserverList.Remove(index);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::ReportEvent
+// Report event to observer
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::ReportEvent(TInt aEventType, const TDesC& aEventData)
+ {
+ for(TInt i = 0; i < iEventObserverList.Count(); i++)
+ {
+ iEventObserverList[i]->HandleControlEvent(aEventType,this,aEventData);
+ }
+ }
+
+TBool CFepUiBaseCtrl::CompareOrderInSameGroup(CFepUiBaseCtrl* aCtrl)
+ {
+ return IsOnTopOf(aCtrl);
+ }
+
+TBool CFepUiBaseCtrl::CompareOrder(CFepUiBaseCtrl* aCtrl)
+ {
+ return IsOnTopOf(aCtrl);
+ }
+
+TBool CFepUiBaseCtrl::IsOnTopOf(CFepUiBaseCtrl* aCtrl)
+ {
+ __ASSERT_DEBUG(aCtrl,EUiNullParam);
+
+ return OrderPos() < aCtrl->OrderPos();
+ }
+
+
+TBool CFepUiBaseCtrl::Overlapped(CFepUiBaseCtrl* aCtrl)
+ {
+ return iRect.Intersects(aCtrl->Rect());
+ }
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::UpdateValidRegion
+// Update control's valid region when other control show or hide.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::UpdateValidRegion(CFepUiBaseCtrl* /*aCtrl*/,TBool /*aRemoveFlag*/)
+ {
+ if(!iUpdateFlagEnabled)
+ return;
+ iValidRegion.Clear();
+ iValidRegion.AddRect(iRect);
+ return;
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::Move
+// Move control and component's rect
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::Move(const TPoint& aOffset)
+ {
+ TRect oldRect = iRect;
+ iShadowRect.Move(aOffset);
+ iRect.Move(aOffset);
+ if(iWndControl)
+ iWndControl->SetRect(iRect);
+ iValidRegion.Clear();
+ iValidRegion.AddRect(iRect);
+ if(iParentCtrl && iUpdateFlagEnabled)
+ iParentCtrl->UpdateValidRegion(this,EFalse);
+ for (TInt i = 0; i < KShadowBitmapTotalNum; i ++)
+ {
+ iShadowAreaRect[i].Move(aOffset);
+ }
+
+#ifdef RD_TACTILE_FEEDBACK
+ if(IsKindOfControl(ECtrlTactileFeedback) && !Hiden())
+ {
+ UiLayout()->ChangeFeedbackArea(reinterpret_cast<TInt>(this),iRect,oldRect);
+ }
+#endif
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::SetActive
+// Set control active
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::SetActive(TBool aFlag)
+ {
+ iIsActive = aFlag;
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::HandlePointerDownEventL
+// Handle pointer down event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl* CFepUiBaseCtrl::HandlePointerDownEventL(const TPoint& aPoint)
+ {
+ iPointerDown = ETrue;
+ if(iWndControl)
+ {
+ TPointerEvent event;
+ event.iType = TPointerEvent::EButton1Down;
+ event.iPosition = aPoint;
+ event.iModifiers = 0;
+ CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+ gc->Activate( BitmapDevice() );
+
+ iWndControl->HandlePointerEventL(event);
+ }
+ return this;
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::HandlePointerUpEventL
+// Handle pointer up event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl* CFepUiBaseCtrl::HandlePointerUpEventL(
+ const TPoint& aPoint)
+ {
+ iPointerDown = EFalse;
+ if(iWndControl)
+ {
+ TPointerEvent event;
+ event.iType = TPointerEvent::EButton1Up;
+ event.iPosition = aPoint;
+ event.iModifiers = 0;
+ CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+ gc->Activate( BitmapDevice() );
+
+ iWndControl->HandlePointerEventL(event);
+ Draw();
+ }
+
+ return this;
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::HandlePointerMoveEventL
+// Handle pointer move event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl* CFepUiBaseCtrl::HandlePointerMoveEventL(
+ const TPoint& aPoint)
+ {
+ //do nothing if not a CCoeControl
+ if(iWndControl)
+ {
+ TPointerEvent event;
+ if(iPointerDown)
+ event.iType = TPointerEvent::EDrag; //drag event
+ else
+ event.iType = TPointerEvent::EMove; //move event
+ event.iPosition = aPoint;
+ event.iModifiers = 0;
+ CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+ gc->Activate( BitmapDevice() );
+
+ iWndControl->HandlePointerEventL(event);
+ Draw();
+ }
+
+ return this;
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::CancelPointerDownL
+// Cancel pointer down event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::CancelPointerDownL()
+ {
+ if (PointerDown())
+ {
+ iPointerDown = EFalse;
+ iPointerLeft = EFalse;
+ //HandlePointerLeave(TPoint(0, 0));
+ ReportEvent(EEventButtonDownCanceled);
+ Draw();
+ UpdateArea(Rect(), EFalse);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::HandlePositionChange
+// Draw control's frame when control moving
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CFepUiBaseCtrl::HandlePositionChange(const TPoint& aOffset)
+ {
+ TRect rect = iRect;
+
+ Move(aOffset);
+ rect.BoundingRect(iRect);
+ Draw();
+
+ UpdateArea(rect,EFalse);
+
+ return EFalse ;//let others handle the event
+ }
+
+// -----------------------------------------------------------------------------
+// CFepUiBaseCtrl::MovingArea
+// Return observer's moving area
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TRect& CFepUiBaseCtrl::MovingArea()
+ {
+ return iRect;
+ }
+
+// -----------------------------------------------------------------------------
+// CFepUiBaseCtrl::IsFepBaseControl
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CFepUiBaseCtrl::IsFepBaseControl()
+ {
+ return ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::DrawBitmap
+// Draw bitmap
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::DrawBitmap(const CFbsBitmap* aBitmap,TBool aStretchFlag)
+ {
+ TRect bmpRect(TPoint(0,0),aBitmap->SizeInPixels());
+ CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+ if(aStretchFlag && Rect() != bmpRect)
+ {
+ gc->DrawBitmap(Rect(),aBitmap);
+ }
+ else
+ {
+ gc->BitBlt(Rect().iTl,aBitmap,bmpRect);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::DrawBitmap
+// Draw bitmap
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::DrawBitmap(const TRect aRect,const CFbsBitmap* aBitmap,
+ TBool aStretchFlag)
+ {
+ TRect bmpRect(TPoint(0,0),aBitmap->SizeInPixels());
+ CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+ if(aStretchFlag && aRect != bmpRect)
+ {
+ gc->DrawBitmap(aRect,aBitmap);
+ }
+ else
+ {
+ gc->BitBlt(aRect.iTl,aBitmap,bmpRect);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::UpdateArea
+// Update layout area
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::UpdateArea(const TRect& aRect,TBool aUpdateFlag)
+ {
+ if( !Hiden() && ParentCtrl() && (this != UiLayout()->LockareaOwner()) )
+ static_cast<CControlGroup*>(ParentCtrl())->UpdateAreaInGrp(this,aRect,aUpdateFlag);
+ else
+ {
+ iUiLayout->UpdateArea(this,aRect,aUpdateFlag);
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::UpdateAreaImmed
+// Update layout area immediately
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::UpdateAreaImmed(const TRect& aRect,TBool aUpdateFlag)
+ {
+ if( !Hiden() && ParentCtrl() && (this != UiLayout()->LockareaOwner()) )
+ {
+ static_cast<CControlGroup*>(ParentCtrl())->UpdateAreaInGrpImmed(this,aRect,aUpdateFlag);
+ }
+ else
+ {
+ iUiLayout->UpdateArea(this,aRect,aUpdateFlag,ETrue);
+ }
+ }
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::RequireRegionUpdateL
+// Register the control to be region change awared
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::RequireRegionUpdateL(TBool aRequiredFlag)
+ {
+ iRootCtrl->RequireRegionUpdateL(this,aRequiredFlag);
+ }
+
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::HandlePointerLeave
+// Handle pointer leave event
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::HandlePointerLeave(const TPoint& /*aPt*/)
+ {
+ iPointerDown = EFalse;
+ iPointerLeft = ETrue;
+ //report event
+ ReportEvent(EEventPointerLeftControl);
+ Draw();
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::HandlePointerEnter
+// Handle pointer enter event
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::HandlePointerEnter(const TPoint& aPt)
+ {
+ iPointerDown = ETrue;
+ iPointerLeft = EFalse;
+ TRAP_IGNORE(HandlePointerMoveEventL(aPt));
+ //report event
+ ReportEvent(EEventPointerEnterControl);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::ReDrawRect
+// Re draw control rect
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::ReDrawRect(const TRect& /*aRect*/)
+ {
+ Draw();
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::DrawShadowBitmap
+// Draw shadow
+// ---------------------------------------------------------------------------
+
+void CFepUiBaseCtrl::DrawShadowBitmap(const TRect& aRect,TInt aIndex)
+ {
+ CFbsBitmap* bmp = iShadowBmp[aIndex];
+
+ if(!bmp)
+ return;
+
+ //shadow bitmap is always opaque
+ //mask bitmaps
+ CFbsBitmap* maskbmp = iShadowBmp[aIndex + KShadowBitmapTotalNum];
+
+ CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+ if (maskbmp)
+ {
+ gc->Activate( MaskBitmapDevice() );
+
+ //clear the rect
+ gc->SetBrushStyle( CGraphicsContext::ESolidBrush );
+ gc->SetBrushColor( TRgb(KTransparentColor) );//transparency
+ gc->SetPenStyle(CGraphicsContext::ENullPen);
+ gc->DrawRect(aRect);
+
+ gc->DrawRect( aRect );
+ if ((aRect.Size() != bmp->SizeInPixels()) ||
+ (aRect.Size() != maskbmp->SizeInPixels()))
+ {
+ AknIconUtils::SetSize(bmp, aRect.Size(), EAspectRatioNotPreserved);
+ AknIconUtils::SetSize(maskbmp, aRect.Size(), EAspectRatioNotPreserved);
+ }
+ gc->DrawBitmap(aRect, maskbmp, maskbmp->SizeInPixels());
+
+ gc->Activate(BitmapDevice());
+
+ gc->DrawBitmap(aRect, bmp, bmp->SizeInPixels());
+ }
+
+ else
+ {
+ gc->Activate( MaskBitmapDevice() );
+
+ //clear the rect
+ gc->SetBrushStyle( CGraphicsContext::ESolidBrush );
+ gc->SetBrushColor( TRgb(KOpaqueColor) );//non transparency
+ gc->SetPenStyle(CGraphicsContext::ENullPen);
+ gc->DrawRect(aRect);
+ if (aRect.Size() != bmp->SizeInPixels())
+ {
+ AknIconUtils::SetSize(bmp, aRect.Size(), EAspectRatioNotPreserved);
+ }
+
+ gc->Activate(BitmapDevice());
+ gc->DrawBitmap(aRect, bmp, bmp->SizeInPixels());
+ }
+
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::DrawShadow
+// Draw shadow
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::DrawShadow()
+ {
+ for (TInt i = 0; i < KShadowBitmapTotalNum; i ++)
+ {
+ DrawShadowBitmap(iShadowAreaRect[i], i);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::OnDeActivate
+// Response to layout de activation event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::OnDeActivate()
+ {
+ iReady= EFalse;
+ if(iPointerDown)
+ {
+ TRAP_IGNORE(CancelPointerDownL());
+ iPointerDown = EFalse;
+ }
+ iPointerLeft = EFalse;
+ if(iWndControl && !Hiden())
+ iWndControl->MakeVisible(EFalse);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::OnActivate
+// Response to layout activation event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::OnActivate()
+ {
+ //do nothing
+ iReady= ETrue;
+ if(iWndControl && !Hiden())
+ iWndControl->MakeVisible(ETrue);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::OnLayoutDraggingStart
+// Response to layout dragging start event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::OnLayoutDraggingStart()
+ {
+ //do nothing
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::OnLayoutDraggingEnd
+// Response to layout dragging end event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::OnLayoutDraggingEnd()
+ {
+ //do nothing
+ }
+
+// ---------------------------------------------------------------------------
+// Set shadow area rect
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::SetShadowAreaRect(const TRect& aRect,
+ TShadowBitmapIndex aIndex)
+ {
+ iShadowAreaRect[aIndex] = aRect;
+ if(iShadowRect.IsEmpty())
+ iShadowRect = aRect;
+ else
+ iShadowRect.BoundingRect(aRect);
+
+ if(iShadowRect.Size().iWidth > UiLayout()->Rect().Size().iWidth ||
+ iShadowRect.Size().iHeight > UiLayout()->Rect().Size().iHeight)
+ {
+ UiLayout()->LayoutOwner()->LayoutSizeChanged(iShadowRect.Size());
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::Draw
+// Draw control
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::Draw()
+ {
+ //only draw when it's window based control
+ if(iWndControl && AbleToDraw())
+ {
+ CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+
+ DrawOpaqueMaskBackground();
+ gc->Activate( BitmapDevice() );
+ //gc->SetClippingRegion(&ClipRegion());
+ iWndControl->DrawNow();
+ gc->CancelClipping();
+ UpdateArea(iRect, EFalse);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::ConstructFromResourceL
+// handle resource change
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::ConstructFromResourceL()
+ {
+ // do nothing
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::SetResourceId
+// Set resurce Id
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::SetResourceId(TInt32 aResId)
+ {
+ iResourceId = aResId;
+ }
+
+// ---------------------------------------------------------------------------
+// Set shadow bitmap
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::SetShadowBmp(CFbsBitmap* aBmp,
+ CFbsBitmap* aMaskBmp,TShadowBitmapIndex aIndex)
+ {
+ //remove previous one
+ delete iShadowBmp[aIndex];
+ delete iShadowBmp[aIndex+KShadowBitmapTotalNum];
+ iShadowBmp[aIndex] = aBmp;
+ iShadowBmp[aIndex+KShadowBitmapTotalNum] = aMaskBmp;
+ }
+
+EXPORT_C TBool CFepUiBaseCtrl::AbleToDraw()
+ {
+ return UiLayout()->LayoutReady() && Ready() && !WholeHiden() && Rect().Size() != TSize(0,0);
+ }
+
+// ---------------------------------------------------------------------------
+// Get extension
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CFepUiBaseCtrl::Extension_(TUint aExtensionId, TAny *&a0, TAny *a1)
+ {
+ //not implemented, use CBase's
+ return CBase::Extension_(aExtensionId, a0, a1);
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::WholeHiden
+// Return if hiden all controls
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CFepUiBaseCtrl::WholeHiden()
+ {
+ if ( Hiden() )
+ {
+ return ETrue;
+ }
+
+ CFepUiBaseCtrl* parentCtrl = ParentCtrl();
+ while( parentCtrl )
+ {
+ if ( parentCtrl->Hiden() )
+ {
+ return ETrue;
+ }
+ parentCtrl = parentCtrl->ParentCtrl();
+ }
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::ValidClipRegion
+// Get the clipping region
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TRegion& CFepUiBaseCtrl::ValidClipRegion()
+ {
+ iClipRegionWithoutLockedArea.Clear();
+ iClipRegionWithoutLockedArea.Copy(iClipRegion);
+ /***********************************************************************/
+ /*!!!! Seems a problem here, what if this area is locked by myself? */
+ /***********************************************************************/
+ iClipRegionWithoutLockedArea.SubRect(UiLayout()->LockedArea());
+ return iClipRegionWithoutLockedArea;
+ }
+
+// -----------------------------------------------------------------------------
+// CFepUiBaseCtrl::OnResourceChange
+// Handle system resource change
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::HandleResourceChange(TInt aType)
+ {
+ if(iWndControl)
+ iWndControl->HandleResourceChange(aType);
+ }
+// -----------------------------------------------------------------------------
+// CFepUiBaseCtrl::GraphicDeviceSizeChanged
+// Handle pen UI graphic device size change event
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::GraphicDeviceSizeChanged()
+ {
+ //do nothing
+ }
+
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::SimulatePointerEvent
+// Simulates an internal pointer event
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepUiBaseCtrl::SimulateRawEvent(const TRawEvent& aEvent)
+ {
+ TRAP_IGNORE(RootControl()->HandleEventL(ERawEvent,&aEvent));
+ }
+
+
+EXPORT_C void CFepUiBaseCtrl::SetParent(CFepUiBaseCtrl* aParent)
+ {
+ //parent control must be type of control group.
+ if(aParent)
+ {
+ __ASSERT_DEBUG(aParent->IsKindOfControl(ECtrlControlGroup),EUiLayoutBadParentType);
+ }
+ iParentCtrl = aParent;
+ }
+
+EXPORT_C void CFepUiBaseCtrl::SetOrdinalPos(TInt aPos)
+ {
+ iOrdinalPos = aPos;
+ }
+
+EXPORT_C TInt CFepUiBaseCtrl::AbsOrderPos()
+ {
+ TInt order = OrderPos();
+ if(ParentCtrl())
+ order += ParentCtrl()->AbsOrderPos();
+ return order;
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::CFepUiBaseCtrlExtension
+//
+// ---------------------------------------------------------------------------
+//
+
+CFepUiBaseCtrl::CFepUiBaseCtrlExtension::CFepUiBaseCtrlExtension(TInt aTactileType)
+ {
+#ifdef RD_TACTILE_FEEDBACK
+ iTactileType = aTactileType;
+#endif // RD_TACTILE_FEEDBACK
+ }
+
+void CFepUiBaseCtrl::CFepUiBaseCtrlExtension::SetTactileFeedbackType(TInt aTactileType)
+ {
+#ifdef RD_TACTILE_FEEDBACK
+ iTactileType = aTactileType;
+#endif // RD_TACTILE_FEEDBACK
+ }
+
+EXPORT_C TInt CFepUiBaseCtrl::CFepUiBaseCtrlExtension::TactileFeedbackType()
+ {
+#ifdef RD_TACTILE_FEEDBACK
+ return iTactileType;
+#else
+ return 0;
+#endif // RD_TACTILE_FEEDBACK
+ }
+