csxhelp/inc/CSXHHtmlTopicContainer.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:30:56 +0100
branchRCL_3
changeset 45 cbffe13eac63
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201031 Kit: 201035

/*
* Copyright (c) 2006 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:  CCSXHHtmlTopicContainer class declaration
*
*/


#ifndef INC_CCSXHHTMLTOPICCONTAINER_H__
#define INC_CCSXHHTMLTOPICCONTAINER_H__
//If I use INC_CCSXHHTMLTOPICCONTAINER_H__, then CodeScanner fails 
//but if I use INC_CCSXH_HTML_TOPIC_CONTAINER_H__ code scanner 
//reports an error but produces results for other files

#include <coecntrl.h>
#include <brctllinkresolver.h>
#include <brctlinterface.h>
//RUNTIME
#include <featurecontrol.h>

class CBrCtlInterface;
class CCSXHDocument;
class CCSXHHtmlTOC2;
class CCSXHHtmlTopicView;
class AppLauncherForCSXH;
class CCSXHHelpContentBase;

typedef CBrCtlInterface* (*FuncPtr_CreateBrowserControlL) (CCoeControl* aParent, TRect aRect,
    TUint aBrCtlCapabilities, TUint aCommandIdBase = TBrCtlDefs::ECommandIdBase,
    MBrCtlSoftkeysObserver* aBrCtlSoftkeysObserver = NULL,
    MBrCtlLinkResolver* aBrCtlLinkResolver = NULL,
    MBrCtlSpecialLoadObserver* aBrCtlSpecialLoadObserver = NULL,
    MBrCtlLayoutObserver* aBrCtlLayoutObserver = NULL,
    MBrCtlDialogsProvider* aBrCtlDialogsProvider = NULL,
    MBrCtlWindowObserver* aBrCtlWindowObserver = NULL,
	MBrCtlDownloadObserver* aBrCtlDownloadObserver = NULL );

// A container which draw white rectagle.
NONSHARABLE_CLASS( CBlankContainer ): public CCoeControl
    {
public:
    CBlankContainer();
    ~CBlankContainer();
    
    /** 
    *  From CoeControl class
    *  @function Draw
    *  Draw() for drawing the Background
    */
    void Draw( const TRect& aRect ) const;
    
    };

/** 
* @class CCSXHHtmlTopicContainer
* This class provides Browser functionality
*/

class CCSXHHtmlTopicContainer : public CCoeControl, public MBrCtlLinkResolver, 
								public MBrCtlLinkContent, public MBrCtlLoadEventObserver,
								public MBrCtlSoftkeysObserver,public MBrCtlLayoutObserver
    {
public:

/** 
*  @function NewL
*  @since S60 3.2
*  Construct a CCSXHHtmlTopicContainer 
*  and return a pointer to the created object
*  @param aRect - TRect Object
*		  aDocument - Document Object 
*		  aView		- HtmlTopicView Pointer
*  @return a CCSXHHtmlTopicContainer Pointer 
*/
    static CCSXHHtmlTopicContainer* NewL(const TRect& aRect,CCSXHDocument 
    &aDocument,CCSXHHtmlTopicView *aView);

/** 
*  @function NewLC
*  @since S60 3.2
*  Construct a CCSXHHtmlTopicContainer 
*  and return a pointer to the created object using two phase constuction
*  @param aRect - TRect Object
*		  aDocument - Document Object 
*		  aView		- HtmlTopicView Pointer
*  @return a CCSXHHtmlTopicContainer Pointer 
*/
    static CCSXHHtmlTopicContainer* NewLC(const TRect& aRect,CCSXHDocument
     &aDocument,CCSXHHtmlTopicView *aView);

/** 
*  @function CCSXHHtmlTopicContainer
*  @since S60 3.2
*  Construct a CCSXHHtmlTopicContainer 
*  and return a pointer to the created object using two phase constuction
*  @param aRect - TRect Object
*		  aDocument - Document Object 
*		  aView		- HtmlTopicView Pointer
*  @return a CCSXHHtmlTopicContainer Pointer 
*/
	CCSXHHtmlTopicContainer(CCSXHDocument &aDocument, CCSXHHtmlTopicView *aView);
/** 
 * @function ~CCSXHHtmlTopicContainer
 * @since S60 3.2
 * Destroy the object and release all memory objects
 */
  ~CCSXHHtmlTopicContainer();
  
/** 
 * @function SetAndLoadInitialTopicL
 * @since S60 3.2
 * Destroy the object and release all memory objects
 * @param aTopic - Initial Topic to be displayed 
 */  
 void SetAndLoadInitialTopicL(CCSXHHtmlTOC2* aTopic);
     
public:  
/**
* From MBrCtlSoftkeysObserver class
*  Browser plug-in calls this method requests to update a softkey 
*  @function UpdateSoftkeyL    
*  @since S60 3.2
*  @Param aKeySoftkey	- Update the left softkey or the right softkey  
*		 aLabel			- The label associated with the softkey update  
*		 aCommandId		- The command to use if the softkey is selected by the user  
*		 aBrCtlSoftkeyChangeReason - The reason for the softkey change  
*/
void UpdateSoftkeyL(TBrCtlKeySoftkey aKeySoftkey,
                                    const TDesC& aLabel,
                                    TUint32 aCommandId,
                                    TBrCtlSoftkeyChangeReason aBrCtlSoftkeyChangeReason);

/**
* From MBrCtlLayoutObserver Class
*  Browser plug-in calls this method to Update the position of vertical scrollbar
*  @function UpdateBrowserVScrollBarL
*  @since S60 3.2    
*  @Param  aDocumentHeight - The total height of the markup page  
* 		   aDisplayHeight  - The height of the display  
* 		   aDisplayPosY    - The current Y position  
*/                                    
 void UpdateBrowserVScrollBarL(TInt aDocumentHeight, 
                                              TInt aDisplayHeight,
                                              TInt aDisplayPosY ) ;
                                              
/**
* From MBrCtlLayoutObserver Class
*  Browser plug-in calls this method to Update the position of horizontal scrollbar
*  @function UpdateBrowserHScrollBarL
*  @since S60 3.2    
*  @Param  aDocumentWidth - The total width of the markup page  
* 		   aDisplayWidth  - The width of the display  
* 		   aDisplayPosX    - The current X position  
*/                                              
void UpdateBrowserHScrollBarL(TInt aDocumentWidth, 
                                              TInt aDisplayWidth,
                                              TInt aDisplayPosX );
                                              
/**
* From MBrCtlLayoutObserver Class
*  Browser plug-in calls this method to Inform the layout of the page: right to left or left to right
*  @function NotifyLayoutChange    
*  @since S60 3.2
*  @Param  aNewLayout - RTL or LTR 
*/                                              
void NotifyLayoutChange( TBrCtlLayout aNewLayout );
  
/**
* From MBrCtlLayoutObserver Class
*  Browser plug-in calls this method to Inform the layout of the page: right to left or left to right
*  @function UpdateTitleL
*  @since S60 3.2    
*  @Param  aTitle - Title of the page 
*/        
void UpdateTitleL( const TDesC& aTitle );                                   

public:  // from CCoeControl
/** 
*  From CoeControl class
*  @function SizeChanged
*  @since S60 3.2
*  re-allocates and re-sizes components.
*/
	void SizeChanged();
/** 
*  From CoeControl class
*  @function CountComponentControls
*  @since S60 3.2
*  @return Number of child controls this has.  
*/	
	TInt CountComponentControls() const;

/** 
*  From CoeControl class
*  @function ComponentControl
*  @since S60 3.2
* @param aIndex index of child controls
* @retrun pointer to child control
*/	
	CCoeControl* ComponentControl(TInt aIndex) const;
/** 
*  From CoeControl class
*  @function OfferKeyEventL
*  @since S60 3.2
*  Progress Key Event
*  @param aKeyEvent the key event
*  @param aType EEventKey | EEventKeyUp | EEventKeyDown
*  @return EKeyWasConsumed if key event is processed,
*         otherwise EKeyWasNotConsumed
*/
	TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);

/** 
*  From MBrCtlLoadEventObserver class
*  @function HandleBrowserLoadEventL
*  @since S60 3.2
*  A load events notification
*  @param aLoadEvent - The load event  
*  		  aSize  	 - Size depends on the event  
*  		  aTransactionId  - The transaction id of the transaction that had this event  
*/	
	void HandleBrowserLoadEventL(TBrCtlDefs::TBrCtlLoadEvent aLoadEvent, 
								TUint aSize, TUint16 aTransactionId);

/** 
*  @function RefreshL
*  @since S60 3.2
*  Used to Refresh the Content
*  @param aTopic - CCSXHHtmlTOC2 Object  
*/	
	void RefreshL(CCSXHHtmlTOC2 *aTopic);
	
/** 
*  @function HandleBackKeyL
*  Handle Back Key
*  @since S60 3.2
*  @return ETrue, if the key is handled in the container, EFalse otherwise 
*/ 
	TBool HandleBackKeyL();

/** 
*  @function IsPrevHtmlPageAvblL
*  Check for Existance of the page in the Browser history stack
*  @since S60 3.2
*  @return ETrue, if page is available in Browser History Stack, EFalse otherwise 
*/ 
	TBool IsPrevHtmlPageAvblL();

/** 
*  @function SetSelectedFontSizeL
*  Sets BrowserFontsize
*  @since S60 3.2
*  @param aValue - Fontsize Value
*/	
	void SetSelectedFontSizeL(TInt aValue);
	
/** 
*  @function SetSelectedFontSizeL
*  Get Current Settings Value
*  @since S60 3.2
*  @param aValue - Any Setting 
*  @return Current Value used by Browser
*/	
	TInt GetCurrentValueL(TInt aSetting);

/** 
*  @function HandleCommandBackL
*  @since S60 3.2
*  Handles resource changes.
*  pass OpenLink command to the browser HandlecommandL 
*/
	void HandleCommandOpenHyperLinkL();

/** 
*  From CoeControl class
*  @function Draw
*  @since S60 3.2
*  Draw() for drawing the Background
*/
    void Draw(const TRect& aRect) const;
  
  	void ShowIndexHtmlPageL() const;
/** 
*  @function HandleResourceChange
*  @since S60 3.2
*  Handles resource changes.
*  This function is called by framework when when e.g skin or locale is changed.
*  @param aType resource change type
*/    	
   	void HandleResourceChange(TInt aType);

/** 
*  @function HandleResourceChangeImpl
*  @since S60 3.2
*  Handles resource changes.
*  Implementation function for resource change
*  @param aType resource change type
*/    	
    	void HandleResourceChangeImpl(TInt aType);

/** 
*  @function HandleCommandBackL
*  @since S60 3.2
*  Handles resource changes.
*  pass Back command to the browser HandlecommandL 
*/   	
	void HandleCommandBackL();
	
/**
* Browser plug-in calls this method when embedded link is found. Used with ECapabilityClientResolveEmbeddedURL
* @since 3.2
* @param aEmbeddedUrl The url of the embedded content
* @param aCurrentUrl The url of the current page
* @param aLoadContentType The expected type of the embedded content
* @param aEmbeddedLinkContent a callback interface to return the embedded content
* @return EFalse, browser will resolve the link
*/
    TBool ResolveEmbeddedLinkL(const TDesC& aEmbeddedUrl,
    		                               const TDesC& aCurrentUrl,
        	                               TBrCtlLoadContentType aLoadContentType, 
        	                               MBrCtlLinkContent& aEmbeddedLinkContent); 
		
/**
* Browser plug-in calls this method when the user requests to load content via selecting a link, or any other way. Used with ECapabilityClientNotifyURL 
* @since 3.2
* @param aUrl The requested url
* @param aCurrentUrl The url of the current page
* @param aBrCtlLinkContent a callback interface to return the embedded content
* @return EFalse, browser will resolve the link
*/
        TBool ResolveLinkL(const TDesC& aUrl, const TDesC& aCurrentUrl,
                                   MBrCtlLinkContent& aBrCtlLinkContent);

/**
* @function CancelFetchL
* Cancel all outstanding resolving operations
*/
        void CancelFetchL();
/**
* @function CancelAll
* Cancel all outstanding resolving operations
* @since 3.2
*/
        void CancelAll();
        
        
/**
* @function HandleResolveComplete
* @since 3.2	
* Resolver calls this method when content is resolved.
* @param aContentType The content type of the response
* @param aCharset The charset of the response. May be empty in case of image
* @param aContentBuf content data. Ownership is not transfered
* @return void
*/
        void HandleResolveComplete(const TDesC& aContentType,
                                           const TDesC& aCharset,
                                           const HBufC8* aContentBuf);

/**
* @function HandleResolveError
* @since 3.2
* This method is called if there is some error while resolving the content
* @param aError system wide error code.
*/
        void HandleResolveError(TInt aError);
/** 
*  @function CheckForMSK
*  @since S60 3.2
*  Checks Msk flag is Enabled or not, If Enabled, Sets MSK Label
*/      
		void CheckForMSK();
/** 
*  @function IsPrevPageAvbl
*  Check wether focus is on Hyperlink or not
*  @since S60 3.2
*  @return ETrue, if Focus is on Hyperlink , EFalse otherwise 
*/		
		TBool IsHyperLinkFocused();	
/** 
*  @function IsPrevPageAvbl
*  Check for Existance of the page
*  @since S60 3.2
*  @return ETrue, if page is available , EFalse otherwise 
*/		
	 	TBool IsPrevPageAvbl();
	 	
/** 
*  @function ClearHistoryL
*  Clear Browser history stack
*  @since S60 3.2
*/	 	
 		void  ClearHistoryL(); 
 		
/** 
*  @function GetCurrActiveObject
*  Get the Current Active Object 
*  @since S60 3.2
*  @return CCSXHHelpContentBase Pointer, 
*/ 		
 		CCSXHHelpContentBase* GetCurrActiveObject();

private:
 		
/**
* The state type of browser content.
* @see SetContentLoadState() and NeedRefresh.
*/
    enum TContentLoadState
        {
        ENoContent,
        EContentLoading,
        EContentLoadFinished
        };

/**
*  @function ConstructL
*  @since S60 3.2
*  @Perform the second phase construction of a HtmlTopicContainer object
*  @param aRect the rectangle this view will be drawn to
 */
    void ConstructL( const TRect& aRect );

/** 
*  @function LoadHtmlL
*  loads HTML page in the Browser
*  @since S60 3.2
*/
	void LoadHtmlL();

/** 
*  @function CheckForExternalLinkL
*  Check for external Hyperlink, if yes launch browserNG
*  @since S60 3.2
*  @return ETrue, if external hyperlink available, EFalse otherwise 
*/	
	TBool CheckForExternalLinkL(const TDesC& aUrl);
	
/**
* @function SetContentLoadingState
* Set the state of content loading and refresh the UI id needed
*/
    void SetContentLoadState( const TContentLoadState aLoadState );
        
/**
* @function NeedRefresh
* Judge whether we need to refresh the browser control
*/
    TBool NeedRefresh( const TContentLoadState aNewLoadState ) const;
    
/**
 * @function HideBrowser
 */    
    void HideBrowser();
    
/**
 * * @function ShowBrowser
 */
    void ShowBrowser();
    
/*
 *  @function SetTopAndBottomContainer
 *  To set top and Bottom container of browser and blank container
 */
    void SetTopAndBottomContainer( CCoeControl* aTopControl, 
            CCoeControl* aBottomControl );

private:
	CBrCtlInterface* iBrCtrl;    
	CCSXHHtmlTOC2* iTopic;
	CCSXHDocument& iDocument;
    CCSXHHelpContentBase *iNewTopic;
    
    //Check the impln comments in HandleBrowserLoadEventL function
    TBuf<KMaxFileName> iUrlNoAnchors; 
    
    CCSXHHtmlTopicView* iView;    
    AppLauncherForCSXH* iAppLauncher;
    RLibrary iBrLibrary;
    RFeatureControl iFeatureControl;
    TBool iLoadHtml;    
    TInt32 iPrevPageCount;
    TBool iBack;
    
    TContentLoadState iContentLoading;
    
    // used to hide browser control if needed.
    CCoeControl*    iBlankContainer;
    
    // Used to determine whether hide browser control or not.
    CCoeControl*    iTopControl;
    CCoeControl*    iBottomControl;
    
	};


#endif