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

Last change on this file since 2479 was 2479, checked in by sauer, 10 years ago

Wizard:

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