ADORMultiColumnComboBox.cpp
上传用户:yangzi5763
上传日期:2007-01-02
资源大小:239k
文件大小:9k
源码类别:

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 11/11/98 4:01:08 AM
  5.   Comments: ADORMultiColumnComboBox.cpp: implementation of the CADORMultiColumnComboBox class.
  6.  ************************************/
  7. #include "stdafx.h"
  8. #include "xpropertieswnd.h"
  9. #include "ADORMultiColumnComboBox.h"
  10. #include "ControlsWnd.h"
  11. #include "XPropertiesWndCtl.h"
  12. #ifdef _DEBUG
  13. #undef THIS_FILE
  14. static char THIS_FILE[]=__FILE__;
  15. #define new DEBUG_NEW
  16. #endif
  17. //////////////////////////////////////////////////////////////////////
  18. // Construction/Destruction
  19. //////////////////////////////////////////////////////////////////////
  20. BEGIN_MESSAGE_MAP(CADORMultiColumnComboBox,CMultiColumnComboBox)
  21. //{{AFX_MSG_MAP(CADORMultiColumnComboBox)
  22. ON_WM_CTLCOLOR()
  23. ON_WM_DESTROY()
  24. //}}AFX_MSG_MAP
  25. END_MESSAGE_MAP()
  26. // Function name : CADORMultiColumnComboBox::CADORMultiColumnComboBox
  27. // Description     : default constructor
  28. // Return type : 
  29. CADORMultiColumnComboBox::CADORMultiColumnComboBox()
  30. {
  31. m_rgbEditColor = RGB(0,0,255);
  32. m_pRecordSet = NULL;
  33. m_pFields = NULL;
  34. m_pNotifyClass = NULL;
  35. m_nLastItem = -1;
  36. }
  37. // Function name : CADORMultiColumnComboBox::~CADORMultiColumnComboBox
  38. // Description     : virtual destructor
  39. // Return type : 
  40. CADORMultiColumnComboBox::~CADORMultiColumnComboBox()
  41. {
  42. }
  43. // Function name : CADORMultiColumnComboBox::OnCtlColor
  44. // Description     : Change the color when you write into edit control.
  45. // Return type : HBRUSH 
  46. // Argument         : CDC* pDC
  47. // Argument         : CWnd* pWnd
  48. // Argument         : UINT nCtlColor
  49. HBRUSH CADORMultiColumnComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  50. {
  51. HBRUSH hbr = CMultiColumnComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
  52. if (pWnd == GetEdit())
  53. pDC->SetTextColor(m_rgbEditColor);
  54. // TODO: Return a different brush if the default is not desired
  55. return hbr;
  56. }
  57. // Function name : CADORMultiColumnComboBox::SetEditColor
  58. // Description     : Set the new edit color
  59. // Return type : void 
  60. // Argument         : COLORREF rgbEditColor
  61. void CADORMultiColumnComboBox::SetEditColor(COLORREF rgbEditColor)
  62. {
  63. m_rgbEditColor = rgbEditColor;
  64. }
  65. // Function name : CADORMultiColumnComboBox::Create
  66. // Description     : 
  67. // Return type : BOOL 
  68. // Argument         : CWnd* m_pParent
  69. BOOL CADORMultiColumnComboBox::Create(CControlsWnd_CADORComboBox* pNotifyClass, LPDISPATCH pObjectDispatch)
  70. {
  71. BOOL bResult = FALSE;
  72. m_pNotifyClass = NULL;
  73. if (CreateRecordSet(pObjectDispatch))
  74. if (bResult = CMultiColumnComboBox::CreateEx(0, wndClassName, _T(""), WS_CHILD , CRect(0,0,0,0), (CWnd*)(pNotifyClass->GetWindowNotify()), 0))
  75. {
  76. m_pNotifyClass = pNotifyClass;
  77. ModifyStyleEx(WS_EX_STATICEDGE , 0);
  78. PopulateList();
  79. }
  80. return bResult;
  81. }
  82. // Function name : CADORMultiColumnComboBox::Refresh
  83. // Description     : Refresh the control
  84. // Return type : BOOL 
  85. BOOL CADORMultiColumnComboBox::Refresh()
  86. {
  87. CListCtrl* pListCtrl = GetListCtrl();
  88. pListCtrl->DeleteAllItems();
  89. while (pListCtrl->DeleteColumn(0));
  90. DestroyRecordSet();
  91. LPDISPATCH pObjectDispatch = NULL;
  92. m_pNotifyClass->GetControl()->FireSetObject(m_pNotifyClass->GetWindowNotify()->GetIndexPage(), m_pNotifyClass->GetSelectedItem(), &pObjectDispatch);
  93. if (CreateRecordSet(pObjectDispatch))
  94. {
  95. PopulateList();
  96. return TRUE;
  97. }
  98. return FALSE;
  99. }
  100. // Function name : CADORMultiColumnComboBox::SelectCurrentItem
  101. // Description     : Override this ...
  102. // Return type : void 
  103. BOOL CADORMultiColumnComboBox::SelectCurrentItem()
  104. {
  105. BOOL bResult = CMultiColumnComboBox::SelectCurrentItem();
  106. if (bResult)
  107. {
  108. CString text; GetEdit()->GetWindowText(text);
  109. m_pNotifyClass->OnSelectItem(text, 0);
  110. }
  111. return bResult;
  112. }
  113. // Function name : CADORMultiColumnComboBox::OnDestroy
  114. // Description     : Destroy the recordset 
  115. // Return type : void 
  116. void CADORMultiColumnComboBox::OnDestroy() 
  117. {
  118. CMultiColumnComboBox::OnDestroy();
  119. DestroyRecordSet();
  120. // Another penible BUG
  121. m_pActiveMCBox = NULL;
  122. }
  123. // Function name : CADORMultiColumnComboBox::DestroyRecordSet
  124. // Description     : Called in destroy window
  125. // Return type : void 
  126. void CADORMultiColumnComboBox::DestroyRecordSet()
  127. {
  128. TRY
  129. {
  130. if (m_pRecordSet)
  131. {
  132. if (m_pFields)
  133. {
  134. for (int i = 0; i < m_arField.GetSize(); i++)
  135. delete m_arField.GetAt(i);
  136. m_arField.RemoveAll();
  137. delete m_pFields;
  138. m_pFields = NULL;
  139. }
  140. delete m_pRecordSet;
  141. m_pRecordSet = NULL;
  142. }
  143. }
  144. CATCH_ALL(e)
  145. {
  146. }
  147. END_CATCH_ALL;
  148. }
  149. // Function name : CADORMultiColumnComboBox::CreateRecordSet
  150. // Description     : Create the record set, fields, field[i]...
  151. // Return type : BOOL 
  152. // Argument         : LPDISPATCH pObjectDispatch
  153. BOOL CADORMultiColumnComboBox::CreateRecordSet(LPDISPATCH pObjectDispatch)
  154. {
  155. // m_pRecordSet need to be NULL
  156. ASSERT(m_pRecordSet == NULL);
  157. BOOL bResult = FALSE;
  158. if (pObjectDispatch)
  159. {
  160. TRY 
  161. {
  162. m_pRecordSet = new CADORRecordset(pObjectDispatch);
  163. pObjectDispatch->AddRef();
  164. m_pFields = new CADORFields(m_pRecordSet->GetFields());
  165. int nFields = m_pFields->GetCount();
  166. for (int i = 0; i < nFields; i++)
  167. m_arField.Add( new CADORField(m_pFields->GetItem(COleVariant((long)i))) );
  168. bResult = TRUE;
  169. }
  170. CATCH_ALL(e)
  171. {
  172. bResult = FALSE;
  173. DestroyRecordSet();
  174. }
  175. END_CATCH_ALL
  176. }
  177. return bResult;
  178. }
  179. // Function name : CADORMultiColumnComboBox::CreateHeader
  180. // Description     : Create a header for list control
  181. // Return type : int 
  182. int CADORMultiColumnComboBox::CreateHeader()
  183. {
  184. CListCtrl* pListCtrl = GetListCtrl();
  185. int nFields = m_arField.GetSize();
  186. for (int i = 0; i < nFields; i++)
  187. pListCtrl->InsertColumn(i, m_arField[i]->GetName(), LVCFMT_LEFT, 128);
  188. return nFields;
  189. }
  190. // Function name : CADORMultiColumnComboBox::GetErrorMessage
  191. // Description     : 
  192. // Return type : CString 
  193. // Argument         : CException *e
  194. CString CADORMultiColumnComboBox::GetErrorMessage(CException *e)
  195. {
  196. CString buffer;
  197. if (e)
  198. e->GetErrorMessage(buffer.GetBuffer(1024), 1024);
  199. return buffer;
  200. }
  201. // Function name : GetValue
  202. // Description     : comutil.h
  203. // Return type : CString 
  204. // Argument         : CADORField *pField
  205. CString GetValue(CADORField* pField)
  206. {
  207. CString sResult;
  208. TRY
  209. {
  210. COleVariant v(pField->GetValue());
  211. v.ChangeType(VT_BSTR);
  212. sResult = CString(v.bstrVal);
  213. ::SysFreeString(v.bstrVal);
  214. }
  215. CATCH_ALL(e)
  216. {
  217. TRACE(_T("Conversion failed into CString GetValue(CADORField* pField)n"));
  218. CString error; e->GetErrorMessage(error.GetBuffer(1024), 1024);
  219. TRACE(_T("Error: %sn"), error);
  220. e->Delete();
  221. sResult = _T("");
  222. }
  223. END_CATCH_ALL;
  224. return sResult;
  225. }
  226. // Function name : CADORMultiColumnComboBox::CStr2Var
  227. // Description     : 
  228. // Return type : VARIANT 
  229. // Argument         : LPCTSTR lpszValue
  230. VARIANT CADORMultiColumnComboBox::CStr2Var( CADORField* pField, LPCTSTR lpszValue )
  231. {
  232. VARIANT vResult;
  233. VariantInit(&vResult);
  234. TRY
  235. {
  236. COleVariant v( lpszValue );
  237. v.ChangeType((USHORT)pField->GetType() & 0x000F);
  238. vResult = v;
  239. }
  240. CATCH_ALL(e)
  241. {
  242. VariantInit(&vResult);
  243. TRACE(_T("Conversion failed into VARIANT CADORMultiColumnComboBox::CStr2Var( CADORField* pField, LPCTSTR lpszValue )n"));
  244. TRACE(_T("Error: %sn"), GetErrorMessage(e));
  245. }
  246. END_CATCH_ALL;
  247. return vResult;
  248. }
  249. // Function name : CADORMultiColumnComboBox::PopulateList
  250. // Description     : Fill the list control: header wnd items
  251. // Return type : void 
  252. void CADORMultiColumnComboBox::PopulateList()
  253. {
  254. // Already this must be created
  255. ASSERT (::IsWindow(m_hWnd));
  256. int nFields = NULL;
  257. if ((nFields = CreateHeader()) > 0)
  258. {
  259. CListCtrl* pListCtrl = GetListCtrl();
  260. ASSERT ( nFields == m_arField.GetSize());
  261. TRY
  262. {
  263. m_pRecordSet->MoveFirst();
  264. int nItem = 0;
  265. while (!m_pRecordSet->GetEof())
  266. {
  267. nItem = pListCtrl->InsertItem(nItem + 1, GetValue(m_arField[0]));
  268. for (register int i = 1; i < nFields; i++)
  269. pListCtrl->SetItemText(nItem, i, GetValue(m_arField[i]));
  270. m_pRecordSet->MoveNext();
  271. }
  272. }
  273. CATCH_ALL(e)
  274. {
  275. }
  276. END_CATCH_ALL;
  277. }
  278. }
  279. // Function name : CADORMultiColumnComboBox::GetColumnHeader
  280. // Description     : Get column header
  281. // Return type : BOOL 
  282. BOOL CADORMultiColumnComboBox::GetColumnHeader()
  283. {
  284. return !(GetListCtrl()->GetStyle() & LVS_NOCOLUMNHEADER);
  285. }
  286. // Function name : CADORMultiColumnComboBox::SetColumnHeader
  287. // Description     : 
  288. // Return type : void 
  289. // Argument         : BOOL bEnable
  290. void CADORMultiColumnComboBox::SetColumnHeader(BOOL bShow)
  291. {
  292. GetListCtrl()->ModifyStyle(bShow ? LVS_NOCOLUMNHEADER : 0, bShow ? 0 : LVS_NOCOLUMNHEADER);
  293. }
  294. // Function name : CADORMultiColumnComboBox::OnInit
  295. // Description     : 
  296. // Return type : BOOL 
  297. BOOL CADORMultiColumnComboBox::OnInit()
  298. {
  299. if (CMultiColumnComboBox::OnInit())
  300. {
  301. m_hdColor.SubclassDlgItem(0, GetListCtrl());
  302. return TRUE;
  303. }
  304. return FALSE;
  305. }