BookmarkContentViewModel.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. using ComPDFKit.PDFDocument;
  2. using ComPDFKitViewer.PdfViewer;
  3. using ImTools;
  4. using Microsoft.Office.Interop.Word;
  5. using PDF_Office.CustomControl;
  6. using PDF_Office.Helper;
  7. using PDF_Office.Model;
  8. using PDF_Office.Model.PageEdit;
  9. using Prism.Commands;
  10. using Prism.Mvvm;
  11. using Prism.Regions;
  12. using Prism.Services.Dialogs;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Collections.ObjectModel;
  16. using System.Linq;
  17. using System.Reflection;
  18. using System.Windows;
  19. using System.Windows.Controls;
  20. using System.Windows.Controls.Primitives;
  21. using System.Windows.Forms;
  22. using System.Windows.Input;
  23. using System.Windows.Markup;
  24. using System.Windows.Media;
  25. using static Dropbox.Api.Files.SearchMatchType;
  26. using static Dropbox.Api.TeamLog.AdminAlertSeverityEnum;
  27. using static System.Net.Mime.MediaTypeNames;
  28. using static System.Windows.Forms.VisualStyles.VisualStyleElement;
  29. using KeyEventArgs = System.Windows.Input.KeyEventArgs;
  30. using ListViewItem = System.Windows.Controls.ListViewItem;
  31. using TextBox = System.Windows.Controls.TextBox;
  32. namespace PDF_Office.ViewModels.BOTA
  33. {
  34. public class BookmarkContentViewModel : BindableBase, INavigationAware
  35. {
  36. #region 属性
  37. public bool isAddBookMark = false;
  38. private IRegionManager region;
  39. private IDialogService dialogs;
  40. public CPDFViewer PDFViewer;
  41. /// <summary>
  42. /// 书签ItemSouce
  43. /// </summary>
  44. private ObservableCollection<CPDFBookmark> bookmarklist;
  45. public ObservableCollection<CPDFBookmark> Bookmarklist
  46. {
  47. get
  48. {
  49. return bookmarklist;
  50. }
  51. set
  52. {
  53. SetProperty(ref bookmarklist, value);
  54. }
  55. }
  56. /// <summary>
  57. /// 书签列表为空时,显示状态
  58. /// </summary>
  59. private Visibility isEmpty;
  60. public Visibility IsEmptyPanelVisibility
  61. {
  62. get
  63. {
  64. return isEmpty;
  65. }
  66. set
  67. {
  68. SetProperty(ref isEmpty, value);
  69. }
  70. }
  71. #endregion 属性
  72. #region 命令
  73. public DelegateCommand<object> KeyDownCommand { get; set; }
  74. public DelegateCommand<object> LostFocusCommand { get; set; }
  75. public DelegateCommand<object> AddBookmarkCommand { get; set; }
  76. public DelegateCommand<object> ListViewItemMouseDownCommand { get; set; }
  77. public DelegateCommand<object> EditPageIndexCommand { get; set; }
  78. public DelegateCommand<object> DeleteCommand { get; set; }
  79. #endregion 命令
  80. public BookmarkContentViewModel(IRegionManager regionManager, IDialogService dialogService)
  81. {
  82. region = regionManager;
  83. dialogs = dialogService;
  84. Bookmarklist = new ObservableCollection<CPDFBookmark>();
  85. LostFocusCommand = new DelegateCommand<object>(LostFocusEvent);
  86. AddBookmarkCommand = new DelegateCommand<object>(AddBookmarkEvent);
  87. ListViewItemMouseDownCommand = new DelegateCommand<object>(ListViewItemMouseLeftButtonDownEvent);
  88. DeleteCommand = new DelegateCommand<object>(DelegateEvent);
  89. EditPageIndexCommand = new DelegateCommand<object>(EditPageIndexEvent);
  90. KeyDownCommand = new DelegateCommand<object>(KeyDownEvent);
  91. }
  92. /// <summary>
  93. /// 检测ObservableCollection的数据变更
  94. /// </summary>
  95. /// <param name="sender"></param>
  96. /// <param name="e"></param>
  97. private void Bookmarklist_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
  98. {
  99. ObservableCollection<CPDFBookmark> obsSender = sender as ObservableCollection<CPDFBookmark>;
  100. if (obsSender != null)
  101. {
  102. if (obsSender.Count < 1)
  103. {
  104. IsEmptyPanelVisibility = Visibility.Visible;
  105. }
  106. else
  107. {
  108. IsEmptyPanelVisibility = Visibility.Collapsed;
  109. }
  110. }
  111. else
  112. {
  113. IsEmptyPanelVisibility = Visibility.Visible;
  114. }
  115. }
  116. /// <summary>
  117. /// 文本框按下Enter键
  118. /// </summary>
  119. /// <param name="obj"></param>
  120. private void KeyDownEvent(object obj)
  121. {
  122. if (obj is KeyEventArgs)
  123. {
  124. KeyEventArgs keyEventArgs = (KeyEventArgs)obj;
  125. if (keyEventArgs.Key == Key.Enter)
  126. {
  127. if (keyEventArgs.OriginalSource is TextBox)
  128. {
  129. TextBox textBox = (TextBox)keyEventArgs.OriginalSource;
  130. ListViewItem listViewItem = CommonHelper.FindVisualParent<ListViewItem>(textBox);
  131. UpdateTitle(listViewItem, textBox);
  132. TextBlock textBlock = CommonHelper.FindVisualChild<TextBlock>(listViewItem);
  133. textBlock.Text = textBox.Text;
  134. textBlock.Visibility = Visibility.Visible;
  135. }
  136. }
  137. }
  138. }
  139. /// <summary>
  140. /// 重新定位
  141. /// </summary>
  142. /// <param name="obj"></param>
  143. private void EditPageIndexEvent(object obj)
  144. {
  145. CPDFBookmark bookmark = obj as CPDFBookmark;
  146. if (bookmark != null)
  147. {
  148. AlertsMessage alertsMessage = new AlertsMessage();
  149. alertsMessage.ShowDialog("提示", "确定要将选定大纲的目标位置设置为当前位置吗?", "Cancel", "OK");
  150. if (alertsMessage.result == ContentResult.Ok)
  151. {
  152. if (RemoveBookMark(bookmark))
  153. {
  154. bookmarklist.Remove(bookmark);
  155. CPDFBookmark cPDFBookmark = new CPDFBookmark();
  156. bookmark.Title = bookmark.Title;
  157. bookmark.Date = DateTime.Now.ToString(@"yyyyMMddHHmmsszzz\'").Replace(':', '\'') + "\n";
  158. bookmark.PageIndex = PDFViewer.CurrentIndex;
  159. if (PDFViewer.Document.AddBookmark(bookmark))
  160. {
  161. PDFViewer.UndoManager.CanSave = true;
  162. Bookmarklist.Add(bookmark);
  163. }
  164. }
  165. }
  166. }
  167. }
  168. /// <summary>
  169. /// 右键菜单-删除
  170. /// </summary>
  171. /// <param name="obj"></param>
  172. private void DelegateEvent(object obj)
  173. {
  174. CPDFBookmark bookmark = obj as CPDFBookmark;
  175. if (bookmark != null)
  176. {
  177. if (RemoveBookMark(bookmark))
  178. {
  179. Bookmarklist.Remove(bookmark);
  180. isAddBookMark = true;
  181. }
  182. }
  183. }
  184. /// <summary>
  185. /// 删除书签
  186. /// </summary>
  187. /// <param name="item"></param>
  188. /// <returns></returns>
  189. private bool RemoveBookMark(CPDFBookmark item)
  190. {
  191. var data = item;
  192. if (data == null)
  193. {
  194. return false;
  195. }
  196. return PDFViewer.Document.RemoveBookmark(data.PageIndex);
  197. }
  198. /// <summary>
  199. /// ListViewItem失去焦点
  200. /// </summary>
  201. /// <param name="obj"></param>
  202. private void LostFocusEvent(object obj)
  203. {
  204. TextBox textBox = null;
  205. ListViewItem listViewItem = null;
  206. if (obj is CompositeCommandParameter)
  207. {
  208. CompositeCommandParameter parameter = (CompositeCommandParameter)obj;
  209. if (parameter.Parameter is TextBox)
  210. {
  211. textBox = (TextBox)parameter.Parameter;
  212. listViewItem = CommonHelper.FindVisualParent<ListViewItem>(textBox);
  213. }
  214. }
  215. if (obj is ListBoxItem)
  216. {
  217. listViewItem = (ListViewItem)(obj);
  218. textBox = CommonHelper.FindVisualChild<TextBox>(listViewItem);
  219. }
  220. UpdateTitle(listViewItem, textBox);
  221. }
  222. /// <summary>
  223. /// 修改书签标题
  224. /// </summary>
  225. /// <param name="listViewItem"></param>
  226. /// <param name="textBox"></param>
  227. private void UpdateTitle(ListViewItem listViewItem, TextBox textBox)
  228. {
  229. if (listViewItem != null)
  230. {
  231. var data = listViewItem.DataContext as CPDFBookmark;
  232. if (data == null)
  233. {
  234. return;
  235. }
  236. var result = PDFViewer.Document.EditBookmark(data.PageIndex, textBox.Text.Trim());
  237. if (result)
  238. {
  239. data.Title = textBox.Text.Trim();
  240. PDFViewer.UndoManager.CanSave = true;
  241. }
  242. }
  243. }
  244. /// <summary>
  245. /// ListBoxItem左键单击,页面跳转
  246. /// </summary>
  247. /// <param name="obj"></param>
  248. private void ListViewItemMouseLeftButtonDownEvent(object obj)
  249. {
  250. ListBoxItem listBoxItem = (obj as ListBoxItem);
  251. if (listBoxItem != null)
  252. {
  253. if (!(listBoxItem.DataContext is CPDFBookmark))
  254. {
  255. return;
  256. }
  257. int index = (listBoxItem.DataContext as CPDFBookmark).PageIndex;
  258. PDFViewer.GoToPage(index);
  259. }
  260. }
  261. /// <summary>
  262. /// 添加书签
  263. /// </summary>
  264. /// <param name="obj"></param>
  265. private void AddBookmarkEvent(object obj)
  266. {
  267. int index = PDFViewer.CurrentIndex;
  268. string mark = string.Format($"第{index + 1}页");
  269. System.Windows.Controls.ListView listView = obj as System.Windows.Controls.ListView;
  270. bool isExistBookmark = IsExistBookmark(listView);
  271. if (isExistBookmark == false)
  272. {
  273. DialogParameters value = new DialogParameters();
  274. value.Add(ParameterNames.Bookmark, mark);
  275. value.Add(ParameterNames.Title, "创建一个新的书签");
  276. dialogs.ShowDialog(DialogNames.AddBookmarkDialog, value, e =>
  277. {
  278. if (e.Result == ButtonResult.OK && e.Parameters != null)
  279. {
  280. if (e.Parameters.ContainsKey(ParameterNames.Bookmark))
  281. {
  282. mark = e.Parameters.GetValue<string>(ParameterNames.Bookmark).ToString();
  283. CPDFBookmark bookmark = new CPDFBookmark();
  284. bookmark.Title = mark;
  285. bookmark.Date = DateTime.Now.ToString(@"yyyyMMddHHmmsszzz\'").Replace(':', '\'') + "\n";
  286. bookmark.PageIndex = PDFViewer.CurrentIndex;
  287. if (PDFViewer.Document.AddBookmark(bookmark))
  288. {
  289. PDFViewer.UndoManager.CanSave = true;
  290. Bookmarklist.Add(bookmark);
  291. }
  292. }
  293. isAddBookMark = false;
  294. }
  295. if (e.Result == ButtonResult.Cancel)
  296. {
  297. isAddBookMark = true;
  298. }
  299. });
  300. }
  301. }
  302. public bool IsExistBookmark(System.Windows.Controls.ListView listView)
  303. {
  304. bool isExistBookmark = false;
  305. int index = PDFViewer.CurrentIndex;
  306. //检测是否已存在相同数据
  307. var list = PDFViewer.Document.GetBookmarkList().FindAll(q => q.PageIndex == index);
  308. if (list.Count > 0)
  309. {
  310. int i = PDFViewer.Document.GetBookmarkList().FindIndex(q => q.PageIndex == index);
  311. isExistBookmark = true;
  312. if (listView != null)
  313. {
  314. ListBoxItem myListBoxItem = (ListBoxItem)(listView.ItemContainerGenerator.ContainerFromItem(list[0]));
  315. if (myListBoxItem == null)
  316. {
  317. //myListBoxItem = (ListBoxItem)listView.Items.GetItemAt(i);
  318. return isExistBookmark;
  319. }
  320. if (myListBoxItem.IsSelected == false)
  321. {
  322. myListBoxItem.IsSelected = true;
  323. myListBoxItem.Focus();
  324. isAddBookMark = false;
  325. }
  326. return isExistBookmark;
  327. }
  328. }
  329. return isExistBookmark;
  330. }
  331. public void OnNavigatedTo(NavigationContext navigationContext)
  332. {
  333. navigationContext.Parameters.TryGetValue<CPDFViewer>(ParameterNames.PDFViewer, out PDFViewer);
  334. if (PDFViewer == null)
  335. {
  336. IsEmptyPanelVisibility = Visibility.Visible;
  337. return;
  338. }
  339. Bookmarklist = new ObservableCollection<CPDFBookmark>(PDFViewer.Document.GetBookmarkList().OrderBy(d => d.Title));
  340. Bookmarklist.CollectionChanged += Bookmarklist_CollectionChanged;
  341. if (Bookmarklist.Count < 1)
  342. {
  343. IsEmptyPanelVisibility = Visibility.Visible;
  344. return;
  345. }
  346. else
  347. {
  348. IsEmptyPanelVisibility = Visibility.Hidden;
  349. return;
  350. }
  351. }
  352. public bool IsNavigationTarget(NavigationContext navigationContext)
  353. {
  354. return true;
  355. }
  356. public void OnNavigatedFrom(NavigationContext navigationContext)
  357. {
  358. }
  359. }
  360. }