source: trunk/CrypPlugins/Wizard/WizardControl.xaml.cs @ 2424

Last change on this file since 2424 was 2424, checked in by sauer, 11 years ago

Wizard: sample preparations

File size: 13.9 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.Animation;
12using System.Windows.Media.Imaging;
13using System.Windows.Navigation;
14using System.Windows.Shapes;
15using System.Xml.Linq;
16using System.IO;
17using System.Reflection;
18using System.Windows.Threading;
19using System.Threading;
20using System.Collections;
21using System.Globalization;
22
23namespace Wizard
24{
25    /// <summary>
26    /// Interaction logic for WizardControl.xaml
27    /// </summary>
28    [Cryptool.PluginBase.Attributes.Localization("Wizard.Properties.Resources")]
29    public partial class WizardControl : UserControl
30    {
31
32        private List<string> choicePath = new List<string>();
33        private SolidColorBrush selectionBrush = new SolidColorBrush();
34        private const string configXMLPath = "Wizard.Config.wizard.config.start.xml";
35        private const string defaultLang = "en-US";
36        private XElement wizardConfigXML;
37
38        public WizardControl()
39        {
40            try
41            {
42                // DEBUG HELP string[] names = this.GetType().Assembly.GetManifestResourceNames();
43
44                Stream fileStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(configXMLPath);
45                XElement xml = XElement.Load(fileStream);
46                GenerateXML(xml);
47            }
48            catch (Exception)
49            {
50               
51            }
52
53            InitializeComponent();
54
55            selectionBrush.Color = Color.FromArgb(255, 200, 220, 245);
56            SetupPage(wizardConfigXML);
57        }
58
59        // generate the full XML tree for the wizard (recursive)
60        private void GenerateXML(XElement xml)
61        {
62            try
63            {
64                //find all nested subcategories and add them to the tree
65                IEnumerable<XElement> categories = xml.Elements("category");
66                if (categories.Any())
67                {
68                    foreach (XElement cat in categories)
69                    {
70                        IEnumerable<XElement> files = cat.Elements("file");
71                        if (files.Any())
72                        {
73                            foreach (XElement element in files)
74                            {
75                                XAttribute att = element.Attribute("resource");
76                                if (att != null)
77                                {
78                                    string path = att.Value;
79                                    Stream fileStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(path);
80                                    XElement sub = XElement.Load(fileStream);
81                                    GenerateXML(sub);
82                                    IEnumerable<XElement> elems = sub.Elements();
83                                    if (elems.Any())
84                                    {
85                                        foreach (XElement ele in elems)
86                                        {
87                                            cat.Add(ele);
88                                        }
89                                    }
90                                }
91                            }
92                        }
93                    }
94                }
95
96                wizardConfigXML = xml;
97
98            }
99            catch (Exception)
100            {
101               
102            }
103        }
104
105        private void SetupPage(XElement element)
106        {
107            XElement parent = element.Parent;
108            if (parent == null)
109            {
110                backButton.IsEnabled = false;
111                abortButton.IsEnabled = false;
112            }
113            else
114            {
115                backButton.IsEnabled = true;
116                abortButton.IsEnabled = true;
117            }
118
119            nextButton.IsEnabled = false;
120
121            //set headline
122            XElement headline = FindElementInElement(element, "headline");
123            if (headline != null)
124                taskHeader.Content = headline.Value;
125
126            //set description label
127            XElement desc = FindElementInElement(element, "desc");
128            if (desc != null)
129                descHeader.Content = desc.Value;
130
131
132            if (element.Name == "input")
133            {
134                categoryGrid.Visibility = Visibility.Hidden;
135                inputPanel.Visibility = Visibility.Visible;
136
137                var inputBoxes = element.Elements("inputBox");
138                inputStack.Children.Clear();
139               
140                foreach (var box in inputBoxes)
141                {
142                    var description = new Label();
143                    description.Content = FindElementInElement(box, "description").Value;
144                    inputStack.Children.Add(description);
145
146                    var textBox = new TextBox();
147                    textBox.MinLines = 4;
148                    inputStack.Children.Add(textBox);
149                    if (box.Attribute("defaultValue") != null)
150                        textBox.Text = box.Attribute("defaultValue").Value;
151                }
152
153                var next = element.Element("input");
154                if (next != null)
155                    inputPanel.Tag = next;
156                else
157                    inputPanel.Tag = element.Element("category");
158
159                if (inputPanel.Tag != null)
160                    nextButton.IsEnabled = true;
161            }
162            else if (element.Name == "category")
163            {
164                categoryGrid.Visibility = Visibility.Visible;
165                inputPanel.Visibility = Visibility.Hidden;
166               
167                radioButtonStackPanel.Children.Clear();
168                //ResetBackground();
169
170                //generate radio buttons
171                IEnumerable<XElement> categories = element.Elements("category");
172                IEnumerable<XElement> inputs = element.Elements("input");
173
174                if (inputs.Any())
175                    categories = categories.Union(inputs);
176
177                if (categories.Any())
178                {
179                    foreach (XElement ele in categories)
180                    {
181                        Border border = new Border();
182                        Label l = new Label();
183                        Image i = new Image();
184                        StackPanel sp = new StackPanel();
185
186                        border.Child = sp;
187                        border.VerticalAlignment = VerticalAlignment.Stretch;
188                        border.CornerRadius = new CornerRadius(5, 0, 0, 5);
189                        border.BorderBrush = Brushes.LightSeaGreen;
190
191                        l.Height = 30;
192                        l.HorizontalAlignment = HorizontalAlignment.Stretch;
193                        XElement label = FindElementInElement(ele, "name");
194                        if (label != null)
195                            l.Content = label.Value;
196
197                        i.Width = 26;
198                        string image = ele.Attribute("image").Value;
199                        if (image != null)
200                        {
201                            ImageSource ims = (ImageSource) TryFindResource(image);
202                            if (ims != null)
203                            {
204                                i.Source = ims;
205                                sp.Children.Add(i);
206                            }
207                        }
208
209                        sp.VerticalAlignment = VerticalAlignment.Stretch;
210                        sp.HorizontalAlignment = HorizontalAlignment.Stretch;
211                        sp.Orientation = Orientation.Horizontal;
212                        sp.Children.Add(l);
213
214                        RadioButton rb = new RadioButton();
215                        string id = ele.Attribute("id").Value;
216                        if (id != null)
217                            rb.Name = id;
218                        rb.Checked += rb_Checked;
219                        rb.HorizontalAlignment = HorizontalAlignment.Stretch;
220                        rb.VerticalAlignment = VerticalAlignment.Stretch;
221                        rb.HorizontalContentAlignment = HorizontalAlignment.Stretch;
222                        rb.Content = border;
223                        rb.Tag = ele;
224
225                        radioButtonStackPanel.Children.Add(rb);
226                        if (choicePath.Count > 0 && id == choicePath.Last())
227                        {
228                            choicePath.RemoveAt(choicePath.IndexOf(choicePath.Last()));
229                            rb.IsChecked = true;
230                            nextButton.IsEnabled = true;
231                        }
232                    }
233                }
234            }
235
236        }
237
238        void rb_Checked(object sender, RoutedEventArgs e)
239        {
240            ResetBackground();
241            RadioButton b = (RadioButton)sender;
242            b.Background = Brushes.LightSeaGreen;
243            Border c = (Border)b.Content;
244            c.BorderThickness = new Thickness(1, 1, 0, 1);
245            c.Background = selectionBrush;
246            XElement ele = (XElement)b.Tag;
247            XElement desc = FindElementInElement(ele, "description");
248            if (desc != null)
249                description.Text = desc.Value;
250            nextButton.IsEnabled = true;
251        }
252
253        private void ResetBackground()
254        {
255            for (int i = 0; i < radioButtonStackPanel.Children.Count; i++)
256            {
257                RadioButton b = (RadioButton)radioButtonStackPanel.Children[i];
258                b.Background = Brushes.Transparent;
259                Border c = (Border)b.Content;
260                c.BorderThickness = new Thickness(0);
261                c.Background = Brushes.Transparent;
262            }
263        }
264
265        //finds elements according to the current language
266        private XElement FindElementInElement(XElement element, string xname)
267        {
268            CultureInfo currentLang = System.Globalization.CultureInfo.CurrentCulture;
269            XElement foundElement = null;
270
271            IEnumerable<XElement> descriptions = element.Elements(xname);
272            if (descriptions.Any())
273            {
274                var description = from descln in descriptions where descln.Attribute("lang").Value == currentLang.TextInfo.CultureName select descln;
275                if (!description.Any())
276                {
277                    description = from descln in descriptions where descln.Attribute("lang").Value == currentLang.TwoLetterISOLanguageName select descln;
278                    if (description.Any())
279                        foundElement = description.First();
280                    else
281                    {
282                        description = from descln in descriptions where descln.Attribute("lang").Value == defaultLang select descln;
283                        if (description.Any())
284                            foundElement = description.First();
285                    }
286                }
287                else
288                    foundElement = description.First();
289            }
290
291            return foundElement;
292        }
293
294        private void nextButton_Click(object sender, RoutedEventArgs e)
295        {
296            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardNext1");
297            mainGridStoryboardLeft.Begin();
298        }
299
300        private void backButton_Click(object sender, RoutedEventArgs e)
301        {
302            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardBack1");
303            mainGridStoryboardLeft.Begin();
304        }
305
306        private void abortButton_Click(object sender, RoutedEventArgs e)
307        {
308            ResetBackground();
309            radioButtonStackPanel.Children.Clear();
310            choicePath.Clear();
311            description.Text = "";
312            SetupPage(wizardConfigXML);
313        }
314
315        private void SetNextContent(object sender, EventArgs e)
316        {
317            if (categoryGrid.IsVisible)
318            {
319                for (int i = 0; i < radioButtonStackPanel.Children.Count; i++)
320                {
321                    RadioButton b = (RadioButton) radioButtonStackPanel.Children[i];
322                    if (b.IsChecked != null && (bool) b.IsChecked)
323                    {
324                        choicePath.Add(b.Name);
325                        SetupPage((XElement) b.Tag);
326                        break;
327                    }
328                }
329            }
330            else if (inputPanel.IsVisible)
331            {
332                var nextElement = (XElement) inputPanel.Tag;
333                choicePath.Add(nextElement.Attribute("id").Value);
334                SetupPage(nextElement);
335            }
336
337            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardNext2");
338            mainGridStoryboardLeft.Begin();
339        }
340
341
342        private void SetLastContent(object sender, EventArgs e)
343        {
344            XElement ele = null;
345            if (categoryGrid.IsVisible && radioButtonStackPanel.Children.Count > 0)
346            {
347                RadioButton b = (RadioButton) radioButtonStackPanel.Children[0];
348                ele = (XElement) b.Tag;
349            }
350            else if (inputPanel.IsVisible)
351            {
352                ele = (XElement) inputPanel.Tag;
353            }
354
355            if (ele != null)
356            {
357                XElement grandParent = ele.Parent.Parent;
358                if (grandParent != null)
359                    SetupPage(grandParent);
360                else
361                    SetupPage(wizardConfigXML);
362            }
363
364            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardBack2");
365            mainGridStoryboardLeft.Begin();
366        }
367    }
368}
Note: See TracBrowser for help on using the repository browser.