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
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";
[2302]37        private const string defaultLang = "en-US";
[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
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
[2424]145            if (element.Name == "input")
146            {
147                categoryGrid.Visibility = Visibility.Hidden;
148                inputPanel.Visibility = Visibility.Visible;
[2290]149
[2424]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();
[2426]160                    textBox.Tag = box;
[2424]161                    textBox.MinLines = 4;
162                    inputStack.Children.Add(textBox);
[2496]163                    if (propertyValueDict.ContainsKey(GetElementID(box)))
164                        textBox.Text = propertyValueDict[GetElementID(box)].Value;
165                    else if (box.Attribute("defaultValue") != null)
[2424]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");
[2426]174                if (inputPanel.Tag == null)
175                    inputPanel.Tag = element.Element("loadSample");
[2424]176
177                if (inputPanel.Tag != null)
178                    nextButton.IsEnabled = true;
[2479]179
180                string id = GetElementID((XElement)inputPanel.Tag);
181
182                if (choicePath.Count > 0 && id == choicePath.Last())
183                    choicePath.RemoveAt(choicePath.IndexOf(choicePath.Last()));
[2424]184            }
[2479]185
[2424]186            else if (element.Name == "category")
[2290]187            {
[2424]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");
[2426]197                IEnumerable<XElement> loadSamples = element.Elements("loadSamples");
[2424]198
199                if (inputs.Any())
200                    categories = categories.Union(inputs);
[2426]201                if (loadSamples.Any())
202                    categories = categories.Union(loadSamples);
[2424]203
204                if (categories.Any())
[2290]205                {
[2479]206                    bool isSelected = false;
207
[2424]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();
[2297]214
[2424]215                        border.Child = sp;
216                        border.VerticalAlignment = VerticalAlignment.Stretch;
217                        border.CornerRadius = new CornerRadius(5, 0, 0, 5);
218                        border.BorderBrush = Brushes.LightSeaGreen;
[2394]219
[2424]220                        l.Height = 30;
221                        l.HorizontalAlignment = HorizontalAlignment.Stretch;
222                        XElement label = FindElementInElement(ele, "name");
223                        if (label != null)
224                            l.Content = label.Value;
[2290]225
[2424]226                        i.Width = 26;
227                        string image = ele.Attribute("image").Value;
228                        if (image != null)
[2297]229                        {
[2424]230                            ImageSource ims = (ImageSource) TryFindResource(image);
231                            if (ims != null)
232                            {
233                                i.Source = ims;
234                                sp.Children.Add(i);
235                            }
[2297]236                        }
[2290]237
[2424]238                        sp.VerticalAlignment = VerticalAlignment.Stretch;
239                        sp.HorizontalAlignment = HorizontalAlignment.Stretch;
240                        sp.Orientation = Orientation.Horizontal;
241                        sp.Children.Add(l);
[2290]242
[2424]243                        RadioButton rb = new RadioButton();
[2426]244                        string id = GetElementID(ele);
[2424]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;
[2333]251
[2424]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;
[2479]257                            isSelected = true;
[2424]258                            nextButton.IsEnabled = true;
259                        }
[2331]260                    }
[2479]261
262                    if (!isSelected)
263                    {
264                        RadioButton b = (RadioButton)radioButtonStackPanel.Children[0];
265                        b.IsChecked = true;
266                    }
267
[2290]268                }
269            }
270
[2284]271        }
272
[2426]273        private string GetElementID(XElement element)
274        {
[2479]275            if (element != null && element.Parent != null)
[2426]276            {
277                return GetElementID(element.Parent) + "[" + element.Parent.Nodes().ToList().IndexOf(element) + "]." + element.Name;
278            }
279            else
280                return "";
281        }
282
[2496]283        private void LoadSample(string file, string title)
[2426]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);
[2444]302                    return;
[2426]303                }
304            }
305
[2496]306            OnOpenTab(newEditor, title, null);           
[2444]307            newEditor.Open(model);                   
[2426]308        }
309
[2290]310        void rb_Checked(object sender, RoutedEventArgs e)
311        {
[2333]312            ResetBackground();
[2290]313            RadioButton b = (RadioButton)sender;
[2394]314            b.Background = Brushes.LightSeaGreen;
315            Border c = (Border)b.Content;
316            c.BorderThickness = new Thickness(1, 1, 0, 1);
317            c.Background = selectionBrush;
[2290]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
[2333]325        private void ResetBackground()
326        {
[2394]327            for (int i = 0; i < radioButtonStackPanel.Children.Count; i++)
[2333]328            {
[2394]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;
[2333]334            }
335        }
336
[2290]337        //finds elements according to the current language
338        private XElement FindElementInElement(XElement element, string xname)
339        {
[2357]340            CultureInfo currentLang = System.Globalization.CultureInfo.CurrentCulture;
[2290]341            XElement foundElement = null;
342
343            IEnumerable<XElement> descriptions = element.Elements(xname);
344            if (descriptions.Any())
345            {
[2357]346                var description = from descln in descriptions where descln.Attribute("lang").Value == currentLang.TextInfo.CultureName select descln;
[2290]347                if (!description.Any())
348                {
[2357]349                    description = from descln in descriptions where descln.Attribute("lang").Value == currentLang.TwoLetterISOLanguageName select descln;
[2290]350                    if (description.Any())
351                        foundElement = description.First();
[2357]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                    }
[2290]358                }
359                else
360                    foundElement = description.First();
361            }
362
363            return foundElement;
364        }
365
366        private void nextButton_Click(object sender, RoutedEventArgs e)
367        {
[2421]368            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardNext1");
[2394]369            mainGridStoryboardLeft.Begin();
[2290]370        }
371
372        private void backButton_Click(object sender, RoutedEventArgs e)
373        {
[2421]374            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardBack1");
375            mainGridStoryboardLeft.Begin();
[2290]376        }
377
378        private void abortButton_Click(object sender, RoutedEventArgs e)
379        {
[2496]380            propertyValueDict.Clear();
[2333]381            ResetBackground();
[2290]382            radioButtonStackPanel.Children.Clear();
[2331]383            choicePath.Clear();
[2290]384            description.Text = "";
385            SetupPage(wizardConfigXML);
386        }
387
[2421]388        private void SetNextContent(object sender, EventArgs e)
[2394]389        {
[2424]390            if (categoryGrid.IsVisible)
[2394]391            {
[2424]392                for (int i = 0; i < radioButtonStackPanel.Children.Count; i++)
[2394]393                {
[2424]394                    RadioButton b = (RadioButton) radioButtonStackPanel.Children[i];
395                    if (b.IsChecked != null && (bool) b.IsChecked)
396                    {
[2426]397                        choicePath.Add(GetElementID((XElement) b.Tag));
[2424]398                        SetupPage((XElement) b.Tag);
399                        break;
400                    }
[2394]401                }
402            }
[2424]403            else if (inputPanel.IsVisible)
404            {
[2426]405                foreach (var child in inputStack.Children)
406                {
407                    if (child is TextBox)
408                    {
[2496]409                        SaveTextboxContent((TextBox)child);
[2426]410                    }
411                }
[2424]412                var nextElement = (XElement) inputPanel.Tag;
[2426]413                choicePath.Add(GetElementID(nextElement));
[2424]414                SetupPage(nextElement);
415            }
[2394]416
[2421]417            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardNext2");
[2394]418            mainGridStoryboardLeft.Begin();
419        }
420
[2496]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                                   };
[2421]433
[2496]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
[2421]451        private void SetLastContent(object sender, EventArgs e)
[2394]452        {
[2424]453            XElement ele = null;
454            if (categoryGrid.IsVisible && radioButtonStackPanel.Children.Count > 0)
[2421]455            {
[2424]456                RadioButton b = (RadioButton) radioButtonStackPanel.Children[0];
457                ele = (XElement) b.Tag;
458            }
459            else if (inputPanel.IsVisible)
460            {
[2496]461                foreach (var child in inputStack.Children)
462                {
463                    if (child is TextBox)
464                    {
465                        DeleteTextboxContent((TextBox)child);
466                    }
467                }
468
[2424]469                ele = (XElement) inputPanel.Tag;
470            }
471
472            if (ele != null)
473            {
[2421]474                XElement grandParent = ele.Parent.Parent;
475                if (grandParent != null)
476                    SetupPage(grandParent);
477                else
478                    SetupPage(wizardConfigXML);
479            }
[2394]480
[2421]481            Storyboard mainGridStoryboardLeft = (Storyboard)FindResource("MainGridStoryboardBack2");
482            mainGridStoryboardLeft.Begin();
[2394]483        }
[2426]484
485        private void GuiLogMessage(string message, NotificationLevel loglevel)
486        {
487            if (OnGuiLogNotificationOccured != null)
488                OnGuiLogNotificationOccured(null, new GuiLogEventArgs(message, null, loglevel));
489        }
[2210]490    }
[2426]491
492    internal struct PluginPropertyValue
493    {
494        public string PluginName;
495        public string PropertyName;
496        public string Value;
497    }
[2210]498}
Note: See TracBrowser for help on using the repository browser.