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

Last change on this file since 1760 was 1760, checked in by matkovic, 11 years ago

-Style changes
-Images added
-Various changes

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