CopyProperties.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  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. END_MESSAGE_MAP()
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CCopyProperties message handlers
  57. BOOL CCopyProperties::OnInitDialog()
  58. {
  59. CDialog::OnInitDialog();
  60. m_GroupCombo.FillCombo();
  61. try
  62. {
  63. if(m_lCopyID == -1 && m_pMemoryClip != NULL)
  64. {
  65. LoadDataFromCClip(*m_pMemoryClip);
  66. }
  67. else
  68. {
  69. CClip Clip;
  70. if(Clip.LoadMainTable(m_lCopyID))
  71. {
  72. Clip.LoadFormats(m_lCopyID);
  73. LoadDataFromCClip(Clip);
  74. }
  75. }
  76. }
  77. CATCH_SQLITE_EXCEPTION
  78. UpdateData(FALSE);
  79. if(m_bSetToTopMost)
  80. SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
  81. if(m_lCopyID == -1 && m_pMemoryClip != NULL)
  82. {
  83. GetDlgItem(IDOK)->SetFocus();
  84. }
  85. else
  86. {
  87. m_description.SetFocus();
  88. }
  89. m_Resize.SetParent(m_hWnd);
  90. m_Resize.AddControl(IDC_EDIT_PROPERTIES, DR_SizeHeight | DR_SizeWidth);
  91. m_Resize.AddControl(IDC_STATIC_FORMATS, DR_MoveTop);
  92. m_Resize.AddControl(IDC_COPY_DATA, DR_MoveTop | DR_SizeWidth);
  93. m_Resize.AddControl(IDC_DELETE_COPY_DATA, DR_MoveTop);
  94. m_Resize.AddControl(IDOK, DR_MoveTop | DR_MoveLeft);
  95. m_Resize.AddControl(IDCANCEL, DR_MoveTop | DR_MoveLeft);
  96. m_Resize.AddControl(IDC_EDIT_QUICK_PASTE, DR_SizeWidth);
  97. m_Resize.AddControl(IDC_COMBO1, DR_SizeWidth);
  98. theApp.m_Language.UpdateClipProperties(this);
  99. return FALSE;
  100. }
  101. void CCopyProperties::LoadDataFromCClip(CClip &Clip)
  102. {
  103. COleDateTime dtTime(Clip.m_Time.GetTime());
  104. m_eDate = dtTime.Format();
  105. COleDateTime lastPasteDate(Clip.m_lastPasteDate.GetTime());
  106. m_lastPasteDate = lastPasteDate.Format();
  107. m_description.SetWindowText(Clip.m_Desc);
  108. if(Clip.m_dontAutoDelete)
  109. {
  110. m_bNeverAutoDelete = TRUE;
  111. }
  112. else
  113. {
  114. m_bNeverAutoDelete = FALSE;
  115. }
  116. m_hotKeyGlobal = Clip.m_globalShortCut;
  117. m_GroupCombo.SetCurSelOnItemData(Clip.m_parentId);
  118. m_HotKey.SetHotKey(LOBYTE(Clip.m_shortCut), (HIBYTE(Clip.m_shortCut) & ~HOTKEYF_EXT));
  119. m_HotKey.SetRules(HKCOMB_A, 0);
  120. if(HIBYTE(Clip.m_shortCut) & HOTKEYF_EXT)
  121. {
  122. ::CheckDlgButton(m_hWnd, IDC_CHECK_WIN, BST_CHECKED);
  123. }
  124. m_moveToGroupHotKeyGlobal = Clip.m_globalMoveToGroupShortCut;
  125. m_MoveToGrouHotKey.SetHotKey(LOBYTE(Clip.m_moveToGroupShortCut), (HIBYTE(Clip.m_moveToGroupShortCut) & ~HOTKEYF_EXT));
  126. m_MoveToGrouHotKey.SetRules(HKCOMB_A, 0);
  127. if(HIBYTE(Clip.m_moveToGroupShortCut) & HOTKEYF_EXT)
  128. {
  129. ::CheckDlgButton(m_hWnd, IDC_CHECK_WIN_MOVE_TO_GROUP, BST_CHECKED);
  130. }
  131. m_QuickPasteText.SetWindowText(Clip.m_csQuickPaste);
  132. CString cs;
  133. CClipFormat* pCF;
  134. INT_PTR count = Clip.m_Formats.GetSize();
  135. for(int i = 0; i < count; i++)
  136. {
  137. pCF = &Clip.m_Formats.GetData()[i];
  138. if(pCF)
  139. {
  140. cs.Format(_T("%s, %d"), GetFormatName(pCF->m_cfType), GlobalSize(pCF->m_hgData));
  141. int nIndex = m_lCopyData.AddString(cs);
  142. if(m_lCopyID == -1 && pCF->m_dataId == -1)
  143. m_lCopyData.SetItemData(nIndex, i);
  144. else
  145. m_lCopyData.SetItemData(nIndex, pCF->m_dataId);
  146. }
  147. }
  148. int selectedRow = m_lCopyData.GetCount()-1;
  149. if(selectedRow >= 0 && selectedRow < m_lCopyData.GetCount())
  150. {
  151. m_lCopyData.SetSel(selectedRow);
  152. m_lCopyData.SetCurSel(selectedRow);
  153. m_lCopyData.SetCaretIndex(selectedRow);
  154. m_lCopyData.SetAnchorIndex(selectedRow);
  155. }
  156. if(Clip.m_bIsGroup == FALSE)
  157. {
  158. ::ShowWindow(::GetDlgItem(m_hWnd, IDC_STATIC_HOT_KEY_MOVE_TO_GROUP), SW_HIDE);
  159. ::ShowWindow(::GetDlgItem(m_hWnd, IDC_HOTKEY_MOVE_TO_GROUP), SW_HIDE);
  160. ::ShowWindow(::GetDlgItem(m_hWnd, IDC_CHECK_WIN_MOVE_TO_GROUP), SW_HIDE);
  161. ::ShowWindow(::GetDlgItem(m_hWnd, IDC_HOT_KEY_GLOBAL_MOVE_TO_GROUP), SW_HIDE);
  162. CRect anchorRect;
  163. ::GetWindowRect(::GetDlgItem(m_hWnd, IDC_STATIC_HOT_KEY_MOVE_TO_GROUP), &anchorRect);
  164. ScreenToClient(&anchorRect);
  165. HWND hwnd = ::GetTopWindow(this->GetSafeHwnd());
  166. // while we have a valid hwnd,
  167. // loop through all child windows
  168. while (hwnd)
  169. {
  170. CRect rect;
  171. ::GetWindowRect(hwnd, &rect);
  172. ScreenToClient(&rect);
  173. if(rect.top > anchorRect.bottom)
  174. {
  175. ::MoveWindow(hwnd, rect.left,
  176. rect.top - (anchorRect.Height()+4), rect.Width(),
  177. rect.Height(), TRUE);
  178. }
  179. // do something with the hwnd
  180. // and get the next child control's hwnd
  181. hwnd = ::GetNextWindow(hwnd, GW_HWNDNEXT);
  182. }
  183. CRect rect2;
  184. ::GetWindowRect(m_hWnd, &rect2);
  185. ::MoveWindow(m_hWnd, rect2.left,
  186. rect2.top, rect2.Width(),
  187. rect2.Height() - (anchorRect.Height()+4), TRUE);
  188. }
  189. }
  190. void CCopyProperties::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
  191. {
  192. CDialog::OnActivate(nState, pWndOther, bMinimized);
  193. if (nState == WA_INACTIVE)
  194. {
  195. if(m_bHideOnKillFocus)
  196. {
  197. if(!m_bHandleKillFocus)
  198. {
  199. EndDialog(-1);
  200. m_bHandleKillFocus = false;
  201. }
  202. }
  203. }
  204. else if (nState == WA_ACTIVE)
  205. {
  206. SetFocus();
  207. ::SetForegroundWindow(m_hWnd);
  208. }
  209. }
  210. void CCopyProperties::OnOK()
  211. {
  212. UpdateData();
  213. try
  214. {
  215. if(m_lCopyID == -1 && m_pMemoryClip != NULL)
  216. {
  217. LoadDataIntoCClip(*m_pMemoryClip);
  218. m_DeletedData.SortDescending();
  219. INT_PTR count = m_DeletedData.GetSize();
  220. for(int i = 0; i < count; i++)
  221. {
  222. m_pMemoryClip->m_Formats.RemoveAt(m_DeletedData[i]);
  223. }
  224. }
  225. else
  226. {
  227. CClip clip;
  228. if(clip.LoadMainTable(m_lCopyID))
  229. {
  230. LoadDataIntoCClip(clip);
  231. if(CheckGlobalHotKey(clip) == FALSE)
  232. {
  233. if(MessageBox(_T("Error registering global hot key\n\nContinue?"), _T(""), MB_YESNO|MB_ICONWARNING) == IDNO)
  234. {
  235. return;
  236. }
  237. }
  238. if(CheckMoveToGroupGlobalHotKey(clip) == FALSE)
  239. {
  240. if(MessageBox(_T("Error registering global move to group hot key\n\nContinue?"), _T(""), MB_YESNO|MB_ICONWARNING) == IDNO)
  241. {
  242. return;
  243. }
  244. }
  245. if(clip.ModifyMainTable())
  246. {
  247. if(m_bDeletedData)
  248. {
  249. DeleteFormats(m_lCopyID, m_DeletedData);
  250. }
  251. }
  252. }
  253. }
  254. m_bHandleKillFocus = true;
  255. }
  256. CATCH_SQLITE_EXCEPTION
  257. CDialog::OnOK();
  258. }
  259. BOOL CCopyProperties::CheckGlobalHotKey(CClip &clip)
  260. {
  261. BOOL ret = FALSE;
  262. if(clip.m_globalShortCut)
  263. {
  264. ret = g_HotKeys.ValidateClip(clip.m_id, clip.m_shortCut, clip.m_Desc);
  265. }
  266. else
  267. {
  268. g_HotKeys.Remove(clip.m_id, CHotKey::PASTE_OPEN_CLIP);
  269. ret = TRUE;
  270. }
  271. return ret;
  272. }
  273. BOOL CCopyProperties::CheckMoveToGroupGlobalHotKey(CClip &clip)
  274. {
  275. BOOL ret = FALSE;
  276. if(clip.m_globalMoveToGroupShortCut)
  277. {
  278. ret = g_HotKeys.ValidateClip(clip.m_id, clip.m_moveToGroupShortCut, clip.m_Desc);
  279. }
  280. else
  281. {
  282. g_HotKeys.Remove(clip.m_id, CHotKey::MOVE_TO_GROUP);
  283. ret = TRUE;
  284. }
  285. return ret;
  286. }
  287. void CCopyProperties::LoadDataIntoCClip(CClip &Clip)
  288. {
  289. long lHotKey = m_HotKey.GetHotKey();
  290. short sKeyKode = LOBYTE(m_HotKey.GetHotKey());
  291. short sModifers = HIBYTE(m_HotKey.GetHotKey());
  292. if(sKeyKode && ::IsDlgButtonChecked(m_hWnd, IDC_CHECK_WIN))
  293. {
  294. sModifers |= HOTKEYF_EXT;
  295. }
  296. Clip.m_shortCut = MAKEWORD(sKeyKode, sModifers);
  297. long moveToGroupHotKey = m_MoveToGrouHotKey.GetHotKey();
  298. short moveToGroupKeyKode = LOBYTE(m_MoveToGrouHotKey.GetHotKey());
  299. short moveToGroupModifers = HIBYTE(m_MoveToGrouHotKey.GetHotKey());
  300. if(moveToGroupKeyKode && ::IsDlgButtonChecked(m_hWnd, IDC_CHECK_WIN_MOVE_TO_GROUP))
  301. {
  302. moveToGroupModifers |= HOTKEYF_EXT;
  303. }
  304. Clip.m_moveToGroupShortCut = MAKEWORD(moveToGroupKeyKode, moveToGroupModifers);
  305. //remove any others that have the same hot key
  306. if(Clip.m_shortCut > 0)
  307. {
  308. theApp.m_db.execDMLEx(_T("UPDATE Main SET lShortCut = 0 where lShortCut = %d AND lID <> %d;"), Clip.m_shortCut, m_lCopyID);
  309. }
  310. if(Clip.m_moveToGroupShortCut > 0)
  311. {
  312. theApp.m_db.execDMLEx(_T("UPDATE Main SET MoveToGroupShortCut = 0 where MoveToGroupShortCut = %d AND lID <> %d;"), Clip.m_shortCut, m_lCopyID);
  313. }
  314. m_description.GetWindowText(Clip.m_Desc);
  315. Clip.m_Desc.Replace(_T("'"), _T("''"));
  316. m_QuickPasteText.GetWindowText(Clip.m_csQuickPaste);
  317. Clip.m_csQuickPaste.MakeUpper();
  318. Clip.m_csQuickPaste.Replace(_T("'"), _T("''"));
  319. //remove any other that have the same quick paste text
  320. if(Clip.m_csQuickPaste.IsEmpty() == FALSE)
  321. {
  322. theApp.m_db.execDMLEx(_T("UPDATE Main SET QuickPasteText = '' WHERE QuickPasteText = '%s' AND lID <> %d;"), Clip.m_csQuickPaste, m_lCopyID);
  323. }
  324. Clip.m_parentId = m_GroupCombo.GetItemDataFromCursel();
  325. //If we are going from no group to a group or the
  326. //don't auto delete check box is checked
  327. if(m_bNeverAutoDelete)
  328. {
  329. Clip.m_dontAutoDelete = (int)CTime::GetCurrentTime().GetTime();
  330. }
  331. else if(m_bNeverAutoDelete == FALSE)
  332. {
  333. Clip.m_dontAutoDelete = FALSE;
  334. }
  335. Clip.m_globalShortCut = m_hotKeyGlobal;
  336. Clip.m_globalMoveToGroupShortCut = m_moveToGroupHotKeyGlobal;
  337. }
  338. void CCopyProperties::OnDeleteCopyData()
  339. {
  340. int nCount = m_lCopyData.GetSelCount();
  341. if(nCount)
  342. {
  343. m_bDeletedData = true;
  344. //Get the selected indexes
  345. ARRAY items;
  346. items.SetSize(nCount);
  347. m_lCopyData.GetSelItems(nCount, items.GetData());
  348. items.SortDescending();
  349. //Get the selected itemdata
  350. for(int i = 0; i < nCount; i++)
  351. {
  352. int row = items[i];
  353. m_DeletedData.Add((int)m_lCopyData.GetItemData(row));
  354. m_lCopyData.DeleteString(row);
  355. int newRow = row-1;
  356. if(newRow < 0)
  357. {
  358. newRow = 0;
  359. }
  360. if(newRow >= 0 && newRow < m_lCopyData.GetCount())
  361. {
  362. m_lCopyData.SetSel(newRow);
  363. m_lCopyData.SetCurSel(newRow);
  364. m_lCopyData.SetCaretIndex(newRow);
  365. m_lCopyData.SetAnchorIndex(newRow);
  366. }
  367. }
  368. }
  369. }
  370. void CCopyProperties::OnCancel()
  371. {
  372. m_bHandleKillFocus = true;
  373. CDialog::OnCancel();
  374. }
  375. void CCopyProperties::OnSize(UINT nType, int cx, int cy)
  376. {
  377. CDialog::OnSize(nType, cx, cy);
  378. m_Resize.MoveControls(CSize(cx, cy));
  379. }