mirror of
https://github.com/wmjordan/PDFPatcher.git
synced 2026-10-17 04:41:14 +08:00
219 lines
7.7 KiB
C#
219 lines
7.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Windows.Forms;
|
|
using BrightIdeasSoftware;
|
|
using CLR;
|
|
using PDFPatcher.Common;
|
|
using PDFPatcher.Functions.Editor;
|
|
using PDFPatcher.Model;
|
|
|
|
namespace PDFPatcher.Functions
|
|
{
|
|
sealed partial class AutoBookmarkForm : DraggableForm
|
|
{
|
|
List<EditModel.AutoBookmarkSettings> _list;
|
|
readonly Controller _controller;
|
|
|
|
internal AutoBookmarkForm() {
|
|
InitializeComponent();
|
|
}
|
|
|
|
internal AutoBookmarkForm(Controller controller) : this() {
|
|
_controller = controller;
|
|
this.OnFirstLoad(OnLoad);
|
|
}
|
|
|
|
void OnLoad() {
|
|
MinimumSize = Size;
|
|
_Toolbar.ScaleElements();
|
|
|
|
_ConditionColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => c.AspectGetter = o => $"字体为{o.FontName} 尺寸为{o.FontSize}{o.MatchPattern?.ToString() ?? String.Empty}");
|
|
_LevelColumn.CellEditUseWholeCell = true;
|
|
_LevelColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => {
|
|
c.AspectGetter = o => o.Level;
|
|
c.AspectPutter = (o, v) => o.Level = Convert.ToInt32(v).Clamp(1, 10);
|
|
});
|
|
_BoldColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => {
|
|
c.AspectGetter = o => o.Bookmark.IsBold;
|
|
c.AspectPutter = (o, v) => o.Bookmark.IsBold = (bool)v;
|
|
});
|
|
_ItalicColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => {
|
|
c.AspectGetter = o => o.Bookmark.IsItalic;
|
|
c.AspectPutter = (o, v) => o.Bookmark.IsItalic = (bool)v;
|
|
});
|
|
_ColorColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => c.AspectGetter = o => "点击设置颜色");
|
|
_OpenColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => {
|
|
c.AspectGetter = o => o.Bookmark.IsOpened;
|
|
c.AspectPutter = (o, v) => o.Bookmark.IsOpened = (bool)v;
|
|
});
|
|
_GoToTopColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => {
|
|
c.AspectGetter = o => o.Bookmark.GoToTop;
|
|
c.AspectPutter = (o, v) => o.Bookmark.GoToTop = (bool)v;
|
|
});
|
|
_BookmarkConditionBox.ScaleColumnWidths();
|
|
_BookmarkConditionBox.IsSimpleDragSource = true;
|
|
_BookmarkConditionBox.IsSimpleDropSink = true;
|
|
_BookmarkConditionBox.CellClick += (s, args) => {
|
|
if (args.ColumnIndex == _ColorColumn.Index) {
|
|
var b = ((EditModel.AutoBookmarkSettings)args.Model).Bookmark;
|
|
this.ShowCommonDialog<ColorDialog>(
|
|
f => f.Color = b.ForeColor == Color.Transparent ? Color.White : b.ForeColor,
|
|
f => {
|
|
b.ForeColor = f.Color == Color.White || f.Color == Color.Black ? Color.Transparent : f.Color;
|
|
_BookmarkConditionBox.RefreshItem(args.Item);
|
|
}
|
|
);
|
|
}
|
|
};
|
|
_BookmarkConditionBox.RowFormatter = (r) => {
|
|
var b = ((EditModel.AutoBookmarkSettings)r.RowObject).Bookmark;
|
|
r.UseItemStyleForSubItems = false;
|
|
r.SubItems[_ColorColumn.Index].ForeColor = b.ForeColor == Color.Transparent ? _BookmarkConditionBox.ForeColor : b.ForeColor;
|
|
};
|
|
_BookmarkConditionBox.SelectionChanged += _BookmarkConditionBox_SelectionChanged;
|
|
_LoadListButton.Click += _LoadListButton_Click;
|
|
_SaveListButton.Click += _SaveListButton_Click;
|
|
|
|
QuickSelectCommand.RegisterMenuItemsWithPattern(_SetPatternMenu.DropDownItems);
|
|
_SetPatternMenu.DropDownItems.AddRange([
|
|
new ToolStripSeparator(),
|
|
new ToolStripMenuItem("自定义文本匹配模式...") {
|
|
Tag = "CustomPattern"
|
|
},
|
|
new ToolStripMenuItem("清除文本匹配模式") {
|
|
Tag = "ClearPattern",
|
|
Image = Properties.Resources.Delete
|
|
}
|
|
]);
|
|
_SetPatternMenu.DropDownItemClicked += _SetPattern_DropDownItemClicked;
|
|
}
|
|
|
|
void _BookmarkConditionBox_SelectionChanged(object sender, EventArgs e) {
|
|
_SetPatternMenu.Enabled = _RemoveButton.Enabled = _BookmarkConditionBox.SelectedItems.Count > 0;
|
|
}
|
|
|
|
void _SetPattern_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) {
|
|
if (e.ClickedItem.Tag is MatchPattern p) {
|
|
SetMatchPatternToSelectedBookmarkStyles(p);
|
|
return;
|
|
}
|
|
if (e.ClickedItem.Tag is string s) {
|
|
switch (s) {
|
|
case "ClearPattern":
|
|
SetMatchPatternToSelectedBookmarkStyles(null);
|
|
return;
|
|
case "CustomPattern":
|
|
p = (_BookmarkConditionBox.SelectedObject as EditModel.AutoBookmarkSettings)?.MatchPattern;
|
|
this.ShowDialog<CustomPatternForm>(f => {
|
|
if (p != null) {
|
|
f.Pattern = p.Text;
|
|
f.MatchCase = p.MatchCase;
|
|
f.FullMatch = p.FullMatch;
|
|
}
|
|
}, f => SetMatchPatternToSelectedBookmarkStyles(f.Pattern.Length != 0 ? new MatchPattern(f.Pattern, f.MatchCase, f.FullMatch, true) : null));
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
void SetMatchPatternToSelectedBookmarkStyles(MatchPattern p) {
|
|
foreach (EditModel.AutoBookmarkSettings item in _BookmarkConditionBox.SelectedObjects) {
|
|
item.MatchPattern = p;
|
|
}
|
|
_BookmarkConditionBox.RefreshObjects(_BookmarkConditionBox.SelectedObjects);
|
|
}
|
|
|
|
internal void SetValues(List<EditModel.AutoBookmarkSettings> list) {
|
|
_BookmarkConditionBox.Objects = _list = list;
|
|
}
|
|
|
|
void _RemoveButton_Click(object sender, EventArgs e) {
|
|
_BookmarkConditionBox.SelectedObjects.ForEach<EditModel.AutoBookmarkSettings>(i => _list.Remove(i));
|
|
_BookmarkConditionBox.RemoveObjects(_BookmarkConditionBox.SelectedObjects);
|
|
}
|
|
|
|
void _AutoBookmarkButton_Click(object sender, EventArgs e) {
|
|
SyncList();
|
|
_controller.AutoBookmark(_list, _MergeAdjacentTitleBox.Checked, _KeepExistingBookmarksBox.Checked);
|
|
}
|
|
|
|
void _SaveListButton_Click(object sender, EventArgs e) {
|
|
this.ShowCommonDialog<SaveFileDialog>(d => {
|
|
d.Title = "请输入需要保存自动书签格式列表的文件名";
|
|
d.Filter = Constants.FileExtensions.XmlFilter;
|
|
d.DefaultExt = Constants.FileExtensions.Xml;
|
|
}, d => {
|
|
try {
|
|
SyncList();
|
|
using (var w = new FilePath(d.FileName).OpenTextWriter(false, null)) {
|
|
Serialize(_list, w);
|
|
}
|
|
}
|
|
catch (Exception ex) {
|
|
this.ErrorBox("保存自动书签格式列表时出现错误", ex);
|
|
}
|
|
});
|
|
}
|
|
|
|
static void Serialize(List<EditModel.AutoBookmarkSettings> list, System.IO.StreamWriter writer) {
|
|
using (var x = System.Xml.XmlWriter.Create(writer)) {
|
|
x.WriteStartDocument();
|
|
x.WriteStartElement("autoBookmark");
|
|
foreach (var item in list) {
|
|
x.WriteStartElement("style");
|
|
x.WriteAttributeString("fontName", item.FontName);
|
|
x.WriteAttributeString("fontSize", item.FontSize.ToText());
|
|
x.WriteAttributeString("level", item.Level.ToText());
|
|
item.Bookmark.WriteXml(x);
|
|
item.MatchPattern?.WriteXml(x);
|
|
x.WriteEndElement();
|
|
}
|
|
x.WriteEndElement();
|
|
x.WriteEndDocument();
|
|
}
|
|
}
|
|
|
|
void _LoadListButton_Click(object sender, EventArgs e) {
|
|
this.ShowCommonDialog<OpenFileDialog>(d => {
|
|
d.Title = "请选择需要打开的自动书签格式列表";
|
|
d.Filter = Constants.FileExtensions.XmlFilter;
|
|
d.DefaultExt = Constants.FileExtensions.Xml;
|
|
}, d => {
|
|
try {
|
|
_list.Clear();
|
|
_list.AddRange(Deserialize(d.FileName));
|
|
_BookmarkConditionBox.Objects = _list;
|
|
}
|
|
catch (Exception ex) {
|
|
this.ErrorBox("加载自动书签格式列表时出现错误", ex);
|
|
}
|
|
});
|
|
}
|
|
|
|
static IEnumerable<EditModel.AutoBookmarkSettings> Deserialize(FilePath path) {
|
|
var doc = new System.Xml.XmlDocument();
|
|
doc.Load(path);
|
|
foreach (System.Xml.XmlElement item in doc.DocumentElement.GetElementsByTagName("style")) {
|
|
var s = new EditModel.AutoBookmarkSettings(
|
|
item.GetValue("level", 1),
|
|
item.GetValue("fontName"),
|
|
item.GetValue("fontSize", 0));
|
|
s.Bookmark.ReadXml(item.GetElement("bookmark").CreateNavigator().ReadSubtree());
|
|
var p = item.GetElement("pattern");
|
|
if (p != null) {
|
|
s.MatchPattern = new Model.MatchPattern();
|
|
s.MatchPattern.ReadXml(p.CreateNavigator().ReadSubtree());
|
|
}
|
|
|
|
yield return s;
|
|
}
|
|
}
|
|
|
|
void SyncList() {
|
|
_list.Clear();
|
|
_list.AddRange(new TypedObjectListView<EditModel.AutoBookmarkSettings>(_BookmarkConditionBox).Objects);
|
|
}
|
|
}
|
|
}
|