#ifndef __UserTree_h__
#define __UserTree_h__

#include "BGDNet.h"

typedef BGDNet::SharePtr<BGDNet::NDSObject> NDSObjectPtr;

// Класс "Узел дерева NDS"
class CUserTreeNode
{
public:

  CUserTreeNode( void );
  ~CUserTreeNode( void );

  void setObject( BGDNet::NDSObject* pObj, int iconId );
  // Устанавливает объект и кэширует необходимые атрибуты.

  void addChild( CUserTreeNode* pChild );
  // Добавляет дочерний узел.

  const BGDNet::NDSObject* obj( void ) const;
  // Возвращает указатель на объект в узле.

  const CString& fullName( void ) const;
  // Возвращает ссылку на полное имя пользователя.

  const CString& dn( void ) const;
  // Возвращает ссылку на DN.

  int icon( void ) const;
  // Возвращает идентификатор иконки.

  const BGDNet::String& baseClass( void ) const;
  // Возвращает ссылку на базовый класс объекта.

  int childCount( void ) const;
  // Возвращает количество дочерних узлов.

  const CUserTreeNode* child( int n ) const;
  // Возвращает указатель на дочерний узел.

private:

  NDSObjectPtr m_pObject; // указатель на объект NDS
  CString m_fullName; // полное имя объекта (с фамилией для пользователя)
  CString m_dn; // DN
  BGDNet::String m_baseClass; // базовый класс
  BGDNet::Collection<CUserTreeNode*> m_children; // дочерние элемененты
  int m_iconId; // Идентификатор иконки
};

inline
const BGDNet::NDSObject* CUserTreeNode::obj( void ) const
{
  return m_pObject;
}

inline
const CString& CUserTreeNode::fullName( void ) const
{
  return m_fullName;
}

inline
const CString& CUserTreeNode::dn( void ) const
{
  return m_dn;
}

inline
int CUserTreeNode::icon( void ) const
{
  return m_iconId;
}

inline
const BGDNet::String& CUserTreeNode::baseClass( void ) const
{
  return m_baseClass;
}

inline
int CUserTreeNode::childCount( void ) const
{
  return m_children.size();
}

inline
const CUserTreeNode* CUserTreeNode::child( int n ) const
{
  return m_children[n];
}

// Класс "Дерево пользователей".
class CUserTree
{
public:
  
  explicit CUserTree( const BGDNet::Context& ctx );
  // Строит дерево пользователей.

  ~CUserTree( void );

  const CUserTreeNode* Root( void ) const;
  // Возвращает указатель на корень дерева.

private:

  bool InsertUsers( CUserTreeNode* pParent );
  // Добавляет пользователей в узел. Возвращает true, если пользователи
  // были добавлены и false, если контейнер не содержит пользователей.

  CUserTreeNode* m_pRoot;
  // Указатель на корень дерева.

  const BGDNet::Context& m_ctx;
};

inline
const CUserTreeNode* CUserTree::Root( void ) const
{
  return m_pRoot;
}

#endif //__UserTree_h__
