You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
8.4 KiB
213 lines
8.4 KiB
using System.Collections.Generic;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Data;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media;
|
|
using Microsoft.Windows.Design.Interaction;
|
|
using Microsoft.Windows.Design.Model;
|
|
|
|
namespace HMIControl.VisualStudio.Design
|
|
{
|
|
class ControlAdornerProvider : PrimarySelectionAdornerProvider
|
|
{
|
|
private AdornerPanel _panel = new AdornerPanel();
|
|
LinkableControl designObject;
|
|
ControlAdorner adorner;
|
|
Panel designCanvas;
|
|
LinkPin hitPin;
|
|
bool isdrag = false;
|
|
|
|
protected override void Activate(ModelItem item)
|
|
{
|
|
designObject = item.GetCurrentValue() as LinkableControl;//获得被点击的控件对象
|
|
|
|
if (designObject != null)
|
|
{
|
|
designCanvas = designObject.Parent as Panel;
|
|
DesignerView v = DesignerView.FromContext(Context);
|
|
adorner = new ControlAdorner(designObject);
|
|
adorner.RenderTransform = new ScaleTransform(v.ZoomLevel, v.ZoomLevel);
|
|
|
|
foreach (var pin in adorner.Children)
|
|
{
|
|
pin.MouseLeftButtonDown += new MouseButtonEventHandler(Pin_MouseLeftButtonDown);//按下左键选中hitPin,开始拖动
|
|
pin.MouseMove += new MouseEventHandler(Pin_MouseMove);//移动鼠标,开始找寻目标连接节点
|
|
}
|
|
|
|
AdornerPanel.SetAdornerHorizontalAlignment(adorner, AdornerHorizontalAlignment.Stretch);
|
|
AdornerPanel.SetAdornerVerticalAlignment(adorner, AdornerVerticalAlignment.Stretch);
|
|
_panel.Children.Add(adorner);
|
|
|
|
Adorners.Add(_panel);
|
|
v.ZoomLevelChanged += (s, e) => { adorner.RenderTransform = new ScaleTransform(v.ZoomLevel, v.ZoomLevel); };
|
|
}
|
|
|
|
base.Activate(item);
|
|
}
|
|
|
|
protected override void Deactivate()
|
|
{
|
|
base.Deactivate();
|
|
}
|
|
|
|
void Pin_MouseLeftButtonDown(object s, MouseButtonEventArgs e)
|
|
{
|
|
hitPin = s as LinkPin; isdrag = true; e.Handled = true;
|
|
}
|
|
|
|
void Pin_MouseMove(object s, MouseEventArgs e)
|
|
{
|
|
if (e.LeftButton != MouseButtonState.Pressed) isdrag = false;
|
|
|
|
if (isdrag && hitPin != null && designCanvas != null)
|
|
{
|
|
PinAdorner pinAdorner = new PinAdorner(designCanvas, hitPin);
|
|
pinAdorner.MouseUp += new MouseButtonEventHandler(pinAdorner_MouseUp);
|
|
DesignerView v = DesignerView.FromContext(Context);
|
|
double zoom = v.ZoomLevel;
|
|
pinAdorner.RenderTransform = new ScaleTransform(zoom, zoom);
|
|
_panel.Children.Add(pinAdorner);
|
|
e.Handled = true;
|
|
}
|
|
}
|
|
|
|
static readonly Dictionary<ConnectOrientation, string> omap = new Dictionary<ConnectOrientation, string>
|
|
{ { ConnectOrientation.Left, "LeftPin" }, { ConnectOrientation.Right, "RightPin" },
|
|
{ ConnectOrientation.Top, "TopPin" }, { ConnectOrientation.Bottom, "BottomPin" },{ ConnectOrientation.None, "" } };
|
|
void pinAdorner_MouseUp(object sender, MouseButtonEventArgs e)
|
|
{
|
|
var pinAdorner = sender as PinAdorner;
|
|
if (pinAdorner.HitPin != null)
|
|
{
|
|
LinkableControl targetObject = pinAdorner.HitLinkableControl;
|
|
LinkPin lp1 = pinAdorner.SourcePin;
|
|
LinkPin lp2 = pinAdorner.HitPin;
|
|
|
|
ConnectInfo info1 = lp1.GetInfo();
|
|
ConnectInfo info2 = lp2.GetInfo();
|
|
|
|
LinkLine line = new LinkLine(info1, info2);
|
|
//Panel.SetZIndex(line, designCanvas.Children.Count);
|
|
|
|
Binding bi1 = new Binding(omap[info1.Orient]);
|
|
bi1.ElementName = designObject.Name;
|
|
line.SetBinding(LinkLine.OriginInfoProperty, bi1);
|
|
Binding bi2 = new Binding(omap[info2.Orient]);
|
|
bi2.ElementName = targetObject.Name;
|
|
line.SetBinding(LinkLine.TargetInfoProperty, bi2);
|
|
|
|
var CanvasModelItem = AdornerProperties.GetModel(adorner).Parent;
|
|
ModelItemCollection myControls = CanvasModelItem.Properties["Children"].Collection;
|
|
ModelItem myLinkLine = myControls.Add(line);
|
|
|
|
}
|
|
if (pinAdorner.HitLinkableControl != null)
|
|
{
|
|
pinAdorner.HitLinkableControl.IsLinkDragOver = false;
|
|
}
|
|
|
|
hitPin = null;
|
|
if (adorner.IsMouseCaptured) adorner.ReleaseMouseCapture();
|
|
_panel.Children.Remove(pinAdorner);
|
|
}
|
|
|
|
}
|
|
|
|
class LinkLineAdornerProvider : PrimarySelectionAdornerProvider
|
|
{
|
|
LinkLine myLinkLine;
|
|
SolidColorBrush brush;
|
|
|
|
protected override void Activate(ModelItem item)
|
|
{
|
|
myLinkLine = item.GetCurrentValue() as LinkLine;
|
|
brush = myLinkLine.LineBrush;
|
|
Panel.SetZIndex(myLinkLine, 1000);
|
|
myLinkLine.LineBrush = Brushes.Yellow;
|
|
base.Activate(item);
|
|
}
|
|
|
|
protected override void Deactivate()
|
|
{
|
|
myLinkLine.LineBrush = brush;
|
|
Panel.SetZIndex(myLinkLine, 0);
|
|
base.Deactivate();
|
|
}
|
|
}
|
|
|
|
class TagComplexContextMenuProvider : PrimarySelectionContextMenuProvider
|
|
{
|
|
public TagComplexContextMenuProvider()
|
|
{
|
|
var lastFill = new MenuAction("Complex Editor");
|
|
lastFill.Checkable = true;
|
|
lastFill.Execute += (s, e) =>
|
|
{
|
|
ModelItem item = e.Selection.PrimarySelection;
|
|
var tagReader = item.GetCurrentValue() as ITagReader;
|
|
TagComplexEditor frm = new TagComplexEditor(tagReader);
|
|
frm.ShowDialog();
|
|
string txt = frm.TagText;
|
|
if (!string.IsNullOrEmpty(txt)) { item.Properties["TagReadText"].SetValue(txt); }
|
|
else if (txt == string.Empty) item.Properties["TagReadText"].ClearValue();
|
|
};
|
|
|
|
Items.Add(lastFill);
|
|
}
|
|
}
|
|
|
|
class TagWindowContextMenuProvider : PrimarySelectionContextMenuProvider
|
|
{
|
|
public TagWindowContextMenuProvider()
|
|
{
|
|
var lastFill = new MenuAction("Window Editor");
|
|
lastFill.Checkable = true;
|
|
lastFill.Execute += (s, e) =>
|
|
{
|
|
ModelItem item = e.Selection.PrimarySelection;
|
|
ITagWindow tagReader = item.GetCurrentValue() as ITagWindow;
|
|
TagWindowEditor frm = new TagWindowEditor(tagReader);
|
|
frm.ShowDialog();
|
|
string txt = frm.GetText();
|
|
if (!string.IsNullOrEmpty(txt)) { item.Properties["TagWindowText"].SetValue(txt); }
|
|
else if (txt == string.Empty) item.Properties["TagWindowText"].ClearValue();
|
|
if (frm.IsModel)
|
|
item.Properties["IsModel"].SetValue(true);
|
|
else
|
|
item.Properties["IsModel"].ClearValue();
|
|
if (frm.IsUnique)
|
|
item.Properties["IsUnique"].SetValue(true);
|
|
else
|
|
item.Properties["IsUnique"].ClearValue();
|
|
};
|
|
Items.Add(lastFill);
|
|
}
|
|
}
|
|
|
|
class TagWriterContextMenuProvider : PrimarySelectionContextMenuProvider
|
|
{
|
|
public TagWriterContextMenuProvider()
|
|
{
|
|
var lastFill = new MenuAction("Writer Editor");
|
|
lastFill.Checkable = true;
|
|
lastFill.Execute += (s, e) =>
|
|
{
|
|
ModelItem item = e.Selection.PrimarySelection;
|
|
var tagWriter = item.GetCurrentValue() as ITagWriter;
|
|
TagWriteEditor frm = new TagWriteEditor(tagWriter);
|
|
frm.ShowDialog();
|
|
if (frm.IsSaved)
|
|
{
|
|
string txt = frm.TagText;
|
|
if (string.IsNullOrEmpty(txt) == false) { item.Properties["TagWriteText"].SetValue(txt); }
|
|
else if (txt == string.Empty) item.Properties["TagWriteText"].ClearValue();
|
|
if (frm.IsPulse)
|
|
item.Properties["IsPulse"].SetValue(true);
|
|
else
|
|
item.Properties["IsPulse"].ClearValue();
|
|
}
|
|
};
|
|
Items.Add(lastFill);
|
|
}
|
|
}
|
|
}
|
|
|