CopyProperties.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. // CopyProperties.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "cp_main.h"
  5. #include "CopyProperties.h"
  6. #include ".\copyproperties.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CCopyProperties dialog
  14. CCopyProperties::CCopyProperties(long lCopyID, CWnd* pParent, CClip *pMemoryClip)
  15. : CDialog(CCopyProperties::IDD, pParent)
  16. {
  17. m_lCopyID = lCopyID;
  18. m_bDeletedData = false;
  19. m_bChangedText = false;
  20. m_bHandleKillFocus = false;
  21. m_bHideOnKillFocus = false;
  22. m_lGroupChangedTo = -1;
  23. m_pMemoryClip = pMemoryClip;
  24. m_bSetToTopMost = true;
  25. //{{AFX_DATA_INIT(CCopyProperties)
  26. m_eDate = _T("");
  27. m_lastPasteDate = _T("");
  28. m_bNeverAutoDelete = FALSE;
  29. //}}AFX_DATA_INIT
  30. }
  31. void CCopyProperties::DoDataExchange(CDataExchange* pDX)
  32. {
  33. CDialog::DoDataExchange(pDX);
  34. //{{AFX_DATA_MAP(CCopyProperties)
  35. DDX_Control(pDX, IDC_EDIT_QUICK_PASTE, m_QuickPasteText);
  36. DDX_Control(pDX, IDC_EDIT_PROPERTIES, m_description);
  37. DDX_Control(pDX, IDC_COMBO1, m_GroupCombo);
  38. DDX_Control(pDX, IDC_HOTKEY, m_HotKey);
  39. DDX_Control(pDX, IDC_COPY_DATA, m_lCopyData);
  40. DDX_Text(pDX, IDC_DATE, m_eDate);
  41. DDX_Text(pDX, IDC_DATE_LAST_USED, m_lastPasteDate);
  42. DDX_Check(pDX, IDC_NEVER_AUTO_DELETE, m_bNeverAutoDelete);
  43. DDX_Check(pDX, IDC_HOT_KEY_GLOBAL, m_hotKeyGlobal);
  44. DDX_Control(pDX, IDC_HOTKEY_MOVE_TO_GROUP, m_MoveToGrouHotKey);
  45. DDX_Check(pDX, IDC_HOT_KEY_GLOBAL_MOVE_TO_GROUP, m_moveToGroupHotKeyGlobal);
  46. //}}AFX_DATA_MAP
  47. }
  48. BEGIN_MESSAGE_MAP(CCopyProperties, CDialog)
  49. //{{AFX_MSG_MAP(CCopyProperties)
  50. ON_BN_CLICKED(IDC_DELETE_COPY_DATA, OnDeleteCopyData)
  51. ON_WM_ACTIVATE()
  52. ON_WM_SIZE()
  53. //}}AFX_MSG_MAP
  54. ON_WM_CTLCOLOR()
  55. END_MESSAGE_MAP()
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CCopyProperties message handlers
  58. BOOL CCopyProperties::OnInitDialog()
  59. {
  60. CDialog::OnInitDialog();
  61. //remove the default icon in top left of window
  62. int extendedStyle = GetWindowLong(m_hWnd, GWL_EXSTYLE);
  63. SetWindowLong(m_hWnd, GWL_EXSTYLE, extendedStyle | WS_EX_DLGMODALFRAME);
  64. SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
  65. m_GroupCombo.FillCombo();
  66. try
  67. {
  68. if(m_lCopyID == -1 && m_pMemoryClip != NULL)
  69. {
  70. LoadDataFromCClip(*m_pMemoryClip);
  71. }
  72. else
  73. {
  74. CClip Clip;
  75. if(Clip.LoadMainTable(m_lCopyID))
  76. {
  77. Clip.LoadFormats(m_lCopyID);
  78. LoadDataFromCClip(Clip);
  79. }
  80. }
  81. }
  82. CATCH_SQLITE_EXCEPTION
  83. UpdateData(FALSE);
  84. if(m_bSetToTopMost)
  85. SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
  86. if(m_lCopyID == -1 && m_pMemoryClip != NULL)
  87. {
  88. GetDlgItem(IDOK)->SetFocus();
  89. }
  90. else
  91. {
  92. m_description.SetFocus();
  93. }
  94. m_Resize.SetParent(m_hWnd);
  95. m_Resize.AddControl(IDC_EDIT_PROPERTIES, DR_SizeHeight | DR_SizeWidth);
  96. m_Resize.AddControl(IDC_STATIC_FORMATS, DR_MoveTop);
  97. m_Resize.AddControl(IDC_COPY_DATA, DR_MoveTop | DR_SizeWidth);
  98. m_Resize.AddControl(IDC_DELETE_COPY_DATA, DR_MoveTop);
  99. m_Resize.AddControl(IDOK, DR_MoveTop | DR_MoveLeft);
  100. m_Resize.AddControl(IDCANCEL, DR_MoveTop | DR_MoveLeft);
  101. m_Resize.AddControl(IDC_EDIT_QUICK_PASTE, DR_SizeWidth);
  102. m_Resize.AddControl(IDC_COMBO1, DR_SizeWidth);
  103. theApp.m_Language.UpdateClipProperties(this);
  104. return FALSE;
  105. }
  106. void CCopyProperties::LoadDataFromCClip(CClip &Clip)
  107. {
  108. COleDateTime dtTime(Clip.m_Time.GetTime());
  109. m_eDate = dtTime.Format();
  110. COleDateTime lastPasteDate(Clip.m_lastPasteDate.GetTime());
  111. m_lastPasteDate = lastPasteDate.Format();
  112. m_description.SetWindowText(Clip.m_Desc);
  113. if(Clip.m_dontAutoDelete)
  114. {
  115. m_bNeverAutoDelete = TRUE;
  116. }
  117. else
  118. {
  119. m_bNeverAutoDelete = FALSE;
  120. }
  121. m_hotKeyGlobal = Clip.m_globalShortCut;
  122. m_GroupCombo.SetCurSelOnItemData(Clip.m_parentId);
  123. DWORD shortcut = ACCEL_MAKEKEY(LOBYTE(Clip.m_shortCut), ((HIBYTE(Clip.m_shortCut)) &~HOTKEYF_EXT));
  124. switch (LOBYTE(shortcut))
  125. {
  126. case VK_LEFT:
  127. case VK_UP:
  128. case VK_RIGHT:
  129. case VK_DOWN: // arrow keys
  130. case VK_PRIOR:
  131. case VK_NEXT: // page up and page down
  132. case VK_END:
  133. case VK_HOME:
  134. case VK_INSERT:
  135. case VK_DELETE:
  136. case VK_DIVIDE: // numpad slash
  137. case VK_NUMLOCK:
  138. {
  139. shortcut = ACCEL_MAKEKEY(LOBYTE(shortcut), (HIBYTE(shortcut) | HOTKEYF_EXT));
  140. }
  141. break;
  142. }
  143. m_HotKey.SetHotKey(LOBYTE(shortcut), (HIBYTE(shortcut)));
  144. m_HotKey.SetRules(HKCOMB_A, 0);
  145. if(HIBYTE(Clip.m_shortCut) & HOTKEYF_EXT)
  146. {
  147. ::CheckDlgButton(m_hWnd, IDC_CHECK_WIN, BST_CHECKED);
  148. }
  149. m_moveToGroupHotKeyGlobal = Clip.m_globalMoveToGroupShortCut;
  150. m_MoveToGrouHotKey.SetHotKey(LOBYTE(Clip.m_moveToGroupShortCut), (HIBYTE(Clip.m_moveToGroupShortCut) & ~HOTKEYF_EXT));
  151. m_MoveToGrouHotKey.SetRules(HKCOMB_A, 0);
  152. if(HIBYTE(Clip.m_moveToGroupShortCut) & HOTKEYF_EXT)
  153. {
  154. ::CheckDlgButton(m_hWnd, IDC_CHECK_WIN_MOVE_TO_GROUP, BST_CHECKED);
  155. }
  156. m_QuickPasteText.SetWindowText(Clip.m_csQuickPaste);
  157. CString cs;
  158. CClipFormat* pCF;
  159. INT_PTR count = Clip.m_Formats.GetSize();
  160. for(int i = 0; i < count; i++)
  161. {
  162. pCF = &Clip.m_Formats.GetData()[i];
  163. if(pCF)
  164. {
  165. cs.Format(_T("%s, %d"), GetFormatName(pCF->m_cfType), GlobalSize(pCF->m_hgData));
  166. int nIndex = m_lCopyData.AddString(cs);
  167. if(m_lCopyID == -1 && pCF->m_dataId == -1)
  168. m_lCopyData.SetItemData(nIndex, i);
  169. else
  170. m_lCopyData.SetItemData(nIndex, pCF->m_dataId);
  171. }
  172. }
  173. int selectedRow = m_lCopyData.GetCount()-1;
  174. if(selectedRow >= 0 && selectedRow < m_lCopyData.GetCount())
  175. {
  176. m_lCopyData.SetSel(selectedRow);
  177. m_lCopyData.SetCurSel(selectedRow);
  178. m_lCopyData.SetCaretIndex(selectedRow);
  179. m_lCopyData.SetAnchorIndex(selectedRow);
  180. }
  181. if(Clip.m_bIsGroup == FALSE)
  182. {
  183. ::ShowWindow(::GetDlgItem(m_hWnd, IDC_STATIC_HOT_KEY_MOVE_TO_GROUP), SW_HIDE);
  184. ::ShowWindow(::GetDlgItem(m_hWnd, IDC_HOTKEY_MOVE_TO_GROUP), SW_HIDE);
  185. ::ShowWindow(::GetDlgItem(m_hWnd, IDC_CHECK_WIN_MOVE_TO_GROUP), SW_HIDE);
  186. ::ShowWindow(::GetDlgItem(m_hWnd, IDC_HOT_KEY_GLOBAL_MOVE_TO_GROUP), SW_HIDE);
  187. CRect anchorRect;
  188. ::GetWindowRect(::GetDlgItem(m_hWnd, IDC_STATIC_HOT_KEY_MOVE_TO_GROUP), &anchorRect);
  189. ScreenToClient(&anchorRect);
  190. HWND hwnd = ::GetTopWindow(this->GetSafeHwnd());
  191. // while we have a valid hwnd,
  192. // loop through all child windows
  193. while (hwnd)
  194. {
  195. CRect rect;
  196. ::GetWindowRect(hwnd, &rect);
  197. ScreenToClient(&rect);
  198. if(rect.top > anchorRect.bottom)
  199. {
  200. ::MoveWindow(hwnd, rect.left,
  201. rect.top - (anchorRect.Height()+4), rect.Width(),
  202. rect.Height(), TRUE);
  203. }
  204. // do something with the hwnd
  205. // and get the next child control's hwnd
  206. hwnd = ::GetNextWindow(hwnd, GW_HWNDNEXT);
  207. }
  208. CRect rect2;
  209. ::GetWindowRect(m_hWnd, &rect2);
  210. ::MoveWindow(m_hWnd, rect2.left,
  211. rect2.top, rect2.Width(),
  212. rect2.Height() - (anchorRect.Height()+4), TRUE);
  213. }
  214. }
  215. void CCopyProperties::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
  216. {
  217. CDialog::OnActivate(nState, pWndOther, bMinimized);
  218. if (nState == WA_INACTIVE)
  219. {
  220. if(m_bHideOnKillFocus)
  221. {
  222. if(!m_bHandleKillFocus)
  223. {
  224. EndDialog(-1);
  225. m_bHandleKillFocus = false;
  226. }
  227. }
  228. }
  229. else if (nState == WA_ACTIVE)
  230. {
  231. SetFocus();
  232. ::SetForegroundWindow(m_hWnd);
  233. }
  234. }
  235. void CCopyProperties::OnOK()
  236. {
  237. UpdateData();
  238. try
  239. {
  240. if(m_lCopyID == -1 && m_pMemoryClip != NULL)
  241. {
  242. LoadDataIntoCClip(*m_pMemoryClip);
  243. m_DeletedData.SortDescending();
  244. INT_PTR count = m_DeletedData.GetSize();
  245. for(int i = 0; i < count; i++)
  246. {
  247. m_pMemoryClip->m_Formats.RemoveAt(m_DeletedData[i]);
  248. }
  249. }
  250. else
  251. {
  252. CClip clip;
  253. if(clip.LoadMainTable(m_lCopyID))
  254. {
  255. LoadDataIntoCClip(clip);
  256. if(CheckGlobalHotKey(clip) == FALSE)
  257. {
  258. if(MessageBox(_T("Error registering global hot key\n\nContinue?"), _T(""), MB_YESNO|MB_ICONWARNING) == IDNO)
  259. {
  260. return;
  261. }
  262. }
  263. if(CheckMoveToGroupGlobalHotKey(clip) == FALSE)
  264. {
  265. if(MessageBox(_T("Error registering global move to group hot key\n\nContinue?"), _T(""), MB_YESNO|MB_ICONWARNING) == IDNO)
  266. {
  267. return;
  268. }
  269. }
  270. if(clip.ModifyMainTable())
  271. {
  272. if(m_bDeletedData)
  273. {
  274. DeleteFormats(m_lCopyID, m_DeletedData);
  275. }
  276. }
  277. }
  278. }
  279. m_bHandleKillFocus = true;
  280. }
  281. CATCH_SQLITE_EXCEPTION
  282. CDialog::OnOK();
  283. }
  284. BOOL CCopyProperties::CheckGlobalHotKey(CClip &clip)
  285. {
  286. BOOL ret = FALSE;
  287. if(clip.m_globalShortCut)
  288. {
  289. ret = g_HotKeys.ValidateClip(clip.m_id, clip.m_shortCut, clip.m_Desc, CHotKey::PASTE_OPEN_CLIP);
  290. }
  291. else
  292. {
  293. g_HotKeys.Remove(clip.m_id, CHotKey::PASTE_OPEN_CLIP);
  294. ret = TRUE;
  295. }
  296. return ret;
  297. }
  298. BOOL CCopyProperties::CheckMoveToGroupGlobalHotKey(CClip &clip)
  299. {
  300. BOOL ret = FALSE;
  301. if(clip.m_globalMoveToGroupShortCut)
  302. {
  303. ret = g_HotKeys.ValidateClip(clip.m_id, clip.m_moveToGroupShortCut, clip.m_Desc, CHotKey::MOVE_TO_GROUP);
  304. }
  305. else
  306. {
  307. g_HotKeys.Remove(clip.m_id, CHotKey::MOVE_TO_GROUP);
  308. ret = TRUE;
  309. }
  310. return ret;
  311. }
  312. void CCopyProperties::LoadDataIntoCClip(CClip &Clip)
  313. {
  314. long lHotKey = m_HotKey.GetHotKey();
  315. short sKeyKode = LOBYTE(m_HotKey.GetHotKey());
  316. short sModifers = (HIBYTE(m_HotKey.GetHotKey())) & ~HOTKEYF_EXT;
  317. if(sKeyKode && ::IsDlgButtonChecked(m_hWnd, IDC_CHECK_WIN))
  318. {
  319. sModifers |= HOTKEYF_EXT;
  320. }
  321. Clip.m_shortCut = MAKEWORD(sKeyKode, sModifers);
  322. long moveToGroupHotKey = m_MoveToGrouHotKey.GetHotKey();
  323. short moveToGroupKeyKode = LOBYTE(m_MoveToGrouHotKey.GetHotKey());
  324. short moveToGroupModifers = HIBYTE(m_MoveToGrouHotKey.GetHotKey());
  325. if(moveToGroupKeyKode && ::IsDlgButtonChecked(m_hWnd, IDC_CHECK_WIN_MOVE_TO_GROUP))
  326. {
  327. moveToGroupModifers |= HOTKEYF_EXT;
  328. }
  329. Clip.m_moveToGroupShortCut = MAKEWORD(moveToGroupKeyKode, moveToGroupModifers);
  330. //remove any others that have the same hot key
  331. if(Clip.m_shortCut > 0)
  332. {
  333. theApp.m_db.execDMLEx(_T("UPDATE Main SET lShortCut = 0 where lShortCut = %d AND lID <> %d;"), Clip.m_shortCut, m_lCopyID);
  334. }
  335. if(Clip.m_moveToGroupShortCut > 0)
  336. {
  337. theApp.m_db.execDMLEx(_T("UPDATE Main SET MoveToGroupShortCut = 0 where MoveToGroupShortCut = %d AND lID <> %d;"), Clip.m_shortCut, m_lCopyID);
  338. }
  339. m_description.GetWindowText(Clip.m_Desc);
  340. Clip.m_Desc.Replace(_T("'"), _T("''"));
  341. m_QuickPasteText.GetWindowText(Clip.m_csQuickPaste);
  342. Clip.m_csQuickPaste.MakeUpper();
  343. Clip.m_csQuickPaste.Replace(_T("'"), _T("''"));
  344. //remove any other that have the same quick paste text
  345. if(Clip.m_csQuickPaste.IsEmpty() == FALSE)
  346. {
  347. theApp.m_db.execDMLEx(_T("UPDATE Main SET QuickPasteText = '' WHERE QuickPasteText = '%s' AND lID <> %d;"), Clip.m_csQuickPaste, m_lCopyID);
  348. }
  349. Clip.m_parentId = m_GroupCombo.GetItemDataFromCursel();
  350. //If we are going from no group to a group or the
  351. //don't auto delete check box is checked
  352. if(m_bNeverAutoDelete)
  353. {
  354. Clip.m_dontAutoDelete = (int)CTime::GetCurrentTime().GetTime();
  355. }
  356. else if(m_bNeverAutoDelete == FALSE)
  357. {
  358. Clip.m_dontAutoDelete = FALSE;
  359. }
  360. Clip.m_globalShortCut = m_hotKeyGlobal;
  361. Clip.m_globalMoveToGroupShortCut = m_moveToGroupHotKeyGlobal;
  362. }
  363. void CCopyProperties::OnDeleteCopyData()
  364. {
  365. int nCount = m_lCopyData.GetSelCount();
  366. if(nCount)
  367. {
  368. m_bDeletedData = true;
  369. //Get the selected indexes
  370. ARRAY items;
  371. items.SetSize(nCount);
  372. m_lCopyData.GetSelItems(nCount, items.GetData());
  373. items.SortDescending();
  374. //Get the selected itemdata
  375. for(int i = 0; i < nCount; i++)
  376. {
  377. int row = items[i];
  378. m_DeletedData.Add((int)m_lCopyData.GetItemData(row));
  379. m_lCopyData.DeleteString(row);
  380. int newRow = row-1;
  381. if(newRow < 0)
  382. {
  383. newRow = 0;
  384. }
  385. if(newRow >= 0 && newRow < m_lCopyData.GetCount())
  386. {
  387. m_lCopyData.SetSel(newRow);
  388. m_lCopyData.SetCurSel(newRow);
  389. m_lCopyData.SetCaretIndex(newRow);
  390. m_lCopyData.SetAnchorIndex(newRow);
  391. }
  392. }
  393. }
  394. }
  395. void CCopyProperties::OnCancel()
  396. {
  397. m_bHandleKillFocus = true;
  398. CDialog::OnCancel();
  399. }
  400. void CCopyProperties::OnSize(UINT nType, int cx, int cy)
  401. {
  402. CDialog::OnSize(nType, cx, cy);
  403. m_Resize.MoveControls(CSize(cx, cy));
  404. }
  405. HBRUSH CCopyProperties::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  406. {
  407. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  408. // TODO: Change any attributes of the DC here
  409. // TODO: Return a different brush if the default is not desired
  410. return hbr;
  411. }