AppInc/ImagicContainerBrowser.h
author jkauppin
Fri, 15 Oct 2010 10:18:29 +0900
changeset 3 93fff7023be8
permissions -rw-r--r--
Initial version

/*
* Copyright (c) 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: Juha Kauppinen, Mika Hokkanen
* 
* Description: Photo Browser
*
*/

#ifndef IMAGICCONTAINERBROWSER_H
#define IMAGICCONTAINERBROWSER_H

//#define ADAPTIVE_FRAMERATE   // adaptive frame rate
#define MOMENTUM_MOVE
#define DOUBLETAP_FACEBROWSING
#define DOUBLETAP_SELECT_IN_GRID
#define SINGLETAP_CLOSE_IN_ZOOM
#define FLICK_ONLY_IN_X_IN_GRID
#define HOLD_SELECTION_ONDRAG
#undef  CURSORSIMULATION_IN_GRID
#undef  CURSORSIMULATION_IN_ONEBYONE
#undef  CURSORSIMULATION_IN_FACEBROWSER
#undef  SELECT_ON_TOUCHDOWN
#undef  TAP_AND_GESTURE
//#undef  DOUBLETAP_ZOOMGRID
#undef  USE_AVKON_LONGTAP_DETECTOR

//#undef RD_FACEFRAME
#define RD_FACEFRAME
#define RD_ZOOMICON

// INCLUDES
#include <coecntrl.h>
#include <aknnotewrappers.h>
#include <aknlongtapdetector.h>
#include <GLES\egl.h>
#include "ImagicAppUi.h"
#include <HWRMLight.h>
#include "Gesture.h"
#include "ImagicUtils.h"
#include "DrawableInterface.h"
#include "DrawUtility.h"
#include "CDrawGrid.h"
#include "CDrawOneByOne.h"
#include "CDrawFaceBrowsing.h"
#include "CDrawMagGlass.h"


#ifdef USE_AVKON_TACTILE_FEEDBACK
#include <touchfeedback.h>
#include <touchlogicalfeedback.h>
#endif

//#define VERTICES_PER_LINE 32


// FORWARD DECLARATIONS
class CImagicViewBrowser;
class CImagicAppUi;
class CGLImageHandler;
class CTextureLoader;
class CDrawUtility;
class CDrawGrid;
class CDrawOneByOne;
class CDrawFaceBrowsing;
class CDrawMagGlass;



// Variables telling how many times keys has been pressed
class CKeyData
	{
public:
    //void ResetData();
    
	//these variables hold number of key presses as long they are consumed
	//value must be reset after usage
	TInt iX,iY;		// Movement keys
	TInt iRotate;	// Rotation keys
	//TInt iZoom;		// Zooming keys
	
	// Tells if button is currently pressed
	TBool iLeft,iRight;
	TBool iUp,iDown;
	//TBool iZoomIn, iZoomOut;
	TBool iZoomInKey, iZoomOutKey;
    };


// CLASS DECLARATION

/**
*  CImagicContainerBrowser  container control class.
*  
*/
class CImagicContainerBrowser : public CCoeControl, MCoeControlObserver
    , MAknLongTapDetectorCallBack
    , MGestureCallBack
    {
    public: // Constructors and destructor
        
        //Drawing functions
        enum TDrawFunction
            {
            EGrid,
            EOneByOne,
            EFaceBrowser,
            ELastDrawFunction
            };

        //Grid Drawing modes
        enum TGridMode
            {
             EListof3 = 1,
             EListof5,
             ESquare
            };
        
        /**
        * EPOC default constructor.
        * @param aRect Frame rectangle for container.
        */
        void ConstructL(CImagicAppUi* aImagicAppUi, CImagicViewBrowser* aView, const TRect& aRect);

        /**
        * Destructor.
        */
        ~CImagicContainerBrowser();
        
        //void SetBitmapArrayL(CFbsBitmap* aBitmap);
        void ImageLoadedL(TInt aError, CFbsBitmap* aBitmap, TThumbSize aResolution/*, TInt aLoadedImageIndex*/);
        
        TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType);
        // Handle any tap on the screen
        void HandlePointerEventL(const TPointerEvent& aPointerEvent);

        // From MAknLongTapDetectorCallBack
        void HandleLongTapEventL(const TPoint& aPenEventLocation, const TPoint& aPenEventScreenLocation);
        void HandleGestureBeganL(const TPoint& aPos);
        void HandleGestureMovedL(const TPoint& aPos, const TGestureType aType);
        void HandleGestureEndedL(const TPoint& aPos, const TGestureType aType);

        void DoTapAndDrag(const TPoint& aPos, const TGestureType aType);
        void DoCursorSimulation(const TPoint& aPos, const TGestureType aType);
        void DoDrag(const TPoint& aPos, const TGestureType aType);
        void DoFlick(const TPoint& aPos, const TGestureType aType);
        void DoSingleTap(const TPoint& aPos, const TGestureType aType);
        void DoDoubleTap(const TPoint& aPos, const TGestureType aType);
        void DoLongTapping(const TPoint& aPos, const TGestureType aType);
        void DoLongTap(const TPoint& aPos, const TGestureType aType);

        
        void SetFullScreen();
        void SetBitmapFromArrayL();
        TBool IsOpenGLInit();
        void OpenGLInitL();
        void InitL();
        void DeleteTextures();
        void DisableDisplayDraw();
        void EnableDisplayDraw();
        //void SetGridMode(TGridMode aDrawMode);
        void SetDrawMode(TDrawFunction aDrawFunction);
        TDrawFunction GetDrawMode();
        void SetBGPSStatus(TBool aValue);
        //void SetTNCreationStarted(TBool aValue);
        void DeleteImageL();
        CTextureLoader* GetTextureLoader();
        void DisplayDeleteQueryDialogL(TInt aResourceId);
        float GetAspectRatio(TInt aIndex);
        void SetFaceCoords(RArray<TRect>& aCoordinates);
        void ClearFaceArray();
        //void SwapArrays();
        void SetLoadingOn(TBool aValue);
        void DynamicLoadingL();
        void SetDeleteTextures(TBool aValue);
        //void InitFaceBrowsing();
        //MRemConCoreApiTargetObserver
        //void MrccatoCommand(TRemConCoreApiOperationId aOperationId, TRemConCoreApiButtonAction aButtonAct);
        
    private: // Functions from base classes

       /**
        * From CoeControl,SizeChanged.
        */
        void SizeChanged();

       /**
        * From CoeControl,CountComponentControls.
        */
        TInt CountComponentControls() const;

       /**
        * From CCoeControl,ComponentControl.
        */
        CCoeControl* ComponentControl(TInt aIndex) const;

       /**
        * From CCoeControl,Draw.
        */
        void Draw(const TRect& aRect) const;

       /**
        * From CCoeControl, HandleControlEventL.
        */
        // event handling section
        // e.g Listbox events
        void HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType);
        
        /**
         * Callback function for the CPeriodic. Calculates the current frame, keeps the background
         * light from turning off and orders the CSlideshow to do the rendering for each frame.
         *@param aInstance Pointer to this instance of CSlideshowContainer.*/
        static TInt DrawCallBackL( TAny* aInstance );
        void DrawL();
        void BeginDrawing();
        void EndDrawing();
        
/*----------------------------------------------------------------------*/
		void CheckLimits(float &aValue, const float aMin, const float aMax);
		void SetPictureVertices(CImageData* aData, GLfixed *aVertices);
		void HandleRotationKeys(void);
		//void HandleMovingKeysOnebyOne();
		
		
		//void BubbleEffect(TInt& x, TInt& y, float& z);
        
        static TInt DisableDrawTimer( TAny* aInstance );
        static TInt PowerSaveCallBack(TAny *aAnyPtr);
        void PowerSave();
        void CheckIndexLimits(TInt &aIndex);
        void SetQvgaCoordinates(const TPoint &aPoint, const TSize &aSize);
        void CalculateImageSize2(float& width, float& height, const float aAspectRatio);
        void InitDrawMagGlass();
        void DrawMagGlass(const TSize &aScreenPhysicalSize, TReal aImageAspectRatio);
        void DrawCross(const TSize &aScreenPhysicalSize, const TReal aImageAspectRatio);
        void SetMinMagFilterLinear(TBool aValue);
        void SetMinMagFilterLinearDo(TBool aValue);
        

        void MoveIndex(TInt aMoveX, TInt aMoveY, TBool aWrap = ETrue);
        void SelectIndex(void);
        FloatCoords ConvertCoordsFromScreen2OGl(const TPoint aPos);
        TBool FindImageInGrid(const TPoint aPos, TInt& aResultIndex);
        TInt GetFreeRam();
        TBool FindImageInScreen(const TPoint aPos, TInt& aResultIndex);
        TBool FindNearestImageInOGl(const FloatCoords aPos, TInt& aResultIndex);
        TBool SetMinMagFilter(CImageData* aImageData, TBool aMagFilterLinear, TInt aIndex);
        void ShowMagGlass(const TBool aState);
        
        void LoadHQ512Image(CImageData* imageData, TInt aIndex);
        void DrawFaceBrowsingIcon();
        void DrawZoomIcon();
        void SetMinMagFiltering();
        void ResetZoomKeys();
        void ResetDirKeyData();
        void HandleDrawingModeSwitch(TDrawFunction& aDrawFunction);
        void LoadHighResImage(CImageData* imageData, TInt aIndex);
        //void CheckIndexLimits(TInt &aIndex);
        
    public:      
        void SetDrawFreqToNormal(TInt aTimerDelay);
        TInt UpdateScreenDrawFreq();
        void CalculateImageSize(float& width, float& height, const float aAspectRatio);
        void HandleRotation(float& aRotationAngle, float& aTargetRotationAngle);
        void SetCurrentFaceNro(TInt aNro);
        void GetCurrentFilenameL(TFileName& aFilename, TThumbSize aRes);
        void ConvertScreenCoords2QvgaCoords(TPoint& aPoint, TRect& aRect);
        TBool FindNearestFace(const TPoint aPos, TInt& aResultIndex);
        void SetLastTouchPoint(const TPoint& aPos);
        TPoint GetLastTouchPoint(void);
        void SetTextIndex(GLuint aIndex);
        void IconTexturesLoaded(RArray<GLuint> aIconTexIndex);
        void Interpolate(float &aValue, const float aTarget, const float aStep);
        TBool GetScreenOrientation();
        void InitAfterPowerSaveL();
        void NewImageAdded();
        void ImageListChanged(TInt aIndex, TBool bAdded);
#ifdef _ACCELEROMETER_SUPPORTED_
        TImagicDeviceOrientation CImagicContainerBrowser::GetDeviceOrientation();
        void PhoneRotated(TImagicDeviceOrientation aDeviceOrientation);
#endif
        TBool IsHwAcceleration();
        void HandleSend2BackgroundEvent();
        void InitFaceBrowsing();
        TBool IsTouchPointThresholdExeed();
        float GetDisplayRotTargetAngle();
        float GetDisplayRotAngle();
        void SetDisplayRotAngle(float aValue);
        TReal GetMaxX() const;
        
        CKeyData& GetKeyData();
        void SetKeyData(CKeyData aData);
        void ResetKeyData();
        
        CKeyData& GetTouchData();
        void SetTouchData(CKeyData aData);
        void ResetTouchData();
                
        TBool GetSlideByDragValue();
        TInt GetCurrentIndex();
        TInt GetPrevIndex();
        void SetCurrentIndex(TInt aIndex);
        void SetPrevIndex(TInt aIndex);
        TInt GetGleMaxRes();
        void ResetHighResLoading();
        void DynamicUnLoading();
        TBool IsUserInputGiven();
        TSize GetScreenSize();
        void SetScreenImmeadetaUpdate(TBool aValue);
       
/*----------------------------------------------------------------------*/
        
    private: //data
        CImagicAppUi*           iImagicAppUi;//App UI class pointer
        CIEEngine*              iIEngine;
        CImagicViewBrowser*     iView;//Browser view class pointer
        //CTextureLoader*			iTextureLoader;
        CGesture*               iGesture;
        CDrawUtility*           iDrawUtility;
        
    friend class CTextureLoader;
        CTextureLoader*         iTextureLoader;
    friend class CDrawGrid;
        CDrawGrid*              iDrawGrid;
    friend class CDrawOneByOne;
        CDrawOneByOne*          iDrawOneByOne;
    friend class CDrawFaceBrowsing;
        CDrawFaceBrowsing*      iDrawFaceBrowsing;
    friend class CDrawMagGlass;
        //CDrawMagGlass*          iDrawMagGlass;
        
        
        
        
    private: //data
/*----------------------------------------------------------------------*/
       //OpenGL valiables
	   //Flag that indicates if OpenGL ES has been initialized or not.
	    TBool iOpenGlInitialized;
	    //Display where the OpenGL ES window surface resides.
	    EGLDisplay  iEglDisplay;
	    //Window surface where the OpenGL ES rendering is blitted to.
	    EGLSurface  iEglSurface;
	    // OpenGL ES rendering context.
	    EGLContext  iEglContext;
	    //Active object that is the timing source for the animation.
	    CPeriodic*  iPeriodic;
	    CPeriodic*  iPowerSavePeriodic;
/*----------------------------------------------------------------------*/	    
	    
        //Variables used to calculate time
        GLfloat     	    iLastTime;
        GLfloat     	    iTimeNow;
        GLfloat     	    iTimeDiff;

/*----------------------------------------------------------------------*/
        //Variables for OneByOne init
        TBool               iOnTheEdge;
        TBool               iTouchPointThreshold;
        TBool               iKeyPressedDown;

/*----------------------------------------------------------------------*/
        TInt				iCurrentIndex;// Selected picture index
		TInt                iPreviousIndex;// One before selected picture index
		
/*----------------------------------------------------------------------*/		
		
				
		//Draw function enum, OneByOne and Grid implemented, add here more when new draw function are created
		enum TDrawFunction	iDrawFunction;
		
		
		//Struct for KeyData, this struct holds all data for key events handling
		CKeyData		    iTouchMoveData;
		CKeyData            iKeyData;
		
		float               iDisplayRotation;//This controls the whole display rotation, not single picture
		float               iDisplayRotationTarget;//Display target rotation angle
		TBool               iScreenRotateOngoing;
		TReal               iScreenAspectRatio;
		TSize               iScreenSize;
		
		TBool               iTNCreationComplete; // Set TRue if TNs are created
        RCriticalSection    iDrawLock;
        
        //Texture related variables
        GLuint              iCurrentBindedIndex;
        TInt                iLoadingTextureIndex; // texture to draw if no image exist
        TInt                iExitTextureIndex; // texture to draw if no image exist
        TInt                iMenuTextureIndex; // texture to draw if no image exist
#ifdef SHADOW_PHOTOS        
        TInt                iShadowTextureIndex;
#endif        
        TInt                iDisplayDrawFreq;
        GLint               iGLMaxRes;//OpenGL max texture resolution
 
//        CRemConInterfaceSelector* iSelector;
//        CRemConCoreApiTarget* iTarget;
       
       //When set on drawing is enabled
       TBool                iDrawNow;

       //Image loading related flags
       TBool                iDynamicLoadingOn;//Set on for dynamic loading
       TBool                iNewImageAdded;//New image added to array
       TInt                 iIsLoaderRunning;
       
       TBool                iMagFilterLinear;//Set on when linear filtering is wanted
       
       RArray<GLuint>       iIconTextureIndexes;//Array to hold icon textures
       TBool                iMinMagFilterSetting;
       TBool                iPreferHighResLoading;//Set this on when want to load high resolution image(stops loading low res images)
       
       
#ifdef USE_AVKON_LONGTAP_DETECTOR
       CAknLongTapDetector* iLongTapDetector;
#endif
#ifdef USE_AVKON_TACTILE_FEEDBACK
       MTouchFeedback*      iTouchFeedBack;
#endif
       
       TPoint               iLastTouchPoint;
       
#ifdef HOLD_SELECTION_ONDRAG
       TBool                iHoldSelection;
       TBool                iOneByOneSlideByDrag;
#endif
#ifdef MOMENTUM_MOVE
       TBool                iMomentumMove;
       float                iMomentumSpeedX;
       float                iMomentumSpeedY;
#endif
       
       TReal                    iDeviceOrientationAngle;
#ifdef _ACCELEROMETER_SUPPORTED_
	   TImagicDeviceOrientation iDeviceOrientation;
	   TImagicDeviceOrientation iDeviceOrientationPrev;
#else
	   TBool                    iDeviceOrientation;
#endif
	   
#ifdef ADAPTIVE_FRAMERATE
	   TInt                     iWaitDrawTicks;
#endif	   
	   
	   //Remove these
	   TBool               iIntheEndOfGrid;
       TBool               iJumpOver;
	   TInt                iDrawOnes;
	   
	   TBool               iUserInputGiven;
	   TBool               iDeleteTextures;
	   TBool               iScreenImmeadetaUpdate;
	   
	   TReal               drawZoom;
	   TReal               inPictureX;
	   TReal               inPictureY;
	   
	   TBool               iLastEventFromKeys;
	   
	   //Class consts
	   static const GLfixed iGlobalTexCoords[4*2];
       static const float KMinOneByOneZoom;
       static const float KMaxOneByOneZoom;
	   static const TInt  KDoubleTapZoomOneByOne1;
       static const TInt  KDoubleTapZoomOneByOne2;
       static const TReal KAngle2Start128Loading;
       static const TReal KAngle2Start128LoadingHwAcc;
       static const float KSpacingX;// Picture spacing in the grid
       static const float KSpacingY;// Picture spacing in the grid
       static const float KSpacingYTarget;
       static const float KSpacingXTarget;
       // Space between pictures in one by one
       static const float KOneByOneSpacing;
       static const TInt  KGridSizeY;
       
       static /*const*/ TInt  K512TNImageBuffer;
       static const TInt  K128TNImageBuffer;
       static /*const*/ TInt  K32TNImageBuffer;
       static /*const*/ TInt  K32TNImageUnLoadBuffer;
       
    };

#endif

// End of File