Files
wg_cpso/CPSO/Forms/47_Amplitude/FrmAmplitude.cs

266 lines
10 KiB
C#
Raw Permalink Normal View History

2026-03-25 18:20:24 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CaeModel;
using CaeGlobals;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
namespace CPSO.Forms
{
class FrmAmplitude : UserControls.FrmPropertyDataListView, IFormBase
{
// Variables
private string[] _amplitudeNames;
private string _amplitudeToEditName;
private ViewAmplitude _viewAmplitude;
private Controller _controller;
private TabPage[] _pages;
// Properties
public Amplitude Amplitude
{
get { return _viewAmplitude.GetBase(); }
set
{
var clone = value.DeepClone();
if (clone == null) _viewAmplitude = null;
else if (clone is AmplitudeTabular at) _viewAmplitude = new ViewAmplitudeTabular(at);
else throw new NotImplementedException();
}
}
// Constructors
public FrmAmplitude(Controller controller)
{
InitializeComponent();
//
_controller = controller;
_viewAmplitude = null;
//
int i = 0;
_pages = new TabPage[tcProperties.TabPages.Count];
foreach (TabPage tabPage in tcProperties.TabPages)
{
tabPage.Paint += TabPage_Paint;
_pages[i++] = tabPage;
}
}
private void InitializeComponent()
{
this.tcProperties.SuspendLayout();
this.tpProperties.SuspendLayout();
this.gbType.SuspendLayout();
this.SuspendLayout();
//
// tpDataPoints
//
this.tpDataPoints.Size = new System.Drawing.Size(302, 217);
//
// propertyGrid
//
this.propertyGrid.Location = new System.Drawing.Point(3, 3);
this.propertyGrid.Size = new System.Drawing.Size(296, 269);
//
// FrmAmplitude
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.ClientSize = new System.Drawing.Size(334, 461);
this.Name = "FrmAmplitude";
this.Text = "Edit Amplitude";
this.VisibleChanged += new System.EventHandler(this.FrmAmplitude_VisibleChanged);
this.tcProperties.ResumeLayout(false);
this.tpProperties.ResumeLayout(false);
this.gbType.ResumeLayout(false);
this.ResumeLayout(false);
}
// Event handlers
private void FrmAmplitude_VisibleChanged(object sender, EventArgs e)
{
if (Visible) { }
else dgvData.HidePlot();
}
private void TabPage_Paint(object sender, PaintEventArgs e)
{
SolidBrush fillBrush = new SolidBrush(((TabPage)sender).BackColor);
e.Graphics.FillRectangle(fillBrush, e.ClipRectangle);
// Enable copy/paste without first selecting the cell 0,0
if (sender == tpDataPoints)
{
ActiveControl = dgvData;
dgvData[0, 0].Selected = true;
}
}
private void Binding_ListChanged(object sender, ListChangedEventArgs e)
{
_propertyItemChanged = true;
}
// Overrides
protected override void OnListViewTypeSelectedIndexChanged()
{
if (lvTypes.SelectedItems != null && lvTypes.SelectedItems.Count == 1)
{
// Clear
dgvData.DataSource = null;
dgvData.Columns.Clear();
tcProperties.TabPages.Clear();
//
object itemTag = lvTypes.SelectedItems[0].Tag;
if (itemTag is ViewAmplitudeTabular vat)
{
tcProperties.TabPages.Add(_pages[0]); // properties
tcProperties.TabPages.Add(_pages[1]); // data points
//
SetDataGridViewBinding(vat.DataPoints);
//
_viewAmplitude = vat;
}
else throw new NotImplementedException();
//
propertyGrid.SelectedObject = lvTypes.SelectedItems[0].Tag;
//
SetAllGridViewUnits();
//
propertyGrid.BuildAutocompleteMenu(_controller.GetAllParameterNames());
dgvData.BuildAutocompleteMenu(_controller.GetAllParameterNames());
}
}
protected override void OnApply(bool onOkAddNew)
{
if (propertyGrid.SelectedObject == null) throw new CaeException("No item selected.");
//
_viewAmplitude = (ViewAmplitude)propertyGrid.SelectedObject;
// Check if the name exists
CheckName(_amplitudeToEditName, _viewAmplitude.Name, _amplitudeNames, "amplitude");
// Create
if (_amplitudeToEditName == null)
{
_controller.AddAmplitudeCommand(Amplitude);
}
// Replace
else if (_propertyItemChanged)
{
_controller.ReplaceAmplitudeCommand(_amplitudeToEditName, Amplitude);
}
}
protected override bool OnPrepareForm(string stepName, string amplitudeToEditName)
{
this.btnOkAddNew.Visible = amplitudeToEditName == null;
//
_propertyItemChanged = false;
_stepName = null;
_amplitudeNames = null;
_amplitudeToEditName = null;
_viewAmplitude = null;
lvTypes.Items.Clear();
propertyGrid.SelectedObject = null;
//
_stepName = stepName;
_amplitudeNames = _controller.GetAmplitudeNames();
_amplitudeToEditName = amplitudeToEditName;
//
if (_amplitudeNames == null)
throw new CaeException("The amplitude names must be defined first.");
//
PopulateListOfAmplitudes();
//
if (amplitudeToEditName == null)
{
lvTypes.Enabled = true;
_viewAmplitude = null;
if (lvTypes.Items.Count == 1) _preselectIndex = 0;
}
else
{
Amplitude = _controller.GetAmplitude(amplitudeToEditName); // to clone
//
int selectedId;
if (_viewAmplitude.GetBase() is AmplitudeTabular) selectedId = 0;
else throw new NotSupportedException();
//
lvTypes.Items[selectedId].Tag = _viewAmplitude;
_preselectIndex = selectedId;
}
//
_controller.SetSelectByToOff();
//
return true;
}
// Methods
private void PopulateListOfAmplitudes()
{
// Populate list view
ListViewItem item;
// Tabular
item = new ListViewItem("Tabular");
ViewAmplitudeTabular vat = new ViewAmplitudeTabular(new AmplitudeTabular(GetAmplitudeName("Tabular"),
new double[][] { new double[2] }));
item.Tag = vat;
lvTypes.Items.Add(item);
}
private string GetAmplitudeName(string name)
{
if (name == null || name == "") name = "Amplitude";
name = name.Replace(' ', '_');
name = _amplitudeNames.GetNextNumberedKey(name);
//
return name;
}
private void SetDataGridViewBinding(object data)
{
BindingSource binding = new BindingSource();
binding.DataSource = data;
dgvData.DataSource = binding; // bind datagridview to binding source - enables adding of new lines
binding.ListChanged += Binding_ListChanged;
}
private void SetAllGridViewUnits()
{
string noUnit = "/";
// Amplitude
SetGridViewUnit(nameof(AmplitudeDataPoint.Time), _controller.Model.UnitSystem.TimeUnitAbbreviation,
_controller.Model.UnitSystem.FrequencyUnitAbbreviation,
new StringDoubleConverter());
SetGridViewUnit(nameof(AmplitudeDataPoint.Amplitude), noUnit, null,
new StringDoubleConverter());
//
dgvData.XColIndex = 0;
dgvData.StartPlotAtZero = true;
}
private void SetGridViewUnit(string columnName, string unit1, string unit2, TypeConverter converter)
{
DataGridViewColumn col = dgvData.Columns[columnName];
if (col != null)
{
// Unit
if (col.HeaderText != null)
{
col.HeaderText = col.HeaderText.ReplaceFirst("?", unit1);
if (unit2 != null) col.HeaderText = col.HeaderText.ReplaceFirst("?", unit2);
}
// Alignment
col.HeaderCell.Style.Alignment = DataGridViewContentAlignment.BottomCenter;
// Width
col.Width += 10;
// Converter
col.Tag = converter;
}
}
}
}