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

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

Wizard: sample input

File size: 17.1 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-US";
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))
116            {
117                LoadSample(element.Attribute("file").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 = FindElementInElement(element, "headline");
136            if (headline != null)
137                taskHeader.Content = headline.Value;
138
139            //set description label
140            XElement desc = FindElementInElement(element, "desc");
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 inputBoxes = element.Elements("inputBox");
151                inputStack.Children.Clear();
152               
153                foreach (var box in inputBoxes)
154                {
155                    var description = new Label();
156                    description.Content = FindElementInElement(box, "description").Value;
157                    inputStack.Children.Add(description);
158
159                    var textBox = new TextBox();
160                    textBox.Tag = box;
161                    textBox.MinLines = 4;
162                    inputStack.Children.Add(textBox);
163                    if (box.Attribute("defaultValue") != null)
164                        textBox.Text = box.Attribute("defaultValue").Value;
165                }
166
167                var next = element.Element("input");
168                if (next != null)
169                    inputPanel.Tag = next;
170                else
171                    inputPanel.Tag = element.Element("category");
172                if (inputPanel.Tag == null)
173                    inputPanel.Tag = element.Element("loadSample");
174
175                if (inputPanel.Tag != null)
176                    nextButton.IsEnabled = true;
177            }
178            else if (element.Name == "category")
179            {
180                categoryGrid.Visibility = Visibility.Visible;
181                inputPanel.Visibility = Visibility.Hidden;
182               
183                radioButtonStackPanel.Children.Clear();
184                //ResetBackground();
185
186                //generate radio buttons
187                IEnumerable<XElement> categories = element.Elements("category");
188                IEnumerable<XElement> inputs = element.Elements("input");
189                IEnumerable<XElement> loadSamples = element.Elements("loadSamples");
190
191                if (inputs.Any())
192                    categories = categories.Union(inputs);
193                if (loadSamples.Any())
194                    categories = categories.Union(loadSamples);
195
196                if (categories.Any())
197                {
198                    foreach (XElement ele in categories)
199                    {
200                        Border border = new Border();
201                        Label l = new Label();
202                        Image i = new Image();
203                        StackPanel sp = new StackPanel();
204
205                        border.Child = sp;
206                        border.VerticalAlignment = VerticalAlignment.Stretch;
207                        border.CornerRadius = new CornerRadius(5, 0, 0, 5);
208                        border.BorderBrush = Brushes.LightSeaGreen;
209
210                        l.Height = 30;
211                        l.HorizontalAlignment = HorizontalAlignment.Stretch;
212                        XElement label = FindElementInElement(ele, "name");
213                        if (label != null)
214                            l.Content = label.Value;
215
216                        i.Width = 26;
217                        string image = ele.Attribute("image").Value;
218                        if (image != null)
219                        {
220                            ImageSource ims = (ImageSource) TryFindResource(image);
221                            if (ims != null)
222                            {
223                                i.Source = ims;
224                                sp.Children.Add(i);
225                            }
226                        }
227
228                        sp.VerticalAlignment = VerticalAlignment.Stretch;
229                        sp.HorizontalAlignment = HorizontalAlignment.Stretch;
230                        sp.Orientation = Orientation.Horizontal;
231                        sp.Children.Add(l);
232
233                        RadioButton rb = new RadioButton();
234                        string id = GetElementID(ele);
235                        rb.Checked += rb_Checked;
236                        rb.HorizontalAlignment = HorizontalAlignment.Stretch;
237                        rb.VerticalAlignment = VerticalAlignment.Stretch;
238                        rb.HorizontalContentAlignment = HorizontalAlignment.Stretch;
239                        rb.Content = border;
240                        rb.Tag = ele;
241
242                        radioButtonStackPanel.Children.Add(rb);
243                        if (choicePath.Count > 0 && id == choicePath.Last())
244                        {
245                            choicePath.RemoveAt(choicePath.IndexOf(choicePath.Last()));
246                            rb.IsChecked = true;
247                            nextButton.IsEnabled = true;
248                        }
249                    }
250                }
251            }
252
253        }
254
255        private string GetElementID(XElement element)
256        {
257            if (element.Parent != null)
258            {
259                return GetElementID(element.Parent) + "[" + element.Parent.Nodes().ToList().IndexOf(element) + "]." + element.Name;
260            }
261            else
262                return "";
263        }
264
265        private void LoadSample(string file)
266        {
267            file = SamplesDir + "\\" + file;
268
269            var newEditor = new WorkspaceManager.WorkspaceManager();
270            var model = ModelPersistance.loadModel(file, newEditor);
271            newEditor.Open(model);
272
273            foreach (var c in propertyValueDict)
274            {
275                var ppv = c.Value;
276                try
277                {
278                    var plugin = model.AllPluginModels.Where(x => x.Name == ppv.PluginName).First().Plugin;
279                    var settings = plugin.Settings;
280                    var property = settings.GetType().GetProperty(ppv.PropertyName);
281                    property.SetValue(settings, ppv.Value, null);
282                }
283                catch (Exception)
284                {
285                    GuiLogMessage(string.Format("Failed settings plugin property {0}.{1} to \"{2}\"!", ppv.PluginName, ppv.PropertyName, ppv.Value), NotificationLevel.Error);
286                }
287            }
288
289            OnOpenTab(newEditor, "WizardContent", null);
290        }
291
292        void rb_Checked(object sender, RoutedEventArgs e)
293        {
294            ResetBackground();
295            RadioButton b = (RadioButton)sender;
296            b.Background = Brushes.LightSeaGreen;
297            Border c = (Border)b.Content;
298            c.BorderThickness = new Thickness(1, 1, 0, 1);
299            c.Background = selectionBrush;
300            XElement ele = (XElement)b.Tag;
301            XElement desc = FindElementInElement(ele, "description");
302            if (desc != null)
303                description.Text = desc.Value;
304            nextButton.IsEnabled = true;
305        }
306
307        private void ResetBackground()
308        {
309            for (int i = 0; i < radioButtonStackPanel.Children.Count; i++)
310            {
311                RadioButton b = (RadioButton)radioButtonStackPanel.Children[i];
312                b.Background = Brushes.Transparent;
313                Border c = (Border)b.Content;
314                c.BorderThickness = new Thickness(0);
315                c.Background = Brushes.Transparent;
316            }
317        }
318
319        //finds elements according to the current language
320        private XElement FindElementInElement(XElement element, string xname)
321        {
322            CultureInfo currentLang = System.Globalization.CultureInfo.CurrentCulture;
323            XElement foundElement = null;
324
325            IEnumerable<XElement> descriptions = element.Elements(xname);
326            if (descriptions.Any())
327            {
328                var description = from descln in descriptions where descln.Attribute("lang").Value == currentLang.TextInfo.CultureName select descln;
329                if (!description.Any())
330                {
331                    description = from descln in descriptions where descln.Attribute("lang").Value == currentLang.TwoLetterISOLanguageName select descln;
332                    if (description.Any())
333                        foundElement = description.First();
334                    else
335                    {
336                        description = from descln in descriptions where descln.Attribute("lang").Value == defaultLang select descln;
337                        if (description.Any())
338                            foundElement = description.First();
339                    }
340                }
341                else
342                    foundElement = description.First();
343            }
344
345            return foundElement;
346        }
347
348        private void nextButton_Click(object sender, RoutedEventArgs e)
349        {
350            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardNext1");
351            mainGridStoryboardLeft.Begin();
352        }
353
354        private void backButton_Click(object sender, RoutedEventArgs e)
355        {
356            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardBack1");
357            mainGridStoryboardLeft.Begin();
358        }
359
360        private void abortButton_Click(object sender, RoutedEventArgs e)
361        {
362            ResetBackground();
363            radioButtonStackPanel.Children.Clear();
364            choicePath.Clear();
365            description.Text = "";
366            SetupPage(wizardConfigXML);
367        }
368
369        private void SetNextContent(object sender, EventArgs e)
370        {
371            if (categoryGrid.IsVisible)
372            {
373                for (int i = 0; i < radioButtonStackPanel.Children.Count; i++)
374                {
375                    RadioButton b = (RadioButton) radioButtonStackPanel.Children[i];
376                    if (b.IsChecked != null && (bool) b.IsChecked)
377                    {
378                        choicePath.Add(GetElementID((XElement) b.Tag));
379                        SetupPage((XElement) b.Tag);
380                        break;
381                    }
382                }
383            }
384            else if (inputPanel.IsVisible)
385            {
386                foreach (var child in inputStack.Children)
387                {
388                    if (child is TextBox)
389                    {
390                        XElement ele = (XElement) ((TextBox)child).Tag;
391                        if (ele.Attribute("plugin") != null && ele.Attribute("property") != null)
392                            propertyValueDict.Add(GetElementID(ele), new PluginPropertyValue() {PluginName = ele.Attribute("plugin").Value, 
393                                PropertyName = ele.Attribute("property").Value, Value = ((TextBox)child).Text});
394                    }
395                }
396                var nextElement = (XElement) inputPanel.Tag;
397                choicePath.Add(GetElementID(nextElement));
398                SetupPage(nextElement);
399            }
400
401            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardNext2");
402            mainGridStoryboardLeft.Begin();
403        }
404
405
406        private void SetLastContent(object sender, EventArgs e)
407        {
408            XElement ele = null;
409            if (categoryGrid.IsVisible && radioButtonStackPanel.Children.Count > 0)
410            {
411                RadioButton b = (RadioButton) radioButtonStackPanel.Children[0];
412                ele = (XElement) b.Tag;
413            }
414            else if (inputPanel.IsVisible)
415            {
416                ele = (XElement) inputPanel.Tag;
417            }
418
419            if (ele != null)
420            {
421                XElement grandParent = ele.Parent.Parent;
422                if (grandParent != null)
423                    SetupPage(grandParent);
424                else
425                    SetupPage(wizardConfigXML);
426            }
427
428            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardBack2");
429            mainGridStoryboardLeft.Begin();
430        }
431
432        private void GuiLogMessage(string message, NotificationLevel loglevel)
433        {
434            if (OnGuiLogNotificationOccured != null)
435                OnGuiLogNotificationOccured(null, new GuiLogEventArgs(message, null, loglevel));
436        }
437    }
438
439    internal struct PluginPropertyValue
440    {
441        public string PluginName;
442        public string PropertyName;
443        public string Value;
444    }
445}
Note: See TracBrowser for help on using the repository browser.