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

Last change on this file since 1617 was 1617, checked in by kopal, 12 years ago
  • a delete of a plugin now leads to the delete of all left connections
  • added a first version of a Settings to the WorkspaceManager
  • some small bug fixes
File size: 6.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;
12
13namespace WorkspaceManager.View.VisualComponents
14{
15        public sealed class CryptoLineView : Shape, IConnection, IUpdateableView
16    {
17        #region Variables
18
19        private Point iPoint = new Point();
20
21        private ConnectionModel model;
22        public ConnectionModel Model
23        {
24            get { return model; }
25            private set { model = value; }
26        }
27        private static double offset = 10;
28
29        #endregion
30
31        #region Dependency Properties
32
33        public static readonly DependencyProperty StartPointProperty = DependencyProperty.Register("StartPoint", typeof(Point), typeof(CryptoLineView), new FrameworkPropertyMetadata(new Point(0, 0), FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
34        public static readonly DependencyProperty EndPointProperty = DependencyProperty.Register("EndPoint", typeof(Point), typeof(CryptoLineView), new FrameworkPropertyMetadata(new Point(0, 0), FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
35
36                #endregion
37
38                #region CLR Properties
39
40        public Point StartPoint
41        {
42            get { return (Point)GetValue(StartPointProperty); }
43            set { SetValue(StartPointProperty, value); }
44        }
45
46        public Point EndPoint
47        {
48            get { return (Point)GetValue(EndPointProperty); }
49            set { SetValue(EndPointProperty, value); }
50        }
51
52                #endregion
53
54
55
56        public CryptoLineView()
57        {
58            Stroke = Brushes.Black;
59            StrokeThickness = 2;
60        }
61
62        public CryptoLineView(ConnectionModel connectionModel) : this()
63        {
64            this.Model = connectionModel;
65            Color color = ColorHelper.getColor(connectionModel.ConnectionType);
66            Stroke = new SolidColorBrush(color);
67            StrokeThickness = 2;
68        }
69
70                #region Overrides
71
72                protected override Geometry DefiningGeometry
73                {
74                        get
75                        {
76                                StreamGeometry geometry = new StreamGeometry();
77                                geometry.FillRule = FillRule.EvenOdd;
78
79                                using (StreamGeometryContext context = geometry.Open())
80                                {
81                    internalGeometryDraw(context);
82                                }
83
84                                geometry.Freeze();
85                                return geometry;
86                        }
87                }               
88
89                #endregion
90
91                #region Privates
92        private bool isBetween(double min, double max, double between)
93        {
94            return min <= between && between <= max;
95        }
96
97        private bool findIntersection(Point StartPoint, Point EndPoint, Point StartPointSec, Point EndPointSec)
98        {
99            if (StartPoint.X != EndPoint.X &&
100                StartPoint.Y != EndPoint.Y)
101            {
102                return false;
103            }
104            if (StartPointSec.X != EndPointSec.X &&
105                StartPointSec.Y != EndPointSec.Y)
106            {
107                return false;
108            }
109
110            // parallel
111            if (StartPoint.X == EndPoint.X && StartPointSec.X == EndPointSec.X ||
112                StartPoint.Y == EndPoint.Y && StartPointSec.Y == EndPointSec.Y)
113            {
114                return false;
115            }
116            else
117            {
118                // orthonogal
119                Point up, down, left, right;
120                if (StartPoint.X == EndPoint.X)
121                {
122                    up = StartPoint;
123                    down = EndPoint;
124                    left = StartPointSec;
125                    right = EndPointSec;
126                }
127                else
128                {
129                    up = StartPointSec;
130                    down = EndPointSec;
131                    left = StartPoint;
132                    right = EndPoint;
133                }
134
135                if (up.Y < down.Y)
136                {
137                    double swap = up.Y;
138                    up.Y = down.Y;
139                    down.Y = swap;
140                }
141
142                if (left.X > right.X)
143                {
144                    double swap = left.X;
145                    left.X = right.X;
146                    right.X = swap;
147                }
148                   
149                if(isBetween(down.Y, up.Y, left.Y) &&
150                    isBetween(left.X, right.X, up.X))
151                {
152                    iPoint = new Point(up.X, left.Y);
153                    return true;
154                }
155                return false;
156            }
157        }
158
159                private void internalGeometryDraw(StreamGeometryContext context)
160                {
161            double theta = Math.Atan2(StartPoint.Y - EndPoint.Y, StartPoint.X - EndPoint.X);
162                        double sint = Math.Sin(theta);
163                        double cost = Math.Cos(theta);
164
165            context.BeginFigure(StartPoint, true, false);
166
167            foreach (var element in (Parent as Panel).Children)
168            {
169                if (element is CryptoLineView && !element.Equals(this))
170                {
171                    if (findIntersection(StartPoint, EndPoint, (element as CryptoLineView).StartPoint, (element as CryptoLineView).EndPoint))
172                    {
173                        if (StartPoint.X == EndPoint.X)
174                        {
175                            context.LineTo(new Point(iPoint.X, iPoint.Y - offset), true, true);
176                            context.QuadraticBezierTo(new Point(iPoint.X + offset, iPoint.Y), new Point(iPoint.X, iPoint.Y + offset), true, true);
177                            continue;
178                        }
179                        if (StartPoint.Y == EndPoint.Y)
180                        {
181                            context.LineTo(new Point(iPoint.X - offset, iPoint.Y), true, true);
182                            context.QuadraticBezierTo(new Point(iPoint.X, iPoint.Y + offset), new Point(iPoint.X + offset, iPoint.Y), true, true);
183                            continue;
184                        }
185                    }
186                }
187            }
188
189            //Point pt3 = new Point(
190            //    pt05.X + ( cost - offset * sint),
191            //    pt05.Y + ( sint + offset * cost));
192            context.LineTo(EndPoint, true, true);
193                }
194               
195                #endregion
196
197        #region IUpdateableView Members
198
199        public void update()
200        {
201           
202        }
203
204        #endregion
205    }
206}
Note: See TracBrowser for help on using the repository browser.