mulwidgets/mulsliderwidget/src/mulhorizontalslider.cpp
branchRCL_3
changeset 26 0e9bb658ef58
parent 0 e83bab7cf002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mulwidgets/mulsliderwidget/src/mulhorizontalslider.cpp	Wed Sep 01 12:23:18 2010 +0100
@@ -0,0 +1,1207 @@
+/*
+* Copyright (c) 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:  The implementation for presentation elements.
+*
+*/
+
+#include <avkon.hrh>
+#include <avkon.mbg> 
+//Toolkit Includes
+// Alfred Client includes
+#include <alf/alfenv.h>
+#include <alf/alfroster.h>
+#include <alf/alfdisplay.h>
+#include <alf/alfbitmapprovider.h>
+#include <alf/alftexture.h> 
+#include <alf/alfbrusharray.h>
+#include <alf/alftextvisual.h>
+#include <alf/alfevent.h>
+
+//Widget Model Includes
+#include <alf/alfwidgetevents.h>
+#include <alf/alfwidgetenvextension.h>
+#include <alf/ialfmodel.h>
+
+//Avkon Includes
+#include <AknUtils.h>
+#include <AknsConstants.h>
+#include <utf.h> 
+#include <math.h>
+
+//slider widget includes
+#include <mul/mulevent.h>
+#include "mulsliderhorizontal.h"
+#include "mulsliderwidget.h"
+#include "mulslidercontrol.h"
+#include "mulslidermodel.h"
+#include "mulsliderdefinitions.h"
+
+#include "mulsliderutils.h"
+
+//Timer function includes
+#include "mulsliderlongtaptimer.h"
+
+
+namespace Alf
+    {
+    
+// Structure to store data for the slider element class    
+
+ struct MulHorizontalSliderDataImpl
+     {
+
+     bool mOperation;// Drag state	
+     float mTickInPixels;// Tick size in Pixel
+     bool mIsLongTapObserverSet;// Is LongTap Event observer set
+     CAlfVisual * mVisual;// Stores thje current visual hit 
+     TPoint mDragPoint;// Point at which drag started 
+     TPoint mLongTapPos;// Point at which button down happened 
+     bool mLongTapStarted;// Long tap timer started (true)
+     int mDragStartStep;// Tick positon of Drag Start
+     int mCurrTick;// Stores current tick
+     int mTrackStartPoint;// Slider Track Start Point in pixel
+     int mTick;// Stores Tick Size
+     bool mLayoutMirrored;// 
+     int mdirection;// 0 - nomovement,1 left movement 2 right
+     int mImageTextureId; // to differtiate between textures 
+     int mTrackTopTextureId;// to store the auto generated texture id's
+     int mTrackBottomTextureId;
+     int mTrackMiddleTextureId;
+     int mMarkerTextureId;
+     // Visualization Layouts
+     CAlfLayout* mMainLayout;
+     CAlfLayout* mBaseSliderLayout;
+     CAlfLayout* mSliderCentre;
+     CAlfImageVisual* mTrackLeftImage;
+     CAlfImageVisual* mTrackMiddleImage;
+     CAlfImageVisual* mTrackRightImage;
+     CAlfLayout* mSliderCentreGhost;
+     CAlfImageVisual* mSliderHandle;
+     CAlfLayout* mSliderHandleGhost;
+     CAlfImageVisual* mSliderProgressDownload;
+     CAlfImageVisual* mSliderProgressCentre;
+     CAlfTexture* mTexture;
+
+     MulHorizontalSliderDataImpl()
+         {
+         mOperation = 0;	
+         mTickInPixels = 0;
+         mIsLongTapObserverSet = 0;
+         mDragPoint.SetXY(0,0) ;
+         mLongTapPos.SetXY(0,0);
+         mLongTapStarted = 0;
+         mDragStartStep = 0;
+         mCurrTick = 0;
+         mTrackStartPoint = 0;
+         mImageTextureId = 0;
+         mTrackTopTextureId = 0 ;
+         mTrackBottomTextureId = 0;
+         mTrackMiddleTextureId = 0;
+         mMarkerTextureId = 0;
+         mVisual = NULL;
+         mMainLayout = NULL;
+         mBaseSliderLayout = NULL;  
+         mSliderCentre = NULL;
+         mSliderHandle = NULL;
+         mSliderProgressCentre = NULL;
+         mBaseSliderLayout     = NULL;       
+         mSliderCentreGhost = NULL;
+         mSliderHandleGhost = NULL;   
+         mLayoutMirrored = false;  
+         mdirection = 0;
+         } 
+
+     };
+ 
+ // Bitmaps for slider
+_LIT(KAvkonBitmapFile,"\\resource\\apps\\avkon2.mbm"); 
+//_LIT(KImageViewerBitmapFile,"\\resource\\apps\\ImageViewer.mif");
+// Bitmap Texture ID
+const TInt KAlfTrackTopTextureId = 1;
+const TInt KAlfTrackBottomTextureId = 2;
+const TInt KAlfTrackMiddleTextureId = 3;
+const TInt KAlfMarkerTextureId = 4;
+//const TInt KAlfMarkerSelectedTextureId = 5;
+        
+// ---------------------------------------------------------------------------
+//  C++ default constructor.
+// ---------------------------------------------------------------------------
+//
+MulSliderHorizontal::MulSliderHorizontal(
+                                    CAlfWidgetControl& aControl,
+                                    const char* aName, 
+                                    AlfCustomInitDataBase* /*aCustomData*/)
+    : mData(NULL)
+    {
+    // Base class (AlfElement) construct
+    construct(aControl, aName);
+    mData = new (EMM) MulHorizontalSliderDataImpl;
+	mPosData.reset(new(EMM)MulSliderPos);
+	// Timer for generating tap and hold repeat events  
+    mLongTapTimer.reset(new (EMM) MulSliderLongTapTimer(this)); 
+    mDragVisual = NULL; 
+    mSliderModel = NULL;
+    mSliderWidget = NULL; 
+    // Store the widget and model pointer
+    initializeSliderData();  
+    }
+
+// ---------------------------------------------------------------------------
+//  Destructor
+// ---------------------------------------------------------------------------
+//
+MulSliderHorizontal::~MulSliderHorizontal()
+    {
+    if(mData)
+        {
+       
+        (&control().Env())->TextureManager().UnloadTexture(mData->mTrackTopTextureId);
+        (&control().Env())->TextureManager().UnloadTexture(mData->mTrackBottomTextureId);
+        (&control().Env())->TextureManager().UnloadTexture(mData->mTrackMiddleTextureId);
+        // (&control().Env())->TextureManager().UnloadTexture(KAlfMarkerSelectedTextureId);
+        (&control().Env())->TextureManager().UnloadTexture(mData->mMarkerTextureId);
+        // Visualization Data
+        delete mData;
+        }
+    else
+        {
+
+        }
+
+    }//End of Destructor
+
+// ---------------------------------------------------------------------------
+// From class MAlfInterfaceBase.
+// Getter for interfaces provided by the slider widget.
+// ---------------------------------------------------------------------------
+//
+IAlfInterfaceBase* MulSliderHorizontal::makeInterface(
+                        const IfId& aType)
+    {
+    UString param (aType.mImplementationId);
+     if (param == IAlfWidgetEventHandler::type().mImplementationId)
+        {
+        return static_cast<IAlfWidgetEventHandler*>(this);
+        }
+
+    else if (param == 
+        IMulSliderBaseElementInternal::type().mImplementationId)
+        {
+        return static_cast<IMulSliderBaseElementInternal*>(this);
+        }  
+    else
+        {
+        return AlfElement ::makeInterface(aType);
+        }  
+   
+    }
+
+
+//--------------------------------------------------------------------------
+// APIs from the IMulSliderBaseElement 
+//--------------------------------------------------------------------------
+
+// ---------------------------------------------------------------------------
+// Gets called when the parent layout is relayouted.
+// resets all the anchor points and updates the visualization
+// ---------------------------------------------------------------------------
+//
+void MulSliderHorizontal::baseLayoutSizeChanged()
+    {
+    mData->mMainLayout->ClearFlag(EAlfVisualFlagLayoutUpdateNotification); 
+    if(mData->mMainLayout)
+        {
+        // This is a hack to resolve screen refresh issue
+        control().Env().RefreshCallBack(&(control().Env()));
+        // Layout the visualization with correct LCT values 
+        layoutVisuals(mSliderModel->GetTemplate());
+        // Convert all the user defined data to pixels
+        ConvertDataToPixels();
+        // Set the thumb position to the current tick
+        SetThumbPosition();
+        if(!mSliderModel->IsLandscape())
+            {
+            if(mSliderWidget->GetOpacity())
+                {
+                TAlfTimedValue opacity(1,0);
+                mData->mMainLayout->SetOpacity(opacity);
+                }
+            }
+        else
+            {
+            TAlfTimedValue opacity(0,0);
+            mData->mMainLayout->SetOpacity(opacity);
+            } 
+        } 
+
+    mData->mMainLayout->SetFlag(EAlfVisualFlagLayoutUpdateNotification);   
+    }
+
+// ---------------------------------------------------------------------------
+// From class IAlfWidgetEventHandler.
+// ---------------------------------------------------------------------------
+//  
+
+
+// ---------------------------------------------------------------------------
+//  Destructor
+// ---------------------------------------------------------------------------
+//
+void MulSliderHorizontal::setActiveStates(
+    unsigned int /*aStates*/)
+    {
+    //do nothing
+    }
+
+
+
+// ---------------------------------------------------------------------------
+//  initializes Model and Widget Pointer
+// ---------------------------------------------------------------------------
+//
+
+void  MulSliderHorizontal::initializeSliderData() 
+    {
+    // initialize the Slider Widget Pointer;
+    IAlfWidgetFactory& widgetFactory = 
+    AlfWidgetEnvExtension::widgetFactory(control().Env());
+    mSliderWidget = static_cast<MulSliderWidget*>(widgetFactory.findWidget(
+            control().widget()->widgetName()));
+
+    // initialize the Slider Model Pointer;
+    mSliderModel = static_cast<MulSliderModel*>(mSliderWidget->model());
+    }
+    
+// ---------------------------------------------------------------------------
+// layoutVisuals
+// ---------------------------------------------------------------------------
+// 
+void MulSliderHorizontal::layoutVisuals(sliderTemplate /*aTemplateId*/)
+    {
+    // TAknLayoutRect to store the Lct rect 
+    TAknLayoutRect layoutRect;
+    CAlfControl* ctrl = (CAlfControl*)&control();
+
+    //get the lct rect for mBaseSliderLayout and set it 
+    //aacf_slider_pane(0)
+    layoutRect = MulSliderUtils::GetComponentRect(
+            EHSliderPane, 
+            mData->mMainLayout,
+            KVariety0);
+    mData->mBaseSliderLayout->SetRect(
+            TRect( TPoint( 0,0 ),
+                    TSize( layoutRect.Rect().Size().iWidth, 
+                            layoutRect.Rect().Size().iHeight ))) ;
+
+    mData->mSliderCentreGhost->SetRect(
+            TRect( TPoint( 0,0 ),
+                    TSize( layoutRect.Rect().Size().iWidth, 
+                            layoutRect.Rect().Size().iHeight ))) ;
+
+    //get the lct rect for mSliderCentre and set it 
+    //aaslider_bg_pane(0)
+    layoutRect = MulSliderUtils::GetComponentRect(
+            EHSliderCenter,
+            mData->mBaseSliderLayout,
+            KVariety0);
+
+
+    mData->mSliderCentre->SetRect(
+            TRect( TPoint(layoutRect.Rect().iTl.iX,
+                    layoutRect.Rect().iTl.iY ),
+                    TSize( layoutRect.Rect().Size().iWidth, 
+                            layoutRect.Rect().Size().iHeight))) ; 
+
+
+   
+    //TAknLayoutRect handleGostRect = layoutRect;    
+    //get the lct rect for mSliderHandle and set it 
+    //aacf_slider_pane_g1(0)
+    layoutRect = MulSliderUtils::GetComponentRect(
+            EHSliderHandle,mData->mBaseSliderLayout,KVariety1);
+
+    // This is a correction since the handle LCT data is not correct
+   /* mData->mSliderHandle->SetRect(
+            TRect( TPoint(handleGostRect.Rect().iTl.iX + 
+                    (handleGostRect.Rect().Size().iWidth - 
+                            layoutRect.Rect().Size().iWidth)/2    ,
+                            handleGostRect.Rect().iTl.iY + 
+                            (handleGostRect.Rect().Size().iHeight -
+                                    layoutRect.Rect().Size().iHeight)/2 ),
+                                    TSize( layoutRect.Rect().Size().iWidth, 
+                                            layoutRect.Rect().Size().iHeight ))) ; */
+    mData->mSliderHandle->SetRect(
+                TRect( TPoint(layoutRect.Rect().iTl.iX,
+                        layoutRect.Rect().iTl.iY ),
+                                        TSize( layoutRect.Rect().Size().iWidth, 
+                                                layoutRect.Rect().Size().iHeight ))) ;
+    mData->mSliderHandleGhost->SetRect(
+               TRect( TPoint(layoutRect.Rect().iTl.iX,
+                       mData->mBaseSliderLayout->Pos().iX.ValueNow() ),
+                       TSize( layoutRect.Rect().Size().iWidth, 
+                               mData->mBaseSliderLayout->Size().iY.ValueNow() ))) ;
+    //get the lct rect for mTrackLeftImage and set it 
+    //aaslider_bg_pane_g1(0)  
+    layoutRect = MulSliderUtils::GetComponentRect(
+            EHSliderLeft,mData->mSliderCentre,0);
+
+    mData->mTrackLeftImage->SetRect(
+            TRect( TPoint(layoutRect.Rect().iTl.iX,
+                    layoutRect.Rect().iTl.iY ),
+                    TSize( layoutRect.Rect().Size().iWidth, 
+                            layoutRect.Rect().Size().iHeight ))) ; 
+
+    //get the lct rect for mTrackMiddleImage and set it 
+    //aaslider_bg_pane_g2_copy1(0)
+    layoutRect = MulSliderUtils::GetComponentRect(
+            EHSliderCentre,mData->mSliderCentre,0);
+
+    mData->mTrackMiddleImage->SetRect(
+            TRect( TPoint(layoutRect.Rect().iTl.iX,
+                    layoutRect.Rect().iTl.iY ),
+                    TSize( layoutRect.Rect().Size().iWidth,
+                            layoutRect.Rect().Size().iHeight ))) ; 
+
+    //get the lct rect for mTrackRightImage and set it 
+    //aaslider_bg_pane_g2(0)
+    layoutRect = MulSliderUtils::GetComponentRect(
+            EHSliderRight,mData->mSliderCentre,0);
+
+    mData->mTrackRightImage->SetRect(
+            TRect( TPoint(layoutRect.Rect().iTl.iX,
+                    layoutRect.Rect().iTl.iY ),
+                    TSize( layoutRect.Rect().Size().iWidth, 
+                            layoutRect.Rect().Size().iHeight ))) ; 
+
+
+    if(mData->mTrackLeftImage && 
+            mData->mTrackMiddleImage && 
+            mData->mTrackRightImage)
+        {
+        setTrackImage();
+        }
+
+    if(mData->mSliderHandle)
+        {
+        mData->mImageTextureId = KAlfMarkerTextureId;
+        mData->mTexture = &((ctrl->Env()).TextureManager().CreateTextureL(
+                KAlfAutoGeneratedTextureId/*KAlfMarkerTextureId*/,
+                (MAlfBitmapProvider *)this,
+                (TAlfTextureFlags)(EAlfTextureFlagRetainResolution|EAlfTextureFlagSkinContent)));
+
+        TAlfImage markerImage(*mData->mTexture );
+        mData->mSliderHandle->SetImage(markerImage);
+
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// Used for setting images for the track 
+// ---------------------------------------------------------------------------
+//
+
+void MulSliderHorizontal::setTrackImage()
+    {
+    TInt flags = EAlfTextureFlagSkinContent;
+    flags |= EAlfTextureFlagAutoSize;
+    CAlfControl* ctrl = (CAlfControl*)&control();
+    //create texture for leftimage
+    mData->mImageTextureId = KAlfTrackTopTextureId;
+    mData->mTexture = &((ctrl->Env()).TextureManager().CreateTextureL(
+            KAlfAutoGeneratedTextureId/*KAlfTrackTopTextureId*/,
+            (MAlfBitmapProvider *)this,
+            (TAlfTextureFlags)(EAlfTextureFlagRetainResolution|
+                    EAlfTextureFlagSkinContent)));
+
+    TAlfImage trackLeftImage(*mData->mTexture );
+
+    //create texture for middleimage
+    mData->mImageTextureId = KAlfTrackMiddleTextureId;
+    mData->mTexture = &((ctrl->Env()).TextureManager().CreateTextureL(
+            KAlfAutoGeneratedTextureId/*KAlfTrackMiddleTextureId*/,
+            (MAlfBitmapProvider *)this,
+            (TAlfTextureFlags)(EAlfTextureFlagRetainResolution|
+                    EAlfTextureFlagSkinContent)));
+    TAlfImage trackMiddleImage(*mData->mTexture );
+    //create texture for right image
+    mData->mImageTextureId = KAlfTrackBottomTextureId;
+    mData->mTexture = &((ctrl->Env()).TextureManager().CreateTextureL(
+            KAlfAutoGeneratedTextureId/*KAlfTrackBottomTextureId*/,
+            (MAlfBitmapProvider *)this,
+            (TAlfTextureFlags)(EAlfTextureFlagRetainResolution|
+                    EAlfTextureFlagSkinContent)));
+
+    TAlfImage trackRightImage(*mData->mTexture );
+    // Set Image on visuals
+    if(AknLayoutUtils::LayoutMirrored())
+        {
+        mData->mTrackLeftImage->SetImage(trackRightImage);
+        mData->mTrackRightImage->SetImage(trackLeftImage);
+        }
+    else
+        {
+        mData->mTrackLeftImage->SetImage(trackLeftImage);
+        mData->mTrackRightImage->SetImage(trackRightImage);
+        }
+
+    mData->mTrackMiddleImage->SetImage(trackMiddleImage); 
+
+    }//End of setImage
+        
+// ---------------------------------------------------------------------------
+// ProvideBitmapL()
+// ---------------------------------------------------------------------------
+//
+void MulSliderHorizontal::ProvideBitmapL (TInt aId, 
+                                         CFbsBitmap *& aBitmap, 
+                                         CFbsBitmap *& aMaskBitmap)
+    {
+    TAknLayoutRect layoutRect;
+    TRect rect;
+    TSize size;
+    switch(mData->mImageTextureId)
+        {
+        case KAlfTrackTopTextureId:
+            {
+            AknIconUtils::CreateIconL(
+                   aBitmap,
+                   aMaskBitmap,
+                   KAvkonBitmapFile,
+                   EMbmAvkonQgn_graf_nslider_end_left,
+                   EMbmAvkonQgn_graf_nslider_end_left_mask );
+
+
+            layoutRect = MulSliderUtils::GetComponentRect(
+                   EHSliderLeft,mData->mSliderCentre,KVariety0);
+
+            AknIconUtils::SetSize( aBitmap,
+                   TSize(layoutRect.Rect().Size().iWidth,
+                           layoutRect.Rect().Size().iHeight),
+                           EAspectRatioNotPreserved);
+            mData->mImageTextureId = 0;
+            mData->mTrackTopTextureId = aId;
+            }
+            break;
+        case KAlfTrackBottomTextureId:
+            {
+            AknIconUtils::CreateIconL(
+                    aBitmap,
+                    aMaskBitmap,
+                    KAvkonBitmapFile,
+                    EMbmAvkonQgn_graf_nslider_end_right,
+                    EMbmAvkonQgn_graf_nslider_end_right_mask );
+            layoutRect = MulSliderUtils::GetComponentRect(
+                    EHSliderRight,
+                    mData->mSliderCentre,
+                    KVariety0);
+
+            AknIconUtils::SetSize( aBitmap,
+                    TSize(layoutRect.Rect().Size().iWidth,
+                            layoutRect.Rect().Size().iHeight),
+                            EAspectRatioNotPreserved);
+
+    
+            mData->mImageTextureId = 0;
+            mData->mTrackBottomTextureId = aId;
+            }
+            break;
+        case KAlfTrackMiddleTextureId:
+            {
+            AknIconUtils::CreateIconL(
+                    aBitmap,
+                    aMaskBitmap,
+                    KAvkonBitmapFile,
+                    EMbmAvkonQgn_graf_nslider_middle,
+                    EMbmAvkonQgn_graf_nslider_middle_mask );
+
+            //AknIconUtils::SetSize( aBitmap,TSize(304,14),EAspectRatioNotPreserved);    
+            layoutRect = MulSliderUtils::GetComponentRect(
+                    EPSliderCentre,
+                    mData->mSliderCentre,
+                    KVariety0);
+            AknIconUtils::SetSize( aBitmap,
+                    TSize(layoutRect.Rect().Size().iWidth,
+                            layoutRect.Rect().Size().iHeight),
+                            EAspectRatioNotPreserved);
+            mData->mImageTextureId = 0;
+            mData->mTrackMiddleTextureId = aId;
+            }
+            break;
+        case KAlfMarkerTextureId:
+            {
+            AknIconUtils::CreateIconL(
+                    aBitmap,
+                    aMaskBitmap,
+                    KAvkonBitmapFile,
+                    EMbmAvkonQgn_graf_nslider_marker,
+                    EMbmAvkonQgn_graf_nslider_marker_mask );            
+
+            layoutRect = MulSliderUtils::GetComponentRect(
+                    EHSliderHandle,
+                    mData->mBaseSliderLayout,
+                    KVariety1);
+
+            AknIconUtils::SetSize( aBitmap,
+                    TSize(layoutRect.Rect().Size().iWidth,
+                            layoutRect.Rect().Size().iHeight),
+                            EAspectRatioNotPreserved);
+            mData->mImageTextureId = 0;
+            mData->mMarkerTextureId = aId;
+            }
+        default:
+            break;
+               
+        }
+    }
+ 
+    
+// ---------------------------------------------------------------------------
+//  ConvertDataToPixels
+// ---------------------------------------------------------------------------
+// 
+void MulSliderHorizontal::ConvertDataToPixels()   
+    {
+    // Calculate the range in pixel values
+    int distance = (mData->mSliderCentre->Size().iX.ValueNow() - 
+            mData->mSliderHandle->Size().iX.ValueNow());
+    if((mSliderModel->MaxRange() - mSliderModel->MinRange()) != 0)
+        {
+        // Calculate Tick Size in Pixels
+        mData->mTickInPixels = 
+        (float)distance /(mSliderModel->MaxRange() 
+                - mSliderModel->MinRange()) ;                             
+        }
+    // Get the track start pixel value  
+    mData->mTrackStartPoint = mData->mSliderCentre->Pos().iX.ValueNow()   ;  
+    // Store current tick
+    mData->mCurrTick =  mSliderModel->PrimaryValue() ; 
+    mData->mTick = mSliderModel->Tick();
+    }
+    
+    
+// ---------------------------------------------------------------------------
+//  createVisualization
+// ---------------------------------------------------------------------------
+// 
+void MulSliderHorizontal::createVisualization(sliderTemplate /*aTemplateId*/)
+    {
+    // Create the visualization
+    CAlfControl* ctrl = (CAlfControl*)&control();
+    // Visual Hierarchy creation
+    //creating mMainLayout 
+    mData->mMainLayout = CAlfLayout::AddNewL(*ctrl,NULL); 
+    // set the flag for Notifications and mirroring  
+    mData->mMainLayout->SetFlag(EAlfVisualFlagLayoutUpdateNotification);
+    mData->mMainLayout->SetFlag(EAlfVisualFlagAutomaticLocaleMirroringEnabled);
+    // create mBaseSliderLayout 
+    mData->mBaseSliderLayout = CAlfLayout::AddNewL(*ctrl,mData->mMainLayout);
+    mData->mBaseSliderLayout->SetFlag(EAlfVisualFlagAutomaticLocaleMirroringEnabled);
+    //create dummy layout for slider track
+    mData->mSliderCentreGhost = 
+    CAlfLayout::AddNewL(*ctrl,mData->mBaseSliderLayout);
+    //create dummy layout for slider Thumb
+    // create imagevisual for slider track
+    mData->mSliderCentre = 
+    CAlfLayout::AddNewL(*ctrl,mData->mBaseSliderLayout);
+    mData->mTrackLeftImage = CAlfImageVisual::AddNewL(*ctrl,mData->mSliderCentre);
+    mData->mTrackMiddleImage = CAlfImageVisual::AddNewL(*ctrl,mData->mSliderCentre);
+    mData->mTrackRightImage = CAlfImageVisual::AddNewL(*ctrl,mData->mSliderCentre);
+
+    // create imagevisual for slider thumb 
+    mData->mSliderHandle = 
+    CAlfImageVisual::AddNewL(*ctrl,mData->mBaseSliderLayout);
+    // Attach brush and transfer its ownership to the visual.
+    mData->mSliderHandleGhost = 
+    CAlfLayout::AddNewL(*ctrl,mData->mBaseSliderLayout);                           
+
+    // Get the widget opacity and apply on root visual
+    mSliderWidget->ShowWidget(mSliderWidget->GetOpacity(),0);
+    }
+    
+
+// ---------------------------------------------------------------------------
+//  eventHandlerType          
+// ---------------------------------------------------------------------------
+//
+IAlfWidgetEventHandler::AlfEventHandlerType MulSliderHorizontal::eventHandlerType()
+    {
+    return IAlfWidgetEventHandler::EPresentationEventHandler;
+    }
+
+
+// ---------------------------------------------------------------------------
+//  eventExecutionPhase         
+// ---------------------------------------------------------------------------
+//
+IAlfWidgetEventHandler::AlfEventHandlerExecutionPhase MulSliderHorizontal::eventExecutionPhase()
+    {
+    return IAlfWidgetEventHandler::ETunnellingPhaseEventHandler;
+    }
+
+// ---------------------------------------------------------------------------
+//  offerEvent
+// ---------------------------------------------------------------------------
+//
+AlfEventStatus MulSliderHorizontal::offerEvent( CAlfWidgetControl& /*aControl*/, 
+                                              const TAlfEvent& aEvent )
+    {    
+    AlfEventStatus ret = EEventNotHandled;	
+    if(!mSliderWidget->IsHidden())
+        {	    
+        if(aEvent.IsCustomEvent())
+            {
+            if(aEvent.CustomParameter() == EEventMissedPointerUp)
+                {
+                mData->mLongTapStarted = false;
+                ret=EEventHandled;
+                handlePointerUpEvent();
+                }
+            }
+        // handle key events    
+        else if(aEvent.IsKeyEvent() &&  mSliderWidget->IsKeyEnabled())
+            { 		
+            ret = HandleKeyEvents(aEvent);	             
+            }    		    
+        // Pointer drag events and single tap events      
+        else if(aEvent.IsPointerEvent())
+            {
+            ret = HandlePointerEvents((TAlfEvent *)&aEvent);	    
+            }     
+        }
+    return ret;
+    } 
+    
+    
+// ---------------------------------------------------------------------------
+//  handleLongTap ( Long TapTimer calls  inside its RUNL)
+// ---------------------------------------------------------------------------
+// 
+ AlfEventStatus MulSliderHorizontal::handleLongTap()
+     {
+     mData->mMainLayout->ClearFlag(EAlfVisualFlagLayoutUpdateNotification);
+     //CAlfVisual * focusvisual = aEvent->Visual();
+     AlfEventStatus ret = EEventNotHandled;
+     if (mData->mVisual == mData->mSliderCentre || mData->mVisual == mData->mSliderCentreGhost)
+         {
+         mData->mLongTapStarted = true;
+         ret =  trackVisualHit(mData->mVisual);
+         // Handle Long tap timer tactile feedback 
+         MulSliderControl& sldrcntrl = static_cast<MulSliderControl&>(control());
+         sldrcntrl.TactileEffectOnTouchandHold();
+         }
+
+     //  ret = HandlePointerEvents(aEvent);
+     mData->mMainLayout->SetFlag(EAlfVisualFlagLayoutUpdateNotification);
+     return ret;
+     }
+    
+    
+// ---------------------------------------------------------------------------
+// HandleKeyEvents
+// ---------------------------------------------------------------------------
+// 
+ AlfEventStatus MulSliderHorizontal::HandleKeyEvents(const TAlfEvent& aEvent)
+     {
+     AlfEventStatus ret = EEventNotHandled;
+     int newPos = 0;
+     int data = 0;
+     if(AknLayoutUtils::LayoutMirrored())
+         {
+         data= - mData->mTick;
+         }
+     else
+         {
+         data= mData->mTick;
+         }
+     if(aEvent.Code() == EEventKey  )
+         {
+         if(aEvent.KeyEvent().iScanCode == EStdKeyRightArrow)
+             {
+             ret = EEventHandled;
+             newPos = mSliderModel->PrimaryValue() + data;
+             updateModelPrimaryValue(newPos);          
+             }
+         else if(aEvent.KeyEvent().iScanCode == EStdKeyLeftArrow)
+             {
+             ret = EEventHandled;
+             newPos = mSliderModel->PrimaryValue() - data;
+             updateModelPrimaryValue(newPos);
+             }
+         }
+     return ret;
+     }
+	
+	
+// ---------------------------------------------------------------------------
+//  Sends drag Up or Down event, according to the hit position
+//  on track
+// ---------------------------------------------------------------------------
+//
+AlfEventStatus MulSliderHorizontal::trackVisualHit(CAlfVisual * /*aHitVisual*/)
+    {
+
+    //Find the thumb Anchor Layout.
+    TAlfTimedPoint thumbVisPos = mData->mSliderHandle->Pos();
+    TAlfTimedPoint thumbVisSize = mData->mSliderHandle->Size();
+    //Check if click was above/to left or below/to right of 
+    //thumb
+    if (mData->mLongTapPos.iX  < thumbVisPos.iX.ValueNow())
+        {// Pointer down happened left side of Handle 
+
+        int newPos = mSliderModel->PrimaryValue() - mData->mTick;
+        if(mData->mLongTapStarted)
+            {
+            if(mData->mdirection !=2)
+                  {
+            	// Move Handle 
+            	updateModelPrimaryValue(newPos);
+            	mData->mdirection = 1;
+            	}
+            }
+        }
+    else if (mData->mLongTapPos.iX  > (thumbVisPos.iX.ValueNow() + 
+            thumbVisSize.iX.ValueNow()) )
+        {
+        // Pointer down happened right side of Handle
+        int newPos = mSliderModel->PrimaryValue() + mData->mTick;
+        if(mData->mLongTapStarted)
+            {
+            if(mData->mdirection !=1)
+                {
+            	// Move Handle
+            	updateModelPrimaryValue(newPos);
+            	mData->mdirection = 2;
+            	}
+            }  
+        }
+    else 
+        {
+        if(mData->mIsLongTapObserverSet)
+            {
+            // Stop the long tap timer
+            mLongTapTimer->Stop();
+            mData->mLongTapStarted = false;
+            if(AknLayoutUtils::LayoutMirrored() )
+                {
+                mData->mLongTapPos.iX = mData->mMainLayout->Size().iX.ValueNow() - 
+                mData->mLongTapPos.iX;
+                }
+            mData->mIsLongTapObserverSet = EFalse;  
+            if(!mData->mOperation)
+                {
+                mData->mVisual  =  mData->mSliderHandle;
+                initializeThumbDragData(
+                        mData->mLongTapPos);
+                }  
+            }
+        else
+            {
+            //Do Nothing.
+            }                            
+        }
+    return EEventHandled;
+    }	
+
+	
+// ---------------------------------------------------------------------------
+//  handles the pointerDown event
+// 
+// ---------------------------------------------------------------------------
+//
+AlfEventStatus MulSliderHorizontal::handlePointerDownEvent(TAlfEvent * aPntrEvent)
+    {
+    CAlfVisual * focusvisual = aPntrEvent->Visual();
+    AlfEventStatus result = EEventNotHandled;
+    if (focusvisual)
+        {
+        mData->mVisual = focusvisual; 
+
+        if (IsSliderVisual(focusvisual))
+            {
+            control().processEvent(TAlfEvent(ECustomEventIconClick));  
+            control().Display()->Roster().SetPointerEventObservers( 
+                    EAlfPointerEventReportDrag ,control());
+            if(!mData->mOperation)   
+                {  
+                mData->mIsLongTapObserverSet = ETrue;
+                //mData->mLongTapPos = aPntrEvent->PointerEvent().iParentPosition;
+                mirrorPointerPosition(aPntrEvent->PointerEvent().iParentPosition);
+                mData->mLongTapStarted = true;
+                mLongTapTimer->Start();
+                // Dont send custom event at pointer up
+
+                }
+            //Tick Movement
+            if (focusvisual == mData->mSliderCentre ||
+                    focusvisual == mData->mSliderCentreGhost)
+                {
+                mData->mLongTapStarted = true;
+                return trackVisualHit(focusvisual);
+                }
+
+            // Drag 
+            else if (focusvisual == mData->mSliderHandle ||
+                    focusvisual == mData->mSliderHandleGhost )
+                {
+                // Initialize the drag variables
+                if(!mData->mOperation)
+                    {
+                    initializeThumbDragData(
+                            aPntrEvent->PointerEvent().iParentPosition);
+                    //Tactile Feedback for thumb touch
+                    MulSliderControl& sldrcntrl = static_cast<MulSliderControl&>(control());
+                    sldrcntrl.TactileEffectOnTouchandHold();
+                    }
+
+                result = EEventHandled;
+                }
+            }
+
+        }
+    return result;
+    }
+
+	
+// ---------------------------------------------------------------------------
+// HandlePointerEvents
+// ---------------------------------------------------------------------------
+// 
+ AlfEventStatus MulSliderHorizontal::HandlePointerEvents(TAlfEvent* aEvent)
+     {
+     AlfEventStatus ret = EEventHandled;
+     if (aEvent->PointerEvent().iType == TPointerEvent::EButton1Down)
+         {
+         mData->mdirection = 0;
+         ret = handlePointerDownEvent(aEvent); 
+         }
+     // Drag Events
+     else if (aEvent->PointerEvent().iType == TPointerEvent::EDrag)
+         {
+
+         if(!mData->mOperation) 
+             {// Drag during tap and hold on track . 
+             if(mData->mIsLongTapObserverSet)
+                 {// Store the new pointer position
+                 //mData->mLongTapPos=aEvent->PointerEvent().iParentPosition;
+                 mirrorPointerPosition(aEvent->PointerEvent().iParentPosition);
+                 }
+             else
+                 {
+                 //Do Nothing.
+                 }    
+             }
+         else
+             {
+             // Drag on Handle
+             if(mData->mIsLongTapObserverSet &&
+                     mData->mVisual && 
+                     mData->mSliderHandle &&  
+                     mData->mSliderHandleGhost) 
+                 {                
+                 // Store the new pointer position
+                 mirrorPointerPosition(aEvent->PointerEvent().iParentPosition);                    
+                 }
+             else
+                 {
+                 // Do nothing
+                 }
+             int dist;
+             // Calculate the distance moved from the drag  start point
+             if(AknLayoutUtils::LayoutMirrored())
+                 {
+                 dist = mData->mDragPoint.iX - 
+                 aEvent->PointerEvent().iParentPosition.iX  ;
+                 }
+             else
+                 {
+                 dist = aEvent->PointerEvent().iParentPosition.iX - 
+                 mData->mDragPoint.iX ;
+                 }
+             // Calculate the new tick position
+             int precision = KRoundupvalue;
+             if(dist<0)
+                 {
+                 precision = -KRoundupvalue;
+                 }
+             int newPos= (int)(((float)dist / mData->mTickInPixels ) + precision) + 
+             mData->mDragStartStep;
+             // send tactile sensitive event
+             // Update the model hence update visualization
+             updateModelPrimaryValue(newPos);
+             }
+         // Tactile Feedback for Drag
+         //Tactile Feedback for thumb drag
+         MulSliderControl& sldrcntrl = static_cast<MulSliderControl&>(control());
+         sldrcntrl.TactileEffectOnDrag(*aEvent);
+         }
+     else if(aEvent->PointerUp()  )
+         {
+         mData->mLongTapStarted = false;
+         handlePointerUpEvent();
+         
+         }
+     else
+         {
+         //Do Nothing.
+         }
+
+     return ret;
+     }
+    
+    
+// ---------------------------------------------------------------------------
+//  updateModelPrimaryValue
+// ---------------------------------------------------------------------------
+//    
+void MulSliderHorizontal::updateModelPrimaryValue( int aNewPosValue) 
+    {
+    // Validate the new tick value
+    if(aNewPosValue< mSliderModel->MinRange())
+        {
+        aNewPosValue = mSliderModel->MinRange();	
+        }
+    else if(aNewPosValue > mSliderModel->MaxRange())
+        {
+        aNewPosValue = mSliderModel->MaxRange();	
+        }
+    if(mSliderModel->PrimaryValue() != aNewPosValue && mData->mTick != 0)
+        {
+        // Update visualization and model only if data is changed
+        mPosData.reset(new(EMM)MulSliderPos);
+        mPosData->mPreviousValue = mSliderModel->PrimaryValue()  ;
+        mSliderModel->SetPrimaryValue(aNewPosValue);
+        mPosData->mCurrentValue =aNewPosValue;
+        mData->mCurrTick = aNewPosValue; 
+
+        // Send event to the slider widget        
+        TAlfEvent customevent(ETypePrimaryValueChange,
+                (uint)mPosData.get());
+        control().processEvent(customevent);
+        }
+    }
+    
+
+// ---------------------------------------------------------------------------
+//  snapPrimaryValueToTicks
+// ---------------------------------------------------------------------------
+//    
+void MulSliderHorizontal::snapPrimaryValueToTicks()
+    {
+    // If the position is not a multiple of ticks then 
+    //snap to the nearest tick multiple
+
+    int currHandlePos = mSliderModel->PrimaryValue() - mSliderModel->MinRange();
+    int tick = mSliderModel->Tick();
+    int newPos = currHandlePos + mSliderModel->MinRange();
+    if(mSliderModel->PrimaryValue() < mSliderModel->MaxRange())
+        {         
+        int diff = 0;
+        if(tick > 0) //model
+            {
+            diff = currHandlePos - ((currHandlePos /tick) * tick);
+            }
+        if(diff !=0)
+            {            
+            newPos = currHandlePos + tick - diff + mSliderModel->MinRange();            
+            }        
+        }
+
+    // Update model
+    updateModelPrimaryValue(newPos);
+    } 
+    
+      
+// ---------------------------------------------------------------------------
+//  handlePointerUpEvent
+// 
+// ---------------------------------------------------------------------------
+//
+void MulSliderHorizontal::handlePointerUpEvent()
+    {
+    // if thumb or track is clicked, change the graphics
+    // Send event if single click has hapened 
+
+    snapPrimaryValueToTicks();
+    
+    if(mData->mOperation)
+        {
+        //Somehow missed the Up event?
+        stopDrag();
+        //Tactile Feedback For Thumb Release
+        MulSliderControl& sldrcntrl = static_cast<MulSliderControl&>(control());
+        sldrcntrl.TactileEffectOnRelease();
+        }
+    if(mData->mIsLongTapObserverSet)
+        {
+        // Stop the long tap timer
+        mLongTapTimer->Stop();
+        // Un-register with the roster for long tap events 
+        control().Display()->Roster().SetPointerEventObservers(0,
+                control());
+        mData->mIsLongTapObserverSet = EFalse;    
+        }
+    else
+        {
+        //Do Nothing.
+        }    
+    }
+	
+	
+// ---------------------------------------------------------------------------
+// UpdateVisualization
+// ---------------------------------------------------------------------------
+//	  
+void MulSliderHorizontal::updateVisualization()
+    {
+    ConvertDataToPixels();
+    SetThumbPosition();
+    }
+    
+// ---------------------------------------------------------------------------
+//Mirror pointer position
+// ---------------------------------------------------------------------------
+//	  
+void MulSliderHorizontal::mirrorPointerPosition(const TPoint& aPointerPos )
+    {    
+    mData->mLongTapPos = aPointerPos;
+    if(AknLayoutUtils::LayoutMirrored())
+        {
+        mData->mLongTapPos.iX  = mData->mMainLayout->Size().iX.ValueNow() -
+        mData->mLongTapPos.iX  ;
+        }
+    }    
+// ---------------------------------------------------------------------------
+// SetThumbPosition
+// ---------------------------------------------------------------------------
+//
+
+void MulSliderHorizontal::SetThumbPosition()
+    {
+    // Current primary value in pixels
+    int newTickVal = (mSliderModel->PrimaryValue() - mSliderModel->MinRange()) * 
+    mData->mTickInPixels;
+    // Handle
+    int handleY = mData->mSliderHandle->Pos().iY.ValueNow();
+    int ghostHandleY = mData->mSliderHandleGhost->Pos().iY.ValueNow();
+    // Handle new pos
+    int widthDiff = (mData->mSliderHandleGhost->Size().iX.ValueNow() - 
+            mData->mSliderHandle->Size().iX.ValueNow())/2;
+    TAlfRealPoint pnt(mData->mTrackStartPoint + newTickVal,handleY); 
+    // Ghost Handle ( Extended) new pos 
+    TAlfRealPoint pnt1(mData->mTrackStartPoint - 
+            widthDiff/2 + newTickVal,ghostHandleY); 
+    // Set the position
+    mData->mSliderHandle->SetPos(pnt,0);
+    mData->mSliderHandleGhost->SetPos(pnt1,0);
+
+    // Update visualization variables
+    mData->mCurrTick = mSliderModel->PrimaryValue();
+    }
+
+
+// ---------------------------------------------------------------------------
+// accept
+// ---------------------------------------------------------------------------
+// 
+bool MulSliderHorizontal::accept( CAlfWidgetControl& /*aControl*/, 
+                                 const TAlfEvent& aEvent ) const
+	{
+	 // Accept only key or pointer events.
+	 if(aEvent.IsKeyEvent()||aEvent.IsPointerEvent())
+		 {
+		 return true;	
+		 }
+	 else
+		 {
+		 return false;
+		 } 
+	}
+
+
+// ---------------------------------------------------------------------------
+//initializeThumbDragData
+// ---------------------------------------------------------------------------
+//    
+bool MulSliderHorizontal::initializeThumbDragData( const TPoint& aPointerPos )
+    {       
+    TRAPD(err,control().Display()->Roster().SetPointerDragThreshold(control(),
+            TAlfXYMetric(TAlfMetric(KXToleranceInPixel,EAlfUnitPixel),
+                    TAlfMetric(KYToleranceInPixel,EAlfUnitPixel))) );  
+
+    if(mData->mVisual && err == KErrNone)
+        {
+        mData->mOperation = EMoveItem;
+        mData->mDragPoint = aPointerPos;
+        mData->mDragStartStep = mSliderModel->PrimaryValue();
+
+        }
+    else
+        {
+        // Do Nothing
+        }   
+    return ETrue;  
+    }
+
+    
+// ---------------------------------------------------------------------------
+// stopDrag
+//  
+// ---------------------------------------------------------------------------
+//
+bool MulSliderHorizontal::stopDrag()
+    {
+    TRAPD(err,
+            control().Display()->Roster().SetPointerEventObservers(
+                    0, 
+                    control()));
+    if(err == KErrNone)
+        {
+        mData->mVisual = NULL;
+        mData->mOperation = ENop;
+        return ETrue;
+        }
+    return EFalse; 
+    }
+ 
+    
+        
+
+// ---------------------------------------------------------------------------
+// IsSliderVisual
+// 
+// ---------------------------------------------------------------------------
+// 
+bool MulSliderHorizontal::IsSliderVisual(CAlfVisual *aVisual)
+    {
+    if(aVisual == mData->mSliderCentre||
+            aVisual == mData->mTrackLeftImage ||
+            aVisual == mData->mTrackMiddleImage ||
+            aVisual == mData->mTrackRightImage ||
+            aVisual == mData->mSliderCentreGhost||
+            aVisual == mData->mSliderHandle||
+            aVisual == mData->mSliderHandleGhost)
+        {
+        return true;
+        }
+    return false;   
+    }      	   	
+      	   
+    void MulSliderHorizontal::updateTextVisualization()	
+    {
+    	
+    }
+    }//namespace Alf
+    
+//End Of File