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

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

added Caesar WorkspaceManager sample and wizard configuration

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