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

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

Wizard:

  • added images to the categories
File size: 9.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.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    public partial class WizardControl : UserControl
27    {
28
29        private const string configXMLPath = "Wizard.Config.wizard.config.start.xml";
30        private const string defaultLang = "en";
31        private XElement wizardConfigXML;
32
33        public WizardControl()
34        {
35            try
36            {
37                // DEBUG HELP string[] names = this.GetType().Assembly.GetManifestResourceNames();
38
39                Stream fileStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(configXMLPath);
40                XElement xml = XElement.Load(fileStream);
41                GenerateXML(xml);
42            }
43            catch (Exception)
44            {
45               
46            }
47            InitializeComponent();
48            SetupPage(wizardConfigXML);
49        }
50
51        // generate the full XML tree for the wizard (recursive)
52        private void GenerateXML(XElement xml)
53        {
54            try
55            {
56                //find all nested subcategories and add them to the tree
57                IEnumerable<XElement> categories = xml.Elements("category");
58                if (categories.Any())
59                {
60                    foreach (XElement cat in categories)
61                    {
62                        IEnumerable<XElement> files = cat.Elements("file");
63                        if (files.Any())
64                        {
65                            foreach (XElement element in files)
66                            {
67                                XAttribute att = element.Attribute("resource");
68                                if (att != null)
69                                {
70                                    string path = att.Value;
71                                    Stream fileStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(path);
72                                    XElement sub = XElement.Load(fileStream);
73                                    GenerateXML(sub);
74                                    IEnumerable<XElement> elems = sub.Elements();
75                                    if (elems.Any())
76                                    {
77                                        foreach (XElement ele in elems)
78                                        {
79                                            cat.Add(ele);
80                                        }
81                                    }
82                                }
83                            }
84                        }
85                    }
86                }
87
88                wizardConfigXML = xml;
89
90            }
91            catch (Exception)
92            {
93               
94            }
95        }
96
97        private void SetupPage(XElement element)
98        {
99            XElement parent = element.Parent;
100            if (parent == null)
101            {
102                backButton.IsEnabled = false;
103                abortButton.IsEnabled = false;
104            }
105            else
106            {
107                backButton.IsEnabled = true;
108                abortButton.IsEnabled = true;
109            }
110
111            nextButton.IsEnabled = false;
112
113            string currentLang = System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
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                    rb.HorizontalAlignment = HorizontalAlignment.Stretch;
164                    rb.HorizontalContentAlignment = HorizontalAlignment.Left;
165                    rb.Checked += rb_Checked;
166                    rb.Content = sp;
167                    rb.Tag = ele;
168
169                    radioButtonStackPanel.Children.Add(rb);
170                }
171            }
172
173        }
174
175        void rb_Checked(object sender, RoutedEventArgs e)
176        {
177            RadioButton b = (RadioButton)sender;
178            XElement ele = (XElement)b.Tag;
179            XElement desc = FindElementInElement(ele, "description");
180            if (desc != null)
181                description.Text = desc.Value;
182            nextButton.IsEnabled = true;
183        }
184
185        //finds elements according to the current language
186        private XElement FindElementInElement(XElement element, string xname)
187        {
188            string currentLang = System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
189            XElement foundElement = null;
190
191            IEnumerable<XElement> descriptions = element.Elements(xname);
192            if (descriptions.Any())
193            {
194                var description = from descln in descriptions where descln.Attribute("lang").Value == currentLang select descln;
195                if (!description.Any())
196                {
197                    description = from descln in descriptions where descln.Attribute("lang").Value == defaultLang select descln;
198                    if (description.Any())
199                        foundElement = description.First();
200                }
201                else
202                    foundElement = description.First();
203            }
204
205            return foundElement;
206        }
207
208        private void nextButton_Click(object sender, RoutedEventArgs e)
209        {
210            UIElement[] uiea = new UIElement[radioButtonStackPanel.Children.Count];
211            radioButtonStackPanel.Children.CopyTo(uiea, 0);
212            foreach (UIElement uie in uiea)
213            {
214                RadioButton b = (RadioButton)uie;
215                if (b.IsChecked != null && (bool)b.IsChecked)
216                {
217                    radioButtonStackPanel.Children.Clear();
218                    description.Text = "";
219                    SetupPage((XElement)b.Tag);
220                    break;
221                }
222            }
223        }
224
225        private void backButton_Click(object sender, RoutedEventArgs e)
226        {
227            UIElement[] uiea = new UIElement[radioButtonStackPanel.Children.Count];
228            radioButtonStackPanel.Children.CopyTo(uiea, 0);
229            if (uiea.Length > 0)
230            {
231                RadioButton b = (RadioButton)uiea[0];
232                XElement ele = (XElement)b.Tag;
233                radioButtonStackPanel.Children.Clear();
234                description.Text = "";
235                XElement grandParent = ele.Parent.Parent;
236                if (grandParent != null)
237                    SetupPage(grandParent);
238                else
239                    SetupPage(wizardConfigXML); 
240            }
241        }
242
243        private void abortButton_Click(object sender, RoutedEventArgs e)
244        {
245            radioButtonStackPanel.Children.Clear();
246            description.Text = "";
247            SetupPage(wizardConfigXML);
248        }
249
250    }
251}
Note: See TracBrowser for help on using the repository browser.