// WEBBKMK.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#if !defined(__WEBBKMK_H__)
#define __WEBBKMK_H__

#if !defined(__F32FILE_H__)
#include <f32file.h>
#endif
#if !defined(__S32STD_H__)
#include <s32std.h>
#endif
#if !defined(__BADESCA_H__)
#include <badesca.h>
#endif

class MDesCArray;
class CStreamStore;
class CBookmarkFolder;
class CClipboard;
class CDirectFileStore;


class CWebFsMonitor : public CActive
	{
public:
	~CWebFsMonitor();
	static CWebFsMonitor* NewL(RFs& aFs, const TCallBack& aCallBack);
	void Start();
private:
	CWebFsMonitor(RFs& aFs,const TCallBack& aCallBack);
	static TInt TimerCallBack(TAny* aObject);
	void DoStart();
	void DoCancel();
	void RunL();
private:
	RFs& iFs;
	TCallBack iCallBack;
	CPeriodic* iFsTimer;
	TBool iFsHasChanged;
	};



class MBkmkModelObserver 
	{
public:
	virtual void HandleBkMkModelChangedL()=0;
	IMPORT_C virtual void MBkmkModelObserver_Reserved1();
	IMPORT_C virtual void MBkmkModelObserver_Reserved2();
	};



class CBookmarkModel : public CBase, public MDesCArray
	{
	friend class CBookmarkControl;
public:

		enum TBookmarkFindType
		{
		EFindInTitle=1,
		EFindInUrl=2,
		EFindInFolder=4
		};


	IMPORT_C ~CBookmarkModel();
	IMPORT_C void CommitBookmarkFileL();

	IMPORT_C void SetCurrentFolder(TInt aFolderIndex);	// no effect if !(0<=aFolderIndex<num folders)
	IMPORT_C void SetDefaultFolder(TInt aFolderIndex); 	// no effect if !(0<=aFolderIndex<num folders)
	IMPORT_C TInt CurrentFolder() const;
	IMPORT_C TInt DefaultFolder() const;

	IMPORT_C void AddBookmarkL(const TDesC& aName,const TDesC& aUrl,TInt aBookmarkNumber=-1); // uses aUrl as aName if aName is empty;  aUrl must _not_ be empty
		// adds bookmark after aBookmarkNumber (defaults to adding in first position)
	IMPORT_C void DeleteBookmark(TInt aBookmarkNumber);
	IMPORT_C void RenameBookmarkL(TInt aBookmarkNumber,const TDesC& aNewName);
	IMPORT_C void ChangeBookmarkUrlL(TInt aBookmarkNumber,const TDesC& aNewUrl);

	IMPORT_C void CutBookmarkL(TInt aBookmarkNumber);
	IMPORT_C void CutBookmarkL(const TArray<TInt>& aBookmarkSelection);
	IMPORT_C void CopyBookmarkL(TInt aBookmarkNumber) const;
	IMPORT_C void CopyBookmarkL(const TArray<TInt>& aBookmarkSelection) const;
	IMPORT_C TBool PasteBookmarkL(TInt aBookmarkNumber); // pastes after aBookmarkNumber (may be -1)

	IMPORT_C TPtrC GetBookmarkName(TInt aBookmarkNumber) const;
	IMPORT_C TPtrC GetBookmarkUrl(TInt aBookmarkNumber) const;

	IMPORT_C void AddSiblingFolderL(const TDesC& aFolderToCreate); // adds a new folder as a sibling of the current folder, unless current is root when folder is added as a child
	IMPORT_C void AddChildFolderL(const TDesC& aFolderToCreate); // adds a new folder as a child of the current folder
	IMPORT_C TBool IsFolderEmpty() const;
	IMPORT_C TBool IsOnlyFolders() const;
	IMPORT_C void DeleteFolder(); // will reset current folder to the root (also the default folder, if deleted)
	IMPORT_C void RenameFolderL(const TDesC& aNewName);

	IMPORT_C void CutFolderL(); // will reset current folder to the root (also the default folder, if deleted)
	IMPORT_C void CopyFolderL() const;
	IMPORT_C TBool PasteFolderAsSiblingL(); // pastes as a sibling of the current folder, unless current is root when folder is pasted as achild
	IMPORT_C TBool PasteFolderAsChildL(); // pastes as a child of the current folder
	IMPORT_C void SaveFolderAsHtmlL(const TDesC& aFilename,const TDesC& aTitle) const;

	IMPORT_C TPtrC GetFolderName(TInt aFolderNumber) const;

	IMPORT_C MDesCArray* GetListOfBookmarksL();
	IMPORT_C MDesCArray* GetListOfAllFoldersL();

	IMPORT_C void SetFolderExpanded(TInt aFolderIndex, TBool aExpanded);
	IMPORT_C TBool IsFolderExpanded(TInt aFolderIndex) const;
	IMPORT_C TInt ParentFolderIndex(TInt aFolderNumber) const;
	
	IMPORT_C void Find(const TDesC& aText, TInt& aFoundBookmarkIndex,TInt& aFoundFolderIndex, TBookmarkFindType aFindType,
						TBool aSearchSubFoldersFirst,TInt aStartingFolder, TInt aStartingBookmark);
	
	IMPORT_C void UpdateFromFileL();
	static TInt FsNotifyCallBack(TAny* aObject);
	
	// from MDesCArray
	IMPORT_C virtual TInt MdcaCount() const;
	IMPORT_C virtual TPtrC MdcaPoint(TInt aIndex) const;

private:
	static CBookmarkModel* NewL(RFs& aFileSystem,const TDesC& aFilename, TBool aReadOnly, MBkmkModelObserver* aObserver);
	CBookmarkModel(RFs& aFileSystem,const TDesC& aFilename, TBool aReadOnly, MBkmkModelObserver* aObserver);
	void ConstructL();
	void CreateNewFileL();
	TStreamId StoreL(CStreamStore& aStore) const;
	void RestoreL(CStreamStore& aStore,TStreamId aStreamId);
	void RestoreOrDeleteL(CDirectFileStore& aStore,TStreamId aStreamId);
	void DoCutCopyBookmarkL(TInt aBookmarkNumber,TBool aDeleteBookmark) const;
	void DoCutCopyBookmarkL(const TArray<TInt>& aBookmarkSelection,TBool aDeleteBookmark) const;
	void DoCopyFolderL() const;
	TBool DoPasteFolderL(TBool aPasteAsSibling);
	CClipboard* GetClipboardForReadingLC(RFs& aFs);
	void CommitToFileStoreL(CDirectFileStore* aDirectFileStore);
private:
	RFs& iFileSystem;
	const TDesC& iFilename;
	TBool iReadOnly;
	RFile iBookmarkFile;
	CBookmarkFolder* iFolderStructure;
	TInt iCurrentFolder;	// initialised to the root folder (0)
	TInt iDefaultFolder;	// initialised to the root folder unless persisted
	CDesCArrayFlat* iBookmarkNameArray;
	CDesCArrayFlat* iFolderNameArray;
	CWebFsMonitor* iFsMonitor;
	TTime iBkmkFileModified;
	MBkmkModelObserver* iBkmkModelObserver;
	__DECLARE_TEST;
	};

#endif
