CadParamPluging/UI/SettingsForm.cs

348 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using CadParamPluging.Common;
namespace CadParamPluging.UI
{
public class SettingsForm : Form
{
private readonly ListBox _lbDeliveryStatuses;
private readonly ListBox _lbProcessMethods;
private readonly ListBox _lbStructuralFeatures;
private readonly ListBox _lbSpecialConditions;
public DropdownOptions Result { get; private set; }
public SettingsForm(DropdownOptions current)
{
Text = "设置";
Size = new Size(600, 500);
StartPosition = FormStartPosition.CenterScreen;
FormBorderStyle = FormBorderStyle.FixedDialog;
MaximizeBox = false;
MinimizeBox = false;
ShowInTaskbar = false;
Font = SystemFonts.MessageBoxFont; // Use system font for consistent look
var mainLayout = new TableLayoutPanel
{
Dock = DockStyle.Fill,
Padding = new Padding(12),
RowCount = 2,
ColumnCount = 1
};
mainLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100f)); // Tabs
mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); // Buttons
_lbDeliveryStatuses = new ListBox();
_lbProcessMethods = new ListBox();
_lbStructuralFeatures = new ListBox();
_lbSpecialConditions = new ListBox();
var options = (current ?? DropdownOptions.CreateDefault()).Clone();
options.Normalize();
FillList(_lbDeliveryStatuses, options.DeliveryStatuses);
FillList(_lbProcessMethods, options.ProcessMethods);
FillList(_lbStructuralFeatures, options.StructuralFeatures);
FillList(_lbSpecialConditions, options.SpecialConditions);
// 2. Tabs Section
var tabs = new TabControl { Dock = DockStyle.Fill };
tabs.TabPages.Add(BuildEditableTab("交付状态", _lbDeliveryStatuses));
tabs.TabPages.Add(BuildEditableTab("工艺方法", _lbProcessMethods));
tabs.TabPages.Add(BuildEditableTab("结构特征", _lbStructuralFeatures));
tabs.TabPages.Add(BuildEditableTab("特殊条件", _lbSpecialConditions));
// 3. Bottom Section (Separated into Left (Tools) and Right (Dialog))
var bottomGrid = new TableLayoutPanel
{
Dock = DockStyle.Fill,
RowCount = 1,
ColumnCount = 2,
AutoSize = true,
Margin = new Padding(0, 8, 0, 0) // Top margin for spacing
};
bottomGrid.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100f));
bottomGrid.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
// Left tools
var leftTools = new FlowLayoutPanel
{
Dock = DockStyle.Fill,
AutoSize = true,
FlowDirection = FlowDirection.LeftToRight
};
var btnParamCatalog = new Button { Text = "参数总表", AutoSize = true };
btnParamCatalog.Click += (_, __) => OnOpenParamCatalog();
var btnTemplateBinding = new Button { Text = "模板绑定", AutoSize = true };
btnTemplateBinding.Click += (_, __) => OnOpenTemplateBinding();
leftTools.Controls.Add(btnParamCatalog);
leftTools.Controls.Add(btnTemplateBinding);
// Right actions
var rightActions = new FlowLayoutPanel
{
Dock = DockStyle.Fill,
AutoSize = true,
FlowDirection = FlowDirection.RightToLeft
};
var btnCancel = new Button { Text = "取消", DialogResult = DialogResult.Cancel, Width = 80 };
var btnOk = new Button { Text = "确定", Width = 80 };
btnOk.Click += (_, __) => OnOk();
rightActions.Controls.Add(btnCancel); // Add in reverse order due to RightToLeft flow
rightActions.Controls.Add(btnOk);
bottomGrid.Controls.Add(leftTools, 0, 0);
bottomGrid.Controls.Add(rightActions, 1, 0);
// Assemble Main
mainLayout.Controls.Add(tabs, 0, 0);
mainLayout.Controls.Add(bottomGrid, 0, 1);
Controls.Add(mainLayout);
AcceptButton = btnOk;
CancelButton = btnCancel;
}
private void OnOpenParamCatalog()
{
try
{
var catalog = ParamCatalogStore.Load();
using (var f = new ParamCatalogForm(catalog))
{
f.ShowDialog(this);
}
}
catch (Exception ex)
{
MessageBox.Show(this, $"打开参数总表失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void OnOpenTemplateBinding()
{
try
{
var catalog = ParamCatalogStore.Load();
var projectTypes = _lbDeliveryStatuses.Items.Cast<object>().Select(o => (o as string) ?? string.Empty).ToList();
var drawingTypes = _lbProcessMethods.Items.Cast<object>().Select(o => (o as string) ?? string.Empty).ToList();
var sheetSizes = _lbStructuralFeatures.Items.Cast<object>().Select(o => (o as string) ?? string.Empty).ToList();
var scales = _lbSpecialConditions.Items.Cast<object>().Select(o => (o as string) ?? string.Empty).ToList();
using (var f = new TemplateSchemaBindingForm(projectTypes, drawingTypes, sheetSizes, scales, catalog))
{
f.ShowDialog(this);
}
}
catch (Exception ex)
{
MessageBox.Show(this, $"打开模板参数绑定失败:\n\n{ex}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private static void FillList(ListBox listBox, System.Collections.Generic.IEnumerable<string> items)
{
listBox.Items.Clear();
if (items == null)
{
return;
}
foreach (var item in items)
{
if (!string.IsNullOrWhiteSpace(item))
{
listBox.Items.Add(item.Trim());
}
}
if (listBox.Items.Count > 0)
{
listBox.SelectedIndex = 0;
}
}
private TabPage BuildEditableTab(string title, ListBox listBox)
{
var page = new TabPage(title);
page.Padding = new Padding(8);
page.UseVisualStyleBackColor = true;
var layout = new TableLayoutPanel
{
Dock = DockStyle.Fill,
ColumnCount = 2,
RowCount = 1,
};
layout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100f));
layout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 100f)); // Fixed width for button column
listBox.Dock = DockStyle.Fill;
listBox.IntegralHeight = false; // smoother resizing
var actions = new FlowLayoutPanel
{
Dock = DockStyle.Fill,
FlowDirection = FlowDirection.TopDown,
WrapContents = false,
Padding = new Padding(4, 0, 0, 0)
};
var btnAdd = new Button { Text = "新增", Width = 90, Height = 30 };
btnAdd.Click += (_, __) => OnAddItem(title, listBox);
var btnEdit = new Button { Text = "修改", Width = 90, Height = 30 };
btnEdit.Click += (_, __) => OnEditItem(title, listBox);
var btnDelete = new Button { Text = "删除", Width = 90, Height = 30 };
btnDelete.Click += (_, __) => OnDeleteItem(title, listBox);
actions.Controls.Add(btnAdd);
actions.Controls.Add(btnEdit);
actions.Controls.Add(btnDelete);
layout.Controls.Add(listBox, 0, 0);
layout.Controls.Add(actions, 1, 0);
page.Controls.Add(layout);
return page;
}
private void OnAddItem(string category, ListBox listBox)
{
if (!TextInputForm.TryGetValue(this, $"{category} - 新增", "请输入内容:", string.Empty, out var value))
{
return;
}
value = (value ?? string.Empty).Trim();
if (value.Length == 0)
{
MessageBox.Show(this, "内容不能为空。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
listBox.Items.Add(value);
listBox.SelectedIndex = listBox.Items.Count - 1;
}
private void OnEditItem(string category, ListBox listBox)
{
var selected = listBox.SelectedItem as string;
if (string.IsNullOrWhiteSpace(selected))
{
MessageBox.Show(this, "请先选择一项再修改。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (!TextInputForm.TryGetValue(this, $"{category} - 修改", "请输入内容:", selected, out var value))
{
return;
}
value = (value ?? string.Empty).Trim();
if (value.Length == 0)
{
MessageBox.Show(this, "内容不能为空。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
var idx = listBox.SelectedIndex;
listBox.Items[idx] = value;
listBox.SelectedIndex = idx;
}
private void OnDeleteItem(string category, ListBox listBox)
{
var selected = listBox.SelectedItem as string;
if (string.IsNullOrWhiteSpace(selected))
{
MessageBox.Show(this, "请先选择一项再删除。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
var confirm = MessageBox.Show(
this,
$"确认删除:{selected}",
$"{category} - 删除",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);
if (confirm != DialogResult.Yes)
{
return;
}
var idx = listBox.SelectedIndex;
listBox.Items.RemoveAt(idx);
if (listBox.Items.Count > 0)
{
listBox.SelectedIndex = Math.Min(idx, listBox.Items.Count - 1);
}
}
private void OnOk()
{
var result = new DropdownOptions
{
DeliveryStatuses = _lbDeliveryStatuses.Items.Cast<object>().Select(o => (o as string) ?? string.Empty).ToList(),
ProcessMethods = _lbProcessMethods.Items.Cast<object>().Select(o => (o as string) ?? string.Empty).ToList(),
StructuralFeatures = _lbStructuralFeatures.Items.Cast<object>().Select(o => (o as string) ?? string.Empty).ToList(),
SpecialConditions = _lbSpecialConditions.Items.Cast<object>().Select(o => (o as string) ?? string.Empty).ToList()
};
result.Normalize();
var err = ValidateResult(result);
if (err != null)
{
MessageBox.Show(this, err, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
Result = result;
DialogResult = DialogResult.OK;
Close();
}
private static string ValidateResult(DropdownOptions options)
{
if (options.DeliveryStatuses == null || options.DeliveryStatuses.Count == 0)
{
return "交付状态至少需要 1 项。";
}
if (options.ProcessMethods == null || options.ProcessMethods.Count == 0)
{
return "工艺方法至少需要 1 项。";
}
if (options.StructuralFeatures == null || options.StructuralFeatures.Count == 0)
{
return "结构特征至少需要 1 项。";
}
if (options.SpecialConditions == null || options.SpecialConditions.Count == 0)
{
return "特殊条件至少需要 1 项。";
}
return null;
}
}
}