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

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

Added visual help (background color) to underline the relation between selection and description (click through and you'll see)

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