// EIKHLBM.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#if !defined(__EIKHLBM_H__)
#define __EIKHLBM_H__

#if !defined(__EIKLBM_H__)
#include <eiklbm.h>
#endif

#if !defined(__BAMDESCA_H__)
#include <bamdesca.h>
#endif

class CHierListItem : public CBase
	{
public:
	enum TFlags
		{
		EExpanded			=0x01,
		EHasFurtherSibling	=0x02
		};
public:
	IMPORT_C CHierListItem(TInt16 aFlags);
	IMPORT_C ~CHierListItem();
	IMPORT_C void SetTextL(const TDesC& aText);
	inline TDesC* Text() const;
	inline void SetLevel(TInt16 aLevel);
	inline TInt Level() const;
	inline void SetParent(CHierListItem* aParent);
	inline CHierListItem* Parent() const;
	inline void SetExpanded();
	inline void SetCollapsed();
	inline TBool IsExpanded() const;
	inline void SetHasFurtherSibling();
	inline void SetHasNoFurtherSibling();
	inline TBool HasFurtherSibling() const;
private:
	HBufC* iText;
	CHierListItem* iParent;
	TInt16 iLevel;
	TInt16 iFlags;
	};

const TInt KEikHierListInsertAsFirstSibling=-2;

class CHierarchicalListBoxModel : public CBase, public MListBoxModel, public MDesCArray
	{
public:
	IMPORT_C ~CHierarchicalListBoxModel();
	IMPORT_C void ConstructL();
	virtual void ExpandItemL(TInt aNodeToBeExpanded) = 0;
	IMPORT_C void CollapseItem(TInt aNodeToBeCollapsed);
	IMPORT_C void ExpandAllItemsL();
	IMPORT_C void CollapseAllItems();
	IMPORT_C CHierListItem* Item(TInt aIndex) const;
	IMPORT_C TPtrC ItemText(TInt aItemIndex) const;
	inline CArrayFix<CHierListItem*>* HierListArray() const;
	IMPORT_C void AddItemL(CHierListItem* aListItem,TInt aParentIndex,TInt aIndexOfSiblingToInsertAfter=-1);
	IMPORT_C void RemoveItem(TInt aItemIndex);
	IMPORT_C void RemoveAllItems();
	IMPORT_C TInt FirstChildIndex(TInt aItemIndex) const;
	IMPORT_C TInt NextSiblingIndex(TInt aItemIndex) const;
	IMPORT_C TInt PreviousSiblingIndex(TInt aItemIndex) const;
	IMPORT_C TInt ParentIndex(TInt aItemIndex) const;
	IMPORT_C void GetChildrenIndexesL(TInt aItemIndex,CArrayFix<TInt>* aChildren) const;
	IMPORT_C void Reset();
public: // from MListBoxModel
	IMPORT_C TInt NumberOfItems() const;
	IMPORT_C const MDesCArray* MatchableTextArray() const;
protected:
	IMPORT_C CHierarchicalListBoxModel();
private: // from MDesCArray
	IMPORT_C TInt MdcaCount() const;
	IMPORT_C TPtrC MdcaPoint(TInt aIndex) const;
protected:
	CArrayFix<CHierListItem*>* iHierListArray;
	};

inline TDesC* CHierListItem::Text() const
	{ return (iText); }
inline TInt CHierListItem::Level() const
	{ return (iLevel); }
inline CHierListItem* CHierListItem::Parent() const
	{ return (iParent); }
inline void CHierListItem::SetLevel(TInt16 aLevel)
	{ iLevel=aLevel; }
inline void CHierListItem::SetParent(CHierListItem* aParent)
	{ iParent=aParent; }
inline void CHierListItem::SetExpanded()
	{ iFlags|=EExpanded; }
inline void CHierListItem::SetCollapsed()
	{ iFlags&=~EExpanded; }
inline TBool CHierListItem::IsExpanded() const
	{ return iFlags&EExpanded; }
inline void CHierListItem::SetHasFurtherSibling()
	{ iFlags|=EHasFurtherSibling; }
inline void CHierListItem::SetHasNoFurtherSibling()
	{ iFlags&=~EHasFurtherSibling; }
inline TBool CHierListItem::HasFurtherSibling() const
	{ return iFlags&EHasFurtherSibling; }

inline CArrayFix<CHierListItem*>* CHierarchicalListBoxModel::HierListArray() const
	{ return iHierListArray; }

#endif
