ReportCustomHeapView.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:15k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // ReportCustomHeapView.cpp : implementation of the CReportCustomHeapView class
  2. //
  3. #include "stdafx.h"
  4. #include "ReportCustomHeap.h"
  5. #include "ReportCustomHeapDoc.h"
  6. #include "ReportCustomHeapView.h"
  7. #include "MainFrm.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. #define COLUMN_TEXT  0
  14. #define COLUMN_COSTRAINT 1
  15. #define COLUMN_NUMBER  2
  16. #define COLUMN_DATETIME  3
  17. #define COLUMN_VARIANT  4
  18. // XTP_DECLARE_HEAP_ALLOCATOR(CReportStringAllocator)
  19. // XTP_IMPLEMENT_HEAP_ALLOCATOR(CReportStringAllocator, TRUE)
  20. // typedef CXTPHeapStringT<CReportStringAllocator> CReportString;
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CReportCustomHeapView
  23. IMPLEMENT_DYNCREATE(CReportCustomHeapView, CXTPReportView)
  24. BEGIN_MESSAGE_MAP(CReportCustomHeapView, CXTPReportView)
  25. //{{AFX_MSG_MAP(CReportCustomHeapView)
  26. ON_COMMAND(ID_ADD_10K_RECORDS, OnAdd10kRecords)
  27. ON_COMMAND(ID_ADD_20K_RECORDS, OnAdd20kRecords)
  28. ON_COMMAND(ID_BATCHADD_10K_RECORDS, OnBatchAdd10kRecords)
  29. ON_COMMAND(ID_BATCHADD_20K_RECORDS, OnBatchAdd20kRecords)
  30. ON_COMMAND(ID_REMOVE_ALL_RECORDS, OnRemoveAllRecords)
  31. ON_COMMAND(ID_VIEW_PREVIEW_MODE, OnViewPreviewMode)
  32. ON_UPDATE_COMMAND_UI(ID_VIEW_PREVIEW_MODE, OnUpdateViewPreviewMode)
  33. ON_COMMAND(ID_REMOVE_HALF_RECORDS, OnRemoveHalfRecords)
  34. ON_COMMAND(ID_FREE_EXTRA_BATCH_DATA, OnFreeExtraBatchData)
  35. //}}AFX_MSG_MAP
  36. END_MESSAGE_MAP()
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CReportCustomHeapView construction/destruction
  39. CReportCustomHeapView::CReportCustomHeapView()
  40. {
  41. // TODO: add construction code here
  42. }
  43. CReportCustomHeapView::~CReportCustomHeapView()
  44. {
  45. }
  46. BOOL CReportCustomHeapView::PreCreateWindow(CREATESTRUCT& cs)
  47. {
  48. // TODO: Modify the Window class or styles here by modifying
  49. //  the CREATESTRUCT cs
  50. return CView::PreCreateWindow(cs);
  51. }
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CReportCustomHeapView printing
  54. BOOL CReportCustomHeapView::OnPreparePrinting(CPrintInfo* pInfo)
  55. {
  56. // default preparation
  57. return DoPreparePrinting(pInfo);
  58. }
  59. void CReportCustomHeapView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  60. {
  61. // TODO: add extra initialization before printing
  62. }
  63. void CReportCustomHeapView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  64. {
  65. // TODO: add cleanup after printing
  66. }
  67. /////////////////////////////////////////////////////////////////////////////
  68. // CReportCustomHeapView diagnostics
  69. #ifdef _DEBUG
  70. void CReportCustomHeapView::AssertValid() const
  71. {
  72. CView::AssertValid();
  73. }
  74. void CReportCustomHeapView::Dump(CDumpContext& dc) const
  75. {
  76. CView::Dump(dc);
  77. }
  78. CReportCustomHeapDoc* CReportCustomHeapView::GetDocument() // non-debug version is inline
  79. {
  80. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CReportCustomHeapDoc)));
  81. return (CReportCustomHeapDoc*)m_pDocument;
  82. }
  83. #endif //_DEBUG
  84. /////////////////////////////////////////////////////////////////////////////
  85. // CReportCustomHeapView message handlers
  86. void CReportCustomHeapView::OnInitialUpdate() 
  87. {
  88. CXTPReportView::OnInitialUpdate();
  89. // GetReportCtrl().ShowHeader();
  90. CXTPReportControl& wndReport = GetReportCtrl();
  91. wndReport.GetReportHeader()->SetAutoColumnSizing(FALSE);
  92. //wndReport.AllowEdit(TRUE);
  93. //wndReport.FocusSubItems(TRUE);
  94. wndReport.ShowGroupBy();
  95. wndReport.EnableDragDrop(_T("ReportCustomGeapSample"), xtpReportAllowDrag | xtpReportAllowDrop);
  96. //-----------------------------------------------------------------------
  97. wndReport.AddColumn(new CXTPReportColumn(COLUMN_TEXT, _T("Text"),   150));
  98. wndReport.AddColumn(new CXTPReportColumn(COLUMN_COSTRAINT, _T("Constraint"), 80, FALSE));
  99. wndReport.AddColumn(new CXTPReportColumn(COLUMN_NUMBER, _T("Number"),   100));
  100. wndReport.AddColumn(new CXTPReportColumn(COLUMN_DATETIME, _T("Date"),   150));
  101. wndReport.AddColumn(new CXTPReportColumn(COLUMN_VARIANT, _T("VARIANT"),   180));
  102. for (int i = 0; i < 5; i++)
  103. {
  104. wndReport.AddColumn(new CXTPReportColumn(COLUMN_VARIANT + i + 1, _T("Text"), 150));
  105. wndReport.AddColumn(new CXTPReportColumn(COLUMN_VARIANT + i + 2, _T("Number"), 70));
  106. wndReport.AddColumn(new CXTPReportColumn(COLUMN_VARIANT + i + 3, _T("Date"), 150));
  107. }
  108. wndReport.GetColumns()->GetAt(COLUMN_COSTRAINT)->GetEditOptions()->m_bConstraintEdit = TRUE;
  109. wndReport.GetColumns()->GetAt(COLUMN_COSTRAINT)->GetEditOptions()->AddComboButton();
  110. wndReport.GetColumns()->GetAt(COLUMN_COSTRAINT)->GetEditOptions()->AddConstraint(_T("State 1"), 1);
  111. wndReport.GetColumns()->GetAt(COLUMN_COSTRAINT)->GetEditOptions()->AddConstraint(_T("State 2"), 2);
  112. wndReport.GetColumns()->GetAt(COLUMN_COSTRAINT)->GetEditOptions()->AddConstraint(_T("State 3"), 3);
  113. }
  114. void CReportCustomHeapView::AddRecord(int nState, LPCTSTR pcszText, double dNumber, 
  115.   const COleDateTime& dtDate, const COleVariant& varVariant)
  116. {
  117. static const CString cstrNumberFormat(_T("%06.3f"));
  118. CXTPReportRecord* pRec = new CXTPReportRecord;
  119. CString strConstraint = GetReportCtrl().GetColumns()->GetAt(COLUMN_COSTRAINT)->GetEditOptions()->GetConstraints()->GetAt(nState)->m_strConstraint;
  120. pRec->AddItem(new CXTPReportRecordItemText(pcszText));
  121. pRec->AddItem(new CXTPReportRecordItemText(strConstraint));
  122. pRec->AddItem(new CXTPReportRecordItemNumber(dNumber, cstrNumberFormat));
  123. pRec->AddItem(new CXTPReportRecordItemDateTime(dtDate));
  124. pRec->AddItem(new CXTPReportRecordItemVariant(varVariant));
  125. for (int i = 0; i < 5; i++)
  126. {
  127. pRec->AddItem(new CXTPReportRecordItemText(pcszText));
  128. pRec->AddItem(new CXTPReportRecordItemNumber(dNumber, cstrNumberFormat));
  129. pRec->AddItem(new CXTPReportRecordItemDateTime(dtDate));
  130. }
  131. CString strPreviewText;
  132. strPreviewText.Format(_T("%s, %s, %s, %s, %s"),
  133. pRec->GetItem(0)->GetCaption(NULL),
  134. pRec->GetItem(1)->GetCaption(NULL),
  135. pRec->GetItem(2)->GetCaption(NULL),
  136. pRec->GetItem(3)->GetCaption(NULL),
  137. pRec->GetItem(4)->GetCaption(NULL));
  138. CXTPReportRecordItemPreview* pPreviewItem = new CXTPReportRecordItemPreview(strPreviewText);
  139. pRec->SetPreviewItem(pPreviewItem);
  140. GetReportCtrl().AddRecord(pRec);
  141. }
  142. void CReportCustomHeapView::AddRecords(int nCountToAdd) 
  143. {
  144. CWaitCursor _wc;
  145. DWORD dwTime0 = ::GetTickCount();
  146. int nRecords0 = GetReportCtrl().GetRecords()->GetCount();
  147. CString strText;
  148. COleVariant varVariant;
  149. CWnd* pStatusBap = &((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar;
  150. for (int i = 0; i < nCountToAdd; i++)
  151. {
  152. int n = nRecords0 + i;
  153. int nState = n % 3;
  154. strText.Format(_T("[%d] - Test TEXT item"), n+1);
  155. // just for test
  156. double dNumber = 77.77 * (n+11) / (double)(n / 7.11 + 1.1);
  157. COleDateTime dtDate(2000 + ((n%2) ? 1 : -1) * i % 400, n % 12 + 1, n % 28 + 1,
  158. n * 7 % 24, n * 31 % 60, n * 11 % 60);
  159. if (n%2 == 0) 
  160. {
  161. varVariant = (long)nState;
  162. }
  163. else if (n%3 == 0) 
  164. {
  165. varVariant = dtDate;
  166. }
  167. else if (n%5 == 0) 
  168. {
  169. varVariant = strText;
  170. }
  171. else
  172. {
  173. varVariant = _T("this is a VARIANT field");
  174. }
  175. AddRecord(nState, strText, dNumber, dtDate, varVariant);
  176. if (i % 2500 == 0)
  177. {
  178. CString str;
  179. str.Format(_T("Adding Records %d %%"), (i + 1) * 100 / nCountToAdd);
  180. pStatusBap->SetWindowText(str);
  181. pStatusBap->UpdateWindow();
  182. }
  183. }
  184. pStatusBap->SetWindowText(_T(""));
  185. DWORD dwTime1 = ::GetTickCount();
  186. GetReportCtrl().Populate();
  187. DWORD dwTime2 = ::GetTickCount();
  188. UpdateTitle(dwTime1 - dwTime0, dwTime2 - dwTime1);
  189. }
  190. XTP_DECLARE_BATCH_ALLOC_OBJ_DATA(CBatchReportRecord_Data);
  191. class CBatchReportRecord : public CXTPBatchAllocObjT<CXTPReportRecord, CBatchReportRecord_Data> 
  192. {
  193. public:
  194. CBatchReportRecord()
  195. {
  196. // nGrowBy parameter set to expected items count to avoid additional re-allocations.
  197. m_arrItems.SetSize(0, 20);
  198. AddItem(&m_itemText1);
  199. AddItem(&m_itemText2);
  200. AddItem(&m_itemNumber1);
  201. AddItem(&m_itemDateTime);
  202. AddItem(&m_itemVariant);
  203. for (int i = 0; i < 5; i++)
  204. {
  205. AddItem(&m_itemTextA[i]);
  206. AddItem(&m_itemNumberA[i]);
  207. AddItem(&m_itemDateTimeA[i]);
  208. }
  209. }
  210. ~CBatchReportRecord()
  211. {
  212. m_arrItems.RemoveAll(); // don't call delete for each item.
  213. }
  214. public:
  215. CXTPReportRecordItemText m_itemText1;
  216. CXTPReportRecordItemText m_itemText2;
  217. CXTPReportRecordItemNumber m_itemNumber1;
  218. CXTPReportRecordItemDateTime m_itemDateTime;
  219. CXTPReportRecordItemVariant m_itemVariant;
  220. CXTPReportRecordItemText m_itemTextA[5];
  221. CXTPReportRecordItemNumber m_itemNumberA[5];
  222. CXTPReportRecordItemDateTime m_itemDateTimeA[5];
  223. };
  224. XTP_IMPLEMENT_BATCH_ALLOC_OBJ_DATA(CBatchReportRecord_Data, CBatchReportRecord, TRUE);
  225. void CReportCustomHeapView::BatchAddRecords(int nCountToAdd) 
  226. {
  227. // CBatchReportRecord_Data::m_bDestroyEmptyBlocksOnFree = TRUE;
  228. // CBatchReportRecord_Data::m_bDestroyLastEmptyBlockOnFree = TRUE;
  229. // CBatchReportRecord_Data::m_nBlockSize = 5000;
  230. CWaitCursor _wc;
  231. DWORD dwTime0 = ::GetTickCount();
  232. int i;
  233. int nRecords0 = GetReportCtrl().GetRecords()->GetCount();
  234. CString strText;
  235. COleVariant varVariant;
  236. CWnd* pStatusBap = &((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar;
  237. // Expand array size once to avoid additional re-allocations.
  238. GetReportCtrl().GetRecords()->SetSize(nRecords0 + nCountToAdd, 10000);
  239. for (i = 0; i < nCountToAdd; i++)
  240. {
  241. CBatchReportRecord* pRec = new CBatchReportRecord();
  242. //GetReportCtrl().GetRecords()->Add(pRec);
  243. // Set new records to array which was previously expanded by SetSize.
  244. GetReportCtrl().GetRecords()->SetAt(nRecords0 + i, pRec);
  245. int n = nRecords0 + i;
  246. int nState = n % 3;
  247. strText.Format(_T("[%d] - Test TEXT item"), n+1);
  248. // just for test
  249. double dNumber = 77.77 * (n+11) / (double)(n / 7.11 + 1.1);
  250. COleDateTime dtDate(2000 + ((n%2) ? 1 : -1) * i % 400, n % 12 + 1, n % 28 + 1,
  251. n * 7 % 24, n * 31 % 60, n * 11 % 60);
  252. if (n%2 == 0) 
  253. {
  254. varVariant = (long)nState;
  255. }
  256. else if (n%3 == 0) 
  257. {
  258. varVariant = dtDate;
  259. }
  260. else if (n%5 == 0) 
  261. {
  262. varVariant = strText;
  263. }
  264. else
  265. {
  266. varVariant = _T("this is a VARIANT field");
  267. }
  268. static const CString cstrNumberFormat(_T("%06.3f"));
  269. CString strConstraint = GetReportCtrl().GetColumns()->GetAt(COLUMN_COSTRAINT)->GetEditOptions()->GetConstraints()->GetAt(nState)->m_strConstraint;
  270. pRec->m_itemText1.SetValue(strText);
  271. pRec->m_itemText2.SetValue(strConstraint);
  272. pRec->m_itemNumber1.SetValue(dNumber);
  273. pRec->m_itemNumber1.SetFormatString(cstrNumberFormat);
  274. pRec->m_itemDateTime.SetValue(dtDate);
  275. pRec->m_itemVariant.SetValue(varVariant);
  276. for (int j = 0; j < 5; j++)
  277. {
  278. pRec->m_itemTextA[j].SetValue(strText);
  279. pRec->m_itemNumberA[j].SetValue(dNumber);
  280. pRec->m_itemDateTimeA[j].SetValue(dtDate);
  281. }
  282. if (i % 2500 == 0)
  283. {
  284. CString str;
  285. str.Format(_T("Adding Records %d %%"), (i + 1) * 100 / nCountToAdd);
  286. pStatusBap->SetWindowText(str);
  287. pStatusBap->UpdateWindow();
  288. }
  289. }
  290. pStatusBap->SetWindowText(_T(""));
  291. DWORD dwTime1 = ::GetTickCount();
  292. GetReportCtrl().Populate();
  293. DWORD dwTime2 = ::GetTickCount();
  294. UpdateTitle(dwTime1 - dwTime0, dwTime2 - dwTime1);
  295. }
  296. void CReportCustomHeapView::UpdateTitle(DWORD dwAddTime, DWORD dwPopulateTime) 
  297. {
  298. int nRecordsCount = GetReportCtrl().GetRecords()->GetCount();
  299. CString strTitleNew, strTitle = GetDocument()->GetTitle();
  300. strTitle = strTitle.SpanExcluding(_T("-"));
  301. strTitle.TrimRight();
  302. if (dwPopulateTime != (DWORD)-1)
  303. {
  304. strTitleNew.Format(_T("%s - records count [%d], Operation time %.3f sec (add/remove records = %.3f sec, populate = %.3f sec)"), 
  305. strTitle, nRecordsCount,
  306. (double)(dwAddTime + dwPopulateTime) / 1000.0, 
  307. (double)dwAddTime / 1000.0, (double)dwPopulateTime / 1000.0);
  308. }
  309. else
  310. {
  311. strTitleNew.Format(_T("%s - records count [%d], Operation %.3f sec"), 
  312. strTitle, nRecordsCount, (double)(dwAddTime) / 1000.0);
  313. }
  314. GetDocument()->SetTitle(strTitleNew);
  315. // strTitle.Format(_T("Allocators: Refs (heap handle) Data = %d (%x), Row = %d (%x), Str = %d (%x)"),
  316. // CXTPReportDataAllocator::ms_dwRefs, CXTPReportDataAllocator::ms_hCustomHeap, 
  317. // CXTPReportRowAllocator::ms_dwRefs, CXTPReportRowAllocator::ms_hCustomHeap, 
  318. // CXTPReportStringAllocator::ms_dwRefs, CXTPReportStringAllocator::ms_hCustomHeap);
  319. //
  320. // CWnd* pStatusBap = &((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar;
  321. // pStatusBap->SetWindowText(strTitle);
  322. }
  323. void CReportCustomHeapView::OnViewPreviewMode() 
  324. {
  325. GetReportCtrl().EnablePreviewMode(!GetReportCtrl().IsPreviewMode());
  326. GetReportCtrl().AdjustScrollBars();
  327. GetReportCtrl().RedrawControl();
  328. }
  329. void CReportCustomHeapView::OnUpdateViewPreviewMode(CCmdUI* pCmdUI) 
  330. {
  331. pCmdUI->SetCheck(GetReportCtrl().IsPreviewMode());
  332. }
  333. void CReportCustomHeapView::OnAdd10kRecords() 
  334. {
  335. // GetReportCtrl().ResetContent();
  336. AddRecords(10000);
  337. }
  338. void CReportCustomHeapView::OnAdd20kRecords() 
  339. {
  340. // GetReportCtrl().ResetContent();
  341. AddRecords(20000);
  342. }
  343. void CReportCustomHeapView::OnBatchAdd10kRecords() 
  344. {
  345. // GetReportCtrl().ResetContent();
  346. BatchAddRecords(10000);
  347. }
  348. void CReportCustomHeapView::OnBatchAdd20kRecords() 
  349. {
  350. // GetReportCtrl().ResetContent();
  351. BatchAddRecords(20000);
  352. }
  353. void CReportCustomHeapView::OnRemoveAllRecords() 
  354. {
  355. CWaitCursor _wc;
  356. DWORD dwTime0 = ::GetTickCount();
  357. //GetReportCtrl().GetRecords()->RemoveAll();
  358. GetReportCtrl().ResetContent();
  359. DWORD dwTime1 = ::GetTickCount();
  360. //GetReportCtrl().Populate();
  361. //DWORD dwTime2 = ::GetTickCount();
  362. UpdateTitle(dwTime1 - dwTime0, (DWORD)-1);
  363. }
  364. void CReportCustomHeapView::OnRemoveHalfRecords() 
  365. {
  366. CWaitCursor _wc;
  367. DWORD dwTime0 = ::GetTickCount();
  368. CXTPReportRecords* pRecords = GetReportCtrl().GetRecords();
  369. int nRecordsToDel = pRecords->GetCount() / 2 + 1;
  370. CWnd* pStatusBap = &((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar;
  371. for (int i = 0; i < nRecordsToDel && pRecords->GetCount(); i++)
  372. {
  373. int nRand = (int)RAND_S();
  374. int nIndex = (pRecords->GetCount() * nRand) % pRecords->GetCount();
  375. if (nIndex >= 0 && nIndex < pRecords->GetCount())
  376. pRecords->RemoveAt(nIndex);
  377. if (i % 500 == 0)
  378. {
  379. CString str;
  380. str.Format(_T("Removing Records %d %%"), (i + 1) * 100 / nRecordsToDel);
  381. pStatusBap->SetWindowText(str);
  382. pStatusBap->UpdateWindow();
  383. }
  384. }
  385. pStatusBap->SetWindowText(_T(""));
  386. DWORD dwTime1 = ::GetTickCount();
  387. GetReportCtrl().Populate();
  388. DWORD dwTime2 = ::GetTickCount();
  389. UpdateTitle(dwTime1 - dwTime0, dwTime2 - dwTime1);
  390. }
  391. void CReportCustomHeapView::OnFreeExtraBatchData() 
  392. {
  393. CBatchReportRecord::FreeExtraData();
  394. CXTPReportControl::FreeRowBatchExtraData();
  395. }