/***************************************************************************** * Copyright (C) Microsoft, 1989-1998 * Feb 22, 1998 * * subset.h - subset.cpp header. * * Modification History: * * 02/22/98 MC Port to hhctrl.ocx from old B2 code. * *****************************************************************************/ #include #define MAX_SS_NAME 50 #define SS_ENTIRE_CONTENTS 0x0001 #define SS_READ_ONLY 0x0002 #define SS_EMPTY_SUBSET 0x0004 // Also refered to as "new" subset. #define SS_FTS 0x0008 #define SS_TOC 0x0010 #define SS_F1 0x0020 class CExTitle; class CExCollection; class CFolder; // This is the subset class (singular) class CStructuralSubset { public: CStructuralSubset(PCSTR pszSubSetName = NULL); ~CStructuralSubset(); void NameSubSet(PCSTR pszSubSetName) { lstrcpy(m_szSubSetName,pszSubSetName); } void AddHash(DWORD dwHash); BOOL IsTitleInSubset(CExTitle* pTitle); int GetHashCount() { return m_iHashCount; } HASH EnumHashes(int pos); PSTR GetName() { return m_szSubSetName; } PSTR GetID() { return m_szSSID; } BOOL IsEntire() { return (m_dwFlags & SS_ENTIRE_CONTENTS); } BOOL IsReadOnly() { return (m_dwFlags & SS_READ_ONLY); } BOOL IsEmpty() { return (m_dwFlags & SS_EMPTY_SUBSET); } BOOL IsFTS() { return (m_dwFlags & SS_FTS); } BOOL IsF1() { return (m_dwFlags & SS_F1); } BOOL IsTOC() { return (m_dwFlags & SS_TOC); } void SetEntire() { m_dwFlags |= SS_ENTIRE_CONTENTS; } void SetReadOnly() { m_dwFlags |= SS_READ_ONLY; } void SetEmpty() { m_dwFlags |= SS_EMPTY_SUBSET; } void SelectAsTOCSubset(CExCollection* pCollection); private: HASH* m_pdwHashes; int m_iHashCount; int m_iAllocatedCount; TCHAR m_szSubSetName[MAX_SS_NAME]; TCHAR m_szSSID[MAX_SS_NAME]; CStructuralSubset* m_pNext; // Used only in the list class CSSList DWORD m_dwFlags; void MarkNode(CFolder* pFgti, BOOL bVisable); friend class CDefineSS; friend class CSSList; }; // CDefineSS is the UI wrapper class. class CDefineSS { public: CDefineSS(CExCollection* pCollection); ~CDefineSS(); CStructuralSubset* DefineSubset(HWND hWnd, CStructuralSubset* = NULL); private: BOOL InitDialog(HWND hDlg, LPSTR szRange); WORD ExpandContract(HWND hwndLB, CFolder* pFgt, int sel, BOOL which); BOOL FilterDlgCommand(HWND hDlg, WPARAM wParam, LPARAM lParam); void MeasureFBItem(LPMEASUREITEMSTRUCT lpMIS); void DrawFBItem(HWND hDlg, LPDRAWITEMSTRUCT lpDI, UINT LbId); UINT FillFilterTree(HWND hwndLB, BOOL fAvailable, BOOL fScrollup); UINT AvailableWalk(HWND hwndLB); UINT FilteredWalk(HWND hwndLB); BOOL DoesNodeHaveANext(UINT LbId, int n, CFolder* pFgt); void AddNode2Filter(CFolder* pFgti); void SetAvailableStatus(CFolder* pFgt); void RemoveNodeFromFilter(CFolder* pFgt); void SetFilterStatus(CFolder* pFgt); BOOL SetRangeToTree(CStructuralSubset* pSS); CStructuralSubset* GetRangeFromTree(LPSTR sz); BOOL SaveFilter(HWND hDlg); void SetSaveStatus(HWND hDlg); BOOL ShouldSave(HWND hDlg); BOOL SetDefaultButton( HWND hDlg, int iID, BOOL fFocus ); void ResetDefaultButton( HWND hDlg ); INT_PTR static FilterDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); LRESULT static MyFilterLBFunc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam); private: HWND m_hWndParent; BOOL m_bShouldSave; WNDPROC m_lpfnOrigLBProc; int m_giIndentSpacing; int m_giXpos; CStructuralSubset* m_pSS; CExCollection* m_pCollection; HIMAGELIST m_hIL; int m_iFontHeight; int m_iGlyphX; int m_iGlyphY; static CDefineSS* m_pThis; }; // This is the class that manages all subsets. class CSSList { public: CSSList(); ~CSSList(); CStructuralSubset* GetFTS() { return m_pFTS_SS; } CStructuralSubset* GetF1() { return m_pF1_SS; } CStructuralSubset* GetTOC() { return m_pTOC_SS; } CStructuralSubset* GetNew() { return m_pNew_SS; } CStructuralSubset* GetEC() { return m_pEC_SS; } void SetFTS(CStructuralSubset* pSS) { Set(pSS, &m_pFTS_SS, SS_FTS); } void SetF1(CStructuralSubset* pSS) { Set(pSS, &m_pF1_SS, SS_F1); } void SetTOC(CStructuralSubset* pSS) { Set(pSS, &m_pTOC_SS, SS_TOC); } void SetNew(CStructuralSubset* pSS) { m_pNew_SS = pSS; } void SetEC(CStructuralSubset* pSS) { m_pEC_SS = pSS; } int GetCount() { return m_iSubSetCount; } CStructuralSubset* GetNextSubset(CStructuralSubset* pSS) { return pSS ? pSS->m_pNext : m_pHeadSubSets; } CStructuralSubset* GetSubset(PSTR pszSSName); void DeleteSubset(CStructuralSubset* pSS, CStructuralSubset* pSSNew = NULL, HWND hWndUI = NULL); HRESULT PersistSubsets(CExCollection* pCollection); HRESULT RestoreSubsets(CExCollection* pCollection, PSTR pszRestoreSS); HRESULT ReadPreDefinedSubsets(CExCollection* pCollection, PSTR pszRestoreSS); HRESULT AddSubset(CStructuralSubset* pSS, HWND hWndUI = NULL); private: void Set(CStructuralSubset* pSSNew, CStructuralSubset** pSSOld, DWORD dwFlags); int m_iSubSetCount; CStructuralSubset* m_pHeadSubSets; CStructuralSubset* m_pFTS_SS; CStructuralSubset* m_pF1_SS; CStructuralSubset* m_pTOC_SS; CStructuralSubset* m_pNew_SS; CStructuralSubset* m_pEC_SS; }; #define SS_FILE_SIGNATURE 0x12345679 // // File format for subset storage. // typedef struct { DWORD dwSig; // Signature (do we know this file?) DWORD dwVer; // Version of hhctrl that wrote this file. INT iSSCount; // Count of SubSets in the file. DWORD dwFlags; // Reserved flag bits. TCHAR lpszCurrentSSName[MAX_SS_NAME_LEN]; // The name of the subset. DWORD dwReserved1; DWORD dwReserved2; DWORD dwReserved3; } SSHEADER, *PSSHEADER; typedef struct { INT iHashCount; // How many hashes in this subset. TCHAR lpszSSName[MAX_SS_NAME_LEN]; // The name of the subset. TCHAR lpszSSID[MAX_SS_NAME_LEN]; // The subset identifier. DWORD dwFlags; // reserved flag bits. DWORD dwHashes[1]; // The hash array. } SS, *PSS;