DeleteClipData.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802
  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("QuickPasteText", "Quick Paste Text"), LVCFMT_LEFT, 200);
  112. m_List.InsertColumn(2, theApp.m_Language.GetDeleteClipDataString("Created", "Created"), LVCFMT_LEFT, 150);
  113. m_List.InsertColumn(3, theApp.m_Language.GetDeleteClipDataString("LastUsed", "Last Used"), LVCFMT_LEFT, 150);
  114. m_List.InsertColumn(4, theApp.m_Language.GetDeleteClipDataString("Format", "Format"), LVCFMT_LEFT, 150);
  115. m_List.InsertColumn(5, theApp.m_Language.GetDeleteClipDataString("DataSize", "Data Size"), LVCFMT_LEFT, 100);
  116. }
  117. void CDeleteClipData::LoadItems()
  118. {
  119. CWaitCursor wait;
  120. m_data.clear();
  121. m_filteredOut.clear();
  122. if (m_clipboardFomatCombo.GetCount() == 0)
  123. {
  124. CppSQLite3Query qFormats = theApp.m_db.execQueryEx(_T("select DISTINCT(strClipBoardFormat) from Data"));
  125. while (qFormats.eof() == false)
  126. {
  127. CString format = qFormats.getStringField(_T("strClipBoardFormat"));
  128. m_clipboardFomatCombo.AddString(format);
  129. qFormats.nextRow();
  130. }
  131. }
  132. CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT Main.lID, Main.mText, Main.lDate, Main.lastPasteDate, Main.QuickPasteText, 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. data.m_quickPasteText = q.getStringField(_T("QuickPasteText"));
  148. m_data.push_back(data);
  149. row++;
  150. q.nextRow();
  151. }
  152. m_List.SetItemCountEx(row, 0);
  153. }
  154. //void CDeleteClipData::AddRow(CppSQLite3Query& q, int row)
  155. //{
  156. // LVITEM lvi;
  157. //
  158. // lvi.mask = LVIF_TEXT;
  159. // lvi.iItem = row;
  160. //
  161. // lvi.iSubItem = 0;
  162. // lvi.pszText = (LPTSTR) (LPCTSTR) (q.getStringField(_T("mText")));
  163. // m_List.InsertItem(&lvi);
  164. //
  165. // CTime created = q.getIntField(_T("lDate"));
  166. // COleDateTime dtTime(created.GetTime());
  167. //
  168. // CTime pasted = q.getIntField(_T("lastPasteDate"));
  169. // COleDateTime dtPastedTime(pasted.GetTime());
  170. //
  171. // m_List.SetItemText(row, 1, dtTime.Format());
  172. // m_List.SetItemText(row, 2, dtPastedTime.Format());
  173. // m_List.SetItemText(row, 3, q.getStringField(_T("strClipBoardFormat")));
  174. //
  175. // int dataLength = q.getIntField(_T("DataLength"));
  176. //
  177. // const int MAX_FILE_SIZE_BUFFER = 255;
  178. // TCHAR szFileSize[MAX_FILE_SIZE_BUFFER];
  179. // StrFormatByteSize(dataLength, szFileSize, MAX_FILE_SIZE_BUFFER);
  180. //
  181. // m_List.SetItemText(row, 4, szFileSize);
  182. //
  183. // m_List.SetItemData(row, ));
  184. //}
  185. void CDeleteClipData::SetNotifyWnd(HWND hWnd)
  186. {
  187. m_hWndParent = hWnd;
  188. }
  189. void CDeleteClipData::OnClose()
  190. {
  191. if (m_applyingDelete)
  192. {
  193. return;
  194. }
  195. DestroyWindow();
  196. }
  197. void CDeleteClipData::OnSize(UINT nType, int cx, int cy)
  198. {
  199. CDialog::OnSize(nType, cx, cy);
  200. m_Resize.MoveControls(CSize(cx, cy));
  201. }
  202. void CDeleteClipData::OnNcDestroy()
  203. {
  204. CDialog::OnNcDestroy();
  205. ::PostMessage(m_hWndParent, WM_DELETE_CLIPS_CLOSED, 0, 0);
  206. }
  207. // CDeleteClipData message handlers
  208. void CDeleteClipData::OnBnClickedButtonSearch()
  209. {
  210. FilterItems();
  211. }
  212. void CDeleteClipData::FilterItems()
  213. {
  214. UpdateData();
  215. //First search the already filtered text, see if we need to add them back in
  216. std::vector<int> filteredRowsToDelete;
  217. std::vector<CDeleteData> addBackIn;
  218. INT_PTR count = m_filteredOut.size();
  219. for (int i = 0; i < count; i++)
  220. {
  221. CDeleteData data = m_filteredOut[i];
  222. if (MatchesFilter(&data))
  223. {
  224. addBackIn.push_back(data);
  225. filteredRowsToDelete.push_back(i);
  226. }
  227. }
  228. //next search the main list
  229. std::vector<int> rowsToDelete;
  230. count = m_data.size();
  231. for (int i = 0; i < count; i++)
  232. {
  233. CDeleteData data = m_data[i];
  234. if(MatchesFilter(&data) == false)
  235. {
  236. m_filteredOut.push_back(data);
  237. rowsToDelete.push_back(i);
  238. }
  239. }
  240. //Add back in the filtered out ones that now match
  241. count = addBackIn.size();
  242. for (int i = 0; i < count; i++)
  243. {
  244. CDeleteData data = addBackIn[i];
  245. m_data.push_back(data);
  246. }
  247. int toSelect = -1;
  248. //Remove from the main list the ones that don't match
  249. count = rowsToDelete.size();
  250. for (INT_PTR i = count - 1; i >= 0; i--)
  251. {
  252. int row = rowsToDelete[i];
  253. toSelect = row;
  254. m_data.erase(m_data.begin() + row);
  255. }
  256. //Remove the rows that were filtered out but now match
  257. count = filteredRowsToDelete.size();
  258. for (INT_PTR i = count - 1; i >= 0; i--)
  259. {
  260. int row = filteredRowsToDelete[i];
  261. m_filteredOut.erase(m_filteredOut.begin() + row);
  262. }
  263. if (toSelect > -1)
  264. {
  265. m_List.SetItemState(toSelect, LVIS_SELECTED, LVIS_SELECTED);
  266. }
  267. m_List.SetItemCountEx((int)m_data.size(), 0);
  268. }
  269. bool CDeleteClipData::MatchesFilter(CDeleteData *pdata)
  270. {
  271. if(m_filterByClipTitle &&
  272. m_clipTitle != _T("") &&
  273. pdata->m_Desc != _T(""))
  274. {
  275. if(pdata->m_Desc.MakeLower().Find(m_clipTitle.MakeLower()) == -1)
  276. {
  277. return false;
  278. }
  279. }
  280. if (m_filterByCreatedDate)
  281. {
  282. CTime dateStart = CTime(m_createdDateStart.GetYear(), m_createdDateStart.GetMonth(), m_createdDateStart.GetDay(), m_createdTimeStart.GetHour(), m_createdTimeStart.GetMinute(), m_createdTimeStart.GetSecond());
  283. CTime dateEnd = CTime(m_createdDateEnd.GetYear(), m_createdDateEnd.GetMonth(), m_createdDateEnd.GetDay(), m_createdTimeEnd.GetHour(), m_createdTimeEnd.GetMinute(), m_createdTimeEnd.GetSecond());
  284. if (pdata->m_createdDateTime >= dateStart && pdata->m_createdDateTime <= dateEnd)
  285. {
  286. return true;
  287. }
  288. else
  289. {
  290. return false;
  291. }
  292. }
  293. if (m_filterByLastUsedDate)
  294. {
  295. CTime dateStart = CTime(m_usedDateStart.GetYear(), m_usedDateStart.GetMonth(), m_usedDateStart.GetDay(), m_usedTimeStart.GetHour(), m_usedTimeStart.GetMinute(), m_usedTimeStart.GetSecond());
  296. CTime dateEnd = CTime(m_usedDateEnd.GetYear(), m_usedDateEnd.GetMonth(), m_usedDateEnd.GetDay(), m_usedTimeEnd.GetHour(), m_usedTimeEnd.GetMinute(), m_usedTimeEnd.GetSecond());
  297. if (pdata->m_lastUsedDateTime >= dateStart && pdata->m_lastUsedDateTime <= dateEnd)
  298. {
  299. return true;
  300. }
  301. else
  302. {
  303. return false;
  304. }
  305. }
  306. if (m_filterByClipboardFormat)
  307. {
  308. CString str1;
  309. int n = m_clipboardFomatCombo.GetLBTextLen(m_clipboardFomatCombo.GetCurSel());
  310. m_clipboardFomatCombo.GetLBText(m_clipboardFomatCombo.GetCurSel(), str1.GetBuffer(n));
  311. str1.ReleaseBuffer();
  312. if (pdata->m_clipboardFormat == str1)
  313. {
  314. return true;
  315. }
  316. else
  317. {
  318. return false;
  319. }
  320. }
  321. return true;
  322. }
  323. void CDeleteClipData::OnLvnKeydownList2(NMHDR *pNMHDR, LRESULT *pResult)
  324. {
  325. LPNMLVKEYDOWN pLVKeyDow = reinterpret_cast<LPNMLVKEYDOWN>(pNMHDR);
  326. // TODO: Add your control notification handler code here
  327. switch(pLVKeyDow->wVKey)
  328. {
  329. case VK_DELETE:
  330. this->ApplyDelete();
  331. break;
  332. }
  333. *pResult = 0;
  334. }
  335. void CDeleteClipData::OnLvnItemchangedList2(NMHDR *pNMHDR, LRESULT *pResult)
  336. {
  337. LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
  338. POSITION pos = m_List.GetFirstSelectedItemPosition();
  339. __int64 selectedDataSize = 0;
  340. int selectedCount = 0;
  341. if (pos != NULL)
  342. {
  343. while (pos)
  344. {
  345. INT_PTR row = m_List.GetNextSelectedItem(pos);
  346. if(row >= 0 && row < (INT_PTR)m_data.size())
  347. {
  348. selectedDataSize += m_data[row].m_dataSize;
  349. selectedCount++;
  350. }
  351. }
  352. }
  353. const int MAX_FILE_SIZE_BUFFER = 255;
  354. TCHAR szFileSize[MAX_FILE_SIZE_BUFFER];
  355. StrFormatByteSize(selectedDataSize, szFileSize, MAX_FILE_SIZE_BUFFER);
  356. m_selectedSize = szFileSize;
  357. CString count;
  358. count.Format(_T("%d"), selectedCount);
  359. m_selectedCount = count;
  360. UpdateData(0);
  361. *pResult = 0;
  362. }
  363. void CDeleteClipData::OnHdnGetdispinfoList2(NMHDR *pNMHDR, LRESULT *pResult)
  364. {
  365. LPNMHDDISPINFO pDispInfo = reinterpret_cast<LPNMHDDISPINFO>(pNMHDR);
  366. if (pDispInfo->mask &LVIF_TEXT)
  367. {
  368. switch (pDispInfo->iItem)
  369. {
  370. case 0:
  371. break;
  372. }
  373. }
  374. *pResult = 0;
  375. }
  376. void CDeleteClipData::OnLvnGetdispinfoList2(NMHDR *pNMHDR, LRESULT *pResult)
  377. {
  378. NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
  379. if (pDispInfo->item.mask & LVIF_TEXT)
  380. {
  381. if (pDispInfo->item.iItem >= 0 && pDispInfo->item.iItem < m_data.size())
  382. {
  383. switch (pDispInfo->item.iSubItem)
  384. {
  385. case 0:
  386. {
  387. lstrcpyn(pDispInfo->item.pszText, m_data[pDispInfo->item.iItem].m_Desc, pDispInfo->item.cchTextMax);
  388. pDispInfo->item.pszText[pDispInfo->item.cchTextMax - 1] = '\0';
  389. }
  390. break;
  391. case 1:
  392. {
  393. lstrcpyn(pDispInfo->item.pszText, m_data[pDispInfo->item.iItem].m_quickPasteText, 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_createdDateTime.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. COleDateTime dtTime(m_data[pDispInfo->item.iItem].m_lastUsedDateTime.GetTime());
  407. lstrcpyn(pDispInfo->item.pszText, dtTime.Format(), pDispInfo->item.cchTextMax);
  408. pDispInfo->item.pszText[pDispInfo->item.cchTextMax - 1] = '\0';
  409. }
  410. break;
  411. case 4:
  412. {
  413. lstrcpyn(pDispInfo->item.pszText, m_data[pDispInfo->item.iItem].m_clipboardFormat, pDispInfo->item.cchTextMax);
  414. pDispInfo->item.pszText[pDispInfo->item.cchTextMax - 1] = '\0';
  415. }
  416. break;
  417. case 5:
  418. {
  419. const int MAX_FILE_SIZE_BUFFER = 255;
  420. TCHAR szFileSize[MAX_FILE_SIZE_BUFFER];
  421. StrFormatByteSize(m_data[pDispInfo->item.iItem].m_dataSize, szFileSize, MAX_FILE_SIZE_BUFFER);
  422. lstrcpyn(pDispInfo->item.pszText, szFileSize, pDispInfo->item.cchTextMax);
  423. pDispInfo->item.pszText[pDispInfo->item.cchTextMax - 1] = '\0';
  424. }
  425. break;
  426. }
  427. }
  428. }
  429. *pResult = 0;
  430. }
  431. void CDeleteClipData::OnBnClickedCheckClipTitle()
  432. {
  433. UpdateData();
  434. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_CLIP_TITLE), m_filterByClipTitle);
  435. ::SetFocus(::GetDlgItem(m_hWnd, IDC_EDIT_CLIP_TITLE));
  436. }
  437. void CDeleteClipData::OnBnClickedButtonApply()
  438. {
  439. ApplyDelete();
  440. }
  441. void CDeleteClipData::ApplyDelete()
  442. {
  443. if (m_applyingDelete)
  444. return;
  445. if (MessageBox(_T("Delete selected items? This cannot be undone!"), _T(""), MB_YESNO | MB_ICONWARNING) == IDYES)
  446. {
  447. m_List.EnableWindow(FALSE);
  448. m_applyingDelete = true;
  449. m_cancelDelete = false;
  450. CWaitCursor wait;
  451. try
  452. {
  453. theApp.m_db.execDML(_T("PRAGMA auto_vacuum = 2"));
  454. POSITION pos = m_List.GetFirstSelectedItemPosition();
  455. std::vector<int> rowsToDelete;
  456. if (pos != NULL)
  457. {
  458. while (pos)
  459. {
  460. int row = m_List.GetNextSelectedItem(pos);
  461. rowsToDelete.push_back(row);
  462. }
  463. }
  464. CProgressWnd progress;
  465. progress.Create(this, _T("Deleting clip items"), TRUE);
  466. progress.SetRange(0, (int)rowsToDelete.size() + 4);
  467. progress.SetText(_T("Deleting selected items"));
  468. progress.SetStep(1);
  469. INT_PTR count = rowsToDelete.size();
  470. for (INT_PTR i = count - 1; i >= 0; i--)
  471. {
  472. progress.PeekAndPump();
  473. if (m_cancelDelete || progress.Cancelled())
  474. {
  475. break;
  476. }
  477. progress.StepIt();
  478. int row = rowsToDelete[i];
  479. CDeleteData data = m_data[row];
  480. try
  481. {
  482. //Sleep(100);
  483. int deleteCount = theApp.m_db.execDMLEx(_T("DELETE FROM Data where lID = %d"), data.m_DatalID);
  484. //If there are no more children for this clip then delete the parent
  485. int parentDeleteCount = theApp.m_db.execDMLEx(_T("DELETE FROM Main where lID IN ")
  486. _T("(")
  487. _T("SELECT Main.lID ")
  488. _T("FROM Main ")
  489. _T("LEFT OUTER JOIN Data on Data.lParentID = Main.lID ")
  490. _T("WHERE bIsGroup = 0 AND Main.lID = %d ")
  491. _T("Group by Main.lID ")
  492. _T("having Count(Data.lID) = 0 ")
  493. _T(")"), data.m_lID);
  494. m_data.erase(m_data.begin() + row);
  495. }
  496. CATCH_SQLITE_EXCEPTION
  497. }
  498. progress.StepIt();
  499. progress.SetText(_T("Shrinking database"));
  500. try
  501. {
  502. for(int i = 0; i < 100; i++)
  503. {
  504. int toDeleteCount = theApp.m_db.execScalar(_T("SELECT COUNT(clipID) FROM MainDeletes"));
  505. if(toDeleteCount <= 0)
  506. break;
  507. RemoveOldEntries(false);
  508. }
  509. }
  510. CATCH_SQLITE_EXCEPTION
  511. theApp.m_db.execDML(_T("PRAGMA auto_vacuum = 1"));
  512. theApp.m_db.execQuery(_T("VACUUM"));
  513. progress.StepIt();
  514. progress.SetText(_T("Refreshing database size"));
  515. SetDbSize();
  516. progress.StepIt();
  517. progress.SetText(_T("Reloading list"));
  518. //LoadItems();
  519. progress.StepIt();
  520. progress.SetText(_T("Applying filter"));
  521. FilterItems();
  522. m_List.SetItemCountEx((int)m_data.size(), 0);
  523. }
  524. CATCH_SQLITE_EXCEPTION
  525. m_applyingDelete = false;
  526. m_List.EnableWindow();
  527. }
  528. }
  529. void CDeleteClipData::OnBnClickedCancel()
  530. {
  531. if (m_applyingDelete)
  532. {
  533. m_cancelDelete = true;
  534. return;
  535. }
  536. DestroyWindow();
  537. }
  538. void CDeleteClipData::OnTimer(UINT_PTR nIDEvent)
  539. {
  540. switch(nIDEvent)
  541. {
  542. case 1:
  543. LoadItems();
  544. KillTimer(1);
  545. break;
  546. }
  547. CDialog::OnTimer(nIDEvent);
  548. }
  549. void CDeleteClipData::OnBnClickedCheckCreateDate()
  550. {
  551. UpdateData();
  552. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_DATE_CREATE_START), m_filterByCreatedDate);
  553. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_TIME_CREATE_START), m_filterByCreatedDate);
  554. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_DATE_CREATE_END), m_filterByCreatedDate);
  555. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_TIME_CREATE_END), m_filterByCreatedDate);
  556. ::SetFocus(::GetDlgItem(m_hWnd, IDC_DATE_CREATE_START));
  557. }
  558. void CDeleteClipData::OnBnClickedCheckLastUseDate()
  559. {
  560. UpdateData();
  561. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_DATE_USE_START), m_filterByLastUsedDate);
  562. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_TIME_USE_START), m_filterByLastUsedDate);
  563. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_DATE_USE_END), m_filterByLastUsedDate);
  564. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_TIME_USE_END), m_filterByLastUsedDate);
  565. ::SetFocus(::GetDlgItem(m_hWnd, IDC_DATE_USE_START));
  566. }
  567. void CDeleteClipData::OnBnClickedCheckDataFormat()
  568. {
  569. UpdateData();
  570. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_COMBO_DATA_FORMAT), m_filterByClipboardFormat);
  571. ::SetFocus(::GetDlgItem(m_hWnd, IDC_COMBO_DATA_FORMAT));
  572. }
  573. static bool SortByTitleDesc(const CDeleteData& a1, const CDeleteData& a2)
  574. {
  575. return a1.m_Desc > a2.m_Desc;
  576. }
  577. static bool SortByCreatedDateDesc(const CDeleteData& a1, const CDeleteData& a2)
  578. {
  579. return a1.m_createdDateTime > a2.m_createdDateTime;
  580. }
  581. static bool SortByLastUsedDateDesc(const CDeleteData& a1, const CDeleteData& a2)
  582. {
  583. return a1.m_lastUsedDateTime > a2.m_lastUsedDateTime;
  584. }
  585. static bool SortByFormatDesc(const CDeleteData& a1, const CDeleteData& a2)
  586. {
  587. return a1.m_clipboardFormat > a2.m_clipboardFormat;
  588. }
  589. static bool SortByDataSizeDesc(const CDeleteData& a1, const CDeleteData& a2)
  590. {
  591. return a1.m_dataSize > a2.m_dataSize;
  592. }
  593. static bool SortByTitleAsc(const CDeleteData& a1, const CDeleteData& a2)
  594. {
  595. return a1.m_Desc < a2.m_Desc;
  596. }
  597. static bool SortByCreatedDateAsc(const CDeleteData& a1, const CDeleteData& a2)
  598. {
  599. return a1.m_createdDateTime < a2.m_createdDateTime;
  600. }
  601. static bool SortByLastUsedDateAsc(const CDeleteData& a1, const CDeleteData& a2)
  602. {
  603. return a1.m_lastUsedDateTime < a2.m_lastUsedDateTime;
  604. }
  605. static bool SortByFormatAsc(const CDeleteData& a1, const CDeleteData& a2)
  606. {
  607. return a1.m_clipboardFormat < a2.m_clipboardFormat;
  608. }
  609. static bool SortByDataSizeAsc(const CDeleteData& a1, const CDeleteData& a2)
  610. {
  611. return a1.m_dataSize < a2.m_dataSize;
  612. }
  613. bool desc = true;
  614. void CDeleteClipData::OnLvnColumnclickList2(NMHDR *pNMHDR, LRESULT *pResult)
  615. {
  616. HD_NOTIFY *phdn = (HD_NOTIFY *)pNMHDR;
  617. switch (phdn->iItem)
  618. {
  619. case 0:
  620. if(desc)
  621. std::sort(m_data.begin(), m_data.end(), SortByTitleDesc);
  622. else
  623. std::sort(m_data.begin(), m_data.end(), SortByTitleAsc);
  624. break;
  625. case 1:
  626. if(desc)
  627. std::sort(m_data.begin(), m_data.end(), SortByCreatedDateDesc);
  628. else
  629. std::sort(m_data.begin(), m_data.end(), SortByCreatedDateAsc);
  630. break;
  631. case 2:
  632. if(desc)
  633. std::sort(m_data.begin(), m_data.end(), SortByLastUsedDateDesc);
  634. else
  635. std::sort(m_data.begin(), m_data.end(), SortByLastUsedDateAsc);
  636. break;
  637. case 3:
  638. if(desc)
  639. std::sort(m_data.begin(), m_data.end(), SortByFormatDesc);
  640. else
  641. std::sort(m_data.begin(), m_data.end(), SortByFormatAsc);
  642. break;
  643. case 4:
  644. if(desc)
  645. std::sort(m_data.begin(), m_data.end(), SortByDataSizeDesc);
  646. else
  647. std::sort(m_data.begin(), m_data.end(), SortByDataSizeAsc);
  648. break;
  649. }
  650. desc = !desc;
  651. m_List.SetItemCountEx((int)m_data.size(), 0);
  652. *pResult = 0;
  653. }
  654. BOOL CDeleteClipData::PreTranslateMessage(MSG* pMsg)
  655. {
  656. if (pMsg->message == WM_KEYDOWN)
  657. {
  658. if (pMsg->wParam == VK_RETURN)
  659. {
  660. FilterItems();
  661. return TRUE; // Do not process further
  662. }
  663. }
  664. return CDialog::PreTranslateMessage(pMsg);
  665. }