// WEBCON.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

// Web Page control
//

#if !defined(__WEBCON_H__)
#define __WEBCON_H__

#if !defined(__EIKEDWIN_H__)
#include <eikedwin.h>
#endif

#if !defined(__WEBMOD_H__)
#include <webmod.h>
#endif

#if !defined(__EIKLBO_H__)
#include <EIKLBO.H> 
#endif

#if !defined(__WEBDEF_H__)
#include <webdef.h> // for logging
#endif

// other constants
const TInt KWebFramesLbxRelativeSize=2000;
const TInt KWebBusyMsgDelay = 500000;


enum TWebCntPanic 
	{
	EWebCntNullPointer,
	EWebCntInvalidSize,
	EWebCntNoPageName,
	EWebCntListBoxAlreadyExists,
	EWebCntSameFrameViewMode,
	EWebCntFrameIdOutOfRange,
	EWebCntNoListArray,
	EWebCntNoCurrentFrameToView,
	EWebCntNoCurrentFocusFrame,
	EWebCntTooManyFrameReplacements,
	EWebCntIllegalFrameViewMode,
	EWebCntCorruptFrameTree,
	EWebCntUnexpectedExistingPage,
	EWebBadNumberOfSplitterBars
	};

GLREF_C void Panic(TWebCntPanic aPanic);

//
// class MWebControlObserver
//
// observer class of the page control

class CWebControl;
class CWebPageControl;
class MWebControlObserver
	{
	public:
		enum TWebPageObserverMessage
			{
			ELoadImage,
			ELinkSelected,
			ELoadPage
			};
	// GT frame ids may be necessary for application ststus messages, depending on the implementation
	virtual	void HandleWebPageControlEventL(const MWebEventHandler::TEventOutput& aOutput,TWebPageObserverMessage aMessage)=0;
	virtual void HandleWebModelChangeL(TInt aFrameID, const TWebModelMessage& aMessage) = 0;
	virtual void HandleWebModelStatusL(TInt aFrameID, const TWebModelMessage& aMessage) = 0;
	virtual void HandleWebModelErrorL(TInt aFrameID, const TWebModelMessage& aMessage) = 0;
	virtual TBool HandleWebModelAuthenticationL(TDes& aName, TDes& aPassword, TInt aFrameID) = 0;
	virtual TBool HandleWebModelRequestL(TInt aFrameID, 
			MWebModelObserver::TWebEngineRequestType aRequestType, 
			const TWebModelMessage& aMessage, TWebModelRequestReturn& aReturn) = 0;
	virtual void HandleWebPageTitleChangedL() = 0;
	virtual void HandleWebModelMessageL(TInt aFrameID, MWebModelObserver::TWebEngineMessageType aMessageType,
										const TWebModelMessage& aMessage) =0;
	IMPORT_C virtual void MWebControlObserver_Reserved1();
	IMPORT_C virtual void MWebControlObserver_Reserved2();
	};


//
// class CWebControl
//
// container class for the frames

typedef CArrayFixFlat<TInt> CFrameIdArray;
class CWebFramesListBox;
class CWebDummyPageControl;
class CWebSplitterBar;
class MWebPage;
class CWebProxyWatcher;
class CFrameReplacementList;

class CWebControl: public CCoeControl,public MWebModelObserver,public MEikListBoxObserver
	{
public:
	enum TFrameViewMode
		{
		EFullFrames,
		EFramesList,
		ENoFramesWithList,
		ENoFrames
		};
	enum 	
		{ 
		EFramesListBox, 
		ECurrentListBoxFrame, 
		EListBoxSplitterBar 
		};
	IMPORT_C CWebControl();
	IMPORT_C ~CWebControl();
	IMPORT_C void ConstructL(CCoeControl* aParent,MWebControlObserver* aControlObserver,
								TZoomFactor* aZoomFactor, TInt aMaxHistory=0);
	IMPORT_C void SetScrollBarVisibilityL(CEikScrollBarFrame::TScrollBarVisibility aHorizVis,
								CEikScrollBarFrame::TScrollBarVisibility aVertVis);
	IMPORT_C void GetScrollBarVisibility(CEikScrollBarFrame::TScrollBarVisibility& aHorizVis, 
								CEikScrollBarFrame::TScrollBarVisibility& aVertVis);
	IMPORT_C void SetHorizontalScrollBarL();
	IMPORT_C void SetFrameViewModeL(TFrameViewMode aFrameMode);
	IMPORT_C TFrameViewMode FrameViewMode() const;
	IMPORT_C CWebModel* Model() const;
	IMPORT_C TBool RestoreL(CDictionaryStore* aIniFile);
	IMPORT_C void VerifyConfigL();
	IMPORT_C void StoreL(CDictionaryStore* aIniFile) const;
	IMPORT_C TInt FrameId() const; // to give accesss the frame ids to UI
	IMPORT_C TInt CurrentTopFrameId() const; // root frame id of displayed page
	IMPORT_C TInt NewTopFrameId() const; // Top frame id of loading page
	IMPORT_C TPtrC FrameUrl() const;
	IMPORT_C TBool IsFramesPage() const;
	IMPORT_C TInt ApplyDisplayMode(TDisplayMode aMode) const;
	IMPORT_C void RemoveCurrentFocus();

	// Page and frame management interface
	IMPORT_C void OpenNewTopPageL(const TDesC& aUrlName, TBool aForceReload=EFalse);
	IMPORT_C void ReplaceSubFrameL(const TDesC& aUrlName, TInt aSubFrameId, TBool aForceReload=EFalse);
	IMPORT_C TBool IsFrameTopLevel(TInt aFrameId) const;

	// frames ID iteration functions
	IMPORT_C TInt FirstDisplayedFrameId(TInt& aFrameId) const;		// returns KErrNone/KErrNotFound
	IMPORT_C TInt NextDisplayedFrameId(TInt& aFrameId) const;		// returns KErrNone/KErrNotFound
	
	// public functions called by CWebPageControl's
	void HandleWebPageControlEventL(MWebPage* aPage,MWebEventHandler::TEventOutput aOutput,
									MWebControlObserver::TWebPageObserverMessage aMessage); 
	void HandleWebPageControlEventL(MWebPage* aPage); 
	void StartDragging(CWebSplitterBar* aSplitterBar);

	// from CCoeControl
	TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
private:
	// from CoeControl
	TInt CountComponentControls() const;
    CCoeControl* ComponentControl(TInt aIndex) const;
	void SizeChangedL();
	void HandlePointerEventL(const TPointerEvent& aPointerEvent);
	void FocusChanged(TDrawNow aDrawNow);
	// from MWebModelObserver
	void HandleWebModelMessageL(TInt aFrameID, MWebModelObserver::TWebEngineMessageType aMessageType,
										const TWebModelMessage& aMessage);
	TBool HandleWebModelRequestL(TInt aFrameID, MWebModelObserver::TWebEngineRequestType aRequestType, 
							const TWebModelMessage& aMessage, TWebModelRequestReturn& aReturn);
	TBool HandleWebModelAuthenticationL(TDes& aName,TDes& aPassword, TInt aFrameID);
	// new
	void HandleWebModelChangeL(TInt aFrameID, const TWebModelMessage& aMessage);
	// from MEikListBoxObserver
	void HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType);
	// New
	void DoSetFocusL(MWebPage* aPage);
	void HandleTabKeyL(const TKeyEvent& aKeyEvent);	
	void SetFramePropertiesL(CEikScrollBarFrame::TScrollBarVisibility aHorizVis, 
							 CEikScrollBarFrame::TScrollBarVisibility aVertVis,
							 TBool aHasBorder,TBool aDoSetFocus);
	TInt FrameId(TInt aIndex) const;
	TInt Index(TInt aFrameId) const;
	TInt NumPages() const;
	void RestoreDefaultsL();
	void ExternalizeL(RWriteStream& aStream) const;
	void InternalizeL(RReadStream& aStream);
		// creating and destroying real/dummy pages from lists
	void CreateNewWebPageL(TInt aFrameId);					
	void CreateNewDummyWebPageL(TInt aFrameId);
	void SetPage(TInt aFrameId,MWebPage* aFrame);
	void RemovePage(TInt aFrameId);	
	void ReplaceTemporaryDummyPageL(TInt aFrameId, MWebPage* aNewFrame);
	void RemoveTemporaryDummyPage(TInt aFrameId);	
	void RemovePageCommon(TInt aFrameId, TBool aRemoveFrame);
	void CreateDummyFrameControlsL(TInt aFrameSetId);
	void DisplayNewPagesL();
	void RemoveUnwantedPages();
	void ClearReplacedPage(TInt aFrameId);
	void UpdateTreeInHistoryListL();
		// sizes of various controls
	TRect ListViewFrameRect();
	TRect ListViewListRect();
	TRect ListViewSplitterRect();
	TRect FrameRect(TInt aFrameId);	
	TRect FrameSize(TInt aFrameId);
	TMargins8 FrameMargins(TInt aFrameId);	
	TBool FrameHasBorder(TInt aFrameId);	
	TRect FrameRectInSet(CFrameIdArray* aFrameSet, TInt aCols, TInt aFrameId, TRect aParentRect);
		// assessor functions
	MWebPage* Page(TInt aFrameId) const;					// currently displayed pages 
	MWebPage* CurrentSelectedPage() const;					// currently focussed page
	CWebPageControl* WebPage(TInt aFrameId) const;
	CWebPageControl* WebPage(MWebPage* aFrame) const;
	CWebPageControl* CurrentWebPage() const;
	CWebPageControl* CurrentListBoxFrameWebPage() const;
	CWebDummyPageControl* DummyWebPage(TInt aFrameId) const;
	CCoeControl* CurrentListBoxFrameControl() const;
	CCoeControl* CurrentPageControl() const;
	CCoeControl* PageControl(TInt aFrameId) const;
	CCoeControl* PageControl(MWebPage* aPage) const;
		// alternative frames views
	void SetUpListViewL();
	void SetUpFullFrameViewL();
	void SetUpFramesL();
	void SetUpNoFramesL();
	void SetUpNoFramesWithListL();
	void SetUpListViewSizesAndVisibilityL();
	void PopulateFramesListBoxArrayL();
	TPtrC FrameName(TInt aFrameId);
	void SetDefaultFrameForViewing();
	TInt BiggestFrame();
	void CreateListBoxL();
	TPtrC LeafOfUrl(const TDesC& aUrl);
	void HandlePotentialListItemChangeL();
	void DeleteListView();
		// splitter bars
	void CreateSplitterBarL(const TRect& aRect,TInt aParentId,TInt aFirstFrameId=-1,TInt aSecondFrameId=-1);
	void ReformatSplitterBarL(const TRect& aRect,TInt aParentId,TInt aFirstFrameId,TInt aSecondFrameId);
	void DoSplitterBarsL(TInt aParentId,TBool aCreate=ETrue);
	void DoAllSplitterBarsL(TInt aId,TBool aCreate=ETrue);
	void RemoveSplitterBarAttachedTo(TInt aFrameId);
	void RemoveSplitterBars(TInt aParentId);
	void RemoveAllSplitterBars();
	TBool SplitterBarExists(TInt aParentId, TInt aFirstId, TInt aSecondId);
	void StopDragging();
	void DoFrameListSplitterBarDragL(const TPoint& aNewPosition);
	void DoFullFramesSplitterBarDragL(const TPoint& aNewPosition);
#if defined(_DEBUG)
	TInt ExpectedNumberOfSplitterBars(TInt aFrameId);
#endif
		// Frame replacement
	void AddFrameReplacementL(TInt aOldFrameId, TInt aNewFrameId);

	void RemoveFrame(TInt aFrameId);

	TBool ClosePagesAfterInitialDummyPage();
	void SetClosePagesAfterInitialDummyPage(TBool aNewVal);
	TBool PageReceivedSinceReplaceEvent();
	void SetPageReceivedSinceReplaceEvent(TBool aNewVal);
	void AddPageControlResourceFileL();

private:
	CWebModel* iModel;
	MWebControlObserver* iWebPageObserver;
	TZoomFactor* iZoom;
	CArrayFixFlat<CWebSplitterBar*>* iSplitterBars;
	CWebSplitterBar* iDraggedSplitterBar;
	// settings
	CEikScrollBarFrame::TScrollBarVisibility iHorizVis;
	CEikScrollBarFrame::TScrollBarVisibility iVertVis;
	TFrameViewMode iFrameViewMode;
	// frames list view
	CWebFramesListBox* iFramesListBox;
	MWebPage* iCurrentListBoxFrame;				// currently displayed frame in frames list mode
	CDesCArrayFlat* iFramesList;				// list of all the frame names
	TInt iListBoxWidth;
	// pages
	MWebPage* iCurrentPage[KWebModelMaxFrames];	// currently displayed pages 
	TInt iCurrentTopFrameId;
	TInt iNewTopFrameId;
	MWebPage* iCurrentSelectedPage;				// currently focussed page
	TUint32 iFlags;
	CWebProxyWatcher* iProxyWatcher;
	CFrameReplacementList* iReplacementList;

	__DECLARE_LOG;
	};



#endif
