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

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

Wizard:

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