mulwidgets/mulcoverflowwidget/inc/mulcoverflowcontrol.h
changeset 0 e83bab7cf002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mulwidgets/mulcoverflowwidget/inc/mulcoverflowcontrol.h	Thu Dec 17 08:56:02 2009 +0200
@@ -0,0 +1,539 @@
+/*
+* 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 Control header for CoverFlow Widgets.
+ *
+*/
+
+#ifndef MULCOVERFLOWCONTROL_H
+#define MULCOVERFLOWCONTROL_H
+
+// Alf Headers
+#include <alf/alfwidgetcontrol.h>
+
+// Osn Headers
+#include <touchfeedback.h>
+
+// Gesture Helper
+#include <gestureobserver.h>
+
+// Mul Headers
+#include <mul/imulvarianttype.h>
+#include <mul/imulwidget.h>
+#include "imulmodelobserver.h"
+
+//Gesture Helper namespace 
+namespace GestureHelper
+    {
+    class CGestureHelper;
+    struct TRealPoint;
+    }
+
+//Forward declarations
+class CAlfFlowLayout ;
+class CAlfImageVisual;
+
+namespace Alf
+    {
+//Forward declarations
+class IAlfWidget;
+class IMulModelAccessor;
+class IMulSliderModel;
+class IMulSliderWidget;
+class MulBaseElement;
+class MulCoverFlowAo;
+class MulCoverFlowTemplate;
+
+struct TMulCoverFlowControlImpl;
+
+namespace mulcoverflowcontrol
+    {
+     static const IfId Ident=
+        {
+        0,"MulCoverFlowControl"
+        };
+    }
+    
+class MulCoverFlowControl : public CAlfWidgetControl,
+							public IMulModelObserver,
+							public GestureHelper::MGestureObserver
+    {
+
+public: //Constructor and destructor
+
+    /**
+     * C++ constructor.
+     */
+    MulCoverFlowControl( CAlfEnv& aEnv );
+
+    /**
+     * Destructor.
+     */
+    virtual ~MulCoverFlowControl();
+    
+public: //From CAlfWidgetControl
+
+    AlfEventStatus handleEvent( const TAlfEvent& aEvent );
+        
+    static inline const IfId& Type()
+        {
+        return mulcoverflowcontrol::Ident;    
+        }
+    
+    IAlfInterfaceBase* makeInterface( const IfId& aType );
+                
+    void VisualLayoutUpdated (CAlfVisual& aVisual);
+        
+public:// From IMulModelObserver
+    
+	void ModelStateChanged( TMulChangedState aState, IMulVariantType& aData );
+    
+public:// From MGestureObserver
+
+    /**
+     * Handles gesture events and delegates the processing to the base element
+     * 
+     * @param aEvent Gesture event e.g . EGestureSwipeLeft/Right
+     */
+    void HandleGestureL( const GestureHelper::MGestureEvent& aEvent );
+    
+
+public: //New Methods
+	
+	/**
+	 * Returns the total count that application has set to the model . 
+	 * The number of items that application has set to the model i,e the total 
+	 * number of items that the application may insert into the model may not
+	 * be equal to the total number of items given to the widget for presentation 
+	 * by the model . 
+	 * 
+	 * @returns The number of items that the application has set to the model .
+	 */
+	int TotalModelCount();
+	
+    /**
+     * Sets the highlight index to the given aIndex
+     *
+     * @param aIndex, Index to which the current focus visulisation to be moved.
+     */		
+	void SetHighlightIndex( int aIndex ,bool aUpdateSlider = true);
+	
+    /**
+     * Return the Highlight Item Index maintained in control when update highlight to model is blocked
+     *
+     * @return, Current Highlight
+     */
+    int HighlightIndex();
+    
+    /**
+     * Returns the current 2D coverflow template.
+     *
+     * @return, CoverflowTemplate
+     */	
+    MulCoverFlowTemplate*  Template2D();
+        
+    /**
+     * Returns whether the coverflow is currently in fast scroll mode or not .
+     *
+     * @returns true if fast scroll mode is launched, else returns false
+     */
+    bool IsFastScrollMode();
+    
+    /**
+     * Resets the show widget flag depending on the parameter passed. 
+     * 
+     * @param aNewResetValue The new value with which the flag needs to be reset.
+     */
+    void ResetShowWidgetFlag( bool aNewResetValue );
+    
+    
+    /**
+     * Returns the accessor to the current model of the widget.
+     */
+    IMulModelAccessor* ModelAccessor();
+     
+	
+	/**
+     * Recycles all the visuals added to the Icon Layout.
+     * The function is called whenever there is an model change
+     */
+    void RecycleVisuals(); 
+    
+    /**
+     * Creates the slider widget . The creation of slider widget depends on the xml . 
+     * That is if the xml has a slider tag then only slider widget is created . 
+     */
+    IAlfWidget* CreateSliderWidget();
+    
+    /**
+     * Returns the created slider widget . If the widget is  not created , then returns NULL.
+     */
+    IAlfWidget* GetSliderWidget();
+	
+	/**
+	 * Returns the slider model pointer . 
+	 *
+	 * @returns The slider model pointer if slider widget is created and exists, else returns NULL.
+	 */	
+	IMulSliderModel* GetSliderModel(); 
+	
+    /**
+     * Check whether we need hold events (Enhanced coverflow can be launched) and
+     * set the state to gesture helper accordingly
+     */	    
+    void SetHoldingEnabled();
+    
+    /**
+     * Enable/Disable double tap on Gesture helper based on the aValue specified.
+     * 
+     * @param aValue The value whether double tap should be enabled or not.
+     */	
+    void SetDoubleTapEnabled( bool aValue);
+        
+    /**
+     * Handles the scrolling event and changes the focus accordingly.
+     * 
+     * @param aEvent the scrolling event to be handled
+     */
+    void HandleNavigationEvent( int aEvent );
+    
+	/**
+	 * Transition time for highlight change in fast scroll
+	 *
+	 * @return, transition time to be used
+	 */	
+	int FastScrollTransitionTime();	 
+
+	/**
+	 * Update the item at relative index Of aVisualIndex with the data at aItemIndex
+	 *
+	 * @param aItemIndex, Absolute index
+	 * @param aVisualIndex, Relative index
+	 * @param aAnimationTime, text will be updated after the aAnimationTime.
+	 */
+	void UpdateCoverflowItem( int aItemIndex, int aVisualIndex, int aAnimationTime = 0);
+	
+	/**
+	 * Checks the current index is in visible window and returns its relative index in aRelativeIndex
+	 *
+	 * @param aIndex, 
+	 * @param aRelativeIndex,
+	 */	
+	bool IsIndexInVisibleWindow(const int aIndex,int& aRelativeIndex);
+	
+	/**
+	 *  
+	 *
+	 */	
+	int RelativeToAbsolute(const int aRelativeIndex);
+	
+	/**
+	 * update the item at the relative index. 
+	 * 
+	 * @param aVisualIndex, Relative index
+	 * @param aAnimationTime, text will be updated after the aAnimationTime.
+	 *
+	 */	
+	void UpdateItemAtIndex(const int aRelativeIndex, int aAnimationTime = 0);
+
+	/**
+	 *  
+	 *
+	 */
+    void DoSetImage(IMulVariantType* aImageData,CAlfImageVisual* aImgVisual);
+    
+   /**
+    * Checks the given file path is of SVG image or not
+    *
+    * @param aImagePath Path of the image file,which need to be checked for SVG file format. 
+    */
+    bool IsSVGImage(const TDesC& aImagePath);
+    
+    /**
+     * Load Image visual with image provided from file path
+     * 
+     * @param aSvgFilePath path of Image
+     * @param aImageVisual visual on with image to be loaded
+     */
+    void LoadImageFromSvg(const TDesC& aImagePath,CAlfImageVisual& aImageVisual );
+    
+	/**
+	 *  
+	 *
+	 */    
+    void StoreVisibleItemCount(int aVisibleItemCount);
+    
+	/**
+	 *  
+	 *
+	 */
+	void SetDefaultImage(int aTextureId);
+	
+	/**
+	 *  
+	 *
+	 */
+	int WindowTop(int aHighlightIndex);
+
+	/**
+	 *  
+	 *
+	 */	
+	void UpdateBaseElement(MulBaseElement* aBaseElement);
+	
+    /**
+     * Slider handles the key events  .
+     * Slider thumb positions itself to the gesture and key events of coverflow widget 
+     *
+     */
+    void SetSliderTickPosition();
+	
+	/**
+	 *  
+	 *
+	 */	
+    void ModelChanged( IMulModelAccessor* aAccessor);
+
+	/**
+	 * Determins the current resolution
+	 * 
+	 *
+	 */	
+	bool IsLandscape();
+    
+    /**
+     * Destroys slider widget.
+     */	
+    void DestroySlider(); 
+ 
+    /**
+     * Return gesture helper.
+     */ 
+    GestureHelper::CGestureHelper* Gesturehelper();
+    
+private:
+    
+    // Event handling related api.
+    /**
+     * Handles key event related manipulation. 
+     * 
+     * @param TAlfEvent
+     * @returns The status of the handled event.
+     */
+    AlfEventStatus HandleKeyEvent( const TAlfEvent& aEvent );
+    
+    /**
+     * Handles repeated key event. 
+     * 
+     * @param TAlfEvent 
+     * @returns The status of the handled event.
+     */
+    AlfEventStatus HandleRepeatKeyEvent( const TAlfEvent& aEvent );  
+
+    /**
+     * Handle fast scrolling and speed variations with repeated key events. 
+     * 
+     * @param aDirection, Direction in which to change the highlight
+     */    
+    void HandleFastScrollWithKeyEvents(int aDirection);  
+    
+    /**
+     * Handles custom event that control has raised to itself like bounce,bounce over etc. 
+     * 
+     * @returns The status of the handled event.
+     */
+    AlfEventStatus HandleCustomEvent( const TAlfEvent& aEvent );
+    
+    /**
+     * Handles swipe events(only on pointer events from gesture helper)
+     * 
+     * @param aEvent - SwipeRight/SwipeLeft.
+     */
+    void HandleSwipe(int aEvent);
+    
+    /**
+     * Performs the focus visualisation for the new focusedindex, and clears the old
+     * index visulisation. Called for every navigation events and sethighlight api call.
+     *
+     * @param aIndex new Index to which the focus visualisation is to be set.    
+     */        
+    void DoSetFocusIndex( int aIndex, int aAnimationTime =0);
+    
+    /**
+     * Sets the current highlighted item as the selected item . 
+     * Sends the selection event to the application . 
+     */
+    void SetSelection(int aHighlight);
+        
+    /**
+     * Creates a new template element with aTemplateName .
+     * 
+     * @param aTemplateName The name of thew new template element.
+     */
+    void CreateTemplateElement( mulwidget::TLogicalTemplate aTemplateName);
+        
+       
+    /**
+     * Sends the specified event to the base element .
+     * 
+     * @param aEvent Event to be sent to the base element.
+     */
+    void SendEventToBaseElement( const TAlfEvent& aEvent );
+    
+    /**
+     * Handles if there is any change in the total count of model .
+     * Updates the slider tick if the total count of model increases/decreases.
+     *
+     */
+     
+    void HandleModelCountChange();
+            
+    /**
+     * Gets the absolute index of the specified visual, which has been tapped.
+     * 
+     * @param aHitVisual The visual which has been tapped or hit.
+     */
+    int GetHitVisualIndex( CAlfVisual* aHitVisual );
+    
+    /**
+     * Handle enhanced stop.
+     */ 
+	void HandleEnhancedStop();
+   
+    /**
+     * Performs all the enhanced mode related checkings ..e.g whether the fast scroll flag
+     * is set or not / whether the application is in landscape mode or not .
+     *
+     * @return Boolean value informing whether enhanced mode should be started or not .
+     */
+    bool EnhancedModeCondition();
+    
+    /**
+     * Performs animations when enhanced mode is started .
+     * The coverflow transits to enhanced mode from 2D normal mode .
+     *
+     * @param aEvent , gesture event
+     */
+    void EnhancedStarted( const GestureHelper::MGestureEvent& aEvent );
+    
+    /**
+     * Returns the current Gesture Speed. 
+     * 
+     * @param aEvent Event from the gesture helper.
+     * @returns The current gesture speed.
+     */
+    GestureHelper::TRealPoint GestureSpeed( const GestureHelper::MGestureEvent& aEvent );
+    
+    /**
+     * Performs animations in enhanced mode.
+     * Moves the layout along with the pointer event . The function calls the active object class
+     * to move the layout with smooth animation .
+     *
+     * @param aEvent Gesture event .
+     */
+    void StartMoving( const GestureHelper::MGestureEvent& aEvent );
+
+    /**
+     * Handles all normal gesture events other than hold events
+     * 
+     * @param aEvent Gesture event e.g . EGestureSwipeLeft/Right
+     */    
+	void HandleNormalGestureEvents(const GestureHelper::MGestureEvent& aEvent);
+
+    /**
+     * Handles hold gesture events.
+     * 
+     * @param aEvent Gesture event e.g . EGestureSwipeHoldLeft/Right
+     */
+	void HandleHoldGestureEvents(const GestureHelper::MGestureEvent& aEvent);
+
+    /**
+     * Handles updating utems when the number of items in model are less than total visible items
+     * 
+     * @param aIndex, Index to update.
+     */	
+	void HandleLessItemsUpdate(int aIndex);  
+
+    /**
+     * Sets a blank texture the visual at relative index.
+     * 
+     * @param aRelativeIndex, Index for which the blank texture should be set
+     */	
+	void SetBlankTexture(int aRelativeIndex);	  
+
+
+    /**
+     * Converts the gesture distance into the form of direction (For right
+     * its plus and left its minus)
+     * 
+     * @param aDistance, Gesture distance
+     */
+	int ConvertDistanceToDirection( int aDistance );    	 
+    /**
+     * Sends Tactile feedback in case of touch down event.
+     *
+     * @param aEvent Gesture event.
+     */	
+	void SendFeedbackOnTouchDown(const GestureHelper::MGestureEvent& aEvent); 
+	
+    /**
+     * Decides in which direction the strip should move during fast scroll and also decides the position of 
+     * reference point for some special cases .
+     *
+     * @param aEvent Gesture event.
+     */
+	void ReverseDirectionInFastScroll(const GestureHelper::MGestureEvent& aEvent); 
+	
+	/**
+	 * Change the reference point of reversing the direction until the reference point becomes the 
+	 * middle of the screen .
+	 *
+	 * @param aCurrPosition The current pointer position .
+	 * @param aDistanceTravelled The distance travelled by the gesture till now.
+	 */
+	void ChangeDirReferencePoint(int aCurrPosition, int aDistanceTravelled );
+	
+	/**
+     * Handles the operations on the Single tap.
+     *
+     * @param aEvent Gesture event.
+     */
+	void HandleSingleTap(const GestureHelper::MGestureEvent& aEvent); 
+
+	/**
+     * 
+     *
+     * 
+     */	
+	int TotalSwipeDistance( const GestureHelper::MGestureEvent& aEvent );	 
+
+    	 
+private:
+    
+     auto_ptr<GestureHelper::CGestureHelper> mHelper; //owns it
+    
+     auto_ptr<TMulCoverFlowControlImpl> mData; // Owned
+     
+     auto_ptr<MulCoverFlowAo> mCoverFlowAo;   // owned
+     
+     MTouchFeedback* mFeedback; // tactile feedback, doesnt own it.
+     
+    IMulSliderWidget* mSliderWidget;  //    
+    
+    };
+    
+    } // namespace Alf
+    
+#endif // MULCOVERFLOWCONTROL_H
+
+//End of file