Browse Source

页面编辑-补充插入和替换功能

ZhouJieSheng 2 years ago
parent
commit
a68f8db9be

+ 248 - 80
PDF Office/ViewModels/PageEdit/PageEditContentViewModel.cs

@@ -24,6 +24,7 @@ using System.Windows.Input;
 using PDF_Office.Helper;
 using Microsoft.Win32;
 using ComPDFKit.PDFDocument;
+using PDF_Office.CustomControl;
 
 namespace PDF_Office.ViewModels.PageEdit
 {
@@ -56,6 +57,11 @@ namespace PDF_Office.ViewModels.PageEdit
         /// </summary>
         private bool isFirstLoad = true;
 
+        /// <summary>
+        /// 记录多选项中最后一项的索引
+        /// </summary>
+        private int maxSelectedIndex = 0;
+
         private Visibility showTip = Visibility.Collapsed;
         /// <summary>
         /// 是否显示渐隐提示
@@ -213,7 +219,7 @@ namespace PDF_Office.ViewModels.PageEdit
         /// <summary>
         /// 插入文件命令
         /// </summary>
-        public DelegateCommand InsertCommand { get; set; }
+        public DelegateCommand<Object> InsertCommand { get; set; }
 
         /// <summary>
         /// 拆分文件
@@ -271,7 +277,7 @@ namespace PDF_Office.ViewModels.PageEdit
             KeyDown = new DelegateCommand<object>(KeyDownEvent);
 
             SplitCommand = new DelegateCommand(SplitCommandEvent);
-            InsertCommand = new DelegateCommand(InsertCommandEvent);
+            InsertCommand = new DelegateCommand<object>(InsertCommandEvent);
             ReplaceCommand = new DelegateCommand(ReplaceCommandEvent, CanReplaceCommandExcute).ObservesProperty(() => IsMutiSelected);
             ExtractCommand = new DelegateCommand(ExtractCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex);
             DeleteCommand = new DelegateCommand(DeleteCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex);
@@ -301,72 +307,22 @@ namespace PDF_Office.ViewModels.PageEdit
             {
                 IsLoading = Visibility.Visible;
                 await Task.Delay(200);
-                int pageCount = 0;
-                int insertIndex = -1;
-                CPDFDocument doc = CPDFDocument.InitWithFilePath(dialog.FileName);
-                if (doc == null)
-                {
-                    showTip = Visibility.Visible;
-                    return;
-                }
-                if (doc.IsLocked)
-                {
-                    DialogParameters value = new DialogParameters();
-                    value.Add(ParameterNames.PDFDocument, doc);
-                    dialogs.ShowDialog(DialogNames.VerifyPassWordDialog, value, e =>
-                    {
-                        if (e.Result != ButtonResult.OK)
-                        {
-                            return;
-                        }
-                    });
-                }
-
-                pageCount = doc.PageCount;
-
-                insertIndex = listSelecedIndex;
-                //删除原有页面
-                DeleteCommandEvent();
+                int pageCount = PDFViewer.Document.PageCount;
+                int insertIndex = listSelecedIndex;
 
-                //插入整个新文档
-                //文档层插入
-                await Task.Run(() =>
+                //从文件插入到指定位置
+                var result = await InsertFromFile(listSelecedIndex+1,dialog.FileName);
+                if(result)
                 {
-                    var result = PDFViewer.Document.ImportPagesAtIndex(doc, "1-" + pageCount, insertIndex);
-                    if (!result)
-                    {
-                        ShowTip = Visibility.Visible;
-                        return;
-                    }
-                    //插入成功后释放临时Document对象
-                    doc.Release();
-                });
-                //UI层插入
-                for (int i = 0; i < pageCount; i++)
-                {
-                    PageEditItem item = new PageEditItem();
-                    if (PDFViewer.Document.PageAtIndex(i).Rotation % 2 != 0)
-                    {
-                        ///标记为横向页面
-                        item.isVertical = false;
-                    }
-                    var pagesize = PDFViewer.Document.GetPageSize(i);
-                    item.PageSize = $"{pagesize.Width}mm*{pagesize.Height} mm";
-                    PageEditItems.Insert(insertIndex + i, item);
+                    //插入成功后再删除原有页面
+                    DoRemoveSelectedPages(new List<int>() { listSelecedIndex });
                 }
 
-                ReloadAfterOption(true, true, Tuple.Create(insertIndex, insertIndex + pageCount));
+                ReloadAfterOption(true, true, Tuple.Create(insertIndex-1, insertIndex + pageCount));
 
-                //加一点延时才能显示选中效果
-                await Task.Delay(400);
 
-                for (int i = 0; i < pageCount; i++)
-                {
-                    PageEditItems[insertIndex + i].Selected = true;
-                }
 
                 IsLoading = Visibility.Collapsed;
-
             }
         }
 
@@ -389,9 +345,80 @@ namespace PDF_Office.ViewModels.PageEdit
         /// <summary>
         /// 插入功能的逻辑
         /// </summary>
-        private void InsertCommandEvent()
+        private async void InsertCommandEvent(object type)
         {
+            if((string)type==null)
+            {
+                return;
+            }
+            //获取插入位置
+            int insertIndex = 0;
+            if(listSelecedIndex<0)
+            {
+                insertIndex = 0;
+            }
+            else
+            {
+                insertIndex = listSelecedIndex+1;
+                if(isMutiSelected)
+                {
+                    insertIndex = maxSelectedIndex+1;
+                }
+            }
+            IsLoading = Visibility.Visible;
+            await Task.Delay(3);
+            if((string)type==ParameterNames.InsertType_Blank)
+            {
+                //插入空白页面
+                bool result;
+                if (insertIndex == 0)
+                {
+                    result = PDFViewer.Document.InsertPage(insertIndex, PageEditItems[insertIndex].Size.Width, PageEditItems[insertIndex].Size.Height, null);
+                }
+                else
+                {
+                    result = PDFViewer.Document.InsertPage(insertIndex, PageEditItems[insertIndex-1].Size.Width, PageEditItems[insertIndex-1].Size.Height, null);
+                }
+                if(!result)
+                {
+                    IsLoading = Visibility.Collapsed;
+                    ShowTip = Visibility.Visible;
+                    return;
+                }
+
+                //UI层插入Item
+                var item = GetNewPageEditItem(insertIndex);
+                PageEditItems.Insert(insertIndex,item);
+         
+
+                ReloadAfterOption(true,true,Tuple.Create(insertIndex,insertIndex+1));
+                await Task.Delay(10);
+                ListSelectedIndex = insertIndex == 0 ? insertIndex : insertIndex;
+            }
+            else if((string)type == ParameterNames.InsertType_File)
+            {
+                OpenFileDialog dialog = new OpenFileDialog();
+                dialog.Multiselect = false;
+                dialog.Filter = PDF_Office.Properties.Resources.OpenDialogFilter;
+                if ((bool)dialog.ShowDialog())
+                {
+                    //插入文件
+                   var result = await InsertFromFile(insertIndex,dialog.FileName);
+                    if(!result)
+                    {
+                        IsLoading = Visibility.Collapsed;
+                        ShowTip = Visibility.Visible;
+                        return;
+                    }
 
+                    ReloadAfterOption(true,true,Tuple.Create(0,PDFViewer.Document.PageCount));
+                }
+            }
+            else
+            {
+                //插入自定义页面
+            }
+            IsLoading = Visibility.Collapsed;
         }
 
         /// <summary>
@@ -422,9 +449,53 @@ namespace PDF_Office.ViewModels.PageEdit
         /// <summary>
         /// 页面倒序的逻辑
         /// </summary>
-        private void ReverseCommandEvent()
+        private async void ReverseCommandEvent()
         {
+            IsLoading = Visibility.Visible;
+            await Task.Delay(3);
+            List<int> pages = new List<int>();
+            for (int i = 0; i <PageEditItems.Count; i++)
+            {
+                if (PageEditItems[i].Selected)
+                {
+                    pages.Add(i);
+                }
+            }
+            pages.Sort();
 
+            for (int i = 0; i < pages.Count; i++)
+            {
+                int preindex = pages[i];
+                int laterIndex = pages[pages.Count - i - 1];//尾部的索引
+                if (laterIndex <= preindex)//交换完成
+                {
+                    break;
+                }
+                var sourceitem = PageEditItems[preindex];
+                var targetitem = PageEditItems[laterIndex];
+
+                var result = PDFViewer.Document.ExchangePage(preindex, laterIndex);
+                if(!result)
+                {
+                    ShowTip = Visibility.Visible;
+                    IsLoading = Visibility.Collapsed;
+                    return;
+                }
+
+                PageEditItems.Remove(sourceitem);
+                PageEditItems.Remove(targetitem);
+                PageEditItems.Insert(preindex, targetitem);
+                PageEditItems.Insert(laterIndex, sourceitem);
+            }
+
+            await Task.Delay(20);
+            for(int i=0;i<pages.Count;i++)
+            {
+                PageEditItems[i].Selected = true;
+            }
+
+            ReloadAfterOption(true,true,null);
+            IsLoading = Visibility.Collapsed;
         }
 
         /// <summary>
@@ -529,7 +600,10 @@ namespace PDF_Office.ViewModels.PageEdit
                 List<int> pagelist = new List<int>();
                 for (int i = 0; i < listbox.SelectedItems.Count; i++)
                 {
-                    pagelist.Add((listbox.SelectedItems[i] as PageEditItem).PageNumber);
+                    if (!pagelist.Contains((listbox.SelectedItems[i] as PageEditItem).PageNumber))
+                    {
+                        pagelist.Add((listbox.SelectedItems[i] as PageEditItem).PageNumber);
+                    }
                 }
 
                 //手动取消其他项的选中状态
@@ -562,6 +636,7 @@ namespace PDF_Office.ViewModels.PageEdit
             if (listbox.SelectedItems.Count > 1)
             {
                 IsMutiSelected = true;
+                maxSelectedIndex = listbox.Items.IndexOf(listbox.SelectedItems[listbox.SelectedItems.Count-1]);
             }
             else
             {
@@ -604,7 +679,9 @@ namespace PDF_Office.ViewModels.PageEdit
                 var result = CommonHelper.GetPagesInRange(ref TargetPageIndexs, (args.OriginalSource as TextBox).Text, PDFViewer.Document.PageCount, new char[] { ',', ',' }, new char[] { '-' });
                 if (!result)
                 {
-                    MessageBox.Show("请输入有效范围");
+                    AlertsMessage alertsMessage = new AlertsMessage();
+                    alertsMessage.ShowDialog("","请输入有效范围","OK");
+                    return;
                 }
 
                 //选中输入的页面范围
@@ -628,7 +705,7 @@ namespace PDF_Office.ViewModels.PageEdit
 
         /// <summary>
         /// 通知UI刷新页面范围
-        /// </summary>
+        /// </summary>vb nmjvcx
         private void NotifyUIToRefresh()
         {
             //通知UI刷新页面范围
@@ -639,23 +716,39 @@ namespace PDF_Office.ViewModels.PageEdit
         /// 删除选中项的方法 不带Reload操作
         /// 方便其他逻辑中调用
         /// </summary>
-        private async void DoRemoveSelectedPages()
+        private async void DoRemoveSelectedPages(List<int> pageList = null)
         {
             IsLoading = Visibility.Visible;
             await Task.Delay(3);
             List<int> indexList = new List<int>();
-            for (int i = 0; i < PageEditItems.Count; i++)
+            if (pageList == null || pageList.Count < 0)
             {
-                if (PageEditItems[i].Selected)
+                for (int i = 0; i < PageEditItems.Count; i++)
                 {
-                    indexList.Add(i);
+                    if (PageEditItems[i].Selected)
+                    {
+                        indexList.Add(i);
+                    }
                 }
             }
+            else
+            {
+                indexList = pageList;
+            }
+            
+            if(indexList.Count>0&& indexList.Count==PDFViewer.Document.PageCount)
+            {
+                IsLoading = Visibility.Collapsed;
+                AlertsMessage alertsMessage = new AlertsMessage();
+                alertsMessage.ShowDialog("","不能删除所有页面","OK");
+                return;
+            }
 
             var result = PDFViewer.Document.RemovePages(indexList.ToArray());
             if (!result)
             {
                 ShowTip = Visibility.Visible;
+                IsLoading = Visibility.Collapsed;
                 return;
             }
 
@@ -667,6 +760,90 @@ namespace PDF_Office.ViewModels.PageEdit
             IsLoading = Visibility.Collapsed;
         }
 
+        /// <summary>
+        /// 将文件插入到指定位置
+        /// </summary>
+        /// <param name="insertIndex"></param>
+        private async Task<bool> InsertFromFile(int insertIndex,string filePath)
+        {
+            CPDFDocument doc = CPDFDocument.InitWithFilePath(filePath);
+            if (doc == null)
+            {
+                showTip = Visibility.Visible;
+                return false;
+            }
+            if (doc.IsLocked)
+            {
+                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;
+                    }
+                });
+                if(!result)
+                {
+                    return false;
+                }
+            }
+
+           int pageCount = doc.PageCount;
+
+            //插入整个新文档
+            //文档层插入
+            await Task.Run(() =>
+            {
+                var result = PDFViewer.Document.ImportPagesAtIndex(doc, "1-" + pageCount, insertIndex);
+                if (!result)
+                {
+                    ShowTip = Visibility.Visible;
+                    return false;
+                }
+                    //插入成功后释放临时Document对象
+                    doc.Release();
+                return true;
+            });
+
+            //UI层插入
+            for (int i = 0; i < pageCount; i++)
+            {
+                var item = GetNewPageEditItem(i);
+                PageEditItems.Insert(insertIndex + i, item);
+            }
+
+            //加一点延时才能显示选中效果
+            await Task.Delay(400);
+
+            for (int i = 0; i < pageCount; i++)
+            {
+                PageEditItems[insertIndex + i].Selected = true;
+            }
+            return true;
+        }
+
+        /// <summary>
+        /// 根据索引创建新的Item
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
+        private PageEditItem GetNewPageEditItem(int index)
+        {
+            PageEditItem item = new PageEditItem();
+            if (PDFViewer.Document.PageAtIndex(index).Rotation % 2 != 0)
+            {
+                ///标记为横向页面
+                item.isVertical = false;
+            }
+            item.PageNumber = index + 1;
+            var pagesize = PDFViewer.Document.GetPageSize(index);
+            item.Size = pagesize;
+            item.PageSize = $"{pagesize.Width}mm*{pagesize.Height} mm";
+            return item;
+        }
+
         /// <summary>
         /// 进行文件操作后刷新PDFView
         /// 清除undo 栈
@@ -722,7 +899,7 @@ namespace PDF_Office.ViewModels.PageEdit
                     PageEditItems[i].IsGetImage = false;
                 }
             }
-            ReloadAfterOption(false, true, Tuple.Create(0,PageEditItems.Count));
+            ReloadAfterOption(false, true, Tuple.Create(0, PageEditItems.Count));
             IsLoading = Visibility.Collapsed;
         }
 
@@ -855,16 +1032,7 @@ namespace PDF_Office.ViewModels.PageEdit
                 PageEditItems.Clear();
                 for (int i = 0; i < PDFViewer.Document.PageCount; i++)
                 {
-                    PageEditItem item = new PageEditItem();
-                    item.PageNumber = i + 1;
-
-                    if (PDFViewer.Document.PageAtIndex(i).Rotation % 2 != 0)
-                    {
-                        ///标记为横向页面
-                        item.isVertical = false;
-                    }
-                    var pagesize = PDFViewer.Document.GetPageSize(i);
-                    item.PageSize = $"{pagesize.Width}mm*{pagesize.Height} mm";
+                    var item = GetNewPageEditItem(i);
                     PageEditItems.Add(item);
                 }
             }

+ 24 - 4
PDF Office/Views/PageEdit/PageEditContent.xaml

@@ -9,6 +9,7 @@
     xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
     xmlns:local="clr-namespace:PDF_Office.Views.PageEdit"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+    xmlns:model="clr-namespace:PDF_Office.Model"
     xmlns:pageedit="clr-namespace:PDF_Office.Model.PageEdit"
     xmlns:pageedit1="clr-namespace:PDF_Office.ViewModels.PageEdit"
     xmlns:prism="http://prismlibrary.com/"
@@ -174,11 +175,28 @@
                         BorderBrush="#33000000"
                         BorderThickness="5"
                         Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" />
-                    <Button
+                    <Menu
+                        Width="65"
                         Height="20"
-                        Margin="5"
-                        Command="{Binding InsertCommand}"
-                        Content="插入" />
+                        Margin="5">
+                        <MenuItem
+                            Width="65"
+                            Height="20"
+                            Header="插入">
+                            <MenuItem
+                                Command="{Binding InsertCommand}"
+                                CommandParameter="{x:Static model:ParameterNames.InsertType_File}"
+                                Header="插入文件" />
+                            <MenuItem
+                                Command="{Binding InsertCommand}"
+                                CommandParameter="{x:Static model:ParameterNames.InsertType_Blank}"
+                                Header="插入空白页" />
+                            <MenuItem
+                                Command="{Binding InsertCommand}"
+                                CommandParameter="{x:Static model:ParameterNames.InsertType_Custom}"
+                                Header="插入自定义页面" />
+                        </MenuItem>
+                    </Menu>
                     <Button
                         Height="20"
                         Margin="5"
@@ -250,6 +268,8 @@
                         <Setter Property="Margin" Value="0,10" />
                         <Setter Property="Visibility" Value="{Binding Visible}" />
                         <Setter Property="IsSelected" Value="{Binding Selected, Mode=TwoWay}" />
+                        <Setter Property="HorizontalContentAlignment" Value="Center" />
+                        <Setter Property="VerticalContentAlignment" Value="Center" />
                     </Style>
                 </ListBox.ItemContainerStyle>
                 <ListBox.ItemsPanel>