/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Netscape Public License
 * Version 1.0 (the "NPL"); you may not use this file except in
 * compliance with the NPL.  You may obtain a copy of the NPL at
 * http://www.mozilla.org/NPL/
 *
 * Software distributed under the NPL is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
 * for the specific language governing rights and limitations under the
 * NPL.
 *
 * The Initial Developer of this code under the NPL is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
 * Reserved.
 */

//		This file contains the declarations of the various Bookmark Quick
//		File classes.


#if	!defined(__QUICKFIL_H__)
#define	__QUICKFIL_H__

#ifndef	__AFXWIN_H__
	#error include 'stdafx.h' before including this	file for PCH
#endif

/****************************************************************************
*
*	Class: CTreeItemList
*
*	DESCRIPTION:
*		This is a collection class for holding CTreeItem objects.
*
****************************************************************************/

class CTreeItem;
#define CTreeItemListBase	CPtrArray

class CTreeItemList : public CTreeItemListBase
{
	public:
		CTreeItemList();
		virtual ~CTreeItemList();
		
		int Add(CTreeItem * pItem)
		{
			return(CTreeItemListBase::Add(pItem));
		}
		CTreeItem * Get(int nIndex) const
		{
			return((CTreeItem *)GetAt(nIndex));
		}
		
	protected:

	private:

}; // END OF CLASS CTreeItemList()


/****************************************************************************
*
*	Class: CTreeItem
*
*	DESCRIPTION:
*		This class provides an abstract object for representing an item
*		within a hierarchical tree.
*
****************************************************************************/

class CTreeItem
{
	public:
		CTreeItem(CBitmap * pUnselectedImg, CBitmap *pSelectedImg, const UINT uID, const CString & strLabel,
				  CMenu *pSubMenu = NULL);
		virtual ~CTreeItem();
		
		CTreeItemList * GetSubItems()
		{
			return(&m_SubItems);
		}

		CMenu * GetSubMenu(void)
		{
			return(m_pSubMenu);
		}

		CBitmap * GetUnselectedImage() const
		{
			return (m_pUnselectedImg);
		}

		CBitmap * GetSelectedImage() const
		{
			return(m_pSelectedImg);
		}
		const UINT GetID() const
		{
			return(m_uID);
		}

		const CString & GetLabel() const
		{
			return(m_strLabel);
		}
		
		void SetUnselectedBitmapSize(CSize size)
		{
			m_unselectedBitmapSize = size;
		}

		CSize GetUnselectedBitmapSize(void)
		{
			return m_unselectedBitmapSize;
		}

		void SetSelectedBitmapSize(CSize size)
		{
			m_selectedBitmapSize = size;
		}

		CSize GetSelectedBitmapSize(void)
		{
			return m_selectedBitmapSize;
		}

		void SetTextSize(CSize size)
		{
			m_textSize = size;
		}

		CSize GetTextSize(void)
		{
			return m_textSize;
		}

		void SetAcceleratorSize(CSize size)
		{
			m_accelSize = size;
		}

		CSize GetAcceleratorSize(void)
		{
			return m_accelSize;
		}

	// Aurora improvements to handle custom icons and arbitrary URLs.
		void	   SetIcon(void* pIcon, IconType iconType) { m_pCustomIcon = pIcon; m_nIconType = iconType; }
		HICON	   GetLocalFileIcon() { return (HICON)m_pCustomIcon; }
		NSNavCenterImage* GetCustomIcon() { return (NSNavCenterImage*)m_pCustomIcon; }
		IconType GetIconType() { return m_nIconType; }

	protected:
		CBitmap * m_pUnselectedImg;	// Image to be displayed for this item when unselected
		CBitmap * m_pSelectedImg;   // Image to be displayed for this item when selected
		UINT m_uID;			// Unique item identifier
		CString m_strLabel;	// Text label for this item
		
		CSize m_unselectedBitmapSize; // The size of the unselected bitmap
		CSize m_selectedBitmapSize;   // The size of the selected bitmap
		CSize m_textSize;	// The size of the text in the font when this is calculated
		CSize m_accelSize;	// The size of the accelerator in the font when this is calculated
		CTreeItemList m_SubItems;	// List of items subordinate to this one
		CMenu *m_pSubMenu;

		void* m_pCustomIcon;
		IconType m_nIconType;

	private:

}; // END OF CLASS CTreeItem()


/****************************************************************************
*
*	Class: CTreeMenu
*
*	DESCRIPTION:
*		This class provides a custom, owner draw menu object for displaying
*		graphics as well as text in a menu item. A group of these objects
*		can be used to construct a hierarchical list.
*
****************************************************************************/

#define CTreeMenuBase	CMenu

class CTreeMenu : public CTreeMenuBase, public CCustomImageObject
{
	public:
		CTreeMenu();
		~CTreeMenu();

		BOOL AddItem(CTreeItem * pItem, int nPosition = 0, CTreeMenu *pSubMenu = NULL, void* pCustomIcon = NULL, IconType m_nIconType = BUILTIN_BITMAP);
		BOOL Create()
		{
			return(CreatePopupMenu());
		}
		void ClearItems(int start, int fromEnd);
		void CalculateItemDimensions(void);
		CMenu * FindMenu(CString& menuName);
		// if nCommand is 0, then the mnemonic is for a submenu
		void AddMnemonic(TCHAR cMnemonic, UINT nCommand, int nPosition);
		// if nCommand is 0 then mnemonic is for a submenu
		// it returns FALSE if there is no mnemonic
		BOOL GetMnemonic(TCHAR cMnemonic, UINT &nCommand, int &nPosition);
		void SetParent(CWnd *pParent) { m_pParent = pParent;}

		virtual void LoadComplete(HT_Resource r) {}

	protected:
		virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMI);
		virtual void DrawItem(LPDRAWITEMSTRUCT lpDI);
		virtual CSize DrawImage(CDC * pDC, const CRect & rect, CTreeItem * pItem, BOOL bIsSelected);
		virtual void DeleteMnemonics(void);

	private:
		int m_WidestImage;
		int m_WidestText;
		int m_WidestAccelerator;
		CTreeItemList m_itemList;
		CMapWordToPtr m_mnemonicMap;
		CWnd *m_pParent;
	private:
		CSize MeasureBitmap(CBitmap *pBitmap);
		CSize MeasureText(CString text);


}; // END OF CLASS CTreeMenu()


/****************************************************************************
*
*	Class: CPopupTree
*
*	DESCRIPTION:
*		This class represents a hierarchical popup menu object that can be
*		used for selecting from a list of sub-categorized items.
*
****************************************************************************/

class CPopupTree
{
	public:
		CPopupTree(CTreeItemList * pItems);
		virtual ~CPopupTree();
		
		BOOL Activate(int nX, int nY, CWnd * pParent);
		 
	protected:
		void BuildMenu(CTreeMenu * pMenu, CTreeItemList * pItems);
		
		CTreeItemList * m_pTree;	// Contains entire tree of abstract item
									// objects. The menu is constructed from
									// this.
		
	private:
		CObArray m_GarbageList;		// Used for garbage collection, since we
									// dynamically allocate stuff within a
									// recursive function.

									
}; // END OF CLASS CPopupTree()


#endif // __QUICKFIL_H__
