--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/viewframework/views/cloudview/inc/glxcloudviewcontrol.h Thu Dec 17 08:45:44 2009 +0200
@@ -0,0 +1,575 @@
+/*
+* Copyright (c) 2008-2009 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: Carousel control class
+ *
+*/
+
+
+
+
+#ifndef C_GLXCLOUDVIEWCONTROL_H
+#define C_GLXCLOUDVIEWCONTROL_H
+
+// INCLUDES
+
+#include <alf/ialfwidgeteventhandler.h>
+#include <osn/ustring.h>
+#include <alf/alfscrollevents.h>
+#include <alf/ialfscrollbarwidget.h>
+
+//use includes
+#include <mglxmedialistobserver.h>
+#include "glxcontainerinfobubble.h"
+#include "glxcloudinfo.h"
+#include <alf/alfeventhandler.h>
+
+#include <AknLayout2Def.h>
+using namespace Alf;
+
+
+// FORWARD DECLARATION
+class MMPXViewUtility;
+class MGlxUiCommandHandler;
+class CAlfAnchorLayout;
+class CAlfViewportLayout;
+class CAlfControl;
+class MGlxMediaList;
+class CGlxDefaultAttributeContext;
+class MMPXCollectionUtility;
+class CGlxContainerInfoBubble;
+class MTouchFeedback;
+class MGlxCloudViewMskObserver;
+class MGlxEnterKeyEventObserver;
+class MGlxCloudViewLayoutObserver;
+
+enum TTagEventType
+ {
+ ECustomEventFocusDragScroll
+ };
+/**
+ * CGlxCloudViewControl
+ * Alf-based Cloud control
+ * Creates a weighted list of items based on the associations.
+ *
+ */
+
+class CGlxCloudViewControl : public CAlfControl,public IAlfWidgetEventHandler
+ ,public MGlxMediaListObserver
+ {
+public:
+
+ /**
+ * Perform the two phase construction
+ * @param aEnv - Env Variable of Alf
+ * @param aEmptyText - Specifies the text for the empty list
+ * @param aMediaList - medialist from which attributes will be fetched
+ * @return Pointer to newly created object
+ */
+ static CGlxCloudViewControl *NewL(CAlfDisplay& aDisplay, CAlfEnv &aEnv,
+ MGlxMediaList& aMediaList, const TDesC& aEmptyText
+ ,MGlxCloudViewMskObserver& aObserver
+ ,MGlxEnterKeyEventObserver& aObserverEnterKeyEvent,
+ CAlfAnchorLayout *aAnchorLayout,MGlxCloudViewLayoutObserver& aLayoutObserver);
+
+ /**
+ * Perform the two phase construction
+ * @param aEnv - Env Variable of Alf
+ * @param aEmptyText - Specifies the text for the empty list
+ * @param aMediaList - medialist from which attributes will be fetched
+ * @return Pointer to newly created object
+ */
+ static CGlxCloudViewControl *NewLC(CAlfDisplay& aDisplay, CAlfEnv &aEnv,
+ MGlxMediaList& aMediaList, const TDesC& aEmptyText
+ ,MGlxCloudViewMskObserver& aObserver
+ ,MGlxEnterKeyEventObserver& aObserverEnterKeyEvent,
+ CAlfAnchorLayout *aAnchorLayout,MGlxCloudViewLayoutObserver& aLayoutObserver);
+
+ /**
+ * Destroy the object and release all memory objects
+ */
+ ~CGlxCloudViewControl();
+
+public:
+ /**
+ * Used to identify event handlers that are capable of handling
+ * a specified key or custom event. Pointer event handlers cannot be
+ * identified directly, since they are dependent on the presentation.
+ * Therefore, pointer event handlers should be associated with
+ * a custom event ID that can be used to simulate the actual pointer event.
+ *
+ * @since S60 ?S60_version
+ * @param aEvent The event.
+ * @return <code>ETrue</code> if the event can be processed. Otherwise <code>EFalse</code>.
+ */
+ bool accept ( CAlfWidgetControl& aControl, const TAlfEvent& aEvent ) const;
+
+ /**
+ * @see IAlfWidgetEventHandler
+ */
+ virtual AlfEventStatus offerEvent ( CAlfWidgetControl& aControl, const TAlfEvent& aEvent );
+
+
+ /**
+ * Sets AlfWidgetEventHandlerInitData to event handler.
+ *
+ * @param aData A data structure which contains for example id of the event
+ * handler.
+ */
+ virtual void setEventHandlerData( const AlfWidgetEventHandlerInitData& /*aData*/ )
+ {
+ }
+
+ /**
+ * Defines the widget states, where the event handler is active.
+ * By default, if this method is not called, the event handler is expected
+ * to be active in all states.
+ *
+ * @param aStates A bitmask defining the widget states, where the event
+ * handler is active. The low 16 bits are reserved for the states
+ * defined by the framework in <TODO: add reference>. The high 16 bits are
+ * available for states defined by the client code.
+ */
+ void setActiveStates ( unsigned int aStates );
+
+ IAlfInterfaceBase* makeInterface ( const IfId& aType );
+
+ /**
+ * Returns the type of EventHandler.
+ * @see IAlfWidgetEventHandler::AlfEventHandlerType
+ *
+ * @return The type of event handler.
+ */
+ AlfEventHandlerType eventHandlerType();
+
+ /**
+ * Returns information about the phase in the event handling cycle in
+ * which the event hadler will be executed.
+ * @see IAlfWidgetEventHandler::AlfEventHandlerExecutionPhase
+ *
+ * @return Event handler execution phase.
+ */
+ AlfEventHandlerExecutionPhase eventExecutionPhase();
+
+ /**
+ * Returns AlfWidgetEventHandlerInitData.
+ *
+ * @return A pointer to AlfWidgetEventHandlerInitData structure which contains
+ * for example id of the event handler.
+ */
+ virtual AlfWidgetEventHandlerInitData* eventHandlerData()
+ {
+ return NULL;
+ }
+
+ /**
+ * initialises data for scrollbar model
+ * @param scrollbar widget
+ */
+ void InitializeScrollBar(IAlfScrollBarWidget* aScrollBarWidget);
+
+private:
+ /**
+ * Perform the two phase construction
+ * @param aEvent - key Event to handle
+ * @return EKeyWasConsumed if key event is processed,
+ * otherwise EKeyWasNotConsumed
+ */
+ TBool OfferEventL(const TAlfEvent &aEvent);
+
+ /**
+ * @function HandleKeyUp
+ *
+ */
+ void HandleKeyUpL();
+
+
+ /**
+ * @since S60 3.2
+ *
+ */
+ void HandleLayoutFocusChange();
+
+ /**
+ * @since S60 3.2
+ *
+ */
+ void HandleKeyDownL();
+ /**
+ /**
+ * @since S60 3.2
+ *
+ */
+ void UpdateLayout();
+
+ /**
+ * Displays the empty cloud view when there are no tags to diplay
+ */
+ void DisplayEmptyCloudViewL();
+
+
+ /**
+ * constructor
+ * @param aEnv - Env Variable of Alf
+ * @param aMediaList - medialist from which attributes will be fetched
+ * @param aMediaList - medialist from which attributes will be fetched
+ */
+ CGlxCloudViewControl(CAlfEnv &aEnv,
+ MGlxMediaList& aMediaList,MGlxCloudViewMskObserver& aObserver,MGlxEnterKeyEventObserver& aObserverEnterKeyEvent
+ ,MGlxCloudViewLayoutObserver& aLayoutObserver);
+
+ /**
+ * Perform the two phase construction
+ * @param aStartPoint - start point for draeing the row
+ * @param aRowHeight - height of the row
+ * @param aRowStartIndex - start index of row
+ * @param aRowEndIndex- Index upto which items will be drawn
+ * @return
+ */
+ TInt LayoutVisibleRows(TPoint aStartPoint,TInt aRowStartIndex, TInt
+ aRowEndIndex);
+
+
+
+ /**
+ * Perform the two phase construction
+ * @param aStartRowIndex - row index
+ * @return
+ */
+ void LayoutVisibleArea(/*TInt aStartRowIndex*/);
+
+ /**
+ * returns the rownumber for a particular index.
+ * @param aItemIndex - row index
+ * @return rownum
+ */
+ TInt RowNumber(TInt aItemIndex) const;
+
+ /**
+ * Updates the focus whenever there is a change in focus of the item.
+ */
+ void FocusUpdate();
+
+ /**
+ * Perform the second phase of two phase construction
+ * @param aEmptyText - Specifies the text for the empty list
+ */
+ void ConstructL(const TDesC& aEmptyText,CAlfDisplay& aDisplay,CAlfAnchorLayout *aAnchorLayout);
+
+ /**
+ * Updates Row Structure
+ *
+ */
+ void UpdateRowDataL();
+
+
+ /**
+ * Returns maximum value of usage Count
+ *
+ */
+ TInt MaxUsageCount();
+
+
+ /**
+ * @param aIndex - Media List Index
+ * Returns usage count for a given index
+ * */
+ TInt UsageCount(TInt aIndex);
+
+
+
+ /**
+ * @function FetchAttributeFromCacheL
+ *
+ * */
+ void FetchAttributeFromCacheL();
+
+
+ /**
+ * Utility method to add a TGlxCloudInfo struct into iCloudInfo array
+ * @param aCloudInfo The next item to add into iCloudinfo
+ * @param aRowHeight value of aCloudInfo.iRowHeight
+ * @param aStartIndex value of aCloudInfo.iStartIndex
+ * @param aEndIndex value of aCloudInfo.iEndIndex
+ * */
+ void AppendToCloudArrayL( TGlxCloudInfo& aCloudInfo,
+ const TInt& aStartIndex, const TInt& aEndIndex );
+
+private:
+
+ /**
+ * Sets focused item color
+ **/
+ void SetFocusColor();
+
+
+ /**
+ * Set the middle point of the infobuble
+ **/
+ void SetBubleMidPoint(TPoint& aMidPoint);
+
+ /**
+ * Create the infobublecontainer
+ **/
+ void CreateBubleContainer();
+
+ /**
+ * Move the viewport up depending on the condition
+ *
+ **/
+ void MoveUpIfRequired();
+
+ /**
+ * Move the viewport down depending on the condition
+ **/
+ void MoveDownIfRequired();
+
+ /**
+ * calculate the mid point of the bubble
+ **/
+ void CalculateBubleMidPoint();
+
+public:
+
+ void HandleItemAddedL(TInt aStartIndex, TInt aEndIndex,
+ MGlxMediaList* aList);
+
+ /**
+ * Notification that media object is now available for an item
+ * @param Index of the item
+ * @param aList List that this callback relates to
+ */
+ void HandleMediaL(TInt aListIndex, MGlxMediaList* aList);
+
+
+ /**
+ * Notification that media item was removed from the list
+ * @param aStartIndex First item that was removed
+ * @param aEndIndex Last item that was removed
+ * @param aList List that this callback relates to
+ */
+ void HandleItemRemovedL(TInt aStartIndex, TInt aEndIndex,
+ MGlxMediaList* aList);
+
+ /**
+ * Notification that media item was changed
+ * @param aItemIndexes Indexes of items that were changed
+ * @param aList List that this callback relates to
+ */
+ void HandleItemModifiedL(const RArray<TInt>& aItemIndexes,
+ MGlxMediaList* aList);
+
+ /**
+ * Notification that an attribute is available
+ * @param aItemIndex Index of the for which the thumbnail is available
+ * @param aAttributes Array of attributes that have become available
+ * @param aList List that this callback relates to
+ */
+ void HandleAttributesAvailableL(TInt aItemIndex,
+ const RArray<TMPXAttribute>& aAttributes, MGlxMediaList* aList);
+
+ /**
+ * Notification that focus has moved
+ * @param aType the direction of the focus change
+ * @param aNewIndex the new index after the focus change
+ * @param aOldIndex the old index before the focus change
+ * @param aList List that this callback relates to
+ */
+ void HandleFocusChangedL(NGlxListDefs::TFocusChangeType aType, TInt aNewIndex,
+ TInt aOldIndex, MGlxMediaList* aList);
+
+ /**
+ * Notification that an item has been selected/deselected
+ * @param aIndex Index of the item that has been selected/deselected
+ * @param aSelected Boolean to indicate selection/deselection
+ * @param aList List that the selection relates to
+ */
+ void HandleItemSelectedL(TInt aIndex, TBool aSelected, MGlxMediaList* aList);
+
+ /**
+ * Notification from the collection. E.g. Items added/modified/deleted and progress notifications
+ * @param aMessage Message notification from the collection
+ * @param aList List that the notification relates to
+ */
+ void HandleMessageL(const CMPXMessage& aMessage, MGlxMediaList* aList);
+
+ /**
+ * Notification from the collection that the medialist is populated
+ * @param aList List that the notification relates to
+ */
+ void HandlePopulatedL(MGlxMediaList* /*aList*/);
+
+ /**
+ * Notification from the collection. E.g. Items added/modified/deleted and progress notifications
+ * @param aIndex Index of the item for which property needs to be set
+ * @param aScale Scale parameter to decide the properties of item
+ */
+ void SetPropertiesL(TInt aIndex, TInt aScale);
+
+ /**
+ * Called whenever the resolution is changed
+ */
+ void VisualLayoutUpdated(CAlfVisual & aVisual);
+
+private:
+
+ /**
+ * Handle the pointer event
+ * @param aEvent event describing the gesture
+ */
+ TBool HandlePointerEventL( const TAlfEvent &aEvent );
+
+ /**
+ * Handles the drag events
+ * @param pointer event generated because of drag
+ * @return returns whether the pointer event is consumed or not
+ */
+ TBool HandleDragL(const TPointerEvent& aPointerEvent);
+
+ /**
+ * checks the visual on which the drag event is generated
+ * @param position where the drag event has ocuured
+ * @return the index of the visual that needs to be focused
+ */
+ TInt GetAbsoluteIndex(const TPoint& aPosition);
+
+ /**
+ * Checks which visual lies below/above the focused item and sets the focus
+ * @param the row number that needs to be checked for getting the overlaping visual
+ */
+ void SetRelativeFocusL(TInt aRowNumber);
+
+ /**
+ * Updates layout when orientation is changed
+ */
+ void UpdateLayoutL();
+
+private:
+ /**
+ * Send the scroll custom event to scrollbar widget
+ */
+ void Scroll();
+
+ /**
+ * decide the scrollbar new position
+ * @param number of steps which is used to determine the amout to be scrolled
+ */
+ void UpdateScrollBar(TInt aNumberOfSteps, TBool aDiff = ETrue);
+
+ /**
+ * Display the scrollbar only if there are items
+ * @param visibility
+ */
+ void DisplayScrollBar();
+
+private:
+
+ // The Alf Environment
+ CAlfEnv& iEnv;
+
+ //Parent layout for viewportayout
+ CAlfAnchorLayout* iViewPortParentLayout;
+
+ //ViewPortLayout
+ CAlfViewportLayout* iViewPortLayout;
+
+ //Anchor layout for tags
+ CAlfAnchorLayout *iLayout;
+
+ //medialist not owned
+ MGlxMediaList& iMediaList;
+
+ //Array of Cloud visuals.
+ RPointerArray <CAlfTextVisual> iLabels;
+
+ // Array for information of cloud visuals.
+ RArray <TGlxCloudInfo> iCloudInfo;
+
+ //Ui Utility
+ CGlxUiUtility* iUiUtility;
+
+ // Visual for empty string display
+ CAlfTextVisual *iEmptyString;
+
+ // FocusIndex keeps track of the focussed item
+ TInt iScrollDirection;
+
+ // FocusIndex keeps track of the focussed row
+ TInt iFocusRowIndex;
+
+ // EndRowindex keeps track of the end row
+ TInt iEndRowIndex;
+
+ //keeps track of the end row
+ TInt iLayoutIndex;
+
+ // initiates bubble container
+ CGlxContainerInfoBubble *iBubbleContainer;
+
+
+ // Fetch context for list item attributes
+ CGlxDefaultAttributeContext* iAttributeContext;
+
+ // for storing screen height
+ TInt iScreenHeight;
+
+ // List event observer
+ MGlxCloudViewMskObserver& iObserver;
+
+ // stores the text for empty view
+ HBufC* iEmptyText;
+
+ //Viewport position
+ TAlfRealPoint iViewPortPosition;
+
+ //observer to inform "open" command cloudviewimp class so that it opens the next view
+ MGlxEnterKeyEventObserver& iObserverEnterKeyEvent;
+
+ //observer to inform command cloudviewimp class that layout is changed
+ MGlxCloudViewLayoutObserver& iLayoutObserver;
+ //Viewport size
+ TAlfRealSize iViewPortSize;
+
+ //Viewport virtual size
+ TAlfRealSize iViewPortVirtualSize;
+
+ //Width of the screen in which is available for tags to fit in
+ TInt iTagScreenWidth;
+
+ //Height of the screen in which is available for tags to fit in
+ TInt iTagScreenHeight;
+
+ //Touch feedback instance
+ MTouchFeedback* iTouchFeedback;
+
+ //parent layout for all the layout's
+ CAlfLayout* iParentLayout;
+
+ //data structure for scrollbar
+ ScrollModelChangedEventData iScrollEventData;
+
+ //scrollbar element
+ IAlfWidgetEventHandler *iScrollbarElement;
+
+ //scrollbar widget
+ IAlfScrollBarWidget *iScrollBarWidget;
+
+ //direction of dragging
+ TInt iIsDragging;
+
+ TAknWindowLineLayout iScrollPaneHandle;
+
+ };
+
+#endif // C_GLXCLOUDVIEWCONTROL_H
+