///////////////////////////////////////////////////////////////////// // DataProvider.h : interface for data providers used for CursorGridCtrl // // Written by Dmitriy Oshchepkov aka DmitrO, mailto: dmitro@russian.ru // Copyright (c) 2005-2008. All Rights Reserved. // Version: 1.0 // ////////////////////////////////////////////////////////////////////// #pragma once enum RegionType {rtNone, rtHeader, rtHead, rtBody, rtTail}; enum DataType { dtUndefined, dtText, dtNumeric, dtDate, dtFalse, dtTrue }; class CDataRow { public: CDataRow() : m_nRefCount(1) {}; virtual ~CDataRow() { // if (m_nRefCount) // Msg("CDataRow %p RefCount %i violation!", this, m_nRefCount); }; virtual int GetFieldCount() = 0; virtual int GetFieldIndexOf(LPCSTR szFieldName) = 0; virtual LPCSTR GetFieldName(int nIndex) = 0; virtual DataType GetFieldType(int nIndex) {return dtUndefined;}; virtual void FormatField(int nIndex, CString& strValue) = 0; virtual UINT GetRowIndex() {return 0;}; void AddRef() {m_nRefCount++;}; void Release() {if (!--m_nRefCount) delete this; }; int m_nRefCount; }; #define DP_DATA_CHANGE (WM_USER + 0x0010) //the wParam for DP_DATA_CHANGE: #define DP_RESET 0x0000 //lParam is pointer to a CDataRow or may be NULL #define DP_FIELDS 0x0001 #define DP_CURROW 0x0002 //lParam is pointer to a CDataRow must be not NULL struct stQuickSearchPattern { LPCSTR szFieldName; DataType dataType; union { CString* pTextData; //for text fields; //for numeric fields; //for data fields; //for some other fields; }; }; class CDataProvider { public: CDataProvider() : m_hCtrl(NULL), m_RegionType(rtNone) {}; virtual ~CDataProvider() {}; public: HWND GetControl() const {return m_hCtrl;}; void SetControl(HWND hControl) { m_hCtrl = hControl; if (m_hCtrl) OnAttach(); else OnDetach(); }; RegionType GetRegionType() { return m_RegionType; }; void SetRegionType(RegionType rType) { m_RegionType = rType; }; void ResetData(CDataRow* pDataRow = NULL) { if (m_hCtrl) ::SendMessage(m_hCtrl, DP_DATA_CHANGE, MAKEWORD(DP_RESET, (BYTE)m_RegionType), (LPARAM)pDataRow); }; void SetCurrentRow(CDataRow* pDataRow) { if (m_hCtrl && pDataRow) ::SendMessage(m_hCtrl, DP_DATA_CHANGE, MAKEWORD(DP_CURROW, (BYTE)m_RegionType), (LPARAM)pDataRow); }; //Query rows interface virtual void QueryRows(CDataRow* pRowFrom, int nRowsCount, int nPageSizeHint) = 0; virtual CDataRow* Fetch() = 0; virtual BOOL RefreshRow(CDataRow* pRowFrom) = 0; virtual BOOL CompareRows(CDataRow* pRow1, CDataRow* pRow2) const = 0; virtual LPCSTR GetLastError() {return NULL;}; virtual BOOL GetRowCount(UINT* pCount) {return FALSE;}; virtual void QueryField(LPCSTR szFieldName) {}; virtual void ReleaseField(LPCSTR szFieldName) {}; virtual void OnFieldsChanged() { if (m_hCtrl) { #ifdef OPTIMIZE_FIELDS_CHANGE MSG msg; ::PeekMessage(&msg, m_hCtrl, DP_DATA_CHANGE, DP_DATA_CHANGE, PM_REMOVE); ::PostMessage(m_hCtrl, DP_DATA_CHANGE, DP_FIELDS, 0); #else ::SendMessage(m_hCtrl, DP_DATA_CHANGE, MAKEWORD(DP_FIELDS, (BYTE)m_RegionType), 0); #endif } }; virtual DataType GetQuickSearchType(LPCSTR szFieldName) {return dtUndefined;}; virtual void QuickSearch(stQuickSearchPattern& QSPattern) {}; protected: virtual void OnAttach() {}; virtual void OnDetach() {}; private: HWND m_hCtrl; RegionType m_RegionType; };