using ComPDFKit.PDFDocument; using ComPDFKitViewer.PdfViewer; using ImTools; using PDF_Master.CustomControl; using PDF_Master.Helper; using PDF_Master.Model; using PDF_Master.Model.PageEdit; using Prism.Commands; using Prism.Mvvm; using Prism.Regions; using Prism.Services.Dialogs; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Reflection; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Forms; using System.Windows.Input; using System.Windows.Markup; using System.Windows.Media; using static Dropbox.Api.Files.SearchMatchType; using static Dropbox.Api.TeamLog.AdminAlertSeverityEnum; using static System.Net.Mime.MediaTypeNames; using static System.Windows.Forms.VisualStyles.VisualStyleElement; using KeyEventArgs = System.Windows.Input.KeyEventArgs; using ListViewItem = System.Windows.Controls.ListViewItem; using TextBox = System.Windows.Controls.TextBox; using Task = System.Threading.Tasks.Task; using Microsoft.Office.Interop.Word; using System.Threading.Tasks; using static Dropbox.Api.TeamLog.TimeUnit; using System.Threading; using static Dropbox.Api.Files.SaveUrlError; using System.Windows.Documents; using System.Runtime.Remoting.Messaging; using ListView = System.Windows.Controls.ListView; using PDF_Master.EventAggregators; using Prism.Events; using System.Windows.Data; namespace PDF_Master.ViewModels.BOTA { public class BookmarkContentViewModel : BindableBase, INavigationAware { #region 文案 private string T_emptyTitle; public string T_EmptyTitle { get { return T_emptyTitle; } set { SetProperty(ref T_emptyTitle, value); } } private string T_emptyContext; public string T_EmptyContext { get { return T_emptyContext; } set { SetProperty(ref T_emptyContext, value); } } private void InitString() { T_EmptyTitle = App.MainPageLoader.GetString("Bookmark_EmptyTitle"); T_EmptyContext = App.MainPageLoader.GetString("Bookmark_EmptyContext"); } #endregion 文案 #region 属性 public bool isAddBookMark = false; private IRegionManager region; private IDialogService dialogs; public CPDFViewer PDFViewer; public IEventAggregator events; private string unicode; /// /// 书签ItemSouce /// private ObservableCollection bookmarklist; public ObservableCollection Bookmarklist { get { return bookmarklist; } set { SetProperty(ref bookmarklist, value); } } /// /// 书签列表为空时,显示状态 /// private Visibility isEmpty; public Visibility IsEmptyPanelVisibility { get { return isEmpty; } set { SetProperty(ref isEmpty, value); } } public CPDFBookmark AddCPDFBookmark = null; public bool IsHasBookmark = true; #endregion 属性 #region 命令 public DelegateCommand KeyDownCommand { get; set; } public DelegateCommand LostFocusCommand { get; set; } public DelegateCommand AddBookmarkCommand { get; set; } public DelegateCommand ListViewItemMouseDownCommand { get; set; } public DelegateCommand EditPageIndexCommand { get; set; } public DelegateCommand DeleteCommand { get; set; } #endregion 命令 public BookmarkContentViewModel(IRegionManager regionManager, IDialogService dialogService, IEventAggregator eventAggregator) { region = regionManager; dialogs = dialogService; events = eventAggregator; unicode = App.mainWindowViewModel.SelectedItem.Unicode; Bookmarklist = new ObservableCollection(); LostFocusCommand = new DelegateCommand(LostFocusEvent); AddBookmarkCommand = new DelegateCommand(AddBookmarkEvent); ListViewItemMouseDownCommand = new DelegateCommand(ListViewItemMouseLeftButtonDownEvent); DeleteCommand = new DelegateCommand(DelegateEvent); EditPageIndexCommand = new DelegateCommand(EditPageIndexEvent); KeyDownCommand = new DelegateCommand(KeyDownEvent); InitString(); events.GetEvent().Subscribe(DelBook, e => e.Unicode == unicode && e.IsReadMode == true); events.GetEvent().Subscribe(AddBook, e => e.Unicode == unicode && e.IsReadMode == true); events.GetEvent().Subscribe(OnNotifyEvent, e => e.Unicode == unicode && e.Type == NotifyType.PageCountChanged); } private void DelBook(BookMarkArgs obj) { if (PDFViewer.Document.GetBookmarkList().Count == 0) { return; } CPDFBookmark list = PDFViewer.Document.GetBookmarkList().FirstOrDefault(q => q.PageIndex == PDFViewer.CurrentIndex); if (list != null) { bool flag = PDFViewer.Document.RemoveBookmark(PDFViewer.CurrentIndex); if (flag) { Bookmarklist.Remove(list); } isAddBookMark = true; PDFViewer.UndoManager.CanSave = true; } } private void AddBook(BookMarkArgs args) { string info = App.MainPageLoader.GetString("Bookmark_PageN"); int index = PDFViewer.CurrentIndex; string mark = string.Format(info, (index + 1).ToString()); CPDFBookmark bookmark = new CPDFBookmark(); bookmark.Title = mark; bookmark.Date = DateTime.Now.ToString(@"yyyyMMddHHmmsszzz\'").Replace(':', '\'') + "\n"; bookmark.PageIndex = PDFViewer.CurrentIndex; AddCPDFBookmark = bookmark; if (PDFViewer.Document.AddBookmark(bookmark)) { PDFViewer.UndoManager.CanSave = true; Bookmarklist.Add(bookmark); Bookmarklist = new ObservableCollection(Bookmarklist.OrderBy(item => item.PageIndex)); Bookmarklist.CollectionChanged += Bookmarklist_CollectionChanged; isAddBookMark = false; } } /// /// 页面编辑页数发生变化后触发的事件 /// 更新BOTA数据源 /// /// private void OnNotifyEvent(PageEditNotifyEventArgs obj) { InitBookMarkSource(); } /// /// 检测ObservableCollection的数据变更 /// /// /// private void Bookmarklist_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { ObservableCollection obsSender = sender as ObservableCollection; if (obsSender != null) { if (obsSender.Count < 1) { IsEmptyPanelVisibility = Visibility.Visible; } else { IsEmptyPanelVisibility = Visibility.Collapsed; } } else { IsEmptyPanelVisibility = Visibility.Visible; } } /// /// 文本框按下Enter键 /// /// private void KeyDownEvent(object obj) { if (obj is KeyEventArgs) { KeyEventArgs keyEventArgs = (KeyEventArgs)obj; if (keyEventArgs.Key == Key.Enter) { if (keyEventArgs.OriginalSource is TextBox) { TextBox textBox = (TextBox)keyEventArgs.OriginalSource; ListBoxItem listViewItem = CommonHelper.FindVisualParent(textBox); TextBlock textBlock = CommonHelper.FindVisualChild(listViewItem); UpdateTitle(listViewItem, textBox, textBlock); textBlock.Visibility = Visibility.Visible; } } } } /// /// 重新定位 /// /// private void EditPageIndexEvent(object obj) { CPDFBookmark bookmark = obj as CPDFBookmark; if (bookmark != null) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("", App.MainPageLoader.GetString("Outline_ChangeDest_Tips"), App.ServiceLoader.GetString("Text_cancel"), App.ServiceLoader.GetString("Text_ok")); if (alertsMessage.result == ContentResult.Ok) { if (RemoveBookMark(bookmark)) { bookmarklist.Remove(bookmark); CPDFBookmark cPDFBookmark = new CPDFBookmark(); bookmark.Title = bookmark.Title; bookmark.Date = DateTime.Now.ToString(@"yyyyMMddHHmmsszzz\'").Replace(':', '\'') + "\n"; bookmark.PageIndex = PDFViewer.CurrentIndex; if (PDFViewer.Document.AddBookmark(bookmark)) { PDFViewer.UndoManager.CanSave = true; Bookmarklist.Add(bookmark); } } } } } /// /// 右键菜单-删除 /// /// private void DelegateEvent(object obj) { CPDFBookmark bookmark = obj as CPDFBookmark; if (bookmark != null) { if (RemoveBookMark(bookmark)) { Bookmarklist.Remove(bookmark); isAddBookMark = true; PDFViewer.UndoManager.CanSave = true; } } } /// /// 删除书签 /// /// /// private bool RemoveBookMark(CPDFBookmark item) { var data = item; if (data == null) { return false; } return PDFViewer.Document.RemoveBookmark(data.PageIndex); } /// /// ListViewItem失去焦点 /// /// private void LostFocusEvent(object obj) { try { //连续快捷键Ctrl+B 两次添加书签时会报错,暂时没有好的方式判断disconnecteditem 先异常捕获处理一下 TextBox textBox = null; ListBoxItem listViewItem = null; TextBlock textBlock = null; if (obj is CompositeCommandParameter parameter) { if (parameter.Parameter is TextBox textBox1) { textBox = textBox1; listViewItem = CommonHelper.FindVisualParent(textBox); textBlock = CommonHelper.FindVisualChild(listViewItem); } } if (obj is ListBoxItem item) { listViewItem = item; textBox = CommonHelper.FindVisualChild(item); textBlock = CommonHelper.FindVisualChild(item); } CPDFBookmark bookmark = (CPDFBookmark)listViewItem.DataContext; UpdateTitle(listViewItem, textBox, textBlock); } catch { } } /// /// 修改书签标题 /// /// /// private void UpdateTitle(ListBoxItem listViewItem, TextBox textBox, TextBlock textBlock) { if (listViewItem != null) { var data = listViewItem.DataContext as CPDFBookmark; if (data == null) { return; } var result = PDFViewer.Document.EditBookmark(data.PageIndex, textBox.Text.Trim()); if (result) { data.Title = textBox.Text.Trim(); PDFViewer.UndoManager.CanSave = true; textBlock.Text = textBox.Text; } } } /// /// ListBoxItem左键单击,页面跳转 /// /// private void ListViewItemMouseLeftButtonDownEvent(object obj) { ListBoxItem listBoxItem = (obj as ListBoxItem); if (listBoxItem != null) { if (!(listBoxItem.DataContext is CPDFBookmark)) { return; } int index = (listBoxItem.DataContext as CPDFBookmark).PageIndex; PDFViewer.GoToPage(index); } } /// /// 添加书签 /// /// private void AddBookmarkEvent(object obj) { string info = App.MainPageLoader.GetString("Bookmark_PageN"); int index = PDFViewer.CurrentIndex; string mark = string.Format(info, (index + 1).ToString()); System.Windows.Controls.ListBox listView = obj as System.Windows.Controls.ListBox; IsHasBookmark = IsExistBookmark(listView);// await Task.Run(() => IsExistBookmark(listView)); if (IsHasBookmark == false) { listView.SelectedItems.Clear(); CPDFBookmark bookmark = new CPDFBookmark(); bookmark.Title = mark; bookmark.Date = DateTime.Now.ToString(@"yyyyMMddHHmmsszzz\'").Replace(':', '\'') + "\n"; bookmark.PageIndex = PDFViewer.CurrentIndex; AddCPDFBookmark = bookmark; if (PDFViewer.Document.AddBookmark(bookmark)) { PDFViewer.UndoManager.CanSave = true; Bookmarklist.Add(bookmark); Bookmarklist = new ObservableCollection(Bookmarklist.OrderBy(item => item.PageIndex)); Bookmarklist.CollectionChanged += Bookmarklist_CollectionChanged; isAddBookMark = false; } } } private bool IsExistBookmark(System.Windows.Controls.ListBox listView) { bool isExistBookmark = false; int index = PDFViewer.CurrentIndex; if (PDFViewer.Document == null) { isExistBookmark = true; return isExistBookmark; } //检测是否已存在相同数据 var list = PDFViewer.Document.GetBookmarkList().FindAll(q => q.PageIndex == index); if (list.Count > 0) { int i = PDFViewer.Document.GetBookmarkList().FindIndex(q => q.PageIndex == index); isExistBookmark = true; if (listView != null) { listView.ScrollIntoView(list[0]); //ListBoxItem myListBoxItem = await Task.Run(() => GetListViewItem(listView, list[0])); ListBoxItem myListBoxItem = (ListBoxItem)(listView.ItemContainerGenerator.ContainerFromItem(list[0])); List listItems = new List(); foreach (var item in listView.SelectedItems) { listView.ScrollIntoView(item); ListBoxItem listViewItem = (ListBoxItem)(listView.ItemContainerGenerator.ContainerFromItem(item)); if (listItems.IndexOf(listViewItem) == -1) { listItems.Add(listViewItem); } } if (myListBoxItem.IsSelected == false) { myListBoxItem.IsSelected = true; myListBoxItem.Focus(); isAddBookMark = false; foreach (var item in listItems) { item.IsSelected = false; } } return isExistBookmark; } } return isExistBookmark; } /// /// 刷新书签列表数据源 /// private void InitBookMarkSource() { if (PDFViewer.Document.GetBookmarkList().Count > 0) { Bookmarklist = new ObservableCollection(PDFViewer.Document.GetBookmarkList().OrderBy(d => d.PageIndex)); } //避免重复绑定 bookmarklist.CollectionChanged -= Bookmarklist_CollectionChanged; Bookmarklist.CollectionChanged += Bookmarklist_CollectionChanged; } public void OnNavigatedTo(NavigationContext navigationContext) { KeyEventsHelper.KeyDown -= ShortCut_KeyDown; KeyEventsHelper.KeyDown += ShortCut_KeyDown; navigationContext.Parameters.TryGetValue(ParameterNames.PDFViewer, out PDFViewer); if (PDFViewer == null) { IsEmptyPanelVisibility = Visibility.Visible; return; } InitBookMarkSource(); if (Bookmarklist.Count < 1) { IsEmptyPanelVisibility = Visibility.Visible; return; } else { IsEmptyPanelVisibility = Visibility.Hidden; return; } } public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } public void OnNavigatedFrom(NavigationContext navigationContext) { KeyEventsHelper.KeyDown -= ShortCut_KeyDown; } private void ShortCut_KeyDown(object sender, KeyEventArgs e) { if (KeyEventsHelper.IsSingleKey(System.Windows.Input.Key.Escape)) { this.events.GetEvent().Publish(new CleanSelectAllArgs() { Unicode = App.mainWindowViewModel.SelectedItem.Unicode, IsCleanSelectAll = true }); } } } }