SchematicDrawing: Editing completed, TODO: Display

This commit is contained in:
Milan Hanajik
2020-06-02 12:00:45 +02:00
parent 2c100c7150
commit 070a76aade
337 changed files with 6267 additions and 663 deletions
@@ -0,0 +1,721 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using log4net;
using NHibernate;
using SchematicDrawing;
using TBF.BenchControl.Generic;
using TBF.Resources;
using TBF.UI.Shared;
using TBF.UI.Bench.Components;
namespace TBF.UI.Bench.EditSchDrawing
{
public partial class EditSchDrawingDlg : Form
{
static readonly ILog log = LogManager.GetLogger(typeof(EditSchDrawingDlg));
bool unlocked;
Config.Entities.CfgUpdateFlags flags; /// Or-ed from particular Flags from ComponentParametersDlg
ISession session;
IList<Config.Entities.Component> cmpntEntities;
TBF.BenchControl.Various.Drawing.Edges.Configuration edgesS;
TBF.BenchControl.Various.Drawing.Edges.Configuration edgesM;
TBF.BenchControl.Various.Drawing.Edges.Configuration edgesL;
TBF.BenchControl.Various.Drawing.Edges.Configuration edgesXL;
IList<IDrawingItemCfg> drawingItems;
string selectedItemName;
IDrawingItemCfg selectedItem;
SelectComponentClassDlg selectComponentTypeDlg; /// Constructed once, the selection is kept between dialog usages
public EditSchDrawingDlg()
{
InitializeComponent();
flags = Config.Entities.CfgUpdateFlags.None;
schDrawingCtrl.EditMode = true;
selectComponentTypeDlg = new SelectComponentClassDlg("Various.Drawing.");
sharedButtons.RequiredGroupMembership = new Users.Entities.GID[] { Users.Entities.GID.Administrators };
sharedButtons.OptionalButtons = SharedButtons.Buttons.Add;
sharedButtons.Unlocked += Unlocked;
sharedButtons.OKClicked += okButton_Click;
sharedButtons.CancelClicked += cancelButton_Click;
sharedButtons.AddClicked += addButton_Click;
radioButton1.Checked = true;
UpdateTitle();
}
private void EditSchDrawingDlg_Load(object sender, EventArgs e)
{
LoadFormPosition();
try
{
session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config);
cmpntEntities = session.QueryOver<Config.Entities.Component>()
.OrderBy(x => x.ItemNr).Asc
.List();
}
catch (Exception exc)
{
log.ErrorFormat("Exception when loading components : {1}", exc.Message);
cmpntEntities = new List<Config.Entities.Component>();
}
drawingItems = new List<IDrawingItemCfg>();
selectedItemName = string.Empty;
selectedItem = null;
foreach (var c in cmpntEntities)
{
IComponentCfg cmpCfg = TBF.BenchControl.TbfComponents.CmpntCfgFromCmpntEntity(c);
if (cmpCfg is IDrawingItemCfg)
{
IDrawingItemCfg item = cmpCfg as IDrawingItemCfg;
drawingItems.Add(item);
schDrawingCtrl.AddItem(item);
itemsListBox.Items.Add(item.Name);
if (cmpCfg is TBF.BenchControl.Various.Drawing.Edges.Configuration)
{
var edgesCfg = cmpCfg as TBF.BenchControl.Various.Drawing.Edges.Configuration;
switch (item.Sz)
{
case Sz.S:
if (edgesS == null)
{
edgesS = edgesCfg;
schDrawingCtrl.EdgesS = edgesCfg.Edges;
}
break;
case Sz.M:
if (edgesM == null)
{
edgesM = edgesCfg;
schDrawingCtrl.EdgesM = edgesCfg.Edges;
}
break;
case Sz.L:
if (edgesL == null)
{
edgesL = edgesCfg;
schDrawingCtrl.EdgesL = edgesCfg.Edges;
}
break;
case Sz.XL:
if (edgesXL == null)
{
edgesXL = edgesCfg;
schDrawingCtrl.EdgesXL = edgesCfg.Edges;
}
break;
default:
break;
}
}
}
}
}
void UpdateTitle()
{
if (selectedItem == null)
{
Text = Strings.Schematic_drawing;
}
else
{
Text = string.Format("{0}: {1} {2} [{3}, {4}] {5} {6} {7}", Strings.Schematic_drawing,
selectedItem.Name, selectedItem.Shape, selectedItem.X, selectedItem.Y,
selectedItem.Sz, selectedItem.Orient, selectedItem.Flip ? "flip" : "");
}
}
private void Unlocked(object sender, EventArgs e)
{
unlocked = true;
addEdgeButton.Enabled = true;
cwButton.Enabled = true;
ccwButton.Enabled = true;
upButton.Enabled = true;
downButton.Enabled = true;
leftButton.Enabled = true;
rightButton.Enabled = true;
mirrorButton.Enabled = true;
sizeButton.Enabled = true;
radioButton1.Enabled = true;
radioButton2.Enabled = true;
radioButton3.Enabled = true;
radioButton4.Enabled = true;
radioButton5.Enabled = true;
radioButton6.Enabled = true;
radioButton7.Enabled = true;
itemsListBox.Enabled = true;
}
private void okButton_Click(object sender, EventArgs e)
{
SaveDBChanges(session);
SaveUISettings();
DialogResult = DialogResult.OK;
Close();
return;
}
private void cancelButton_Click(object sender, EventArgs e)
{
SaveUISettings();
if ((flags & Config.Entities.CfgUpdateFlags.AnyChange) != 0 || (flags & Config.Entities.CfgUpdateFlags.RestartRqrd) != 0)
{
DialogResult dr = MessageBox.Show(Strings.Changes_will_be_lost_Do_you_want_to_proceed,
Strings.Warning,
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (dr != DialogResult.Yes) return;
}
flags = Config.Entities.CfgUpdateFlags.None; /// Abandoning changes confirmed
DialogResult = DialogResult.Cancel;
Close();
return;
}
private void addButton_Click(object sender, EventArgs e)
{
DialogResult dialogRslt = selectComponentTypeDlg.ShowDialog();
if (dialogRslt != DialogResult.OK) return;
IComponentFactory factory = selectComponentTypeDlg.SlctdCmpntFactory;
IComponentCfg cfg = factory.DefaultConfig();
IComponentCfgCtrl cfgControl = cfg.GetControl();
cfgControl.Config = cfg;
cfgControl.Config.ItemNr = (cmpntEntities.Count > 0) ? (cmpntEntities[cmpntEntities.Count - 1].ItemNr + 1) : 1;
TBF.BenchControl.ComponentParametersDlg cfgForm = new TBF.BenchControl.ComponentParametersDlg();
cfgForm.TbfComponents = cmpntEntities;
cfgForm.ComponentCfgCtrl = cfgControl;
cfgForm.UnlockAfterStart = true;
dialogRslt = cfgForm.ShowDialog();
if (dialogRslt == DialogResult.OK)
{
Config.Entities.Component newComponent = cfgForm.Config.CreateDbEntity();
cmpntEntities.Add(newComponent);
IDrawingItemCfg item = cfgForm.Config as IDrawingItemCfg;
if (item != null)
{
drawingItems.Add(item);
schDrawingCtrl.AddItem(item);
itemsListBox.Items.Add(item.Name);
itemsListBox.SelectedIndex = itemsListBox.Items.Count - 1;
}
}
}
private void LoadFormPosition()
{
LocalSettings ls = Program.LocalSettings;
if (ls != null)
{
Width = (ls.SchDrawingDlgWidth > 0) ? ls.SchDrawingDlgWidth : 850;
Height = (ls.SchDrawingDlgHeight > 0) ? ls.SchDrawingDlgHeight : 500;
Left = (ls.SchDrawingDlgLeft != 0) ? ls.SchDrawingDlgLeft : 200;
Top = (ls.SchDrawingDlgTop != 0) ? ls.SchDrawingDlgTop : 100;
}
}
/// <summary>
/// Save the dialog position and ListViewEx column widths
/// </summary>
void SaveUISettings()
{
/// Obtain ComponentsmanagerDlg dimensions, etc.
bool isMaximized = (WindowState == FormWindowState.Maximized);
int left = (WindowState == FormWindowState.Normal) ? Location.X : RestoreBounds.Left;
int top = (WindowState == FormWindowState.Normal) ? Location.Y : RestoreBounds.Top;
int width = (WindowState == FormWindowState.Normal) ? Size.Width : RestoreBounds.Width;
int height = (WindowState == FormWindowState.Normal) ? Size.Height : RestoreBounds.Height;
LocalSettings ls = Program.LocalSettings;
if (ls != null && (ls.SchDrawingDlgMaximized != isMaximized ||
ls.SchDrawingDlgLeft != left ||
ls.SchDrawingDlgTop != top ||
ls.SchDrawingDlgWidth != width ||
ls.SchDrawingDlgHeight != height))
{
/// At least one ComponentsManagerDlg dimension differs => Update local settings and save them
///
ls.SchDrawingDlgMaximized = isMaximized;
ls.SchDrawingDlgLeft = left;
ls.SchDrawingDlgTop = top;
ls.SchDrawingDlgWidth = width;
ls.SchDrawingDlgHeight = height;
ls.Save();
}
}
bool SaveDBChanges(ISession session)
{
using (ITransaction transaction = session.BeginTransaction())
{
try
{
int i = 0;
foreach (var original in cmpntEntities)
{
IComponentCfg cmpCfg = TBF.BenchControl.TbfComponents.CmpntCfgFromCmpntEntity(original);
if ((cmpCfg is IDrawingItemCfg) && (i < schDrawingCtrl.GetItems().Count))
{
Config.Entities.Component modified = (schDrawingCtrl.GetItems()[i++] as TBF.BenchControl.Generic.IComponentCfg).CreateDbEntity();
if (original.Name == modified.Name && original.Parameters != modified.Parameters)
{
original.Parameters = modified.Parameters;
session.SaveOrUpdate(original);
}
}
}
transaction.Commit();
session.Flush();
return true;
}
catch (Exception exc)
{
transaction.Rollback();
log.ErrorFormat("Exception when saving components : {1}", exc.Message);
return false;
}
}
}
private void itemsListBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (!unlocked) return;
selectedItemName = itemsListBox.SelectedItem.ToString();
schDrawingCtrl.SelectedItemName = selectedItemName;
selectedItem = null;
foreach (var item in drawingItems)
{
if (item.Name == selectedItemName)
{
selectedItem = item;
break;
}
}
UpdateTitle();
}
Selection GetSelection()
{
if (radioButton2.Checked) return Selection.Label;
if (radioButton3.Checked) return Selection.Value;
if (radioButton4.Checked) return Selection.EdgeS;
if (radioButton5.Checked) return Selection.EdgeM;
if (radioButton6.Checked) return Selection.EdgeL;
if (radioButton7.Checked) return Selection.EdgeXL;
return Selection.Object;
}
/// <summary>
/// Return orientation so that object/label/value rotates clockwise
/// </summary>
/// <param name="orient">New orientation</param>
Orient RotateCW(Orient orient)
{
if (orient == Orient.Up) return Orient.R;
return ++orient;
}
/// <summary>
/// Update orientation so that object/label/value rotates counterclockwise
/// </summary>
/// <param name="orient">Ref. to orienation to be updated</param>
Orient RotateCCW(Orient orient)
{
if (orient == Orient.R) return Orient.Up;
return --orient;
}
private void leftButton_Click(object sender, EventArgs e)
{
if (selectedItem == null) return;
int m = ((Control.ModifierKeys & Keys.Shift) != 0) ? 5 : 1;
switch (GetSelection())
{
case Selection.Object:
selectedItem.X -= m * SchematicDrawing.Const.Step;
if (selectedItem.X < 0) selectedItem.X = 0;
break;
case Selection.Label:
selectedItem.LblX -= m;
break;
case Selection.Value:
selectedItem.ValX -= m;
break;
default:
return; /// Edge selected -> do nothing
}
UpdateTitle();
schDrawingCtrl.Redraw();
}
private void rightButton_Click(object sender, EventArgs e)
{
if (selectedItem == null) return;
int m = ((Control.ModifierKeys & Keys.Shift) != 0) ? 5 : 1;
switch (GetSelection())
{
case Selection.Object:
selectedItem.X += m * SchematicDrawing.Const.Step;
break;
case Selection.Label:
selectedItem.LblX += m;
break;
case Selection.Value:
selectedItem.ValX += m;
break;
default:
return; /// Edge selected -> do nothing
}
UpdateTitle();
schDrawingCtrl.Redraw();
}
private void upButton_Click(object sender, EventArgs e)
{
if (selectedItem == null) return;
int m = ((Control.ModifierKeys & Keys.Shift) != 0) ? 5 : 1;
switch (GetSelection())
{
case Selection.Object:
selectedItem.Y -= m * SchematicDrawing.Const.Step;
if (selectedItem.Y < 0) selectedItem.Y = 0;
break;
case Selection.Label:
selectedItem.LblY -= m;
break;
case Selection.Value:
selectedItem.ValY -= m;
break;
default:
return; /// Edge selected -> do nothing
}
UpdateTitle();
schDrawingCtrl.Redraw();
}
private void downButton_Click(object sender, EventArgs e)
{
if (selectedItem == null) return;
int m = ((Control.ModifierKeys & Keys.Shift) != 0) ? 5 : 1;
switch (GetSelection())
{
case Selection.Object:
selectedItem.Y += m * SchematicDrawing.Const.Step;
break;
case Selection.Label:
selectedItem.LblY += m; break;
case Selection.Value:
selectedItem.ValY += m; break;
default:
return; /// Edge selected -> do nothing
}
UpdateTitle();
schDrawingCtrl.Redraw();
}
private void cwButton_Click(object sender, EventArgs e)
{
if (selectedItem == null) return;
switch (GetSelection())
{
case Selection.Object: selectedItem.Orient = RotateCW(selectedItem.Orient); break;
case Selection.Label: selectedItem.LblOrient = RotateCW(selectedItem.LblOrient); break;
case Selection.Value: selectedItem.ValOrient = RotateCW(selectedItem.ValOrient); break;
default: return; /// Edge
}
UpdateTitle();
schDrawingCtrl.Redraw();
}
private void ccwButton_Click(object sender, EventArgs e)
{
if (selectedItem == null) return;
switch (GetSelection())
{
case Selection.Object: selectedItem.Orient = RotateCCW(selectedItem.Orient); break;
case Selection.Label: selectedItem.LblOrient = RotateCCW(selectedItem.LblOrient); break;
case Selection.Value: selectedItem.ValOrient = RotateCCW(selectedItem.ValOrient); break;
default: return; /// Edge
}
UpdateTitle();
schDrawingCtrl.Redraw();
}
private void mirrorButton_Click(object sender, EventArgs e)
{
if (GetSelection() == Selection.Object && selectedItem != null)
{
selectedItem.Flip = !selectedItem.Flip;
UpdateTitle();
schDrawingCtrl.Redraw();
}
}
/// <summary>
/// Rotates enum Sz values in selectedItem.Sz variable as follows:
/// S -> M -> L -> XL -> S ...
/// K1 -> K2 -> K3 -> K4 -> K5 -> K6 -> K7 -> K1 ...
/// </summary>
private void sizeButton_Click(object sender, EventArgs e)
{
if (GetSelection() == Selection.Object && selectedItem != null)
{
if (selectedItem.Sz == Sz.XL)
{
selectedItem.Sz = Sz.S;
}
else if (++selectedItem.Sz == Sz.Count)
{
selectedItem.Sz = Sz.K1;
}
UpdateTitle();
schDrawingCtrl.Redraw();
}
}
private void addEdgeButton_Click(object sender, EventArgs e)
{
AddEdgeDlg dlg = new AddEdgeDlg(drawingItems);
if (dlg.ShowDialog() == DialogResult.OK)
{
schDrawingCtrl.ShowTempEdge(dlg.EdgeStr, dlg.EdgeSize);
if (MessageBox.Show("Do you want to save this edge?", "Confirmation",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
/// Save the edge entered in the dialog
TBF.BenchControl.Various.Drawing.Edges.Configuration edgesCfg = null;
switch (dlg.EdgeSize)
{
case Sz.S: edgesCfg = edgesS; break;
case Sz.M: edgesCfg = edgesM; break;
case Sz.L: edgesCfg = edgesL; break;
case Sz.XL: edgesCfg = edgesXL; break;
}
if (edgesCfg != null)
{
string[] oriEdges = edgesCfg.Edges;
edgesCfg.Edges = new string[oriEdges.Length + 1];
for (int i = 0; i < oriEdges.Length; i++)
{
edgesCfg.Edges[i] = oriEdges[i];
}
edgesCfg.Edges[oriEdges.Length] = dlg.EdgeStr;
switch (dlg.EdgeSize)
{
case Sz.S: schDrawingCtrl.EdgesS = edgesCfg.Edges; break;
case Sz.M: schDrawingCtrl.EdgesM = edgesCfg.Edges; break;
case Sz.L: schDrawingCtrl.EdgesL = edgesCfg.Edges; break;
case Sz.XL: schDrawingCtrl.EdgesXL = edgesCfg.Edges; break;
}
}
}
schDrawingCtrl.ClearTempEdge();
}
}
private void schDrawingCtrl_MouseClick(object sender, MouseEventArgs e)
{
Selection sel = GetSelection();
if (sel == Selection.Object || sel == Selection.Label || sel == Selection.Value)
{
foreach (var item in drawingItems)
{
if (item.X == 0 && item.Y == 0) continue;
DrawingShape dshape = DrawingShape.GetDrawingShape(item);
if (sel == Selection.Object && (dshape != null) && dshape.HasImg
&& dshape.GetRotatedFlippedImageRectangle(item.Orient, item.Flip).Contains(e.X - item.X, e.Y - item.Y))
{
selectedItemName = item.Name;
schDrawingCtrl.SelectedItemName = item.Name;
selectedItem = item;
break;
}
else if (sel == Selection.Label)
{
int labelX = item.X + item.LblX;
int labelY = item.Y + item.LblY;
if (e.X >= labelX && e.X < labelX + 20 && e.Y >= labelY && e.Y < labelY + 20)
{
selectedItemName = item.Name;
schDrawingCtrl.SelectedItemName = item.Name;
selectedItem = item;
break;
}
}
else if (sel == Selection.Value && (dshape != null) && dshape.HasValue)
{
int valueX = item.X + item.ValX;
int valueY = item.Y + item.ValY;
if (e.X >= valueX && e.X < valueX + 20 && e.Y >= valueY && e.Y < valueY + 20)
{
selectedItemName = item.Name;
schDrawingCtrl.SelectedItemName = item.Name;
selectedItem = item;
break;
}
}
}
}
else
{
/// TODO: Select an edge
}
Refresh();
}
private void schDrawingCtrl_MouseDoubleClick(object sender, MouseEventArgs e)
{
int xPos = e.X;
int yPos = e.Y;
}
bool isStartNode;
string startNodeItem;
int startNodeId;
///
void ShowStartNode(string itemName, int nodeId)
{
isStartNode = true;
startNodeItem = itemName;
startNodeId = nodeId;
schDrawingCtrl.ShowStartNode(itemName, nodeId);
}
///
void ClearStartNode()
{
isStartNode = false;
startNodeItem = null;
schDrawingCtrl.ClearStartNode();
}
private void EditSchDrawingDlg_MouseDown(object sender, MouseEventArgs e)
{
Selection sel = GetSelection();
if (sel == Selection.EdgeS || sel == Selection.EdgeM || sel == Selection.EdgeL || sel == Selection.EdgeXL)
{
int nodeId;
string itemName = FindNode(drawingItems, e.X, e.Y, 4, out nodeId);
if (!string.IsNullOrEmpty(itemName))
{
ShowStartNode(itemName, nodeId);
}
}
}
private void schDrawingCtrl_MouseUp(object sender, MouseEventArgs e)
{
Selection sel = GetSelection();
if (sel == Selection.EdgeS || sel == Selection.EdgeM || sel == Selection.EdgeL || sel == Selection.EdgeXL)
{
Sz sz = (sel == Selection.EdgeS) ? Sz.S : (sel == Selection.EdgeM) ? Sz.M : (sel == Selection.EdgeL) ? Sz.L : Sz.XL;
if (isStartNode)
{
int nodeId;
string itemName = FindNode(drawingItems, e.X, e.Y, 4, out nodeId);
if (!string.IsNullOrEmpty(itemName) && (itemName != startNodeItem || nodeId != startNodeId))
{
string edgeStr = string.Format("{0}~{1}~{2}~{3}", startNodeItem, startNodeId, itemName, nodeId);
ClearStartNode();
schDrawingCtrl.ShowTempEdge(edgeStr, sz);
if (MessageBox.Show("Do you want to save this edge?", "Confirmation",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
/// Save the edge entered in the dialog
TBF.BenchControl.Various.Drawing.Edges.Configuration edgesCfg = null;
switch (sz)
{
case Sz.S: edgesCfg = edgesS; break;
case Sz.M: edgesCfg = edgesM; break;
case Sz.L: edgesCfg = edgesL; break;
case Sz.XL: edgesCfg = edgesXL; break;
}
if (edgesCfg != null)
{
string[] oriEdges = edgesCfg.Edges;
edgesCfg.Edges = new string[oriEdges.Length + 1];
for (int i = 0; i < oriEdges.Length; i++)
{
edgesCfg.Edges[i] = oriEdges[i];
}
edgesCfg.Edges[oriEdges.Length] = edgeStr;
switch (sz)
{
case Sz.S: schDrawingCtrl.EdgesS = edgesCfg.Edges; break;
case Sz.M: schDrawingCtrl.EdgesM = edgesCfg.Edges; break;
case Sz.L: schDrawingCtrl.EdgesL = edgesCfg.Edges; break;
case Sz.XL: schDrawingCtrl.EdgesXL = edgesCfg.Edges; break;
}
}
}
schDrawingCtrl.ClearTempEdge();
}
else
{
ClearStartNode();
}
}
}
}
string FindNode(IList<IDrawingItemCfg> items, int x, int y, int tollerance, out int nid)
{
foreach (var item in items)
{
if (item.X == 0 && item.Y == 0) continue;
DrawingShape dshape = DrawingShape.GetDrawingShape(item);
if (dshape == null) continue;
for (int i = 0; i < dshape.Nodes.Length; i++)
{
Node nd = dshape.GetRotatedFlippedNode(i, item.Orient, item.Flip);
int dx = Math.Abs(item.X + Const.Step * nd.X - x);
int dy = Math.Abs(item.Y + Const.Step * nd.Y - y);
if ((dx <= tollerance) && (dy <= tollerance))
{
nid = i;
return item.Name;
}
}
}
nid = 0;
return null;
}
}
}