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

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

Wizard:

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