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
RevLine 
[2210]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;
[2394]11using System.Windows.Media.Animation;
[2210]12using System.Windows.Media.Imaging;
13using System.Windows.Navigation;
14using System.Windows.Shapes;
[2284]15using System.Xml.Linq;
16using System.IO;
17using System.Reflection;
[2290]18using System.Windows.Threading;
19using System.Threading;
[2297]20using System.Collections;
[2357]21using System.Globalization;
[2426]22using Cryptool.PluginBase;
23using WorkspaceManager.Model;
[2210]24
25namespace Wizard
26{
27    /// <summary>
28    /// Interaction logic for WizardControl.xaml
29    /// </summary>
[2302]30    [Cryptool.PluginBase.Attributes.Localization("Wizard.Properties.Resources")]
[2210]31    public partial class WizardControl : UserControl
32    {
[2284]33
[2331]34        private List<string> choicePath = new List<string>();
[2333]35        private SolidColorBrush selectionBrush = new SolidColorBrush();
[2284]36        private const string configXMLPath = "Wizard.Config.wizard.config.start.xml";
[2521]37        private const string defaultLang = "en";
[2284]38        private XElement wizardConfigXML;
[2426]39        private Dictionary<string, PluginPropertyValue> propertyValueDict = new Dictionary<string, PluginPropertyValue>();
[2284]40
[2426]41        internal event OpenTabHandler OnOpenTab;
42        internal event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
43
44        internal string SamplesDir { set; private get; }
45
[2210]46        public WizardControl()
47        {
[2284]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            }
[2333]60
[2346]61            InitializeComponent();
62
[2333]63            selectionBrush.Color = Color.FromArgb(255, 200, 220, 245);
[2290]64            SetupPage(wizardConfigXML);
[2210]65        }
[2284]66
[2288]67        // generate the full XML tree for the wizard (recursive)
[2284]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                                {
[2291]86                                    string path = att.Value;
[2284]87                                    Stream fileStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(path);
88                                    XElement sub = XElement.Load(fileStream);
[2288]89                                    GenerateXML(sub);
[2284]90                                    IEnumerable<XElement> elems = sub.Elements();
91                                    if (elems.Any())
92                                    {
93                                        foreach (XElement ele in elems)
94                                        {
95                                            cat.Add(ele);
[2288]96                                        }
[2284]97                                    }
98                                }
99                            }
100                        }
[2288]101                    }
[2284]102                }
103
104                wizardConfigXML = xml;
105
106            }
107            catch (Exception)
108            {
109               
110            }
111        }
112
[2290]113        private void SetupPage(XElement element)
[2284]114        {
[2496]115            if ((element.Name == "loadSample") && (element.Attribute("file") != null) && (element.Attribute("title") != null))
[2426]116            {
[2496]117                LoadSample(element.Attribute("file").Value, element.Attribute("title").Value);
[2426]118            }
119
[2290]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            }
[2284]131
[2290]132            nextButton.IsEnabled = false;
133
134            //set headline
[2521]135            XElement headline = FindElementsInElement(element, "headline").First();
[2290]136            if (headline != null)
137                taskHeader.Content = headline.Value;
138
139            //set description label
[2521]140            XElement desc = FindElementsInElement(element, "desc").First();
[2290]141            if (desc != null)
142                descHeader.Content = desc.Value;
143
144
[2424]145            if (element.Name == "input")
146            {
147                categoryGrid.Visibility = Visibility.Hidden;
148                inputPanel.Visibility = Visibility.Visible;
[2290]149
[2521]150                var inputs = element.Elements("inputBox");
151                inputs = inputs.Union(element.Elements("comboBox"));
152                inputs = inputs.Union(element.Elements("checkBox"));
[2424]153                inputStack.Children.Clear();
154               
[2521]155                foreach (var input in inputs)
[2424]156                {
157                    var description = new Label();
[2521]158                    description.Content = FindElementsInElement(input, "description").First().Value;
[2424]159                    inputStack.Children.Add(description);
160
[2521]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                    }
[2424]233                }
234
235                var next = element.Element("input");
236                if (next != null)
237                    inputPanel.Tag = next;
238                else
239                    inputPanel.Tag = element.Element("category");
[2426]240                if (inputPanel.Tag == null)
241                    inputPanel.Tag = element.Element("loadSample");
[2424]242
243                if (inputPanel.Tag != null)
244                    nextButton.IsEnabled = true;
[2479]245
246                string id = GetElementID((XElement)inputPanel.Tag);
247
248                if (choicePath.Count > 0 && id == choicePath.Last())
249                    choicePath.RemoveAt(choicePath.IndexOf(choicePath.Last()));
[2424]250            }
[2479]251
[2424]252            else if (element.Name == "category")
[2290]253            {
[2424]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");
[2426]263                IEnumerable<XElement> loadSamples = element.Elements("loadSamples");
[2424]264
265                if (inputs.Any())
266                    categories = categories.Union(inputs);
[2426]267                if (loadSamples.Any())
268                    categories = categories.Union(loadSamples);
[2424]269
270                if (categories.Any())
[2290]271                {
[2479]272                    bool isSelected = false;
273
[2424]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();
[2297]280
[2424]281                        border.Child = sp;
282                        border.VerticalAlignment = VerticalAlignment.Stretch;
283                        border.CornerRadius = new CornerRadius(5, 0, 0, 5);
284                        border.BorderBrush = Brushes.LightSeaGreen;
[2394]285
[2424]286                        l.Height = 30;
287                        l.HorizontalAlignment = HorizontalAlignment.Stretch;
[2521]288                        XElement label = FindElementsInElement(ele, "name").First();
[2424]289                        if (label != null)
290                            l.Content = label.Value;
[2290]291
[2424]292                        i.Width = 26;
293                        string image = ele.Attribute("image").Value;
294                        if (image != null)
[2297]295                        {
[2424]296                            ImageSource ims = (ImageSource) TryFindResource(image);
297                            if (ims != null)
298                            {
299                                i.Source = ims;
300                                sp.Children.Add(i);
301                            }
[2297]302                        }
[2290]303
[2424]304                        sp.VerticalAlignment = VerticalAlignment.Stretch;
305                        sp.HorizontalAlignment = HorizontalAlignment.Stretch;
306                        sp.Orientation = Orientation.Horizontal;
307                        sp.Children.Add(l);
[2290]308
[2424]309                        RadioButton rb = new RadioButton();
[2426]310                        string id = GetElementID(ele);
[2424]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;
[2333]317
[2424]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;
[2479]323                            isSelected = true;
[2424]324                            nextButton.IsEnabled = true;
325                        }
[2331]326                    }
[2479]327
328                    if (!isSelected)
329                    {
330                        RadioButton b = (RadioButton)radioButtonStackPanel.Children[0];
331                        b.IsChecked = true;
332                    }
333
[2290]334                }
335            }
336
[2284]337        }
338
[2426]339        private string GetElementID(XElement element)
340        {
[2479]341            if (element != null && element.Parent != null)
[2426]342            {
343                return GetElementID(element.Parent) + "[" + element.Parent.Nodes().ToList().IndexOf(element) + "]." + element.Name;
344            }
345            else
346                return "";
347        }
348
[2496]349        private void LoadSample(string file, string title)
[2426]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);
[2521]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);
[2426]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);
[2444]373                    return;
[2426]374                }
375            }
376
[2496]377            OnOpenTab(newEditor, title, null);           
[2444]378            newEditor.Open(model);                   
[2426]379        }
380
[2290]381        void rb_Checked(object sender, RoutedEventArgs e)
382        {
[2333]383            ResetBackground();
[2290]384            RadioButton b = (RadioButton)sender;
[2394]385            b.Background = Brushes.LightSeaGreen;
386            Border c = (Border)b.Content;
387            c.BorderThickness = new Thickness(1, 1, 0, 1);
388            c.Background = selectionBrush;
[2290]389            XElement ele = (XElement)b.Tag;
[2521]390            XElement desc = FindElementsInElement(ele, "description").First();
[2290]391            if (desc != null)
392                description.Text = desc.Value;
393            nextButton.IsEnabled = true;
394        }
395
[2333]396        private void ResetBackground()
397        {
[2394]398            for (int i = 0; i < radioButtonStackPanel.Children.Count; i++)
[2333]399            {
[2394]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;
[2333]405            }
406        }
407
[2290]408        //finds elements according to the current language
[2521]409        private IEnumerable<XElement> FindElementsInElement(XElement element, string xname)
[2290]410        {
[2357]411            CultureInfo currentLang = System.Globalization.CultureInfo.CurrentCulture;
[2290]412
[2521]413            IEnumerable<XElement> allElements = element.Elements(xname);
414            IEnumerable<XElement> foundElements = null;
415
416            if (allElements.Any())
[2290]417            {
[2521]418                foundElements = from descln in allElements where descln.Attribute("lang").Value == currentLang.TextInfo.CultureName select descln;
419                if (!foundElements.Any())
[2290]420                {
[2521]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;
[2290]424                }
425            }
426
[2521]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;
[2290]435        }
436
437        private void nextButton_Click(object sender, RoutedEventArgs e)
438        {
[2421]439            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardNext1");
[2394]440            mainGridStoryboardLeft.Begin();
[2290]441        }
442
443        private void backButton_Click(object sender, RoutedEventArgs e)
444        {
[2421]445            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardBack1");
446            mainGridStoryboardLeft.Begin();
[2290]447        }
448
449        private void abortButton_Click(object sender, RoutedEventArgs e)
450        {
[2496]451            propertyValueDict.Clear();
[2333]452            ResetBackground();
[2290]453            radioButtonStackPanel.Children.Clear();
[2331]454            choicePath.Clear();
[2290]455            description.Text = "";
456            SetupPage(wizardConfigXML);
457        }
458
[2421]459        private void SetNextContent(object sender, EventArgs e)
[2394]460        {
[2424]461            if (categoryGrid.IsVisible)
[2394]462            {
[2424]463                for (int i = 0; i < radioButtonStackPanel.Children.Count; i++)
[2394]464                {
[2424]465                    RadioButton b = (RadioButton) radioButtonStackPanel.Children[i];
466                    if (b.IsChecked != null && (bool) b.IsChecked)
467                    {
[2426]468                        choicePath.Add(GetElementID((XElement) b.Tag));
[2424]469                        SetupPage((XElement) b.Tag);
470                        break;
471                    }
[2394]472                }
473            }
[2424]474            else if (inputPanel.IsVisible)
475            {
[2426]476                foreach (var child in inputStack.Children)
477                {
[2521]478                    SaveControlContent(child);
[2426]479                }
[2424]480                var nextElement = (XElement) inputPanel.Tag;
[2426]481                choicePath.Add(GetElementID(nextElement));
[2424]482                SetupPage(nextElement);
483            }
[2394]484
[2421]485            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardNext2");
[2394]486            mainGridStoryboardLeft.Begin();
487        }
488
[2521]489        private void SaveControlContent(object o)
[2496]490        {
[2521]491            if (o is TextBox || o is ComboBox || o is CheckBox)
[2496]492            {
[2521]493                Control c = (Control)o;
494                XElement ele = (XElement)c.Tag;
[2496]495                var id = GetElementID(ele);
[2521]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()
[2496]503                                   {
504                                       PluginName = ele.Attribute("plugin").Value,
505                                       PropertyName = ele.Attribute("property").Value,
506                                       Value = textBox.Text
507                                   };
[2521]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                    }
[2421]532
[2521]533                    if (!propertyValueDict.ContainsKey(id))
534                        propertyValueDict.Add(id, newEntry);
535                    else
536                        propertyValueDict[id] = newEntry;
537                } 
[2496]538            }
539        }
540
[2521]541        private void DeleteControlContent(object o)
[2496]542        {
[2521]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);
[2496]548
[2521]549                if (propertyValueDict.ContainsKey(id))
550                    propertyValueDict.Remove(id);
551            }
[2496]552        }
553
554
[2421]555        private void SetLastContent(object sender, EventArgs e)
[2394]556        {
[2424]557            XElement ele = null;
558            if (categoryGrid.IsVisible && radioButtonStackPanel.Children.Count > 0)
[2421]559            {
[2424]560                RadioButton b = (RadioButton) radioButtonStackPanel.Children[0];
561                ele = (XElement) b.Tag;
562            }
563            else if (inputPanel.IsVisible)
564            {
[2496]565                foreach (var child in inputStack.Children)
566                {
[2521]567                    DeleteControlContent(child);
[2496]568                }
569
[2424]570                ele = (XElement) inputPanel.Tag;
571            }
572
573            if (ele != null)
574            {
[2421]575                XElement grandParent = ele.Parent.Parent;
576                if (grandParent != null)
577                    SetupPage(grandParent);
578                else
579                    SetupPage(wizardConfigXML);
580            }
[2394]581
[2421]582            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardBack2");
583            mainGridStoryboardLeft.Begin();
[2394]584        }
[2426]585
586        private void GuiLogMessage(string message, NotificationLevel loglevel)
587        {
588            if (OnGuiLogNotificationOccured != null)
589                OnGuiLogNotificationOccured(null, new GuiLogEventArgs(message, null, loglevel));
590        }
[2210]591    }
[2426]592
593    internal struct PluginPropertyValue
594    {
595        public string PluginName;
596        public string PropertyName;
[2521]597        public object Value;
[2426]598    }
[2210]599}
Note: See TracBrowser for help on using the repository browser.