DeleteClipData.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. // DeleteClipData.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "CP_Main.h"
  5. #include "DeleteClipData.h"
  6. #include "afxdialogex.h"
  7. #include "Misc.h"
  8. #include "ProgressWnd.h"
  9. #include <algorithm>
  10. // CDeleteClipData dialog
  11. IMPLEMENT_DYNAMIC(CDeleteClipData, CDialog)
  12. CDeleteClipData::CDeleteClipData(CWnd* pParent /*=NULL*/)
  13. : CDialog(CDeleteClipData::IDD, pParent)
  14. , m_clipTitle(_T(""))
  15. , m_filterByClipTitle(FALSE)
  16. , m_filterByCreatedDate(FALSE)
  17. , m_filterByLastUsedDate(FALSE)
  18. , m_filterByClipboardFormat(FALSE)
  19. , m_createdDateStart(COleDateTime::GetCurrentTime())
  20. , m_createdDateEnd(COleDateTime::GetCurrentTime())
  21. , m_createdTimeStart(COleDateTime::GetCurrentTime())
  22. , m_createdTimeEnd(COleDateTime::GetCurrentTime())
  23. , m_usedTimeStart(COleDateTime::GetCurrentTime())
  24. , m_usedTimeEnd(COleDateTime::GetCurrentTime())
  25. , m_usedDateStart(COleDateTime::GetCurrentTime())
  26. , m_usedDateEnd(COleDateTime::GetCurrentTime())
  27. , m_databaseSize(_T(""))
  28. , m_selectedSize(_T(""))
  29. , m_selectedCount(_T(""))
  30. {
  31. m_applyingDelete = false;
  32. m_cancelDelete = false;
  33. }
  34. CDeleteClipData::~CDeleteClipData()
  35. {
  36. }
  37. void CDeleteClipData::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. DDX_Control(pDX, IDC_LIST2, m_List);
  41. DDX_Text(pDX, IDC_EDIT_CLIP_TITLE, m_clipTitle);
  42. DDX_Check(pDX, IDC_CHECK_CLIP_TITLE, m_filterByClipTitle);
  43. DDX_Check(pDX, IDC_CHECK_CREATE_DATE, m_filterByCreatedDate);
  44. DDX_Check(pDX, IDC_CHECK_LAST_USE_DATE, m_filterByLastUsedDate);
  45. DDX_Check(pDX, IDC_CHECK_DATA_FORMAT, m_filterByClipboardFormat);
  46. DDX_Control(pDX, IDC_COMBO_DATA_FORMAT, m_clipboardFomatCombo);
  47. DDX_DateTimeCtrl(pDX, IDC_DATE_CREATE_START, m_createdDateStart);
  48. DDX_DateTimeCtrl(pDX, IDC_DATE_CREATE_END, m_createdDateEnd);
  49. DDX_DateTimeCtrl(pDX, IDC_TIME_CREATE_START, m_createdTimeStart);
  50. DDX_DateTimeCtrl(pDX, IDC_TIME_CREATE_END, m_createdTimeEnd);
  51. DDX_DateTimeCtrl(pDX, IDC_TIME_USE_START, m_usedTimeStart);
  52. DDX_DateTimeCtrl(pDX, IDC_TIME_USE_END, m_usedTimeEnd);
  53. DDX_DateTimeCtrl(pDX, IDC_DATE_USE_START, m_usedDateStart);
  54. DDX_DateTimeCtrl(pDX, IDC_DATE_USE_END, m_usedDateEnd);
  55. DDX_Text(pDX, IDC_STATIC_DB_SIZE, m_databaseSize);
  56. DDX_Text(pDX, IDC_STATIC_SELECTED_SIZE, m_selectedSize);
  57. DDX_Text(pDX, IDC_STATIC_SELECTED_COUNT, m_selectedCount);
  58. }
  59. BEGIN_MESSAGE_MAP(CDeleteClipData, CDialog)
  60. ON_WM_CLOSE()
  61. ON_WM_SIZE()
  62. ON_WM_NCDESTROY()
  63. ON_BN_CLICKED(IDC_BUTTON_SEARCH, &CDeleteClipData::OnBnClickedButtonSearch)
  64. ON_NOTIFY(LVN_KEYDOWN, IDC_LIST2, &CDeleteClipData::OnLvnKeydownList2)
  65. ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST2, &CDeleteClipData::OnLvnItemchangedList2)
  66. ON_NOTIFY(HDN_GETDISPINFO, 0, &CDeleteClipData::OnHdnGetdispinfoList2)
  67. ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST2, &CDeleteClipData::OnLvnGetdispinfoList2)
  68. ON_BN_CLICKED(IDC_CHECK_CLIP_TITLE, &CDeleteClipData::OnBnClickedCheckClipTitle)
  69. ON_BN_CLICKED(IDC_BUTTON_APPLY, &CDeleteClipData::OnBnClickedButtonApply)
  70. ON_BN_CLICKED(IDCANCEL, &CDeleteClipData::OnBnClickedCancel)
  71. ON_WM_TIMER()
  72. ON_BN_CLICKED(IDC_CHECK_CREATE_DATE, &CDeleteClipData::OnBnClickedCheckCreateDate)
  73. ON_BN_CLICKED(IDC_CHECK_LAST_USE_DATE, &CDeleteClipData::OnBnClickedCheckLastUseDate)
  74. ON_BN_CLICKED(IDC_CHECK_DATA_FORMAT, &CDeleteClipData::OnBnClickedCheckDataFormat)
  75. ON_NOTIFY(HDN_ITEMCLICK, 0, &CDeleteClipData::OnLvnColumnclickList2)
  76. END_MESSAGE_MAP()
  77. BOOL CDeleteClipData::OnInitDialog()
  78. {
  79. CDialog::OnInitDialog();
  80. theApp.m_Language.UpdateDeleteClipData(this);
  81. m_Resize.SetParent(m_hWnd);
  82. m_Resize.AddControl(IDC_LIST2, DR_SizeHeight | DR_SizeWidth);
  83. m_Resize.AddControl(IDCANCEL, DR_MoveTop | DR_MoveLeft);
  84. m_Resize.AddControl(IDC_BUTTON_APPLY, DR_MoveTop | DR_MoveLeft);
  85. m_Resize.AddControl(IDC_STATIC_TO_DELETE_TEXT, DR_MoveTop);
  86. m_Resize.AddControl(IDC_STATIC_TO_DELETE_SIZE, DR_MoveTop);
  87. m_Resize.AddControl(IDC_STATIC_SELECTED_SIZE, DR_MoveTop);
  88. m_Resize.AddControl(IDC_STATIC_SELECTED_SIZE_TEXT, DR_MoveTop);
  89. m_Resize.AddControl(IDC_STATIC_DB_SIZE, DR_MoveTop);
  90. m_Resize.AddControl(IDC_STATIC_DB_SIZE_TEXT, DR_MoveTop);
  91. m_Resize.AddControl(IDC_BUTTON_SEARCH, DR_MoveLeft);
  92. m_Resize.AddControl(IDC_STATIC_GROUP_SEARCH, DR_SizeWidth);
  93. InitListCtrlCols();
  94. SetTimer(1, 500, 0);
  95. SetDbSize();
  96. return TRUE;
  97. }
  98. void CDeleteClipData::SetDbSize()
  99. {
  100. __int64 size = FileSize(GetDBName());
  101. const int MAX_FILE_SIZE_BUFFER = 255;
  102. TCHAR szFileSize[MAX_FILE_SIZE_BUFFER];
  103. StrFormatByteSize(size, szFileSize, MAX_FILE_SIZE_BUFFER);
  104. m_databaseSize = szFileSize;
  105. UpdateData(0);
  106. }
  107. void CDeleteClipData::InitListCtrlCols()
  108. {
  109. m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT);
  110. m_List.InsertColumn(0, theApp.m_Language.GetDeleteClipDataString("Title", "Title"), LVCFMT_LEFT, 350);
  111. m_List.InsertColumn(1, theApp.m_Language.GetDeleteClipDataString("Created", "Created"), LVCFMT_LEFT, 150);
  112. m_List.InsertColumn(2, theApp.m_Language.GetDeleteClipDataString("LastUsed", "Last Used"), LVCFMT_LEFT, 150);
  113. m_List.InsertColumn(3, theApp.m_Language.GetDeleteClipDataString("Format", "Format"), LVCFMT_LEFT, 150);
  114. m_List.InsertColumn(4, theApp.m_Language.GetDeleteClipDataString("DataSize", "Data Size"), LVCFMT_LEFT, 100);
  115. }
  116. void CDeleteClipData::LoadItems()
  117. {
  118. CWaitCursor wait;
  119. m_data.clear();
  120. m_filteredOut.clear();
  121. if (m_clipboardFomatCombo.GetCount() == 0)
  122. {
  123. CppSQLite3Query qFormats = theApp.m_db.execQueryEx(_T("select DISTINCT(strClipBoardFormat) from Data"));
  124. while (qFormats.eof() == false)
  125. {
  126. CString format = qFormats.getStringField(_T("strClipBoardFormat"));
  127. m_clipboardFomatCombo.AddString(format);
  128. qFormats.nextRow();
  129. }
  130. }
  131. CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT Main.lID, Main.mText, Main.lDate, Main.lastPasteDate, "
  132. _T("Data.lID AS DataID, Data.strClipBoardFormat, length(Data.ooData) AS DataLength ")
  133. _T("FROM Data ")
  134. _T("INNER JOIN Main on Main.lID = Data.lParentID ")
  135. _T("ORDER BY length(ooData) DESC")));
  136. int row = 0;
  137. while (q.eof() == false)
  138. {
  139. CDeleteData data;
  140. data.m_lID = q.getIntField(_T("lID"));
  141. data.m_Desc = q.getStringField(_T("mText"));
  142. data.m_createdDateTime = q.getIntField(_T("lDate"));
  143. data.m_lastUsedDateTime = q.getIntField(_T("lastPasteDate"));
  144. data.m_clipboardFormat = q.getStringField(_T("strClipBoardFormat"));
  145. data.m_dataSize = q.getIntField(_T("DataLength"));
  146. data.m_DatalID = q.getIntField(_T("DataID"));
  147. m_data.push_back(data);
  148. row++;
  149. q.nextRow();
  150. }
  151. m_List.SetItemCountEx(row, 0);
  152. }
  153. //void CDeleteClipData::AddRow(CppSQLite3Query& q, int row)
  154. //{
  155. // LVITEM lvi;
  156. //
  157. // lvi.mask = LVIF_TEXT;
  158. // lvi.iItem = row;
  159. //
  160. // lvi.iSubItem = 0;
  161. // lvi.pszText = (LPTSTR) (LPCTSTR) (q.getStringField(_T("mText")));
  162. // m_List.InsertItem(&lvi);
  163. //
  164. // CTime created = q.getIntField(_T("lDate"));
  165. // COleDateTime dtTime(created.GetTime());
  166. //
  167. // CTime pasted = q.getIntField(_T("lastPasteDate"));
  168. // COleDateTime dtPastedTime(pasted.GetTime());
  169. //
  170. // m_List.SetItemText(row, 1, dtTime.Format());
  171. // m_List.SetItemText(row, 2, dtPastedTime.Format());
  172. // m_List.SetItemText(row, 3, q.getStringField(_T("strClipBoardFormat")));
  173. //
  174. // int dataLength = q.getIntField(_T("DataLength"));
  175. //
  176. // const int MAX_FILE_SIZE_BUFFER = 255;
  177. // TCHAR szFileSize[MAX_FILE_SIZE_BUFFER];
  178. // StrFormatByteSize(dataLength, szFileSize, MAX_FILE_SIZE_BUFFER);
  179. //
  180. // m_List.SetItemText(row, 4, szFileSize);
  181. //
  182. // m_List.SetItemData(row, ));
  183. //}
  184. void CDeleteClipData::SetNotifyWnd(HWND hWnd)
  185. {
  186. m_hWndParent = hWnd;
  187. }
  188. void CDeleteClipData::OnClose()
  189. {
  190. if (m_applyingDelete)
  191. {
  192. return;
  193. }
  194. DestroyWindow();
  195. }
  196. void CDeleteClipData::OnSize(UINT nType, int cx, int cy)
  197. {
  198. CDialog::OnSize(nType, cx, cy);
  199. m_Resize.MoveControls(CSize(cx, cy));
  200. }
  201. void CDeleteClipData::OnNcDestroy()
  202. {
  203. CDialog::OnNcDestroy();
  204. ::PostMessage(m_hWndParent, WM_DELETE_CLIPS_CLOSED, 0, 0);
  205. }
  206. // CDeleteClipData message handlers
  207. void CDeleteClipData::OnBnClickedButtonSearch()
  208. {
  209. FilterItems();
  210. }
  211. void CDeleteClipData::FilterItems()
  212. {
  213. UpdateData();
  214. //First search the already filtered text, see if we need to add them back in
  215. std::vector<int> filteredRowsToDelete;
  216. std::vector<CDeleteData> addBackIn;
  217. INT_PTR count = m_filteredOut.size();
  218. for (int i = 0; i < count; i++)
  219. {
  220. CDeleteData data = m_filteredOut[i];
  221. if (MatchesFilter(&data))
  222. {
  223. addBackIn.push_back(data);
  224. filteredRowsToDelete.push_back(i);
  225. }
  226. }
  227. //next search the main list
  228. std::vector<int> rowsToDelete;
  229. count = m_data.size();
  230. for (int i = 0; i < count; i++)
  231. {
  232. CDeleteData data = m_data[i];
  233. if(MatchesFilter(&data) == false)
  234. {
  235. m_filteredOut.push_back(data);
  236. rowsToDelete.push_back(i);
  237. }
  238. }
  239. //Add back in the filtered out ones that now match
  240. count = addBackIn.size();
  241. for (int i = 0; i < count; i++)
  242. {
  243. CDeleteData data = addBackIn[i];
  244. m_data.push_back(data);
  245. }
  246. int toSelect = -1;
  247. //Remove from the main list the ones that don't match
  248. count = rowsToDelete.size();
  249. for (INT_PTR i = count - 1; i >= 0; i--)
  250. {
  251. int row = rowsToDelete[i];
  252. toSelect = row;
  253. m_data.erase(m_data.begin() + row);
  254. }
  255. //Remove the rows that were filtered out but now match
  256. count = filteredRowsToDelete.size();
  257. for (INT_PTR i = count - 1; i >= 0; i--)
  258. {
  259. int row = filteredRowsToDelete[i];
  260. m_filteredOut.erase(m_filteredOut.begin() + row);
  261. }
  262. if (toSelect > -1)
  263. {
  264. m_List.SetItemState(toSelect, LVIS_SELECTED, LVIS_SELECTED);
  265. }
  266. m_List.SetItemCountEx((int)m_data.size(), 0);
  267. }
  268. bool CDeleteClipData::MatchesFilter(CDeleteData *pdata)
  269. {
  270. if(m_filterByClipTitle &&
  271. m_clipTitle != _T("") &&
  272. pdata->m_Desc != _T(""))
  273. {
  274. if(pdata->m_Desc.MakeLower().Find(m_clipTitle.MakeLower()) == -1)
  275. {
  276. return false;
  277. }
  278. }
  279. if (m_filterByCreatedDate)
  280. {
  281. CTime dateStart = CTime(m_createdDateStart.GetYear(), m_createdDateStart.GetMonth(), m_createdDateStart.GetDay(), m_createdTimeStart.GetHour(), m_createdTimeStart.GetMinute(), m_createdTimeStart.GetSecond());
  282. CTime dateEnd = CTime(m_createdDateEnd.GetYear(), m_createdDateEnd.GetMonth(), m_createdDateEnd.GetDay(), m_createdTimeEnd.GetHour(), m_createdTimeEnd.GetMinute(), m_createdTimeEnd.GetSecond());
  283. if (pdata->m_createdDateTime >= dateStart && pdata->m_createdDateTime <= dateEnd)
  284. {
  285. return true;
  286. }
  287. else
  288. {
  289. return false;
  290. }
  291. }
  292. if (m_filterByLastUsedDate)
  293. {
  294. CTime dateStart = CTime(m_usedDateStart.GetYear(), m_usedDateStart.GetMonth(), m_usedDateStart.GetDay(), m_usedTimeStart.GetHour(), m_usedTimeStart.GetMinute(), m_usedTimeStart.GetSecond());
  295. CTime dateEnd = CTime(m_usedDateEnd.GetYear(), m_usedDateEnd.GetMonth(), m_usedDateEnd.GetDay(), m_usedTimeEnd.GetHour(), m_usedTimeEnd.GetMinute(), m_usedTimeEnd.GetSecond());
  296. if (pdata->m_lastUsedDateTime >= dateStart && pdata->m_lastUsedDateTime <= dateEnd)
  297. {
  298. return true;
  299. }
  300. else
  301. {
  302. return false;
  303. }
  304. }
  305. if (m_filterByClipboardFormat)
  306. {
  307. CString str1;
  308. int n = m_clipboardFomatCombo.GetLBTextLen(m_clipboardFomatCombo.GetCurSel());
  309. m_clipboardFomatCombo.GetLBText(m_clipboardFomatCombo.GetCurSel(), str1.GetBuffer(n));
  310. str1.ReleaseBuffer();
  311. if (pdata->m_clipboardFormat == str1)
  312. {
  313. return true;
  314. }
  315. else
  316. {
  317. return false;
  318. }
  319. }
  320. return true;
  321. }
  322. void CDeleteClipData::OnLvnKeydownList2(NMHDR *pNMHDR, LRESULT *pResult)
  323. {
  324. LPNMLVKEYDOWN pLVKeyDow = reinterpret_cast<LPNMLVKEYDOWN>(pNMHDR);
  325. // TODO: Add your control notification handler code here
  326. switch(pLVKeyDow->wVKey)
  327. {
  328. case VK_DELETE:
  329. this->ApplyDelete();
  330. break;
  331. }
  332. *pResult = 0;
  333. }
  334. void CDeleteClipData::OnLvnItemchangedList2(NMHDR *pNMHDR, LRESULT *pResult)
  335. {
  336. LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
  337. POSITION pos = m_List.GetFirstSelectedItemPosition();
  338. __int64 selectedDataSize = 0;
  339. int selectedCount = 0;
  340. if (pos != NULL)
  341. {
  342. while (pos)
  343. {
  344. INT_PTR row = m_List.GetNextSelectedItem(pos);
  345. if(row >= 0 && row < (INT_PTR)m_data.size())
  346. {
  347. selectedDataSize += m_data[row].m_dataSize;
  348. selectedCount++;
  349. }
  350. }
  351. }
  352. const int MAX_FILE_SIZE_BUFFER = 255;
  353. TCHAR szFileSize[MAX_FILE_SIZE_BUFFER];
  354. StrFormatByteSize(selectedDataSize, szFileSize, MAX_FILE_SIZE_BUFFER);
  355. m_selectedSize = szFileSize;
  356. CString count;
  357. count.Format(_T("%d"), selectedCount);
  358. m_selectedCount = count;
  359. UpdateData(0);
  360. *pResult = 0;
  361. }
  362. void CDeleteClipData::OnHdnGetdispinfoList2(NMHDR *pNMHDR, LRESULT *pResult)
  363. {
  364. LPNMHDDISPINFO pDispInfo = reinterpret_cast<LPNMHDDISPINFO>(pNMHDR);
  365. if (pDispInfo->mask &LVIF_TEXT)
  366. {
  367. switch (pDispInfo->iItem)
  368. {
  369. case 0:
  370. break;
  371. }
  372. }
  373. *pResult = 0;
  374. }
  375. void CDeleteClipData::OnLvnGetdispinfoList2(NMHDR *pNMHDR, LRESULT *pResult)
  376. {
  377. NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
  378. if (pDispInfo->item.mask & LVIF_TEXT)
  379. {
  380. if (pDispInfo->item.iItem >= 0 && pDispInfo->item.iItem < m_data.size())
  381. {
  382. switch (pDispInfo->item.iSubItem)
  383. {
  384. case 0:
  385. {
  386. lstrcpyn(pDispInfo->item.pszText, m_data[pDispInfo->item.iItem].m_Desc, pDispInfo->item.cchTextMax);
  387. pDispInfo->item.pszText[pDispInfo->item.cchTextMax - 1] = '\0';
  388. }
  389. break;
  390. case 1:
  391. {
  392. COleDateTime dtTime(m_data[pDispInfo->item.iItem].m_createdDateTime.GetTime());
  393. lstrcpyn(pDispInfo->item.pszText, dtTime.Format(), pDispInfo->item.cchTextMax);
  394. pDispInfo->item.pszText[pDispInfo->item.cchTextMax - 1] = '\0';
  395. }
  396. break;
  397. case 2:
  398. {
  399. COleDateTime dtTime(m_data[pDispInfo->item.iItem].m_lastUsedDateTime.GetTime());
  400. lstrcpyn(pDispInfo->item.pszText, dtTime.Format(), pDispInfo->item.cchTextMax);
  401. pDispInfo->item.pszText[pDispInfo->item.cchTextMax - 1] = '\0';
  402. }
  403. break;
  404. case 3:
  405. {
  406. lstrcpyn(pDispInfo->item.pszText, m_data[pDispInfo->item.iItem].m_clipboardFormat, pDispInfo->item.cchTextMax);
  407. pDispInfo->item.pszText[pDispInfo->item.cchTextMax - 1] = '\0';
  408. }
  409. break;
  410. case 4:
  411. {
  412. const int MAX_FILE_SIZE_BUFFER = 255;
  413. TCHAR szFileSize[MAX_FILE_SIZE_BUFFER];
  414. StrFormatByteSize(m_data[pDispInfo->item.iItem].m_dataSize, szFileSize, MAX_FILE_SIZE_BUFFER);
  415. lstrcpyn(pDispInfo->item.pszText, szFileSize, pDispInfo->item.cchTextMax);
  416. pDispInfo->item.pszText[pDispInfo->item.cchTextMax - 1] = '\0';
  417. }
  418. break;
  419. }
  420. }
  421. }
  422. *pResult = 0;
  423. }
  424. void CDeleteClipData::OnBnClickedCheckClipTitle()
  425. {
  426. UpdateData();
  427. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_CLIP_TITLE), m_filterByClipTitle);
  428. ::SetFocus(::GetDlgItem(m_hWnd, IDC_EDIT_CLIP_TITLE));
  429. }
  430. void CDeleteClipData::OnBnClickedButtonApply()
  431. {
  432. ApplyDelete();
  433. }
  434. void CDeleteClipData::ApplyDelete()
  435. {
  436. if (m_applyingDelete)
  437. return;
  438. if (MessageBox(_T("Delete selected items? This cannot be undone!"), _T(""), MB_YESNO | MB_ICONWARNING) == IDYES)
  439. {
  440. m_List.EnableWindow(FALSE);
  441. m_applyingDelete = true;
  442. m_cancelDelete = false;
  443. CWaitCursor wait;
  444. try
  445. {
  446. theApp.m_db.execDML(_T("PRAGMA auto_vacuum = 2"));
  447. POSITION pos = m_List.GetFirstSelectedItemPosition();
  448. std::vector<int> rowsToDelete;
  449. if (pos != NULL)
  450. {
  451. while (pos)
  452. {
  453. int row = m_List.GetNextSelectedItem(pos);
  454. rowsToDelete.push_back(row);
  455. }
  456. }
  457. CProgressWnd progress;
  458. progress.Create(this, _T("Deleting clip items"), TRUE);
  459. progress.SetRange(0, (int)rowsToDelete.size() + 4);
  460. progress.SetText(_T("Deleting selected items"));
  461. progress.SetStep(1);
  462. INT_PTR count = rowsToDelete.size();
  463. for (INT_PTR i = count - 1; i >= 0; i--)
  464. {
  465. progress.PeekAndPump();
  466. if (m_cancelDelete || progress.Cancelled())
  467. {
  468. break;
  469. }
  470. progress.StepIt();
  471. int row = rowsToDelete[i];
  472. CDeleteData data = m_data[row];
  473. try
  474. {
  475. //Sleep(100);
  476. int deleteCount = theApp.m_db.execDMLEx(_T("DELETE FROM Data where lID = %d"), data.m_DatalID);
  477. //If there are no more children for this clip then delete the parent
  478. int parentDeleteCount = theApp.m_db.execDMLEx(_T("DELETE FROM Main where lID IN ")
  479. _T("(")
  480. _T("SELECT Main.lID ")
  481. _T("FROM Main ")
  482. _T("LEFT OUTER JOIN Data on Data.lParentID = Main.lID ")
  483. _T("WHERE bIsGroup = 0 AND Main.lID = %d ")
  484. _T("Group by Main.lID ")
  485. _T("having Count(Data.lID) = 0 ")
  486. _T(")"), data.m_lID);
  487. m_data.erase(m_data.begin() + row);
  488. }
  489. CATCH_SQLITE_EXCEPTION
  490. }
  491. progress.StepIt();
  492. progress.SetText(_T("Shrinking database"));
  493. try
  494. {
  495. for(int i = 0; i < 100; i++)
  496. {
  497. int toDeleteCount = theApp.m_db.execScalar(_T("SELECT COUNT(clipID) FROM MainDeletes"));
  498. if(toDeleteCount <= 0)
  499. break;
  500. RemoveOldEntries(false);
  501. }
  502. }
  503. CATCH_SQLITE_EXCEPTION
  504. theApp.m_db.execDML(_T("PRAGMA auto_vacuum = 1"));
  505. theApp.m_db.execQuery(_T("VACUUM"));
  506. progress.StepIt();
  507. progress.SetText(_T("Refreshing database size"));
  508. SetDbSize();
  509. progress.StepIt();
  510. progress.SetText(_T("Reloading list"));
  511. //LoadItems();
  512. progress.StepIt();
  513. progress.SetText(_T("Applying filter"));
  514. FilterItems();
  515. m_List.SetItemCountEx((int)m_data.size(), 0);
  516. }
  517. CATCH_SQLITE_EXCEPTION
  518. m_applyingDelete = false;
  519. m_List.EnableWindow();
  520. }
  521. }
  522. void CDeleteClipData::OnBnClickedCancel()
  523. {
  524. if (m_applyingDelete)
  525. {
  526. m_cancelDelete = true;
  527. return;
  528. }
  529. DestroyWindow();
  530. }
  531. void CDeleteClipData::OnTimer(UINT_PTR nIDEvent)
  532. {
  533. switch(nIDEvent)
  534. {
  535. case 1:
  536. LoadItems();
  537. KillTimer(1);
  538. break;
  539. }
  540. CDialog::OnTimer(nIDEvent);
  541. }
  542. void CDeleteClipData::OnBnClickedCheckCreateDate()
  543. {
  544. UpdateData();
  545. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_DATE_CREATE_START), m_filterByCreatedDate);
  546. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_TIME_CREATE_START), m_filterByCreatedDate);
  547. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_DATE_CREATE_END), m_filterByCreatedDate);
  548. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_TIME_CREATE_END), m_filterByCreatedDate);
  549. ::SetFocus(::GetDlgItem(m_hWnd, IDC_DATE_CREATE_START));
  550. }
  551. void CDeleteClipData::OnBnClickedCheckLastUseDate()
  552. {
  553. UpdateData();
  554. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_DATE_USE_START), m_filterByLastUsedDate);
  555. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_TIME_USE_START), m_filterByLastUsedDate);
  556. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_DATE_USE_END), m_filterByLastUsedDate);
  557. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_TIME_USE_END), m_filterByLastUsedDate);
  558. ::SetFocus(::GetDlgItem(m_hWnd, IDC_DATE_USE_START));
  559. }
  560. void CDeleteClipData::OnBnClickedCheckDataFormat()
  561. {
  562. UpdateData();
  563. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_COMBO_DATA_FORMAT), m_filterByClipboardFormat);
  564. ::SetFocus(::GetDlgItem(m_hWnd, IDC_COMBO_DATA_FORMAT));
  565. }
  566. static bool SortByTitleDesc(const CDeleteData& a1, const CDeleteData& a2)
  567. {
  568. return a1.m_Desc > a2.m_Desc;
  569. }
  570. static bool SortByCreatedDateDesc(const CDeleteData& a1, const CDeleteData& a2)
  571. {
  572. return a1.m_createdDateTime > a2.m_createdDateTime;
  573. }
  574. static bool SortByLastUsedDateDesc(const CDeleteData& a1, const CDeleteData& a2)
  575. {
  576. return a1.m_lastUsedDateTime > a2.m_lastUsedDateTime;
  577. }
  578. static bool SortByFormatDesc(const CDeleteData& a1, const CDeleteData& a2)
  579. {
  580. return a1.m_clipboardFormat > a2.m_clipboardFormat;
  581. }
  582. static bool SortByDataSizeDesc(const CDeleteData& a1, const CDeleteData& a2)
  583. {
  584. return a1.m_dataSize > a2.m_dataSize;
  585. }
  586. static bool SortByTitleAsc(const CDeleteData& a1, const CDeleteData& a2)
  587. {
  588. return a1.m_Desc < a2.m_Desc;
  589. }
  590. static bool SortByCreatedDateAsc(const CDeleteData& a1, const CDeleteData& a2)
  591. {
  592. return a1.m_createdDateTime < a2.m_createdDateTime;
  593. }
  594. static bool SortByLastUsedDateAsc(const CDeleteData& a1, const CDeleteData& a2)
  595. {
  596. return a1.m_lastUsedDateTime < a2.m_lastUsedDateTime;
  597. }
  598. static bool SortByFormatAsc(const CDeleteData& a1, const CDeleteData& a2)
  599. {
  600. return a1.m_clipboardFormat < a2.m_clipboardFormat;
  601. }
  602. static bool SortByDataSizeAsc(const CDeleteData& a1, const CDeleteData& a2)
  603. {
  604. return a1.m_dataSize < a2.m_dataSize;
  605. }
  606. bool desc = true;
  607. void CDeleteClipData::OnLvnColumnclickList2(NMHDR *pNMHDR, LRESULT *pResult)
  608. {
  609. HD_NOTIFY *phdn = (HD_NOTIFY *)pNMHDR;
  610. switch (phdn->iItem)
  611. {
  612. case 0:
  613. if(desc)
  614. std::sort(m_data.begin(), m_data.end(), SortByTitleDesc);
  615. else
  616. std::sort(m_data.begin(), m_data.end(), SortByTitleAsc);
  617. break;
  618. case 1:
  619. if(desc)
  620. std::sort(m_data.begin(), m_data.end(), SortByCreatedDateDesc);
  621. else
  622. std::sort(m_data.begin(), m_data.end(), SortByCreatedDateAsc);
  623. break;
  624. case 2:
  625. if(desc)
  626. std::sort(m_data.begin(), m_data.end(), SortByLastUsedDateDesc);
  627. else
  628. std::sort(m_data.begin(), m_data.end(), SortByLastUsedDateAsc);
  629. break;
  630. case 3:
  631. if(desc)
  632. std::sort(m_data.begin(), m_data.end(), SortByFormatDesc);
  633. else
  634. std::sort(m_data.begin(), m_data.end(), SortByFormatAsc);
  635. break;
  636. case 4:
  637. if(desc)
  638. std::sort(m_data.begin(), m_data.end(), SortByDataSizeDesc);
  639. else
  640. std::sort(m_data.begin(), m_data.end(), SortByDataSizeAsc);
  641. break;
  642. }
  643. desc = !desc;
  644. m_List.SetItemCountEx((int)m_data.size(), 0);
  645. *pResult = 0;
  646. }