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

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

Wizard: added other input types (ComboBoxes, CheckBoxes)

File size: 23.8 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;
22using Cryptool.PluginBase;
23using WorkspaceManager.Model;
24
25namespace Wizard
26{
27    /// <summary>
28    /// Interaction logic for WizardControl.xaml
29    /// </summary>
30    [Cryptool.PluginBase.Attributes.Localization("Wizard.Properties.Resources")]
31    public partial class WizardControl : UserControl
32    {
33
34        private List<string> choicePath = new List<string>();
35        private SolidColorBrush selectionBrush = new SolidColorBrush();
36        private const string configXMLPath = "Wizard.Config.wizard.config.start.xml";
37        private const string defaultLang = "en";
38        private XElement wizardConfigXML;
39        private Dictionary<string, PluginPropertyValue> propertyValueDict = new Dictionary<string, PluginPropertyValue>();
40
41        internal event OpenTabHandler OnOpenTab;
42        internal event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
43
44        internal string SamplesDir { set; private get; }
45
46        public WizardControl()
47        {
48            try
49            {
50                // DEBUG HELP string[] names = this.GetType().Assembly.GetManifestResourceNames();
51
52                Stream fileStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(configXMLPath);
53                XElement xml = XElement.Load(fileStream);
54                GenerateXML(xml);
55            }
56            catch (Exception)
57            {
58               
59            }
60
61            InitializeComponent();
62
63            selectionBrush.Color = Color.FromArgb(255, 200, 220, 245);
64            SetupPage(wizardConfigXML);
65        }
66
67        // generate the full XML tree for the wizard (recursive)
68        private void GenerateXML(XElement xml)
69        {
70            try
71            {
72                //find all nested subcategories and add them to the tree
73                IEnumerable<XElement> categories = xml.Elements("category");
74                if (categories.Any())
75                {
76                    foreach (XElement cat in categories)
77                    {
78                        IEnumerable<XElement> files = cat.Elements("file");
79                        if (files.Any())
80                        {
81                            foreach (XElement element in files)
82                            {
83                                XAttribute att = element.Attribute("resource");
84                                if (att != null)
85                                {
86                                    string path = att.Value;
87                                    Stream fileStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(path);
88                                    XElement sub = XElement.Load(fileStream);
89                                    GenerateXML(sub);
90                                    IEnumerable<XElement> elems = sub.Elements();
91                                    if (elems.Any())
92                                    {
93                                        foreach (XElement ele in elems)
94                                        {
95                                            cat.Add(ele);
96                                        }
97                                    }
98                                }
99                            }
100                        }
101                    }
102                }
103
104                wizardConfigXML = xml;
105
106            }
107            catch (Exception)
108            {
109               
110            }
111        }
112
113        private void SetupPage(XElement element)
114        {
115            if ((element.Name == "loadSample") && (element.Attribute("file") != null) && (element.Attribute("title") != null))
116            {
117                LoadSample(element.Attribute("file").Value, element.Attribute("title").Value);
118            }
119
120            XElement parent = element.Parent;
121            if (parent == null)
122            {
123                backButton.IsEnabled = false;
124                abortButton.IsEnabled = false;
125            }
126            else
127            {
128                backButton.IsEnabled = true;
129                abortButton.IsEnabled = true;
130            }
131
132            nextButton.IsEnabled = false;
133
134            //set headline
135            XElement headline = FindElementsInElement(element, "headline").First();
136            if (headline != null)
137                taskHeader.Content = headline.Value;
138
139            //set description label
140            XElement desc = FindElementsInElement(element, "desc").First();
141            if (desc != null)
142                descHeader.Content = desc.Value;
143
144
145            if (element.Name == "input")
146            {
147                categoryGrid.Visibility = Visibility.Hidden;
148                inputPanel.Visibility = Visibility.Visible;
149
150                var inputs = element.Elements("inputBox");
151                inputs = inputs.Union(element.Elements("comboBox"));
152                inputs = inputs.Union(element.Elements("checkBox"));
153                inputStack.Children.Clear();
154               
155                foreach (var input in inputs)
156                {
157                    var description = new Label();
158                    description.Content = FindElementsInElement(input, "description").First().Value;
159                    inputStack.Children.Add(description);
160
161                    if (input.Name == "inputBox")
162                    {
163                        var textBox = new TextBox();
164                        textBox.Tag = input;
165                        textBox.MinLines = 4;
166                        inputStack.Children.Add(textBox);
167                        if (propertyValueDict.ContainsKey(GetElementID(input)))
168                            textBox.Text = (string)propertyValueDict[GetElementID(input)].Value;
169                        else if (input.Attribute("defaultValue") != null)
170                            textBox.Text = input.Attribute("defaultValue").Value; 
171                    }
172                    else if (input.Name == "comboBox")
173                    {
174                        ComboBox cb = new ComboBox();
175                        cb.Tag = input;
176
177                        var items = FindElementsInElement(input, "item");
178                        foreach (var item in items)
179                        {
180                            ComboBoxItem cbi = new ComboBoxItem();
181                            if (item.Attribute("content") != null)
182                                cbi.Content = item.Attribute("content").Value;
183                            cb.Items.Add(cbi);
184                        }
185
186                       
187                        if (propertyValueDict.ContainsKey(GetElementID(input)))
188                        {
189                            if (propertyValueDict[GetElementID(input)].Value is int)
190                            {
191                                ComboBoxItem cbi = (ComboBoxItem)cb.Items.GetItemAt((int)propertyValueDict[GetElementID(input)].Value);
192                                cbi.IsSelected = true;
193                            }
194                        }
195                        else if (input.Attribute("defaultValue") != null)
196                        {
197                            int i = 0;
198                            if (Int32.TryParse(input.Attribute("defaultValue").Value, out i))
199                            {
200                                ComboBoxItem cbi = (ComboBoxItem)cb.Items.GetItemAt(i);
201                                cbi.IsSelected = true;
202                            }
203                        }
204
205                        inputStack.Children.Add(cb);
206                    }
207                    else if (input.Name == "checkBox")
208                    {
209                        CheckBox cb = new CheckBox();
210                        cb.Tag = input;
211
212                        if (input.Attribute("content") != null)
213                            cb.Content = input.Attribute("content").Value;
214                        if (propertyValueDict.ContainsKey(GetElementID(input)))
215                        {
216                            string value = (string)propertyValueDict[GetElementID(input)].Value;
217                            if (value.ToLower() == "true")
218                                cb.IsChecked = true;
219                            else
220                                cb.IsChecked = false;
221                        }
222                        else if (input.Attribute("defaultValue") != null)
223                        {
224                            string value = input.Attribute("defaultValue").Value;
225                            if (value.ToLower() == "true")
226                                cb.IsChecked = true;
227                            else
228                                cb.IsChecked = false;
229                        }
230
231                        inputStack.Children.Add(cb);
232                    }
233                }
234
235                var next = element.Element("input");
236                if (next != null)
237                    inputPanel.Tag = next;
238                else
239                    inputPanel.Tag = element.Element("category");
240                if (inputPanel.Tag == null)
241                    inputPanel.Tag = element.Element("loadSample");
242
243                if (inputPanel.Tag != null)
244                    nextButton.IsEnabled = true;
245
246                string id = GetElementID((XElement)inputPanel.Tag);
247
248                if (choicePath.Count > 0 && id == choicePath.Last())
249                    choicePath.RemoveAt(choicePath.IndexOf(choicePath.Last()));
250            }
251
252            else if (element.Name == "category")
253            {
254                categoryGrid.Visibility = Visibility.Visible;
255                inputPanel.Visibility = Visibility.Hidden;
256               
257                radioButtonStackPanel.Children.Clear();
258                //ResetBackground();
259
260                //generate radio buttons
261                IEnumerable<XElement> categories = element.Elements("category");
262                IEnumerable<XElement> inputs = element.Elements("input");
263                IEnumerable<XElement> loadSamples = element.Elements("loadSamples");
264
265                if (inputs.Any())
266                    categories = categories.Union(inputs);
267                if (loadSamples.Any())
268                    categories = categories.Union(loadSamples);
269
270                if (categories.Any())
271                {
272                    bool isSelected = false;
273
274                    foreach (XElement ele in categories)
275                    {
276                        Border border = new Border();
277                        Label l = new Label();
278                        Image i = new Image();
279                        StackPanel sp = new StackPanel();
280
281                        border.Child = sp;
282                        border.VerticalAlignment = VerticalAlignment.Stretch;
283                        border.CornerRadius = new CornerRadius(5, 0, 0, 5);
284                        border.BorderBrush = Brushes.LightSeaGreen;
285
286                        l.Height = 30;
287                        l.HorizontalAlignment = HorizontalAlignment.Stretch;
288                        XElement label = FindElementsInElement(ele, "name").First();
289                        if (label != null)
290                            l.Content = label.Value;
291
292                        i.Width = 26;
293                        string image = ele.Attribute("image").Value;
294                        if (image != null)
295                        {
296                            ImageSource ims = (ImageSource) TryFindResource(image);
297                            if (ims != null)
298                            {
299                                i.Source = ims;
300                                sp.Children.Add(i);
301                            }
302                        }
303
304                        sp.VerticalAlignment = VerticalAlignment.Stretch;
305                        sp.HorizontalAlignment = HorizontalAlignment.Stretch;
306                        sp.Orientation = Orientation.Horizontal;
307                        sp.Children.Add(l);
308
309                        RadioButton rb = new RadioButton();
310                        string id = GetElementID(ele);
311                        rb.Checked += rb_Checked;
312                        rb.HorizontalAlignment = HorizontalAlignment.Stretch;
313                        rb.VerticalAlignment = VerticalAlignment.Stretch;
314                        rb.HorizontalContentAlignment = HorizontalAlignment.Stretch;
315                        rb.Content = border;
316                        rb.Tag = ele;
317
318                        radioButtonStackPanel.Children.Add(rb);
319                        if (choicePath.Count > 0 && id == choicePath.Last())
320                        {
321                            choicePath.RemoveAt(choicePath.IndexOf(choicePath.Last()));
322                            rb.IsChecked = true;
323                            isSelected = true;
324                            nextButton.IsEnabled = true;
325                        }
326                    }
327
328                    if (!isSelected)
329                    {
330                        RadioButton b = (RadioButton)radioButtonStackPanel.Children[0];
331                        b.IsChecked = true;
332                    }
333
334                }
335            }
336
337        }
338
339        private string GetElementID(XElement element)
340        {
341            if (element != null && element.Parent != null)
342            {
343                return GetElementID(element.Parent) + "[" + element.Parent.Nodes().ToList().IndexOf(element) + "]." + element.Name;
344            }
345            else
346                return "";
347        }
348
349        private void LoadSample(string file, string title)
350        {
351            file = SamplesDir + "\\" + file;
352
353            var newEditor = new WorkspaceManager.WorkspaceManager();
354            var model = ModelPersistance.loadModel(file, newEditor);
355            foreach (var c in propertyValueDict)
356            {
357                var ppv = c.Value;
358                try
359                {
360                    var plugin = model.AllPluginModels.Where(x => x.Name == ppv.PluginName).First().Plugin;
361                    var settings = plugin.Settings;
362                    var property = settings.GetType().GetProperty(ppv.PropertyName);
363                    if (ppv.Value is string)
364                        property.SetValue(settings, (string)ppv.Value, null);
365                    else if (ppv.Value is int)
366                        property.SetValue(settings, (int)ppv.Value, null);
367                    else if (ppv.Value is bool)
368                        property.SetValue(settings, (bool)ppv.Value, null);
369                }
370                catch (Exception)
371                {
372                    GuiLogMessage(string.Format("Failed settings plugin property {0}.{1} to \"{2}\"!", ppv.PluginName, ppv.PropertyName, ppv.Value), NotificationLevel.Error);
373                    return;
374                }
375            }
376
377            OnOpenTab(newEditor, title, null);           
378            newEditor.Open(model);                   
379        }
380
381        void rb_Checked(object sender, RoutedEventArgs e)
382        {
383            ResetBackground();
384            RadioButton b = (RadioButton)sender;
385            b.Background = Brushes.LightSeaGreen;
386            Border c = (Border)b.Content;
387            c.BorderThickness = new Thickness(1, 1, 0, 1);
388            c.Background = selectionBrush;
389            XElement ele = (XElement)b.Tag;
390            XElement desc = FindElementsInElement(ele, "description").First();
391            if (desc != null)
392                description.Text = desc.Value;
393            nextButton.IsEnabled = true;
394        }
395
396        private void ResetBackground()
397        {
398            for (int i = 0; i < radioButtonStackPanel.Children.Count; i++)
399            {
400                RadioButton b = (RadioButton)radioButtonStackPanel.Children[i];
401                b.Background = Brushes.Transparent;
402                Border c = (Border)b.Content;
403                c.BorderThickness = new Thickness(0);
404                c.Background = Brushes.Transparent;
405            }
406        }
407
408        //finds elements according to the current language
409        private IEnumerable<XElement> FindElementsInElement(XElement element, string xname)
410        {
411            CultureInfo currentLang = System.Globalization.CultureInfo.CurrentCulture;
412
413            IEnumerable<XElement> allElements = element.Elements(xname);
414            IEnumerable<XElement> foundElements = null;
415
416            if (allElements.Any())
417            {
418                foundElements = from descln in allElements where descln.Attribute("lang").Value == currentLang.TextInfo.CultureName select descln;
419                if (!foundElements.Any())
420                {
421                    foundElements = from descln in allElements where descln.Attribute("lang").Value == currentLang.TwoLetterISOLanguageName select descln;
422                    if (!foundElements.Any())
423                        foundElements = from descln in allElements where descln.Attribute("lang").Value == defaultLang select descln;
424                }
425            }
426
427            if (foundElements == null || !foundElements.Any() || !allElements.Any())
428            {
429                List<XElement> fe = new List<XElement>();
430                fe.Add(new XElement("dummy"));
431                return fe;
432            }
433
434            return foundElements;
435        }
436
437        private void nextButton_Click(object sender, RoutedEventArgs e)
438        {
439            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardNext1");
440            mainGridStoryboardLeft.Begin();
441        }
442
443        private void backButton_Click(object sender, RoutedEventArgs e)
444        {
445            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardBack1");
446            mainGridStoryboardLeft.Begin();
447        }
448
449        private void abortButton_Click(object sender, RoutedEventArgs e)
450        {
451            propertyValueDict.Clear();
452            ResetBackground();
453            radioButtonStackPanel.Children.Clear();
454            choicePath.Clear();
455            description.Text = "";
456            SetupPage(wizardConfigXML);
457        }
458
459        private void SetNextContent(object sender, EventArgs e)
460        {
461            if (categoryGrid.IsVisible)
462            {
463                for (int i = 0; i < radioButtonStackPanel.Children.Count; i++)
464                {
465                    RadioButton b = (RadioButton) radioButtonStackPanel.Children[i];
466                    if (b.IsChecked != null && (bool) b.IsChecked)
467                    {
468                        choicePath.Add(GetElementID((XElement) b.Tag));
469                        SetupPage((XElement) b.Tag);
470                        break;
471                    }
472                }
473            }
474            else if (inputPanel.IsVisible)
475            {
476                foreach (var child in inputStack.Children)
477                {
478                    SaveControlContent(child);
479                }
480                var nextElement = (XElement) inputPanel.Tag;
481                choicePath.Add(GetElementID(nextElement));
482                SetupPage(nextElement);
483            }
484
485            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardNext2");
486            mainGridStoryboardLeft.Begin();
487        }
488
489        private void SaveControlContent(object o)
490        {
491            if (o is TextBox || o is ComboBox || o is CheckBox)
492            {
493                Control c = (Control)o;
494                XElement ele = (XElement)c.Tag;
495                var id = GetElementID(ele);
496                PluginPropertyValue newEntry = new PluginPropertyValue();
497                if (ele.Attribute("plugin") != null && ele.Attribute("property") != null)
498                {
499                    if (o is TextBox)
500                    {
501                        TextBox textBox = (TextBox)o;
502                        newEntry = new PluginPropertyValue()
503                                   {
504                                       PluginName = ele.Attribute("plugin").Value,
505                                       PropertyName = ele.Attribute("property").Value,
506                                       Value = textBox.Text
507                                   };
508                    }
509                    else if (o is ComboBox)
510                    {
511                        ComboBox comboBox = (ComboBox)o;
512                        newEntry = new PluginPropertyValue()
513                        {
514                            PluginName = ele.Attribute("plugin").Value,
515                            PropertyName = ele.Attribute("property").Value,
516                            Value = comboBox.SelectedIndex
517                        };
518                    }
519                    else if (o is CheckBox)
520                    {
521                        CheckBox checkBox = (CheckBox)o;
522                        if (checkBox.IsChecked != null)
523                        {
524                            newEntry = new PluginPropertyValue()
525                            {
526                                PluginName = ele.Attribute("plugin").Value,
527                                PropertyName = ele.Attribute("property").Value,
528                                Value = (bool)checkBox.IsChecked
529                            };
530                        }
531                    }
532
533                    if (!propertyValueDict.ContainsKey(id))
534                        propertyValueDict.Add(id, newEntry);
535                    else
536                        propertyValueDict[id] = newEntry;
537                } 
538            }
539        }
540
541        private void DeleteControlContent(object o)
542        {
543            if (o is TextBox || o is ComboBox || o is CheckBox)
544            {
545                Control control = (Control)o;
546                XElement ele = (XElement)control.Tag;
547                var id = GetElementID(ele);
548
549                if (propertyValueDict.ContainsKey(id))
550                    propertyValueDict.Remove(id);
551            }
552        }
553
554
555        private void SetLastContent(object sender, EventArgs e)
556        {
557            XElement ele = null;
558            if (categoryGrid.IsVisible && radioButtonStackPanel.Children.Count > 0)
559            {
560                RadioButton b = (RadioButton) radioButtonStackPanel.Children[0];
561                ele = (XElement) b.Tag;
562            }
563            else if (inputPanel.IsVisible)
564            {
565                foreach (var child in inputStack.Children)
566                {
567                    DeleteControlContent(child);
568                }
569
570                ele = (XElement) inputPanel.Tag;
571            }
572
573            if (ele != null)
574            {
575                XElement grandParent = ele.Parent.Parent;
576                if (grandParent != null)
577                    SetupPage(grandParent);
578                else
579                    SetupPage(wizardConfigXML);
580            }
581
582            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardBack2");
583            mainGridStoryboardLeft.Begin();
584        }
585
586        private void GuiLogMessage(string message, NotificationLevel loglevel)
587        {
588            if (OnGuiLogNotificationOccured != null)
589                OnGuiLogNotificationOccured(null, new GuiLogEventArgs(message, null, loglevel));
590        }
591    }
592
593    internal struct PluginPropertyValue
594    {
595        public string PluginName;
596        public string PropertyName;
597        public object Value;
598    }
599}
Note: See TracBrowser for help on using the repository browser.