|
|
#ifndef _DVViewState_h
#define _DVViewState_h
// Forwards
class CDefView;
typedef struct { POINT pt; ITEMIDLIST idl; } VIEWSTATE_POSITION;
typedef struct { // NOTE: Not a typo! This is a persisted structure so we cannot use LPARAM
LONG lParamSort;
int iDirection; int iLastColumnClick; } WIN95SAVESTATE;
typedef struct { WORD cbSize; WORD wUnused; // junk on stack at this location has been saved in the registry since Win95... bummer
DWORD ViewMode; POINTS ptScroll; WORD cbColOffset; WORD cbPosOffset; WIN95SAVESTATE dvState;
} WIN95HEADER;
// Even though we don't currently store anything we care
// about in this structure relating to the view state,
// the cbStreamSize value fixes a bug in Win95 where we
// read to the end of the stream instead of just reading
// in the same number of bytes we wrote out.
//
typedef struct { DWORD dwSignature; // DVSAVEHEADEREX_SIGNATURE
WORD cbSize; // size of this structure, in bytes
WORD wVersion; // DVSAVEHEADEREX_VERSION
DWORD cbStreamSize; // size of all info saved, in bytes
DWORD dwUnused; // used to be SIZE szExtended (ie4 beta1)
WORD cbColOffset; // overrides DVSAVEHEADER.cbColOffset
WORD wAlign; } IE4HEADER;
typedef struct { WIN95HEADER dvSaveHeader; IE4HEADER dvSaveHeaderEx; } DVSAVEHEADER_COMBO;
#define IE4HEADER_SIGNATURE 0xf0f0f0f0 // don't conflict with CCOLSHEADER_SIGNATURE
#define IE4HEADER_VERSION 3 // for easy versioning
#define VIEWSTATEHEADER_SIGNATURE 0xfddfdffd
#define VIEWSTATEHEADER_VERSION_1 0x0C
#define VIEWSTATEHEADER_VERSION_2 0x0E
#define VIEWSTATEHEADER_VERSION_3 0x0f
#define VIEWSTATEHEADER_VERSION_CURRENT VIEWSTATEHEADER_VERSION_3
typedef struct { GUID guidGroupID; SHCOLUMNID scidDetails; } GROUP_PERSIST;
typedef struct { struct { DWORD dwSignature; USHORT uVersion; // 0x0c == IE4, 0x0e == IE5
USHORT uCols; USHORT uOffsetWidths; USHORT uOffsetColOrder; } Version1;
struct { USHORT uOffsetColStates; } Version2;
struct { USHORT uOffsetGroup; } Version3; } VIEWSTATEHEADER;
class CViewState { void InitFromHeader(DVSAVEHEADER_COMBO* pdv); void LoadPositionBlob(CDefView* pdv, DWORD cbSizeofStream, IStream* pstm); HRESULT SavePositionBlob(CDefView* pdv, IStream* pstm); BOOL SyncColumnWidths(CDefView* pdv, BOOL fSetListViewState); BOOL SyncColumnStates(CDefView* pdv, BOOL fSetListViewstate); BOOL SyncPositions(CDefView* pdv); static int CALLBACK _SavedItemCompare(void *p1, void *p2, LPARAM lParam); DWORD _GetStreamSize(IStream* pstm); public: // Save State
LPARAM _lParamSort; int _iDirection; int _iLastColumnClick; DWORD _ViewMode; POINTS _ptScroll;
HDSA _hdsaColumnOrder; HDSA _hdsaColumnWidths; HDSA _hdsaColumnStates; HDSA _hdsaColumns; HDPA _hdpaItemPos; BYTE* _pbPositionData; GUID _guidGroupID; SHCOLUMNID _scidDetails;
BOOL _fFirstViewed;
CViewState(); ~CViewState();
// When initializing a new DefView, see if we can
// propogate information from the previous one.
void InitFromPreviousView(IUnknown* pPrevView); void InitWithDefaults(CDefView* pdv); void GetDefaults(CDefView* pdv, LPARAM* plParamSort, int* piDirection, int* piLastColumnClick); HRESULT InitializeColumns(CDefView* pdv);
BOOL AppendColumn(UINT uCol, USHORT uWidth, INT uOrder); BOOL RemoveColumn(UINT uCol); UINT GetColumnWidth(UINT uCol, UINT uDefaultWidth); UINT GetColumnCount();
// Column Helpers.
DWORD GetColumnState(UINT uCol); DWORD GetTransientColumnState(UINT uCol); void SetColumnState(UINT uCol, DWORD dwMask, DWORD dwState); void SetTransientColumnState(UINT uCol, DWORD dwMask, DWORD dwState); LPTSTR GetColumnName(UINT uCol); int GetColumnFormat(UINT uCol); UINT GetColumnCharCount(UINT uCol);
// When Loading or Saving from the View State Stream
HRESULT SaveToStream(CDefView* pdv, IStream* pstm); HRESULT LoadFromStream(CDefView* pdv, IStream* pstm); HRESULT SaveToPropertyBag(CDefView* pdv, IPropertyBag* ppb); HRESULT LoadFromPropertyBag(CDefView* pdv, IPropertyBag* ppb);
// When Loading from a View Callback provided stream.
HRESULT LoadColumns(CDefView* pdv, IStream* pstm); HRESULT SaveColumns(CDefView* pdv, IStream* pstm);
// Syncronizes ListView with the current View State.
// TRUE means take the view state object and set it into the listview.
HRESULT Sync(CDefView* pdv, BOOL fSetListViewState); void ClearPositionData(); // Needs to be called at the time of CDefView::AddColumns
BOOL SyncColumnOrder(CDefView* pdv, BOOL fSetListViewState); };
#endif
|