Changeset 13135 for branches/OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/ConnectPortsChartMode.cs
- Timestamp:
- 11/11/15 13:53:10 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/ConnectPortsChartMode.cs
r13077 r13135 35 35 36 36 public override Image Image { get { return VSImageLibrary.OrgChart; } } 37 public override string ToolTip { get { return "Connect Ports"; } } 37 public override string Text { get { return "&Connect Ports"; } } 38 public override string ToolTipText { get { return "Connect Ports"; } } 38 39 39 40 public ConnectPortsChartMode(ChartControl control) : base(control) { } 40 41 41 public override void HandleOnMouseDown(object sender, MouseEventArgs e) { 42 base.HandleOnMouseDown(sender, e); 42 public override void HandleOnMouseMove(object sender, MouseEventArgs e) { 43 try { 44 if (!(chartControl.Tag is IUserDefinedNetwork)) return; 43 45 44 if (!(chartControl.Tag is IUserDefinedNetwork)) return;46 chartControl.RefreshPicture(); 45 47 46 switch (e.Button) { 47 case MouseButtons.Left: 48 var worldLocation = chartControl.Chart.TransformPixelToWorld(e.Location); 49 var nodeRectangles = chartControl.Chart.Group.Primitives.OfType<NodeRectangle>(); 50 var portRectangles = nodeRectangles.SelectMany(x => x.NetworkItem.Ports.Select(x.GetPortRectangle)); 51 startPortRectangle = portRectangles.FirstOrDefault(x => x.ContainsPoint(worldLocation)); 52 break; 48 var worldLocation = chartControl.Chart.TransformPixelToWorld(e.Location); 49 var nodeRectangles = chartControl.Chart.Group.Primitives.OfType<NodeRectangle>(); 50 var portRectangles = nodeRectangles.SelectMany(x => x.NetworkItem.Ports.Select(x.GetPortPrimitive)); 51 var currentPortRectangle = (PortRectangle)portRectangles.FirstOrDefault(x => x.ContainsPoint(worldLocation)); 52 53 // TODO: highlight allowed port connections only 54 55 using (var graphics = chartControl.CreatePictureGraphics()) { 56 Point startLocation = Point.Empty; 57 if (startPortRectangle != null) { 58 DrawCircleAroundPortRectangle(graphics, startPortRectangle, startPortRectangle.NetworkItem is IConnectablePort); 59 startLocation = chartControl.Chart.TransformWorldToPixel(startPortRectangle.Point); 60 } 61 62 Point endLocation = e.Location; 63 if (currentPortRectangle != null && (startPortRectangle != null || e.Button == MouseButtons.None)) { 64 DrawCircleAroundPortRectangle(graphics, currentPortRectangle, currentPortRectangle.NetworkItem is IConnectablePort); 65 endLocation = chartControl.Chart.TransformWorldToPixel(currentPortRectangle.Point); 66 } 67 68 bool connectionValid = startPortRectangle != null && startPortRectangle.NetworkItem is IConnectablePort; 69 connectionValid &= currentPortRectangle == null || currentPortRectangle.NetworkItem is IConnectablePort; 70 71 if (startPortRectangle != null) 72 DrawLineBetweenLocations(graphics, startLocation, endLocation, connectionValid); 73 } 74 } finally { 75 chartControl.UpdatePicture(); 76 base.HandleOnMouseMove(sender, e); 53 77 } 54 78 } 55 79 56 public override void HandleOnMouseMove(object sender, MouseEventArgs e) { 57 base.HandleOnMouseMove(sender, e); 80 public override void HandleOnMouseDown(object sender, MouseEventArgs e) { 81 try { 82 var network = chartControl.Tag as IUserDefinedNetwork; 83 if (network == null) return; 58 84 59 if (!(chartControl.Tag is IUserDefinedNetwork)) return; 60 61 try { 62 chartControl.PictureBox.Refresh(); 63 64 var worldLocation = chartControl.Chart.TransformPixelToWorld(e.Location); 65 var nodeRectangles = chartControl.Chart.Group.Primitives.OfType<NodeRectangle>(); 66 var portRectangles = nodeRectangles.SelectMany(x => x.NetworkItem.Ports.Select(x.GetPortRectangle)).ToList(); 67 var currentPortRectangle = portRectangles.FirstOrDefault(x => x.ContainsPoint(worldLocation)); 68 69 // TODO: highlight allowed port connections only 70 71 Point startLocation = Point.Empty; 72 if (startPortRectangle != null) { 73 DrawCircleAroundPortRectangle(startPortRectangle); 74 startLocation = chartControl.Chart.TransformWorldToPixel(startPortRectangle.Point); 85 switch (e.Button) { 86 case MouseButtons.Left: 87 var worldLocation = chartControl.Chart.TransformPixelToWorld(e.Location); 88 var nodeRectangles = chartControl.Chart.Group.Primitives.OfType<NodeRectangle>(); 89 var portRectangles = nodeRectangles.SelectMany(x => x.NetworkItem.Ports.Select(x.GetPortPrimitive)); 90 startPortRectangle = (PortRectangle)portRectangles.FirstOrDefault(x => x.ContainsPoint(worldLocation)); 91 break; 75 92 } 76 77 Point endLocation = e.Location;78 if (currentPortRectangle != null) {79 DrawCircleAroundPortRectangle(currentPortRectangle);80 endLocation = chartControl.Chart.TransformWorldToPixel(currentPortRectangle.Point);81 }82 83 if (startPortRectangle != null)84 DrawLineBetweenLocations(startLocation, endLocation);85 93 } finally { 86 chartControl.PictureBox.Update();94 base.HandleOnMouseDown(sender, e); 87 95 } 88 96 } 89 97 90 98 public override void HandleOnMouseUp(object sender, MouseEventArgs e) { 91 base.HandleOnMouseUp(sender, e); 99 try { 100 var network = chartControl.Tag as IUserDefinedNetwork; 101 if (network == null) return; 92 102 93 if (!(chartControl.Tag is IUserDefinedNetwork)) return; 103 switch (e.Button) { 104 case MouseButtons.Left: 105 var worldLocation = chartControl.Chart.TransformPixelToWorld(e.Location); 106 var nodeRectangles = chartControl.Chart.Group.Primitives.OfType<NodeRectangle>(); 107 var portRectangles = nodeRectangles.SelectMany(x => x.NetworkItem.Ports.Select(x.GetPortPrimitive)); 108 endPortRectangle = (PortRectangle)portRectangles.FirstOrDefault(x => x.ContainsPoint(worldLocation)); 94 109 95 switch (e.Button) { 96 case MouseButtons.Left: 97 var worldLocation = chartControl.Chart.TransformPixelToWorld(e.Location); 98 var nodeRectangles = chartControl.Chart.Group.Primitives.OfType<NodeRectangle>(); 99 var portRectangles = nodeRectangles.SelectMany(x => x.NetworkItem.Ports.Select(x.GetPortRectangle)).ToList(); 100 endPortRectangle = portRectangles.FirstOrDefault(x => x.ContainsPoint(worldLocation)); 110 if (startPortRectangle == endPortRectangle || startPortRectangle == null || endPortRectangle == null) { 111 startPortRectangle = null; 112 endPortRectangle = null; 113 return; 114 } 101 115 102 if (startPortRectangle == endPortRectangle && startPortRectangle == null || endPortRectangle == null) { 116 var startPort = (IConnectablePort)startPortRectangle.NetworkItem; 117 var endPort = (IConnectablePort)endPortRectangle.NetworkItem; 118 119 // TODO: check if port connection is allowed 120 121 startPort.ConnectedPort = endPort; 122 103 123 startPortRectangle = null; 104 124 endPortRectangle = null; 105 return; 106 } 107 108 var startPort = (IConnectablePort)startPortRectangle.NetworkItem; 109 var endPort = (IConnectablePort)endPortRectangle.NetworkItem; 110 111 // TODO: check if port connection is allowed 112 113 startPort.ConnectedPort = endPort; 114 115 startPortRectangle = null; 116 endPortRectangle = null; 117 break; 125 break; 126 } 127 } finally { 128 base.HandleOnMouseUp(sender, e); 118 129 } 119 130 } 120 131 121 protected virtual void DrawCircleAroundPortRectangle(PortRectangle portRectangle) { 132 #region Helpers 133 protected virtual void DrawCircleAroundPortRectangle(Graphics graphics, PortRectangle portRectangle, bool valid) { 122 134 var centerP = chartControl.Chart.TransformWorldToPixel(portRectangle.Point); 123 135 int a = (int)Math.Round(portRectangle.Size.Width / 2.0 * Math.Sqrt(2)); 124 136 int b = (int)Math.Round(portRectangle.Size.Height / 2.0 * Math.Sqrt(2)); 125 137 126 using (var graphics = chartControl.PictureBox.CreateGraphics()) 127 using (var pen = new Pen(Color.Green) { Width = 2f }) { 138 using (var pen = new Pen(valid ? Color.Green : Color.Red) { Width = 2f }) { 128 139 graphics.DrawEllipse(pen, 129 140 centerP.X - a, … … 134 145 } 135 146 136 protected virtual void DrawLineBetweenLocations(Point startLocation, Point endLocation) { 137 using (var graphics = chartControl.PictureBox.CreateGraphics()) 138 using (var pen = new Pen(Color.Green) { DashStyle = DashStyle.Dash, Width = 2f }) 147 protected virtual void DrawLineBetweenLocations(Graphics graphics, Point startLocation, Point endLocation, bool valid) { 148 using (var pen = new Pen(valid ? Color.Green : Color.Red) { DashStyle = DashStyle.Dash, Width = 2f }) 139 149 graphics.DrawLine(pen, startLocation.X, startLocation.Y, endLocation.X, endLocation.Y); 140 150 } 151 #endregion 141 152 } 142 153 }
Note: See TracChangeset
for help on using the changeset viewer.