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

Last change on this file since 2523 was 2523, checked in by kopal, 11 years ago

wizard calls the initialize method of each plugin again => so the textinput and other plugins will refresh their guis and show the entered information of the wizard

File size: 23.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;
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            foreach (PluginModel pluginModel in model.AllPluginModels)
379            {
380                pluginModel.Plugin.Initialize();
381            }
382            newEditor.Open(model);                   
383        }
384
385        void rb_Checked(object sender, RoutedEventArgs e)
386        {
387            ResetBackground();
388            RadioButton b = (RadioButton)sender;
389            b.Background = Brushes.LightSeaGreen;
390            Border c = (Border)b.Content;
391            c.BorderThickness = new Thickness(1, 1, 0, 1);
392            c.Background = selectionBrush;
393            XElement ele = (XElement)b.Tag;
394            XElement desc = FindElementsInElement(ele, "description").First();
395            if (desc != null)
396                description.Text = desc.Value;
397            nextButton.IsEnabled = true;
398        }
399
400        private void ResetBackground()
401        {
402            for (int i = 0; i < radioButtonStackPanel.Children.Count; i++)
403            {
404                RadioButton b = (RadioButton)radioButtonStackPanel.Children[i];
405                b.Background = Brushes.Transparent;
406                Border c = (Border)b.Content;
407                c.BorderThickness = new Thickness(0);
408                c.Background = Brushes.Transparent;
409            }
410        }
411
412        //finds elements according to the current language
413        private IEnumerable<XElement> FindElementsInElement(XElement element, string xname)
414        {
415            CultureInfo currentLang = System.Globalization.CultureInfo.CurrentCulture;
416
417            IEnumerable<XElement> allElements = element.Elements(xname);
418            IEnumerable<XElement> foundElements = null;
419
420            if (allElements.Any())
421            {
422                foundElements = from descln in allElements where descln.Attribute("lang").Value == currentLang.TextInfo.CultureName select descln;
423                if (!foundElements.Any())
424                {
425                    foundElements = from descln in allElements where descln.Attribute("lang").Value == currentLang.TwoLetterISOLanguageName select descln;
426                    if (!foundElements.Any())
427                        foundElements = from descln in allElements where descln.Attribute("lang").Value == defaultLang select descln;
428                }
429            }
430
431            if (foundElements == null || !foundElements.Any() || !allElements.Any())
432            {
433                List<XElement> fe = new List<XElement>();
434                fe.Add(new XElement("dummy"));
435                return fe;
436            }
437
438            return foundElements;
439        }
440
441        private void nextButton_Click(object sender, RoutedEventArgs e)
442        {
443            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardNext1");
444            mainGridStoryboardLeft.Begin();
445        }
446
447        private void backButton_Click(object sender, RoutedEventArgs e)
448        {
449            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardBack1");
450            mainGridStoryboardLeft.Begin();
451        }
452
453        private void abortButton_Click(object sender, RoutedEventArgs e)
454        {
455            propertyValueDict.Clear();
456            ResetBackground();
457            radioButtonStackPanel.Children.Clear();
458            choicePath.Clear();
459            description.Text = "";
460            SetupPage(wizardConfigXML);
461        }
462
463        private void SetNextContent(object sender, EventArgs e)
464        {
465            if (categoryGrid.IsVisible)
466            {
467                for (int i = 0; i < radioButtonStackPanel.Children.Count; i++)
468                {
469                    RadioButton b = (RadioButton) radioButtonStackPanel.Children[i];
470                    if (b.IsChecked != null && (bool) b.IsChecked)
471                    {
472                        choicePath.Add(GetElementID((XElement) b.Tag));
473                        SetupPage((XElement) b.Tag);
474                        break;
475                    }
476                }
477            }
478            else if (inputPanel.IsVisible)
479            {
480                foreach (var child in inputStack.Children)
481                {
482                    SaveControlContent(child);
483                }
484                var nextElement = (XElement) inputPanel.Tag;
485                choicePath.Add(GetElementID(nextElement));
486                SetupPage(nextElement);
487            }
488
489            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardNext2");
490            mainGridStoryboardLeft.Begin();
491        }
492
493        private void SaveControlContent(object o)
494        {
495            if (o is TextBox || o is ComboBox || o is CheckBox)
496            {
497                Control c = (Control)o;
498                XElement ele = (XElement)c.Tag;
499                var id = GetElementID(ele);
500                PluginPropertyValue newEntry = new PluginPropertyValue();
501                if (ele.Attribute("plugin") != null && ele.Attribute("property") != null)
502                {
503                    if (o is TextBox)
504                    {
505                        TextBox textBox = (TextBox)o;
506                        newEntry = new PluginPropertyValue()
507                                   {
508                                       PluginName = ele.Attribute("plugin").Value,
509                                       PropertyName = ele.Attribute("property").Value,
510                                       Value = textBox.Text
511                                   };
512                    }
513                    else if (o is ComboBox)
514                    {
515                        ComboBox comboBox = (ComboBox)o;
516                        newEntry = new PluginPropertyValue()
517                        {
518                            PluginName = ele.Attribute("plugin").Value,
519                            PropertyName = ele.Attribute("property").Value,
520                            Value = comboBox.SelectedIndex
521                        };
522                    }
523                    else if (o is CheckBox)
524                    {
525                        CheckBox checkBox = (CheckBox)o;
526                        if (checkBox.IsChecked != null)
527                        {
528                            newEntry = new PluginPropertyValue()
529                            {
530                                PluginName = ele.Attribute("plugin").Value,
531                                PropertyName = ele.Attribute("property").Value,
532                                Value = (bool)checkBox.IsChecked
533                            };
534                        }
535                    }
536
537                    if (!propertyValueDict.ContainsKey(id))
538                        propertyValueDict.Add(id, newEntry);
539                    else
540                        propertyValueDict[id] = newEntry;
541                } 
542            }
543        }
544
545        private void DeleteControlContent(object o)
546        {
547            if (o is TextBox || o is ComboBox || o is CheckBox)
548            {
549                Control control = (Control)o;
550                XElement ele = (XElement)control.Tag;
551                var id = GetElementID(ele);
552
553                if (propertyValueDict.ContainsKey(id))
554                    propertyValueDict.Remove(id);
555            }
556        }
557
558
559        private void SetLastContent(object sender, EventArgs e)
560        {
561            XElement ele = null;
562            if (categoryGrid.IsVisible && radioButtonStackPanel.Children.Count > 0)
563            {
564                RadioButton b = (RadioButton) radioButtonStackPanel.Children[0];
565                ele = (XElement) b.Tag;
566            }
567            else if (inputPanel.IsVisible)
568            {
569                foreach (var child in inputStack.Children)
570                {
571                    DeleteControlContent(child);
572                }
573
574                ele = (XElement) inputPanel.Tag;
575            }
576
577            if (ele != null)
578            {
579                XElement grandParent = ele.Parent.Parent;
580                if (grandParent != null)
581                    SetupPage(grandParent);
582                else
583                    SetupPage(wizardConfigXML);
584            }
585
586            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardBack2");
587            mainGridStoryboardLeft.Begin();
588        }
589
590        private void GuiLogMessage(string message, NotificationLevel loglevel)
591        {
592            if (OnGuiLogNotificationOccured != null)
593                OnGuiLogNotificationOccured(null, new GuiLogEventArgs(message, null, loglevel));
594        }
595    }
596
597    internal struct PluginPropertyValue
598    {
599        public string PluginName;
600        public string PropertyName;
601        public object Value;
602    }
603}
Note: See TracBrowser for help on using the repository browser.