source: trunk/CrypPlugins/Enigma/Walze.cs @ 2701

Last change on this file since 2701 was 2701, checked in by weyers, 11 years ago

EnigmaPresentation Settings synchronisation and start on play update and bugfixes, Pictures updated as .png, Rotor2 synchronisation update, Reflector bugfix

File size: 11.3 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Windows;
6using System.Windows.Controls;
7using System.Windows.Data;
8using System.Windows.Documents;
9using System.Windows.Input;
10using System.Windows.Media;
11using System.Windows.Media.Imaging;
12using System.Windows.Navigation;
13using System.Windows.Shapes;
14using System.Windows.Media.Animation;
15using System.Threading;
16
17namespace Cryptool.Enigma
18{
19
20    class Walze : Canvas
21    {
22        int[] umkehrlist1 = { 4, 9, 12, 25, 0, 11, 24, 23, 21, 1, 22, 5, 2, 17, 16, 20, 14, 13, 19, 18, 15, 8, 10, 7, 6, 3 };
23        int[] umkehrlist2 = { 24, 17, 20, 7, 16, 18, 11, 3, 15, 23, 13, 6, 14, 10, 12, 8, 4, 1, 5, 25, 2, 22, 21, 9, 0, 19 };
24        int[] umkehrlist3 = { 5, 21, 15, 9, 8, 0, 14, 24, 4, 3, 17, 25, 23, 22, 6, 2, 19, 10, 20, 16, 18, 1, 13, 12, 7, 11 };
25        TextBlock[] tebo = new TextBlock[26];
26        Line[,] larray = new Line[26, 3];
27        List<Line> linesToAnimat = new List<Line>();
28        List<Line> trashList = new List<Line>();
29        public double fast = 400;
30        TextBlock[] teboToAnimat = new TextBlock[2];
31        public readonly int typ;
32        public TextBlock iAm = new TextBlock();
33
34        Boolean wrong;
35
36        public event EventHandler helpNextAnimation;
37        public int[] umkehrlist;
38
39        public int umkehrlist0(int x, Boolean off)
40        {
41            resetColors();
42            if (off)
43            {
44                tebo[x].Background = Brushes.Green;
45                tebo[umkehrlist[x]].Background = Brushes.Red;
46            }
47            teboToAnimat[0] = tebo[x];
48            teboToAnimat[1] = tebo[umkehrlist[x]];
49
50
51            larray[x, 0].Stroke = Brushes.Red;
52            larray[x, 1].Stroke = Brushes.Red;
53            larray[x, 2].Stroke = Brushes.Red;
54
55            larray[umkehrlist[x], 0].Stroke = Brushes.Green;
56            larray[umkehrlist[x], 1].Stroke = Brushes.Green;
57            larray[umkehrlist[x], 2].Stroke = Brushes.Green;
58
59
60            if (umkehrlist[x] > x)
61            {
62                wrong = true;
63                if (larray[x, 1].Parent == this)
64                {
65                    linesToAnimat.Add(larray[x, 0]);
66                    linesToAnimat.Add(larray[x, 1]);
67                    linesToAnimat.Add(larray[x, 2]);
68
69                }
70
71                else
72                {
73                    linesToAnimat.Add(larray[umkehrlist[x], 0]);
74                    linesToAnimat.Add(larray[umkehrlist[x], 1]);
75                    linesToAnimat.Add(larray[umkehrlist[x], 2]);
76                }
77            }
78
79            else
80            {
81                wrong = false;
82                if (larray[x, 1].Parent == this)
83                {
84
85
86                    linesToAnimat.Add(larray[x, 2]);
87                    linesToAnimat.Add(larray[x, 1]);
88                    linesToAnimat.Add(larray[x, 0]);
89                }
90
91                else
92                {
93
94
95                    linesToAnimat.Add(larray[umkehrlist[x], 2]);
96                    linesToAnimat.Add(larray[umkehrlist[x], 1]);
97                    linesToAnimat.Add(larray[umkehrlist[x], 0]);
98                }
99            }
100
101            return umkehrlist[x];
102        }
103
104        private void helpNextAnimationMethod(object sender, EventArgs e)
105        {
106            if (counter == 3)
107            {
108                helpNextAnimation(this, EventArgs.Empty);
109
110            }
111            else
112            {
113                if (counter == 2)
114                {
115                    animateThisLineReverse(linesToAnimat[counter]);
116                    animateThisTebo(teboToAnimat[1], false);
117                }
118                else
119                {
120                    if (wrong)
121                        animateThisLineReverse(linesToAnimat[counter]);
122                    else
123                        animateThisLine(linesToAnimat[counter]);
124
125                }
126                counter++;
127            }
128        }
129
130        private int counter = 0;
131
132        public void startanimation()
133        {
134            counter = 1;
135            animateThisLine(linesToAnimat[0]);
136            animateThisTebo(teboToAnimat[0], true);
137
138        }
139
140        private void animateThisTebo(TextBlock tebo, Boolean c)
141        {
142            SolidColorBrush brush = new SolidColorBrush();
143            brush.Color = Colors.Transparent;
144
145            ColorAnimation colorAni = new ColorAnimation();
146            colorAni.From = Colors.SkyBlue;
147            if (tebo.Background == Brushes.LightSeaGreen)
148                colorAni.From = Colors.LightSeaGreen;
149            if (c)
150                colorAni.To = Colors.YellowGreen;
151            else
152                colorAni.To = Colors.Tomato;
153            colorAni.Duration = new Duration(TimeSpan.FromMilliseconds(fast));
154
155            tebo.Background = brush;
156            brush.BeginAnimation(SolidColorBrush.ColorProperty, colorAni);
157        }
158
159        private void animateThisLineReverse(Line l)
160        {
161
162            //resetColors();
163
164            Line l1 = new Line();
165
166            Canvas.SetLeft(l, Canvas.GetLeft(l));
167
168            Canvas.SetTop(l, Canvas.GetTop(l));
169
170            l1.StrokeThickness = 5.0;
171            l1.Stroke = Brushes.Tomato;
172
173
174            l1.X1 = l.X2;
175            l1.X2 = l.X2;
176            DoubleAnimation mydouble1 = new DoubleAnimation();
177
178
179            l1.Y1 = l.Y2;
180            l1.Y2 = l.Y2;
181
182
183            mydouble1.From = l.Y2;
184            mydouble1.To = l.Y1;
185            mydouble1.Duration = new Duration(TimeSpan.FromMilliseconds((fast)));
186
187
188
189            DoubleAnimation mydouble = new DoubleAnimation();
190            mydouble.From = l.X2;
191            mydouble.To = l.X1;
192            mydouble.Duration = new Duration(TimeSpan.FromMilliseconds((fast)));
193            mydouble.Completed += helpNextAnimationMethod;
194
195
196            this.Children.Add(l1);
197
198            l1.BeginAnimation(Line.X2Property, mydouble);
199            l1.BeginAnimation(Line.Y2Property, mydouble1);
200
201            trashList.Add(l1);
202        }
203
204        private void animateThisLine(Line l)
205        {
206
207            //resetColors();
208
209            Line l1 = new Line();
210
211            Canvas.SetLeft(l, Canvas.GetLeft(l));
212
213            Canvas.SetTop(l, Canvas.GetTop(l));
214
215            l1.StrokeThickness = 5.0;
216            l1.Stroke = Brushes.LawnGreen;
217
218
219            l1.X1 = l.X1;
220            l1.X2 = l.X1;
221            DoubleAnimation mydouble1 = new DoubleAnimation();
222
223
224            l1.Y1 = l.Y1;
225            l1.Y2 = l.Y1;
226
227
228            mydouble1.From = l.Y1;
229            mydouble1.To = l.Y2;
230            mydouble1.Duration = new Duration(TimeSpan.FromMilliseconds((fast)));
231
232
233
234            DoubleAnimation mydouble = new DoubleAnimation();
235            mydouble.From = l.X1;
236            mydouble.To = l.X2;
237            mydouble.Duration = new Duration(TimeSpan.FromMilliseconds((fast)));
238            mydouble.Completed += helpNextAnimationMethod;
239
240
241            this.Children.Add(l1);
242
243            l1.BeginAnimation(Line.X2Property, mydouble);
244            l1.BeginAnimation(Line.Y2Property, mydouble1);
245
246            trashList.Add(l1);
247        }
248
249        public void resetColors()
250        {
251            foreach (Line l in trashList)
252            {
253                this.Children.Remove(l);
254                //l.Opacity = 0.0;
255            }
256            trashList.Clear();
257            linesToAnimat.Clear();
258            for (int i = 0; i < tebo.GetLength(0); i++)
259            {
260                tebo[i].Background = Brushes.SkyBlue;
261
262                if (i % 2 == 0)
263                    tebo[i].Background = Brushes.LightSeaGreen;
264
265
266            }
267            foreach (Line l in larray)
268            {
269                l.Stroke = Brushes.Black;
270            }
271        }
272
273        public Walze(int umkehr, double width, double height)
274        {
275            typ = umkehr+1;
276            Rectangle myRectangle = new Rectangle();
277            myRectangle.Width = 260;
278            myRectangle.Height = 764;
279
280            myRectangle.RadiusX = 15;
281            myRectangle.RadiusY = 15;
282
283            myRectangle.Fill = Brushes.LightSteelBlue;
284            myRectangle.Stroke = Brushes.Silver;
285            myRectangle.StrokeThickness = 30;
286            this.Children.Add(myRectangle);
287
288            switch (umkehr+1)
289            {
290                case 1: this.umkehrlist = umkehrlist1;
291                    iAm.Text = "A";
292                    ; break;
293                case 2: this.umkehrlist = umkehrlist2; iAm.Text = "B"; break;
294                case 3: this.umkehrlist = umkehrlist3; iAm.Text = "C"; break;
295            }
296
297
298            double x = 29.39;
299            double y = 30.0;
300            int ix = 0;
301            double distance = 15;
302            StackPanel stack = new StackPanel();
303            stack.Orientation = Orientation.Vertical;
304            for (int i = 0; i < 26; i++)
305            {
306                TextBlock t = new TextBlock();
307                t.Text = "" + Convert.ToChar(i + 65);
308                t.Width = 30.0;
309                t.Height = 29.39;
310
311
312                t.FontSize = 20;
313                //Canvas.SetLeft(t, 50.0 / 2000 * width + 1);
314                //Canvas.SetTop(t, 42.0 / 1000 * height * i + 60);
315                t.Background = Brushes.SkyBlue;
316                t.TextAlignment = TextAlignment.Center;
317                if (i % 2 == 0)
318                    t.Background = Brushes.LightSeaGreen;
319
320
321                stack.Children.Add(t);
322                tebo[i] = t;
323
324                Line l2 = new Line();
325                l2.Y1 = x / 2 + i * x;
326                l2.X1 = 230;
327                l2.Y2 = x / 2 + i * x;
328                l2.X2 = 20 + (i - ix) * distance;
329
330                l2.StrokeThickness = 1;
331
332                l2.Stroke = Brushes.Black;
333
334
335
336                Line l3 = new Line();
337                l3.Y1 = x / 2 + umkehrlist[i] * x;
338                l3.X1 = 20 + (i - ix) * distance;
339                l3.Y2 = x / 2 + i * x;
340                l3.X2 = 20 + (i - ix) * distance;
341
342                l3.StrokeThickness = 1;
343
344                l3.Stroke = Brushes.Black;
345
346
347                Line l4 = new Line();
348                l4.Y1 = x / 2 + umkehrlist[i] * x;
349                l4.X1 = 230;
350                l4.Y2 = x / 2 + umkehrlist[i] * x;
351                l4.X2 = 20 + (i - ix) * distance;
352
353                l4.StrokeThickness = 1;
354
355                l4.Stroke = Brushes.Black;
356
357                if (umkehrlist[i] > i)
358                {
359                    this.Children.Add(l4);
360                    this.Children.Add(l2);
361                    this.Children.Add(l3);
362
363                }
364
365                else
366                {
367                    ix++;
368                }
369
370                larray[i, 0] = l2;
371                larray[i, 1] = l3;
372                larray[i, 2] = l4;
373            }
374            Canvas.SetLeft(stack, 230);
375
376            this.Children.Add(stack);
377            iAm.Height = 50;
378            iAm.Width = 50;
379            iAm.FontSize = 30;
380            iAm.TextAlignment = TextAlignment.Center;
381            Canvas.SetLeft(iAm, 0);
382            Canvas.SetTop(iAm, 0);
383            iAm.Background = Brushes.Orange;
384
385            iAm.Uid = "" + typ;
386            this.Children.Add(iAm);
387        }
388    }
389}
Note: See TracBrowser for help on using the repository browser.