symhelp/helpmodel/inc/HLPMODEL.H
changeset 0 1f04cf54edd8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symhelp/helpmodel/inc/HLPMODEL.H	Tue Jan 26 15:15:23 2010 +0200
@@ -0,0 +1,594 @@
+// Copyright (c) 1999-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:
+//
+// Description:
+//
+
+#ifndef __HLPMODEL_H
+#define __HLPMODEL_H
+
+// System includes
+#include <e32std.h>
+#include <badesca.h>	// For MDesCArray
+#include <txtmrtsr.h>	// For MRichTextStoreResolver
+#include <gdi.h>		// For MPictureFactory
+#include <d32dbms.h>
+// Help model includes
+#include "hlpconstants.h"
+
+// Classes referenced
+class CRichText;
+class CHlpDatabase;
+class CHlpFileEntry;
+class CHlpSQLSearch;
+class TCoeHelpContext;
+class CParaFormatLayer;
+class CCharFormatLayer;
+class CHlpPicture;
+
+// Typedefs
+/**
+@publishedAll
+@released
+*/
+typedef CArrayPtrFlat<CHlpDatabase> CHlpDatabases;
+
+/**
+@publishedAll
+@released
+*/
+typedef CArrayPtrFlat<CHlpFileEntry> CHlpFileList;
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+/** Maximum Title column. 
+@publishedAll
+@released
+*/
+const TInt KMaxTitleColumn = 120;
+#endif
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+/**
+@internalComponent
+@released
+*/
+const TInt KHlpModelDefaultNumberOfImagesForV6Point2Files = 1;
+/**
+@internalComponent
+@released
+*/
+const TInt KHlpModelMaximumNumberOfImagesForV6Point2Files = 3;
+//
+/** Default zoom factor for small zoom size. 
+@internalComponent
+@released
+*/
+const TInt KHlpModelZoomFactorSmall = 750;
+/** Default zoom factor for medium zoom size. 
+@internalComponent
+@released
+*/
+const TInt KHlpModelZoomFactorMedium = 1000;
+/** Default zoom factor for large zoom size. 
+@internalComponent
+@released
+*/
+const TInt KHlpModelZoomFactorLarge = 1250;
+
+/** Default zoom factor for medium zoom size as real number. 
+@internalComponent
+@released
+*/
+const TReal KHlpModelDefaultZoomFactorAsRealNumber = 1000.0;
+
+#endif //SYMBIAN_ENABLE_SPLIT_HEADERS
+
+class MHlpModelObserver
+/** Client callback inteface to receive events from the help model. 
+@publishedAll
+@released
+*/
+	{
+public:
+	/** Receives a help model event.
+	
+	@param aEvent Help model event. Events are listed in the enums that begin 
+	ECategoryListAvailable, and ENoRecordsFound. */
+	virtual void HandleModelEventL(TInt aEvent) = 0;
+	};
+
+
+class MHlpDbObserver
+/** Internal API to handle events reported by the search engine
+@publishedAll
+@released
+*/
+	{
+public: // TInt aEvent should be a named enum
+	virtual void HandleDbEventL(TInt aEvent) = 0;
+	};
+
+//
+// Search types (these should be named, but SC cannot be broken until v7.0
+//
+/** Defines the search types for use with CHlpModel::SearchL(). 
+@publishedAll
+@released
+*/
+enum
+	{
+	/** Gets a list of index entries for all help files.
+
+	Success is indicated by an EIndexListAvailable event; failure by EIndexListNoneFound. 
+	The list can be retrieved using CHlpModel::LoadListL(). */
+	EIndexList,
+	/** Gets a list of categories for all help files.
+
+	Success is indicated by an ECategoryListAvailable event; failure by ECategoryListNoneFound. 
+	The list can be retrieved using CHlpModel::CategoryListL(). */
+	ECategoryList,
+	/** Gets a list of topics for a specified category.
+
+	Success is indicated by an ETopicListAvailable event; failure by ETopicListNoneFound. 
+	The list can be retrieved using CHlpModel::LoadListL(). */
+	ETopicListForCategory,
+	/** Gets a list of topics for a specified category UID.
+
+	Success is indicated by an ETopicListAvailable event; failure by ETopicListNoneFound. 
+	The list can be retrieved using CHlpModel::LoadListL(). */
+	ETopicListForCategoryUID,
+	/** Searches for a topic with the specified help context.
+
+	A successful search generates an ETopicAvailable event. The topic can then be retrieved 
+	using CHlpModel::LoadTopicL(). An unsuccessful search generates an ETopicNotFound event. */
+	EContextSearch,
+	/** Searches for index entries for the specified help item.
+
+	A successful search generates an ETopicListAvailable event. The list can then be retrieved 
+	using CHlpModel::LoadListL(). An unsuccessful search generates an ETopicListNoneFound event. */
+	EIndexSearch,
+	/** Searches the topic titles for the specified text.
+
+	A successful search generates an ESearchListAvailable event. The list can then be 
+	retrieved using CHlpModel::LoadListL(). An unsuccessful search generates an 
+	ESearchListNoneFound event. */
+	EQuickSearch,
+	/** Searches the full text of topics for the specified text.
+
+	A successful search generates an ESearchListAvailable event. The list can then be 
+	retrieved using CHlpModel::LoadListL(). An unsuccessful search generates an 
+	ESearchListNoneFound event. */
+	EFullTextSearch,
+	/** Searches for a topic with the specified ID.
+
+	A successful search generates an ETopicAvailable event. The topic can then be 
+	retrieved using CHlpModel::LoadTopicL(). An unsuccessful search generates an 
+	ETopicNotFound event. */
+	ETopicIdSearch
+	};
+
+//
+// Search progress responses (this should be scoped as members of MHlpModelObserver
+// and should also be named, but SC cannot be broken until v7.0
+//
+/** Search progress responses
+@publishedAll
+@released
+*/
+enum
+	{
+	ENoRecordsFound,
+	ESearchInProgress,
+	ESearchComplete
+	};
+
+//
+// Search progress responses (ditto for naming and scoping)
+//
+/** Help model search result events
+@publishedAll
+@released
+*/
+enum
+	{
+	/** The search returned a category list.
+
+	The list can be retrieved using CHlpModel::CategoryListL(). */
+	ECategoryListAvailable,	
+	/** The search did not return a category list. */
+	ECategoryListNoneFound,
+	/** The search returned a results list.
+
+	The list can be retrieved using CHlpModel::LoadListL(). */
+	ESearchListAvailable,
+	/** The search did not return a results list. */
+	ESearchListNoneFound,
+	/** The search returned a topic list.
+
+	The list can be retrieved using CHlpModel::LoadListL(). */
+	ETopicListAvailable,		// Category expansion
+	/** The search did not return a topic list. */
+	ETopicListNoneFound,
+	/** The search returned an index item list.
+
+	The list can be retrieved using CHlpModel::LoadListL(). */
+	EIndexListAvailable,
+	/** The search did not return an index item list. */
+	EIndexListNoneFound,
+	/** The search returned a topic list from an index phrase search.
+
+	The list can be retrieved using CHlpModel::LoadListL(). */
+	EIndexSearchListAvailable,
+	/** The search did not return a topic list from an index phrase search. */
+	EIndexSearchListNoneFound,
+	/** The search returned a topic.
+
+	The topic can be retrieved using CHlpModel::LoadTopicL(). */
+	ETopicAvailable,
+	/** The search did not return a topic. */
+	ETopicNotFound,
+	/** The search is in progress. */
+	EModelSearchInProgress,
+	/** The search has been cancelled. */
+	EHlpSearchCancelled
+	};
+	
+	// Constants
+
+/** Defines help model zoom sizes. 
+@publishedAll
+@released
+*/
+enum THlpZoomState
+	{
+	/** Small zoom. */
+	EHlpZoomStateSmall = 0,
+	/** Medium zoom. */
+	EHlpZoomStateMedium = 1,
+	/** Large zoom. */
+	EHlpZoomStateLarge = 2
+	};
+
+
+class CHlpItem : public CBase
+/** Encapsulates an individual item in a help file.
+
+Note that item IDs are assigned in increasing numerical order by the help 
+compiler and are not unique. Categories and help files are however specified 
+by UID, and so are unique. 
+@publishedAll
+@released
+*/
+	{
+public:
+	static CHlpItem* NewL(const TDesC& aTitle, TUint32 aId, TUid aCategoryId, TUid aHelpFileUid);
+	static CHlpItem* NewLC(const TDesC& aTitle, TUint32 aId, TUid aCategoryId, TUid aHelpFileUid);
+	static CHlpItem* NewLC(const TDesC& aTitle, TUint32 aId, TUid aHelpFileUid);
+	IMPORT_C ~CHlpItem();
+
+public: // Access
+	inline TUid CategoryUid() const 
+	/** Gets the item's category ID.
+	
+	@return Category ID */
+		{ return iCategoryUid; }
+	inline TUid HelpFileUid() const 
+	/** Gets the item's help file UID.
+	
+	@return Help file UID */
+		{ return iHelpFileUid; }
+	inline TUint32 Id() const 
+	/** Gets the item's ID.
+	
+	@return Item's ID */
+		{ return iId; }
+	inline const TDesC& Title() const 
+	/** Gets the item's title.
+	
+	@return Item's title */
+		{ return *iTitle; }
+
+public: // These should not be public, but I can't break SC (these were inherited from
+		// the previous author.
+	/** Item's title */
+	HBufC* iTitle;
+	/** Item's ID */
+	TUint32 iId;
+
+private:
+	friend class CHlpList; // Needed for searching
+	CHlpItem(TUint32 aId);
+	CHlpItem(TUint32 aId, TUid aHelpFileUid);
+	CHlpItem(TUint32 aId, TUid aCategoryId, TUid aHelpFileUid);
+	void ConstructL(const TDesC& aTitle);
+
+private: // Meta data required for correct restoration of topics
+	TUid iCategoryUid;
+	TUid iHelpFileUid;
+	};
+
+
+
+//
+// ----> MHlpTitleArray 
+//
+class MHlpTitleArray : public MDesCArray
+/** Interface to get a topic ID from an array index. 
+@publishedAll
+@released
+*/
+	{
+public:
+	/** Gets a topic ID for the specified index.
+	
+	@param aIndex Index of item to get
+	@return Topic ID */
+	virtual TUint32 At(TInt aIndex) const = 0;
+	};
+
+
+
+//
+// ----> CHlpList 
+//
+class CHlpList : public CBase, public MHlpTitleArray
+/** A list of help items (CHlpItem objects). 
+@publishedAll
+@released
+*/
+	{
+public: // Static construct / destruct
+	IMPORT_C static CHlpList* NewL();
+	IMPORT_C static CHlpList* NewLC();
+	IMPORT_C ~CHlpList();
+
+public: // From MDesCArray
+	IMPORT_C TInt MdcaCount() const;
+	IMPORT_C TPtrC MdcaPoint(TInt aIndex) const;
+
+public:
+	// 'At' returns topic Id, but this function is next to useless because you can't
+	// uniquely identify a help topic by topic id alone. You need to know 3 things:-
+	// a) topic id, 2) category id, 3) help file uid. This information is all
+	// encapsulated in CHlpItem so help app authors should use 'Item' instead.
+	IMPORT_C TUint32 At(TInt aIndex) const;
+	IMPORT_C CHlpItem* Item(TInt aIndex) const;
+	IMPORT_C TInt Find(TUint32 aId);
+	IMPORT_C void Reset();
+	IMPORT_C void AppendL(CHlpItem* aItem);
+
+private: // 2nd phase constructor
+	void ConstructL();
+
+private:
+	// This is the array of help items that were located as a result of
+	// performing a search.
+	CArrayPtr<CHlpItem>* iList;
+	};
+
+
+
+//
+// ----> CHlpTopic 
+//
+class CHlpTopic : public CBase
+/** Encapsulates a help topic.
+
+A help topic has text, a title, a category, and paragraph and character formatting. 
+@publishedAll
+@released
+*/
+	{
+public:
+	IMPORT_C static CHlpTopic* NewL();
+	IMPORT_C static CHlpTopic* NewLC();
+	IMPORT_C ~CHlpTopic();
+
+public: 
+	// This function will not behave as expected in the case where it is used to 
+	// restore rich text that includes pictures. Instead, only the text and markup
+	// will be restored. Help App authors should use 'CHlpModel::LoadTopic' instead.
+	// I can't remove this as it would break S&BC.
+	IMPORT_C void RestoreL(RDbView* aView);
+	
+	IMPORT_C CRichText* TopicText();
+	IMPORT_C TDesC& TopicTitle();
+	IMPORT_C TDesC& Category();
+
+	inline CParaFormatLayer* ParaFormatLayer() const 
+	/** Gets the topic paragraph formatting.
+	
+	@return Topic paragraph formatting */
+		{ return iGlobalParaFormatLayer; }
+	inline CCharFormatLayer* CharFormatLayer() const 
+	/** Gets the topic character formatting.
+	
+	@return Topic character formatting */
+		{ return iGlobalCharFormatLayer; }
+
+private:
+	void ConstructL();
+
+private:
+	friend class CHlpModel;
+
+	TUint32 iTopicId;
+	TBuf<KMaxTitleColumn> iTopicTitle;
+	TBuf<KMaxTitleColumn> iCategory;
+
+	CRichText* iTopicText;
+	CParaFormatLayer* iGlobalParaFormatLayer;  
+	CCharFormatLayer* iGlobalCharFormatLayer; 
+	};
+
+
+
+
+//
+// ----> CHlpModel 
+//
+class CHlpModel : public CBase, public MHlpDbObserver, public MPictureFactory, public MRichTextStoreResolver
+/** Help model interface.
+
+It provides functions to search help files in various ways.
+
+The interface implements MHlpDbObserver for help database events, and MRichTextStoreResolver 
+and MPictureFactory to obtain pictures from rich text stores. 
+@publishedAll
+@released
+*/
+	{
+public: // Construct / destruct
+	IMPORT_C static CHlpModel* NewL(RFs& aFs, MHlpModelObserver* aObserver);
+	IMPORT_C static CHlpModel* NewLC(RFs& aFs, MHlpModelObserver* aObserver);
+	IMPORT_C ~CHlpModel();
+
+public:	// Opens all the help files in \System\Help
+	IMPORT_C void OpenL();
+	IMPORT_C void CloseL();
+
+public: // Opens specific help files
+	IMPORT_C void OpenFileL(const TDesC& aFileName);
+	IMPORT_C void CloseFileL(const TDesC& aFileName);
+
+public: // Specialized searching
+	IMPORT_C void ContextSearchL(TCoeHelpContext& aContext);
+	IMPORT_C void CategoryUIDSearchL(TUid aCategoryUID);
+	IMPORT_C void TopicSearchL(const CHlpItem& aHelpItem);
+	IMPORT_C void IndexSearchL(const CHlpItem& aHelpItem);
+
+		// Generic searching
+	IMPORT_C void SearchL(TInt aType, TUint32 aId);
+	IMPORT_C void SearchL(TInt aType, HBufC* aCriterion=NULL);
+	IMPORT_C void SearchL(TInt aType, const TDesC& aCriterion);
+
+public: // Cancel EFullTextSearch types - will return KErrArgument if not the correct type
+	IMPORT_C TInt CancelSearch();
+
+public: // Assumes that the search has already been performed and that the view is valid
+	IMPORT_C void LoadTopicL(CRichText& aRichText, TDes& aTitle);
+	IMPORT_C void LoadTopicL(CRichText& aRichText);
+	IMPORT_C void LoadTopicL(CHlpTopic* aTopic);
+	IMPORT_C void LoadListL(CHlpList* aList);
+	IMPORT_C void CategoryListL(CDesCArray* aList);
+
+public:	
+	IMPORT_C void SetZoomSizeL(THlpZoomState aState = EHlpZoomStateMedium);
+	IMPORT_C THlpZoomState ZoomSize() const;
+	IMPORT_C void SetZoomFactors(THlpZoomState aZoomState, TInt aFactor);
+	TInt CurrentZoomFactor() const;
+	void RemoveHelpPicture(CHlpPicture* aHelpPicture);
+
+public: // FROM MPictureFactory
+	void NewPictureL(TPictureHeader& aHdr, const CStreamStore& aDeferredPictureStore) const;
+
+public: // FROM MRichTextStoreResolver
+	IMPORT_C const CStreamStore& StreamStoreL(TInt aPos) const;
+
+public:
+	// Check to see if any of the databases have matching meta data
+	IMPORT_C TInt MatchUidL(TUid aUid);
+
+	// Replace the current observer with another
+	IMPORT_C void SetObserver(MHlpModelObserver* aObserver);
+
+public:
+	void NotifyHelpModelDestructionToPictures();
+
+private: // Internal search API
+	void DoSearchL(TInt aType, const TDesC& aCriterion);
+	void DoNextSearchL();
+	void ResetReadyForSearch();
+	void ResetViews();
+	void SetCriterionL(const TDesC& aCriterion);
+
+private: // Event management
+	void HandleDbEventL(TInt aEvent);
+	void ReportEventToObserverL(TInt aEvent);
+
+private: // Misc internal functions
+	inline CHlpDatabase* CurrentDatabase() const;
+	inline TInt DatabaseCount() const;
+	inline void SetSearchType(TInt aSearchType);
+	inline TInt CurrentSearchType() const;
+	RDbView* CurrentView() const;
+	TBool DiskPresent(TInt aDrive) const;
+	CHlpFileList* BuildListForDriveLC(TDriveUnit aDrive, RFs& aFsSession) const;
+	static void ResetAndDestroyArrayOfCHlpFileEntry(TAny* aObject);
+
+private:
+	CHlpModel(RFs& aFs, MHlpModelObserver& aObserver);
+	void ConstructL();
+
+private: // Member data
+	RFs& iFsSession;
+	
+	// This is required in order to restore rich text pictures from the database
+	CStreamStore* iCurrentRichTextStore;
+	
+	// Creates our SQL string based upon the search type and criteria
+	CHlpSQLSearch* iSearch;
+
+	// An array of all the help files currently available
+	CHlpDatabases* iDatabases;
+
+	// Receives help model notifications as various actions are performed
+	MHlpModelObserver* iObserver;
+
+	// Were any matching results found for this search
+	TBool iFound;
+
+	// What was being searched for
+	HBufC* iCriterion;
+
+	// What type of search was being performed
+	TInt iSearchType;
+
+	// Which database are we currently searching
+	TInt iCurrentDb;
+
+	// Transient category Uid used when creating category lists
+	TUid iTransientCategoryUid;
+
+	// What zoom size is used
+	THlpZoomState iZoomSize;
+
+	// Array to hold the bitmaps that are currently used in the help rich text
+	CArrayPtr<CHlpPicture>* iPictures;
+
+	// Array to hold the zoom factors that correspond to each zoom size
+	CArrayFix<TInt>* iZoomFactors;
+	};
+
+//
+// ----> CHlpModel (inlines)
+//
+inline TInt CHlpModel::DatabaseCount() const
+	{
+	return iDatabases->Count();
+	}
+inline void CHlpModel::SetSearchType(TInt aSearchType)
+	{
+	iSearchType = aSearchType;
+	}
+inline CHlpDatabase* CHlpModel::CurrentDatabase() const
+	{
+	return iDatabases->At(iCurrentDb);
+	}
+inline TInt CHlpModel::CurrentSearchType() const
+	{
+	return iSearchType;
+	}
+
+
+
+#endif
+