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

对话框与窗口

开发平台:

Visual C++

  1. // CustomizePageTools.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO 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 "CustomizeDlg.h"
  22. #include "CustomizePageTools.h"
  23. #include <io.h>
  24. #ifdef _DEBUG
  25. #define new DEBUG_NEW
  26. #undef THIS_FILE
  27. static char THIS_FILE[] = __FILE__;
  28. #endif
  29. CToolsList CCustomizePageTools::m_lstTools;
  30. void CToolRec::Serialize(CArchive& ar)
  31. {
  32. if (ar.IsStoring())
  33. {
  34. ar << m_strTitle << m_strArg << m_strCmd << m_strDir;
  35. }
  36. else
  37. {
  38. ar >> m_strTitle >> m_strArg >> m_strCmd >> m_strDir;
  39. }
  40. }
  41. template <> void AFXAPI SerializeElements <CToolRec> ( CArchive& ar, CToolRec* pNewTool, INT_PTR nCount )
  42. {
  43. for ( int i = 0; i < nCount; i++, pNewTool++ )
  44. {
  45. // Serialize each CToolRec object
  46. pNewTool->Serialize( ar );
  47. }
  48. }
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CCustomizePageTools property page
  51. IMPLEMENT_DYNCREATE(CCustomizePageTools, CPropertyPage)
  52. CCustomizePageTools::CCustomizePageTools() : CPropertyPage(CCustomizePageTools::IDD)
  53. {
  54. //{{AFX_DATA_INIT(CCustomizePageTools)
  55. m_strToolsDir = _T( "" );
  56. m_strToolsArg = _T( "" );
  57. m_strToolsCmd = _T( "" );
  58. //}}AFX_DATA_INIT
  59. }
  60. CCustomizePageTools::~CCustomizePageTools()
  61. {
  62. }
  63. void CCustomizePageTools::DoDataExchange(CDataExchange* pDX)
  64. {
  65. CPropertyPage::DoDataExchange(pDX);
  66. //{{AFX_DATA_MAP(CCustomizePageTools)
  67. DDX_Control(pDX, IDC_TXT_TOOLSDIR, m_txtToolsDir);
  68. DDX_Control(pDX, IDC_TXT_TOOLSARG, m_txtToolsArg);
  69. DDX_Control(pDX, IDC_TXT_TOOLSCMD, m_txtToolsCmd);
  70. DDX_Control(pDX, IDC_EDIT_TOOLSDIR, m_editToolsDir);
  71. DDX_Control(pDX, IDC_EDIT_TOOLSARG, m_editToolsArg);
  72. DDX_Control(pDX, IDC_EDIT_TOOLSCMD, m_editToolsCmd);
  73. DDX_Control(pDX, IDC_LBOX_TOOLSLIST, m_lboxToolsList);
  74. DDX_Text(pDX, IDC_EDIT_TOOLSDIR, m_strToolsDir);
  75. DDX_Text(pDX, IDC_EDIT_TOOLSARG, m_strToolsArg);
  76. DDX_Text(pDX, IDC_EDIT_TOOLSCMD, m_strToolsCmd);
  77. //}}AFX_DATA_MAP
  78. }
  79. BEGIN_MESSAGE_MAP(CCustomizePageTools, CPropertyPage)
  80. //{{AFX_MSG_MAP(CCustomizePageTools)
  81. ON_LBN_SELCHANGE(IDC_LBOX_TOOLSLIST, OnSelchangeEditList)
  82. ON_EN_CHANGE(IDC_EDIT_TOOLSCMD, OnChangeToolsCmd)
  83. ON_EN_CHANGE(IDC_EDIT_TOOLSARG, OnChangeToolsArg)
  84. ON_EN_CHANGE(IDC_EDIT_TOOLSDIR, OnChangeToolsDir)
  85. ON_WM_DESTROY()
  86. //}}AFX_MSG_MAP
  87. ON_LBN_XT_LABELEDITEND(IDC_LBOX_TOOLSLIST, OnLabelEditEnd)
  88. ON_LBN_XT_LABELEDITCANCEL(IDC_LBOX_TOOLSLIST, OnLabelEditCancel)
  89. ON_LBN_XT_NEWITEM(IDC_LBOX_TOOLSLIST, OnNewItem)
  90. ON_LBN_XT_PREDELETEITEM(IDC_LBOX_TOOLSLIST, OnPreDeleteItem)
  91. END_MESSAGE_MAP()
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CCustomizePageTools message handlers
  94. BOOL CCustomizePageTools::OnInitDialog()
  95. {
  96. CPropertyPage::OnInitDialog();
  97. m_editToolsCmd.Initialize(this, BES_XT_CHOOSEFILE);
  98. m_editToolsCmd.SetDlgTitle( _T("Browse") );
  99. m_editToolsCmd.SetDlgFilter( _T("Executable (*.exe)|*.exe|Command (*.com)|*.com|Information (*.pif)|*.pif|Batch (*.bat;*.cmd)|*.bat; *.cmd|All Files (*.*)|*.*||"));
  100. m_lboxToolsList.SetListEditStyle( _T(" &Menu contents:"), LBS_XT_DEFAULT);
  101. int iArgPopup = 0; //IDR_ARG_POPUP;
  102. int iDirPopup = 0;//IDR_DIR_POPUP;
  103. if ( iArgPopup != 0 ) {
  104. m_editToolsArg.Initialize(this, BES_XT_POPUPMENU, iArgPopup, 0 );
  105. }
  106. else {
  107. m_editToolsArg.Initialize(this, BES_XT_CHOOSEFILE );
  108. }
  109. if ( iDirPopup != 0 ) {
  110. m_editToolsDir.Initialize(this, BES_XT_POPUPMENU, iDirPopup, 0 );
  111. }
  112. else {
  113. m_editToolsDir.Initialize(this, BES_XT_CHOOSEDIR );
  114. }
  115. POSITION pos = m_lstTools.GetHeadPosition();
  116. while (pos)
  117. {
  118. CToolRec* pRec = new CToolRec;
  119. *pRec = m_lstTools.GetNext(pos);
  120. int nIndex = m_lboxToolsList.AddString(pRec->m_strTitle);
  121. m_lboxToolsList.SetItemData(nIndex, (DWORD_PTR)pRec);
  122. }
  123. m_lboxToolsList.SetCurSel( 0 );
  124. OnSelchangeEditList( );
  125. return TRUE;  // return TRUE unless you set the focus to a control
  126. // EXCEPTION: OCX Property Pages should return FALSE
  127. }
  128. void CCustomizePageTools::EnableControls(bool bEnable)
  129. {
  130. m_txtToolsDir.EnableWindow( bEnable );
  131. m_txtToolsArg.EnableWindow( bEnable );
  132. m_txtToolsCmd.EnableWindow( bEnable );
  133. m_editToolsDir.EnableWindow( bEnable );
  134. m_editToolsArg.EnableWindow( bEnable );
  135. m_editToolsCmd.EnableWindow( bEnable );
  136. }
  137. void CCustomizePageTools::OnSelchangeEditList()
  138. {
  139. int iIndex = m_lboxToolsList.GetCurSel( );
  140. if ( iIndex == LB_ERR )
  141. {
  142. m_strToolsDir = _T( "" );
  143. m_strToolsArg = _T( "" );
  144. m_strToolsCmd = _T( "" );
  145. EnableControls( false );
  146. }
  147. else if ( iIndex >= m_lboxToolsList.GetCount( ) )
  148. {
  149. return;
  150. }
  151. else
  152. {
  153. CToolRec* pTool = ( CToolRec* )m_lboxToolsList.GetItemData( iIndex );
  154. if ( pTool == NULL )
  155. {
  156. return;
  157. }
  158. m_strToolsDir = pTool->m_strDir;
  159. m_strToolsArg = pTool->m_strArg;
  160. m_strToolsCmd = pTool->m_strCmd;
  161. EnableControls( true );
  162. }
  163. UpdateData( FALSE );
  164. }
  165. void CCustomizePageTools::UpdateToolData()
  166. {
  167. UpdateData();
  168. // get the index of the currently selected item.
  169. int iItem = m_lboxToolsList.GetCurSel( );
  170. if ( iItem == LB_ERR )
  171. {
  172. return;
  173. }
  174. // get a pointer to the item data for the selection.
  175. CToolRec* pTool = ( CToolRec* )m_lboxToolsList.GetItemData( iItem );
  176. if ( pTool != NULL )
  177. {
  178. pTool->m_strCmd = m_strToolsCmd;
  179. pTool->m_strArg = m_strToolsArg;
  180. pTool->m_strDir = m_strToolsDir;
  181. }
  182. }
  183. void CCustomizePageTools::OnChangeToolsCmd()
  184. {
  185. UpdateToolData( );
  186. }
  187. void CCustomizePageTools::OnChangeToolsArg()
  188. {
  189. UpdateToolData( );
  190. }
  191. void CCustomizePageTools::OnChangeToolsDir()
  192. {
  193. UpdateToolData( );
  194. }
  195. void CCustomizePageTools::OnLabelEditEnd()
  196. {
  197. int iIndex = m_lboxToolsList.GetCurrentIndex( );
  198. CToolRec* pTool = ( CToolRec* )m_lboxToolsList.GetItemData( iIndex );
  199. if ( pTool != NULL )
  200. {
  201. CString strText;
  202. m_lboxToolsList.GetText( iIndex, strText );
  203. pTool->m_strTitle = strText;
  204. m_lboxToolsList.SetCurSel( iIndex );
  205. }
  206. }
  207. void CCustomizePageTools::OnLabelEditCancel()
  208. {
  209. m_lboxToolsList.SetCurSel(
  210. m_lboxToolsList.GetCurrentIndex( ) );
  211. }
  212. void CCustomizePageTools::OnNewItem()
  213. {
  214. int iItem = m_lboxToolsList.GetCurrentIndex( );
  215. if ( iItem != -1 )
  216. {
  217. CString strTitle;
  218. m_lboxToolsList.GetText( iItem, strTitle );
  219. CToolRec* pTool = new CToolRec(strTitle);
  220. m_lboxToolsList.SetCurSel( iItem );
  221. m_strToolsDir = _T("");
  222. m_strToolsArg = _T("");
  223. m_strToolsCmd = _T("");
  224. m_lboxToolsList.SetItemData( iItem, (DWORD_PTR)pTool);
  225. EnableControls( true );
  226. UpdateData( FALSE );
  227. }
  228. }
  229. void CCustomizePageTools::OnPreDeleteItem()
  230. {
  231. int iIndex = m_lboxToolsList.GetCurSel( );
  232. if ( iIndex == LB_ERR )
  233. return;
  234. delete ( CToolRec* )m_lboxToolsList.GetItemData( iIndex );
  235. }
  236. void CCustomizePageTools::UpdateToolsList()
  237. {
  238. m_lstTools.RemoveAll();
  239. for (int i = 0; i < m_lboxToolsList.GetCount( ); ++i )
  240. {
  241. CToolRec* pOldTool = ( CToolRec* )m_lboxToolsList.GetItemData( i );
  242. if ( pOldTool == NULL )
  243. continue;
  244. m_lstTools.AddTail( *pOldTool );
  245. delete pOldTool;
  246. }
  247. m_lboxToolsList.ResetContent();
  248. }
  249. BOOL CCustomizePageTools::OnKillActive()
  250. {
  251. return CPropertyPage::OnKillActive();
  252. }
  253. void CCustomizePageTools::OnDestroy()
  254. {
  255. UpdateToolsList( );
  256. UpdateIcons();
  257. CPropertyPage::OnDestroy();
  258. }
  259. static const TCHAR _lpszTools[]     = _T("Tools");
  260. void CCustomizePageTools::SaveTools(LPCTSTR lpszProfileName)
  261. {
  262. CMemFile file;
  263. CArchive ar (&file, CArchive::store);
  264. m_lstTools.Serialize(ar);
  265. ar.Flush ();
  266. DWORD dwDataSize = (DWORD)file.GetPosition();
  267. LPBYTE lpbData = file.Detach();
  268. AfxGetApp()->WriteProfileBinary(lpszProfileName, _lpszTools, lpbData, dwDataSize);
  269. ar.Close();
  270. file.Close();
  271. free (lpbData);
  272. }
  273. void CCustomizePageTools::UpdateIcons()
  274. {
  275. int nIconIndex = 8000;
  276. POSITION pos = m_lstTools.GetHeadPosition();
  277. while (pos)
  278. {
  279. CToolRec& tool = m_lstTools.GetNext(pos);
  280. tool.m_nIconID = 0;
  281. CString strPath = tool.m_strCmd;
  282. TCHAR lpszPath [MAX_PATH];
  283. if (::SearchPath (NULL, strPath, NULL, MAX_PATH,
  284. lpszPath, NULL) != 0)
  285. {
  286. strPath = lpszPath;
  287. }
  288. SHFILEINFO sfi;
  289. if (::SHGetFileInfo (strPath, 0, &sfi, sizeof(SHFILEINFO),
  290. SHGFI_ICON | SHGFI_SHELLICONSIZE | SHGFI_SMALLICON))
  291. {
  292. HICON hIcon =  sfi.hIcon;
  293. if (hIcon)
  294. {
  295. XTPImageManager()->SetIcon(hIcon, nIconIndex);
  296. tool.m_nIconID = nIconIndex++;
  297. DestroyIcon(hIcon);
  298. }
  299. }
  300. }
  301. }
  302. BOOL CCustomizePageTools::LoadTools(LPCTSTR lpszProfileName)
  303. {
  304. BOOL bResult = FALSE;
  305. LPBYTE lpbData;
  306. UINT dwDataSize;
  307. if (AfxGetApp()->GetProfileBinary(lpszProfileName, _lpszTools, &lpbData, &dwDataSize))
  308. {
  309. try
  310. {
  311. CMemFile file(lpbData, dwDataSize);
  312. CArchive ar (&file, CArchive::load);
  313. m_lstTools.Serialize(ar);
  314. bResult = TRUE;
  315. }
  316. catch (CMemoryException* pEx)
  317. {
  318. pEx->Delete ();
  319. }
  320. catch (CArchiveException* pEx)
  321. {
  322. pEx->Delete ();
  323. }
  324. delete[] lpbData;
  325. UpdateIcons();
  326. }
  327. return bResult;
  328. }