Click here to Skip to main content
15,892,737 members
Articles / Programming Languages / C#

HtmlHelp library and example viewer

Rate me:
Please Sign up or sign in to vote.
4.90/5 (65 votes)
11 Aug 2004CPOL26 min read 477.7K   15.5K   231  
A class library for reading compiled HTML help (chm) files and a sample viewer application using this library.
using System;
using System.Collections;
using System.IO;

using HtmlHelp.ChmDecoding;

namespace HtmlHelp
{
	/// <summary>
	/// The class <c>Category</c> implements methods/properties for handling an information category
	/// </summary>
	/// <remarks>Note: Information types and categories allow users to filter help contents. 
	/// They are only supported if using sitemap TOC and/or sitemap Index.</remarks>
	public class Category
	{
		private string _name = "";
		private string _description = "";
		private ArrayList _infoTypes = null;
		private int _referenceCount = 1;

		/// <summary>
		/// Standard constructor
		/// </summary>
		public Category() : this("","")
		{
		}

		/// <summary>
		/// Standard constructor
		/// </summary>
		/// <param name="name">name of the category</param>
		/// <param name="description">description</param>
		public Category(string name, string description) : this(name, description, new ArrayList())
		{
		}
		/// <summary>
		/// Standard constructor
		/// </summary>
		/// <param name="name">name of the category</param>
		/// <param name="description">description</param>
		/// <param name="linkedInformationTypes">Arraylist of InformationType instances which applies to this category</param>
		public Category(string name, string description, ArrayList linkedInformationTypes)
		{
			_name = name;
			_description = description;
			_infoTypes = linkedInformationTypes;
		}

		#region Data dumping
		/// <summary>
		/// Dump the class data to a binary writer
		/// </summary>
		/// <param name="writer">writer to write the data</param>
		internal void Dump(ref BinaryWriter writer)
		{
			writer.Write( _name );
			writer.Write( _description );

			writer.Write( _infoTypes.Count );

			for(int i=0; i<_infoTypes.Count;i++)
			{
				InformationType curType = _infoTypes[i] as InformationType;
				writer.Write( curType.Name );
			}
				
		}

		/// <summary>
		/// Reads the object data from a dump store
		/// </summary>
		/// <param name="reader">reader to read the data</param>
		/// <param name="chmFile">current CHMFile instance which reads from dump</param>
		internal void ReadDump(ref BinaryReader reader, CHMFile chmFile)
		{
			_name = reader.ReadString();
			_description = reader.ReadString();

			int nCnt = reader.ReadInt32();

			for(int i=0; i<nCnt; i++)
			{
				string sITName = reader.ReadString();

				InformationType linkedType = chmFile.GetInformationType( sITName );

				if(linkedType != null)
				{
					linkedType.SetCategoryFlag(true);
					_infoTypes.Add(linkedType);
				}
			}
		}
		#endregion

		/// <summary>
		/// Merges the lineked information types from cat into this instance
		/// </summary>
		/// <param name="cat">category instance</param>
		internal void MergeInfoTypes(Category cat)
		{
			if(cat!=null)
			{
				if(cat.InformationTypes.Count > 0)
				{
					for(int i=0;i<cat.InformationTypes.Count;i++)
					{
						InformationType curType = cat.InformationTypes[i] as InformationType;

						if(!ContainsInformationType(curType.Name))
						{
							curType.SetCategoryFlag(true);
							_infoTypes.Add(curType);
						}
					}
				}
			}
		}

		/// <summary>
		/// Gets/Sets the reference count of this information type instance
		/// </summary>
		internal int ReferenceCount
		{
			get { return _referenceCount; }
			set { _referenceCount = value; }
		}

		/// <summary>
		/// Gets/Sets the name of the information type
		/// </summary>
		public string Name
		{
			get { return _name; }
			set { _name = value; }
		}

		/// <summary>
		/// Gets/Sets the description of the information type
		/// </summary>
		public string Description
		{
			get { return _description; }
			set { _name = value; }
		}

		/// <summary>
		/// Gets an ArrayList with the linked Information types
		/// </summary>
		public ArrayList InformationTypes
		{
			get { return _infoTypes; }
		}

		/// <summary>
		/// Adds a new information type to the category
		/// </summary>
		/// <param name="type"></param>
		public void AddInformationType(InformationType type)
		{
			_infoTypes.Add(type);
		}

		/// <summary>
		/// Removes an information type from the category
		/// </summary>
		/// <param name="type"></param>
		public void RemoveInformationType(InformationType type)
		{
			_infoTypes.Remove(type);
		}

		/// <summary>
		/// Checks if the category contains an information type
		/// </summary>
		/// <param name="type">information type instance to check</param>
		/// <returns>Return true if the information type is part of this category</returns>
		public bool ContainsInformationType(InformationType type)
		{
			return _infoTypes.Contains(type);
		}

		/// <summary>
		/// Checks if the category contains an information type
		/// </summary>
		/// <param name="name">name of the information type</param>
		/// <returns>Return true if the information type is part of this category</returns>
		public bool ContainsInformationType(string name)
		{
			for(int i=0;i<_infoTypes.Count;i++)
			{
				InformationType curType = _infoTypes[i] as InformationType;

				if(curType.Name == name)
					return true;
			}

			return false;
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
Austria Austria
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions