//////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2000-2002 Microsoft Corporation
//
//  Module Name:
//      TaskTreeView.h
//
//  Maintained By:
//      David Potter    (DavidP)    27-MAR-2001
//      Geoffrey Pease  (GPease)    22-MAY-2000
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

class CAnalyzePage;
class CCommitPage;

//////////////////////////////////////////////////////////////////////////////
//  Type Definitions
//////////////////////////////////////////////////////////////////////////////

//
//  This structure is on the lParam of all tree view items.
//
typedef struct STreeItemLParamData
{
    // Data collected from SendStatusReport.
    CLSID       clsidMajorTaskId;
    CLSID       clsidMinorTaskId;
    BSTR        bstrNodeName;
    ULONG       nMin;
    ULONG       nMax;
    ULONG       nCurrent;
    HRESULT     hr;
    BSTR        bstrDescription;
    FILETIME    ftTime;
    BSTR        bstrReference;

    // Data not collected from SendStatusReport.
    BOOL        fParentToAllNodeTasks;
    BSTR        bstrNodeNameWithoutDomain;
} STreeItemLParamData, * PSTreeItemLParamData;

typedef enum ETaskStatus
{
    tsUNKNOWN = 0,
    tsPENDING,      // E_PENDING
    tsDONE,         // S_OK
    tsWARNING,      // S_FALSE
    tsFAILED,       // FAILED( hr )
    tsMAX
} ETaskStatus;

//////////////////////////////////////////////////////////////////////////////
//++
//
//  class CTaskTreeView
//
//  Description:
//      Handles the tree view control that displays tasks.
//
//--
//////////////////////////////////////////////////////////////////////////////
class CTaskTreeView
{
friend class CAnalyzePage;
friend class CCommitPage;

private: // data
    HWND        m_hwndParent;
    HWND        m_hwndTV;
    HWND        m_hwndProg;
    HWND        m_hwndStatus;
    HIMAGELIST  m_hImgList;                 //  Image list of icons for tree view
    ULONG       m_nRangeHigh;               //  Progress bar high range
    ULONG       m_nInitialTickCount;        //  Initial count passed in via constructor
    ULONG       m_nCurrentPos;              //  Remember the current position
    BOOL        m_fThresholdBroken;         //  Has the initial count threshold been broken?
    ULONG       m_nRealPos;                 //  Real position on the progress bar.
    HTREEITEM   m_htiSelected;              //  Selected item in the tree
    BSTR        m_bstrClientMachineName;    //  Default node name for SendStatusReport
    BOOL        m_fDisplayErrorsAsWarnings; //  If TRUE, uses yellow bang icon for errors instead of red x

    PSTreeItemLParamData *  m_ptipdProgressArray;   //  Dynamic sparse array of tasks that reported a progress_update.
    size_t                  m_cPASize;              //  The currently allocated size of the array.
    size_t                  m_cPACount;             //  The number of entries currently stored in the array.

private: // methods
    CTaskTreeView(
          HWND  hwndParentIn
        , UINT      uIDTVIn
        , UINT      uIDProgressIn
        , UINT      uIDStatusIn
        , size_t    uInitialTickCount
        );
    virtual ~CTaskTreeView( void );

    void    OnNotifyDeleteItem( LPNMHDR pnmhdrIn );
    void    OnNotifySelChanged( LPNMHDR pnmhdrIn );
    HRESULT HrInsertTaskIntoTree(
              HTREEITEM             htiFirstIn
            , STreeItemLParamData * ptipdIn
            , int                   nImageIn
            , BSTR                  bstrDescriptionIn
            );

    HRESULT HrProcessUpdateProgressTask( const STreeItemLParamData * ptipdIn );
             
    HRESULT HrUpdateProgressBar(
              const STreeItemLParamData * ptipdPrevIn
            , const STreeItemLParamData * ptipdNewIn
            );
    HRESULT HrPropagateChildStateToParents(
              HTREEITEM htiChildIn
            , int       nImageIn
            , BOOL      fOnlyUpdateProgressIn
            );

public:  // methods
    HRESULT HrOnInitDialog( void );
    HRESULT HrOnSendStatusReport(
              LPCWSTR       pcszNodeNameIn
            , CLSID         clsidTaskMajorIn
            , CLSID         clsidTaskMinorIn
            , ULONG         nMinIn
            , ULONG         nMaxIn
            , ULONG         nCurrentIn
            , HRESULT       hrStatusIn
            , LPCWSTR       pcszDescriptionIn
            , FILETIME *    pftTimeIn
            , LPCWSTR       pcszReferenceIn
            );
    HRESULT HrAddTreeViewRootItem( UINT idsIn, REFCLSID rclsidTaskIDIn )
    {
        return THR( HrAddTreeViewItem(
                              NULL      // phtiOut
                            , idsIn
                            , rclsidTaskIDIn
                            , IID_NULL
                            , TVI_ROOT
                            , TRUE      // fParentToAllNodeTasksIn
                            ) );

    } //*** CTaskTreeView::HrAddTreeViewRootItem
    HRESULT HrAddTreeViewItem(
              HTREEITEM *   phtiOut
            , UINT          idsIn
            , REFCLSID      rclsidMinorTaskIDIn
            , REFCLSID      rclsidMajorTaskIDIn     = IID_NULL
            , HTREEITEM     htiParentIn             = TVI_ROOT
            , BOOL          fParentToAllNodeTasksIn = FALSE
            );
    HRESULT HrOnNotifySetActive( void );

    LRESULT OnNotify( LPNMHDR pnmhdrIn );

    HRESULT HrShowStatusAsDone( void );
    HRESULT HrDisplayDetails( void );
    BOOL    FGetItem( HTREEITEM htiIn, STreeItemLParamData ** pptipdOut );
    HRESULT HrFindPrevItem( HTREEITEM * phtiOut );
    HRESULT HrFindNextItem( HTREEITEM * phtiOut );
    HRESULT HrSelectItem( HTREEITEM htiIn );

    void SetDisplayErrorsAsWarnings( BOOL fDisplayErrorsAsWarningsIn )
    {
        m_fDisplayErrorsAsWarnings = fDisplayErrorsAsWarningsIn;

    } //*** CTaskTreeView::SetDisplayErrorsAsWarnings

    BOOL FDisplayErrorsAsWarnings( void )
    {
        return m_fDisplayErrorsAsWarnings;

    } //*** CTaskTreeView::FDisplayErrorsAsWarnings

}; //*** class CTaskTreeView