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

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

-added loading from Model
-added several images
-added Connector data presentation
-several style changes

File size: 9.2 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;
14
15namespace WorkspaceManager.View.VisualComponents
16{
17        public sealed class CryptoLineView : Shape, IConnection, IUpdateableView
18    {
19        #region Variables
20
21        private Point iPoint = new Point();
22        private List<FromTo> pointList = new List<FromTo>();
23
24        private ConnectionModel model;
25        public ConnectionModel Model
26        {
27            get { return model; }
28            private set { model = value; }
29        }
30        private static double offset = 10;
31
32        #endregion
33
34        #region Dependency Properties
35
36        public static readonly DependencyProperty StartPointProperty = DependencyProperty.Register("StartPoint", typeof(Point), typeof(CryptoLineView), new FrameworkPropertyMetadata(new Point(0, 0), FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
37        public static readonly DependencyProperty EndPointProperty = DependencyProperty.Register("EndPoint", typeof(Point), typeof(CryptoLineView), new FrameworkPropertyMetadata(new Point(0, 0), FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
38
39                #endregion
40
41                #region CLR Properties
42
43        public Point StartPoint
44        {
45            get { return (Point)GetValue(StartPointProperty); }
46            set { SetValue(StartPointProperty, value); }
47        }
48
49        public Point EndPoint
50        {
51            get { return (Point)GetValue(EndPointProperty); }
52            set { SetValue(EndPointProperty, value); }
53        }
54
55                #endregion
56
57
58
59        public CryptoLineView()
60        {
61            Stroke = Brushes.Black;
62            StrokeThickness = 2;
63        }
64
65        public CryptoLineView(ConnectionModel connectionModel) : this()
66        {
67            this.Model = connectionModel;
68            Color color = ColorHelper.GetColor(connectionModel.ConnectionType);
69            Stroke = new SolidColorBrush(color);
70            StrokeThickness = 2;
71        }
72
73                #region Overrides
74
75                protected override Geometry DefiningGeometry
76                {
77                        get
78                        {
79                                StreamGeometry geometry = new StreamGeometry();
80                                geometry.FillRule = FillRule.EvenOdd;
81
82                                using (StreamGeometryContext context = geometry.Open())
83                                {
84                    internalGeometryDraw(context);
85                                }
86
87                                geometry.Freeze();
88                                return geometry;
89                        }
90                }               
91
92                #endregion
93
94                #region Privates
95        private bool isBetween(double min, double max, double between)
96        {
97            return min <= between && between <= max;
98        }
99
100        private bool findIntersection(Point StartPoint, Point EndPoint, Point StartPointSec, Point EndPointSec)
101        {
102            if (StartPoint.X != EndPoint.X &&
103                StartPoint.Y != EndPoint.Y)
104            {
105                return false;
106            }
107            if (StartPointSec.X != EndPointSec.X &&
108                StartPointSec.Y != EndPointSec.Y)
109            {
110                return false;
111            }
112
113            // parallel
114            if (StartPoint.X == EndPoint.X && StartPointSec.X == EndPointSec.X ||
115                StartPoint.Y == EndPoint.Y && StartPointSec.Y == EndPointSec.Y)
116            {
117                return false;
118            }
119            else
120            {
121                // orthonogal
122                Point up, down, left, right;
123                if (StartPoint.X == EndPoint.X)
124                {
125                    up = StartPoint;
126                    down = EndPoint;
127                    left = StartPointSec;
128                    right = EndPointSec;
129                }
130                else
131                {
132                    up = StartPointSec;
133                    down = EndPointSec;
134                    left = StartPoint;
135                    right = EndPoint;
136                }
137
138                if (up.Y < down.Y)
139                {
140                    double swap = up.Y;
141                    up.Y = down.Y;
142                    down.Y = swap;
143                }
144
145                if (left.X > right.X)
146                {
147                    double swap = left.X;
148                    left.X = right.X;
149                    right.X = swap;
150                }
151                   
152                if(isBetween(down.Y, up.Y, left.Y) &&
153                    isBetween(left.X, right.X, up.X))
154                {
155                    iPoint = new Point(up.X, left.Y);
156                    return true;
157                }
158                return false;
159            }
160        }
161
162                private void internalGeometryDraw(StreamGeometryContext context)
163                {
164            double theta = Math.Atan2(StartPoint.Y - EndPoint.Y, StartPoint.X - EndPoint.X);
165                        double sint = Math.Sin(theta);
166                        double cost = Math.Cos(theta);
167
168            makeOrthogonalPoints();
169            foreach (var element in (Parent as Panel).Children)
170            {
171                if (element is CryptoLineView && !element.Equals(this))
172                {
173                    CryptoLineView result = element as CryptoLineView;
174                    foreach (FromTo fromTo in pointList)
175                    {
176                        foreach (FromTo resultFromTo in result.pointList)
177                        {
178                            if (findIntersection(fromTo.From, fromTo.To, resultFromTo.From, resultFromTo.To))
179                            {
180                                fromTo.Intersection.Add(iPoint);
181                            }
182                        }
183                    }
184                    //result.InvalidateMeasure();
185                }
186            }
187
188
189
190            context.BeginFigure(StartPoint, true, false);
191
192            foreach (FromTo fromTo in pointList)
193            {
194                if (fromTo.Intersection.Count > 0)
195                {
196                    foreach (Point interPoint in fromTo.Intersection)
197                    {
198                        switch (fromTo.DirSort)
199                        {
200                            case DirSort.X_ASC:
201                                context.LineTo(new Point(interPoint.X - offset, interPoint.Y), true, true);
202                                context.QuadraticBezierTo(new Point(interPoint.X, interPoint.Y + offset), new Point(interPoint.X + offset, interPoint.Y), true, true);
203                                break;
204                            case DirSort.X_DESC:
205                                context.LineTo(new Point(interPoint.X + offset, interPoint.Y), true, true);
206                                context.QuadraticBezierTo(new Point(interPoint.X, interPoint.Y + offset), new Point(interPoint.X - offset, interPoint.Y), true, true);
207                                break;
208                            case DirSort.Y_ASC:
209                                context.LineTo(new Point(interPoint.X, interPoint.Y - offset), true, true);
210                                context.QuadraticBezierTo(new Point(interPoint.X + offset, interPoint.Y), new Point(interPoint.X, interPoint.Y + offset), true, true);
211                                break;
212                            case DirSort.Y_DESC:
213                                context.LineTo(new Point(interPoint.X, interPoint.Y + offset), true, true);
214                                context.QuadraticBezierTo(new Point(interPoint.X + offset, interPoint.Y), new Point(interPoint.X, interPoint.Y - offset), true, true);
215                                break;
216                        }
217                    }
218                    context.LineTo(fromTo.To, true, true);
219                }
220                else
221                {
222                    context.LineTo(fromTo.To, true, true);
223                }
224            }
225                }
226
227        private void makeOrthogonalPoints()
228        {
229            if (StartPoint.X < EndPoint.X)
230            {
231                pointList.Clear();
232                pointList.Add(new FromTo(StartPoint, new Point((EndPoint.X + StartPoint.X) / 2, StartPoint.Y)));
233                pointList.Add(new FromTo(new Point((EndPoint.X + StartPoint.X) / 2, StartPoint.Y), new Point((EndPoint.X + StartPoint.X) / 2, EndPoint.Y)));
234                pointList.Add(new FromTo(new Point((EndPoint.X + StartPoint.X) / 2, EndPoint.Y), EndPoint));
235            }
236            else
237            {
238                if (StartPoint.X > EndPoint.X)
239                {
240                    pointList.Clear();
241                    pointList.Add(new FromTo(StartPoint, new Point((StartPoint.X + EndPoint.X) / 2, StartPoint.Y)));
242                    pointList.Add(new FromTo(new Point((StartPoint.X + EndPoint.X) / 2, StartPoint.Y), new Point((StartPoint.X + EndPoint.X) / 2, EndPoint.Y)));
243                    pointList.Add(new FromTo(new Point((StartPoint.X + EndPoint.X) / 2, EndPoint.Y), EndPoint));
244                }
245            }
246        }
247               
248                #endregion
249
250        #region IUpdateableView Members
251
252        public void update()
253        {
254            Stroke = Brushes.Green;
255        }
256
257        #endregion
258    }
259}
Note: See TracBrowser for help on using the repository browser.