|
@@ -50,14 +50,13 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// Undo操作记录栈
|
|
|
/// 只有插入、移位、旋转,倒序需要记录
|
|
|
/// </summary>
|
|
|
- private Stack<PageEditItem> UndoStack = new Stack<PageEditItem>();
|
|
|
+ private Stack<PageEditHistory> UndoStack = new Stack<PageEditHistory>();
|
|
|
|
|
|
/// <summary>
|
|
|
/// Redo操作记录栈
|
|
|
/// </summary>
|
|
|
|
|
|
- private Stack<PageEditItem> RedoStack = new Stack<PageEditItem>();
|
|
|
-
|
|
|
+ private Stack<PageEditHistory> RedoStack = new Stack<PageEditHistory>();
|
|
|
|
|
|
/// <summary>
|
|
|
/// 项数据集合
|
|
@@ -219,7 +218,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
}
|
|
|
|
|
|
|
|
|
- private string toastText;
|
|
|
+ private string toastText = "操作失败";
|
|
|
/// <summary>
|
|
|
/// Toast提示
|
|
|
/// </summary>
|
|
@@ -245,6 +244,56 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
SetProperty(ref isBOTAThumb, value);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private Visibility hasShowPageSize = Visibility.Collapsed;
|
|
|
+ /// <summary>
|
|
|
+ /// 是否显示页面尺寸
|
|
|
+ /// </summary>
|
|
|
+ public Visibility HasShowPageSize
|
|
|
+ {
|
|
|
+ get { return hasShowPageSize; }
|
|
|
+ set
|
|
|
+ {
|
|
|
+ SetProperty(ref hasShowPageSize, value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private bool canUndo;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 是否可以进行Undo操作
|
|
|
+ /// </summary>
|
|
|
+ public bool CanUndo
|
|
|
+ {
|
|
|
+ get { return canUndo; }
|
|
|
+ set
|
|
|
+ {
|
|
|
+ SetProperty(ref canUndo, value);
|
|
|
+ if (viewContentViewModel != null)
|
|
|
+ {
|
|
|
+ viewContentViewModel.CanUndo = this.CanUndo;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private bool canRedo;
|
|
|
+ /// <summary>
|
|
|
+ /// 是否可以进行Redo操作
|
|
|
+ /// </summary>
|
|
|
+ public bool CanRedo
|
|
|
+ {
|
|
|
+ get { return canRedo; }
|
|
|
+ set
|
|
|
+ {
|
|
|
+ SetProperty(ref canRedo, value);
|
|
|
+ if(viewContentViewModel!=null)
|
|
|
+ {
|
|
|
+ viewContentViewModel.CanRedo = this.CanRedo;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
#endregion
|
|
|
|
|
|
#region 命令
|
|
@@ -309,6 +358,11 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// 缩小
|
|
|
/// </summary>
|
|
|
public DelegateCommand ZoomOutCommand { get; set; }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 显示页面大小
|
|
|
+ /// </summary>
|
|
|
+ public DelegateCommand ShowPageSizeCommand { get; set; }
|
|
|
#endregion
|
|
|
|
|
|
public PageEditContentViewModel(IDialogService dialogService, IEventAggregator eventAggregator)
|
|
@@ -335,6 +389,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
ReverseCommand = new DelegateCommand(ReverseCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex);
|
|
|
ZoomInCommand = new DelegateCommand(ZoomInCommandEvent, CanZoomIn).ObservesProperty(() => ZoomIndex);
|
|
|
ZoomOutCommand = new DelegateCommand(ZoomOutCommandEvent, CanZoomOut).ObservesProperty(() => ZoomIndex);
|
|
|
+ ShowPageSizeCommand = new DelegateCommand(ShowPageSize);
|
|
|
|
|
|
//订阅页面刷新事件
|
|
|
eventAggregator.GetEvent<PageEditRefreshEvent>().Subscribe(OnPageEditRefreshEvent, e => e.Unicode == unicode);
|
|
@@ -428,22 +483,29 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
}
|
|
|
IsLoading = Visibility.Visible;
|
|
|
await Task.Delay(3);
|
|
|
+
|
|
|
+ PageEditHistory history = new PageEditHistory();
|
|
|
+ history.InsertIndex = insertIndex;
|
|
|
if((string)type==ParameterNames.InsertType_Blank)
|
|
|
{
|
|
|
+ history.Type = ActionType.InsertCustomPages;
|
|
|
+ history.InsertFilePath = "";
|
|
|
//插入空白页面
|
|
|
bool result;
|
|
|
if (insertIndex == 0)
|
|
|
{
|
|
|
result = PDFViewer.Document.InsertPage(insertIndex, PageEditItems[insertIndex].Size.Width, PageEditItems[insertIndex].Size.Height, null);
|
|
|
+ history.PageSize = PageEditItems[insertIndex].Size;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
result = PDFViewer.Document.InsertPage(insertIndex, PageEditItems[insertIndex-1].Size.Width, PageEditItems[insertIndex-1].Size.Height, null);
|
|
|
+ history.PageSize = PageEditItems[insertIndex - 1].Size;
|
|
|
}
|
|
|
if(!result)
|
|
|
{
|
|
|
IsLoading = Visibility.Collapsed;
|
|
|
- ShowTip = Visibility.Visible;
|
|
|
+ ShowToast();
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -454,7 +516,8 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
|
|
|
ReloadAfterOption(true,true,Tuple.Create(insertIndex,insertIndex+1));
|
|
|
await Task.Delay(10);
|
|
|
- ListSelectedIndex = insertIndex == 0 ? insertIndex : insertIndex;
|
|
|
+ //选中插入的页面
|
|
|
+ ListSelectedIndex = insertIndex;
|
|
|
}
|
|
|
else if((string)type == ParameterNames.InsertType_File)
|
|
|
{
|
|
@@ -468,12 +531,15 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
if(!result)
|
|
|
{
|
|
|
IsLoading = Visibility.Collapsed;
|
|
|
- ShowTip = Visibility.Visible;
|
|
|
+ ShowToast();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
ReloadAfterOption(true,true,Tuple.Create(0,PDFViewer.Document.PageCount));
|
|
|
}
|
|
|
+ IsLoading = Visibility.Collapsed;
|
|
|
+ //里面附带了Undo栈记录,需要提前返回,避免重复记录
|
|
|
+ return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -485,22 +551,23 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
{
|
|
|
var model = e.Parameters.GetValue<CustomInsertModel>(ParameterNames.DataModel);
|
|
|
|
|
|
- var pageIndex = ListSelectedIndex;
|
|
|
- //文档层插入
|
|
|
- var result = PDFViewer.Document.InsertPage(pageIndex, model.width,model.height,model.filepath);
|
|
|
+ var result = InsertFromCustomPage(insertIndex, model.width, model.height, model.filepath);
|
|
|
if(!result)
|
|
|
{
|
|
|
- ShowTip = Visibility.Visible;
|
|
|
return;
|
|
|
}
|
|
|
- PageEditItem item = new PageEditItem();
|
|
|
- PageEditItems.Insert(pageIndex, item);
|
|
|
- ReloadAfterOption(true,true,Tuple.Create(pageIndex-1,pageIndex+1));
|
|
|
+
|
|
|
+ history.Type = ActionType.InsertCustomPages;
|
|
|
+ history.InsertFilePath = model.filepath;
|
|
|
+ history.PageSize = new Size(model.width,model.height);
|
|
|
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
IsLoading = Visibility.Collapsed;
|
|
|
+
|
|
|
+ //添加记录到Undo栈,清除Redo栈
|
|
|
+ AddToUndoStack(history);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -567,7 +634,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
var result = PDFViewer.Document.ExchangePage(preindex, laterIndex);
|
|
|
if(!result)
|
|
|
{
|
|
|
- ShowTip = Visibility.Visible;
|
|
|
+ ShowToast();
|
|
|
IsLoading = Visibility.Collapsed;
|
|
|
return;
|
|
|
}
|
|
@@ -579,11 +646,16 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
}
|
|
|
|
|
|
await Task.Delay(20);
|
|
|
+ //转换成页码数据集合,传递给UI,选中目标页面
|
|
|
+ //因虚拟化加载的问题,通过Selected来控制Item选中效果会有问题
|
|
|
+ List<int> pageRange = new List<int>();
|
|
|
for(int i=0;i<pages.Count;i++)
|
|
|
{
|
|
|
- PageEditItems[i].Selected = true;
|
|
|
+ pageRange.Add(pages[i]+1);
|
|
|
}
|
|
|
|
|
|
+ NotifyUIToRefresh(pageRange);
|
|
|
+
|
|
|
ReloadAfterOption(true,true,null);
|
|
|
IsLoading = Visibility.Collapsed;
|
|
|
}
|
|
@@ -691,55 +763,41 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// <param name="e"></param>
|
|
|
private void SelectionChangedEvent(object e)
|
|
|
{
|
|
|
- //var args = e as SelectionChangedEventArgs;
|
|
|
- //var listbox = args.OriginalSource as ListBox;
|
|
|
- //if (TbPageRangeVisibility == Visibility.Visible && args != null)
|
|
|
- //{
|
|
|
- // List<int> pagelist = new List<int>();
|
|
|
- // for (int i = 0; i < listbox.SelectedItems.Count; i++)
|
|
|
- // {
|
|
|
- // if (!pagelist.Contains((listbox.SelectedItems[i] as PageEditItem).PageNumber))
|
|
|
- // {
|
|
|
- // pagelist.Add((listbox.SelectedItems[i] as PageEditItem).PageNumber);
|
|
|
- // }
|
|
|
- // }
|
|
|
-
|
|
|
- // ////手动取消其他项的选中状态
|
|
|
- // //for (int j = 0; j < PageEditItems.Count; j++)
|
|
|
- // //{
|
|
|
- // // if (!pagelist.Contains(PageEditItems[j].PageNumber))
|
|
|
- // // {
|
|
|
- // // PageEditItems[j].Selected = false;
|
|
|
- // // }
|
|
|
- // //}
|
|
|
-
|
|
|
- // ////根据选中的范围 适配全部页面范围、奇数页面范围等
|
|
|
- // //if(pagelist.Count==PageEditItems.Count)
|
|
|
- // //{
|
|
|
- // // ComboxSelectIndex = 0;
|
|
|
- // // return;
|
|
|
- // //}
|
|
|
-
|
|
|
- // string pageparm = CommonHelper.GetPageParmFromList(pagelist);
|
|
|
- // TbPageRange = pageparm;
|
|
|
-
|
|
|
-
|
|
|
- //}
|
|
|
- //if (listbox.SelectedItem != null)
|
|
|
- //{
|
|
|
- // listbox.ScrollIntoView(listbox.SelectedItem);
|
|
|
- //}
|
|
|
-
|
|
|
- ////判断是否有选中多项
|
|
|
- //if (listbox.SelectedItems.Count > 1)
|
|
|
- //{
|
|
|
- // IsMutiSelected = true;
|
|
|
- // maxSelectedIndex = listbox.Items.IndexOf(listbox.SelectedItems[listbox.SelectedItems.Count-1]);
|
|
|
- //}
|
|
|
- //else
|
|
|
- //{
|
|
|
- // IsMutiSelected = false;
|
|
|
- //}
|
|
|
+ var args = e as SelectionChangedEventArgs;
|
|
|
+ //下下策 从UI控件获取所有选项的集合
|
|
|
+ var listbox = args.OriginalSource as ListBox;
|
|
|
+ if (TbPageRangeVisibility == Visibility.Visible && args != null)
|
|
|
+ {
|
|
|
+ List<int> pagelist = new List<int>();
|
|
|
+ for (int i = 0; i < listbox.SelectedItems.Count; i++)
|
|
|
+ {
|
|
|
+ if (!pagelist.Contains((listbox.SelectedItems[i] as PageEditItem).PageNumber))
|
|
|
+ {
|
|
|
+ pagelist.Add((listbox.SelectedItems[i] as PageEditItem).PageNumber);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ////根据选中的范围 适配全部页面范围、奇数页面范围等
|
|
|
+ //if (pagelist.Count == PageEditItems.Count)
|
|
|
+ //{
|
|
|
+ // ComboxSelectIndex = 0;
|
|
|
+ // return;
|
|
|
+ //}
|
|
|
+
|
|
|
+ string pageparm = CommonHelper.GetPageParmFromList(pagelist);
|
|
|
+ TbPageRange = pageparm;
|
|
|
+ }
|
|
|
+
|
|
|
+ //判断是否有选中多项
|
|
|
+ if (listbox.SelectedItems.Count > 1)
|
|
|
+ {
|
|
|
+ IsMultiSelected = true;
|
|
|
+ maxSelectedIndex = listbox.Items.IndexOf(listbox.SelectedItems[listbox.SelectedItems.Count - 1]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ IsMultiSelected = false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -783,23 +841,120 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
}
|
|
|
|
|
|
//选中输入的页面范围
|
|
|
+ List<int> pageRange = new List<int>();
|
|
|
for (int i = 0; i < PageEditItems.Count; i++)
|
|
|
{
|
|
|
if (TargetPageIndexs.Contains(PageEditItems[i].PageNumber - 1))
|
|
|
{
|
|
|
- PageEditItems[i].Selected = true;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- PageEditItems[i].Selected = false;
|
|
|
+ pageRange.Add(i+1);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ NotifyUIToRefresh(pageRange);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region 方法
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 页面编辑执行Undo操作的方法
|
|
|
+ /// </summary>
|
|
|
+ private void Undo()
|
|
|
+ {
|
|
|
+ var history = UndoStack.Pop();
|
|
|
+ PageEditHistory redoHistory = new PageEditHistory();
|
|
|
+ switch (history.Type)
|
|
|
+ {
|
|
|
+ case ActionType.RightRotate:
|
|
|
+ var rightlist = history.SourceTargetValue.Keys.ToList<int>();
|
|
|
+ RotateSelectedPages(false, rightlist,true);
|
|
|
+
|
|
|
+ redoHistory.SourceTargetValue = history.SourceTargetValue;
|
|
|
+ redoHistory.Type = ActionType.LeftRotate;
|
|
|
+ break;
|
|
|
+ case ActionType.LeftRotate:
|
|
|
+ var leftlist = history.SourceTargetValue.Keys.ToList<int>();
|
|
|
+ RotateSelectedPages(true, leftlist,true);
|
|
|
+
|
|
|
+ redoHistory.SourceTargetValue = history.SourceTargetValue;
|
|
|
+ redoHistory.Type = ActionType.RightRotate;
|
|
|
+ break;
|
|
|
+ case ActionType.InsertFromFile:
|
|
|
+ List<int> pageList = new List<int>();
|
|
|
+ for(int i=0;i<history.InsertPageCount;i++)
|
|
|
+ {
|
|
|
+ pageList.Add(history.InsertIndex+i);
|
|
|
+ }
|
|
|
+ DoRemoveSelectedPages(pageList, true);
|
|
|
+ redoHistory = history;
|
|
|
+ break;
|
|
|
+ case ActionType.InsertCustomPages:
|
|
|
+ DoRemoveSelectedPages(new List<int> {history.InsertIndex},true);
|
|
|
+ redoHistory = history;
|
|
|
+ break;
|
|
|
+ case ActionType.DragSort:
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ RedoStack.Push(redoHistory);
|
|
|
+ CanRedo = true;
|
|
|
+ //检查是否可以再进行Undo
|
|
|
+ if(UndoStack.Count<=0)
|
|
|
+ {
|
|
|
+ this.CanUndo = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 页面编辑执行Redo操作的方法
|
|
|
+ /// </summary>
|
|
|
+ private void Redo()
|
|
|
+ {
|
|
|
+ var history = RedoStack.Pop();
|
|
|
+ PageEditHistory undoHistory = new PageEditHistory();
|
|
|
+ switch (history.Type)
|
|
|
+ {
|
|
|
+ case ActionType.RightRotate:
|
|
|
+ var rightlist = history.SourceTargetValue.Keys.ToList<int>();
|
|
|
+ RotateSelectedPages(false, rightlist,true);
|
|
|
+
|
|
|
+ undoHistory.SourceTargetValue = history.SourceTargetValue;
|
|
|
+ undoHistory.Type = ActionType.LeftRotate;
|
|
|
+ break;
|
|
|
+ case ActionType.LeftRotate:
|
|
|
+ var leftlist = history.SourceTargetValue.Keys.ToList<int>();
|
|
|
+ RotateSelectedPages(true, leftlist,true);
|
|
|
+
|
|
|
+ undoHistory.SourceTargetValue = history.SourceTargetValue;
|
|
|
+ undoHistory.Type = ActionType.RightRotate;
|
|
|
+ break;
|
|
|
+ case ActionType.InsertFromFile:
|
|
|
+ InsertFromFile(history.InsertIndex,history.InsertFilePath,history.InsertFilePassWord,true);
|
|
|
+ //刷新图片
|
|
|
+ ReloadAfterOption(true, true, Tuple.Create(history.InsertIndex - 1, history.InsertIndex+history.InsertPageCount));
|
|
|
+ undoHistory = history;
|
|
|
+ break;
|
|
|
+ case ActionType.InsertCustomPages:
|
|
|
+ InsertFromCustomPage(history.InsertIndex, history.PageSize.Width, history.PageSize.Height, history.InsertFilePath);
|
|
|
+ ListSelectedIndex = history.InsertIndex;
|
|
|
+ undoHistory = history;
|
|
|
+ break;
|
|
|
+ case ActionType.DragSort:
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ UndoStack.Push(undoHistory);
|
|
|
+ CanUndo = true;
|
|
|
+ if (RedoStack.Count <= 0)
|
|
|
+ {
|
|
|
+ this.CanRedo = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 退出页面编辑面试,回到阅读页
|
|
|
/// </summary>
|
|
@@ -812,7 +967,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// <summary>
|
|
|
/// 显示Toast提示
|
|
|
/// </summary>
|
|
|
- private void ShowToast(string content)
|
|
|
+ private void ShowToast(string content="")
|
|
|
{
|
|
|
if (!string.IsNullOrEmpty(content))
|
|
|
{
|
|
@@ -847,7 +1002,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// 删除选中项的方法 不带Reload操作
|
|
|
/// 方便其他逻辑中调用
|
|
|
/// </summary>
|
|
|
- private void DoRemoveSelectedPages(List<int> pageList = null)
|
|
|
+ private void DoRemoveSelectedPages(List<int> pageList = null, bool isFromUndoRedo = false)
|
|
|
{
|
|
|
List<int> indexList = new List<int>();
|
|
|
if (pageList == null || pageList.Count < 0)
|
|
@@ -875,7 +1030,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
var result = PDFViewer.Document.RemovePages(indexList.ToArray());
|
|
|
if (!result)
|
|
|
{
|
|
|
- ShowTip = Visibility.Visible;
|
|
|
+ ShowToast();
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -884,6 +1039,15 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
{
|
|
|
PageEditItems.RemoveAt(indexList[i]);
|
|
|
}
|
|
|
+
|
|
|
+ if (!isFromUndoRedo)
|
|
|
+ {
|
|
|
+ //清除页面编辑Undo,Redo栈
|
|
|
+ UndoStack.Clear();
|
|
|
+ RedoStack.Clear();
|
|
|
+ this.CanUndo = false;
|
|
|
+ this.CanRedo = false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -954,14 +1118,14 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
bool result = savedoc.ImportPages(PDFViewer.Document, range);
|
|
|
if (!result)
|
|
|
{
|
|
|
- ShowTip = Visibility.Visible;
|
|
|
+ ShowToast();
|
|
|
IsLoading = Visibility.Collapsed;
|
|
|
return;
|
|
|
}
|
|
|
result = savedoc.WriteToFilePath(path);
|
|
|
if (!result)
|
|
|
{
|
|
|
- ShowTip = Visibility.Visible;
|
|
|
+ ShowToast();
|
|
|
}
|
|
|
savedoc.Release();//释放内存
|
|
|
}
|
|
@@ -1099,14 +1263,14 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
if (!result)
|
|
|
{
|
|
|
saveDoc1.Release();
|
|
|
- ShowTip = Visibility.Visible;
|
|
|
+ ShowToast();
|
|
|
return;
|
|
|
}
|
|
|
result = saveDoc1.WriteToFilePath(path1);
|
|
|
if (!result)
|
|
|
{
|
|
|
saveDoc1.Release();
|
|
|
- ShowTip = Visibility.Visible;
|
|
|
+ ShowToast();
|
|
|
return;
|
|
|
}
|
|
|
saveDoc1.Release();
|
|
@@ -1126,14 +1290,14 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
if (!result)
|
|
|
{
|
|
|
saveDoc2.Release();
|
|
|
- ShowTip = Visibility.Visible;
|
|
|
+ ShowToast();
|
|
|
return;
|
|
|
}
|
|
|
result = saveDoc2.WriteToFilePath(path2);
|
|
|
if (!result)
|
|
|
{
|
|
|
saveDoc2.Release();
|
|
|
- ShowTip = Visibility.Visible;
|
|
|
+ ShowToast();
|
|
|
return;
|
|
|
}
|
|
|
selectedfile = path1;
|
|
@@ -1152,29 +1316,44 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// 将文件插入到指定位置
|
|
|
/// </summary>
|
|
|
/// <param name="insertIndex"></param>
|
|
|
- private async Task<bool> InsertFromFile(int insertIndex,string filePath)
|
|
|
+ public async Task<bool> InsertFromFile(int insertIndex, string filePath, string oldPassWord = null, bool isFromUndoRedo = false)
|
|
|
{
|
|
|
CPDFDocument doc = CPDFDocument.InitWithFilePath(filePath);
|
|
|
if (doc == null)
|
|
|
{
|
|
|
- showTip = Visibility.Visible;
|
|
|
+ ShowToast();
|
|
|
return false;
|
|
|
}
|
|
|
+ string password = "";
|
|
|
if (doc.IsLocked)
|
|
|
{
|
|
|
- DialogParameters value = new DialogParameters();
|
|
|
- value.Add(ParameterNames.PDFDocument, doc);
|
|
|
- bool result = true;
|
|
|
- dialogs.ShowDialog(DialogNames.VerifyPassWordDialog, value,e=>
|
|
|
+ if(!string.IsNullOrEmpty(oldPassWord))
|
|
|
{
|
|
|
- if (e.Result != ButtonResult.OK)
|
|
|
+ var result = doc.UnlockWithPassword(oldPassWord);
|
|
|
+ if(result)
|
|
|
{
|
|
|
- result = false;
|
|
|
+ password = oldPassWord;
|
|
|
}
|
|
|
- });
|
|
|
- if(!result)
|
|
|
+ }
|
|
|
+
|
|
|
+ //没有传入密码,或者用传入密码解密失败是,需要弹出界面弹窗
|
|
|
+ if (doc.IsLocked)
|
|
|
{
|
|
|
- return false;
|
|
|
+ DialogParameters value = new DialogParameters();
|
|
|
+ value.Add(ParameterNames.PDFDocument, doc);
|
|
|
+ bool result = true;
|
|
|
+ dialogs.ShowDialog(DialogNames.VerifyPassWordDialog, value, e =>
|
|
|
+ {
|
|
|
+ if (e.Result != ButtonResult.OK)
|
|
|
+ {
|
|
|
+ result = false;
|
|
|
+ }
|
|
|
+ password = e.Parameters.GetValue<string>(ParameterNames.PassWord);
|
|
|
+ });
|
|
|
+ if (!result)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1182,18 +1361,16 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
|
|
|
//插入整个新文档
|
|
|
//文档层插入
|
|
|
- await Task.Run(() =>
|
|
|
+
|
|
|
+ var insertresult = PDFViewer.Document.ImportPagesAtIndex(doc, "1-" + pageCount, insertIndex);
|
|
|
+ if (!insertresult)
|
|
|
{
|
|
|
- var result = PDFViewer.Document.ImportPagesAtIndex(doc, "1-" + pageCount, insertIndex);
|
|
|
- if (!result)
|
|
|
- {
|
|
|
- ShowTip = Visibility.Visible;
|
|
|
- return false;
|
|
|
- }
|
|
|
- //插入成功后释放临时Document对象
|
|
|
- doc.Release();
|
|
|
- return true;
|
|
|
- });
|
|
|
+ ShowToast();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ //插入成功后释放临时Document对象
|
|
|
+ doc.Release();
|
|
|
+
|
|
|
|
|
|
//UI层插入
|
|
|
for (int i = 0; i < pageCount; i++)
|
|
@@ -1203,15 +1380,65 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
}
|
|
|
|
|
|
//加一点延时才能显示选中效果
|
|
|
- await Task.Delay(400);
|
|
|
-
|
|
|
+ await Task.Delay(200);
|
|
|
+ List<int> pageRange = new List<int>();
|
|
|
for (int i = 0; i < pageCount; i++)
|
|
|
{
|
|
|
- PageEditItems[insertIndex + i].Selected = true;
|
|
|
+ pageRange.Add(insertIndex+i+1);
|
|
|
+ }
|
|
|
+ NotifyUIToRefresh(pageRange);
|
|
|
+
|
|
|
+ //如果是undo redo里调用本方法,则不需要添加到Undo栈
|
|
|
+ if (!isFromUndoRedo)
|
|
|
+ {
|
|
|
+ //添加记录到Undo栈,清空Redo栈
|
|
|
+ PageEditHistory history = new PageEditHistory();
|
|
|
+ history.Type = ActionType.InsertFromFile;
|
|
|
+ history.InsertIndex = insertIndex;
|
|
|
+ history.InsertFilePath = filePath;
|
|
|
+ history.InsertFilePassWord = password;
|
|
|
+ history.InsertPageCount = pageCount;
|
|
|
+
|
|
|
+ AddToUndoStack(history);
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 添加记录到Undo栈
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="history"></param>
|
|
|
+ private void AddToUndoStack(PageEditHistory history)
|
|
|
+ {
|
|
|
+ UndoStack.Push(history);
|
|
|
+ CanUndo = true;
|
|
|
+ RedoStack.Clear();
|
|
|
+ CanRedo = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 插入自定义页面
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="insertIndex"></param>
|
|
|
+ /// <param name="width"></param>
|
|
|
+ /// <param name="height"></param>
|
|
|
+ /// <param name="filePath"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private bool InsertFromCustomPage(int insertIndex,double width,double height,string filePath)
|
|
|
+ {
|
|
|
+ //文档层插入
|
|
|
+ var result = PDFViewer.Document.InsertPage(insertIndex, width, height, string.IsNullOrEmpty(filePath)?null:filePath);
|
|
|
+ if (!result)
|
|
|
+ {
|
|
|
+ ShowToast();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ PageEditItem item = new PageEditItem();
|
|
|
+ PageEditItems.Insert(insertIndex, item);
|
|
|
+ ReloadAfterOption(true, true, Tuple.Create(insertIndex - 1, insertIndex + 1));
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 根据索引创建新的Item
|
|
|
/// </summary>
|
|
@@ -1228,7 +1455,9 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
item.PageNumber = index + 1;
|
|
|
var pagesize = PDFViewer.Document.GetPageSize(index);
|
|
|
item.Size = pagesize;
|
|
|
- item.PageSize = $"{pagesize.Width}mm*{pagesize.Height} mm";
|
|
|
+ double width = CommonHelper.GetUnitsFromPageSize(pagesize.Width);
|
|
|
+ double height = CommonHelper.GetUnitsFromPageSize(pagesize.Height);
|
|
|
+ item.PageSize = $"{width.ToString("F2")}mm*{height.ToString("F2")} mm";
|
|
|
return item;
|
|
|
}
|
|
|
|
|
@@ -1266,27 +1495,59 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
PDFViewer.UndoManager.CanSave = true;
|
|
|
PDFViewer.ReloadDocument();
|
|
|
}
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 旋转所有选中页面
|
|
|
/// </summary>
|
|
|
/// <param name="rightRotate"></param>
|
|
|
- private async void RotateSelectedPages(bool rightRotate = true)
|
|
|
+ private async void RotateSelectedPages(bool rightRotate = true,List<int> pageitems=null,bool isFromUndoRedo = false)
|
|
|
{
|
|
|
IsLoading = Visibility.Visible;
|
|
|
await Task.Delay(2);
|
|
|
- for (int i = 0; i < PageEditItems.Count; i++)
|
|
|
+ Dictionary<int, int> items = new Dictionary<int, int>();
|
|
|
+ if (pageitems == null)
|
|
|
{
|
|
|
- if (PageEditItems[i].Selected)
|
|
|
+ //旋转选中页面
|
|
|
+ for (int i = 0; i < PageEditItems.Count; i++)
|
|
|
+ {
|
|
|
+ if (PageEditItems[i].Selected)
|
|
|
+ {
|
|
|
+ //逆时针旋转传 - 1 顺时针旋转传1
|
|
|
+ PDFViewer.Document.RotatePage(i, rightRotate ? 1 : -1);
|
|
|
+ PDFViewer.Document.ReleasePages(i);
|
|
|
+ items.Add(i, i);
|
|
|
+
|
|
|
+ //重新拿图
|
|
|
+ PageEditItems[i].isVertical = !PageEditItems[i].isVertical;
|
|
|
+ PageEditItems[i].IsGetImage = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //旋转对应Items集合
|
|
|
+ for (int i = 0; i < pageitems.Count; i++)
|
|
|
{
|
|
|
- //逆时针旋转传 - 1 顺时针旋转传1
|
|
|
- PDFViewer.Document.RotatePage(i, rightRotate ? 1 : -1);
|
|
|
- PDFViewer.Document.ReleasePages(i);
|
|
|
+ PDFViewer.Document.RotatePage(pageitems[i], rightRotate ? 1 : -1);
|
|
|
+ PDFViewer.Document.ReleasePages(pageitems[i]);
|
|
|
+ items.Add(pageitems[i], pageitems[i]);
|
|
|
|
|
|
//重新拿图
|
|
|
- PageEditItems[i].isVertical = !PageEditItems[i].isVertical;
|
|
|
- PageEditItems[i].IsGetImage = false;
|
|
|
+ PageEditItems[pageitems[i]].isVertical = !PageEditItems[pageitems[i]].isVertical;
|
|
|
+ PageEditItems[pageitems[i]].IsGetImage = false;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ //如果是undo,Redo里调用的方法,则不记录到栈里
|
|
|
+ if (!isFromUndoRedo)
|
|
|
+ {
|
|
|
+ //记录进Undo栈
|
|
|
+ PageEditHistory history = new PageEditHistory();
|
|
|
+ history.Type = rightRotate ? ActionType.RightRotate : ActionType.LeftRotate;
|
|
|
+ history.SourceTargetValue = items;
|
|
|
+ AddToUndoStack(history);
|
|
|
+ }
|
|
|
+
|
|
|
ReloadAfterOption(false, true, Tuple.Create(0, PageEditItems.Count));
|
|
|
IsLoading = Visibility.Collapsed;
|
|
|
}
|
|
@@ -1299,7 +1560,9 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
for (int i = 0; i < PageEditItems.Count; i++)
|
|
|
{
|
|
|
PageEditItems[i].PageNumber = i + 1;
|
|
|
+ PageEditItems[i].ShowPageSize = HasShowPageSize == Visibility.Visible ? true : false;
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -1323,12 +1586,13 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// <param name="index">页面范围选中项索引</param>
|
|
|
private void SuitPageRange(int index)
|
|
|
{
|
|
|
+ List<int> pageRange = new List<int>();
|
|
|
switch (index)
|
|
|
{
|
|
|
case 0:
|
|
|
for (int i = 0; i < PageEditItems.Count; i++)
|
|
|
{
|
|
|
- PageEditItems[i].Selected = true;
|
|
|
+ pageRange.Add(i+1);
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -1338,11 +1602,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
{
|
|
|
if (i % 2 == 0)
|
|
|
{
|
|
|
- PageEditItems[i].Selected = true;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- PageEditItems[i].Selected = false;
|
|
|
+ pageRange.Add(i + 1);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -1350,26 +1610,18 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
//偶数页
|
|
|
for (int i = 0; i < PageEditItems.Count; i++)
|
|
|
{
|
|
|
- if (i % 2 == 0)
|
|
|
+ if (i % 2 != 0)
|
|
|
{
|
|
|
- PageEditItems[i].Selected = false;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- PageEditItems[i].Selected = true;
|
|
|
+ pageRange.Add(i + 1);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case 3://横向页面
|
|
|
for (int i = 0; i < PageEditItems.Count; i++)
|
|
|
{
|
|
|
- if (PDFViewer.Document.PageAtIndex(i).Rotation % 2 == 0)
|
|
|
+ if (PDFViewer.Document.PageAtIndex(i).Rotation % 2 != 0)
|
|
|
{
|
|
|
- PageEditItems[i].Selected = false;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- PageEditItems[i].Selected = true;
|
|
|
+ pageRange.Add(i + 1);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -1378,11 +1630,7 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
{
|
|
|
if (PDFViewer.Document.PageAtIndex(i).Rotation % 2 == 0)
|
|
|
{
|
|
|
- PageEditItems[i].Selected = true;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- PageEditItems[i].Selected = false;
|
|
|
+ pageRange.Add(i + 1);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -1394,6 +1642,10 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
+ if(pageRange.Count>0)
|
|
|
+ {
|
|
|
+ NotifyUIToRefresh(pageRange);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
@@ -1401,8 +1653,19 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// 是否显示页面尺寸
|
|
|
/// </summary>
|
|
|
/// <param name="show">是或否</param>
|
|
|
- private void ShowPageSize(bool show = true)
|
|
|
+ private void ShowPageSize()
|
|
|
{
|
|
|
+ bool show = true;
|
|
|
+ if(HasShowPageSize== Visibility.Visible)
|
|
|
+ {
|
|
|
+ show = false;
|
|
|
+ HasShowPageSize = Visibility.Collapsed;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ show = true;
|
|
|
+ HasShowPageSize = Visibility.Visible;
|
|
|
+ }
|
|
|
for (int i = 0; i < PageEditItems.Count; i++)
|
|
|
{
|
|
|
PageEditItems[i].ShowPageSize = show;
|
|
@@ -1542,10 +1805,15 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
{
|
|
|
if (isFirstLoad)
|
|
|
{
|
|
|
+ PDFViewer.OnThumbnailGenerated -= PDFViewer_OnThumbnailGenerated;
|
|
|
PDFViewer.OnThumbnailGenerated += PDFViewer_OnThumbnailGenerated;
|
|
|
PDFViewer.InfoChanged += PDFViewer_InfoChanged;
|
|
|
ZoomIndex = 0;
|
|
|
-
|
|
|
+ if(viewContentViewModel!=null)
|
|
|
+ {
|
|
|
+ viewContentViewModel.PageEditUndo = Undo;
|
|
|
+ viewContentViewModel.PageEditRedo = Redo;
|
|
|
+ }
|
|
|
}
|
|
|
//BOTA缩略图时,显示不同的菜单栏
|
|
|
if(isBOTA)
|