using ComPDFKit.PDFAnnotation;
using ComPDFKit.PDFPage;
using ComPDFKitViewer;
using ComPDFKitViewer.AnnotEvent;
using ImTools;
using PDF_Master.DataConvert;
using PDF_Master.EventAggregators;
using PDF_Master.Helper;
using PDF_Master.Model.BOTA;
using PDF_Master.ViewModels;
using PDF_Master.ViewModels.BOTA;
using Prism.Events;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices.Expando;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Annotations;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using static Dropbox.Api.Paper.ListPaperDocsSortBy;
using static Dropbox.Api.TeamLog.PaperDownloadFormat;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
using ListBox = System.Windows.Controls.ListBox;
using MenuItem = System.Windows.Controls.MenuItem;
using UserControl = System.Windows.Controls.UserControl;
namespace PDF_Master.Views.BOTA
{
///
/// AnnotationContent.xaml 的交互逻辑
///
public partial class AnnotationContent : UserControl
{
public AnnotationContentViewModel viewModel;
private string unicode;
public AnnotationContent(IEventAggregator eventAggregator)
{
InitializeComponent();
unicode = App.mainWindowViewModel.SelectedItem.Unicode;
viewModel = this.DataContext as AnnotationContentViewModel;
if (AnnotationList.Items.Count < 0)
{
MenuExpandAll.IsEnabled = false;
}
eventAggregator.GetEvent().Subscribe(CleanSelectAll, e => e.Unicode == unicode);
eventAggregator.GetEvent().Subscribe(ExpandGroupHeader, e => e.Unicode == unicode);
}
public async void ExpandGroupHeader(RefreshAnnotationArgs obj)
{
if (obj.IsAll)
{
ExpandAllGroupHeader(obj);
}
else
{
//需要时间加载完 listbox所有的控件模板
await Task.Delay(200);
ExpandOneGroupHeader(obj);
}
}
private async void ExpandAllGroupHeader(RefreshAnnotationArgs obj)
{
try
{
foreach (var item in AnnotationList.Items)
{
var groups = AnnotationList.Items.Groups;
for (int i = 0; i < groups.Count; i++)
{
if (groups[i] is CollectionViewGroup group)
{
if (group.Items.Contains(item))
{
var scroller = GetScrollHost(AnnotationList);
var stackpanel = CommonHelper.FindVisualChild(scroller);
if (stackpanel == null)
{
await Task.Delay(1);
}
else
{
GroupItemExpanded(stackpanel, i);
}
}
}
}
}
}
catch (Exception ex) { }
}
public async void ExpandOneGroupHeader(RefreshAnnotationArgs obj)
{
if (obj.annotHandlerArgs == null)
{
if (obj.Pageindex != -1 && obj.AnnotIndex != -1)
{
List annotations = AnnotationList.Items.Cast().ToList();
obj.annotHandlerArgs = annotations.FirstOrDefault(x => x.PageIndex == obj.Pageindex && x.AnnotIndex == obj.AnnotIndex);
}
}
if (obj.annotHandlerArgs != null)
{
try
{
var groups = AnnotationList.Items.Groups;
if (groups != null && groups.Count > 0)
{
for (int i = 0; i < groups.Count; i++)
{
if (groups[i] is CollectionViewGroup group)
{
if (group.Items.Contains(obj.annotHandlerArgs))
{
var scroller = GetScrollHost(AnnotationList);
var stackpanel = CommonHelper.FindVisualChild(scroller);
if (stackpanel != null)
{
GroupItemExpanded(stackpanel, i);
}
else
{
ItemsPresenter itemsPresenter = CommonHelper.FindVisualChild(scroller);
if (itemsPresenter != null)
{
var tt = VisualTreeHelper.GetChild(itemsPresenter, i);
int count = VisualTreeHelper.GetChildrenCount(tt);
}
}
}
}
}
}
if (obj.IsDel)
{
viewModel.IsModified = true;
}
await Task.Delay(10);//不加延时 会有不滚动的现象
SelectedItems(obj);
}
catch (Exception ex) { }
}
}
private void GroupItemExpanded(StackPanel stackpanel, int i)
{
int count = VisualTreeHelper.GetChildrenCount(stackpanel);
if (count > 0)
{
if (VisualTreeHelper.GetChild(stackpanel, i) is GroupItem groupItem)
{
var expander = CommonHelper.FindVisualChild(groupItem);
if (expander != null)
{
if (expander.IsExpanded == false)
{
expander.IsExpanded = true;
}
}
}
}
}
private async void SelectedItems(RefreshAnnotationArgs obj)
{
if (obj.IsSelect && obj.annotHandlerArgs != null)
{
if (viewModel.ViewContentViewModel.IsMultiSelected == false)
{
if (AnnotationList.SelectedItems.IndexOf(obj.annotHandlerArgs) == -1)
{
viewModel.IsModified = false;
AnnotationList.SelectedItem = obj.annotHandlerArgs;
AnnotationList.SelectedIndex = AnnotationList.Items.IndexOf(obj.annotHandlerArgs);
}
await Task.Delay(10);//不加延时 会有不滚动的现象
AnnotationList.ScrollIntoView(AnnotationList.SelectedItem);
}
}
}
private void CleanSelectAll(CleanSelectAllArgs obj)
{
AnnotationList.SelectedIndex = -1;
}
private void ListBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 1)
{
//if (Mouse.LeftButton == e.ButtonState)
//{
// viewModel.ListBoxItemPreviewMouseLeftButtonDown.Execute(sender);
//}
if (Mouse.RightButton == e.ButtonState)
{
var pos = e.GetPosition(AnnotationList);
var result = VisualTreeHelper.HitTest(AnnotationList, pos);
if (result != null)
{
ListBoxItem myListBoxItem = sender as System.Windows.Controls.ListBoxItem;
MenuItem copyText = myListBoxItem.ContextMenu.Items[0] as MenuItem;
MenuItem import = myListBoxItem.ContextMenu.Items[1] as MenuItem;
MenuItem export = myListBoxItem.ContextMenu.Items[2] as MenuItem;
if (AnnotationList.SelectedItems.Count > 1)
{
import.IsEnabled = false;
export.IsEnabled = true;
export.Command = viewModel.ExportCommentsCommand;
copyText.IsEnabled = false;
}
else
{
//直接右键菜单不需要选中Viewer中注释
//viewModel.ListBoxItemPreviewMouseLeftButtonDown.Execute(sender);
if (myListBoxItem.DataContext is AnnotationHandlerEventArgs annotation)
{
//文本、高亮、下划线、删除线、便签
if (annotation.EventType == AnnotArgsType.AnnotFreeText ||
annotation.EventType == AnnotArgsType.AnnotHighlight ||
annotation.EventType == AnnotArgsType.AnnotUnderline ||
annotation.EventType == AnnotArgsType.AnnotStrikeout ||
annotation.EventType == AnnotArgsType.AnnotSticky)
{
copyText.IsEnabled = true;
}
else
{
copyText.IsEnabled = false;
}
}
import.IsEnabled = true;
import.Command = viewModel.ImportCommentsCommand;
export.IsEnabled = true;
export.Command = viewModel.ExportCommentsCommand;
}
}
//拦截响应选中事件
e.Handled = true;
}
}
}
private void ListBoxItem_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (Mouse.LeftButton == e.ButtonState)
{
viewModel.AddNotesCommand.Execute(sender);
}
}
private async void MenuExpandAll_Click(object sender, RoutedEventArgs e)
{
SetAllExpander(true);
await Task.Delay(1);
for (int i = 0; i < AnnotationList.Items.Count; i++)
{
ListBoxItem item = AnnotationList.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
if (item != null)
{
ToggleButton button = GetExpandButton(item);
if (button != null && button.Visibility == Visibility.Visible)
{
button.IsChecked = true;
}
}
}
}
private void MenuCollapseAll_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < AnnotationList.Items.Count; i++)
{
ListBoxItem item = AnnotationList.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
ToggleButton button = GetExpandButton(item);
if (button != null && button.Visibility == Visibility.Visible)
{
button.IsChecked = false;
}
}
SetAllExpander(false);
}
private void SetAllExpander(bool isexpand)
{
AnnotationList.Dispatcher.Invoke(() =>
{
//开启虚拟化之后 全部展开和折叠会有问题
var scroller = GetScrollHost(AnnotationList);
var stackpanel = CommonHelper.FindVisualChild(scroller);
int count = VisualTreeHelper.GetChildrenCount(stackpanel);
for (int i = 0; i < count; i++)
{
var item = VisualTreeHelper.GetChild(stackpanel, i) as GroupItem;
var g = CommonHelper.FindVisualChild(item);
if (g != null)
g.IsExpanded = isexpand;
}
});
}
private ScrollViewer GetScrollHost(ListBox listBox)
{
if (VisualTreeHelper.GetChildrenCount(listBox) > 0)
{
int s = VisualTreeHelper.GetChildrenCount(listBox);
Border border = VisualTreeHelper.GetChild(listBox, 0) as Border;
if (border != null)
{
return VisualTreeHelper.GetChild(border, 0) as ScrollViewer;
}
}
return null;
}
private ToggleButton GetExpandButton(ListBoxItem item)
{
if (item == null) return null;
Border border = VisualTreeHelper.GetChild(item, 0) as Border;
var btn = CommonHelper.FindVisualChild(border);
return btn;
}
private void MenuTimeRightSort_Click(object sender, RoutedEventArgs e)
{
ICollectionView v = CollectionViewSource.GetDefaultView(AnnotationList.ItemsSource);
CreateTimeToDate createTimeToDate = new CreateTimeToDate();
v.GroupDescriptions.Clear();
v.GroupDescriptions.Add(new PropertyGroupDescription(nameof(AnnotHandlerEventArgs.CreateTime), createTimeToDate));
v.SortDescriptions.Clear();
v.SortDescriptions.Add(new SortDescription(nameof(AnnotHandlerEventArgs.CreateTime), ListSortDirection.Ascending));
v.SortDescriptions.Add(new SortDescription(nameof(AnnotHandlerEventArgs.AnnotIndex), ListSortDirection.Ascending));
}
private void MenuTimeBackSort_Click(object sender, RoutedEventArgs e)
{
ICollectionView v = CollectionViewSource.GetDefaultView(AnnotationList.ItemsSource);
CreateTimeToDate createTimeToDate = new CreateTimeToDate();
v.GroupDescriptions.Clear();
v.GroupDescriptions.Add(new PropertyGroupDescription(nameof(AnnotHandlerEventArgs.CreateTime), createTimeToDate));
v.SortDescriptions.Clear();
v.SortDescriptions.Add(new SortDescription(nameof(AnnotHandlerEventArgs.CreateTime), ListSortDirection.Descending));
v.SortDescriptions.Add(new SortDescription(nameof(AnnotHandlerEventArgs.AnnotIndex), ListSortDirection.Descending));
}
private void MenuPageSort_Click(object sender, RoutedEventArgs e)
{
ICollectionView v = CollectionViewSource.GetDefaultView(AnnotationList.ItemsSource);
v.GroupDescriptions.Clear();
v.GroupDescriptions.Add(new PropertyGroupDescription(nameof(AnnotHandlerEventArgs.PageIndex)));
v.SortDescriptions.Clear();
v.SortDescriptions.Add(new SortDescription(nameof(AnnotHandlerEventArgs.PageIndex), ListSortDirection.Ascending));
v.SortDescriptions.Add(new SortDescription(nameof(AnnotHandlerEventArgs.AnnotIndex), ListSortDirection.Ascending));
}
private void MenuItemCopyText_Click(object sender, RoutedEventArgs e)
{
//没有权限解密时,拦截复制文本操作
if (!viewModel.ViewContentViewModel.CheckPermissionBeforeOption())
{
return;
}
if (AnnotationList.SelectedItems.Count == 1)
{
if (AnnotationList.SelectedItem is AnnotationHandlerEventArgs annotation)
{
//文本、高亮、下划线、删除线、便签
if (annotation.EventType == AnnotArgsType.AnnotFreeText ||
annotation.EventType == AnnotArgsType.AnnotHighlight ||
annotation.EventType == AnnotArgsType.AnnotUnderline ||
annotation.EventType == AnnotArgsType.AnnotStrikeout ||
annotation.EventType == AnnotArgsType.AnnotSticky)
{
StringBuilder Copystr = new StringBuilder();
if (annotation.MarkupContent != null)
{
Copystr.Append(annotation.MarkupContent);
Copystr.Append(Environment.NewLine);
}
if (annotation.Content != null)
{
Copystr.Append(annotation.Content);
}
System.Windows.Clipboard.SetText(Copystr.ToString());
//CustomControl.MessageBoxEx.Show("数据复制成功");
}
}
}
}
private void MenuItemDelete_Click(object sender, RoutedEventArgs e)
{
List pagelist = new List();
if (AnnotationList.SelectedItems.Count > 1)
{
//for (int i = 0; i < AnnotationList.SelectedItems.Count; i++)
//{
// AnnotationHandlerEventArgs annotation = AnnotationList.SelectedItems[i] as AnnotationHandlerEventArgs;
// pagelist.Add(AnnotationList.Items.IndexOf(annotation));
//}
//pagelist.Sort();
//for (int i = 0; i < pagelist.Count; i++)
//{
// AnnotationHandlerEventArgs annotation = AnnotationList.Items[pagelist[pagelist.Count - i - 1]] as AnnotationHandlerEventArgs;
// if (annotation == null)
// {
// continue;
// }
// viewModel.DeleteCommand.Execute(annotation);
//}
Dictionary> selectedItemDics = new Dictionary>();
List eventArgs = new List();
foreach (var item in AnnotationList.SelectedItems)
{
if (item is AnnotationHandlerEventArgs annotation)
{
if (eventArgs.Contains(annotation) == false)
{
eventArgs.Add(annotation);
}
}
}
var result = eventArgs.GroupBy(d => d.PageIndex);
foreach (var item in result)
{
if (selectedItemDics.ContainsKey(item.Key) == false)
{
var ai = item.Select(w => w.AnnotIndex).ToList();
selectedItemDics.Add(item.Key, ai);
}
}
viewModel.DeleteCommand.Execute(selectedItemDics);
}
else
{
AnnotationHandlerEventArgs annotation = (AnnotationHandlerEventArgs)(sender as MenuItem).DataContext;
if (annotation == null)
{
return;
}
viewModel.DeleteCommand.Execute(annotation);
}
}
private void BtnMore_Initialized(object sender, EventArgs e)
{
BtnMore.ContextMenu = null;
}
private void BtnMore_Click(object sender, RoutedEventArgs e)
{
MenuMore.PlacementTarget = BtnMore;
MenuMore.IsOpen = true;
}
private void AnnotationList_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var pos = e.GetPosition(AnnotationList);
var result = VisualTreeHelper.HitTest(AnnotationList, pos);
if (result != null)
{
//获取当前鼠标指针下的容器
var listBoxItem = CommonHelper.FindVisualParent(result.VisualHit);
if (listBoxItem == null)
{
viewModel.ViewContentViewModel.mainViewModel.AnnotMouseLeftButtonDown = false;
}
}
}
private void AnnotationList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var selectedItems = (sender as ListBox).SelectedItems.Cast().ToList();
if (selectedItems.Count == 1)
{
if (viewModel.IsModified)
{
viewModel.ListBoxItemPreviewMouseLeftButtonDown.Execute(selectedItems[0]);
}
viewModel.IsModified = true;
}
else if (selectedItems.Count > 1)
{
#region 阅读视图 多选
Dictionary> selectedItemDics = new Dictionary>();
List eventArgs = new List();
foreach (var item in selectedItems)
{
if (item is AnnotationHandlerEventArgs annotation)
{
if (eventArgs.Contains(annotation) == false)
{
eventArgs.Add(annotation);
}
}
}
var result = eventArgs.GroupBy(d => d.PageIndex);
foreach (var item in result)
{
if (selectedItemDics.ContainsKey(item.Key) == false)
{
var ai = item.Select(w => w.AnnotIndex).ToList();
selectedItemDics.Add(item.Key, ai);
}
}
#endregion 阅读视图 多选
viewModel.ListBoxItemPreviewMouseLeftButtonDown.Execute(selectedItemDics);
}
}
private void AnnotationList_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (AnnotationList.SelectedItems == null)
{
return;
}
if (e.Key == Key.Escape)
{
//Windows:BOTA列表,移除Esc取消选中逻辑
//AnnotationList.SelectedItems.Clear();
}
}
private void Grid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var pos = e.GetPosition(this);
var result = VisualTreeHelper.HitTest(this, pos);
if (result != null)
{
//点击按钮和listboxitem时 不清空多选 其余区域取消多选
var item = CommonHelper.FindVisualParent(result.VisualHit);
if (item != null)
{
return;
}
var btn = CommonHelper.FindVisualParent(result.VisualHit);
if (btn != null)
{
return;
}
}
}
private void ListBox_MouseDown(object sender, MouseButtonEventArgs e)
{
AnnotationList.SelectedIndex = -1;
}
private void ContextMenu_Loaded(object sender, RoutedEventArgs e)
{
var menu = sender as System.Windows.Controls.ContextMenu;
if (menu != null)
{
(menu.Items[0] as MenuItem).Header = viewModel.T_CopyText;
(menu.Items[1] as MenuItem).Header = viewModel.T_Import;
(menu.Items[2] as MenuItem).Header = viewModel.T_Export;
(menu.Items[3] as MenuItem).Header = viewModel.T_Delete;
if (AnnotationList.SelectedItems.Count > 1)
{
(menu.Items[3] as MenuItem).Header = viewModel.T_DeleteAll;
}
}
}
}
}