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

对话框与窗口

开发平台:

Visual C++

  1. // XTPReportNavigator.cpp : implementation of the CXTPReportNavigator class.
  2. //
  3. // This file is a part of the XTREME REPORTCONTROL MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Resource.h"
  22. #include "Common/XTPResourceManager.h"
  23. #include "Common/XTPDrawHelpers.h"
  24. #include "Common/XTPImageManager.h"
  25. #include "Common/XTPVC80Helpers.h"
  26. #include "XTPReportNavigator.h"
  27. #include "XTPReportControl.h"
  28. #include "XTPReportRecord.h"
  29. #include "XTPReportRecordItem.h"
  30. #include "XTPReportColumn.h"
  31. #include "XTPReportColumns.h"
  32. #include "XTPReportInplaceControls.h"
  33. #ifdef _DEBUG
  34. #undef THIS_FILE
  35. static char THIS_FILE[] = __FILE__;
  36. #define new DEBUG_NEW
  37. #endif
  38. //////////////////////////////////////////////////////////////////////
  39. // CXTPReportNavigator
  40. CXTPReportNavigator::CXTPReportNavigator(CXTPReportControl* pReportControl)
  41. : m_pReportControl(pReportControl), m_bCurrentFocusInHeadersRows(FALSE), m_bCurrentFocusInFootersRows(FALSE)
  42. {
  43. }
  44. CXTPReportNavigator::~CXTPReportNavigator()
  45. {
  46. }
  47. void CXTPReportNavigator::MoveDown(BOOL bSelectBlock, BOOL bIgnoreSelection)
  48. {
  49. if  (!m_pReportControl)
  50. return;
  51. CXTPReportRow* pNextRow = NULL;
  52. CXTPReportRow* pFocusedRow = m_pReportControl->GetFocusedRow();
  53. if (m_bCurrentFocusInHeadersRows)
  54. {
  55. pNextRow = m_pReportControl->m_pHeaderRows->GetNext(pFocusedRow, m_pReportControl->m_bSkipGroupsFocus);
  56. // from the last header row jump to the first visible body row
  57. if (pFocusedRow == pNextRow)
  58. {
  59. MoveFirstVisibleRow(xtpRowTypeBody);
  60. }
  61. else
  62. {
  63. m_pReportControl->SetFocusedRow(pNextRow, bSelectBlock, bIgnoreSelection);
  64. }
  65. }
  66. else if (m_bCurrentFocusInFootersRows)
  67. {
  68. m_pReportControl->SetFocusedRow(
  69. m_pReportControl->m_pFooterRows->GetNext(pFocusedRow, m_pReportControl->m_bSkipGroupsFocus),
  70. bSelectBlock,
  71. bIgnoreSelection);
  72. }
  73. else
  74. {
  75. // body rows
  76. pNextRow = m_pReportControl->m_pRows->GetNext(pFocusedRow, m_pReportControl->m_bSkipGroupsFocus);
  77. if (pNextRow)
  78. {
  79. // from the last body row jump to the first header row
  80. if (m_pReportControl->m_nFocusedRow == pNextRow->GetIndex())
  81. {
  82. if (m_pReportControl->IsFooterRowsVisible() && m_pReportControl->IsFooterRowsAllowAccess())
  83. MoveFirstVisibleRow(xtpRowTypeFooter);
  84. }
  85. else
  86. {
  87. m_pReportControl->SetFocusedRow(pNextRow, bSelectBlock, bIgnoreSelection);
  88. }
  89. }
  90. }
  91. }
  92. void CXTPReportNavigator::MoveUp(BOOL bSelectBlock, BOOL bIgnoreSelection)
  93. {
  94. if  (!m_pReportControl)
  95. return;
  96. CXTPReportRow* pPrevRow = NULL;
  97. CXTPReportRow* pFocusedRow = m_pReportControl->GetFocusedRow();
  98. if (m_bCurrentFocusInHeadersRows)
  99. {
  100. m_pReportControl->SetFocusedRow(
  101. m_pReportControl->m_pHeaderRows->GetPrev(pFocusedRow, m_pReportControl->m_bSkipGroupsFocus),
  102. bSelectBlock,
  103. bIgnoreSelection);
  104. }
  105. else if (m_bCurrentFocusInFootersRows)
  106. {
  107. pPrevRow = m_pReportControl->m_pFooterRows->GetPrev(pFocusedRow, m_pReportControl->m_bSkipGroupsFocus);
  108. // from the first footer row jump to the last visible body row
  109. if (pFocusedRow == pPrevRow)
  110. {
  111. MoveLastVisibleRow(xtpRowTypeBody);
  112. }
  113. else
  114. {
  115. m_pReportControl->SetFocusedRow(pPrevRow, bSelectBlock, bIgnoreSelection);
  116. }
  117. }
  118. else
  119. {
  120. // body rows
  121. pPrevRow = m_pReportControl->m_pRows->GetPrev(pFocusedRow, m_pReportControl->m_bSkipGroupsFocus);
  122. if (pPrevRow)
  123. {
  124. // from the first body row jump to the last header row
  125. if (m_pReportControl->m_nFocusedRow == pPrevRow->GetIndex())
  126. {
  127. if (m_pReportControl->IsHeaderRowsVisible() && m_pReportControl->IsHeaderRowsAllowAccess())
  128. MoveLastVisibleRow(xtpRowTypeHeader);
  129. }
  130. else
  131. {
  132. m_pReportControl->SetFocusedRow(pPrevRow, bSelectBlock, bIgnoreSelection);
  133. }
  134. }
  135. }
  136. }
  137. void CXTPReportNavigator::MovePageDown(BOOL bSelectBlock, BOOL bIgnoreSelection)
  138. {
  139. if  (!m_pReportControl)
  140. return;
  141. int nCurrentRowIndex = m_pReportControl->m_nFocusedRow != -1 ? m_pReportControl->m_nFocusedRow : 0;
  142. nCurrentRowIndex = min(
  143. m_pReportControl->m_pRows->GetCount() - 1,
  144. nCurrentRowIndex + m_pReportControl->GetReportAreaRows(nCurrentRowIndex, true));
  145. m_pReportControl->SetFocusedRow(
  146. m_pReportControl->m_pRows->GetAt(nCurrentRowIndex),
  147. bSelectBlock,
  148. bIgnoreSelection);
  149. }
  150. void CXTPReportNavigator::MovePageUp(BOOL bSelectBlock, BOOL bIgnoreSelection)
  151. {
  152. if  (!m_pReportControl)
  153. return;
  154. int nCurrentRowIndex = m_pReportControl->m_nFocusedRow != -1 ? m_pReportControl->m_nFocusedRow : 0;
  155. nCurrentRowIndex = max(0, nCurrentRowIndex - m_pReportControl->GetReportAreaRows(nCurrentRowIndex, false));
  156. m_pReportControl->SetFocusedRow(
  157. m_pReportControl->m_pRows->GetAt(nCurrentRowIndex),
  158. bSelectBlock,
  159. bIgnoreSelection);
  160. }
  161. void CXTPReportNavigator::MoveFirstRow(BOOL bSelectBlock, BOOL bIgnoreSelection)
  162. {
  163. if  (!m_pReportControl)
  164. return;
  165. m_pReportControl->SetFocusedRow(
  166. m_pReportControl->m_pRows->GetAt(0),
  167. bSelectBlock,
  168. bIgnoreSelection);
  169. }
  170. void CXTPReportNavigator::MoveLastRow(BOOL bSelectBlock, BOOL bIgnoreSelection)
  171. {
  172. if  (!m_pReportControl)
  173. return;
  174. m_pReportControl->SetFocusedRow(
  175. m_pReportControl->m_pRows->GetAt(m_pReportControl->m_pRows->GetCount() - 1),
  176. bSelectBlock,
  177. bIgnoreSelection);
  178. }
  179. void CXTPReportNavigator::MoveToRow(int nRowIndex, BOOL bSelectBlock, BOOL bIgnoreSelection)
  180. {
  181. if  (!m_pReportControl)
  182. return;
  183. int nCurrentRowIndex = max(0, nRowIndex);
  184. nCurrentRowIndex = min(nCurrentRowIndex, m_pReportControl->m_pRows->GetCount() - 1);
  185. if (nCurrentRowIndex < 0)
  186. {
  187. return;
  188. }
  189. m_pReportControl->SetFocusedRow(
  190. m_pReportControl->m_pRows->GetAt(nCurrentRowIndex),
  191. bSelectBlock,
  192. bIgnoreSelection);
  193. }
  194. void CXTPReportNavigator::BeginEdit()
  195. {
  196. if  (!m_pReportControl)
  197. return;
  198. m_pReportControl->AdjustScrollBars();
  199. m_pReportControl->RedrawControl();
  200. m_pReportControl->UpdateWindow();
  201. CXTPReportRow* pFocusedRow = m_pReportControl->GetFocusedRow();
  202. if (m_pReportControl->m_pFocusedColumn &&
  203. pFocusedRow && pFocusedRow->GetRecord())
  204. {
  205. XTP_REPORTRECORDITEM_ARGS itemArgs(m_pReportControl, pFocusedRow, m_pReportControl->m_pFocusedColumn);
  206. if (itemArgs.pItem && itemArgs.pItem->IsAllowEdit(&itemArgs))
  207. {
  208. if (!m_pReportControl->IsVirtualMode())
  209. {
  210. m_pReportControl->EnsureVisible(pFocusedRow);
  211. }
  212. m_pReportControl->EditItem(&itemArgs);
  213. if (m_pReportControl->GetInplaceEdit()->GetSafeHwnd() &&
  214. m_pReportControl->GetInplaceEdit()->GetItem() == itemArgs.pItem)
  215. {
  216. CXTPReportRecordItemEditOptions* pEditOptions = itemArgs.pItem->GetEditOptions(itemArgs.pColumn);
  217. if (pEditOptions && pEditOptions->m_bSelectTextOnEdit)
  218. {
  219. m_pReportControl->GetInplaceEdit()->SetSel(0, -1);
  220. }
  221. else
  222. {
  223. CString str;
  224. m_pReportControl->GetInplaceEdit()->GetWindowText(str);
  225. m_pReportControl->GetInplaceEdit()->SetSel(str.GetLength(), str.GetLength());
  226. }
  227. }
  228. }
  229. }
  230. }
  231. void CXTPReportNavigator::MoveLeftRight(BOOL bBack, BOOL bSelectBlock, BOOL bIgnoreSelection)
  232. {
  233. if  (!m_pReportControl)
  234. return;
  235. CXTPReportControl::CUpdateContext updateContext(m_pReportControl);
  236. CXTPReportRow* pFocusedRow = m_pReportControl->GetFocusedRow();
  237. CXTPReportColumn* pFocusedColumn = m_pReportControl->GetNextFocusableColumn(pFocusedRow,
  238. m_pReportControl->m_pFocusedColumn ? m_pReportControl->m_pFocusedColumn->GetIndex() : -1,
  239. bBack ? -1 : 1);
  240. if (pFocusedColumn)
  241. {
  242. m_pReportControl->SetFocusedColumn(pFocusedColumn);
  243. }
  244. else
  245. {
  246. CXTPReportRows* pRows;
  247. int nFocusedRow = m_pReportControl->GetFocusedRow() ? m_pReportControl->GetFocusedRow()->GetIndex() : -1;
  248. switch(pFocusedRow->GetType())
  249. {
  250. case xtpRowTypeHeader : pRows = m_pReportControl->GetHeaderRows(); break;
  251. case xtpRowTypeFooter : pRows = m_pReportControl->GetFooterRows(); break;
  252. default : pRows = m_pReportControl->GetRows(); break;
  253. }
  254. CXTPReportRow* pRow = bBack ? pRows->GetPrev(pFocusedRow, FALSE) : pRows->GetNext(pFocusedRow, FALSE);
  255. if (pRow && pRow->GetIndex() != nFocusedRow)
  256. {
  257. m_pReportControl->SetFocusedRow(pRow, bSelectBlock, bIgnoreSelection);
  258. m_pReportControl->SetFocusedColumn(
  259. m_pReportControl->GetNextFocusableColumn(
  260. m_pReportControl->GetFocusedRow(),
  261. bBack ? m_pReportControl->m_pColumns->GetCount() : -1,
  262. bBack ? -1 : +1)
  263. );
  264. }
  265. }
  266. }
  267. void CXTPReportNavigator::MoveLeft(BOOL bSelectBlock, BOOL bIgnoreSelection)
  268. {
  269. MoveLeftRight(TRUE, bSelectBlock, bIgnoreSelection);
  270. }
  271. void CXTPReportNavigator::MoveRight(BOOL bSelectBlock, BOOL bIgnoreSelection)
  272. {
  273. MoveLeftRight(FALSE, bSelectBlock, bIgnoreSelection);
  274. }
  275. void CXTPReportNavigator::MoveFirstColumn()
  276. {
  277. if  (!m_pReportControl)
  278. return;
  279. CXTPReportControl::CUpdateContext updateContext(m_pReportControl);
  280. CXTPReportRow* pFocusedRow = m_pReportControl->GetFocusedRow();
  281. CXTPReportColumn* pFocusedColumn = m_pReportControl->GetNextFocusableColumn(pFocusedRow, -1, +1);
  282. if (pFocusedColumn)
  283. {
  284. m_pReportControl->SetFocusedColumn(pFocusedColumn);
  285. }
  286. }
  287. void CXTPReportNavigator::MoveLastColumn()
  288. {
  289. if  (!m_pReportControl)
  290. return;
  291. CXTPReportControl::CUpdateContext updateContext(m_pReportControl);
  292. CXTPReportRow* pFocusedRow = m_pReportControl->GetFocusedRow();
  293. CXTPReportColumn* pFocusedColumn = m_pReportControl->GetNextFocusableColumn(pFocusedRow, m_pReportControl->GetColumns()->GetCount(), -1);
  294. if (pFocusedColumn)
  295. {
  296. m_pReportControl->SetFocusedColumn(pFocusedColumn);
  297. }
  298. }
  299. void CXTPReportNavigator::MoveToColumn(int nColumnIndex, BOOL bClearIfNonFocusable)
  300. {
  301. if (!m_pReportControl)
  302. {
  303. return;
  304. }
  305. nColumnIndex = max(0, nColumnIndex);
  306. nColumnIndex = min(nColumnIndex, m_pReportControl->GetColumns()->GetCount()-1);
  307. if (nColumnIndex < 0)
  308. {
  309. return;
  310. }
  311. CXTPReportControl::CUpdateContext updateContext(m_pReportControl);
  312. CXTPReportRow* pFocusedRow = m_pReportControl->GetFocusedRow();
  313. CXTPReportColumn* pColumn = m_pReportControl->GetColumns()->GetAt(nColumnIndex);
  314. if (!pColumn)
  315. {
  316. return;
  317. }
  318. CXTPReportRecordItem* pItem = pFocusedRow->GetRecord()->GetItem(pColumn);
  319. if (!pItem || !pItem->IsFocusable())
  320. {
  321. if (bClearIfNonFocusable)
  322. {
  323. pColumn = NULL;
  324. }
  325. else
  326. {
  327. return;
  328. }
  329. }
  330. m_pReportControl->SetFocusedColumn(pColumn);
  331. }
  332. void CXTPReportNavigator::SetCurrentFocusInHeadersRows(BOOL bCurrentFocusInHeadersRows)
  333. {
  334. if(m_pReportControl->m_bHeaderRecordsVisible && m_pReportControl->m_bHeaderRowsAllowAccess)
  335. {
  336. m_bCurrentFocusInHeadersRows = bCurrentFocusInHeadersRows;
  337. }
  338. else
  339. {
  340. m_bCurrentFocusInHeadersRows = FALSE;
  341. }
  342. if (m_bCurrentFocusInHeadersRows)
  343. {
  344. MoveFirstVisibleRow(xtpRowTypeHeader);
  345. }
  346. else if (!m_bCurrentFocusInFootersRows && m_pReportControl->m_bHeaderRowsAllowAccess)
  347. {
  348. MoveFirstVisibleRow(xtpRowTypeBody);    // neither header nor footer is active
  349. }
  350. }
  351. void CXTPReportNavigator::SetCurrentFocusInFootersRows(BOOL bCurrentFocusInFootersRows)
  352. {
  353. if(m_pReportControl->m_bFooterRecordsVisible && m_pReportControl->m_bFooterRowsAllowAccess)
  354. {
  355. m_bCurrentFocusInFootersRows = bCurrentFocusInFootersRows;
  356. }
  357. else
  358. {
  359. m_bCurrentFocusInFootersRows = FALSE;
  360. }
  361. if (m_bCurrentFocusInFootersRows)
  362. {
  363. MoveFirstVisibleRow(xtpRowTypeFooter);
  364. }
  365. else if (!m_bCurrentFocusInHeadersRows && m_pReportControl->m_bFooterRowsAllowAccess)
  366. {
  367. MoveFirstVisibleRow(xtpRowTypeBody);    // neither header nor footer is active
  368. }
  369. }
  370. BOOL CXTPReportNavigator::GetCurrentFocusInHeadersRows()
  371. {
  372. return m_bCurrentFocusInHeadersRows;
  373. }
  374. BOOL CXTPReportNavigator::GetCurrentFocusInFootersRows()
  375. {
  376. return m_bCurrentFocusInFootersRows;
  377. }
  378. void CXTPReportNavigator::SetMovePosition(XTPReportRowType RowType)
  379. {
  380. switch(RowType)
  381. {
  382. case xtpRowTypeBody:    m_bCurrentFocusInHeadersRows = FALSE;   m_bCurrentFocusInFootersRows = FALSE; break;
  383. case xtpRowTypeHeader:  m_bCurrentFocusInHeadersRows = TRUE;    m_bCurrentFocusInFootersRows = FALSE; break;
  384. case xtpRowTypeFooter:  m_bCurrentFocusInHeadersRows = FALSE;   m_bCurrentFocusInFootersRows = TRUE; break;
  385. }
  386. }
  387. void CXTPReportNavigator::MoveFirstVisibleRow(XTPReportRowType TargetType)
  388. {
  389. switch(TargetType)
  390. {
  391. case xtpRowTypeBody:    m_pReportControl->SetFocusedRow(m_pReportControl->m_pRows->GetAt(m_pReportControl->m_nTopRow));
  392. break;
  393. case xtpRowTypeHeader:  if (m_pReportControl->m_pHeaderRows)
  394. {
  395. if (m_pReportControl->m_pHeaderRows->GetCount()>0)
  396. m_pReportControl->SetFocusedRow(m_pReportControl->m_pHeaderRows->GetAt(0));
  397. }
  398. break;
  399. case xtpRowTypeFooter:  if (m_pReportControl->m_pFooterRows)
  400. {
  401. if (m_pReportControl->m_pFooterRows->GetCount()>0)
  402. m_pReportControl->SetFocusedRow(m_pReportControl->m_pFooterRows->GetAt(0));
  403. }
  404. break;
  405. }
  406. }
  407. void CXTPReportNavigator::MoveLastVisibleRow(XTPReportRowType TargetType)
  408. {
  409. switch(TargetType)
  410. {
  411. case xtpRowTypeBody:    {
  412. int nRows = m_pReportControl->GetReportAreaRows(m_pReportControl->m_nTopRow, TRUE);
  413. if (nRows > -1 && m_pReportControl->m_pRows->GetCount()>0)
  414. {
  415. int nIdx = min(m_pReportControl->m_nTopRow + nRows, m_pReportControl->m_pRows->GetCount()-1);
  416. m_pReportControl->SetFocusedRow(m_pReportControl->m_pRows->GetAt(nIdx));
  417. }
  418. }
  419. break;
  420. case xtpRowTypeHeader:  if (m_pReportControl->m_pHeaderRows && m_pReportControl->m_pHeaderRows->GetCount()>0)
  421. {
  422. m_pReportControl->SetFocusedRow(
  423. m_pReportControl->m_pHeaderRows->GetAt(m_pReportControl->m_pHeaderRows->GetCount()-1));
  424. }
  425. break;
  426. case xtpRowTypeFooter:  if (m_pReportControl->m_pFooterRows && m_pReportControl->m_pFooterRows->GetCount()>0)
  427. {
  428. m_pReportControl->SetFocusedRow(
  429. m_pReportControl->m_pFooterRows->GetAt(m_pReportControl->m_pFooterRows->GetCount()-1));
  430. }
  431. break;
  432. }
  433. }
  434. //////////////////////////////////////////////////////////////////////////