source: trunk/CrypPlugins/Transposition/TranspositionPresentation.xaml.cs @ 835

Last change on this file since 835 was 835, checked in by weyers, 12 years ago

bubble sort replaced by more efficient algorithm!

File size: 15.0 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Windows;
6using System.Windows.Data;
7using System.Windows.Documents;
8using System.Windows.Input;
9using System.Windows.Media;
10using System.Windows.Media.Imaging;
11using System.Windows.Media.Animation;
12using System.Windows.Navigation;
13using System.Windows.Shapes;
14using System.Windows.Controls;
15using System.Windows.Threading;
16using System.Threading;
17
18namespace Transposition
19{
20    /// <summary>
21    /// Interaktionslogik für TranspositionPresentation.xaml
22    /// </summary>
23    public partial class TranspositionPresentation : UserControl
24    {
25        public TranspositionPresentation()
26        {
27            InitializeComponent();
28        }
29
30       
31        private TextBlock[,] teba;
32        private int von;
33        private int nach;
34        private int schleife = 0;
35        private int outcount;
36        private int outcount1;
37        private bool Stop = false;
38        private int rein;
39        private int reout;
40
41        public void main(char[,] read_in_matrix, char[,] permuted_matrix, int[] key, String keyword, String input, String output, int per, int rein, int reout)
42        {
43
44            Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
45            {
46                if (per == 1  )
47                {
48                   
49                    this.rein = rein;
50                    this.reout = reout;
51                    textBox2.Clear();
52                    if (reout == 1)
53                        outcount = 0;
54                    if (reout == 0)
55                        outcount = 2;
56                   
57                    if(rein == 1)
58                        outcount1 = 0;
59                    if(rein == 0)
60                        outcount1 = 2;
61                   
62                    Stop = false;
63                    if (keyword == null)
64                        Stop = true;
65                    create(read_in_matrix, permuted_matrix, key, keyword, input, output);
66
67                    schleife = 0;
68                    textBox1.Text = input;
69                    readIn();
70                }
71            }, null);
72        }
73
74
75
76        public void readout()
77        {
78            DoubleAnimation myDoubleAnimation = new DoubleAnimation();
79            myDoubleAnimation.From = 1.0;
80            myDoubleAnimation.To = 0.0;
81            myDoubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(1001-slider1.Value));
82
83            if (teba != null)
84            {
85                if (reout == 1)
86                    for (int i = 2; i < teba.GetLength(1); i++)
87                    {
88
89
90                        if (i == teba.GetLength(1) - 1 && outcount < teba.GetLength(0) - 1 && !Stop)
91                        {
92                            myDoubleAnimation.Completed += new EventHandler(my_Help1);
93                        }
94                        teba[outcount, i].BeginAnimation(TextBlock.OpacityProperty, myDoubleAnimation);
95                        if (i > 1)
96                        {
97                            textBox2.Text += teba[outcount, i].Text.ToString();
98                        }
99                    }
100
101
102                else
103                {
104                    for (int i = 0; i < teba.GetLength(0); i++)
105                    {
106
107
108                        if (i == teba.GetLength(0) - 1 && outcount < teba.GetLength(1) - 1 && !Stop)
109                        {
110                            myDoubleAnimation.Completed += new EventHandler(my_Help1);
111                        }
112                        teba[i,outcount].BeginAnimation(TextBlock.OpacityProperty, myDoubleAnimation);
113                        if (outcount > 1)
114                        {
115                            textBox2.Text += teba[i,outcount].Text.ToString();
116                        }
117                    }
118                }
119            }
120        }
121
122        public void sort(int i)
123        {
124            if (teba != null)
125            {
126                if (i < teba.GetLength(0) - 1)
127                {
128                    if (Convert.ToInt32(teba[i, 0].Text) != i+1 )
129                    {
130                        int s =0;
131                        for (int ix = i + 1; ix < teba.GetLength(0); ix++)
132                        {
133                            if (Convert.ToInt32(teba[ix, 0].Text) == i + 1)
134                            {
135                                s = ix;
136                            }
137                        }
138                        ani( i, s);
139                       
140                    }
141                    else
142                    {
143                        schleife++;
144                        sort(schleife);
145                    }
146                   
147                }
148               
149
150                else if ( !Stop){  readout(); }
151            }
152
153        }
154
155        public void my_Stop(object sender, EventArgs e)
156        {
157            myGrid.Children.Clear();
158            myGrid.ColumnDefinitions.Clear();
159            myGrid.RowDefinitions.Clear();
160            outcount = 0;
161           
162            schleife = 0;
163            textBox1.Clear();
164            textBox2.Clear();
165            Stop = true;
166        }
167
168        private void my_Help1(object sender, EventArgs e)
169        {
170            outcount++;
171            if (!Stop)
172                readout();
173
174        }
175
176        private void my_Help2(object sender, EventArgs e)
177        {
178            outcount1++;
179            if (!Stop)
180                readIn();
181
182        }
183
184        private void my_Help(object sender, EventArgs e)
185        {
186            schleife++;
187            if (!Stop)
188                sort(schleife);
189        }
190
191        private void my_Completed(object sender, EventArgs e)
192        {
193            Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
194            {
195                if (teba != null)
196                {
197
198                    for (int i = 0; i < teba.GetLength(1); i++)
199                    {
200                        String help = teba[nach, i].Text.ToString();
201                        teba[nach, i].Text = teba[von, i].Text.ToString();
202                        teba[von, i].Text = help;
203
204                        TextBlock help1 = new TextBlock();
205                        help1.Background = teba[nach, i].Background;
206                        teba[nach, i].Background = teba[von, i].Background;
207                        teba[von, i].Background = help1.Background;
208
209                       
210                    }
211                }
212               
213                DoubleAnimation myFadein = new DoubleAnimation();
214                myFadein.From = 0.0;
215                myFadein.To = 1.0;
216                myFadein.Duration = new Duration(TimeSpan.FromMilliseconds(1001-slider1.Value));
217
218
219                if (teba != null)
220                    for (int i = 0; i < teba.GetLength(1); i++)
221                    {
222                        teba[von, i].BeginAnimation(TextBlock.OpacityProperty, myFadein);
223                        if (i == teba.GetLength(1) - 1 && !Stop)
224                        {
225                            myFadein.Completed += new EventHandler(my_Help);
226                        }
227
228                        teba[nach, i].BeginAnimation(TextBlock.OpacityProperty, myFadein);
229                    }
230
231            }, null);
232        }
233
234        public void ani( int von, int nach)
235        {
236            DoubleAnimation myDoubleAnimation = new DoubleAnimation();
237            myDoubleAnimation.From = 1.0;
238            myDoubleAnimation.To = 0.0;
239            myDoubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(1001-slider1.Value));
240
241            this.von = von;
242            this.nach = nach;
243
244            if (teba != null)
245                for (int i = 0; i < teba.GetLength(1); i++)
246                {
247
248                    teba[von, i].BeginAnimation(TextBlock.OpacityProperty, myDoubleAnimation);
249                    if (i == teba.GetLength(1) - 1 && !Stop)
250                    {
251                        myDoubleAnimation.Completed += new EventHandler(my_Completed);
252                    }
253                    teba[nach, i].BeginAnimation(TextBlock.OpacityProperty, myDoubleAnimation);
254                }
255        }
256
257        public void readIn()
258        {
259
260
261
262            DoubleAnimation myDoubleAnimation = new DoubleAnimation();
263            myDoubleAnimation.From = 0.0;
264            myDoubleAnimation.To = 1.0;
265            myDoubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(1001-slider1.Value));
266
267            if (teba != null)
268            {
269                if (rein == 0)
270                {
271                    for (int i = 0; i < teba.GetLength(0); i++)
272                    {
273
274
275                        if (i == teba.GetLength(0) - 1 && outcount1 < teba.GetLength(1) - 1 && !Stop)
276                        {
277                            myDoubleAnimation.Completed += new EventHandler(my_Help2);
278                        }
279                        teba[i, outcount1].BeginAnimation(TextBlock.OpacityProperty, myDoubleAnimation);
280
281                        try
282                        {
283                            textBox1.Text = textBox1.Text.Remove(0, 1);
284                        }
285
286                        catch (ArgumentOutOfRangeException) { }
287
288                        if (i == teba.GetLength(0) - 1 && outcount1 == teba.GetLength(1) - 1 && !Stop)
289                        { sort(schleife); }
290
291                    }
292                }
293
294                else
295                {
296                    for (int i = 2; i < teba.GetLength(1); i++)
297                    {
298
299
300                        if (i == teba.GetLength(1) - 1 && outcount1 < teba.GetLength(0) - 1 && !Stop)
301                        {
302                            myDoubleAnimation.Completed += new EventHandler(my_Help2);
303                        }
304                        teba[outcount1,i].BeginAnimation(TextBlock.OpacityProperty, myDoubleAnimation);
305
306                        try
307                        {
308                            textBox1.Text = textBox1.Text.Remove(0, 1);
309                        }
310
311                        catch (ArgumentOutOfRangeException) { }
312
313                        if (i == teba.GetLength(1) - 1 && outcount1 == teba.GetLength(0) - 1 && !Stop)
314                        { sort(schleife); }
315
316                    }
317                }
318            }
319        }
320
321        public void create(char[,] read_in_matrix, char[,] permuted_matrix, int[] key, String keyword, String input, String output)
322        {
323
324            Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
325            {
326                if (read_in_matrix != null && key != null)
327                {
328                    myGrid.Children.Clear();
329                    myGrid.RowDefinitions.Clear();
330                    myGrid.ColumnDefinitions.Clear();
331                    textBox1.Clear();
332                    textBox2.Clear();
333
334                   
335
336                    mainGrid.Height = 100;
337                    mainGrid.Width = 420;
338
339                    myGrid.Width = 50;
340                    myGrid.Height = 100;
341                    myGrid.ShowGridLines = false;
342
343                    teba = new TextBlock[read_in_matrix.GetLength(0), read_in_matrix.GetLength(1) + 2];
344                   
345                    myGrid.RowDefinitions.Add(new RowDefinition());
346                    for (int i = 0; i < key.Length; i++)
347                    {
348                        if (mainGrid.Width < 800)
349                        {
350                            myGrid.Width += 12;
351                            mainGrid.Width += 12;
352                        }
353                        myGrid.ColumnDefinitions.Add(new ColumnDefinition());
354                        TextBlock txt = new TextBlock();
355                        String s = key[i].ToString();
356                        txt.VerticalAlignment = VerticalAlignment.Center;
357                        txt.Text = s;
358                        txt.FontSize = 12;
359                        txt.FontWeight = FontWeights.ExtraBold;
360                        txt.TextAlignment = TextAlignment.Center;
361                        Grid.SetRow(txt, 0);
362                        Grid.SetColumn(txt, i);
363                        myGrid.Children.Add(txt);
364                        teba[i, 0] = txt;
365
366                    }
367
368                    myGrid.RowDefinitions.Add(new RowDefinition());
369                    if (keyword != null)
370                    {
371                       
372                        char[] ch = keyword.ToCharArray();
373
374                        for (int i = 0; i < key.Length; i++)
375                        {
376
377                            TextBlock txt = new TextBlock();
378                            txt.VerticalAlignment = VerticalAlignment.Center;
379                            txt.Text = ch[i].ToString();
380                            txt.FontSize = 12;
381                            txt.FontWeight = FontWeights.ExtraBold;
382                            txt.TextAlignment = TextAlignment.Center;
383                            Grid.SetRow(txt, 1);
384                            Grid.SetColumn(txt, i);
385                            myGrid.Children.Add(txt);
386                            teba[i, 1] = txt;
387                        }
388                    }
389
390                    for (int i = 0; i < read_in_matrix.GetLength(1); i++)
391                    {
392                        if (mainGrid.Height < 280)
393                        {
394                            mainGrid.Height += 12;
395                            myGrid.Height += 12;
396                        }
397
398
399                        int x = 0;
400                        myGrid.RowDefinitions.Add(new RowDefinition());
401                        if (i % 2 == 0)
402                            x = 1;
403                        for (int ix = 0; ix < read_in_matrix.GetLength(0); ix++)
404                        {
405
406                            TextBlock txt = new TextBlock();
407                            txt.VerticalAlignment = VerticalAlignment.Center;
408                            if (char.GetUnicodeCategory(read_in_matrix[ix, i]).ToString() != "Control")
409                                txt.Text = read_in_matrix[ix, i].ToString();
410                            else
411                                txt.Text = "";
412                            if (ix % 2 == x)
413                                txt.Background = Brushes.AliceBlue;
414                            else
415                                txt.Background = Brushes.LawnGreen;
416                            txt.FontSize = 12;
417                            txt.Opacity = 0.0;
418                            txt.FontWeight = FontWeights.ExtraBold;
419                            txt.TextAlignment = TextAlignment.Center;
420                            Grid.SetRow(txt, i + 2);
421                            Grid.SetColumn(txt, ix);
422                            myGrid.Children.Add(txt);
423                            teba[ix, i + 2] = txt;
424                        }
425                    }
426
427                }
428
429            }
430         , null);
431        }
432
433    }
434
435}
Note: See TracBrowser for help on using the repository browser.