Browse Source

ComPDFKit.Tool(win)-修复文字编辑多选对齐操作后Undo再执行对齐操作位置不正确问题

liyuxuan 7 months ago
parent
commit
1ef494bdaa

+ 3 - 3
Demo/Examples/ComPDFKit.Tool/CPDFViewerTool.MultiSelectedRect.cs

@@ -157,7 +157,7 @@ namespace ComPDFKit.Tool
                     editAreaList.Add(startselectedrect, startSelectedEditAreaObject);
                     multiSelectedRect.Children.Add(startselectedrect);
 
-                    multiSelectedRect.SetMulitSelectedRect(startselectedrect);
+                    multiSelectedRect.SetMulitSelectedRect(startselectedrect, startSelectedEditAreaObject.PageIndex, startSelectedEditAreaObject.EditAreaIndex);
                     multiSelectedRect.SetRect(startselectedrect.GetRect());
                     multiSelectedRect.SetMaxRect(startselectedrect.GetMaxRect());
                     multiSelectedRect.Draw();
@@ -176,7 +176,7 @@ namespace ComPDFKit.Tool
                 EditAreaObject editAreaObject = GetEditAreaObjectForRect(lastSelectedRect);
                 editAreaList.Add(selectedRect, editAreaObject);
                 multiSelectedRect.Children.Add(selectedRect);
-                multiSelectedRect.SetMulitSelectedRect(selectedRect);
+                multiSelectedRect.SetMulitSelectedRect(selectedRect, editAreaObject.PageIndex, editAreaObject.EditAreaIndex);
 
                 multiSelectedRect.SetRect(selectedRects);
                 multiSelectedRect.SetMaxRect(MaxRect);
@@ -310,7 +310,7 @@ namespace ComPDFKit.Tool
                     //selectedRect.SetRect(OldRect.GetRect(), currentZoom);
                     //selectedRect.SetMaxRect(OldRect.GetMaxRect());
                     //multiSelectedRect.Children.Add(selectedRect);
-                    multiSelectedRect.SetMulitSelectedRect(OldRect);
+                    multiSelectedRect.SetMulitSelectedRect(OldRect, multiPage,item);
                     multiSelectedRect.SetRect(OldRect.GetRect());
                     multiSelectedRect.SetMaxRect(OldRect.GetMaxRect());
                     OldRect.HideDraw();

+ 56 - 5
Demo/Examples/ComPDFKit.Tool/CPDFViewerTool.TextEdit.cs

@@ -710,6 +710,24 @@ namespace ComPDFKit.Tool
             return editAreaObject;
         }
 
+        public EditAreaObject GetEditAreaObjectListForIndex(int pageIndex,int editIndex)
+        {
+            if(editAreaList==null || editAreaList.Count==0)
+            {
+                return null;
+            }
+
+            foreach( EditAreaObject editArea in editAreaList.Values )
+            {
+                if(editArea.PageIndex==pageIndex && editArea.EditAreaIndex==editIndex)
+                {
+                    return editArea;
+                }
+            }
+
+            return null;
+        }
+
         public SelectedRect GetSelectedRectForEditAreaObject(CPDFEditArea editAreaObject)
         {
             if (editAreaObject == null)
@@ -2192,7 +2210,7 @@ namespace ComPDFKit.Tool
                             editAreaMultiIndex.Add(editAreaObject.EditAreaIndex);
                             editAreaList.Add(selectedRect, editAreaObject);
                             multiSelectedRect.Children.Add(selectedRect);
-                            multiSelectedRect.SetMulitSelectedRect(selectedRect);
+                            multiSelectedRect.SetMulitSelectedRect(selectedRect, editAreaObject.PageIndex,editAreaObject.EditAreaIndex);
 
                             multiSelectedRect.SetRect(selectedRects.GetRect());
                             multiSelectedRect.SetMaxRect(selectedRects.GetMaxRect());
@@ -2297,12 +2315,28 @@ namespace ComPDFKit.Tool
             CPDFPage cPDFPage = cPDFDocument.PageAtIndex(multiPage);
             CPDFEditPage cPDFEditPage = cPDFPage.GetEditPage();
             cPDFEditPage.BeginEdit(CPDFEditType.EditText | CPDFEditType.EditImage);
-            foreach (SelectedRect item in MultiSelectEditList.Children)
+            foreach (SelectedRect checkItem in MultiSelectEditList.GetMulitSelectList())
             {
+                SelectedRect item = checkItem;
+                EditAreaObject editAreaObject = GetEditAreaObjectListForRect(item);
+                if (editAreaObject == null)
+                {
+                    if (MultiSelectEditList.GetRelationKey(item, out int checkPage, out int checkEdit))
+                    {
+                        editAreaObject = GetEditAreaObjectListForIndex(checkPage,checkEdit);
+                    }
+                }
+                if(item == null)
+                {
+                    continue;
+                }
                 PDFEditHistory pDFEditHistory = new PDFEditHistory();
                 pDFEditHistory.PageIndex = multiPage;
                 pDFEditHistory.EditPage = cPDFEditPage;
-                EditAreaObject editAreaObject = GetEditAreaObjectListForRect(item);
+                if(editAreaObject==null)
+                {
+                    continue;
+                }
                 EditAreaObject newEditAreaObject = GetSelectedForIndex(multiPage, editAreaObject.EditAreaIndex);
                 Rect rect = item.GetRect();
                 rect.X = rect.X + item.GetRectPadding();
@@ -2457,12 +2491,28 @@ namespace ComPDFKit.Tool
             CPDFPage cPDFPage = cPDFDocument.PageAtIndex(multiPage);
             CPDFEditPage cPDFEditPage = cPDFPage.GetEditPage();
             cPDFEditPage.BeginEdit(CPDFEditType.EditText | CPDFEditType.EditImage);
-            foreach (SelectedRect item in MultiSelectEditList.Children)
+            foreach (SelectedRect checkItem in MultiSelectEditList.GetMulitSelectList())
             {
+                SelectedRect item = checkItem;
+                EditAreaObject editAreaObject = GetEditAreaObjectListForRect(item);
+                if (editAreaObject == null)
+                {
+                    if (MultiSelectEditList.GetRelationKey(item, out int checkPage, out int checkEdit))
+                    {
+                        editAreaObject = GetEditAreaObjectListForIndex(checkPage, checkEdit);
+                    }
+                }
+                if (item == null)
+                {
+                    continue;
+                }
+                if (editAreaObject == null)
+                {
+                    continue;
+                }
                 PDFEditHistory pDFEditHistory = new PDFEditHistory();
                 pDFEditHistory.PageIndex = multiPage;
                 pDFEditHistory.EditPage = cPDFEditPage;
-                EditAreaObject editAreaObject = GetEditAreaObjectListForRect(item);
                 EditAreaObject newEditAreaObject = GetSelectedForIndex(multiPage, editAreaObject.EditAreaIndex);
                 Rect rect = item.GetRect();
                 rect.Y = rect.Y + editPadding;
@@ -2471,6 +2521,7 @@ namespace ComPDFKit.Tool
                 rect2.Y = rect2.Y + editPadding;
                 Rect pageBound = newEditAreaObject.PageBound;
                 Rect PDFRect = DpiHelper.StandardRectToPDFRect(new Rect((rect2.Left - pageBound.Left) / currentZoom, (rect2.Top - pageBound.Top) / currentZoom, rect2.Width / currentZoom, rect2.Height / currentZoom));
+
                 editAreaObject.cPDFEditArea.SetFrame(DataConversionForWPF.RectConversionForCRect(PDFRect));
                 groupHistory.Histories.Add(pDFEditHistory);
             }

+ 25 - 1
Demo/Examples/ComPDFKit.Tool/DrawTool/MultiSelectedRect.cs

@@ -179,6 +179,7 @@ namespace ComPDFKit.Tool.DrawTool
         /// Array passed from outside for multiple selection
         /// </summary>
         protected List<SelectedRect> selectedRects = new List<SelectedRect>();
+        protected Dictionary<SelectedRect,KeyValuePair<int,int>> RelationDict=new Dictionary<SelectedRect, KeyValuePair<int, int>>();
 
         protected bool isHover = false;
 
@@ -211,11 +212,26 @@ namespace ComPDFKit.Tool.DrawTool
             selectedType = type;
         }
 
-        public void SetMulitSelectedRect(SelectedRect selectedobject)
+        public void SetMulitSelectedRect(SelectedRect selectedobject,int pageIndex,int editIndex)
         {
             selectedRects.Add(selectedobject);
+            RelationDict[selectedobject] = new KeyValuePair<int, int>(pageIndex, editIndex);
         }
 
+        public bool GetRelationKey(SelectedRect selectedobject,out int pageIndex,out int editIndex)
+        {
+            pageIndex = -1;
+            editIndex = -1;
+            if(RelationDict!=null && RelationDict.ContainsKey(selectedobject))
+            {
+                KeyValuePair<int, int> relateData = RelationDict[selectedobject];
+                pageIndex = relateData.Key;
+                editIndex = relateData.Value;
+                return true;
+            }
+
+            return false;
+        }
         /// <summary>
         /// delete
         /// </summary>
@@ -223,6 +239,7 @@ namespace ComPDFKit.Tool.DrawTool
         public void DelMulitSelectedRect(SelectedRect selectedobject)
         {
             selectedRects.Remove(selectedobject);
+            RelationDict.Remove(selectedobject);
         }
 
         /// <summary>
@@ -235,6 +252,11 @@ namespace ComPDFKit.Tool.DrawTool
           return selectedRects.IndexOf(selectedobject);
         }
 
+        public List<SelectedRect> GetMulitSelectList()
+        {
+            return selectedRects==null ? new List<SelectedRect>() : selectedRects;
+        }
+
         public SelectedType GetSelectedType()
         {
             return selectedType;
@@ -245,6 +267,7 @@ namespace ComPDFKit.Tool.DrawTool
             if (selectedType != type)
             {
                 selectedRects.Clear();
+                RelationDict.Clear();
             }
             selectedType = type;
         }
@@ -252,6 +275,7 @@ namespace ComPDFKit.Tool.DrawTool
         public void CleanMulitSelectedRect()
         {
             selectedRects.Clear();
+            RelationDict.Clear();
         }
 
         public virtual void OnMouseLeftButtonDown(Point downPoint)