text: /**********************************************************************/
  /**                       Microsoft Windows NT                       **/
  /**                Copyright(c) Microsoft Corp., 1991                **/
  /**********************************************************************/
  
  /*
      FILE HISTORY:
          kevinl      12-Oct-1991     Created
          kevinl      05-Nov-1991     Code Review changes attended by:
                                          DavidHov, Keithmo, o-simop
          Yi-HsinS    09-Nov-1992	    Added AbandonAllChildren() and
  				    DeleteChildren()
  
  */
  
  
  #ifndef _HIERLB_HXX_
  #define _HIERLB_HXX_
  
  
  DLL_CLASS HIER_LBI;                 // declared below
  DLL_CLASS HIER_LBI_ITERATOR;        // declared below
  DLL_CLASS HIER_LISTBOX;             // declared below
  DLL_CLASS LBITREE;                  // declared below
  
  
  /*************************************************************************
  
      NAME:       HIER_LBI
  
      SYNOPSIS:   Listbox item for HIER_LISTBOX
  
      PARENT:     LBI
  
      HISTORY:
          kevinl      12-Oct-1991 created
          beng        29-Jun-1992 Outlined SetDestroyable (dll delta)
  
  **************************************************************************/
  
  DLL_CLASS HIER_LBI : public LBI
  {
  friend class LBITREE;
  friend class HIER_LISTBOX;
  friend class HIER_LBI_ITERATOR;
  
  private:
      HIER_LBI * _phlbiParent;
      HIER_LBI * _phlbiChild;
      HIER_LBI * _phlbiLeft;
      HIER_LBI * _phlbiRight;
  
      static BOOL _fDestroyable;
  
      BOOL _fShowChildren;
  
      UINT _dDescendants;
      UINT _dIndentPels;
  
      VOID AdjustDescendantCount( INT iAdjustment );
      VOID Adopt( HIER_LBI * phlbi, BOOL fSort );
  
      // Get rid of all children under this node
      VOID AbandonAllChildren( VOID );
      VOID Abandon();
  
      INT QueryLBIndex();
  
      VOID SetIndentLevel();
  
      UINT QueryDescendants()
          { return _dDescendants; }
  
      BOOL IsParent( HIER_LBI * phlbiParent );
  
      static VOID SetDestroyable( BOOL f );
  
      virtual BOOL IsDestroyable();
  
  public:
      HIER_LBI( BOOL fExpanded = FALSE );
      ~HIER_LBI();
  
      VOID SetExpanded( BOOL f = TRUE )
          { _fShowChildren = f; }
  
      BOOL QueryExpanded() const
          { return _fShowChildren; }
  
      virtual VOID SetPelIndent( UINT ui );
  
      BOOL HasChildren()
          { return ( _phlbiChild != NULL ); }
  
      INT QueryPelIndent() const
          { return _dIndentPels; }
  
      INT QueryIndentLevel( VOID );
  };
  
  
  /*************************************************************************
  
      NAME:       HIER_LBI_ITERATOR
  
      SYNOPSIS:  Iterator for HIER_LBI
  
      HISTORY:
          kevinl    12-Oct-1991 created
  
  **************************************************************************/
  
  DLL_CLASS HIER_LBI_ITERATOR
  {
  private:
      HIER_LBI * _phlbiStart;
      HIER_LBI * _phlbiEnd;
  
  public:
      HIER_LBI_ITERATOR( HIER_LBI * phlbi, BOOL fChildIterator = FALSE );
      ~HIER_LBI_ITERATOR();
  
      HIER_LBI * operator()();
  };
  
  
  /*************************************************************************
  
      NAME:       LBITREE
  
      SYNOPSIS:   Class that is used by HIER_LISTBOX to anchor the shadow LBI's
  
      PARENT:     BASE
  
      HISTORY:
          kevinl    12-Oct-1991 created
  
  **************************************************************************/
  
  DLL_CLASS LBITREE : public BASE
  {
  private:
      HIER_LBI _hlbiRoot;
  
  public:
      LBITREE();
      ~LBITREE();
  
      INT AddNode( HIER_LBI * phlbiParent, HIER_LBI * phlbiChild, BOOL fSort );
  };
  
  
  /*************************************************************************
  
      NAME:       HIER_LISTBOX
  
      SYNOPSIS:   Listbox with outline-manipulation support
  
      PARENT:     BLT_LISTBOX
  
      HISTORY:
          kevinl      12-Oct-1991 created
          beng        22-Apr-1992 Elided classname arg to ctor
  
  **************************************************************************/
  
  DLL_CLASS HIER_LISTBOX : public BLT_LISTBOX
  {
  private:
      BOOL _fMultSel;
      BOOL _fSort;
      LBITREE _lbit;
  
      INT ExpandChildren( INT dIndex, HIER_LBI * phlbi );
  
  protected:
      virtual APIERR AddChildren( HIER_LBI * phlbi );
      virtual VOID RefreshChildren( HIER_LBI * phlbi );
  
  public:
      HIER_LISTBOX( OWNER_WINDOW * powin, CID cid,
                   BOOL fReadOnly = FALSE,
                   enum FontType font = FONT_DEFAULT,
                   BOOL fSort = FALSE );
      HIER_LISTBOX( OWNER_WINDOW * powin, CID cid,
                   XYPOINT xy, XYDIMENSION dxy,
                   ULONG flStyle,
                   BOOL fReadOnly = FALSE,
                   enum FontType font = FONT_DEFAULT,
                   BOOL fSort = FALSE );
  
      ~HIER_LISTBOX();
  
      INT AddItem( HIER_LBI * phlbi,
                   HIER_LBI * phlbiParent = NULL,
                   BOOL fSaveSelection = TRUE );
  
      void HIER_LISTBOX::AddSortedItems( HIER_LBI * * pphlbi,
                                         INT          cItems,
                                         HIER_LBI *   phlbiParent = NULL,
                                         BOOL         fSaveSelection = TRUE ) ;
  
      INT DeleteItem( INT i, BOOL fSaveSelection = TRUE );
  
      APIERR ExpandItem( INT i );
      APIERR ExpandItem( HIER_LBI * phlbi );
  
      VOID CollapseItem( INT i, BOOL fInvalidate = TRUE );
      VOID CollapseItem( HIER_LBI * phlbi, BOOL fInvalidate = TRUE );
  
      // Delete all the children of the given HIER_LBI
      VOID DeleteChildren( HIER_LBI * phlbi );
  
      VOID OnDoubleClick( HIER_LBI * phlbi );
  
      void SetSortFlag( BOOL fSort = TRUE )
          { _fSort = fSort ; }
  };
  
  
  #endif  // _HIERLB_HXX_
  