source: trunk/CrypPlugins/WorkspaceManager/View/VisualComponents/CryptoLineView/CryptoLineView.cs @ 1792

Last change on this file since 1792 was 1792, checked in by kopal, 11 years ago
  • icons will now be updated durin execute of ExecutionEngine
  • right click on a CryptoLine will delete it
File size: 12.4 KB
Line 
1using System;
2using System.ComponentModel;
3using System.Windows;
4using System.Windows.Media;
5using System.Windows.Input;
6using System.Windows.Controls;
7using System.Windows.Shapes;
8using System.Reflection;
9using System.Windows.Threading;
10using WorkspaceManager.View.Interface;
11using WorkspaceManager.Model;
12using System.Windows.Documents;
13using System.Collections.Generic;
14using System.Threading;
15
16namespace WorkspaceManager.View.VisualComponents
17{
18        public sealed class CryptoLineView : Shape, IConnection, IUpdateableView
19    {
20        #region Variables
21
22        private IntersectPoint intersectPoint;
23        private List<FromTo> pointList = new List<FromTo>();
24        public HashSet<CryptoLineView> UpdateList = new HashSet<CryptoLineView>();
25
26        private ConnectionModel model;
27        public ConnectionModel Model
28        {
29            get { return model; }
30            private set { model = value; }
31        }
32        private static double offset = 6;
33
34        #endregion
35
36        #region Dependency Properties
37
38        public static readonly DependencyProperty StartPointProperty = DependencyProperty.Register("StartPoint", typeof(Point), typeof(CryptoLineView), new FrameworkPropertyMetadata(new Point(0, 0), FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
39        public static readonly DependencyProperty EndPointProperty = DependencyProperty.Register("EndPoint", typeof(Point), typeof(CryptoLineView), new FrameworkPropertyMetadata(new Point(0, 0), FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
40
41                #endregion
42
43                #region CLR Properties
44
45        public Point StartPoint
46        {
47            get { return (Point)GetValue(StartPointProperty); }
48            set 
49            {
50                SetValue(StartPointProperty, value);
51            }
52        }
53
54        public Point EndPoint
55        {
56            get { return (Point)GetValue(EndPointProperty); }
57            set 
58            {
59                SetValue(EndPointProperty, value);
60            }
61        }
62
63                #endregion
64
65        public CryptoLineView()
66        {
67            Stroke = Brushes.Black;
68            StrokeThickness = 2;
69        }
70
71        protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
72        {
73            base.OnPropertyChanged(e);
74            foreach (CryptoLineView line in UpdateList)
75            {
76                line.InvalidateVisual();
77            }
78        }
79
80        protected override void OnMouseDown(MouseButtonEventArgs args)
81        {
82            if (args.RightButton == MouseButtonState.Pressed)
83            {
84                this.model.WorkspaceModel.deleteConnectionModel(this.model);
85            }           
86        }
87
88        public CryptoLineView(ConnectionModel connectionModel) : this()
89        {
90            this.Model = connectionModel;
91            Color color = ColorHelper.GetColor(connectionModel.ConnectionType);
92            Stroke = new SolidColorBrush(color);
93            StrokeThickness = 2;
94        }
95
96                #region Overrides
97
98                protected override Geometry DefiningGeometry
99                {
100                        get
101                        {
102                                StreamGeometry geometry = new StreamGeometry();
103                                geometry.FillRule = FillRule.EvenOdd;
104
105                                using (StreamGeometryContext context = geometry.Open())
106                                {
107                    internalGeometryDraw(context);
108                                }
109
110                                geometry.Freeze();
111                                return geometry;
112                        }
113                }               
114
115                #endregion
116
117                #region Privates
118        private bool isBetween(double min, double max, double between)
119        {
120            return min <= between && between <= max;
121        }
122
123        private bool findIntersection(Point StartPoint, Point EndPoint, Point StartPointSec, Point EndPointSec)
124        {
125            if (StartPoint.X != EndPoint.X &&
126                StartPoint.Y != EndPoint.Y)
127            {
128                return false;
129            }
130            if (StartPointSec.X != EndPointSec.X &&
131                StartPointSec.Y != EndPointSec.Y)
132            {
133                return false;
134            }
135
136            // parallel
137            if (StartPoint.X == EndPoint.X && StartPointSec.X == EndPointSec.X ||
138                StartPoint.Y == EndPoint.Y && StartPointSec.Y == EndPointSec.Y)
139            {
140                return false;
141            }
142            else
143            {
144                // orthonogal
145                Point up, down, left, right;
146                if (StartPoint.X == EndPoint.X)
147                {
148                    up = StartPoint;
149                    down = EndPoint;
150                    left = StartPointSec;
151                    right = EndPointSec;
152                }
153                else
154                {
155                    up = StartPointSec;
156                    down = EndPointSec;
157                    left = StartPoint;
158                    right = EndPoint;
159                }
160
161                if (up.Y < down.Y)
162                {
163                    double swap = up.Y;
164                    up.Y = down.Y;
165                    down.Y = swap;
166                }
167
168                if (left.X > right.X)
169                {
170                    double swap = left.X;
171                    left.X = right.X;
172                    right.X = swap;
173                }
174                   
175                if(isBetween(down.Y, up.Y, left.Y) && isBetween(left.X, right.X, up.X))
176                {
177                    if (StartPoint.Y == StartPointSec.Y
178                        && (((StartPoint.X >= StartPointSec.X && StartPointSec.X >= EndPoint.X))
179                        || ((StartPoint.X <= StartPointSec.X && StartPointSec.X <= EndPoint.X))))
180                    {
181                        intersectPoint = new IntersectPoint(new Point(up.X, left.Y), IntersectPointMode.NormalIntersect);
182                    }
183                    else
184                    {
185                        intersectPoint = new IntersectPoint(new Point(up.X, left.Y), IntersectPointMode.NormalIntersect);
186                    }
187                    return true;
188                }
189                return false;
190            }
191        }
192
193                private void internalGeometryDraw(StreamGeometryContext context)
194                {
195            makeOrthogonalPoints();
196            foreach (var element in (Parent as Panel).Children)
197            {
198                if (element is CryptoLineView && !element.Equals(this))
199                {
200                    CryptoLineView result = element as CryptoLineView;
201                    foreach (FromTo fromTo in pointList)
202                    {
203                        foreach (FromTo resultFromTo in result.pointList)
204                        {
205                            if (findIntersection(fromTo.From, fromTo.To, resultFromTo.From, resultFromTo.To))
206                            {
207                                fromTo.Intersection.Add(intersectPoint);
208
209                                if (fromTo.DirSort == DirSort.Y_ASC || fromTo.DirSort == DirSort.Y_DESC)
210                                    this.UpdateList.Add(result);
211                            }
212                        }
213                    }
214                }
215            }
216
217            context.BeginFigure(StartPoint, true, false);
218
219            foreach (FromTo fromTo in pointList)
220            {
221                if (fromTo.Intersection.Count > 0)
222                {
223                    foreach (IntersectPoint interPoint in fromTo.Intersection)
224                    {
225                        switch (fromTo.DirSort)
226                        {
227                            case DirSort.X_ASC:
228                                if (intersectPoint.Mode == IntersectPointMode.NormalIntersect)
229                                {
230                                    context.LineTo(new Point(interPoint.Point.X - offset, interPoint.Point.Y), true, true);
231                                    context.QuadraticBezierTo(new Point(interPoint.Point.X, interPoint.Point.Y - offset), new Point(interPoint.Point.X + offset, interPoint.Point.Y), true, true);
232                                }
233                                else if (intersectPoint.Mode == IntersectPointMode.InnerIntersect)
234                                {
235                                    context.LineTo(new Point(interPoint.Point.X - 4, interPoint.Point.Y), true, true);
236                                    context.QuadraticBezierTo(new Point(interPoint.Point.X, interPoint.Point.Y - 5), new Point(interPoint.Point.X + 4, interPoint.Point.Y), true, true);
237                                    context.QuadraticBezierTo(new Point(interPoint.Point.X, interPoint.Point.Y + 5), new Point(interPoint.Point.X - 4, interPoint.Point.Y), true, true);
238                                }
239                                break;
240                            case DirSort.X_DESC:
241                                if (intersectPoint.Mode == IntersectPointMode.NormalIntersect)
242                                {
243                                    context.LineTo(new Point(interPoint.Point.X + offset, interPoint.Point.Y), true, true);
244                                    context.QuadraticBezierTo(new Point(interPoint.Point.X, interPoint.Point.Y - offset), new Point(interPoint.Point.X - offset, interPoint.Point.Y), true, true);
245                                }
246                                else if (intersectPoint.Mode == IntersectPointMode.InnerIntersect)
247                                {
248                                    context.LineTo(new Point(interPoint.Point.X + 4, interPoint.Point.Y), true, true);
249                                    context.QuadraticBezierTo(new Point(interPoint.Point.X, interPoint.Point.Y - 5), new Point(interPoint.Point.X - 4, interPoint.Point.Y), true, true);
250                                    context.QuadraticBezierTo(new Point(interPoint.Point.X, interPoint.Point.Y + 5), new Point(interPoint.Point.X + 4, interPoint.Point.Y), true, true);
251                                }
252                                break;
253                            //case DirSort.Y_ASC:
254                            //    context.LineTo(new Point(interPoint.X, interPoint.Y - offset), true, true);
255                            //    context.QuadraticBezierTo(new Point(interPoint.X + offset, interPoint.Y), new Point(interPoint.X, interPoint.Y + offset), true, true);
256                            //    break;
257                            //case DirSort.Y_DESC:
258                            //    context.LineTo(new Point(interPoint.X, interPoint.Y + offset), true, true);
259                            //    context.QuadraticBezierTo(new Point(interPoint.X + offset, interPoint.Y), new Point(interPoint.X, interPoint.Y - offset), true, true);
260                            //    break;
261                        }
262                    }
263                    context.LineTo(fromTo.To, true, true);
264                }
265                else
266                {
267                    context.LineTo(fromTo.To, true, true);
268                }
269            }
270        }
271
272        private void makeOrthogonalPoints()
273        {
274            if (StartPoint.X < EndPoint.X)
275            {
276                pointList.Clear();
277                pointList.Add(new FromTo(StartPoint, new Point((EndPoint.X + StartPoint.X) / 2, StartPoint.Y)));
278                pointList.Add(new FromTo(new Point((EndPoint.X + StartPoint.X) / 2, StartPoint.Y), new Point((EndPoint.X + StartPoint.X) / 2, EndPoint.Y)));
279                pointList.Add(new FromTo(new Point((EndPoint.X + StartPoint.X) / 2, EndPoint.Y), EndPoint));
280            }
281            else
282            {
283                if (StartPoint.X > EndPoint.X)
284                {
285                    pointList.Clear();
286                    pointList.Add(new FromTo(StartPoint, new Point((StartPoint.X + EndPoint.X) / 2, StartPoint.Y)));
287                    pointList.Add(new FromTo(new Point((StartPoint.X + EndPoint.X) / 2, StartPoint.Y), new Point((StartPoint.X + EndPoint.X) / 2, EndPoint.Y)));
288                    pointList.Add(new FromTo(new Point((StartPoint.X + EndPoint.X) / 2, EndPoint.Y), EndPoint));
289                }
290            }
291        }
292               
293                #endregion
294
295        #region IUpdateableView Members
296
297        public void update()
298        {
299            Stroke = Brushes.Green;
300        }
301
302        #endregion
303
304        internal void Reset()
305        {
306            Color color = ColorHelper.GetColor(Model.ConnectionType);
307            Stroke = new SolidColorBrush(color);
308        }
309    }
310}
Note: See TracBrowser for help on using the repository browser.