mirror of
https://github.com/wmjordan/PDFPatcher.git
synced 2026-10-18 21:52:34 +08:00
107 lines
3.2 KiB
C#
107 lines
3.2 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using System.Text.RegularExpressions;
|
|
using System.Windows.Forms;
|
|
using PDFPatcher.Common;
|
|
using PDFPatcher.Model;
|
|
|
|
namespace PDFPatcher.Functions.Editor
|
|
{
|
|
sealed class InsertBookmarkCommand : IEditorCommand
|
|
{
|
|
static readonly Regex __RemoveOcrWhiteSpace = new Regex(@"\s{2,}", RegexOptions.Compiled);
|
|
static InsertBookmarkForm _dialog;
|
|
|
|
public void Process(Controller controller, params string[] parameters) {
|
|
var v = controller.View.Viewer;
|
|
BookmarkAtClientPoint(controller, v.TransposeVirtualImageToClient(v.PinPoint.X, v.PinPoint.Y));
|
|
}
|
|
|
|
static void BookmarkAtClientPoint(Controller controller, Point cp) {
|
|
var v = controller.View.Viewer;
|
|
var pp = v.TransposeClientToPagePosition(cp.X, cp.Y);
|
|
if (pp.Page == 0) {
|
|
return;
|
|
}
|
|
if (Control.ModifierKeys == Keys.Control) {
|
|
v.PinPoint = v.PointToImage(cp);
|
|
ShowInsertBookmarkDialog(controller, cp, new EditModel.Region(pp, null, EditModel.TextSource.Empty));
|
|
return;
|
|
}
|
|
ShowInsertBookmarkDialog(controller, cp, controller.CopyText(cp, pp));
|
|
}
|
|
|
|
static void ShowInsertBookmarkDialog(Controller controller, Point mousePoint, EditModel.Region region) {
|
|
var p = region.Position;
|
|
if (p.Page == 0) {
|
|
return;
|
|
}
|
|
var f = GetDialog(controller);
|
|
var v = controller.View.Viewer;
|
|
Point fp;
|
|
var sr = v.SelectionRegion;
|
|
if (sr != RectangleF.Empty) {
|
|
fp = v.TransposeVirtualImageToClient(sr.Left, sr.Top);
|
|
if (v.HorizontalFlow) {
|
|
fp.X += sr.Width.ToInt32() + 20;
|
|
}
|
|
else {
|
|
fp.Y -= f.Height + 20;
|
|
}
|
|
}
|
|
else {
|
|
fp = new Point(mousePoint.X + 20, mousePoint.Y - f.Height);
|
|
}
|
|
var l = v.PointToScreen(fp);
|
|
if (l.Y < 0) {
|
|
l.Y = l.Y + (int)sr.Height + f.Height + 40;
|
|
if (l.Y + f.Height > Screen.PrimaryScreen.WorkingArea.Height) {
|
|
l.Y = Screen.PrimaryScreen.WorkingArea.Height - f.Height;
|
|
}
|
|
}
|
|
if (l.X < v.PointToScreen(Point.Empty).X) {
|
|
l.X = v.PointToScreen(Point.Empty).X;
|
|
}
|
|
f.Location = l;
|
|
f.TargetPosition = p.PageY;
|
|
if (String.IsNullOrEmpty(region.Text) == false) {
|
|
f.Title = __RemoveOcrWhiteSpace.Replace(region.Text, " ").Trim();
|
|
}
|
|
f.Comment = region.LiteralTextSource;
|
|
f.Show();
|
|
f.TargetPageNumber = p.Page;
|
|
}
|
|
|
|
static InsertBookmarkForm GetDialog(Controller controller) {
|
|
if (_dialog != null && _dialog.IsDisposed == false) {
|
|
_dialog.Controller = controller;
|
|
return _dialog;
|
|
}
|
|
_dialog = new InsertBookmarkForm {
|
|
Controller = controller
|
|
};
|
|
_dialog.OkClicked += (object sender, EventArgs e) => {
|
|
var f = (InsertBookmarkForm)sender;
|
|
var c = f.Controller;
|
|
var t = f.Title;
|
|
if (string.IsNullOrEmpty(t) && f.InsertMode != 0) {
|
|
FormHelper.ErrorBox("书签标题不能为空。");
|
|
return;
|
|
}
|
|
c.Model.LockDownViewer = true;
|
|
c.InsertBookmark(t, f.TargetPageNumber, f.TargetPosition, (InsertBookmarkPositionType)f.InsertMode);
|
|
c.Model.LockDownViewer = false;
|
|
};
|
|
_dialog.Deactivate += (s, args) => {
|
|
(s as Form).Visible = false;
|
|
};
|
|
_dialog.VisibleChanged += (s, args) => {
|
|
var f = (InsertBookmarkForm)s;
|
|
f.Controller.View.Viewer.ShowPinPoint = f.Visible;
|
|
};
|
|
return _dialog;
|
|
}
|
|
|
|
}
|
|
}
|