taskswitcher/taskswitcherui/taskswitcherapp/inc/tsfastswaparea.h
branchRCL_3
changeset 34 5456b4e8b3a8
child 35 3321d3e205b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/taskswitcher/taskswitcherui/taskswitcherapp/inc/tsfastswaparea.h	Wed Sep 01 12:32:46 2010 +0100
@@ -0,0 +1,500 @@
+/*
+* Copyright (c) 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:  Taskswitcher Fast Swap area UI
+ *
+*/
+
+#ifndef TSFASTSWAPAREA_H
+#define TSFASTSWAPAREA_H
+
+#include <e32base.h>
+#include <eikmobs.h>
+#include "tsdevicestate.h"
+#include "tsfswclientobserver.h"
+#include "tsfastswapgrid.h"
+#include "tseventcontrolerobserver.h"
+
+
+// FORWARD DECLARATIONS
+class CTsFswClient;
+class CTsFswEntry;
+class CAknStylusPopUpMenu;
+class CAknQueryDialog;
+class CTsEventControler;
+class MTsDataChangeObserver;
+class CAknLongTapAnimation;
+
+/**
+ * Taskswitcher Fast Swap area UI.
+ */
+class CTsFastSwapArea: public CCoeControl,
+                               public MEikMenuObserver,
+                               public MTsFswObserver,
+                               public MEikListBoxObserver,
+                               public MTsFastSwapGridObserver,
+                               private MTsEventControlerObserver,
+                               public MTsDeviceStateObserver,
+                               public MTsFastSwapTimerObserver
+    {
+public:
+    /**
+     * Two-phase constructor.
+     * 
+     * @param aRect Area where fast swap info & list should draw itself.
+     * @param aParent Parent CoeControl. 
+     */
+    static CTsFastSwapArea* NewL( const TRect& aRect,
+            CCoeControl& aParent, CTsDeviceState& aDeviceState,
+            CTsEventControler& aEventHandler);
+
+    /**
+     * @copydoc NewL
+     */
+    static CTsFastSwapArea* NewLC( const TRect& aRect,
+            CCoeControl& aParent, CTsDeviceState& aDeviceState,
+            CTsEventControler& aEventHandler);
+
+    /**
+     * Destructor.
+     */
+    ~CTsFastSwapArea();
+
+    /**
+     * Called from appview when coming to foreground.
+     */
+    void HandleSwitchToForegroundEvent();
+    
+    /**
+     * Called from appview when going to background.
+     */
+    void HandleSwitchToBackgroundEvent();
+
+    /**
+     * Called after construction to set up additional properties,
+     * like the control observer.
+     */
+    void Setup( MCoeControlObserver& aControlObserver );
+
+    /**
+     * Saves the index of the currently selected (highlighted) item.
+     */
+    void SaveSelectedIndex();
+    
+    /**
+     * Restores the selection (highlight) position.
+     */
+    void RestoreSelectedIndex();
+
+    // Functions to perform activate, close, close others operations.
+    // They are public so same functionality can be implemented in the
+    // Options menu (appui) for example.
+    
+    /**
+     * Index of highlighted item or KErrNotFound.
+     */
+    TInt SelectedIndex() const;
+    
+    /**
+     * Brings the app corresponding to the item at given index into foreground.
+     */
+    void SwitchToApp( TInt aIndex );
+    
+    /**
+     * Brings the app with the give Uid into foreground
+     */
+    void SwitchToApp( const TUid& aUid );
+    
+    /**
+     * Sends close msg to given app.
+     * @param   aIndex      index
+     * @param   aSuppressRendering  content is not refreshed if ETrue
+     */
+    void TryCloseAppL( TInt aIndex, TBool aSuppressRendering = EFalse );
+    
+    /**
+     * Tries to Close all applications that cn be closed
+     */
+    void TryCloseAllL();
+    
+    /**
+     * True if it is allowed to ask the given app to close.
+     * @param   aIndex  index
+     */
+    TBool CanClose( TInt aIndex ) const;
+    
+    /**
+     * @param  aSelectedItem  item for which pop up is shown
+     * 
+     * @return ETrue, when number of closable apps is >= 2 or there is at least
+     *                one closable item and non closable item is selected.
+     * @return EFalse, when number of closable apps is < 2.
+     */
+    TBool CanCloseAll( TInt aSelectedItem ) const;
+
+    /**
+     * Returns the number of items in the list.
+     */
+    TInt Count() const;
+
+    /**
+     * Returns the underlying Ganes control pointer.
+     */
+    CCoeControl* GetChildControl() { return iGrid; }
+
+    /**
+     * Sets the data-changed observer.
+     */
+    void SetDataChangeObserver( MTsDataChangeObserver* aDcObserver );
+
+    /*
+     * Handling short/long app key.
+     */
+    void HandleAppKey(TInt aType);
+
+private:
+
+    /**
+     * @copydoc NewL
+     */
+    void ConstructL( const TRect& aRect );
+
+    /**
+     * C++ constructor.
+     */
+    CTsFastSwapArea(CCoeControl& aParent,
+            CTsDeviceState& aDeviceState,
+            CTsEventControler& aEventHandler);
+    
+    // From MEikListBoxObserver
+    void HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType);
+    
+public:
+    /**
+     * Implements drag gesture handling
+     * @see MTsEventControlerObserver
+     */
+    void MoveOffset(const TPoint&, TBool);
+
+    /**
+     * Implements tap gesture handling
+     * @see MTsEventControlerObserver
+     */
+    void TapL(const TPoint&);
+
+    /**
+     * Implements long tap gesture handling
+     * @see MTsEventControlerObserver
+     */
+    void LongTapL(const TPoint&);
+
+    /**
+     * Implements drag gesture handling
+     * @see MTsEventControlerObserver
+     */
+    void DragL(const AknTouchGestureFw::MAknTouchGestureFwDragEvent& aEvent);
+    
+    /**
+     * Implements animation stop handling
+     * @see MTsEventControlerObserver
+     */
+    void Stop();
+    
+    /**
+     * Implements view position getter. Returns point in the middle of the
+     * grid view window.
+     * 
+     * @see MTsEventControlerObserver
+     */
+    TPoint ViewPos()const;
+    
+    /**
+     * Checks if the app with the given window group id is closing
+     */
+    TBool IsAppClosing( TInt aWgId );
+    
+    /**
+     * Checks if app with the given window group id is present on taskswitcher
+     * list.
+     */
+    TBool WgOnTaskList( TInt aWgId );
+    
+public:    
+    // from CCoeControl    
+    TInt CountComponentControls() const;
+    CCoeControl* ComponentControl(TInt aIndex) const;
+    void FocusChanged( TDrawNow aDrawNow );
+    void SizeChanged();
+    void Draw( const TRect& aRect ) const;
+    TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType );
+    void HandlePointerEventL( const TPointerEvent& aPointerEvent );
+    
+private:
+    // From MTsFswObserver     
+    void HandleFswContentChanged();
+    
+    // From MEikMenuObserver
+    void ProcessCommandL( TInt aCommandId );
+	void SetEmphasis( CCoeControl*, TBool ) { }
+	
+	// From MTsFastSwapGridObserver
+	void HandleCloseEventL(TInt aItemIdx);
+	
+	// From MTsDeviceStateObserver
+	void HandleDeviceStateChanged( TChangeType aChangeType );
+
+    // From MTsFastSwapTimerObserver
+    void TimerCompletedL( CTsFastSwapTimer* aSource );
+	
+// new functions    
+
+    /**
+     * Switches to another application.
+     */
+    void SwitchToApp( TInt aWgId, const TUid& aUid );
+    
+    /**
+     * Makes a copy of the given bitmap.
+     * Also scaled to the given size, but maintains aspect ratio,
+     * so the size of the returned bitmap may be less then aSize.
+     */
+    CFbsBitmap* CopyBitmapL( TInt aFbsHandle, TSize aSize );
+
+    /**
+     * Called from HandleFswContentChanged.
+     */    
+    void HandleFswContentChangedL();
+    
+    /**
+     * Shows the content from iArray on the screen.
+     */
+    void RenderContentL( TBool aSuppressAnimation = EFalse );
+    
+    /**
+     * Creates the ganes grid control.
+     */
+    void ReCreateGridL();
+    
+    /**
+     * Setup grid layout
+     */
+    void LayoutGridL();
+    
+    /**
+     * Setup grid layout for view
+     * 
+     * @param  aItemCount  number of items in grid
+     */
+    void LayoutGridViewL( TInt aItemCount );
+    
+    /**
+     * Returns rectangles for fast swap area controls
+     */
+    void GetFastSwapAreaRects( RArray<TAknLayoutRect>& aRects );
+
+    /**
+     * Creates a stylus popup instance (iPopup) if not yet done.
+     */
+    void PreCreatePopupL();
+
+    /**
+     * Shows the stylus popup menu if not yet visible.
+     * @param   aIndex  index of item in the grid
+     * @param   aPoint  position for the popup
+     */
+    TBool ShowPopupL( TInt aIndex, const TPoint& aPoint );
+
+    /**
+     * Sends the data-changed notification.
+     */   
+    void NotifyChange();
+    
+    /**
+     * Retrieves and returns size for image graphics.
+     */
+    TSize PreferredImageSize();
+    
+    /**
+     * Retrieves number of items in grid
+     */
+    TInt GridItemCount();
+    
+    /**
+     * Calculates the correct size if aspect ratio needs to be preserved.
+     */
+    TSize CalculateSizePreserveRatio(const TSize& aTargetAreaSize,
+            const TSize& aSourceSize);
+    
+    /**
+     * Selects next item in grid
+     */
+    void SelectNextItem();
+    
+    /**
+     * Centralise most centered item so it was most exposed on the view.
+     * Centered element is being selected by grid.
+     * Animation to the centered element is made after aRedrawDelay time.
+     * 
+     * @param aRedrawDelay - animation delay.
+     */
+    void CenterItem( TInt aRedrawDelay);
+    
+    /**
+     * Returns full grid view size.
+     */
+    TSize GridWorldSize();
+    
+    /**
+     * Updates grid, called for manual grid scroll update
+     * 
+     * @param  aForceRedraw    if set to ETrue - redraw will be forced
+     * @param  aAnimate        set to ETrue to enable animation
+     */
+    void UpdateGrid( TBool aForceRedraw = EFalse,
+                     TBool aAnimate = ETrue );
+    
+    /**
+     * Returns grid view size
+     */
+    TSize ViewSize();
+    
+    /**
+     * Returns the position of the given item inside grid world rect.
+     * Returns point in the middle of the view rectangle.
+     * 
+     * @param  aItemIdx  index of the item for which calculation will be done
+     */
+    TPoint ItemViewPosition( TInt aItemIdx );
+    
+    /**
+     * Returns index of the shown item, based on the logical
+     * position of the grids view. Item that is closest to the
+     * middle of screen is returned.
+     * 
+     * @param  aViewPos  grids view position. This must be point in
+     *                   the middle of the view rectangle
+     * @return  index of the item
+     */
+    TInt ViewToVisibleItem( const TPoint aViewPos );
+    
+    /**
+     * Launches increasing pop-up feedback.
+     */
+    void LaunchPopupFeedback();
+    
+    /**
+     * Show highlight when disabled and 
+     * consume EEventKeyUp that follows after event that swiched on the highlight.
+     */
+    TKeyResponse ShowHighlightOnKeyEvent(const TKeyEvent& aKeyEvent, TEventCode aType);
+    
+    /**
+     * Returns current screen orientation:
+     * 
+     * @return  1 if landscape, 0 if portait 
+     */
+    TInt GetCurrentScreenOrientation();
+    
+    /**
+     * Retrieves variety value, based on current screen resolution.
+     * 
+     * @param  aVariety  result of the function, 0 value means portrait
+     *                   value of 1 indicates landscape
+     * @return  ETrue if screen resolution differs from vale returned by
+     *          layout meta data functions.
+     */
+    TBool GetVariety( TInt& aVariety );
+    
+    /**
+     * Cancels long tap animation.
+     */
+    void CancelLongTapAnimation( TBool aDisablePopup = ETrue );
+    
+    /**
+     * Checks if long tap animation should be shown in
+     * a given point.
+     * 
+     * @param  aHitPoint  point where tapped event is registered
+     * @return  ETrue if long animation is allowed for that position
+     */
+    TBool LongTapAnimForPos( const TPoint& aHitPoint );
+    
+private: // Data
+    
+    // parent control
+    CCoeControl& iParent;
+    
+    // device state
+    // not own 
+    CTsDeviceState& iDeviceState;
+
+    // grid, own
+    CTsFastSwapGrid* iGrid;
+        
+    // fsw client, own
+    CTsFswClient* iFSClient;
+    // fsw content, ptrs owned
+    RPointerArray<CTsFswEntry> iArray;
+    
+    // index of selected (highlighted) item in the grid
+    // when the fsw was last focused
+    TInt iSavedSelectedIndex;
+    
+    // fsw popup (activate, close, etc.), own
+    CAknStylusPopUpMenu* iPopup;
+    // the aIndex argument of ShowPopupL is stored here
+    TInt iAppIndexForPopup;
+    
+    // Observer ptr, may be NULL, not owned
+    MTsDataChangeObserver* iDcObserver;
+    
+    //Input events handler
+    CTsEventControler& iEvtHandler;
+    
+    TInt iMaxItemsOnScreen;
+    
+    // Tap event
+    TPointerEvent iTapEvent;
+    CTsFastSwapTimer* iHighlightTimer;
+    TPoint iActivateOnPointerRelease;
+    TBool iHandlePointerCandidate;
+    
+    // View offset position, used by animation physics
+    TInt iLogicalViewPosOffset;
+    
+    // Grid scrolling
+    TInt iGridItemWidth;
+    TInt iGridItemGap;
+    
+    CTsFastSwapTimer* iRedrawTimer; // owned
+    CTsFastSwapTimer* iUpdateGridTimer;//owned
+    CTsFastSwapTimer* iOrientationSignalTimer; // owned
+    TInt iPrevScreenOrientation;
+    TBool iIgnoreLayoutSwitch;
+    
+    // Key event handling
+    TBool iConsumeEvent;
+    TBool iKeyEvent;
+    
+    // App closing handling
+    RArray<TInt> iIsClosing;
+    TInt iWidgetClosingCount;
+    TInt iPrevAppCount;
+    
+    // Long tap animation
+    CAknLongTapAnimation* iLongTapAnimation;
+    CTsFastSwapTimer* iLongTapAnimationTimer;
+    TBool iLongTapAnimationRunning;
+    };
+
+#endif // TSFASTSWAPAREA_H