CopyProperties.cpp 14 KB

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