using ComPDFKit.PDFAnnotation; using ComPDFKit.PDFDocument; using ComPDFKit.PDFDocument.Action; using ComPDFKit.PDFPage; using ComPDFKit.Tool.DrawTool; using ComPDFKit.Tool.FillTool; using ComPDFKit.Tool.Help; using ComPDFKit.Tool.SettingParam; using ComPDFKit.Viewer.Helper; using ComPDFKit.Viewer.Layer; using ComPDFKitViewer; using ComPDFKitViewer.Annot; using ComPDFKitViewer.BaseObject; using ComPDFKitViewer.Helper; using ComPDFKitViewer.Layer; using ComPDFKitViewer.Widget; using System; using System.Collections.Generic; using System.Diagnostics; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using UndoAction = ComPDFKitViewer.Helper.UndoAction; namespace ComPDFKit.Tool { public struct MouseEventObject { public MouseEventArgs mouseButtonEventArgs; public MouseHitTestType hitTestType; public C_ANNOTATION_TYPE annotType; /// /// Identifies whether the object is created /// public bool IsCreate; public bool IsDrawing; public bool IsMersured; public object Data; } public enum MouseHitTestType { Unknown, Text, Annot, SelectRect, Widget, TextEdit, ImageEdit, PathEdit, ImageSelect, MultiTextEdit, SelectedPageRect, MultiSelector } public enum ToolType { None = -1, Viewer, Pan, CreateAnnot, WidgetEdit, ContentEdit, Customize, SelectedPage, /// /// Scroller Tool /// ViewerScroller } public partial class CPDFViewerTool : UserControl { public bool IsDocumentModified { get => isDocumentModified; set { isDocumentModified = value; DocumentModifiedChanged?.Invoke(this, EventArgs.Empty); } } public CPDFViewerTool() { InitializeComponent(); BindCommand(); Application.Current.Exit += Current_Exit; InsertSelectImageView(); InsertAnnotView(); InsertAnnotEditView(); InsertWidgetView(); InsertSelectedRectView(); InsertMultiSelectedRectView(); InsertCustomizeToolView(); InsertSelectTextView(); //Frame Select InsertFrameSelectToolView(); InsertTextEditView(); InsertPageSelectedRectView(); AnnotSelectInsert(); FillManager = new FillManager(this); } internal void InvokeMouseLeftDown(MouseEventObject e) { MouseLeftButtonDownHandler?.Invoke(this, e); } private void Current_Exit(object sender, ExitEventArgs e) { GetCPDFViewer().Dispose(); } protected override Visual GetVisualChild(int index) { return base.GetVisualChild(index); } protected override int VisualChildrenCount => base.VisualChildrenCount; public event EventHandler MouseLeftButtonDownHandler; public event EventHandler MouseLeftButtonUpHandler; public event EventHandler MouseMoveHandler; public event EventHandler MouseRightButtonDownHandler; public event EventHandler ScrollChangedHandler; public event EventHandler DrawChanged; public event EventHandler DocumentModifiedChanged; private ToolType currentModel = ToolType.Viewer; DefaultSettingParam defaultSettingParam = new DefaultSettingParam(); DefaultDrawParam defaultDrawParam = new DefaultDrawParam(); MeasureSetting measureSetting = new MeasureSetting(); Point Point = new Point(); Point CachePoint = new Point(); private bool isMultiSelected; private bool isDocumentModified = false; public FillManager FillManager { get; private set; } public bool CanAddTextEdit = true; protected bool isContinueCreateTextEdit = false; public bool GetIsMultiSelected() { return isMultiSelected; } /// /// Set whether continuous text editing is required /// /// public void SetContinueCreateTextEdit(bool isContinueCreateTextEdit) { this.isContinueCreateTextEdit = isContinueCreateTextEdit; CanAddTextEdit = true; } /// /// Does it support multiple selection /// /// true Can MultiSelected public void SetIsMultiSelected(bool isMulti) { isMultiSelected = isMulti; } public DefaultSettingParam GetDefaultSettingParam() { return defaultSettingParam; } public DefaultDrawParam GetDefaultDrawParam() { return defaultDrawParam; } /// /// Set default painting parameters /// /// public void SetDefaultDrawParam(DefaultDrawParam defaultDrawParam = null) { if (defaultDrawParam == null) { this.defaultDrawParam = new DefaultDrawParam(); } else { this.defaultDrawParam = defaultDrawParam; } } public MeasureSetting GetMeasureSetting() { return measureSetting; } public bool IsSelectRectMousePoint() { if (DrawSelectRectDownEvent() && cacheHitTestAnnot != null) { return true; } return false; } private void LinkAnnotAction(BaseAnnot annot) { AnnotData data = annot.GetAnnotData(); CPDFLinkAnnotation linkAnnot = data.Annot as CPDFLinkAnnotation; CPDFAction action = linkAnnot.GetLinkAction(); if (action != null) { ActionProcess(action); } else { CPDFDestination dest = linkAnnot.GetDestination(PDFViewer.GetDocument()); if (dest != null) { CPDFGoToAction gotoAction = new CPDFGoToAction(); gotoAction.SetDestination(PDFViewer.GetDocument(), dest); ActionProcess(gotoAction); } } } public void ActionProcess(CPDFAction action) { if (action == null) { return; } switch (action.ActionType) { case C_ACTION_TYPE.ACTION_TYPE_NAMED: { CPDFNamedAction namedAction = action as CPDFNamedAction; string namedStr = namedAction.GetName(); switch (namedStr) { case "FirstPage": { PDFViewer?.GoToPage(0, new Point(0, 0)); break; } case "LastPage": { PDFViewer?.GoToPage(PDFViewer.GetDocument().PageCount - 1, new Point(0, 0)); break; } case "NextPage": if (PDFViewer != null) { int nextIndex = PDFViewer.CurrentRenderFrame.PageIndex + 1; if (nextIndex < PDFViewer.GetDocument().PageCount) { PDFViewer.GoToPage(nextIndex, new Point(0, 0)); } } break; case "PrevPage": if (PDFViewer != null) { int prevIndex = PDFViewer.CurrentRenderFrame.PageIndex - 1; if (prevIndex >= 0) { PDFViewer.GoToPage(prevIndex, new Point(0, 0)); } } break; default: break; } break; } case C_ACTION_TYPE.ACTION_TYPE_GOTO: if (PDFViewer != null) { CPDFGoToAction gotoAction = action as CPDFGoToAction; CPDFDestination dest = gotoAction.GetDestination(PDFViewer.GetDocument()); if (dest != null) { Size pageSize = DataConversionForWPF.CSizeConversionForSize(PDFViewer.GetDocument().GetPageSize(dest.PageIndex)); PDFViewer.GoToPage(dest.PageIndex, new Point(dest.Position_X, pageSize.Height - dest.Position_Y)); } } break; case C_ACTION_TYPE.ACTION_TYPE_GOTOR: if (PDFViewer != null) { CPDFGoToRAction gotorAction = action as CPDFGoToRAction; CPDFDestination dest = gotorAction.GetDestination(PDFViewer.GetDocument()); if (dest != null) { Size pageSize = DataConversionForWPF.CSizeConversionForSize(PDFViewer.GetDocument().GetPageSize(dest.PageIndex)); PDFViewer.GoToPage(dest.PageIndex, new Point(dest.Position_X, pageSize.Height - dest.Position_Y)); } } break; case C_ACTION_TYPE.ACTION_TYPE_URI: { CPDFUriAction uriAction = action as CPDFUriAction; string uri = uriAction.GetUri(); try { if (!string.IsNullOrEmpty(uri)) { Process.Start(uri); } } catch (Exception ex) { } } break; default: break; } } protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { if (isContinueCreateTextEdit) { if (lastSelectedRect != null) { CanAddTextEdit = false; } else { CanAddTextEdit = true; } } if (PDFViewer == null || PDFViewer.CurrentRenderFrame == null || PDFViewer.IsRendering) { return; } if (!HitTestBorder()) { RemovePopTextUI(); } Focus(); if (FillManager?.MouseDownHandle(e) == true) { return; } Mouse.Capture(this, CaptureMode.SubTree); MouseEventObject mouseEventObject = new MouseEventObject { mouseButtonEventArgs = e, hitTestType = MouseHitTestType.Unknown, annotType = C_ANNOTATION_TYPE.C_ANNOTATION_NONE, IsCreate = false }; if (currentModel == ToolType.ViewerScroller) { // Scroller Tool Only Scrolle MouseLeftButtonDownHandler?.Invoke(this, mouseEventObject); return; } if (isDrawSelectRect) { if (e.ClickCount == 2) { // Refresh the currently selected annotation object to ensure it is the latest AnnotHitTest(); if (cacheHitTestAnnot is FreeTextAnnot) { BuildPopTextUI(cacheHitTestAnnot); isDrawSelectRect = false; mouseEventObject.annotType = cacheHitTestAnnot.GetAnnotData().AnnotType; mouseEventObject.IsMersured = cacheHitTestAnnot.GetAnnotData().Annot.IsMeasured(); MouseLeftButtonDownHandler?.Invoke(this, mouseEventObject); return; } if (cacheHitTestAnnot is StickyNoteAnnot) { (cacheHitTestAnnot as StickyNoteAnnot).PopStickyNote(); } } // Click inside the selected rectangle area if (DrawSelectRectDownEvent() && cacheHitTestAnnot != null) { mouseEventObject.hitTestType = MouseHitTestType.SelectRect; mouseEventObject.annotType = cacheHitTestAnnot.GetAnnotData().AnnotType; mouseEventObject.IsMersured = cacheHitTestAnnot.GetAnnotData().Annot.IsMeasured(); MouseLeftButtonDownHandler?.Invoke(this, mouseEventObject); return; } else { CleanSelectedRect(); } } if (IsDrawEditAnnot) { // Click inside the selected rectangle area if (DrawEditAnnotDownEvent() && cacheHitTestAnnot != null) { mouseEventObject.hitTestType = MouseHitTestType.SelectRect; mouseEventObject.annotType = cacheHitTestAnnot.GetAnnotData().AnnotType; mouseEventObject.IsMersured = cacheHitTestAnnot.GetAnnotData().Annot.IsMeasured(); MouseLeftButtonDownHandler?.Invoke(this, mouseEventObject); return; } } Point = e.GetPosition(this); // Annotation selection effect if ((currentModel == ToolType.Pan || currentModel == ToolType.CreateAnnot) && AnnotHitTest() && IsCanSave() && !PDFViewer.GetIsShowStampMouse() ) { //if (!IsCacheRedaction) { if (cacheHitTestAnnot?.CurrentType == C_ANNOTATION_TYPE.C_ANNOTATION_LINK && currentModel != ToolType.CreateAnnot) { LinkAnnotAction(cacheHitTestAnnot); } else { List list = new List() { C_ANNOTATION_TYPE.C_ANNOTATION_LINE, C_ANNOTATION_TYPE.C_ANNOTATION_POLYLINE, C_ANNOTATION_TYPE.C_ANNOTATION_POLYGON, }; if (cacheHitTestAnnot != null && list.Contains(cacheHitTestAnnot.CurrentType)) { mouseEventObject.IsMersured = cacheHitTestAnnot.GetAnnotData().Annot.IsMeasured(); SetEditAnnotObject(); } else { SelectedAnnot(); CleanDrawSelectImage(); } isDrawSelectRect = true; } } mouseEventObject.hitTestType = MouseHitTestType.Annot; if (cacheHitTestAnnot != null) { mouseEventObject.annotType = cacheHitTestAnnot.GetAnnotData().AnnotType; } else { mouseEventObject.annotType = C_ANNOTATION_TYPE.C_ANNOTATION_NONE; } } // Form selected effect else if ((currentModel == ToolType.Pan || currentModel == ToolType.Viewer) && AnnotWidgetHitTest()) { mouseEventObject.hitTestType = MouseHitTestType.Widget; mouseEventObject.annotType = cacheMoveWidget.GetAnnotData().AnnotType; FormClickProcess(); } else if ((currentModel == ToolType.Pan || currentModel == ToolType.Viewer)) { if (AnnotHitTest() && cacheHitTestAnnot.CurrentType == C_ANNOTATION_TYPE.C_ANNOTATION_LINK) { LinkAnnotAction(cacheHitTestAnnot); } if (!IsText() && DrawDownSelectImage(true)) { mouseEventObject.hitTestType = MouseHitTestType.ImageSelect; } else { ReDrawSelectImage(); } } // Form creation mode else if (currentModel == ToolType.WidgetEdit) { if (!AnnotSelectAreaHitTest()) { if (AnnotWidgetHitTest()) { BaseWidget hitWidget = PDFViewer?.AnnotHitTest() as BaseWidget; cacheHitTestAnnot = null; if (AnnotSelectGetCount() == 0 && hitWidget != null) { AnnotSelectAddItem(hitWidget.GetAnnotData()); cacheHitTestAnnot = hitWidget; SelectedAnnot(); } mouseEventObject.hitTestType = MouseHitTestType.Annot; mouseEventObject.annotType = cacheMoveWidget.GetAnnotData().AnnotType; } else { AnnotSelectAreaHit(); } } AnnotSelectMoveHit(); } // Content editing mode else if (currentModel == ToolType.ContentEdit) { OpenSelectedMulti(isMultiSelected); if (!PDFViewer.GetIsShowStampMouse()) { DrawTextEditDownEvent(true); } if (lastSelectedRect != null) { //Multi selection processing optimization, other click effects DrawEndFrameSelect(); if (!Keyboard.IsKeyDown(multiKey) || !isMultiSelected) { CleanSelectedMultiRect(); OpenSelectedMulti(false); if (PDFViewer.CurrentRenderFrame != null) { currentZoom = PDFViewer.CurrentRenderFrame.ZoomFactor; if (PDFViewer.CurrentRenderFrame.IsCacheEditPage == true && currentModel == ToolType.ContentEdit) { SetEditTextRect(PDFViewer.CurrentRenderFrame); if (selectedEditPageIndex != -1 && selectedEditAreaIndex != -1) { DrawSelectedEditAreaForIndex(); } } } ReDrawSelectedMultiRect(); } if (lastSelectedRect == null) { return; } SelectedMultiRect(lastSelectedRect.GetRect(), lastSelectedRect.GetMaxRect(), SelectedType.PDFEdit); HideDrawSelectedMultiRect(); lastSelectedRect.DataChanged -= SelectedRect_DataChanged; lastSelectedRect.DataChanged += SelectedRect_DataChanged; } else { if (Keyboard.IsKeyDown(multiKey) && isMultiSelected) { DelMultiSelectRect(); } if (HitTestMultiSelectedRect()) { mouseEventObject.hitTestType = MouseHitTestType.MultiTextEdit; } else { //Clear the currently selected object startSelectedRect = null; startSelectedIndex = -1; startSelectedPageIndex = -1; startSelectedEditAreaObject = null; CleanSelectedMultiRect(); OpenSelectedMulti(false); if (PDFViewer.CurrentRenderFrame != null) { currentZoom = PDFViewer.CurrentRenderFrame.ZoomFactor; if (PDFViewer.CurrentRenderFrame.IsCacheEditPage == true && currentModel == ToolType.ContentEdit) { SetEditTextRect(PDFViewer.CurrentRenderFrame); if (selectedEditPageIndex != -1 && selectedEditAreaIndex != -1) { DrawSelectedEditAreaForIndex(); } } } ReDrawSelectedMultiRect(); } } } else if (currentModel == ToolType.SelectedPage) { if (HitTestPageSelectedRect()) { } else { CleanPageSelectedRect(); CreatePageSelectdRect(); } mouseEventObject.hitTestType = MouseHitTestType.SelectedPageRect; } MouseLeftButtonDownHandler?.Invoke(this, mouseEventObject); } protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) { if (PDFViewer == null || PDFViewer.CurrentRenderFrame == null || PDFViewer.IsRendering) { return; } if (FillManager?.MouseUpHandle(e) == true) { return; } if (currentModel == ToolType.WidgetEdit) { bool areaSelectAdd = AnnotSelectAreaSelect(true); if (AnnotWidgetHitTest()) { BaseWidget checkItem = PDFViewer?.AnnotHitTest() as BaseWidget; AnnotSelectAddItem(checkItem?.GetAnnotData(), !AnnotSelectAreaHitTest()); } if (AnnotSelectGetCount() > 1) { CleanSelectedRect(); } if (IsMoved == false && AnnotSelectAreaHitTest() == false && AnnotWidgetHitTest() == false) { AnnotSelectClean(); } if (AnnotSelectGetCount() == 1) { cacheHitTestAnnot = AnnotSelectGetAnnot(); if (cacheHitTestAnnot != null) { BaseLayer baseLayer = PDFViewer.GetViewForTag(selectedRectViewTag); SelectedRect selectedRect = CommonHelper.FindVisualChild(baseLayer as CustomizeLayer); if (selectedRect != null) { if (IsMoved && areaSelectAdd == false) { selectedRect.SetAnnotData(cacheHitTestAnnot.GetAnnotData(),PDFViewer); } else { selectedRect.SetAnnotData(cacheHitTestAnnot.GetAnnotData(), PDFViewer); } selectedRect.Draw(); } isDrawSelectRect = true; } } } MouseEventObject mouseEventObject = new MouseEventObject { mouseButtonEventArgs = e, hitTestType = MouseHitTestType.Unknown, annotType = C_ANNOTATION_TYPE.C_ANNOTATION_NONE, IsCreate = false }; if (isDrawSelectRect || IsDrawEditAnnot) { mouseEventObject.hitTestType = MouseHitTestType.SelectRect; if (cacheHitTestAnnot != null) { mouseEventObject.annotType = cacheHitTestAnnot.GetAnnotData().AnnotType; } else { mouseEventObject.annotType = C_ANNOTATION_TYPE.C_ANNOTATION_NONE; } } MouseLeftButtonUpHandler?.Invoke(this, mouseEventObject); ReleaseMouseCapture(); if (currentModel == ToolType.WidgetEdit) { AnnotSelectUpdate(); AnnotSelectDraw(); AnnotSelectSave(); AreaMoveData = new AnnotSelectAreaData(); } IsMoved = false; } protected override async void OnMouseMove(MouseEventArgs e) { IsMoved = e.LeftButton == MouseButtonState.Pressed; if (PDFViewer == null || PDFViewer.CurrentRenderFrame == null || PDFViewer.IsRendering) { return; } if(FillManager?.MouseMoveHandle(e)==true) { return; } Cursor oldCursor = this.Cursor; Cursor newCursor = this.Cursor; MouseEventObject mouseEventObject = new MouseEventObject { mouseButtonEventArgs = e, hitTestType = MouseHitTestType.Unknown, annotType = C_ANNOTATION_TYPE.C_ANNOTATION_NONE, IsCreate = false }; if (currentModel == ToolType.ViewerScroller) { // Scroller Tool Only Scrolle MouseLeftButtonDownHandler?.Invoke(this, mouseEventObject); return; } if (Mouse.LeftButton != MouseButtonState.Pressed) { List allowModeList = new List() { ToolType.Pan, ToolType.Viewer }; if (allowModeList.Contains(currentModel)) { newCursor = Cursors.Arrow; if (caheMoveAnnot is BaseWidget) { BaseWidget widget = (BaseWidget)caheMoveAnnot; if (widget.GetFormType() == PDFAnnotation.Form.C_WIDGET_TYPE.WIDGET_PUSHBUTTON && PDFViewer != null) { newCursor = Cursors.Hand; } } if (caheMoveAnnot is LinkAnnot) { newCursor = Cursors.Hand; } } } if (!isDrawSelectRect && !IsDrawEditAnnot) { if (AnnotMoveHitTest()) { if (isCacheRedaction) { (caheMoveAnnot as RedactionAnnot).SetIsMouseHover(true); (caheMoveAnnot as RedactionAnnot).Draw(); } mouseEventObject.annotType = caheMoveAnnot.GetAnnotData().AnnotType; mouseEventObject.IsMersured = caheMoveAnnot.GetAnnotData().Annot.IsMeasured(); } else { if (isCacheRedaction) { isCacheRedaction = false; (caheMoveAnnot as RedactionAnnot).SetIsMouseHover(false); (caheMoveAnnot as RedactionAnnot).Draw(); } caheMoveAnnot = null; if ((currentModel == ToolType.Pan || currentModel == ToolType.Viewer)) { if (GetTextSelectInfo() == null) { DrawMoveSelectImage(); } } } } else { if (AnnotMoveHitTest()) { if (DrawSelectRectDownEvent() == false && Mouse.LeftButton != MouseButtonState.Pressed) { mouseEventObject.annotType = caheMoveAnnot.GetAnnotData().AnnotType; } if (isCacheRedaction) { (caheMoveAnnot as RedactionAnnot)?.SetIsMouseHover(true); (caheMoveAnnot as RedactionAnnot)?.Draw(); } } else { if (isCacheRedaction) { (caheMoveAnnot as RedactionAnnot)?.SetIsMouseHover(false); (caheMoveAnnot as RedactionAnnot)?.Draw(); } } if (mouseEventObject.annotType == C_ANNOTATION_TYPE.C_ANNOTATION_NONE) { mouseEventObject.hitTestType = MouseHitTestType.SelectRect; if (cacheHitTestAnnot != null) { mouseEventObject.annotType = cacheHitTestAnnot.GetAnnotData().AnnotType; mouseEventObject.IsMersured = cacheHitTestAnnot.GetAnnotData().Annot.IsMeasured(); } else { mouseEventObject.annotType = C_ANNOTATION_TYPE.C_ANNOTATION_NONE; } } } if (currentModel == ToolType.WidgetEdit) { AnnotSelectAreaDraw(); if (!AnnotSelectMoveDraw()) { AnnotSelectAreaHover(); } } MouseMoveHandler?.Invoke(this, mouseEventObject); PDFViewer.SetCustomMousePoint(Mouse.GetPosition(this).Y, Mouse.GetPosition(this).X); if (oldCursor != newCursor) { this.Cursor = newCursor; } } protected override void OnMouseRightButtonDown(MouseButtonEventArgs e) { if(PDFViewer.IsRendering) { return; } MouseEventObject mouseEventObject = new MouseEventObject { mouseButtonEventArgs = e, hitTestType = MouseHitTestType.Unknown, annotType = C_ANNOTATION_TYPE.C_ANNOTATION_NONE, IsCreate = false }; if (currentModel == ToolType.Pan || currentModel == ToolType.Viewer) { if (GetMousePointToTextSelectInfo()) { mouseEventObject.hitTestType = MouseHitTestType.Text; } } if (isDrawSelectRect) { // Click inside the selected rectangle area if (DrawSelectRectDownEvent() && cacheHitTestAnnot != null) { mouseEventObject.hitTestType = MouseHitTestType.SelectRect; mouseEventObject.annotType = cacheHitTestAnnot.GetAnnotData().AnnotType; MouseRightButtonDownHandler?.Invoke(this, mouseEventObject); return; } } if (IsDrawEditAnnot) { // Click inside the selected rectangle area if (DrawEditAnnotDownEvent() && cacheHitTestAnnot != null) { mouseEventObject.hitTestType = MouseHitTestType.SelectRect; mouseEventObject.annotType = cacheHitTestAnnot.GetAnnotData().AnnotType; MouseRightButtonDownHandler?.Invoke(this, mouseEventObject); return; } } Point = e.GetPosition(this); // Annotation selection effect if ((currentModel == ToolType.Pan || currentModel == ToolType.CreateAnnot)) { if (AnnotHitTest()) { if (!isCacheRedaction) { if (cacheHitTestAnnot?.CurrentType == C_ANNOTATION_TYPE.C_ANNOTATION_LINK && currentModel != ToolType.CreateAnnot) { LinkAnnotAction(cacheHitTestAnnot); } else { List list = new List() { C_ANNOTATION_TYPE.C_ANNOTATION_LINE, C_ANNOTATION_TYPE.C_ANNOTATION_POLYLINE, C_ANNOTATION_TYPE.C_ANNOTATION_POLYGON, }; if (cacheHitTestAnnot != null && list.Contains(cacheHitTestAnnot.CurrentType)) { SetEditAnnotObject(); DrawEditAnnotLayer(); } else { SelectedAnnot(); DrawSelectedLayer(); } isDrawSelectRect = true; } } mouseEventObject.hitTestType = MouseHitTestType.Annot; if (cacheHitTestAnnot != null) { mouseEventObject.annotType = cacheHitTestAnnot.GetAnnotData().AnnotType; } else { mouseEventObject.annotType = C_ANNOTATION_TYPE.C_ANNOTATION_NONE; } } else { CleanSelectedRect(); } } // Form selection effect if ((currentModel == ToolType.Pan || currentModel == ToolType.Viewer) && AnnotWidgetHitTest()) { mouseEventObject.hitTestType = MouseHitTestType.Widget; mouseEventObject.annotType = cacheMoveWidget.GetAnnotData().AnnotType; FormClickProcess(); } // Form creation mode if (currentModel == ToolType.WidgetEdit) { if (!AnnotSelectAreaHitTest()) { if (AnnotWidgetHitTest()) { cacheHitTestAnnot = PDFViewer?.AnnotHitTest() as BaseWidget; SelectedAnnot(); DrawSelectedLayer(); mouseEventObject.hitTestType = MouseHitTestType.Annot; mouseEventObject.annotType = cacheMoveWidget.GetAnnotData().AnnotType; AnnotSelectClean(); AnnotSelectAddItem(cacheHitTestAnnot?.GetAnnotData()); } else { CleanSelectedRect(); } } else { mouseEventObject.hitTestType = MouseHitTestType.MultiSelector; } } // Content editing mode if (currentModel == ToolType.ContentEdit) { if (e.ClickCount == 1) { DrawTextEditDownEvent(false); if (GetLastSelectedRect() != null) { EditAreaObject editAreaObject = GetEditAreaObjectForRect(lastSelectedRect); switch (editAreaObject.cPDFEditArea.Type) { case CPDFEditType.EditText: mouseEventObject.hitTestType = MouseHitTestType.TextEdit; break; case CPDFEditType.EditImage: mouseEventObject.hitTestType = MouseHitTestType.ImageEdit; break; case CPDFEditType.EditPath: mouseEventObject.hitTestType = MouseHitTestType.PathEdit; break; default: break; } } } } else { if ((currentModel == ToolType.Viewer || currentModel == ToolType.Pan) && mouseEventObject.hitTestType == MouseHitTestType.Unknown && DrawDownSelectImage(false)) { mouseEventObject.hitTestType = MouseHitTestType.ImageSelect; } } if (currentModel == ToolType.SelectedPage) { if (HitTestPageSelectedRect()) { mouseEventObject.hitTestType = MouseHitTestType.SelectedPageRect; } } MouseRightButtonDownHandler?.Invoke(this, mouseEventObject); } public bool GetIsCropMode() { if (lastSelectedRect != null) { return lastSelectedRect.GetCurrentDrawPointType() == DrawPointType.Crop; } return false; } public void SetCropMode(bool crop) { if (lastSelectedRect != null) { List ignoreList = new List(); if (crop) { lastSelectedRect.SetCurrentDrawPointType(DrawPointType.Crop); ignoreList.Add(PointControlType.Body); // Initialize ClipRect ClipThickness = new Thickness(0, 0, 0, 0); if (editArea.TryGetValue(lastSelectedRect, out EditAreaObject editAreaObject)) { cropIndex = editAreaObject.EditAreaIndex; } lastSelectedRect.DataChanged -= LastSelectedRect_DataChanged; } else { lastSelectedRect.SetCurrentDrawPointType(DrawPointType.Square); cropIndex = -1; lastSelectedRect.DataChanged += LastSelectedRect_DataChanged; } lastSelectedRect.SetIgnorePoints(ignoreList); lastSelectedRect.Draw(); } } internal void SetToolType(ToolType model) { currentModel = model; CPDFViewer pdfViewer = GetCPDFViewer(); if (pdfViewer != null) { if (currentModel == ToolType.WidgetEdit) { pdfViewer.IsHideFormShow = true; } else { pdfViewer.IsHideFormShow = false; } } } public ToolType GetToolType() { return currentModel; } public void SavePoint() { CachePoint = Point; } public void CleanPoint() { CachePoint = new Point(); } private void CPDFViewerTool_Loaded(object sender, RoutedEventArgs e) { PDFViewer.DrawChanged += PDFViewer_DrawChanged; PDFViewer.UndoManager.HistoryChanged += UndoManager_HistoryChanged; PDFViewer.MouseEnter += PDFViewer_MouseEnter; PDFViewer.MouseLeave += PDFViewer_MouseLeave; } private void PDFViewer_MouseLeave(object sender, MouseEventArgs e) { PDFViewer.IsVisibilityMouse(false); } private void PDFViewer_MouseEnter(object sender, MouseEventArgs e) { PDFViewer.IsVisibilityMouse(true); } private void UndoManager_HistoryChanged(object sender, KeyValuePair data) { IsDocumentModified = true; } private void CPDFViewerTool_Unloaded(object sender, RoutedEventArgs e) { PDFViewer.DrawChanged -= PDFViewer_DrawChanged; } private void PDFViewer_DrawChanged(object sender, EventArgs e) { SizeChangeds(); AnnotSelectUpdate(); AnnotSelectDraw(); DrawChanged?.Invoke(this, e); } public void SizeChangeds() { if (IsLoaded) { if (cacheHitTestAnnot != null) { BaseLayer baseLayer1 = PDFViewer.GetViewForTag(PDFViewer.GetAnnotViewTag()); bool Update = (baseLayer1 as AnnotLayer).GetUpdate(ref cacheHitTestAnnot); if (Update) { if (IsDrawEditAnnot) { SetEditAnnotObject(); DrawEditAnnotLayer(); } if (isDrawSelectRect) { List list = new List() { C_ANNOTATION_TYPE.C_ANNOTATION_LINE, C_ANNOTATION_TYPE.C_ANNOTATION_POLYLINE, C_ANNOTATION_TYPE.C_ANNOTATION_POLYGON, }; if (cacheHitTestAnnot != null && list.Contains(cacheHitTestAnnot.CurrentType)) { SetEditAnnotObject(); DrawEditAnnotLayer(); } else { SelectedAnnot(); } DrawSelectedLayer(); } } else { SelectedAnnot(null); CleanEditAnnot(true); } } else if (selectedPageIndex != -1 && selectedAnnotIndex != -1) { BaseLayer baseLayer1 = PDFViewer.GetViewForTag(PDFViewer.GetAnnotViewTag()); cacheHitTestAnnot = (baseLayer1 as AnnotLayer).GetSelectedAnnot(ref selectedPageIndex, ref selectedAnnotIndex); if (cacheHitTestAnnot != null) { List list = new List() { C_ANNOTATION_TYPE.C_ANNOTATION_LINE, C_ANNOTATION_TYPE.C_ANNOTATION_POLYLINE, C_ANNOTATION_TYPE.C_ANNOTATION_POLYGON, }; if (cacheHitTestAnnot != null && list.Contains(cacheHitTestAnnot.CurrentType)) { SetEditAnnotObject(); DrawEditAnnotLayer(); } else { SelectedAnnot(); } DrawSelectedLayer(); isDrawSelectRect = true; } } if (PDFViewer.CurrentRenderFrame != null) { currentZoom = PDFViewer.CurrentRenderFrame.ZoomFactor; if (PDFViewer.CurrentRenderFrame.IsCacheEditPage == true && currentModel == ToolType.ContentEdit) { SetEditTextRect(PDFViewer.CurrentRenderFrame); if (selectedEditPageIndex != -1 && selectedEditAreaIndex != -1) { DrawSelectedEditAreaForIndex(); } } } ReDrawSelectedMultiRect(); ReDrawWidget(); ReDrawSelectText(); ReDrawSelectImage(); UpdateFormHitPop(); UpdateTextPop(); } } private void ScrollViewer_MouseUp(object sender, MouseButtonEventArgs e) { } private void ScrollViewer_MouseDown(object sender, MouseButtonEventArgs e) { } private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e) { ScrollChangedHandler?.Invoke(this, e); } } }