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

对话框与窗口

开发平台:

Visual C++

  1. // PageKeyboard.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "PageKeyboard.h"
  5. #include "StylerView.h"
  6. #include "MainFrm.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CPageKeyboard property page
  14. IMPLEMENT_DYNCREATE(CPageKeyboard, CPropertyPage)
  15. CPageKeyboard::CPageKeyboard() 
  16. : COptionsPage(CPageKeyboard::IDD), m_wndAssign(GetMainFrame()->GetCommandBars()->GetShortcutManager())
  17. {
  18. //{{AFX_DATA_INIT(CPageKeyboard)
  19. m_strFilter = _T("");
  20. //}}AFX_DATA_INIT
  21. m_pShortcutManager = GetMainFrame()->GetCommandBars()->GetShortcutManager();
  22. }
  23. CPageKeyboard::~CPageKeyboard()
  24. {
  25. }
  26. void CPageKeyboard::DoDataExchange(CDataExchange* pDX)
  27. {
  28. COptionsPage::DoDataExchange(pDX);
  29. //{{AFX_DATA_MAP(CPageKeyboard)
  30. DDX_Control(pDX, IDC_COMBO_USED, m_cmbUsed);
  31. DDX_Control(pDX, IDC_COMBO_SHORTCUTS, m_cmbShortcuts);
  32. DDX_Control(pDX, IDC_LIST_ALL, m_wndList);
  33. DDX_Text(pDX, IDC_EDIT_FILTER, m_strFilter);
  34. //}}AFX_DATA_MAP
  35. }
  36. BEGIN_MESSAGE_MAP(CPageKeyboard, COptionsPage)
  37. //{{AFX_MSG_MAP(CPageKeyboard)
  38. ON_EN_CHANGE(IDC_EDIT_FILTER, OnFilterChange)
  39. ON_LBN_SELCHANGE(IDC_LIST_ALL, OnListChange)
  40. ON_EN_CHANGE(IDC_EDIT_ASSIGN, OnAssignChange)
  41. ON_BN_CLICKED(IDC_BUTTON_ASSIGN, OnButtonAssign)
  42. ON_BN_CLICKED(IDC_BUTTON_REMOVE, OnButtonRemove)
  43. ON_BN_CLICKED(IDC_BUTTON_RESETALL, OnButtonResetAll)
  44. //}}AFX_MSG_MAP
  45. END_MESSAGE_MAP()
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CPageKeyboard message handlers
  48. BOOL CPageKeyboard::PreTranslateMessage(MSG* pMsg) 
  49. {
  50. // TODO: Add your specialized code here and/or call the base class
  51. return COptionsPage::PreTranslateMessage(pMsg);
  52. }
  53. BOOL CPageKeyboard::OnInitDialog() 
  54. {
  55. COptionsPage::OnInitDialog();
  56. m_wndAssign.SubclassDlgItem(IDC_EDIT_ASSIGN, this);
  57. CXTPCommandBar* pMenuBar = GetMainFrame()->GetCommandBars()->GetMenuBar();
  58. ASSERT(pMenuBar);
  59. if (pMenuBar)
  60. {
  61. GetMenuStrings(pMenuBar, _T(""));
  62. }
  63. Filter();
  64. GetDlgItem(IDC_BUTTON_ASSIGN)->EnableWindow(FALSE);
  65. GetDlgItem(IDC_BUTTON_REMOVE)->EnableWindow(FALSE);
  66. return TRUE;  // return TRUE unless you set the focus to a control
  67.               // EXCEPTION: OCX Property Pages should return FALSE
  68. }
  69. void CPageKeyboard::GetMenuStrings(CXTPCommandBar* pBar, CString strPrefix)
  70. {
  71. int nCount = pBar->GetControls()->GetCount();
  72. for (int i = 0; i < nCount; i++)
  73. {
  74. CXTPControl* pControl = pBar->GetControls()->GetAt(i);
  75. CString strTitle = pControl->GetCaption();
  76. ConvertMenuItem(strTitle);
  77. if (!strTitle.IsEmpty())
  78. {
  79. if (IsPopupControlType(pControl->GetType()))
  80. {
  81. GetMenuStrings(((CXTPControlPopup*)pControl)->GetCommandBar(), strPrefix + strTitle + '.');
  82. else
  83. if (pControl->GetID())
  84. {
  85. int nId = pControl->GetID();
  86. if (! (nId >= AFX_IDM_FIRST_MDICHILD && nId < AFX_IDM_FIRST_MDICHILD + 10))
  87. if (! (
  88. nId == ID_FAVORITES_EX ||
  89. nId == ID_OPENALLFOLDERITEMS ||
  90. nId == ID_ADDPAGEHERE ||
  91. nId == ID_FAVORITE_LINK ||
  92. nId == ID_FAVORITE_FOLDER))
  93. {
  94. LISTINFO linfo;
  95. linfo.strTitle = strPrefix + strTitle;
  96. linfo.nID = nId; 
  97. m_arrMenu.Add(linfo);
  98. }
  99. }
  100. }
  101. }  
  102. }
  103. void CPageKeyboard::Filter()
  104. {
  105. UpdateData();
  106. CString strFilter(m_strFilter);
  107. strFilter.MakeLower();
  108. m_wndList.ResetContent();
  109. for(int i = 0; i < m_arrMenu.GetSize(); i++)
  110. {
  111. CString strTitle = m_arrMenu[i].strTitle;
  112. strTitle.MakeLower();
  113. if (strFilter.IsEmpty() || strTitle.Find(strFilter) != -1)
  114. {
  115. int nIndex = m_wndList.AddString(m_arrMenu[i].strTitle);
  116. m_wndList.SetItemData(nIndex, m_arrMenu[i].nID);
  117. }
  118. }
  119. }
  120. void CPageKeyboard::OnFilterChange() 
  121. {
  122. Filter();
  123. }
  124. void CPageKeyboard::OnListChange() 
  125. {
  126. m_cmbShortcuts.ResetContent();
  127. int nSlected = m_wndList.GetCurSel();
  128. if (nSlected == LB_ERR)
  129. return;
  130. DWORD nID = (DWORD)m_wndList.GetItemData(nSlected);
  131. CXTPShortcutManagerAccelTable* pAccelTable = m_pShortcutManager->GetDefaultAccelerator();
  132. BOOL bFound = FALSE;
  133. for (int i = 0; i < pAccelTable->GetCount(); i ++)
  134. {
  135. CXTPShortcutManagerAccel* accel = pAccelTable->GetAt(i);
  136. if (accel->cmd == (int)nID)
  137. {
  138. CString str;
  139. CXTPShortcutManager::CKeyHelper helper (accel, m_pShortcutManager);
  140. helper.Format (str);
  141. int nIndex = m_cmbShortcuts.AddString(str);
  142. m_cmbShortcuts.SetItemData(nIndex, i);
  143. bFound = TRUE;
  144. }
  145. }  
  146. if (bFound)
  147. m_cmbShortcuts.SetCurSel(0);
  148. GetDlgItem(IDC_BUTTON_REMOVE)->EnableWindow(bFound);
  149. }
  150. void CPageKeyboard::OnAssignChange() 
  151. {
  152. GetDlgItem(IDC_BUTTON_ASSIGN)->EnableWindow(m_wndAssign.IsKeyDefined());
  153. m_cmbUsed.ResetContent();
  154. if (!m_wndAssign.IsKeyDefined())
  155. return;
  156. const CXTPShortcutManagerAccel* pAccel = m_wndAssign.GetAccel();
  157. CXTPShortcutManagerAccelTable* pAccelTable = m_pShortcutManager->GetDefaultAccelerator();
  158. for (int i = 0; i < pAccelTable->GetCount(); i ++)
  159. {
  160. CXTPShortcutManagerAccel* accel = pAccelTable->GetAt(i);
  161. if (CXTPShortcutManager::CKeyHelper::EqualAccels(accel, pAccel))
  162. {
  163. for (int j = 0; j < m_arrMenu.GetSize(); j++)
  164. {
  165. if (m_arrMenu[j].nID == (UINT)accel->cmd)
  166. {   
  167. m_cmbUsed.AddString(m_arrMenu[j].strTitle);
  168. m_cmbUsed.SetCurSel(0);
  169. break;
  170. }
  171. }
  172. }
  173. }  
  174. }
  175. void CPageKeyboard::OnButtonAssign() 
  176. {
  177. int nSlected = m_wndList.GetCurSel();
  178. int i;
  179. if (nSlected == LB_ERR && !m_wndAssign.IsKeyDefined())
  180. {
  181. ASSERT(FALSE);
  182. return;
  183. }
  184. CXTPShortcutManagerAccel newAccel = *m_wndAssign.GetAccel();
  185. CXTPShortcutManagerAccelTable* pAccelTable = m_pShortcutManager->GetDefaultAccelerator();
  186. for (i = 0; i < pAccelTable->GetCount(); i++)
  187. {
  188. if (CXTPShortcutManager::CKeyHelper::EqualAccels(pAccelTable->GetAt(i), &newAccel))
  189. {
  190. pAccelTable->RemoveAt(i);
  191. break;
  192. }
  193. }
  194. UINT nID = (UINT)m_wndList.GetItemData(nSlected);  
  195. newAccel.cmd = (WORD)nID;
  196. pAccelTable->Add(newAccel);
  197. m_cmbShortcuts.ResetContent();
  198. BOOL bFound = FALSE;
  199. for (i = 0; i < pAccelTable->GetCount(); i ++)
  200. {
  201. CXTPShortcutManagerAccel* accel = pAccelTable->GetAt(i);
  202. if (accel->cmd == (int)nID)
  203. {
  204. CString str;
  205. CXTPShortcutManager::CKeyHelper helper (accel, m_pShortcutManager);
  206. helper.Format (str);
  207. int nIndex = m_cmbShortcuts.AddString(str);
  208. m_cmbShortcuts.SetItemData(nIndex, i);
  209. if (CXTPShortcutManager::CKeyHelper::EqualAccels(accel, &newAccel))
  210. {
  211. m_cmbShortcuts.SetCurSel(nIndex);
  212. }
  213. bFound = TRUE;
  214. }
  215. }  
  216. ASSERT(bFound);
  217. GetDlgItem(IDC_BUTTON_REMOVE)->EnableWindow(bFound);
  218. m_wndAssign.ResetKey();
  219. GetDlgItem(IDC_BUTTON_ASSIGN)->EnableWindow(FALSE);
  220. }
  221. void CPageKeyboard::OnButtonRemove() 
  222. {
  223. int nIndex = m_cmbShortcuts.GetCurSel();
  224. ASSERT(nIndex != CB_ERR);
  225. if (nIndex == CB_ERR)
  226. return;
  227. int nAccelSize = m_pShortcutManager->GetDefaultAccelerator()->GetCount();
  228. int j = (int)m_cmbShortcuts.GetItemData(nIndex);
  229. ASSERT( j >= 0 && j < nAccelSize );
  230. if (j >= 0 && j < nAccelSize)
  231. {
  232. m_pShortcutManager->GetDefaultAccelerator()->RemoveAt(j);
  233. }
  234. OnListChange();
  235. }
  236. void CPageKeyboard::OnButtonResetAll() 
  237. {
  238. m_pShortcutManager->Reset();
  239. OnListChange();
  240. }