Browse Source

页面编辑-单选、多选右键菜单、替换页面 先看文件是否加密,如果加密,先解密后,再替换

OYXH\oyxh 1 năm trước cách đây
mục cha
commit
fe0bbe512d

+ 70 - 54
PDF Office/ViewModels/PageEdit/PageEditContentViewModel.cs

@@ -643,13 +643,20 @@ namespace PDF_Master.ViewModels.PageEdit
                 //先记录索引(第一个选定页面)
                 int index = ListSelectedIndex;
 
-                //先删除
-                DoRemoveSelectedPages(indexList);
+                //替换页面 先看文件是否加密,如果加密,先解密后,再替换
+                bool isDiscryptied = GetDocumentIsDiscryptied(fileName, null, out CPDFDocument doc, out string password);
 
-                //再新增,避免索引串号的情况
-                var result = await InsertFromFile(index, fileName);
+                if (isDiscryptied)
+                {
+                    //先删除
+                    DoRemoveSelectedPages(indexList);
+
+                    //再新增,避免索引串号的情况
+                    var result = await InsertFromFile(index, fileName, password);
+
+                    ReloadAfterOption(true, false, Tuple.Create(insertIndex - 1, insertIndex + pageCount));
+                }
 
-                ReloadAfterOption(true, false, Tuple.Create(insertIndex - 1, insertIndex + pageCount));
                 IsLoading = Visibility.Collapsed;
             }
         }
@@ -1135,7 +1142,7 @@ namespace PDF_Master.ViewModels.PageEdit
 
         private bool CanReverseFileCommandExcute()
         {
-            if (ListSelectedIndex > 0 && IsMultiSelected)
+            if (ListSelectedIndex >= 0 && IsMultiSelected)
             {
                 return true;
             }
@@ -2138,13 +2145,68 @@ namespace PDF_Master.ViewModels.PageEdit
         /// <param name="insertIndex"></param>
         public async Task<bool> InsertFromFile(int insertIndex, string filePath, string oldPassWord = null, bool isFromUndoRedo = false)
         {
-            CPDFDocument doc = CPDFDocument.InitWithFilePath(filePath);
+            bool IsLocked = GetDocumentIsDiscryptied(filePath, oldPassWord, out CPDFDocument doc, out string password);
+
+            if (IsLocked == false)
+            {
+                return false;
+            }
+            int pageCount = doc.PageCount;
+
+            //插入整个新文档
+            //文档层插入
+
+            var insertresult = PDFViewer.Document.ImportPagesAtIndex(doc, "1-" + pageCount, insertIndex);
+            if (!insertresult)
+            {
+                ShowToast();
+                return false;
+            }
+            //插入成功后释放临时Document对象
+            doc.Release();
+
+            //UI层插入
+            for (int i = 0; i < pageCount; i++)
+            {
+                var item = GetNewPageEditItem(i);
+                PageEditItems.Insert(insertIndex + i, item);
+            }
+
+            //加一点延时才能显示选中效果
+            await Task.Delay(200);
+            List<int> pageRange = new List<int>();
+            for (int i = 0; i < pageCount; i++)
+            {
+                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;
+                history.viewmodel = this;
+                PDFViewer.UndoManager.AddHistory(history);
+            }
+            return true;
+        }
+
+        private bool GetDocumentIsDiscryptied(string filePath, string oldPassWord, out CPDFDocument doc, out string password)
+        {
+            doc = CPDFDocument.InitWithFilePath(filePath);
+            password = "";
             if (doc == null)
             {
                 ShowToast();
                 return false;
             }
-            string password = "";
+
             if (doc.IsLocked)
             {
                 if (!string.IsNullOrEmpty(oldPassWord))
@@ -2197,50 +2259,6 @@ namespace PDF_Master.ViewModels.PageEdit
                     }
                 }
             }
-
-            int pageCount = doc.PageCount;
-
-            //插入整个新文档
-            //文档层插入
-
-            var insertresult = PDFViewer.Document.ImportPagesAtIndex(doc, "1-" + pageCount, insertIndex);
-            if (!insertresult)
-            {
-                ShowToast();
-                return false;
-            }
-            //插入成功后释放临时Document对象
-            doc.Release();
-
-            //UI层插入
-            for (int i = 0; i < pageCount; i++)
-            {
-                var item = GetNewPageEditItem(i);
-                PageEditItems.Insert(insertIndex + i, item);
-            }
-
-            //加一点延时才能显示选中效果
-            await Task.Delay(200);
-            List<int> pageRange = new List<int>();
-            for (int i = 0; i < pageCount; i++)
-            {
-                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;
-                history.viewmodel = this;
-                PDFViewer.UndoManager.AddHistory(history);
-            }
             return true;
         }
 
@@ -2551,8 +2569,6 @@ namespace PDF_Master.ViewModels.PageEdit
                     await Task.Delay(30);
                     TbPageRange = "";
                 }
-
-
             }
         }
 

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

@@ -99,8 +99,8 @@
                 </Grid>
             </DataTemplate>
 
-            <ContextMenu x:Key="ListBoxItemMenu" DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}">
-                <MenuItem Header="插入页面" Visibility="Visible">
+            <ContextMenu x:Key="ListBoxItemMenu" DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" Loaded="ContextMenu_Loaded">
+                <MenuItem Header="插入页面" Visibility="Visible" Tag="Insert">
                     <MenuItem
                         Command="{Binding InsertCommand}"
                         CommandParameter="{x:Static model:ParameterNames.InsertType_File}"
@@ -115,13 +115,21 @@
                         Header="插入自定义页面" />
                 </MenuItem>
                 <MenuItem
-                    Command="{Binding ExtractCommand}"
+                    Command="{Binding ExtractCommand}" Tag="Extract"
                     Header="提取页面"
                     Visibility="Visible" />
                 <MenuItem
-                    Command="{Binding ReplaceCommand}"
+                    Command="{Binding ReplaceCommand}" Tag="Replace"
                     Header="替换页面"
                     Visibility="{Binding IsBOTAThumb, Converter={StaticResource UnvisibleConvert}}" />
+                <MenuItem
+                    Command="{Binding SplitCommand}" Tag="Split"
+                    Header="拆分"
+                    Visibility="Visible" />
+                <MenuItem
+                    Command="{Binding ReverseCommand}" Tag="Reverse"
+                    Header="倒序"
+                    Visibility="Visible" />
                 <MenuItem Command="{Binding DeleteCommand}" Header="{x:Static mainpage:MainPage.PageEdit_MenuDelete}" />
                 <MenuItem
                     Command="{Binding EnterPageEditCommand}"

+ 82 - 16
PDF Office/Views/PageEdit/PageEditContent.xaml.cs

@@ -158,7 +158,7 @@ namespace PDF_Master.Views.PageEdit
                     ItemSuitAcutalWidth(this.ActualWidth);
                 }
                 //补充判断条件,修复页数多的文档,在BOTA展开的情况下,切换到页面编辑会卡死的问题
-                if (GridBOTAHeader.Visibility != Visibility.Visible&&!viewModel.Initializing)
+                if (GridBOTAHeader.Visibility != Visibility.Visible && !viewModel.Initializing)
                 {
                     //页面编辑模式下,页面总数变化后用于通知BOTA面板进行数据集刷新
                     //只需要页面编辑通知缩略图,不需要缩略图通知页面编辑,因为现在每次导航进去时都会刷新item个数
@@ -442,15 +442,8 @@ namespace PDF_Master.Views.PageEdit
                         }
 
                         //string tempPath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), filename);
-                        List<int> pages = new List<int>();
-                        for (int i = 0; i < ListPageEdit.SelectedItems.Count; i++)
-                        {
-                            //这样拿 更精准
-                            if (ListPageEdit.SelectedItems[i] is PageEditItem pageEditItem)
-                            {
-                                pages.Add(pageEditItem.PageNumber);
-                            }
-                        }
+
+                        List<int> pages = GetSelectedItems();
                         pages.Sort();
 
                         string[] files = new string[1];
@@ -547,6 +540,20 @@ namespace PDF_Master.Views.PageEdit
             }
         }
 
+        private List<int> GetSelectedItems()
+        {
+            List<int> pages = new List<int>();
+            for (int i = 0; i < ListPageEdit.SelectedItems.Count; i++)
+            {
+                //这样拿 更精准
+                if (ListPageEdit.SelectedItems[i] is PageEditItem pageEditItem)
+                {
+                    pages.Add(pageEditItem.PageNumber);
+                }
+            }
+            return pages;
+        }
+
         /// <summary>
         /// 判断是否开始框选、记录框选起始位置
         /// </summary>
@@ -1125,12 +1132,12 @@ namespace PDF_Master.Views.PageEdit
                             // 文件里包含有pdf格式文件,就允许拖入
                             string type = System.IO.Path.GetExtension(file).ToLower();
                             if (viewModel.Txt.Contains(type) ||
-                                viewModel.Word.Contains(type) ||
-                                viewModel.Ppt.Contains(type) ||
-                                viewModel.Excel.Contains(type) ||
-                                viewModel.Html.Contains(type) ||
-                                viewModel.Image.Contains(type) ||
-                                viewModel.Pdf.Contains(type) && info.Length > 0)
+                            viewModel.Word.Contains(type) ||
+                            viewModel.Ppt.Contains(type) ||
+                            viewModel.Excel.Contains(type) ||
+                            viewModel.Html.Contains(type) ||
+                            viewModel.Image.Contains(type) ||
+                              viewModel.Pdf.Contains(type) && info.Length > 0)
                             {
                                 isDragingEnter = true;
                             }
@@ -1306,5 +1313,64 @@ namespace PDF_Master.Views.PageEdit
             MenuInsert.PlacementTarget = this.BtnInsert;
             MenuInsert.IsOpen = true;
         }
+
+        private void ContextMenu_Loaded(object sender, RoutedEventArgs e)
+        {
+            var menu = sender as System.Windows.Controls.ContextMenu;
+            if (menu != null)
+            {
+                List<int> pages = GetSelectedItems();
+                if (pages.Count >= 2)
+                {
+                    foreach (var item in menu.Items)
+                    {
+                        if (item is MenuItem menuItem)
+                        {
+                            if (menuItem.Tag == null)
+                            {
+                                continue;
+                            }
+                            if (menuItem.Tag.ToString() == "Insert")
+                            {
+                                menuItem.Visibility = Visibility.Collapsed;
+                            }
+                            if (menuItem.Tag.ToString() == "Reverse")
+                            {
+                                menuItem.Visibility = Visibility.Visible;
+                            }
+                            if (menuItem.Tag.ToString() == "Split")
+                            {
+                                menuItem.Visibility = Visibility.Visible;
+                            }
+                        }
+                    }
+                }
+                else
+                {
+                    foreach (var item in menu.Items)
+                    {
+                        if (item is MenuItem menuItem)
+                        {
+                            if (menuItem.Tag == null)
+                            {
+                                continue;
+                            }
+                            if (menuItem.Tag.ToString() == "Insert")
+                            {
+                                menuItem.Visibility = Visibility.Visible;
+                            }
+                            if (menuItem.Tag.ToString() == "Reverse")
+                            {
+                                menuItem.Visibility = Visibility.Collapsed;
+                            }
+                            if (menuItem.Tag.ToString() == "Split")
+                            {
+                                menuItem.Visibility = Visibility.Collapsed;
+                            }
+                        }
+                    }
+                }
+            }
+        }
     }
 }