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

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

Wizard:

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