Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/11/15 13:53:10 (8 years ago)
Author:
jkarder
Message:

#2205: worked on optimization networks

  • refactored network visualization
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/ConnectPortsChartMode.cs

    r13077 r13135  
    3535
    3636    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"; } }
    3839
    3940    public ConnectPortsChartMode(ChartControl control) : base(control) { }
    4041
    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;
    4345
    44       if (!(chartControl.Tag is IUserDefinedNetwork)) return;
     46        chartControl.RefreshPicture();
    4547
    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);
    5377      }
    5478    }
    5579
    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;
    5884
    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;
    7592        }
    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);
    8593      } finally {
    86         chartControl.PictureBox.Update();
     94        base.HandleOnMouseDown(sender, e);
    8795      }
    8896    }
    8997
    9098    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;
    92102
    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));
    94109
    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            }
    101115
    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
    103123            startPortRectangle = null;
    104124            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);
    118129      }
    119130    }
    120131
    121     protected virtual void DrawCircleAroundPortRectangle(PortRectangle portRectangle) {
     132    #region Helpers
     133    protected virtual void DrawCircleAroundPortRectangle(Graphics graphics, PortRectangle portRectangle, bool valid) {
    122134      var centerP = chartControl.Chart.TransformWorldToPixel(portRectangle.Point);
    123135      int a = (int)Math.Round(portRectangle.Size.Width / 2.0 * Math.Sqrt(2));
    124136      int b = (int)Math.Round(portRectangle.Size.Height / 2.0 * Math.Sqrt(2));
    125137
    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 }) {
    128139        graphics.DrawEllipse(pen,
    129140          centerP.X - a,
     
    134145    }
    135146
    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 })
    139149        graphics.DrawLine(pen, startLocation.X, startLocation.Y, endLocation.X, endLocation.Y);
    140150    }
     151    #endregion
    141152  }
    142153}
Note: See TracChangeset for help on using the changeset viewer.