DeleteClipData.cpp 18 KB

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