mulwidgets/mulcoverflowwidget/inc/mulbaseelement.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:23:18 +0100
branchRCL_3
changeset 20 0e9bb658ef58
parent 0 e83bab7cf002
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2007-2008 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:  base element header for CoverFlow
*
*/

// This file defines the API for MulCoverFlowWidget.dll

#ifndef __MULBASEELEMENT_H__
#define __MULBASEELEMENT_H__


//  Include Files
#include <alf/alfdecklayout.h>
#include "alf/alfelement.h"
#include <alf/alfflowlayout.h>
#include <alf/alfwidgeteventhandler.h>
#include <mul/imulwidget.h>

#include "mulcoverflowdefinitions.h"

namespace Alf
    {
    
//Forward declarations    
class MulCoverFlowTemplate; 
struct TMulBaseElementImpl;

// Structure to store the position and sizes of cover flow items
struct TMulCoverFlowItem
    {
    int height;
    int width;
    int posx;
    int posy;
    
    TMulCoverFlowItem()
    	:height(0),width(0),posx(0),posy(0){}

    TMulCoverFlowItem(int aPosx,int aPosy,int aWidth,int aHight)
    	:posx(aPosx),posy(aPosy),width(aWidth),height(aHight){}
        
    };

namespace mulbaseelement
    {
     static const IfId Ident=
        {
        0,"mulbaseelement"
        };
    }


/* Element class which handles all the visuals in the layout
 * The class also handles  event handling and applies animation as required
 * by the widget.The class forms the basis of the entire layout heriarchy in the widget
 * */
/// @bug minor:avanhata:7/7/2008 This class is coverflow-specific, so name it as such
class MulBaseElement : public AlfElement, 
                       public IAlfWidgetEventHandler
    {
public://Constructor and destructor
    
   /**
    * C++ constructor.
    */
    MulBaseElement( CAlfWidgetControl& aControl, const char* aName );
    
    /**
     * Destructor.
     */
    virtual ~MulBaseElement();
            
        
public: //From IAlfWidgetEventHandler

    static inline const IfId& Type()
        {
        return mulbaseelement::Ident;    
        } 
        
    bool accept( CAlfWidgetControl& aControl, const TAlfEvent& aEvent ) const;
    
    void setActiveStates( unsigned int aStates );
    
    AlfEventStatus offerEvent( CAlfWidgetControl& aControl, const TAlfEvent& aEvent );
    
    IAlfInterfaceBase* makeInterface( const IfId& aType ); 
    
    void setEventHandlerData( const AlfWidgetEventHandlerInitData& aData );
	  
	AlfWidgetEventHandlerInitData* eventHandlerData();
	
	AlfEventHandlerType eventHandlerType() ;

    AlfEventHandlerExecutionPhase eventExecutionPhase() ;

public: //New Methods

    /**
	 * Sets the Item Brush Color.
	 * @param aColor color to be set.
	 */
    void SetItemBrush(const TRgb& aColor); 
    
     /**
	 * changes the opacity of counter accordingly.
	 * @param aUiOn true if UIOn or else false.
	 * @param aTransitionTime transition time.
	 */
    void UIOnOffMode(bool aUiOn, int aTransitionTime);
    
    /**
	 * Sets the Scroll direction during the step scroll.
	 * @param TItemScroll sets the direction if it is right or left.
	 */
    void SetTextColor(TTextVisualType aVisualType, const TRgb& aColor);
    
    /**
	 * returns the color of the specified text
	 * @param aVisualType is the visual type.
	 */
	TMulVisualColorProperty TextColor(TTextVisualType aVisualType);
    
    
    /**
	 * Sets the Scroll direction during the step scroll.
	 * @param TItemScroll sets the direction if it is right or left.
	 */
    void SetScrollDir( TItemScroll aScrollDir );
    
    /**
     * Update the text opacity and counter values whenever highlight is modified
     *
     * @param aAnimationTime, text will be updated after the aAnimationTime.
     */
    void UpdateTextAndCounter(int animationTime = 0); 
    
    /**
     * Stores the dimensions of the highlighted and nonhighlighted item from the template.
     * 
     * @param aHighlightItemDimensions The highlight item dimensions .
     * @param aNonHighlightItemDimensions The non highlight item dimensions.
     * @param aVisibleIconCount The count of visible items on screen.
     */
    void StoreVisualDimensions( TMulCoverFlowItem aHighlightItemDimensions, TMulCoverFlowItem aNonHighlightItemDimensions,int aVisibleIconCount );
    
    /**
     * Stores whether the text is visible or not in the current orientation and template.
     *
     * @parama aIsTextVisible Boolean value indicating whether text is there or not.
     */
    void StoreTextVisibility( bool aIsTextVisible );
    
    /**
     * Return is the textvisible or not
     * 
     */
    bool IsTextVisibile( ) const ;
    
	/**
	 *  
	 *
	 */
    void ApplyBrushOnIcon( CAlfImageVisual& aImageVisual );
    
    /**
	 *  
	 *
	 */
	void RemoveBrushOnIcon( CAlfImageVisual& aImageVisual );
        
 	/**
	 * To hide and unhide Widget.
	 *
	 * @param aShow                 value to hide/unhide the Widget 
	 * @param aTransitionTime       Transition Time in MilliSeconds
	 */
	void ShowWidget( bool aShow, int aTransitionTime = 0) ;
	
	/*
	 * Takes the new positions of the visuals and applies the same to the visuals
	 * On change of orientation
	 */
	void OrientationChange();
	
	/**
	 * Sets the empty text to be displayed when the number of items is 0.
	 * 
	 * @param aDefaultText The text to be displayed.
	 */
	void SetEmptyText( const UString& aDefaultText );
	
	/**
	 * Shows/Hide the empty text when the number of items in the model or layout is 0 . Also when the model is NULL.
	 * 
	 * @param aShow Boolean value to show/hide the empty text.
	 */
	void ShowEmptyText( bool aShow );
	
	/**
	 * Returns true if empty text is set by the application else returns false.
	 * 
	 * @returns true if empty text is set else returns false.
	 */
	bool IsEmptyText();
	
	/**
	 * Updates the Slider Widget ticks when item is added or removed
	 *
	 * @param aUpdateTick takes the count of items in the coverflow widget
	 */
	void UpdateSliderTick(int aUpdateTick);

	/**
     * Returns the icon/text flow layout in vertical flow layout
     * 
     * @param aLayoutIndex the index will determine which layout to return from the main/vertical flow layout
     */
    CAlfLayout& FlowLayout( int aLayoutIndex );
      
	 /**
	  *
	  * Sets the text to be displayed for the counter element .
	  *
	  * @param aTransitionTime the transition time in milliseconds for animation 
	  */
	 void SetCounterText( int aTransitionTime = 0 );
    
    /**
     * Creates a visual for counter if not created initailly else return the existing counter visual.
     */
    CAlfTextVisual& CounterVisual();
      
    /**
     * Move the Iconflow by a items width in case of bounce effect.
     * 
     * @param aBounceDirection Tells the direction by which the iconflowlayout should move.
     */
    void StartBounce(int aBounceDirection); 
    
    /**
     * Returns whether its in Ui on mode or not.
     * 
     * @return true if its currently in Ui on mode.
     */    
    bool IsUiOnMode();    

	/**
	 * Creates the text visuals if it is not created, else returns the existing 
	 * visual for the title and detail text.
	 * 
	 * @param aTextString, visual tag
	 * @param aLayout, Layout in which to create the text visual
	 */      
    CAlfTextVisual& CreateTextVisual(const TDesC8& aName, CAlfLayout& aLayout); 
	
	/**
	 * Updates the value of the text visuals when an image has scrolled .
	 * 
	 * @param aAnimationTime, text will be updated after the aAnimationTime.
	 */
	void UpdateTextValue( int aAnimationTime = 0);
	
	/**
	 * returns the layout to text.
	 */
	CAlfLayout& TextLayout();
    
    /**
     * Start marquee for the text.
     * 
     * @param aName, text type is title or detail 
     */
    void StartMarquee(mulvisualitem::TVisualAttribute aName );
    
    /**
     * Stop marquee for the text.
     * 
     * * @param aName, text type is title or detail 
     */
	void StopMarquee(mulvisualitem::TVisualAttribute aName);
	
	/**
	 * Decide whether to show or hide the slider based on the parameter.
	 *
	 * @param aFlag, boolean to decide slider to be shown or not.
	 */	
	void ShowSlider(bool aFlag);
	
	/**
	 * Return size of hightlight icon for the template specified .
	 *
	 * @param aTemplateId, id of the template whose icon size to be calculated.
	 * @param aAttribute, attribute whose size is to be calculated.
	 * @param aHeight, refrence in which the height parameter is returned.
	 * @param aWidth, refrence in which the width parameter is returned.
	 */	
	void GetIconSize( mulwidget::TLogicalTemplate aTemplateId, 
		    mulvisualitem::TVisualAttribute aAttribute, int& aHeight, int& aWidth);
	
	/**
	 * Sets the Scroll Animation Time defined by the application.
	 *
	 * @param aScrollAnimationTime, ScrollAnimation Time set by the application.
	 */	

	void SetScrollAnimationTime( int aScrollAnimationTime );

	/**
	 * Set background for coverflow
	 *
	 * @param aColor, background color.
	 */
	void SetBackground(const TRgb& aColor);
    
	/**
	 * Set background for coverflow.
	 *
	 * @param aIID, Skin id that shoudl be used as background.
	 */    
    void SetBackground(const TAknsItemID& aIID);
    
    /**
     * Stores the fit mode flag (on or off).
     * 
     * @param aFlag fitmode flag
     */
   	void SetFitMode(bool aFlag);
   	
    /**
     * Apply scale mode on image visual and also appy brush for remaining area.
     * 
     * @param aImageVisual Image visual
     */
    void ApplyScaleMode( CAlfImageVisual& aImageVisual);
    
	/**
	 *  
	 *
	 */    
	void CreateAndInitializeVisuals(bool aIsOrientationChange = false);
	
	/**
	 *  
	 *
	 */	
	void SetHighlight(int aHighlightIndex, int aAnimationTime = 0);
	
	/**
	 *  
	 *
	 */	
	void MoveVisuals(int aDistance,int aAnimationTime = 0);
	
	/**
	 *  
	 *
	 */	
    CAlfVisual* CreateIconStructure(CAlfLayout* aParentLayout);
    
	/**
	 *  
	 *
	 */	
	void MoveVisualsWithSizeChange(int aDistance, int aAnimationTime=0);
	
	/**
	 *  
	 *
	 */	
	void StartDoodling(int aDistance, int aAnimationTime=0);
	
	/**
	 *  
	 *
	 */	
	void StopDoodling(int aAnimationTime=0);
	
    /**
     * Recycle the Icon visuals instead of destroying and creating them each time.
     */
    void RecycleIconVisuals();
    
	/**
	 *  
	 *
	 */		
	void UpdateVisuals();    

	/**
	 * Sets the specified size to the base layout and deck layout and also on the empty text visual
	 */
	void SetDefaultSize( TSize aSize );
	
	/**
	 * Displays the indicator icon for the specified item index.
	 *
	 * @param aVisualItem visual item which conatins the index.
	 * @param aIndex index of the item.
	 */
	void DisplayIndicatorIcon(const MulVisualItem & aVisualItem, int aIndex);
	
	/**
	 * Returns whether the user has doodled enough to change the highlight multiple times.
	 *
	 * @returns TNumberofSwipes, Doodling distance converted into multiple swipes.
	 */
	TNumberofSwipes NumberOfSwipes();
		
	/**
	 *  Returns the final swipe direction based on which highlight is nerest to teh centre point
	 * in the last direction
	 *
	 * @param aDistance, doodled distance
	 * @param, aastSwipeDirection, last direction in which the user has swiped.
	 */	
	int FinalSwipeDirection(int aDistance, int aLastSwipeDirection);	
	
	/**
	 * Returns teh current direction in which itesm are scrolled
	 *
	 * @return, Scroll direction
	 */		
	TItemScroll ScrollDir();

	/**
	 * Removes the slider layout form the coverflow main layout
	 *
	 */	
	void RemoveSliderFromLayout();	
	
	/**
	 *  Rotate the image in teh given direction
	 * 
	 * @param aDirection, Direction of the rotation (ERotateLeft/ERotateRight).
	 * @param aImageSize, The actual size of the current highlighted image.
	 * @param aTransition transition time to rotate the image.
	 * @param aAdjustSize, true for orientation change 
	 *
	 */		
	void RotateImage(IMulWidget::TMulRotation aDirection,TSize aImageSize,int aAnimationTime,bool aAdjustSize = false);
	
	/**
	 *  If the image on which rotation is applied, is updated then remove the rotation
	 *
	 * @param aIndex, relative index which is updated
	 */			
	void CancelRotationOnUpdate(int aIndex);
	
private: 
	
	/**
     * Set the virtual Size of viewportlayout(parent) of text 
     *
     * @param aName, text type is title or detail 
     */
    void SetVirtualViewPortSize(mulvisualitem::TVisualAttribute aName);
	
    /**
     * Cancell all the custom commands related to marquee. 
     */
    void CancelAllCommands(); 
	
	/**
     * Reset counter opacity( depending on the current ui on/off mode
     *  when an item is added to an empty model.
     *
     * @param aTransitioTime transition time defined by app.
     */
    void ResetUiOnOff( int aTransitionTime = 0 );
    
    /**
     * Calculate the new position for counter visual based on the value of the higlight index and total model count
     *
     * @param aCounterLctDimension Lct Dimensions of counter visual.
     * @param aOrientationChanged Orientation Changed or not
     */
    void SetNewCounterPosition(const TMulCoverFlowItem& aCounterLctDimension,bool aOrientationChanged = false );
    
    /**
     * Returns number of digits in a number.
     *
     * @param aNumber The number whose number of digits have to be found.
     * @returns Number of digits in a number.
     */
    int NumberOfDigits(int aNumber);
    
	/**
     * Returns the current 2D coverflow template.
     */	
    MulCoverFlowTemplate*  Template2D();
        
    //slider related apis
	/**
	 * Created the slider widget and calls the other function related to slider.
	 */
	void CreateSlider();
	
	/**
	 * Constructs the slider widget if its not already constructed .
	 */
	void ConstructSliderWidget();
	
	/**
	 * Checks whether slider needs to be shown or hidden and sets its opacity accordingly.
	 *
	 */
	void SetSliderOpacity();
	
	/**
	 * Creates the base layout structure required for the base element to contain
	 * images and slider and meta data information . 
	 */
	void CreateBaseLayoutStructure();
	
	/**
	 * Sets the text data of the current highlight to the  text visual .
	 * 
	 * @param aName The name of the visual  in the text visual e.g mul_tiltle or mul_detail.
	 * @param aData The variant type containing the new data to be set to the text visual .
	 */
	void SetTextToVisual( mulvisualitem::TVisualAttribute aName,IMulVariantType* aData );
		
     /**
      * Create empty text visualisation to show empty text when there are no items to display .
      */
     void CreateEmptyTextVisualisation();
     
     /**
      * Decides the size to be applied on the main layout depending on whether the model is null or not.
      */
     void HandleSizeChangeOnMain();
     
     /**
      * Shows/Hides the text and counter visuals when empty text has to be hidden/shown.
      *
      * @param aShow true when text/counter have to be shown , 
      *              false when text/counter have to be hidden.
      */
     void ShowHideVisualsForEmptyText( bool aShow );
	 
	 /**
	  * Calculates the padding between the images based on the position
	  * and sizes of the highlighted and non higlighted items.
	  */
	 void CalculatePadding();
	 
	 /**
	  *
	  * Sets opacity to the counter text visual .
	  *
	  * @param aOpacity, opacity value that should be set
	  */	 
	 void SetCounterTextOpacity( int aOpacity);	     
	
      /**
	   * Arranging the Visual with padding and using Transition time
	   * 
	   */
	 void ArrangeItems();    

     /**
      * Sets the opacity of all the text visuals in the specifed visual  to the given opacity (aOpacity)
      * 
      * @param aOpacity The opacity to be set for the text visuals .
      * @param aTransitionTime The transition time
      */
     void SetTextVisualOpacity(  int aOpacity , int aTransitionTime = 0 );
     
      /**
	   * Returns the percentage factor with which new Position and Sizes are calculated  .
	   * 
	   * @returns The change in percentage to be applied on the current size and position.
	   */
     int CalculateDistanceChangeFactor(); 
    
	/**
	 *  
	 *
	 */		
	void CreateVisuals();

	 /**
      * Creates a Indicator Image visual if not created initially.
      * 
      * @param aLayout decklayout to which icon is to be added .
      */
	CAlfImageVisual*  CreateIndicatorIconVisual(CAlfDeckLayout& aLayout);

	/**
	 *  
	 *
	 */		
	void  SetIndicatorDimensions(CAlfImageVisual& aIndicatorVisual); 
	
	/**
	 *  
	 *
	 */		
	const TDesC8& IdToTag( int aId );
	
	/**
	 * Creates an array of midpoints of all the visuals form left to right
	 *
	 * @return, array of midpoints
	 */	
	std::vector<int> ReferenceMidPoints();

	/**
	 * Calculates the new midpoints after the doodling
	 *
	 * @param aReferenceMidPoints,midpoints before doodling
	 * @param aDistance, final doodled distance
	 * @return array of new midpoints
	 */		
	std::vector<int> FinalMidPoints(std::vector<int> aReferenceMidPoints,int aDistance);

	/**
	 * Returns the position of the visual in the array which is nearest to midpoint
	 * in swipe direction
	 *
	 * @param aFinalMidPoints, new midpoints after the doodling
	 * @param aLastSwipeDirection, Last swipe direction
	 */		
	int NearestPoint(std::vector<int> aFinalMidPoints,int aLastSwipeDirection);
	
	/**
	 * The image visual size and position is modified to stretch/compress the image
	 * after rotation. This is done because the before rotation teh texture will be 
	 * generated according to the current orientation. To show the rotated texture
	 * image visual is modified such that the texture looks rotated preserving 
	 * the aspect ration
	 *
	 * @param aVisual,Visual for which the rotation is applied
	 * @param aAnimationTime, time for rotation
	 */		
	void AdjustVisualSizeInRotation(CAlfImageVisual* aVisual,int aAnimationTime);

	/**
	 * Handle rotation of 90degree or 270 degree. here the image visuals size
	 * needs to be altered if required as the current width will become teh height of
	 * the texture after rotation.
	 *
	 * @param aVisual,Visual for which the rotation is applied
	 * @param aAnimationTime, time for rotation
	 */		
	void HandleRotationOnVerticalAxis(CAlfImageVisual* aVisual,int aAnimationTime);

	/**
	 * Handle rotation of 180degree or 0 degree. Here no need to modify the image visuals
	 * size.
	 *
	 * @param aVisual,Visual for which the rotation is applied
	 * @param aAnimationTime, time for rotation
	 */	
	void HandleRotationOnHorizontalAxis(CAlfImageVisual* aVisual,int aAnimationTime);
	
	/**
	 * Cancel the rotation applied for teh visual at the given relative index.
	 * Relative index -1 indicates cancel the rotation on highlighted visual
	 *
	 * @param aIndex, relative index of teh visual for which the rotation needs to be canceled
	 */			
	void CancelRotation(int aIndex = -1);
	
	/**
	 * Preserve the rotation after orientation change.
	 *
	 */			
	void UpdateRotation();		

private: //Class Data
    
    auto_ptr<TMulBaseElementImpl> mData; //owned
   
    };
    
    }  // namespace Alf
    
#endif  // __MULBASEELEMENT_H__

//End of file