RecentFilesContentViewModel.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. using Microsoft.Win32;
  2. using PDF_Master.CustomControl;
  3. using PDF_Master.Helper;
  4. using PDF_Master.Properties;
  5. using PDF_Master.Views;
  6. using PDFSettings.Settings;
  7. using Prism.Commands;
  8. using Prism.Mvvm;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Collections.ObjectModel;
  12. using System.Collections.Specialized;
  13. using System.Diagnostics;
  14. using System.IO;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. using System.Windows;
  19. using winform = System.Windows.Forms;
  20. namespace PDF_Master.ViewModels.HomePanel.RecentFiles
  21. {
  22. public class RecentFilesContentViewModel: BindableBase
  23. {
  24. #region 文案
  25. private string T_title;
  26. public string T_Title
  27. {
  28. get { return T_title; }
  29. set
  30. {
  31. SetProperty(ref T_title, value);
  32. }
  33. }
  34. private string T_menuShow;
  35. public string T_MenuShow
  36. {
  37. get { return T_menuShow; }
  38. set
  39. {
  40. SetProperty(ref T_menuShow, value);
  41. }
  42. }
  43. private string T_menuRemove;
  44. public string T_MenuRemove
  45. {
  46. get { return T_menuRemove; }
  47. set
  48. {
  49. SetProperty(ref T_menuRemove, value);
  50. }
  51. }
  52. private string T_menuOpenFile;
  53. public string T_MenuOpenFile
  54. {
  55. get { return T_menuOpenFile; }
  56. set
  57. {
  58. SetProperty(ref T_menuOpenFile, value);
  59. }
  60. }
  61. private string T_noFilesTitle;
  62. public string T_NoFilesTitle
  63. {
  64. get { return T_noFilesTitle; }
  65. set
  66. {
  67. SetProperty(ref T_noFilesTitle, value);
  68. }
  69. }
  70. private string T_noFilesContent;
  71. public string T_NoFilesContent
  72. {
  73. get { return T_noFilesContent; }
  74. set
  75. {
  76. SetProperty(ref T_noFilesContent, value);
  77. }
  78. }
  79. private void InitString()
  80. {
  81. T_Title = App.HomePageLoader.GetString("HomeList_Title");
  82. T_MenuShow = App.HomePageLoader.GetString("HomeList_MenuShow");
  83. T_MenuRemove = App.HomePageLoader.GetString("HomeList_MenuRemove");
  84. T_NoFilesTitle = App.HomePageLoader.GetString("HomeList_NoFilesTitle");
  85. T_NoFilesContent = App.HomePageLoader.GetString("HomeList_NoFilesContent");
  86. T_MenuOpenFile = App.HomePageLoader.GetString("Home_OpenFiles");
  87. }
  88. #endregion
  89. #region 属性
  90. private ObservableCollection<OpenFileInfo> _recentFilesGroup = new ObservableCollection<OpenFileInfo>();
  91. /// <summary>
  92. /// 最近列表:文件集合
  93. /// </summary>
  94. public ObservableCollection<OpenFileInfo> RecentFilesGroup
  95. {
  96. get { return _recentFilesGroup; }
  97. set
  98. {
  99. SetProperty(ref _recentFilesGroup, value);
  100. }
  101. }
  102. private bool _isEmpty = false;
  103. /// <summary>
  104. /// 最近列表是否为空
  105. /// </summary>
  106. public bool IsEmpty
  107. {
  108. get { return _isEmpty; }
  109. set
  110. {
  111. SetProperty(ref _isEmpty, value);
  112. }
  113. }
  114. private bool _isListMode = false;
  115. /// <summary>
  116. /// 是否为列表模式
  117. /// </summary>
  118. public bool IsListMode
  119. {
  120. get { return _isListMode; }
  121. set
  122. {
  123. SetProperty(ref _isListMode, value);
  124. }
  125. }
  126. #endregion
  127. #region Command
  128. public DelegateCommand<object> RemoveFileItemCommand { get; set; }
  129. public DelegateCommand<object> RemoveFilesFromContainerCommand { get; set; }
  130. public DelegateCommand<object> OpenRecentFilesCommand { get; set; }
  131. public DelegateCommand<object> OpenFilesCommand { get; set; }
  132. public DelegateCommand<object> ListModeCheckedCommand { get; set; }
  133. public DelegateCommand<object> ExplorerFileCommand { get; set; }
  134. public event EventHandler<bool> RecentFilesSelectionHandler;
  135. #endregion
  136. public RecentFilesContentViewModel()
  137. {
  138. InitVariables();
  139. InitCommands();
  140. InitEvents();
  141. InitString();
  142. }
  143. #region 初始化
  144. private void InitVariables()
  145. {
  146. RecentFilesGroup = new ObservableCollection<OpenFileInfo>(Settings.Default.RecentOpenFiles);
  147. RecentFileGroupIsEmpty();
  148. int mode = Settings.Default.AppProperties.RecentFileListMode;
  149. if (mode == 0)
  150. IsListMode = false;
  151. else
  152. IsListMode = true;
  153. }
  154. private void InitCommands()
  155. {
  156. RemoveFilesFromContainerCommand = new DelegateCommand<object>(RemoveFilesFromContainer_BtnClick);
  157. RemoveFileItemCommand = new DelegateCommand<object>(RemoveFileItem_MenuItemClick);
  158. OpenRecentFilesCommand = new DelegateCommand<object>(OpenRecentFiles_MouseDoubleClick);
  159. ListModeCheckedCommand = new DelegateCommand<object>(ListMode_Checked);
  160. OpenFilesCommand = new DelegateCommand<object>(OpenFiles_EmptyListsClick);
  161. ExplorerFileCommand = new DelegateCommand<object>(ExplorerFile_MenuItemClick);
  162. }
  163. private void InitEvents()
  164. {
  165. RecentFilesGroup.CollectionChanged -= RecentFilesGroup_CollectionChanged;
  166. RecentFilesGroup.CollectionChanged += RecentFilesGroup_CollectionChanged;
  167. }
  168. private void RecentFilesGroup_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
  169. {
  170. RecentFileGroupIsEmpty();
  171. }
  172. private void RecentFileGroupIsEmpty()
  173. {
  174. if (RecentFilesGroup.Count == 0)
  175. {
  176. IsEmpty = true;
  177. }
  178. else
  179. {
  180. IsEmpty = false;
  181. }
  182. }
  183. #endregion
  184. /// <summary>
  185. /// 最近列表:文件列表模式选中事件
  186. /// </summary>
  187. /// <param name="obj"></param>
  188. private void ListMode_Checked(object obj)
  189. {
  190. if (obj is string)
  191. {
  192. var tag = obj as string;
  193. if (tag == "ListMode")
  194. {
  195. IsListMode = true;
  196. Settings.Default.AppProperties.RecentFileListMode = 1;
  197. }
  198. else
  199. {
  200. IsListMode = false;
  201. Settings.Default.AppProperties.RecentFileListMode = 0;
  202. }
  203. Settings.Default.Save();
  204. RecentFilesSelectionHandler?.Invoke(null, IsListMode);
  205. }
  206. }
  207. /// <summary>
  208. /// 移除文件记录:单个文件
  209. /// </summary>
  210. /// <param name="obj"></param>
  211. private void RemoveFileItem_MenuItemClick(object obj)
  212. {
  213. var openFileInfo = obj as OpenFileInfo;
  214. if (openFileInfo != null)
  215. {
  216. bool needDelete = false;
  217. //判断是否需要执行删除操作
  218. if (!Settings.Default.AppProperties.DontTipBeforeDeleteRecent)
  219. {
  220. AlertsMessage alertsMessage = new AlertsMessage();
  221. alertsMessage.HaveCheckBoxShow("提示", "删除文件", "不再提示", "取消", "OK");
  222. if(alertsMessage.result == ContentResult.Ok)
  223. {
  224. needDelete = true;
  225. //已经勾选 下次不再提示
  226. Settings.Default.AppProperties.DontTipBeforeDeleteRecent = alertsMessage.isChecked;
  227. Settings.Default.Save();
  228. }
  229. else
  230. {
  231. needDelete = false;
  232. }
  233. }
  234. else
  235. {
  236. needDelete = true;
  237. }
  238. if (needDelete)
  239. {
  240. SettingHelper.RemoveRecentOpenFile(openFileInfo.FilePath);
  241. RecentFilesGroup.Remove(openFileInfo);
  242. }
  243. }
  244. }
  245. /// <summary>
  246. /// 删除按钮触发事件:选中的文件
  247. /// </summary>
  248. /// <param name="obj">选中的文档</param>
  249. private void RemoveFilesFromContainer_BtnClick(object obj)
  250. {
  251. System.Collections.IList items = (System.Collections.IList)obj;
  252. if (items == null || items.Cast<OpenFileInfo>() == null)
  253. return;
  254. var collection = items.Cast<OpenFileInfo>();
  255. var openFileInfo = collection.ToList();
  256. if(openFileInfo != null)
  257. {
  258. string msg = "";
  259. int SelectedItemsType = 0;
  260. if (openFileInfo.Count == RecentFilesGroup.Count || openFileInfo.Count == 0)
  261. {
  262. if(openFileInfo.Count == 1 && RecentFilesGroup.Count == 1)
  263. msg = "ClearFile";
  264. else
  265. msg = "AllClearFiles";
  266. SelectedItemsType = 0;
  267. }
  268. else if(openFileInfo.Count == 1)
  269. {
  270. msg = "ClearFile";
  271. SelectedItemsType = 1;
  272. }
  273. else
  274. {
  275. msg = "ClearSelectedFiles";
  276. SelectedItemsType = 2;
  277. }
  278. bool needDelete = false;
  279. if (!Settings.Default.AppProperties.DontTipBeforeDeleteRecent)
  280. {
  281. AlertsMessage alertsMessage = new AlertsMessage();
  282. alertsMessage.HaveCheckBoxShow("提示", msg, "不再提示", "取消", "OK");
  283. if (alertsMessage.result == ContentResult.Ok)
  284. {
  285. needDelete = true;
  286. Settings.Default.AppProperties.DontTipBeforeDeleteRecent = alertsMessage.isChecked;
  287. Settings.Default.Save();
  288. }
  289. else
  290. {
  291. needDelete = false;
  292. }
  293. }
  294. else
  295. {
  296. needDelete = true;
  297. }
  298. if (needDelete)
  299. {
  300. RemoveRecentFilesFrom(SelectedItemsType, openFileInfo);
  301. }
  302. }
  303. }
  304. /// <summary>
  305. /// 删除最近文件的操作
  306. /// </summary>
  307. /// <param name="selectedItemsType">0:全部文件;1:一个文件;2:多个文件</param>
  308. /// <param name="openFileInfo">选中的文件</param>
  309. private void RemoveRecentFilesFrom(int selectedItemsType, List<OpenFileInfo> openFileInfo)
  310. {
  311. if (selectedItemsType == 0)
  312. {
  313. SettingHelper.RemoveAllRecentOpenFiles();
  314. RecentFilesGroup.Clear();
  315. }
  316. else if (selectedItemsType == 1)
  317. {
  318. var file = openFileInfo[0] as OpenFileInfo;
  319. SettingHelper.RemoveRecentOpenFile(file.FilePath);
  320. RecentFilesGroup.Remove(file);
  321. }
  322. else
  323. {
  324. foreach (var item in openFileInfo)
  325. {
  326. SettingHelper.RemoveRecentOpenFile(item.FilePath);
  327. RecentFilesGroup.Remove(item);
  328. }
  329. }
  330. }
  331. /// <summary>
  332. /// 空状态时,点击文件浏览器弹窗,打开文件
  333. /// </summary>
  334. private void OpenFiles_EmptyListsClick(object obj)
  335. {
  336. var dlg = new OpenFileDialog();
  337. dlg.Multiselect = true;
  338. dlg.Filter = Properties.Resources.OpenDialogFilter;
  339. if (dlg.ShowDialog() == true)
  340. {
  341. LoadPdfViewer(dlg.FileNames);
  342. }
  343. }
  344. /// <summary>
  345. /// 打开文件路径
  346. /// </summary>
  347. private void ExplorerFile_MenuItemClick(object obj)
  348. {
  349. try
  350. {
  351. var fileInfo = obj as OpenFileInfo;
  352. if (fileInfo != null)
  353. {
  354. if (string.IsNullOrEmpty(fileInfo.FilePath) == false)
  355. {
  356. if (!File.Exists(fileInfo.FilePath))
  357. {
  358. AlertsMessage alertsMessage = new AlertsMessage();
  359. alertsMessage.ShowDialog("提示", "文件不存在", "OK");
  360. SettingHelper.RemoveRecentOpenFile(fileInfo.FilePath);
  361. RecentFilesGroup.Remove(fileInfo);
  362. }
  363. else
  364. {
  365. Process.Start("explorer", "/select,\"" + fileInfo.FilePath + "\"");
  366. }
  367. }
  368. }
  369. }
  370. catch (Exception ex)
  371. {
  372. }
  373. }
  374. /// <summary>
  375. /// 从最近列表里,打开文档
  376. /// </summary>
  377. /// <param name="obj"></param>
  378. private void OpenRecentFiles_MouseDoubleClick(object obj)
  379. {
  380. var fileInfo = obj as OpenFileInfo;
  381. if (fileInfo != null)
  382. {
  383. if (File.Exists(fileInfo.FilePath))
  384. {
  385. string[] filePath = new string[1];
  386. filePath[0] = fileInfo.FilePath;
  387. LoadPdfViewer(filePath);
  388. }
  389. else
  390. {
  391. AlertsMessage alertsMessage = new AlertsMessage();
  392. alertsMessage.ShowDialog("提示", "文件不存在", "OK");
  393. SettingHelper.RemoveRecentOpenFile(fileInfo.FilePath);
  394. RecentFilesGroup.Remove(fileInfo);
  395. }
  396. }
  397. }
  398. /// <summary>
  399. /// 打开文档
  400. /// </summary>
  401. /// <param name="filePaths"></param>
  402. public void LoadPdfViewer(string[] filePaths)
  403. {
  404. var content = App.mainWindowViewModel.SelectedItem.DataContext as MainContentViewModel;
  405. if (filePaths.Count() == 1)
  406. {
  407. if (App.OpenedFileList.Contains(filePaths[0]))
  408. {
  409. App.mainWindowViewModel.SelectItem(filePaths[0]);
  410. }
  411. else
  412. {
  413. content.OpenFile(filePaths[0]);
  414. }
  415. ToolMethod.SetFileThumbImg(filePaths[0]);
  416. }
  417. else
  418. {
  419. var fileList = filePaths.ToList().Where(x => !App.OpenedFileList.Exists(y => y == x)).ToList();
  420. if (fileList.Count <= 0)
  421. return;
  422. content.OpenFile(filePaths[0]);
  423. for (int i = 1; i < fileList.Count(); i++)
  424. {
  425. if (!App.OpenedFileList.Contains(fileList[i]))
  426. {
  427. App.mainWindowViewModel.AddTabItem(fileList[i]);
  428. }
  429. ToolMethod.SetFileThumbImg(fileList[i]);
  430. }
  431. }
  432. Settings.Default.Save();
  433. }
  434. }
  435. }