Blame view

sources/RoboforkApp/Adorners/RubberbandAdorner.cs 3.73 KB
729be9a6d   doan   New Project
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
  using System;
  using System.Windows;
  using System.Windows.Controls;
  using System.Windows.Documents;
  using System.Windows.Input;
  using System.Windows.Media;
  using System.Windows.Shapes;
  
  namespace RoboforkApp
  {
      public class RubberbandAdorner : Adorner
      {
          private Point? startPoint, endPoint;
          private Rectangle rubberband;
          private DesignerCanvas designerCanvas;
          private VisualCollection visuals;
          private Canvas adornerCanvas;
  
          protected override int VisualChildrenCount
          {
              get
              {
                  return this.visuals.Count;
              }
          }
  
          public RubberbandAdorner(DesignerCanvas designerCanvas, Point? dragStartPoint)
              : base(designerCanvas)
          {
              this.designerCanvas = designerCanvas;
              this.startPoint = dragStartPoint;
  
              this.adornerCanvas = new Canvas();
              this.adornerCanvas.Background = Brushes.Transparent;
              this.visuals = new VisualCollection(this);
              this.visuals.Add(this.adornerCanvas);
  
              this.rubberband = new Rectangle();
              this.rubberband.Stroke = Brushes.Navy;
              this.rubberband.StrokeThickness = 1;
              this.rubberband.StrokeDashArray = new DoubleCollection(new double[] { 2 });                        
              
              this.adornerCanvas.Children.Add(this.rubberband);
          }
  
          protected override void OnMouseMove(MouseEventArgs e)
          {
              if (e.LeftButton == MouseButtonState.Pressed)
              {
                  if (!this.IsMouseCaptured)
                  {
                      this.CaptureMouse();
                  }
  
                  this.endPoint = e.GetPosition(this);
                  this.UpdateRubberband();
                  this.UpdateSelection();
                  e.Handled = true;
              }
          }
  
          protected override void OnMouseUp(MouseButtonEventArgs e)
          {
              if (this.IsMouseCaptured)
              {
                  this.ReleaseMouseCapture();
              }
  
              AdornerLayer adornerLayer = this.Parent as AdornerLayer;
              if (adornerLayer != null)
              {
                  adornerLayer.Remove(this);
              }
          }
  
          protected override Size ArrangeOverride(Size arrangeBounds)
          {
              this.adornerCanvas.Arrange(new Rect(arrangeBounds));
              return arrangeBounds;
          }
  
          protected override Visual GetVisualChild(int index)
          {
              return this.visuals[index];
          }
  
          private void UpdateRubberband()
          {
              double left = Math.Min(this.startPoint.Value.X, this.endPoint.Value.X);
              double top = Math.Min(this.startPoint.Value.Y, this.endPoint.Value.Y);
  
              double width = Math.Abs(this.startPoint.Value.X - this.endPoint.Value.X);
              double height = Math.Abs(this.startPoint.Value.Y - this.endPoint.Value.Y);
  
              this.rubberband.Width = width;
              this.rubberband.Height = height;
              Canvas.SetLeft(this.rubberband, left);
              Canvas.SetTop(this.rubberband, top);
          }
  
          private void UpdateSelection()
          {
              Rect rubberBand = new Rect(this.startPoint.Value, this.endPoint.Value);
              foreach (DesignerItem item in this.designerCanvas.Children)
              {
                  Rect itemRect = VisualTreeHelper.GetDescendantBounds(item);
                  Rect itemBounds = item.TransformToAncestor(designerCanvas).TransformBounds(itemRect);
  
                  if (rubberBand.Contains(itemBounds))
                  {
                      item.IsSelected = true;
                  }
                  else
                  {
                      item.IsSelected = false;
                  }
              }
          }
      }
  }