//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1997 - 1999
//
//  File:       statdlg.h
//
//--------------------------------------------------------------------------

#ifndef _INC_CSCUI_STATDLG_H
#define _INC_CSCUI_STATDLG_H


#ifndef _CSCST_H_
#   include "cscst.h"
#endif

class CStatusDlg
{
    public:
        enum Modes { MODE_NORMAL = 0,
                     MODE_AUTOSYNC
                   };

        static int Create(HWND hwndParent, LPCTSTR pszText, eSysTrayState eState, Modes mode = MODE_NORMAL);

    private:
        CStatusDlg(HINSTANCE hInstance, LPCTSTR pszText, eSysTrayState eState, Modes mode = MODE_NORMAL);

        ~CStatusDlg(void);

        int Run(HWND hwndParent);

        void Destroy(void);

        enum { iIMAGELIST_ICON_SERVER = 0,
               iIMAGELIST_ICON_SERVER_OFFLINE,
               iIMAGELIST_ICON_SERVER_BACK,
               iIMAGELIST_ICON_SERVER_DIRTY
             };

        //
        // An entry in the listview.
        //
        class LVEntry
        {
            public:
                LVEntry(HINSTANCE hInstance, LPCTSTR pszServer, bool bConnectable);
                ~LVEntry(void);

                LPCTSTR Server(void) const
                    { return m_pszServer; }

                void GetStatusText(LPTSTR pszStatus, int cchStatus) const;

                void GetInfoText(LPTSTR pszInfo, int cchInfo) const;

                int GetImageIndex(void) const;

                bool AddShare(LPCTSTR pszShare, const CSCSHARESTATS& s, DWORD dwCscStatus);

                void GetStats(CSCSHARESTATS *ps, DWORD *pdwCscStatus) const;

                int GetShareCount(void) const;

                LPCTSTR GetShareName(int iShare) const;

                bool IsModified(void) const
                {
                    return (0 < m_stats.cModified);
                }

                bool IsConnected(void) const
                {
                    return (0 != (FLAG_CSC_SHARE_STATUS_CONNECTED & m_dwCscStatus));
                }

                bool IsOffline(void) const
                {
                    return (0 != (FLAG_CSC_SHARE_STATUS_DISCONNECTED_OP & m_dwCscStatus));
                }

                bool IsConnectable(void) const
                {
                    return m_bConnectable;
                }
                //
                // Structure describing the display info for one listview entry.
                //
                struct DispInfo
                {
                    UINT idsStatusText;
                    UINT idsInfoText;
                    int  iImage;
                };

            private:
                //
                // Disp Info flags used to control what's displayed for the
                // entry in the listview.
                //
                enum { DIF_MODIFIED  = 0x00000001,
                       DIF_AVAILABLE = 0x00000002,
                       DIF_ONLINE    = 0x00000004 };

                HINSTANCE      m_hInstance;
                CSCSHARESTATS  m_stats;
                DWORD          m_dwCscStatus;
                LPTSTR         m_pszServer;
                HDPA           m_hdpaShares;
                mutable int    m_iDispInfo;    // Index into s_rgDispInfo[]
                bool           m_bConnectable;

                static const TCHAR s_szBlank[];
                static const DispInfo s_rgDispInfo[];

                int GetDispInfoIndex(void) const;

                //
                // Prevent copy.
                //
                LVEntry(const LVEntry& rhs);
                LVEntry& operator = (const LVEntry& rhs);
        };

        enum { iLVSUBITEM_SERVER = 0,
               iLVSUBITEM_STATUS,
               iLVSUBITEM_INFO
             };

        HINSTANCE     m_hInstance;
        HWND          m_hwndDlg;
        HWND          m_hwndLV;
        HIMAGELIST    m_himl;
        LPTSTR        m_pszText;
        Modes         m_mode;           // MODE_NORMAL etc.
        eSysTrayState m_eSysTrayState;
        int           m_cyExpanded;
        int           m_iLastColSorted;
        bool          m_bExpanded;
        bool          m_bSortAscending;
        
        BOOL OnInitDialog(WPARAM wParam, LPARAM lParam);
        BOOL OnCommand(WPARAM wParam, LPARAM lParam);
        BOOL OnNotify(WPARAM wParam, LPARAM lParam);
        BOOL OnDestroy(void);
        void OnLVN_GetDispInfo(LV_DISPINFO *plvdi);
        void OnLVN_ColumnClick(NM_LISTVIEW *pnmlv);

        void CreateListColumns(void);
        HIMAGELIST CreateImageList(void);
        void FillListView(void);
        void DestroyLVEntries(void);
        LVEntry *CreateLVEntry(LPCTSTR pszServer, bool bConnectable);
        LVEntry *FindLVEntry(LPCTSTR pszServer);
        bool ShouldIncludeLVEntry(const CStatusDlg::LVEntry& entry);
        bool ShouldCheckLVEntry(const CStatusDlg::LVEntry& entry);
        void PrepListForDisplay(void);
        void EnableListviewCheckboxes(bool bEnable);

        static int CALLBACK CompareLVItems(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
        static INT_PTR CALLBACK DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

        void ExpandDialog(bool bExpand);
        void UpdateDetailsBtnTitle(void);
        void RememberUsersDialogSizePref(bool bExpanded);
        bool UserLikesDialogExpanded(void);
        HRESULT SynchronizeServers(void);
        HRESULT BuildFilenameList(CscFilenameList *pfnl);
};

BOOL TransitionShareOnline(LPCTSTR pszShare, BOOL  bShareIsAlive, BOOL  bCheckSpeed, DWORD dwPathSpeed);
HRESULT ReconnectServers(CscFilenameList *pfnl, BOOL bCheckForOpenFiles, BOOL bCheckSpeed);


#endif // _INC_CSCUI_STATDLG_H