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

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

Wizard now remembers the last selected element

File size: 9.5 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.Imaging;
12using System.Windows.Navigation;
13using System.Windows.Shapes;
14using System.Xml.Linq;
15using System.IO;
16using System.Reflection;
17using System.Windows.Threading;
18using System.Threading;
19using System.Collections;
20
21namespace Wizard
22{
23    /// <summary>
24    /// Interaction logic for WizardControl.xaml
25    /// </summary>
26    [Cryptool.PluginBase.Attributes.Localization("Wizard.Properties.Resources")]
27    public partial class WizardControl : UserControl
28    {
29
30        private List<string> choicePath = new List<string>();
31        private const string configXMLPath = "Wizard.Config.wizard.config.start.xml";
32        private const string defaultLang = "en-US";
33        private XElement wizardConfigXML;
34
35        public WizardControl()
36        {
37            try
38            {
39                // DEBUG HELP string[] names = this.GetType().Assembly.GetManifestResourceNames();
40
41                Stream fileStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(configXMLPath);
42                XElement xml = XElement.Load(fileStream);
43                GenerateXML(xml);
44            }
45            catch (Exception)
46            {
47               
48            }
49            InitializeComponent();
50            SetupPage(wizardConfigXML);
51        }
52
53        // generate the full XML tree for the wizard (recursive)
54        private void GenerateXML(XElement xml)
55        {
56            try
57            {
58                //find all nested subcategories and add them to the tree
59                IEnumerable<XElement> categories = xml.Elements("category");
60                if (categories.Any())
61                {
62                    foreach (XElement cat in categories)
63                    {
64                        IEnumerable<XElement> files = cat.Elements("file");
65                        if (files.Any())
66                        {
67                            foreach (XElement element in files)
68                            {
69                                XAttribute att = element.Attribute("resource");
70                                if (att != null)
71                                {
72                                    string path = att.Value;
73                                    Stream fileStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(path);
74                                    XElement sub = XElement.Load(fileStream);
75                                    GenerateXML(sub);
76                                    IEnumerable<XElement> elems = sub.Elements();
77                                    if (elems.Any())
78                                    {
79                                        foreach (XElement ele in elems)
80                                        {
81                                            cat.Add(ele);
82                                        }
83                                    }
84                                }
85                            }
86                        }
87                    }
88                }
89
90                wizardConfigXML = xml;
91
92            }
93            catch (Exception)
94            {
95               
96            }
97        }
98
99        private void SetupPage(XElement element)
100        {
101            XElement parent = element.Parent;
102            if (parent == null)
103            {
104                backButton.IsEnabled = false;
105                abortButton.IsEnabled = false;
106            }
107            else
108            {
109                backButton.IsEnabled = true;
110                abortButton.IsEnabled = true;
111            }
112
113            nextButton.IsEnabled = false;
114
115            //set headline
116            XElement headline = FindElementInElement(element, "headline");
117            if (headline != null)
118                taskHeader.Content = headline.Value;
119
120            //set description label
121            XElement desc = FindElementInElement(element, "desc");
122            if (desc != null)
123                descHeader.Content = desc.Value;
124
125            //generate radio buttons
126            IEnumerable<XElement> categories = element.Elements("category");
127            IEnumerable<XElement> items = element.Elements("item");
128
129            if (items.Any())
130                categories = categories.Union(items);
131
132            if (categories.Any())
133            {
134                foreach (XElement ele in categories)
135                {
136                    Label l = new Label();
137                    Image i = new Image();
138                    StackPanel sp = new StackPanel();
139
140                    l.Height = 30;
141                    XElement label = FindElementInElement(ele, "name");
142                    if (label != null)
143                        l.Content = label.Value;
144
145                    i.Width = 26;
146                    string image = (string)ele.Attribute("image");
147                    if (image != null)
148                    {
149                        ImageSource ims = (ImageSource)TryFindResource(image);
150                        if (ims != null)
151                        {
152                            i.Source = ims;
153                            sp.Children.Add(i);
154                        }
155                    }
156
157                    sp.VerticalAlignment = VerticalAlignment.Stretch;
158                    sp.HorizontalAlignment = HorizontalAlignment.Stretch;
159                    sp.Orientation = Orientation.Horizontal;
160                    sp.Children.Add(l);
161
162                    RadioButton rb = new RadioButton();
163                    string id = (string)ele.Attribute("id");
164                    if (id != null)
165                        rb.Name = id;
166                    if (choicePath.Count > 0 && id == choicePath.Last())
167                    {
168                        choicePath.RemoveAt(choicePath.IndexOf(choicePath.Last()));
169                        rb.IsChecked = true;
170                        nextButton.IsEnabled = true;
171                    }
172                    rb.HorizontalAlignment = HorizontalAlignment.Stretch;
173                    rb.HorizontalContentAlignment = HorizontalAlignment.Left;
174                    rb.Checked += rb_Checked;
175                    rb.Content = sp;
176                    rb.Tag = ele;
177
178                    radioButtonStackPanel.Children.Add(rb);
179                }
180            }
181
182        }
183
184        void rb_Checked(object sender, RoutedEventArgs e)
185        {
186            RadioButton b = (RadioButton)sender;
187            XElement ele = (XElement)b.Tag;
188            XElement desc = FindElementInElement(ele, "description");
189            if (desc != null)
190                description.Text = desc.Value;
191            nextButton.IsEnabled = true;
192        }
193
194        //finds elements according to the current language
195        private XElement FindElementInElement(XElement element, string xname)
196        {
197            string currentLang = System.Globalization.CultureInfo.CurrentCulture.Name;
198            XElement foundElement = null;
199
200            IEnumerable<XElement> descriptions = element.Elements(xname);
201            if (descriptions.Any())
202            {
203                var description = from descln in descriptions where descln.Attribute("lang").Value == currentLang select descln;
204                if (!description.Any())
205                {
206                    description = from descln in descriptions where descln.Attribute("lang").Value == defaultLang select descln;
207                    if (description.Any())
208                        foundElement = description.First();
209                }
210                else
211                    foundElement = description.First();
212            }
213
214            return foundElement;
215        }
216
217        private void nextButton_Click(object sender, RoutedEventArgs e)
218        {
219            UIElement[] uiea = new UIElement[radioButtonStackPanel.Children.Count];
220            radioButtonStackPanel.Children.CopyTo(uiea, 0);
221            foreach (UIElement uie in uiea)
222            {
223                RadioButton b = (RadioButton)uie;
224                if (b.IsChecked != null && (bool)b.IsChecked)
225                {
226                    choicePath.Add(b.Name);
227                    radioButtonStackPanel.Children.Clear();
228                    description.Text = "";
229                    SetupPage((XElement)b.Tag);
230                    break;
231                }
232            }
233        }
234
235        private void backButton_Click(object sender, RoutedEventArgs e)
236        {
237            UIElement[] uiea = new UIElement[radioButtonStackPanel.Children.Count];
238            radioButtonStackPanel.Children.CopyTo(uiea, 0);
239            if (uiea.Length > 0)
240            {
241                RadioButton b = (RadioButton)uiea[0];
242                XElement ele = (XElement)b.Tag;
243                radioButtonStackPanel.Children.Clear();
244                description.Text = "";
245                XElement grandParent = ele.Parent.Parent;
246                if (grandParent != null)
247                    SetupPage(grandParent);
248                else
249                    SetupPage(wizardConfigXML); 
250            }
251        }
252
253        private void abortButton_Click(object sender, RoutedEventArgs e)
254        {
255            radioButtonStackPanel.Children.Clear();
256            choicePath.Clear();
257            description.Text = "";
258            SetupPage(wizardConfigXML);
259        }
260
261    }
262}
Note: See TracBrowser for help on using the repository browser.