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

对话框与窗口

开发平台:

Visual C++

  1. // XTPCustomizeTools.cpp.
  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/XTPDrawHelpers.h"
  24. #include "XTPCustomizeTools.h"
  25. #include "XTPCommandBar.h"
  26. #include "XTPControl.h"
  27. #include "XTPToolBar.h"
  28. #include "XTPCommandBars.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CXTPCustomizeDropSource
  36. CXTPCustomizeDropSource::CXTPCustomizeDropSource(CXTPCommandBars* pCommandBars)
  37. {
  38. m_hcurDelete = XTPResourceManager()->LoadCursor(XTP_IDC_COMMANDBARS_DRAGDELETE);
  39. m_hcurMove = XTPResourceManager()->LoadCursor(XTP_IDC_COMMANDBARS_DRAGMOVE);
  40. m_hcurCopy = XTPResourceManager()->LoadCursor(XTP_IDC_COMMANDBARS_DRAGCOPY);
  41. m_pSheet = NULL;
  42. m_pCommandBars = pCommandBars;
  43. m_hwndCapture = 0;
  44. m_pControl = 0;
  45. m_bMove = FALSE;
  46. m_bCopyOnly = FALSE;
  47. m_pTarget = NULL;
  48. }
  49. CXTPCustomizeDropSource::~CXTPCustomizeDropSource()
  50. {
  51. }
  52. DROPEFFECT CXTPCustomizeDropSource::DoDragDrop(CXTPControl* pControl, BOOL bCopyOnly)
  53. {
  54. ASSERT(m_pCommandBars);
  55. if (!m_pCommandBars)
  56. return 0;
  57. CWnd* pWndCapture = m_pSheet ? (CWnd*)m_pSheet : m_pCommandBars->GetSite();
  58. ASSERT(pWndCapture);
  59. if (!pWndCapture)
  60. return 0;
  61. m_pControl = pControl;
  62. m_hwndCapture = pWndCapture->GetSafeHwnd();
  63. ::SetCapture(m_hwndCapture);
  64. m_bMove = FALSE;
  65. m_pTarget = NULL;
  66. m_bCopyOnly = bCopyOnly;
  67. GetCursorPos(&m_ptStart);
  68. DROPEFFECT dropEffect = _DoDragDrop();
  69. if (m_pTarget) m_pTarget->OnCustomizeDragLeave();
  70. ReleaseCapture();
  71. ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
  72. return dropEffect;
  73. }
  74. void CXTPCustomizeDropSource::Register(CXTPCommandBar* pCommandBar)
  75. {
  76. m_arrTargets.Add(pCommandBar);
  77. }
  78. void CXTPCustomizeDropSource::UnRegister(CXTPCommandBar* pCommandBar)
  79. {
  80. for (int i = 0; i < m_arrTargets.GetSize(); i++)
  81. {
  82. if (pCommandBar == m_arrTargets[i])
  83. {
  84. m_arrTargets.RemoveAt(i);
  85. }
  86. }
  87. }
  88. CXTPCustomizeSheet* CXTPCustomizeDropSource::GetSheet() const
  89. {
  90. return m_pSheet;
  91. }
  92. // picks the current target
  93. void CXTPCustomizeDropSource::PickTarget(CPoint point)
  94. {
  95. HWND hWndPoint = WindowFromPoint(point);
  96. BOOL bFound = FALSE;
  97. for (int i = (int)m_arrTargets.GetSize() - 1; i >= 0; i--)
  98. {
  99. CXTPCommandBar* pCommandBar = m_arrTargets[i];
  100. if (pCommandBar->IsVisible() && CXTPWindowRect(pCommandBar).PtInRect(point)
  101. && (pCommandBar->GetSafeHwnd() == hWndPoint || ::IsChild(pCommandBar->GetSafeHwnd(), hWndPoint)))
  102. {
  103. bFound = TRUE;
  104. if (m_pTarget == pCommandBar)
  105. {
  106. m_pTarget->ScreenToClient(&point);
  107. m_pTarget->OnCustomizeDragOver(m_pControl, point);
  108. }
  109. else if (m_pTarget != NULL)
  110. {
  111. m_pTarget->OnCustomizeDragLeave();
  112. m_pTarget = 0;
  113. }
  114. if (m_pTarget == 0)
  115. {
  116. pCommandBar->ScreenToClient(&point);
  117. if (pCommandBar->OnCustomizeDragEnter(m_pControl, point) != DROPEFFECT_NONE)
  118. {
  119. m_pTarget = pCommandBar;
  120. }
  121. }
  122. break;
  123. }
  124. }
  125. if (!bFound && m_pTarget)
  126. {
  127. m_pTarget->OnCustomizeDragLeave();
  128. m_pTarget = 0;
  129. }
  130. // set the cursor as appropriate
  131. FreshenCursor();
  132. }
  133. void CXTPCustomizeDropSource::FreshenCursor()
  134. {
  135. HCURSOR hCursor = m_hcurDelete;
  136. if (m_pTarget)
  137. {
  138. hCursor = (m_bMove && !m_bCopyOnly) ? m_hcurMove : m_hcurCopy;
  139. }
  140. ::SetCursor(hCursor);
  141. }
  142. DROPEFFECT CXTPCustomizeDropSource::_DoDragDrop()
  143. {
  144. BOOL bMoved = FALSE;
  145. DROPEFFECT dropEffect = DROPEFFECT_CANCEL;
  146. BOOL bDone = FALSE;
  147. while (!bDone && ::GetCapture() == m_hwndCapture)
  148. {
  149. MSG msg;
  150. // assess current state
  151. // pump WM_PAINT first for better feedback
  152. while (::PeekMessage(&msg, NULL, WM_PAINT, WM_PAINT, PM_NOREMOVE))
  153. {
  154. if (!GetMessage(&msg, NULL, WM_PAINT, WM_PAINT))
  155. break;
  156. DispatchMessage(&msg);
  157. }
  158. // get a message
  159. if (!::GetMessage(&msg, NULL, 0, 0))
  160. {
  161. AfxPostQuitMessage((int)msg.wParam);
  162. return DROPEFFECT_CANCEL;
  163. }
  164. if (::GetCapture() != m_hwndCapture)
  165. {
  166. // capture was stolen while repainting
  167. return DROPEFFECT_CANCEL;
  168. }
  169. switch (msg.message)
  170. {
  171. case WM_LBUTTONUP:
  172. bDone = TRUE;
  173. break;
  174. case WM_MOUSEMOVE:
  175. if (!bMoved)
  176. {
  177. CPoint pt(msg.pt);
  178. if (m_pControl && m_pControl->GetParent())
  179. {
  180. DROPEFFECT dropEffectDragStart = DROPEFFECT_CANCEL;
  181. m_pControl->GetParent()->ScreenToClient(&pt);
  182. m_pControl->OnCustomizeDragOver(m_pControl, pt, dropEffectDragStart);
  183. }
  184. bMoved = TRUE;
  185. }
  186. m_bMove = !(msg.wParam & MK_CONTROL);
  187. PickTarget(msg.pt);
  188. // terminate loop if we happen to get mouse move with button up
  189. if (!(msg.wParam & MK_LBUTTON))
  190. bDone = TRUE;
  191. dropEffect = DROPEFFECT_NONE;
  192. break;
  193. case WM_KEYDOWN:
  194. if (msg.wParam == VK_ESCAPE)
  195. return DROPEFFECT_CANCEL;
  196. if (msg.wParam == VK_CONTROL && m_bMove)
  197. {
  198. m_bMove = FALSE;
  199. FreshenCursor();
  200. }
  201. break;
  202. case WM_KEYUP:
  203. if (msg.wParam == VK_CONTROL && !m_bMove)
  204. {
  205. m_bMove = TRUE;
  206. FreshenCursor();
  207. }
  208. break;
  209. case WM_RBUTTONDOWN:
  210. return DROPEFFECT_CANCEL;
  211. default:
  212. ::DispatchMessage(&msg);
  213. }
  214. }
  215. if (m_pTarget)
  216. {
  217. dropEffect = m_bMove ? DROPEFFECT_MOVE : DROPEFFECT_COPY;
  218. CPoint point;
  219. GetCursorPos(&point);
  220. m_pTarget->ScreenToClient(&point);
  221. m_pTarget->ScreenToClient(&m_ptStart);
  222. m_pTarget->OnCustomizeDrop(m_pControl, dropEffect, point, m_ptStart);
  223. m_pTarget = 0;
  224. }
  225. return dropEffect;
  226. }
  227. /////////////////////////////////////////////////////////////////////////////
  228. // CXTPNewToolbarDlg dialog
  229. CXTPNewToolbarDlg::CXTPNewToolbarDlg(CWnd* pParent, CXTPCommandBars* pCommandBars, CXTPCommandBar* pCommandBar)
  230. : m_pCommandBars(pCommandBars), m_pCommandBar(pCommandBar)
  231. {
  232. InitModalIndirect(XTPResourceManager()->LoadDialogTemplate(XTP_IDD_NEWTOOLBAR), pParent);
  233. m_strToolbar = _T("");
  234. m_nNewID = 0;
  235. }
  236. void CXTPNewToolbarDlg::DoDataExchange(CDataExchange* pDX)
  237. {
  238. CDialog::DoDataExchange(pDX);
  239. //{{AFX_DATA_MAP(CXTPNewToolbarDlg)
  240. DDX_Text(pDX, XTP_IDC_EDIT_TOOLBARNAME, m_strToolbar);
  241. //}}AFX_DATA_MAP
  242. }
  243. BEGIN_MESSAGE_MAP(CXTPNewToolbarDlg, CDialog)
  244. //{{AFX_MSG_MAP(CXTPNewToolbarDlg)
  245. //}}AFX_MSG_MAP
  246. END_MESSAGE_MAP()
  247. /////////////////////////////////////////////////////////////////////////////
  248. // CXTPNewToolbarDlg message handlers
  249. BOOL CXTPNewToolbarDlg::OnInitDialog()
  250. {
  251. CDialog::OnInitDialog();
  252. if (m_pCommandBar)
  253. {
  254. m_strToolbar = m_pCommandBar->GetTitle();
  255. UpdateData(FALSE);
  256. CString strWindowText;
  257. XTPResourceManager()->LoadString(&strWindowText, XTP_IDS_RENAMETOOLBAR);
  258. SetWindowText(strWindowText);
  259. }
  260. else
  261. {
  262. SetSuggestedName();
  263. }
  264. return TRUE;
  265. }
  266. void CXTPNewToolbarDlg::SetSuggestedName()
  267. {
  268. CString szMsg;
  269. XTPResourceManager()->LoadString(&szMsg, XTP_IDS_CUSTOM_BAR);
  270. int iNewID = 1;
  271. CString strCustom;
  272. strCustom.Format(szMsg, iNewID);
  273. int nCount = m_pCommandBars->GetCount();
  274. int nIndex = 0;
  275. while (nIndex < nCount)
  276. {
  277. CXTPToolBar* pBar = m_pCommandBars->GetAt(nIndex);
  278. ASSERT(pBar != NULL);
  279. if (pBar && strCustom.Compare(pBar->GetTitle()) == 0)
  280. {
  281. strCustom.Format(szMsg, iNewID++);
  282. nIndex = 0;
  283. continue;
  284. }
  285. nIndex++;
  286. }
  287. m_strToolbar = strCustom;
  288. UpdateData(FALSE);
  289. }
  290. void CXTPNewToolbarDlg::OnOK()
  291. {
  292. UpdateData();
  293. // If no text was entered, alert user.
  294. if (m_strToolbar.IsEmpty())
  295. {
  296. XTPResourceManager()->ShowMessageBox(XTP_IDS_ERROR_BLANKNAME, MB_ICONSTOP);
  297. return;
  298. }
  299. m_nNewID = AFX_IDW_CONTROLBAR_FIRST;
  300. // Loop through all of the existing control bars to find
  301. // an available ID to use.
  302. int nCount = m_pCommandBars->GetCount();
  303. int nIndex = 0;
  304. while (nIndex < nCount)
  305. {
  306. CXTPToolBar* pBar = m_pCommandBars->GetAt(nIndex);
  307. ASSERT(pBar != NULL);
  308. // We found a control bar with the same ID as m_nNewID, increment
  309. // m_nNewID and reset the position back to the head.
  310. if (pBar && m_pCommandBar == NULL && pBar->GetBarID() == m_nNewID)
  311. {
  312. m_nNewID++;
  313. // If m_nNewID is greater than the maximum number of allowed
  314. // custom commands, alert the user and abort.
  315. if ((int)m_nNewID >= AFX_IDW_CONTROLBAR_LAST)
  316. {
  317. XTPResourceManager()->ShowMessageBox(XTP_IDS_ERROR_LIMIT, MB_ICONSTOP);
  318. CDialog::OnCancel();
  319. return;
  320. }
  321. nIndex = 0;
  322. continue;
  323. }
  324. // Now check to see if the title for the toolbar has already
  325. // been used, if so, alert the user and return.
  326. if (pBar && m_pCommandBar != pBar && m_strToolbar.Compare(pBar->GetTitle()) == 0)
  327. {
  328. CString strName, strError;
  329. VERIFY(XTPResourceManager()->LoadString(&strError, XTP_IDS_ERROR_EXISTS));
  330. strName.Format(strError, (LPCTSTR)m_strToolbar);
  331. XTPResourceManager()->ShowMessageBox(strName, MB_ICONSTOP);
  332. return;
  333. }
  334. nIndex++;
  335. }
  336. CDialog::OnOK(); // success!
  337. }