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

对话框与窗口

开发平台:

Visual C++

  1. // XTPCustomizeToolbarsPage.cpp : implementation of the CXTPCustomizeToolbarsPage class.
  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 "XTPCustomizeToolbarsPage.h"
  24. #include "XTPCustomizeSheet.h"
  25. #include "XTPToolBar.h"
  26. #include "XTPCommandBars.h"
  27. #include "XTPCustomizeTools.h"
  28. #ifdef _DEBUG
  29. #define new DEBUG_NEW
  30. #undef THIS_FILE
  31. static char THIS_FILE[] = __FILE__;
  32. #endif
  33. //////////////////////////////////////////////////////////////////////////
  34. // CXTPCustomizeToolbarsPageCheckListBox
  35. CXTPCustomizeToolbarsPageCheckListBox::CXTPCustomizeToolbarsPageCheckListBox()
  36. {
  37. m_themeHelper.OpenThemeData(NULL, L"BUTTON");
  38. SIZE size;
  39. if (m_themeHelper.IsAppThemeReady() && SUCCEEDED(m_themeHelper.GetThemePartSize(NULL, BP_CHECKBOX, 0, NULL, TS_TRUE, &size)))
  40. {
  41. m_sizeCheck = size;
  42. }
  43. else
  44. {
  45. m_sizeCheck = CSize(13, 13);
  46. m_themeHelper.CloseThemeData();
  47. }
  48. }
  49. CXTPCustomizeToolbarsPageCheckListBox::~CXTPCustomizeToolbarsPageCheckListBox()
  50. {
  51. }
  52. BEGIN_MESSAGE_MAP(CXTPCustomizeToolbarsPageCheckListBox, CCheckListBox)
  53. ON_MESSAGE(WM_SETFONT, OnSetFont)
  54. END_MESSAGE_MAP()
  55. void CXTPCustomizeToolbarsPageCheckListBox::PreSubclassWindow()
  56. {
  57. CCheckListBox::PreSubclassWindow();
  58. if ((GetStyle() & (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS))
  59. == (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS))
  60. {
  61. SetItemHeight(0, max(m_sizeCheck.cy + 3, CalcMinimumItemHeight()));
  62. }
  63. }
  64. LRESULT CXTPCustomizeToolbarsPageCheckListBox::OnSetFont(WPARAM, LPARAM)
  65. {
  66. Default();
  67. if ((GetStyle() & (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS))
  68. == (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS))
  69. {
  70. SetItemHeight(0, max(m_sizeCheck.cy + 3, CalcMinimumItemHeight()));
  71. }
  72. return 0;
  73. }
  74. void CXTPCustomizeToolbarsPageCheckListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  75. {
  76. // You must override DrawItem and MeasureItem for LBS_OWNERDRAWVARIABLE
  77. ASSERT((GetStyle() & (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS)) ==
  78. (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS));
  79. CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  80. if (((LONG)(lpDrawItemStruct->itemID) >= 0) &&
  81. (lpDrawItemStruct->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)))
  82. {
  83. int cyItem = GetItemHeight(lpDrawItemStruct->itemID);
  84. BOOL fDisabled = !IsWindowEnabled() || !IsEnabled(lpDrawItemStruct->itemID);
  85. COLORREF newTextColor = fDisabled ?
  86. RGB(0x80, 0x80, 0x80) : GetSysColor(COLOR_WINDOWTEXT);  // light gray
  87. COLORREF oldTextColor = pDC->SetTextColor(newTextColor);
  88. COLORREF newBkColor = GetSysColor(COLOR_WINDOW);
  89. COLORREF oldBkColor = pDC->SetBkColor(newBkColor);
  90. if (!fDisabled && ((lpDrawItemStruct->itemState & ODS_SELECTED) != 0))
  91. {
  92. pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
  93. pDC->SetBkColor(GetSysColor(COLOR_HIGHLIGHT));
  94. }
  95. if (m_cyText == 0)
  96. VERIFY(cyItem >= CalcMinimumItemHeight());
  97. CString strText;
  98. GetText(lpDrawItemStruct->itemID, strText);
  99. pDC->ExtTextOut(lpDrawItemStruct->rcItem.left + 2,
  100. lpDrawItemStruct->rcItem.top + max(0, (cyItem - m_cyText) / 2),
  101. ETO_OPAQUE, &(lpDrawItemStruct->rcItem), strText, (int)strText.GetLength(), NULL);
  102. pDC->SetTextColor(oldTextColor);
  103. pDC->SetBkColor(oldBkColor);
  104. }
  105. if ((lpDrawItemStruct->itemAction & ODA_FOCUS) != 0)
  106. pDC->DrawFocusRect(&(lpDrawItemStruct->rcItem));
  107. }
  108. void CXTPCustomizeToolbarsPageCheckListBox::PreDrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  109. {
  110. DRAWITEMSTRUCT drawItem;
  111. memcpy(&drawItem, lpDrawItemStruct, sizeof(DRAWITEMSTRUCT));
  112. if ((((LONG)drawItem.itemID) >= 0) &&
  113. ((drawItem.itemAction & (ODA_DRAWENTIRE | ODA_SELECT)) != 0))
  114. {
  115. int cyItem = GetItemHeight(drawItem.itemID);
  116. CDC* pDC = CDC::FromHandle(drawItem.hDC);
  117. int nCheck = GetCheck(drawItem.itemID);
  118. CRect rectCheck = drawItem.rcItem;
  119. rectCheck.left += 1;
  120. rectCheck.top += 1 + max(0, (cyItem - m_sizeCheck.cy) / 2);
  121. rectCheck.right = rectCheck.left + m_sizeCheck.cx;
  122. rectCheck.bottom = rectCheck.top + m_sizeCheck.cy;
  123. CRect rectItem = drawItem.rcItem;
  124. rectItem.right = rectItem.left + m_sizeCheck.cx + 2;
  125. CRect rectCheckBox = OnGetCheckPosition(rectItem, rectCheck);
  126. if (m_themeHelper.IsAppThemeReady())
  127. {
  128. m_themeHelper.DrawThemeBackground(pDC->m_hDC, BP_CHECKBOX,
  129. nCheck ? CBS_CHECKEDNORMAL : CBS_UNCHECKEDNORMAL, &rectCheckBox, NULL);
  130. }
  131. else
  132. {
  133. ASSERT(rectCheck.IntersectRect(rectItem, rectCheckBox));
  134. ASSERT((rectCheck == rectCheckBox) && (rectCheckBox.Size() == m_sizeCheck));
  135. pDC->DrawFrameControl(rectCheckBox, DFC_BUTTON, DFCS_BUTTONCHECK | (nCheck ? DFCS_CHECKED : 0));
  136. }
  137. }
  138. drawItem.rcItem.left = drawItem.rcItem.left + m_sizeCheck.cx + 3;
  139. DrawItem(&drawItem);
  140. }
  141. BOOL CXTPCustomizeToolbarsPageCheckListBox::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam,
  142. LRESULT* pResult)
  143. {
  144. if (message == WM_DRAWITEM)
  145. {
  146. ASSERT(pResult == NULL);       // no return value expected
  147. PreDrawItem((LPDRAWITEMSTRUCT)lParam);
  148. return TRUE;
  149. }
  150. return CCheckListBox::OnChildNotify(message, wParam, lParam, pResult);
  151. }
  152. /////////////////////////////////////////////////////////////////////////////
  153. // CXTPCustomizeToolbarsPage property page
  154. IMPLEMENT_DYNCREATE(CXTPCustomizeToolbarsPage, CPropertyPage)
  155. CXTPCustomizeToolbarsPage::CXTPCustomizeToolbarsPage(CXTPCustomizeSheet* pSheet)
  156. : CPropertyPage(CXTPCustomizeToolbarsPage::IDD), m_pSheet(pSheet)
  157. {
  158. //{{AFX_DATA_INIT(CXTPCustomizeToolbarsPage)
  159. // NOTE: the ClassWizard will add member initialization here
  160. //}}AFX_DATA_INIT
  161. }
  162. CXTPCustomizeToolbarsPage::~CXTPCustomizeToolbarsPage()
  163. {
  164. }
  165. void CXTPCustomizeToolbarsPage::DoDataExchange(CDataExchange* pDX)
  166. {
  167. CPropertyPage::DoDataExchange(pDX);
  168. //{{AFX_DATA_MAP(CXTPCustomizeToolbarsPage)
  169. // NOTE: the ClassWizard will add DDX and DDV calls here
  170. DDX_Control(pDX, XTP_IDC_LIST_TOOLBARS, m_checkList);
  171. DDX_Control(pDX, XTP_IDC_BUTTON_RENAME, m_btnRename);
  172. DDX_Control(pDX, XTP_IDC_BUTTON_NEW, m_btnNew);
  173. DDX_Control(pDX, XTP_IDC_BUTTON_DELETE, m_btnDelete);
  174. DDX_Control(pDX, XTP_IDC_BUTTON_RESET, m_btnReset);
  175. //}}AFX_DATA_MAP
  176. }
  177. BOOL CXTPCustomizeToolbarsPage::OnInitDialog()
  178. {
  179. CPropertyPage::OnInitDialog();
  180. if (m_pSheet->GetCommandBars()->IsLayoutRTL())
  181. {
  182. m_checkList.ModifyStyleEx(0, WS_EX_LAYOUTRTL);
  183. }
  184. RefreshToolbarsList();
  185. return FALSE;
  186. }
  187. void CXTPCustomizeToolbarsPage::RefreshToolbarsList()
  188. {
  189. int nIndexSel = 0;
  190. int nIndex = m_checkList.GetCurSel();
  191. if (nIndex != LB_ERR)
  192. {
  193. nIndexSel = (int)m_checkList.GetItemData(nIndex);
  194. }
  195. int nTopIndex = m_checkList.GetTopIndex();
  196. m_checkList.ResetContent();
  197. CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
  198. int nCount = pCommandBars->GetCount();
  199. for (int i = 0; i < nCount; i++)
  200. {
  201. CXTPToolBar* pToolBar = pCommandBars->GetAt(i);
  202. if (!pToolBar->IsCustomizeDialogPresent())
  203. continue;
  204. if (!pToolBar->IsCloseable() && !pToolBar->IsVisible())
  205. continue;
  206. nIndex = m_checkList.AddString(pToolBar->GetTitle());
  207. m_checkList.SetCheck(nIndex, pToolBar->IsVisible());
  208. m_checkList.SetItemData(nIndex, i);
  209. if (i == nIndexSel) m_checkList.SetCurSel(nIndex);
  210. }
  211. if (m_checkList.GetTopIndex() != nTopIndex)
  212. m_checkList.SetTopIndex(nTopIndex);
  213. OnSelectionChanged();
  214. }
  215. BEGIN_MESSAGE_MAP(CXTPCustomizeToolbarsPage, CPropertyPage)
  216. //{{AFX_MSG_MAP(CXTPCustomizeToolbarsPage)
  217. // NOTE: the ClassWizard will add message map macros here
  218. ON_LBN_SELCHANGE(XTP_IDC_LIST_TOOLBARS, OnSelectionChanged)
  219. ON_CLBN_CHKCHANGE(XTP_IDC_LIST_TOOLBARS, OnChkChange)
  220. ON_BN_CLICKED(XTP_IDC_BUTTON_NEW, OnNewToolbar)
  221. ON_BN_CLICKED(XTP_IDC_BUTTON_RENAME, OnRenameToolbar)
  222. ON_BN_CLICKED(XTP_IDC_BUTTON_DELETE, OnDeleteToolbar)
  223. ON_BN_CLICKED(XTP_IDC_BUTTON_RESET, OnResetToolbar)
  224. //}}AFX_MSG_MAP
  225. END_MESSAGE_MAP()
  226. /////////////////////////////////////////////////////////////////////////////
  227. // CXTPCustomizeToolbarsPage message handlers
  228. void CXTPCustomizeToolbarsPage::OnSelectionChanged()
  229. {
  230. int nIndex = m_checkList.GetCurSel();
  231. if (nIndex != LB_ERR)
  232. {
  233. CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
  234. int i = (int)m_checkList.GetItemData(nIndex);
  235. if (i >= 0 && i < pCommandBars->GetCount())
  236. {
  237. CXTPToolBar* pToolBar = pCommandBars->GetAt(i);
  238. BOOL bBuiltIn = pToolBar->IsBuiltIn();
  239. m_btnReset.EnableWindow(bBuiltIn);
  240. m_btnRename.EnableWindow(!bBuiltIn);
  241. m_btnDelete.EnableWindow(!bBuiltIn);
  242. }
  243. }
  244. else
  245. {
  246. m_btnReset.EnableWindow(FALSE);
  247. m_btnRename.EnableWindow(FALSE);
  248. m_btnDelete.EnableWindow(FALSE);
  249. }
  250. }
  251. void CXTPCustomizeToolbarsPage::OnChkChange()
  252. {
  253. int nIndex = m_checkList.GetCurSel();
  254. if (nIndex == LB_ERR)
  255. return;
  256. CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
  257. int i = (int)m_checkList.GetItemData(nIndex);
  258. if (i >= 0 && i < pCommandBars->GetCount())
  259. {
  260. CXTPToolBar* pToolBar = pCommandBars->GetAt(i);
  261. if (!pToolBar->IsCloseable())
  262. {
  263. m_checkList.SetCheck(nIndex, 1);
  264. MessageBeep(0);
  265. }
  266. else
  267. {
  268. BOOL bVisible = m_checkList.GetCheck(nIndex);
  269. pToolBar->SetVisible(bVisible);
  270. }
  271. }
  272. RefreshToolbarsList();
  273. }
  274. void CXTPCustomizeToolbarsPage::OnNewToolbar()
  275. {
  276. CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
  277. CXTPNewToolbarDlg dlg(m_pSheet, pCommandBars);
  278. if (dlg.DoModal() == IDOK)
  279. {
  280. CXTPToolBar* pToolBar = pCommandBars->AddCustomBar(dlg.m_strToolbar, dlg.m_nNewID);
  281. RefreshToolbarsList();
  282. pCommandBars->GetSite()->SendMessage(WM_XTP_CUSTOMIZATION_ADDTOOLBAR, 0, (LPARAM)pToolBar);
  283. }
  284. }
  285. void CXTPCustomizeToolbarsPage::OnRenameToolbar()
  286. {
  287. int nIndex = m_checkList.GetCurSel();
  288. if (nIndex == LB_ERR)
  289. return;
  290. CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
  291. int i = (int)m_checkList.GetItemData(nIndex);
  292. if (i < 0 || i >= pCommandBars->GetCount())
  293. return;
  294. CXTPToolBar* pToolBar = pCommandBars->GetAt(i);
  295. if (pToolBar->IsBuiltIn())
  296. return;
  297. CXTPNewToolbarDlg dlg(m_pSheet, pCommandBars, pToolBar);
  298. if (dlg.DoModal() == IDOK)
  299. {
  300. pToolBar->SetTitle(dlg.m_strToolbar);
  301. m_checkList.DeleteString(nIndex);
  302. nIndex = m_checkList.InsertString(nIndex, pToolBar->GetTitle());
  303. m_checkList.SetCheck(nIndex, pToolBar->IsVisible());
  304. m_checkList.SetItemData(nIndex, i);
  305. m_checkList.SetCurSel(nIndex);
  306. }
  307. }
  308. void CXTPCustomizeToolbarsPage::OnDeleteToolbar()
  309. {
  310. int nIndex = m_checkList.GetCurSel();
  311. if (nIndex == LB_ERR)
  312. return;
  313. CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
  314. int i = (int)m_checkList.GetItemData(nIndex);
  315. if (i < 0 || i >= pCommandBars->GetCount())
  316. return;
  317. CXTPToolBar* pToolBar = pCommandBars->GetAt(i);
  318. if (pToolBar->IsBuiltIn())
  319. return;
  320. CString strMessage;
  321. CString strDelete;
  322. VERIFY(XTPResourceManager()->LoadString(&strDelete, XTP_IDS_CONFIRM_DELETE));
  323. strMessage.Format(strDelete, (LPCTSTR)pToolBar->GetTitle());
  324. if (m_pSheet->MessageBox(strMessage, MB_ICONWARNING | MB_OKCANCEL) == IDOK)
  325. {
  326. pCommandBars->GetSite()->SendMessage(WM_XTP_CUSTOMIZATION_DELETETOOLBAR, 0, (LPARAM)pToolBar);
  327. pCommandBars->Remove(pToolBar);
  328. RefreshToolbarsList();
  329. }
  330. }
  331. void CXTPCustomizeToolbarsPage::OnResetToolbar()
  332. {
  333. int nIndex = m_checkList.GetCurSel();
  334. if (nIndex == LB_ERR)
  335. return;
  336. CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
  337. int i = (int)m_checkList.GetItemData(nIndex);
  338. if (i < 0 || i >= pCommandBars->GetCount())
  339. return;
  340. CXTPToolBar* pToolBar = pCommandBars->GetAt(i);
  341. if (!pToolBar->IsBuiltIn())
  342. return;
  343. CString strMessage, strTitle = pToolBar->GetTitle(), strReset;
  344. VERIFY(XTPResourceManager()->LoadString(&strReset, XTP_IDS_CONFIRM_RESET));
  345. strMessage.Format(strReset, (LPCTSTR)strTitle);
  346. if (m_pSheet->MessageBox(strMessage, MB_ICONWARNING | MB_OKCANCEL) != IDOK)
  347. return;
  348. pToolBar->Reset(FALSE);
  349. RefreshToolbarsList();
  350. }