/*
* Copyright (c) 2007-2010 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 class for all camera application containers
*/



#ifndef CAMCONTAINERBASE_H
#define CAMCONTAINERBASE_H



// INCLUDES
#include <coecntrl.h>
#include <AknUtils.h>
#include "CamAppUiBase.h"             //  For TCamAppViewIds

// FORWARD DECLARATIONS
class CCamAppController;
class CAknView;
class MAknsControlContext;

class CEnhancedSoftKeys;

class CCamNaviCounterControl;
class CCamNaviProgressBarControl;
class MActivePalette2UI;
class CCamBackupContainer;

const TInt KCamPreCaptureWindowOrdinalPos = 100;
const TInt KCamPostCaptureWindowOrdinalPos = 101;


// CLASS DECLARATION

/**
* Container base class
*/
class CCamContainerBase : public CCoeControl
  {
  // =======================================================
  // Typenames
  public:

    // Was defined in multiple child classes, now moved here.
    enum TVfState // ViewFinder states
      {
      EVfStateActive,
      EVfStateFrozenDimmed,
      EVfStateActiveMasked
      };    
    
    
    // Enumeration used to indicate the pane currently visible
    enum TCamActiveNaviPane
      {
      ECamPaneUndefined,
      ECamPaneCounter,
      ECamPaneProgress
      };
    
  // =======================================================
  // Methods

  // Constructors and destructor
  public: 
        
    /**
    * Destructor.
    * @since 2.8
    */
    virtual ~CCamContainerBase();

  // -------------------------------------------------------
  // From CCoeControl
  public: 
    
    /**
    * Return this controls window.
    * This is needed for direct viewfinding.
    * Protected in CCoeControl. (not virtual)
    */
    RWindow& Window() const;

    /**
    * Handle events sending app to foreground or background
    * @since 2.8
    * @param aForeground whether the event brings the app to fore or background
    */
    virtual void HandleForegroundEventL( TBool aForeground );
    
    /** 
    * Gets an object whose type is encapsulated by the specified TTypeUid object.
    * @since 2.8
    * @param aId Encapsulates the Uid that identifies the type of object required.
    * @return Encapsulates the pointer to the object provided. 
    */
    TTypeUid::Ptr MopSupplyObject( TTypeUid aId );
        
    /**
    * This method should change its client rect area and redraw properly.
    * @since 2.8
    * @param aType resource change
    */
    virtual void HandleResourceChange( TInt aType );

    /**
    * Handle application level event.
    * For example focus gained and lost are notified through this method.
    * Default implementation is empty, to be replaced in inherited classes.
    * @param aEvent Event type
    */
    virtual void HandleAppEvent( const TCamAppEvent& aEvent );



    /**
    * @since 2.8
    * @param aKeyEvent the key event
    * @param aType the type of the event
    * @return TKeyResponse key event was used by this control or not
    */
    TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent,
                                       TEventCode aType );  

  // -------------------------------------------------------
  // New functions
  public: 
    
    /**
    * Passes the value of the previous view to the container
    * @since 2.8
    * @param aId The ID of the previous view
    */
    void SetPreviousViewId( TCamAppViewIds aId );

    /**
    * Sets up a navipane for use by this container
    * @param aNaviPane specifies which navipane to set up.
    * @since 3.0
    */
    void SetupNaviPanesL( TCamActiveNaviPane aNaviPane );
    
    /**
    * Will show the zoom pane for a set time
    * Only implemented by pre capture containers
    * @since 2.8
    */
    virtual void ShowZoomPaneWithTimer();
         
    /**
    * Create the ActivePalette control
    * @since 3.0
    */
    void CreateActivePaletteL();
    
    /**
    * Destroys the ActivePalette control
    * @since 3.0
    */
     static void DestroyActivePalette();      

    /**
    * Requests that the camera application redraws the supplied area
    * @since 3.0
    * @param aArea the area to redraw
    */
    virtual void Redraw(const TRect& aArea);
        
      
    /**
    * Load layouts for the text      
    */      
    void PrepareProcessingBackgroundL();

    /**
    * Load processing image/video text from resources.
    */
    void PrepareProcessingTextL( TBool aStillMode );  
    
    /**
    * Delete and null processing text, after which
    * the text will no longer be drawn.
    */
    void DismissProcessingText();
    
    /**
     * Load processing image text for burst from resources.
     */
    void PrepareBurstProcessingTextL();  

    /**
     * Update processing image text for burst.
     * @param aHandled number of imagedata received
     * @param aTotal number of snapshots received
     */
    void UpdateBurstProcessingTextL( TInt aHandled, TInt aTotal );  

    /**
     * Delete and null processing text, after which
     * the text will no longer be drawn.
     */
    void DismissBurstProcessingText();
    
    /**
    * Viewfinder layout rect
	* @param aTargetMode target mode for which viewfinder rect is required. Default(ECamControllerIdle) corresponds to current active mode.
    * @return TRect viewfinder rect from layout
    */
    TRect ViewFinderFrameRect(TCamCameraMode aTargetMode = ECamControllerIdle) const; 
 
    /**
    * We check for the file name whenever we call the UMP
    * or Properties view and come back.
    */
    virtual void CheckForFileName( TBool aDoCheck );
        
  protected: 

    /**
    * Whether or not this key is considered to be capture key
    * in the current context
    * @since 3.0
    * @param aKeyEvent the key event
    * @param aType the type of event
    * @return ETrue if this is a capture key, otherwise EFalse
    */
    TBool IsCaptureKeyL( const TKeyEvent& aKeyEvent,
                               TEventCode aType ) ;

    /**
    * Whether or not this key is considered to be shutter key
    * in the current context
    * @since 3.0
    * @param aKeyEvent the key event
    * @param aType the type of event
    * @return ETrue if this is a shutter key, otherwise EFalse
    */
    TBool IsShutterKeyL( const TKeyEvent& aKeyEvent,
                               TEventCode aType ) ;                 

    /**
    * Whether or not this key is considered to be zoom key
    * in the current context
    * @since 3.0
    * @param aKeyEvent the key event
    * @param aType the type of event
    * @return ETrue if this is a zoom key, otherwise EFalse
    */
    TBool IsZoomKeyL( const TKeyEvent& aKeyEvent,
                            TEventCode aType ) ;
    /**
    * Is zoom operation currently possible?
    * @since 3.0
    */               
    TBool ZoomAvailable();
    
    /**
    * Is Primary Capture Key
    * @since 9.1
    */               
    TBool IsPrimaryCameraCaptureKey( const TKeyEvent& aKeyEvent ) const ;     
    
    /**
    * Is Secondary Capture Key
    * @since 9.1 ( checking for scan codes )
    */               
    TBool IsSecondaryCameraCaptureKey( const TKeyEvent& aKeyEvent ) const ;    
    /**
    * Enters viewfinder mode either in image or videomode
    * depending current visible view. Also starts idle timer.
    */
    void ReserveAndStartVF();
    
  // -------------------------------------------------------
  // Constructors
  protected: 

    /**
    * C++ constructor
    * @since 2.8
    * @param aController reference to CCamAppController instance
    * @param aView reference to the view containing this container
    */
    CCamContainerBase( CCamAppController& aController,
                       CAknView& aView );
    /**
    * Symbian OS 2nd phase constructor.
    * @since 2.8
    * @param aRect Frame rectangle for container.
    */
    void BaseConstructL( const TRect& aRect ); 
    
  protected:
    /**
     * Create background context (iBgContext). May be overridden by
     * derived classes.
     * @since S60 v5.0
     */
    virtual void CreateBackgroundContextL();
    
public:
    
    /**
    * Returns the number of component controls
    * @since 3.0
    * @return The number of owned controls to display
    */       
    TInt CountComponentControls() const;
    
    /**
    * Returns the specified component control
    * @since 3.0
    * @param aIndex The index of the control to return
    * @return Pointer to the specified control
    */               
    CCoeControl* ComponentControl( TInt aIndex ) const;
    
  // =======================================================
  private:
    /*
    * Checks for the zoom key with the mapped key's scan code
    */
    TBool CheckForZoomKey( const TKeyEvent& aKeyEvent );  
    
    /*
    * Checks for the zoom-in/out key from the mapped key's scan code 
    * from the zoom array
    */
    TBool CheckInZoomKeyArray( const TKeyEvent& aKeyEvent );
    
  // Data
  protected: 

    CAknView& iView;
    CCamAppController& iController; 
    
    // The ID of the previous view
    TCamAppViewIds iPrevViewId;
    
    // context for skin background drawing
    MAknsControlContext* iBgContext;

    // The current pane displayed in the Application Pane
    TCamActiveNaviPane iPaneInUse;
    
    // Instance of Navi Counter control (not owned)
    CCamNaviCounterControl* iNaviCounterControl;
    
    // Instance of Navi Progress control (not owned)
    CCamNaviProgressBarControl* iNaviProgressBarControl;
              
    // Instance of ActivePalette2 control (not owned)
    static MActivePalette2UI*   iActivePalette;

    // ETrue if shutter key (half-press) has been made
    TBool iKeyShutter;

    // zoom keys for primary and secondary camera
    RArray<TInt> iPrimaryZoomInKeys;
    RArray<TInt> iPrimaryZoomOutKeys;
    RArray<TInt> iSecondaryZoomInKeys;
    RArray<TInt> iSecondaryZoomOutKeys;

    // capture keys
    RArray<TInt> iPrimaryCameraCaptureKeys;
    RArray<TInt> iSecondaryCameraCaptureKeys;
    
    // AF key or half capture key press scan codes
    RArray<TInt> iPrimaryCameraAFKeys;    
    
    /// Remember current orientation, so we only redraw when necessary
    TCamOrientation iCamOrientation;

  TAknLayoutText iProcessingTextLayout;
  HBufC* iProcessingText;
      TAknLayoutText iBurstProcessingTextLayout;
      HBufC* iBurstProcessingText;
  
  //Backup child container to keep the background of viewfinder window always opaque
  CCamBackupContainer* iBackupContainer;
  };

#endif // CAMCONTAINERBASE_H

// End of File
