mirror of
https://github.com/wmjordan/PDFPatcher.git
synced 2026-10-18 13:42:28 +08:00
149 lines
5.2 KiB
C#
149 lines
5.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Windows.Forms;
|
|
using PDFPatcher.Common;
|
|
using PDFPatcher.Model;
|
|
|
|
namespace PDFPatcher.Functions
|
|
{
|
|
sealed partial class EditAdjustmentForm : Form
|
|
{
|
|
internal static string[] FilterNames = new string[] { "字体名称", "文本尺寸", "文本位置", "页码范围", "文本内容" };
|
|
internal static string[] FilterIDs = new string[] { "_FontNameFilter", "_FontSizeFilter", "_FontPositionFilter", "_PageRangeFilter", "_TextFilter" };
|
|
|
|
readonly Dictionary<Type, IFilterConditionEditor> _filterEditors = new Dictionary<Type, IFilterConditionEditor>();
|
|
internal AutoBookmarkOptions.LevelAdjustmentOption Filter { get; private set; }
|
|
AutoBookmarkCondition.MultiCondition conditions;
|
|
|
|
public EditAdjustmentForm() {
|
|
InitializeComponent();
|
|
this.OnFirstLoad(OnLoad);
|
|
}
|
|
public EditAdjustmentForm(AutoBookmarkOptions.LevelAdjustmentOption filter) : this() {
|
|
int i = 0;
|
|
foreach (var item in FilterNames) {
|
|
_AddFilterMenuItem.DropDownItems.Add(item).Name = FilterIDs[i++];
|
|
}
|
|
_FilterBox.BeforeSorting += (object sender, BrightIdeasSoftware.BeforeSortingEventArgs e) => e.Canceled = true;
|
|
_ConditionColumn.AspectGetter = (object x) => x is AutoBookmarkCondition f ? f.Description : (object)null;
|
|
_IsInclusiveColumn.AspectGetter = (object x) => {
|
|
if (x is AutoBookmarkCondition f) {
|
|
return f.IsInclusive ? "包含匹配项" : "过滤匹配项";
|
|
}
|
|
return null;
|
|
};
|
|
_TypeColumn.AspectGetter = (object x) => x is AutoBookmarkCondition f ? f.Name : null;
|
|
Filter = new AutoBookmarkOptions.LevelAdjustmentOption();
|
|
if (filter != null) {
|
|
Filter.AdjustmentLevel = filter.AdjustmentLevel;
|
|
Filter.RelativeAdjustment = filter.RelativeAdjustment;
|
|
conditions = new AutoBookmarkCondition.MultiCondition(filter.Condition);
|
|
_FilterBox.Objects = conditions.Conditions;
|
|
}
|
|
if (_FilterBox.Items.Count > 0) {
|
|
_FilterBox.SelectedIndex = 0;
|
|
}
|
|
}
|
|
|
|
void OnLoad() {
|
|
_MainToolbar.ScaleIcons(16);
|
|
_FilterBox.ScaleColumnWidths();
|
|
}
|
|
|
|
void _OkButton_Click(Object source, EventArgs args) {
|
|
DialogResult = DialogResult.OK;
|
|
conditions = new AutoBookmarkCondition.MultiCondition();
|
|
foreach (ListViewItem item in _FilterBox.Items) {
|
|
conditions.Conditions.Add((AutoBookmarkCondition)_FilterBox.GetModelObject(item.Index));
|
|
}
|
|
|
|
Filter.Condition = conditions.Conditions.Count switch {
|
|
1 => conditions.Conditions[0],
|
|
0 => null,
|
|
_ => conditions
|
|
};
|
|
Close();
|
|
}
|
|
|
|
void _CancelButton_Click(Object source, EventArgs args) {
|
|
DialogResult = DialogResult.Cancel;
|
|
Close();
|
|
}
|
|
|
|
private void _AddFilterMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) {
|
|
var c = CreateCondition(e.ClickedItem.Name);
|
|
if (c != null) {
|
|
_FilterBox.AddObject(c);
|
|
}
|
|
}
|
|
|
|
private void _FilterBox_SelectedIndexChanged(object sender, EventArgs e) {
|
|
_EditFilterPanel.Controls.Clear();
|
|
var o = _FilterBox.SelectedObject;
|
|
if (o == null) {
|
|
return;
|
|
}
|
|
var ed = GetFilterEditor(o as AutoBookmarkCondition);
|
|
if (ed == null) {
|
|
return;
|
|
}
|
|
_EditFilterPanel.Controls.Add(ed.EditorControl);
|
|
ed.EditorControl.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
|
|
ed.EditorControl.Left = ed.EditorControl.Top = 0;
|
|
ed.EditorControl.Size = _EditFilterPanel.ClientSize;
|
|
}
|
|
|
|
internal static AutoBookmarkCondition CreateCondition(string name) {
|
|
switch (name) {
|
|
case "_FontNameFilter": return new AutoBookmarkCondition.FontNameCondition("SimSun", false);
|
|
case "_FontSizeFilter": return new AutoBookmarkCondition.TextSizeCondition(0, 10);
|
|
case "_FontPositionFilter": return new AutoBookmarkCondition.TextPositionCondition(1, -9999, 9999);
|
|
case "_PageRangeFilter": return new AutoBookmarkCondition.PageRangeCondition();
|
|
case "_TextFilter": return new AutoBookmarkCondition.TextCondition() { Pattern = new MatchPattern("筛选条件", false, false, false) };
|
|
default: return null;
|
|
}
|
|
}
|
|
|
|
internal static void UpdateFilter(IFilterConditionEditor filter) {
|
|
if (filter.EditorControl?.FindForm() is EditAdjustmentForm f) {
|
|
f._FilterBox.RefreshSelectedObjects();
|
|
}
|
|
}
|
|
|
|
private IFilterConditionEditor GetFilterEditor(AutoBookmarkCondition filter) {
|
|
var t = filter.GetType();
|
|
if (_filterEditors.TryGetValue(t, out IFilterConditionEditor c)) {
|
|
goto SetEditor;
|
|
// return c;
|
|
}
|
|
else if (t == typeof(AutoBookmarkCondition.FontNameCondition)) {
|
|
c = new FontNameConditionEditor();
|
|
}
|
|
else if (t == typeof(AutoBookmarkCondition.TextSizeCondition)) {
|
|
c = new TextSizeConditionEditor();
|
|
}
|
|
else if (t == typeof(AutoBookmarkCondition.TextPositionCondition)) {
|
|
c = new TextPositionConditionEditor();
|
|
}
|
|
else if (t == typeof(AutoBookmarkCondition.PageRangeCondition)) {
|
|
c = new PageRangeConditionEditor();
|
|
}
|
|
else if (t == typeof(AutoBookmarkCondition.TextCondition)) {
|
|
c = new TextConditionEditor();
|
|
}
|
|
else {
|
|
Common.FormHelper.ErrorBox("无法编辑选中的筛选条件。");
|
|
return null;
|
|
}
|
|
SetEditor:
|
|
_filterEditors[t] = c;
|
|
c.Filter = filter;
|
|
return c;
|
|
}
|
|
|
|
private void _RemoveButton_Click(object sender, EventArgs e) {
|
|
_FilterBox.RemoveObjects(_FilterBox.SelectedObjects);
|
|
}
|
|
}
|
|
}
|