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

Last change on this file since 1802 was 1802, checked in by kopal, 11 years ago

some fixes of ExecutionEngine and view

File size: 12.5 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                if (this.model != null && !this.model.WorkspaceModel.WorkspaceManagerEditor.isExecuting())
85                {
86                    this.model.WorkspaceModel.deleteConnectionModel(this.model);
87                }
88            }           
89        }
90
91        public CryptoLineView(ConnectionModel connectionModel) : this()
92        {
93            this.Model = connectionModel;
94            Color color = ColorHelper.GetColor(connectionModel.ConnectionType);
95            Stroke = new SolidColorBrush(color);
96            StrokeThickness = 2;
97        }
98
99                #region Overrides
100
101                protected override Geometry DefiningGeometry
102                {
103                        get
104                        {
105                                StreamGeometry geometry = new StreamGeometry();
106                                geometry.FillRule = FillRule.EvenOdd;
107
108                                using (StreamGeometryContext context = geometry.Open())
109                                {
110                    internalGeometryDraw(context);
111                                }
112
113                                geometry.Freeze();
114                                return geometry;
115                        }
116                }               
117
118                #endregion
119
120                #region Privates
121        private bool isBetween(double min, double max, double between)
122        {
123            return min <= between && between <= max;
124        }
125
126        private bool findIntersection(Point StartPoint, Point EndPoint, Point StartPointSec, Point EndPointSec)
127        {
128            if (StartPoint.X != EndPoint.X &&
129                StartPoint.Y != EndPoint.Y)
130            {
131                return false;
132            }
133            if (StartPointSec.X != EndPointSec.X &&
134                StartPointSec.Y != EndPointSec.Y)
135            {
136                return false;
137            }
138
139            // parallel
140            if (StartPoint.X == EndPoint.X && StartPointSec.X == EndPointSec.X ||
141                StartPoint.Y == EndPoint.Y && StartPointSec.Y == EndPointSec.Y)
142            {
143                return false;
144            }
145            else
146            {
147                // orthonogal
148                Point up, down, left, right;
149                if (StartPoint.X == EndPoint.X)
150                {
151                    up = StartPoint;
152                    down = EndPoint;
153                    left = StartPointSec;
154                    right = EndPointSec;
155                }
156                else
157                {
158                    up = StartPointSec;
159                    down = EndPointSec;
160                    left = StartPoint;
161                    right = EndPoint;
162                }
163
164                if (up.Y < down.Y)
165                {
166                    double swap = up.Y;
167                    up.Y = down.Y;
168                    down.Y = swap;
169                }
170
171                if (left.X > right.X)
172                {
173                    double swap = left.X;
174                    left.X = right.X;
175                    right.X = swap;
176                }
177                   
178                if(isBetween(down.Y, up.Y, left.Y) && isBetween(left.X, right.X, up.X))
179                {
180                    if (StartPoint.Y == StartPointSec.Y
181                        && (((StartPoint.X >= StartPointSec.X && StartPointSec.X >= EndPoint.X))
182                        || ((StartPoint.X <= StartPointSec.X && StartPointSec.X <= EndPoint.X))))
183                    {
184                        intersectPoint = new IntersectPoint(new Point(up.X, left.Y), IntersectPointMode.NormalIntersect);
185                    }
186                    else
187                    {
188                        intersectPoint = new IntersectPoint(new Point(up.X, left.Y), IntersectPointMode.NormalIntersect);
189                    }
190                    return true;
191                }
192                return false;
193            }
194        }
195
196                private void internalGeometryDraw(StreamGeometryContext context)
197                {
198            makeOrthogonalPoints();
199            foreach (var element in (Parent as Panel).Children)
200            {
201                if (element is CryptoLineView && !element.Equals(this))
202                {
203                    CryptoLineView result = element as CryptoLineView;
204                    foreach (FromTo fromTo in pointList)
205                    {
206                        foreach (FromTo resultFromTo in result.pointList)
207                        {
208                            if (findIntersection(fromTo.From, fromTo.To, resultFromTo.From, resultFromTo.To))
209                            {
210                                fromTo.Intersection.Add(intersectPoint);
211
212                                if (fromTo.DirSort == DirSort.Y_ASC || fromTo.DirSort == DirSort.Y_DESC)
213                                    this.UpdateList.Add(result);
214                            }
215                        }
216                    }
217                }
218            }
219
220            context.BeginFigure(StartPoint, true, false);
221
222            foreach (FromTo fromTo in pointList)
223            {
224                if (fromTo.Intersection.Count > 0)
225                {
226                    foreach (IntersectPoint interPoint in fromTo.Intersection)
227                    {
228                        switch (fromTo.DirSort)
229                        {
230                            case DirSort.X_ASC:
231                                if (intersectPoint.Mode == IntersectPointMode.NormalIntersect)
232                                {
233                                    context.LineTo(new Point(interPoint.Point.X - offset, interPoint.Point.Y), true, true);
234                                    context.QuadraticBezierTo(new Point(interPoint.Point.X, interPoint.Point.Y - offset), new Point(interPoint.Point.X + offset, interPoint.Point.Y), true, true);
235                                }
236                                else if (intersectPoint.Mode == IntersectPointMode.InnerIntersect)
237                                {
238                                    context.LineTo(new Point(interPoint.Point.X - 4, interPoint.Point.Y), true, true);
239                                    context.QuadraticBezierTo(new Point(interPoint.Point.X, interPoint.Point.Y - 5), new Point(interPoint.Point.X + 4, interPoint.Point.Y), true, true);
240                                    context.QuadraticBezierTo(new Point(interPoint.Point.X, interPoint.Point.Y + 5), new Point(interPoint.Point.X - 4, interPoint.Point.Y), true, true);
241                                }
242                                break;
243                            case DirSort.X_DESC:
244                                if (intersectPoint.Mode == IntersectPointMode.NormalIntersect)
245                                {
246                                    context.LineTo(new Point(interPoint.Point.X + offset, interPoint.Point.Y), true, true);
247                                    context.QuadraticBezierTo(new Point(interPoint.Point.X, interPoint.Point.Y - offset), new Point(interPoint.Point.X - offset, interPoint.Point.Y), true, true);
248                                }
249                                else if (intersectPoint.Mode == IntersectPointMode.InnerIntersect)
250                                {
251                                    context.LineTo(new Point(interPoint.Point.X + 4, interPoint.Point.Y), true, true);
252                                    context.QuadraticBezierTo(new Point(interPoint.Point.X, interPoint.Point.Y - 5), new Point(interPoint.Point.X - 4, interPoint.Point.Y), true, true);
253                                    context.QuadraticBezierTo(new Point(interPoint.Point.X, interPoint.Point.Y + 5), new Point(interPoint.Point.X + 4, interPoint.Point.Y), true, true);
254                                }
255                                break;
256                            //case DirSort.Y_ASC:
257                            //    context.LineTo(new Point(interPoint.X, interPoint.Y - offset), true, true);
258                            //    context.QuadraticBezierTo(new Point(interPoint.X + offset, interPoint.Y), new Point(interPoint.X, interPoint.Y + offset), true, true);
259                            //    break;
260                            //case DirSort.Y_DESC:
261                            //    context.LineTo(new Point(interPoint.X, interPoint.Y + offset), true, true);
262                            //    context.QuadraticBezierTo(new Point(interPoint.X + offset, interPoint.Y), new Point(interPoint.X, interPoint.Y - offset), true, true);
263                            //    break;
264                        }
265                    }
266                    context.LineTo(fromTo.To, true, true);
267                }
268                else
269                {
270                    context.LineTo(fromTo.To, true, true);
271                }
272            }
273        }
274
275        private void makeOrthogonalPoints()
276        {
277            if (StartPoint.X < EndPoint.X)
278            {
279                pointList.Clear();
280                pointList.Add(new FromTo(StartPoint, new Point((EndPoint.X + StartPoint.X) / 2, StartPoint.Y)));
281                pointList.Add(new FromTo(new Point((EndPoint.X + StartPoint.X) / 2, StartPoint.Y), new Point((EndPoint.X + StartPoint.X) / 2, EndPoint.Y)));
282                pointList.Add(new FromTo(new Point((EndPoint.X + StartPoint.X) / 2, EndPoint.Y), EndPoint));
283            }
284            else
285            {
286                if (StartPoint.X > EndPoint.X)
287                {
288                    pointList.Clear();
289                    pointList.Add(new FromTo(StartPoint, new Point((StartPoint.X + EndPoint.X) / 2, StartPoint.Y)));
290                    pointList.Add(new FromTo(new Point((StartPoint.X + EndPoint.X) / 2, StartPoint.Y), new Point((StartPoint.X + EndPoint.X) / 2, EndPoint.Y)));
291                    pointList.Add(new FromTo(new Point((StartPoint.X + EndPoint.X) / 2, EndPoint.Y), EndPoint));
292                }
293            }
294        }
295               
296                #endregion
297
298        #region IUpdateableView Members
299
300        public void update()
301        {
302            Stroke = Brushes.Green;
303        }
304
305        #endregion
306
307        internal void Reset()
308        {
309            Color color = ColorHelper.GetColor(Model.ConnectionType);
310            Stroke = new SolidColorBrush(color);
311        }
312    }
313}
Note: See TracBrowser for help on using the repository browser.