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

对话框与窗口

开发平台:

Visual C++

  1. // XTPControlExt.cpp : implementation file.
  2. //
  3. // This file is a part of the XTREME COMMANDBARS 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/XTPIntel80Helpers.h"
  24. #include "Common/XTPColorManager.h"
  25. #include "Common/XTPPropExchange.h"
  26. #include "Common/XTPVC80Helpers.h"
  27. #include "Common/XTPMarkupRender.h"
  28. #include "Common/XTPImageManager.h"
  29. #include "XTPControlExt.h"
  30. #include "XTPMouseManager.h"
  31. #include "XTPControls.h"
  32. #include "XTPToolBar.h"
  33. #include "XTPPopupBar.h"
  34. #include "XTPControlPopup.h"
  35. #include "XTPCommandBars.h"
  36. #include "TabManager/XTPTabManager.h"
  37. #include "XTPTabClientWnd.h"
  38. #include "XTPPaintManager.h"
  39. #ifdef _DEBUG
  40. #define new DEBUG_NEW
  41. #undef THIS_FILE
  42. static char THIS_FILE[] = __FILE__;
  43. #endif
  44. UINT CXTPControlWindowList::m_nFistMDIChild = AFX_IDM_FIRST_MDICHILD;
  45. UINT CXTPControlWindowList::m_nItemCount = 9;
  46. BOOL CXTPControlWindowList::m_bShowRadioButtons = FALSE;
  47. //////////////////////////////////////////////////////////////////////////
  48. // CXTPControlWindowList
  49. IMPLEMENT_XTP_CONTROL(CXTPControlWindowList, CXTPControlButton)
  50. CString CXTPControlWindowList::ConstructCaption(const CString& lpszTitle, int nIndex)
  51. {
  52. CString strTemp;
  53. // double up any '&' characters so they are not underlined
  54. LPCTSTR lpszSrc = lpszTitle;
  55. LPTSTR lpszDest = strTemp.GetBuffer(lpszTitle.GetLength() * 2);
  56. while (*lpszSrc != 0)
  57. {
  58. if (*lpszSrc == '&')
  59. *lpszDest++ = '&';
  60. if (_istlead(*lpszSrc))
  61. *lpszDest++ = *lpszSrc++;
  62. *lpszDest++ = *lpszSrc++;
  63. }
  64. *lpszDest = 0;
  65. strTemp.ReleaseBuffer();
  66. CString strTitle;
  67. if (nIndex == 0)
  68. return strTemp;
  69. if (nIndex < 10)
  70. {
  71. strTitle.Format(_T("&%i %s"), nIndex, (LPCTSTR)strTemp);
  72. }
  73. else if (nIndex == 10)
  74. {
  75. strTitle.Format(_T("1&0 %s"), (LPCTSTR)strTemp);
  76. }
  77. else
  78. {
  79. strTitle.Format(_T("%i %s"), nIndex, (LPCTSTR)strTemp);
  80. }
  81. return strTitle;
  82. }
  83. void CXTPControlWindowList::OnCalcDynamicSize(DWORD /*dwMode*/)
  84. {
  85. ASSERT(m_pControls->GetAt(m_nIndex) == this);
  86. while (m_nIndex + 1 < m_pControls->GetCount())
  87. {
  88. CXTPControl* pControl = m_pControls->GetAt(m_nIndex + 1);
  89. if (pControl->GetID() >= (int)m_nFistMDIChild)
  90. {
  91. m_pControls->Remove(pControl);
  92. }
  93. else break;
  94. }
  95. CMDIFrameWnd* pFrame = DYNAMIC_DOWNCAST(CMDIFrameWnd, m_pParent->GetSite());
  96. HWND hWndClient = pFrame ? pFrame->m_hWndMDIClient : NULL;
  97. if (m_pParent->IsCustomizeMode() || hWndClient == NULL)
  98. {
  99. m_dwHideFlags = 0;
  100. return;
  101. }
  102. m_dwHideFlags |= xtpHideGeneric;
  103. int nIndex = m_nIndex + 1;
  104. CString strTitle;
  105. HWND hWndActive = (HWND)::SendMessage(hWndClient, WM_MDIGETACTIVE, 0, 0);
  106. if (hWndActive)
  107. {
  108. int nID = GetDlgCtrlID(hWndActive);
  109. if (nID < 0x802F && nID >= 0x8000)
  110. m_nFistMDIChild = 0x8000;
  111. if (nID < 0x2F && nID >= 1)
  112. m_nFistMDIChild = 1;
  113. }
  114. int nID = m_nFistMDIChild;
  115. HWND hWndChild = ::GetDlgItem(hWndClient, nID);
  116. while (hWndChild)
  117. {
  118. if (::IsWindowVisible(hWndChild))
  119. {
  120. CXTPDrawHelpers::GetWindowCaption(hWndChild, strTitle);
  121. CXTPControl* pControl = m_pControls->Add(m_bShowRadioButtons ? xtpControlRadioButton : xtpControlButton,
  122. nID, _T(""), nIndex, TRUE);
  123. pControl->SetCaption(ConstructCaption(strTitle, nIndex - m_nIndex));
  124. pControl->SetBeginGroup(nIndex == m_nIndex + 1);
  125. pControl->SetChecked(hWndActive == hWndChild);
  126. pControl->SetFlags(xtpFlagManualUpdate);
  127. pControl->SetHelpId(AFX_IDS_MDICHILD);
  128. if ((GetFlags() & xtpFlagWrapRow) && nIndex == m_nIndex + 1)
  129. pControl->SetFlags(pControl->GetFlags() | xtpFlagWrapRow);
  130. CString strPrompt;
  131. VERIFY(strPrompt.LoadString(AFX_IDS_MDICHILD));
  132. pControl->SetPrompt(strPrompt);
  133. nIndex++;
  134. if (nIndex - m_nIndex > (int)m_nItemCount)
  135. break;
  136. }
  137. hWndChild = ::GetDlgItem(hWndClient, ++nID);
  138. }
  139. }
  140. BOOL CXTPControlWindowList::IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint /*point*/, DROPEFFECT& dropEffect)
  141. {
  142. if (pCommandBar->GetType() != xtpBarTypePopup)
  143. {
  144. dropEffect = DROPEFFECT_NONE;
  145. return FALSE;
  146. }
  147. return TRUE;
  148. }
  149. //////////////////////////////////////////////////////////////////////////
  150. // CXTPControlToolbars
  151. void CXTPControlToolbars::CXTPControlToolbar::OnExecute()
  152. {
  153. CXTPCommandBars* pCommandBars = GetParent()->GetCommandBars();
  154. pCommandBars->ClosePopups();
  155. if (pCommandBars) pCommandBars->ToggleVisible((int)GetTag());
  156. }
  157. IMPLEMENT_XTP_CONTROL(CXTPControlToolbars, CXTPControlButton)
  158. CXTPControlToolbars::CXTPControlToolbars()
  159. {
  160. }
  161. void CXTPControlToolbars::CreateToolbarMenu(CXTPCommandBar* pPopupBar, int nInsert, int nID, BOOL bAddCustomizeButton, BOOL bBeginGroup)
  162. {
  163. CXTPCommandBars* pCommandBars = pPopupBar->GetCommandBars();
  164. if (!pCommandBars)
  165. return;
  166. int nIndex = 0;
  167. int nCount = pCommandBars->GetCount();
  168. for (int i = 0; i < nCount; i++)
  169. {
  170. CXTPToolBar* pBar = pCommandBars->GetAt(i);
  171. if (pBar->IsContextMenuPresent() && pBar->IsCloseable())
  172. {
  173. CXTPControl* pButton = pPopupBar->GetControls()->Add(new CXTPControlToolbar(), nID, _T("CXTPControlToolbar"), nInsert, TRUE);
  174. pButton->SetTag(nIndex);
  175. pButton->SetBeginGroup(bBeginGroup);
  176. pButton->SetCaption(CXTPControlWindowList::ConstructCaption(pBar->GetTitle(), 0));
  177. pButton->SetFlags(xtpFlagManualUpdate);
  178. pButton->SetChecked(pBar->IsVisible());
  179. nInsert++;
  180. bBeginGroup = FALSE;
  181. }
  182. nIndex++;
  183. }
  184. if (bAddCustomizeButton && pCommandBars->m_bCustomizeAvail)
  185. {
  186. CXTPControl* pControlCustomize = pPopupBar->GetControls()->Add(xtpControlButton, XTP_ID_CUSTOMIZE);
  187. pControlCustomize->SetBeginGroup(TRUE);
  188. }
  189. }
  190. void CXTPControlToolbars::OnCalcDynamicSize(DWORD /*dwMode*/)
  191. {
  192. while (m_nIndex + 1 < m_pControls->GetCount())
  193. {
  194. CXTPControl* pControl = m_pControls->GetAt(m_nIndex + 1);
  195. if (pControl->GetParameter() == _T("CXTPControlToolbar"))
  196. {
  197. m_pControls->Remove(pControl);
  198. }
  199. else break;
  200. }
  201. if (m_pParent->IsCustomizeMode())
  202. {
  203. m_dwHideFlags = 0;
  204. return;
  205. }
  206. m_dwHideFlags |= xtpHideGeneric;
  207. CreateToolbarMenu(m_pParent, m_nIndex + 1, GetID(), FALSE, GetBeginGroup());
  208. }
  209. BOOL CXTPControlToolbars::IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint /*point*/, DROPEFFECT& dropEffect)
  210. {
  211. if (pCommandBar->GetType() != xtpBarTypePopup)
  212. {
  213. dropEffect = DROPEFFECT_NONE;
  214. return FALSE;
  215. }
  216. return TRUE;
  217. }
  218. //////////////////////////////////////////////////////////////////////////
  219. // CXTPControlOleItems
  220. IMPLEMENT_XTP_CONTROL(CXTPControlOleItems, CXTPControlButton)
  221. void CXTPControlOleItems::OnCalcDynamicSize(DWORD /*dwMode*/)
  222. {
  223. ASSERT(m_pControls->GetAt(m_nIndex) == this);
  224. if (m_nIndex + 1 < m_pControls->GetCount())
  225. {
  226. CXTPControl* pControl = m_pControls->GetAt(m_nIndex + 1);
  227. if (pControl->GetParameter() == _T("OLEMENUPOPUP"))
  228. {
  229. m_pControls->Remove(pControl);
  230. }
  231. }
  232. if (m_pParent->IsCustomizeMode())
  233. {
  234. m_dwHideFlags = 0;
  235. return;
  236. }
  237. m_dwHideFlags |= xtpHideGeneric;
  238. CFrameWnd* pActiveFrame = m_pParent->GetFrameSite();
  239. if (!pActiveFrame)
  240. return;
  241. CFrameWnd* pFrame = pActiveFrame->GetActiveFrame();
  242. if (pFrame == NULL || pFrame->GetActiveView() == NULL)
  243. return;
  244. CView* pView = pFrame->GetActiveView();
  245. CDocument* pDocument = pView->GetDocument();
  246. if (pDocument == NULL || DYNAMIC_DOWNCAST(COleDocument, pDocument) == NULL)
  247. return;
  248. // check for single selection
  249. COleClientItem* pItem = ((COleDocument*)pDocument)->GetPrimarySelectedItem(pView);
  250. if (pItem == NULL || pItem->GetType() == OT_STATIC)
  251. {
  252. // no selection, or is 'static' item
  253. return;
  254. }
  255. int nConvertID = 0;
  256. CMenu mnuOlePopup;
  257. mnuOlePopup.CreatePopupMenu();
  258. // update the menu
  259. AfxOleSetEditMenu(pItem, &mnuOlePopup, 0,
  260. ID_OLE_VERB_FIRST, ID_OLE_VERB_LAST, nConvertID);
  261. if (mnuOlePopup.GetMenuItemCount() != 1)
  262. return;
  263. CMenu* pMenu = mnuOlePopup.GetSubMenu(0);
  264. if (pMenu == NULL)
  265. return;
  266. CXTPPopupBar* pBar = CXTPPopupBar::CreatePopupBar(m_pParent->GetCommandBars());
  267. pBar->LoadMenu(pMenu);
  268. CXTPControlPopup* pPopup = (CXTPControlPopup*)m_pControls->Add(xtpControlPopup, 0, _T("OLEMENUPOPUP"), m_nIndex + 1, TRUE);
  269. pPopup->SetCommandBar(pBar);
  270. pBar->InternalRelease();
  271. CString strTitle;
  272. mnuOlePopup.GetMenuString(0, strTitle, MF_BYPOSITION);
  273. pPopup->SetCaption(strTitle);
  274. }
  275. BOOL CXTPControlOleItems::IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint /*point*/, DROPEFFECT& dropEffect)
  276. {
  277. if (pCommandBar->GetType() != xtpBarTypePopup)
  278. {
  279. dropEffect = DROPEFFECT_NONE;
  280. return FALSE;
  281. }
  282. return TRUE;
  283. }
  284. //////////////////////////////////////////////////////////////////////////
  285. // CXTPControlRecentFileList
  286. IMPLEMENT_XTP_CONTROL(CXTPControlRecentFileList, CXTPControlButton)
  287. CRecentFileList* CXTPControlRecentFileList::GetRecentFileList()
  288. {
  289. USES_PROTECTED_ACCESS(CXTPControlRecentFileList, CWinApp, CRecentFileList*, m_pRecentFileList)
  290. return PROTECTED_ACCESS(CWinApp, AfxGetApp(), m_pRecentFileList);
  291. }
  292. int CXTPControlRecentFileList::GetFirstMruID()
  293. {
  294. return ID_FILE_MRU_FILE1;
  295. }
  296. void CXTPControlRecentFileList::OnCalcDynamicSize(DWORD /*dwMode*/)
  297. {
  298. CRecentFileList* pRecentFileList = GetRecentFileList();
  299. if (!pRecentFileList)
  300. return;
  301. ASSERT(pRecentFileList->m_arrNames != NULL);
  302. if (!pRecentFileList->m_arrNames)
  303. return;
  304. while (m_nIndex + 1 < m_pControls->GetCount())
  305. {
  306. CXTPControl* pControl = m_pControls->GetAt(m_nIndex + 1);
  307. if (pControl->GetID() >= GetFirstMruID() && pControl->GetID() <= GetFirstMruID() + pRecentFileList->m_nSize)
  308. {
  309. m_pControls->Remove(pControl);
  310. }
  311. else break;
  312. }
  313. if (m_pParent->IsCustomizeMode())
  314. {
  315. m_dwHideFlags = 0;
  316. SetEnabled(TRUE);
  317. return;
  318. }
  319. if (pRecentFileList->m_arrNames[0].IsEmpty())
  320. {
  321. m_dwHideFlags = 0;
  322. SetEnabled(FALSE);
  323. return;
  324. }
  325. m_dwHideFlags |= xtpHideGeneric;
  326. TCHAR szCurDir[_MAX_PATH + 1];
  327. GetCurrentDirectory(_MAX_PATH, szCurDir);
  328. int nCurDir = lstrlen(szCurDir);
  329. szCurDir[nCurDir] = '\';
  330. szCurDir[++nCurDir] = '';
  331. CString strName;
  332. CString strTemp;
  333. for (int iMRU = 0; iMRU < pRecentFileList->m_nSize; iMRU++)
  334. {
  335. if (!pRecentFileList->GetDisplayName(strName, iMRU, szCurDir, nCurDir))
  336. break;
  337. CXTPControl* pControl = m_pControls->Add(xtpControlButton, iMRU + GetFirstMruID(), _T(""), m_nIndex + iMRU + 1 , TRUE);
  338. pControl->SetCaption(CXTPControlWindowList::ConstructCaption(strName, iMRU + 1));
  339. pControl->SetFlags(xtpFlagManualUpdate);
  340. pControl->SetBeginGroup(iMRU == 0 && m_nIndex != 0);
  341. if ((GetFlags() & xtpFlagWrapRow) && iMRU == 0)
  342. pControl->SetFlags(pControl->GetFlags() | xtpFlagWrapRow);
  343. }
  344. }
  345. BOOL CXTPControlRecentFileList::IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint /*point*/, DROPEFFECT& dropEffect)
  346. {
  347. if (pCommandBar->GetType() != xtpBarTypePopup)
  348. {
  349. dropEffect = DROPEFFECT_NONE;
  350. return FALSE;
  351. }
  352. return TRUE;
  353. }
  354. //////////////////////////////////////////////////////////////////////////
  355. // CXTPControlSelector
  356. IMPLEMENT_XTP_CONTROL(CXTPControlSelector, CXTPControl)
  357. CXTPControlSelector::CXTPControlSelector()
  358. {
  359. m_bLockUpdate = FALSE;
  360. m_szItemsCount = CSize(5, 4);
  361. m_szItemsMax = CSize(12, 12);
  362. m_szItem = CSize(28, 28);
  363. }
  364. void CXTPControlSelector::OnDrawItem(CDC* /*pDC*/, CRect /*rcItem*/, COLORREF /*clrText*/)
  365. {
  366. }
  367. void CXTPControlSelector::Draw(CDC* pDC)
  368. {
  369. CXTPPaintManager* pPaintManager = GetPaintManager();
  370. CRect rcControl = GetRect();
  371. for (int x = 0; x < m_szItemsVisible.cx; x++)
  372. for (int y = 0; y < m_szItemsVisible.cy; y++)
  373. {
  374. CRect rcItem(rcControl.left + x * m_szItem.cx, rcControl.top + y * m_szItem.cy, rcControl.left + (x + 1)* m_szItem.cx, rcControl.top + (y + 1) * m_szItem.cy);
  375. rcItem.DeflateRect(1, 1, 1, 1);
  376. COLORREF clrText = pPaintManager->GetXtremeColor(XPCOLOR_TOOLBAR_TEXT);
  377. if (x < m_szItemsActive.cx && y < m_szItemsActive.cy)
  378. {
  379. pDC->FillSolidRect(rcItem, GetXtremeColor(COLOR_HIGHLIGHT));
  380. clrText = GetXtremeColor(COLOR_HIGHLIGHTTEXT);
  381. }
  382. else
  383. {
  384. pDC->FillSolidRect(rcItem, GetXtremeColor(COLOR_WINDOW));
  385. }
  386. pDC->Draw3dRect(rcItem, pPaintManager->GetXtremeColor(XPCOLOR_MENUBAR_BORDER), pPaintManager->GetXtremeColor(XPCOLOR_MENUBAR_BORDER));
  387. OnDrawItem(pDC, rcItem, clrText);
  388. }
  389. }
  390. CSize CXTPControlSelector::GetSize(CDC* /*pDC*/)
  391. {
  392. return CSize (m_szItem.cx * m_szItemsVisible.cx, m_szItem.cy * m_szItemsVisible.cy);
  393. }
  394. void CXTPControlSelector::OnLButtonUp(CPoint /*point*/)
  395. {
  396. if (m_szItemsActive != CSize(0))
  397. {
  398. m_szResult = m_szItemsActive;
  399. OnExecute();
  400. }
  401. }
  402. BOOL CXTPControlSelector::OnSetSelected(int bSelected)
  403. {
  404. if (!bSelected)
  405. {
  406. CPoint point;
  407. GetCursorPos(&point);
  408. GetParent()->ScreenToClient(&point);
  409. CRect rcControl = GetRect();
  410. CSize szItemsVisible = m_szItemsVisible;
  411. if (GetKeyState(VK_LBUTTON) < 0)
  412. {
  413. if (point.x >= rcControl.right)
  414. {
  415. szItemsVisible.cx = min(m_szItemsMax.cx, (point.x - rcControl.left) / m_szItem.cx + 1);
  416. }
  417. if (point.y >= rcControl.bottom)
  418. {
  419. szItemsVisible.cy = min(m_szItemsMax.cy, (point.y - rcControl.top) / m_szItem.cy + 1);
  420. }
  421. }
  422. if (szItemsVisible != m_szItemsVisible)
  423. {
  424. m_szItemsVisible = szItemsVisible;
  425. SetItemsActive(m_szItemsActive, TRUE);
  426. m_bLockUpdate = TRUE;
  427. GetParent()->OnRecalcLayout();
  428. m_bLockUpdate = FALSE;
  429. OnMouseMove(point);
  430. }
  431. else
  432. {
  433. SetItemsActive(0);
  434. }
  435. }
  436. return CXTPControl::OnSetSelected(bSelected);
  437. }
  438. void CXTPControlSelector::OnCalcDynamicSize(DWORD dwMode)
  439. {
  440. CXTPControl::OnCalcDynamicSize(dwMode);
  441. if (!m_bLockUpdate)
  442. {
  443. m_szItemsActive = CSize(0);
  444. m_szItemsVisible = m_szItemsCount;
  445. }
  446. SetItemsActive(m_szItemsActive, TRUE);
  447. }
  448. void CXTPControlSelector::SetItemsActive(CSize szActive, BOOL bNotify)
  449. {
  450. if (szActive != m_szItemsActive || bNotify)
  451. {
  452. m_szItemsActive = szActive;
  453. RedrawParent();
  454. NotifySite(XTP_SLN_SELCHANGE);
  455. }
  456. }
  457. void CXTPControlSelector::OnMouseMove(CPoint point)
  458. {
  459. CSize szActive(0);
  460. CRect rcControl = GetRect();
  461. for (int x = 0; x < m_szItemsVisible.cx; x++)
  462. {
  463. if (point.x > rcControl.left + x * m_szItem.cx)
  464. szActive.cx = x + 1;
  465. }
  466. for (int y = 0; y < m_szItemsVisible.cy; y++)
  467. {
  468. if (point.y > rcControl.top + y * m_szItem.cy)
  469. szActive.cy = y + 1;
  470. }
  471. SetItemsActive(szActive);
  472. }
  473. void CXTPControlSelector::Copy(CXTPControl* pControl, BOOL bRecursive)
  474. {
  475. ASSERT_KINDOF(CXTPControlSelector, pControl);
  476. CXTPControl::Copy(pControl, bRecursive);
  477. m_szItemsCount = ((CXTPControlSelector*)pControl)->m_szItemsCount;
  478. m_szItemsMax = ((CXTPControlSelector*)pControl)->m_szItemsMax;
  479. m_szItem = ((CXTPControlSelector*)pControl)->m_szItem;
  480. }
  481. void CXTPControlSelector::DoPropExchange(CXTPPropExchange* pPX)
  482. {
  483. CXTPControl::DoPropExchange(pPX);
  484. PX_Size(pPX, _T("ItemsCount"), m_szItemsCount, CSize(0, 0));
  485. PX_Size(pPX, _T("ItemsMax"), m_szItemsMax, CSize(0, 0));
  486. PX_Size(pPX, _T("ItemSize"), m_szItem, CSize(0, 0));
  487. }
  488. //////////////////////////////////////////////////////////////////////////
  489. // CXTPControlWorkspaceActions
  490. IMPLEMENT_XTP_CONTROL(CXTPControlWorkspaceActions, CXTPControlButton)
  491. void CXTPControlWorkspaceActions::AddCommand(CXTPTabClientWnd* pClient, UINT nID, int& nIndex)
  492. {
  493. if (pClient->IsWorkspaceCommandEnabled(nID))
  494. {
  495. m_pControls->Add(xtpControlButton, nID, _T(""), nIndex++, TRUE);
  496. }
  497. }
  498. void CXTPControlWorkspaceActions::OnCalcDynamicSize(DWORD /*dwMode*/)
  499. {
  500. ASSERT(m_pControls->GetAt(m_nIndex) == this);
  501. if (!m_pParent)
  502. return;
  503. while (m_nIndex + 1 < m_pControls->GetCount())
  504. {
  505. CXTPControl* pControl = m_pControls->GetAt(m_nIndex + 1);
  506. if (pControl->GetID() >= XTP_ID_WORKSPACE_MOVEPREVIOUS && pControl->GetID() <= XTP_ID_WORKSPACE_NEWVERTICAL)
  507. {
  508. m_pControls->Remove(pControl);
  509. }
  510. else break;
  511. }
  512. CMDIFrameWnd* pFrame = DYNAMIC_DOWNCAST(CMDIFrameWnd, m_pParent->GetSite());
  513. HWND hWndClient = pFrame ? pFrame->m_hWndMDIClient : NULL;
  514. CXTPTabClientWnd* pClient = DYNAMIC_DOWNCAST(CXTPTabClientWnd, CWnd::FromHandlePermanent(hWndClient));
  515. if (pClient == NULL)
  516. return;
  517. m_dwHideFlags |= xtpHideGeneric;
  518. int nIndex = m_nIndex + 1;
  519. AddCommand(pClient, XTP_ID_WORKSPACE_NEWHORIZONTAL, nIndex);
  520. AddCommand(pClient, XTP_ID_WORKSPACE_NEWVERTICAL, nIndex);
  521. AddCommand(pClient, XTP_ID_WORKSPACE_MOVEPREVIOUS, nIndex);
  522. AddCommand(pClient, XTP_ID_WORKSPACE_MOVENEXT, nIndex);
  523. if (nIndex != m_nIndex + 1)
  524. m_pControls->GetAt(m_nIndex + 1)->SetBeginGroup(GetBeginGroup());
  525. }
  526. //////////////////////////////////////////////////////////////////////////
  527. //
  528. IMPLEMENT_XTP_CONTROL(CXTPControlLabel, CXTPControl)
  529. void CXTPControlLabel::OnClick(BOOL bKeyboard, CPoint pt)
  530. {
  531. if (!bKeyboard && IsCustomizeMode() && IsCustomizeMovable())
  532. {
  533. m_pParent->SetPopuped(-1);
  534. m_pParent->SetSelected(-1);
  535. CustomizeStartDrag(pt);
  536. return;
  537. }
  538. }
  539. //////////////////////////////////////////////////////////////////////////
  540. // CXTPControlCheckBox
  541. IMPLEMENT_XTP_CONTROL(CXTPControlCheckBox, CXTPControlButton)
  542. CXTPControlCheckBox::CXTPControlCheckBox()
  543. {
  544. m_controlType = xtpControlCheckBox;
  545. }
  546. //////////////////////////////////////////////////////////////////////////
  547. // CXTPControlRadioButton
  548. IMPLEMENT_XTP_CONTROL(CXTPControlRadioButton, CXTPControlButton)
  549. CXTPControlRadioButton::CXTPControlRadioButton()
  550. {
  551. m_controlType = xtpControlRadioButton;
  552. }
  553. //////////////////////////////////////////////////////////////////////////
  554. // CXTPControlMarkupLabel
  555. IMPLEMENT_XTP_CONTROL(CXTPControlMarkupLabel, CXTPControlLabel)
  556. CXTPControlMarkupLabel::CXTPControlMarkupLabel()
  557. {
  558. m_pMarkupUIElement = NULL;
  559. }
  560. CXTPControlMarkupLabel::~CXTPControlMarkupLabel()
  561. {
  562. XTPMarkupReleaseElement(m_pMarkupUIElement);
  563. }
  564. void CXTPControlMarkupLabel::OnCaptionChanged()
  565. {
  566. XTPMarkupReleaseElement(m_pMarkupUIElement);
  567. CXTPMarkupContext* pContext = XTPMarkupCreateContext(0);
  568. m_pMarkupUIElement = XTPMarkupParseText(pContext, m_strCaption);
  569. XTPMarkupReleaseContext(pContext);
  570. }
  571. CSize CXTPControlMarkupLabel::GetSize(CDC* pDC)
  572. {
  573. if (!m_pMarkupUIElement)
  574. {
  575. return CXTPControlLabel::GetSize(pDC);
  576. }
  577. CFont* pFont = GetPaintManager()->GetRegularFont();
  578. XTPMarkupSetDefaultFont(XTPMarkupElementContext(m_pMarkupUIElement), (HFONT)pFont->GetSafeHandle(), COLORREF_NULL);
  579. return XTPMarkupMeasureElement(m_pMarkupUIElement, INT_MAX, INT_MAX);
  580. }
  581. void CXTPControlMarkupLabel::Draw(CDC* pDC)
  582. {
  583. if (!m_pMarkupUIElement)
  584. {
  585. CXTPControlLabel::Draw(pDC);
  586. }
  587. else
  588. {
  589. CFont* pFont = GetPaintManager()->GetRegularFont();
  590. COLORREF clrText = GetPaintManager()->GetRectangleTextColor(FALSE, FALSE, GetEnabled(), FALSE, FALSE, GetParent()->GetType(), GetParent()->GetPosition());
  591. XTPMarkupSetDefaultFont(XTPMarkupElementContext(m_pMarkupUIElement), (HFONT)pFont->GetSafeHandle(), clrText);
  592. XTPMarkupRenderElement(m_pMarkupUIElement, pDC->GetSafeHdc(), GetRect());
  593. }
  594. }
  595. //////////////////////////////////////////////////////////////////////////
  596. // CXTPControlBitmap
  597. IMPLEMENT_XTP_CONTROL(CXTPControlBitmap, CXTPControlLabel)
  598. CXTPControlBitmap::CXTPControlBitmap()
  599. {
  600. }
  601. CSize CXTPControlBitmap::GetSize(CDC* /*pDC*/)
  602. {
  603. CXTPImageManagerIcon* pIcon = GetImageManager()->GetImage(m_nId, ICON_BIG);
  604. if (!pIcon)
  605. return CSize(0, 0);
  606. return pIcon->GetExtent();
  607. }
  608. void CXTPControlBitmap::Draw(CDC* pDC)
  609. {
  610. CXTPImageManagerIcon* pIcon = GetImageManager()->GetImage(m_nId, ICON_BIG);
  611. if (pIcon)
  612. {
  613. pIcon->Draw(pDC, GetRect().TopLeft());
  614. }
  615. }
  616. //////////////////////////////////////////////////////////////////////////
  617. // CXTPControlHyperlink
  618. IMPLEMENT_XTP_CONTROL(CXTPControlHyperlink, CXTPControl)
  619. CXTPControlHyperlink::CXTPControlHyperlink()
  620. {
  621. m_hCursor = AfxGetApp()->LoadStandardCursor(MAKEINTRESOURCE(32649));
  622. }
  623. CSize CXTPControlHyperlink::GetSize(CDC* pDC)
  624. {
  625. CFont* pFont = GetPaintManager()->GetRegularFont();
  626. CXTPFontDC font(pDC, pFont);
  627. CSize sz = pDC->GetTextExtent(GetCaption());
  628. return sz;
  629. }
  630. void CXTPControlHyperlink::Draw(CDC* pDC)
  631. {
  632. CFont* pFont = GetPaintManager()->GetRegularFont();
  633. CXTPFontDC font(pDC, pFont);
  634. pDC->SetTextColor(!GetEnabled() ? GetXtremeColor(COLOR_GRAYTEXT) : GetSelected() ? RGB(255, 0, 0) : RGB(0, 0, 255));
  635. CXTPPaintManager::DrawTextApi(pDC, GetCaption(), GetRect(), DT_SINGLELINE | DT_NOPREFIX, HasDwmCompositedRect());
  636. }
  637. void CXTPControlHyperlink::OnClick(BOOL /*bKeyboard*/, CPoint /*pt*/)
  638. {
  639. OnExecute();
  640. }
  641. void CXTPControlHyperlink::OnExecute()
  642. {
  643. ::ShellExecute(NULL, _T("open"), m_strTooltipText, NULL, NULL, SW_SHOW);
  644. }
  645. void CXTPControlHyperlink::OnMouseMove(CPoint /*point*/)
  646. {
  647. SetCursor(m_hCursor);
  648. }