source: trunk/CrypPlugins/KeySearcher/Presentation/Controls/StatisticsPresentation.xaml.cs @ 2393

Last change on this file since 2393 was 2393, checked in by matkovic, 11 years ago

-added collapse all / expand all button
-added aging in indicated by the ProgressBar color

File size: 10.7 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Globalization;
5using System.Linq;
6using System.Text;
7using System.Threading;
8using System.Windows;
9using System.Windows.Controls;
10using System.Windows.Data;
11using System.Windows.Documents;
12using System.Windows.Input;
13using System.Windows.Media;
14using System.Windows.Media.Imaging;
15using System.Windows.Navigation;
16using System.Windows.Shapes;
17using System.Windows.Threading;
18using KeySearcher;
19
20namespace KeySearcherPresentation.Controls
21{
22    /// <summary>
23    /// Interaction logic for StatisticsPresentation.xaml
24    /// </summary>
25    [Cryptool.PluginBase.Attributes.Localization("KeySearcher.Properties.Resources")]
26    public partial class StatisticsPresentation : UserControl
27    {
28        public StatisticsPresentation()
29        {
30            InitializeComponent();
31            ((InformationToProgressConverter)Resources["InformationToProgressConverter"]).StatisticsPresentation = this;
32            ((InformationToProgressConverter2)Resources["InformationToProgressConverter2"]).StatisticsPresentation = this;
33            ((ChunkSumConverter)Resources["ChunkSumConverter"]).StatisticsPresentation = this;
34            ((StringLengthConverter)Resources["StringLengthConverter"]).StatisticsPresentation = this;
35            ((MachineSumToProgressConverter)Resources["MachineSumToProgressConverter"]).StatisticsPresentation = this;
36        }
37
38        private Dictionary<string, Dictionary<long, Information>> statistics = null;
39        public Dictionary<string, Dictionary<long, Information>> Statistics
40        {
41            get { return statistics; }
42            set
43            {
44                statistics = value;
45                Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
46                                               {
47                                                   var orderedstats = statistics.OrderByDescending((x) => x.Value.Sum((z) => z.Value.Count));
48                                                   statisticsTree.DataContext = orderedstats;
49                                                   statisticsTree.Items.Refresh();
50                                                }, null);
51
52            }
53        }
54
55        private Dictionary<long, Maschinfo> machineHierarchy = null;
56        public Dictionary<long, Maschinfo> MachineHierarchy
57        {
58            get { return machineHierarchy; }
59            set
60            { 
61                machineHierarchy = value;
62                Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
63                                                {
64                                                    //var orderedstats = machineHierarchy.OrderByDescending((x) => x.Value.Sum);
65                                                    machineTree.DataContext = machineHierarchy;
66                                                    machineTree.Items.Refresh();
67                                                }, null);
68            }
69        }
70
71        private void Button_Click(object sender, RoutedEventArgs e)
72        {
73            Button b = sender as Button;
74
75            if(statisticsTree.ItemContainerStyle == null)
76            {
77                b.Content = "Expand";
78                statisticsTree.ItemContainerStyle = this.Resources["ItemStyle2"] as Style;
79            }
80
81            if (statisticsTree.ItemContainerStyle.Equals(this.Resources["ItemStyle"] as Style))
82            {
83                b.Content = "Expand";
84                statisticsTree.ItemContainerStyle = this.Resources["ItemStyle2"] as Style;
85                return;
86            }
87
88            if (statisticsTree.ItemContainerStyle.Equals(this.Resources["ItemStyle2"] as Style))
89            {
90                b.Content = "Collapse";
91                statisticsTree.ItemContainerStyle = this.Resources["ItemStyle"] as Style;
92                return;
93            }
94        }
95    }
96
97    #region Converters
98    [ValueConversion(typeof(Dictionary<long, Information>), typeof(Double))]
99    class InformationToProgressConverter : IValueConverter
100    {
101        public StatisticsPresentation StatisticsPresentation { get; set; }
102
103        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
104        {
105            if (StatisticsPresentation != null)
106            {
107                double allCount = (StatisticsPresentation.Statistics).Sum(i => i.Value.Sum(j => j.Value.Count));
108                double vCount = ((Dictionary<long, Information>)value).Sum(i => i.Value.Count);
109                return vCount / allCount;
110            }
111            else
112            {
113                return 0;
114            }
115        }
116
117        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
118        {
119            throw new NotImplementedException();
120        }
121    }
122
123    [ValueConversion(typeof(Dictionary<long, Information>), typeof(Double))]
124    class MachineSumToProgressConverter : IValueConverter
125    {
126        public StatisticsPresentation StatisticsPresentation { get; set; }
127
128        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
129        {
130            if (StatisticsPresentation != null)
131            {
132                double allCount = (StatisticsPresentation.MachineHierarchy).Sum(i => i.Value.Sum);
133                double vCount = (int)value;
134                return vCount / allCount;
135            }
136            else
137            {
138                return 0;
139            }
140        }
141
142        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
143        {
144            throw new NotImplementedException();
145        }
146    }
147
148    [ValueConversion(typeof(string), typeof(Double))]
149    class ChunkSumConverter : IValueConverter
150    {
151        public StatisticsPresentation StatisticsPresentation { get; set; }
152
153        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
154        {
155            if (StatisticsPresentation != null)
156            {
157                string key = (string)value;
158                var data = (StatisticsPresentation.Statistics)[key];
159                return data.Sum(i => i.Value.Count);
160            }
161            else
162            {
163                return 0;
164            }
165        }
166
167        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
168        {
169            throw new NotImplementedException();
170        }
171    }
172
173    [ValueConversion(typeof(string), typeof(string))]
174    class StringLengthConverter : IValueConverter
175    {
176        public StatisticsPresentation StatisticsPresentation { get; set; }
177
178        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
179        {
180            if (StatisticsPresentation != null)
181            {
182                string name = (string)value;
183               
184                if(name.Length < 13)
185                {
186                    return name;
187                }
188                else
189                {
190                    return string.Format("{0}...", name.Substring(0, 9));
191                }
192            }
193            else
194            {
195                return "";
196            }
197        }
198
199        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
200        {
201            throw new NotImplementedException();
202        }
203    }
204
205    [ValueConversion(typeof(Int32), typeof(Double))]
206    class InformationToProgressConverter2 : IValueConverter
207    {
208        public StatisticsPresentation StatisticsPresentation { get; set; }
209
210        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
211        {
212            if (StatisticsPresentation != null)
213            {
214                double allCount = (StatisticsPresentation.Statistics).Sum(i => i.Value.Sum(j => j.Value.Count));
215                return (int)value / allCount;
216            }
217            else
218            {
219                return 0;
220            }
221        }
222
223        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
224        {
225            throw new NotImplementedException();
226        }
227    }
228
229    public class ColorToDateConverter : IMultiValueConverter
230    {
231        public static SolidColorBrush[] AlternationColors = {Brushes.LimeGreen, Brushes.Red, Brushes.Blue};
232
233        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
234        {
235            DateTime date = (DateTime) values[0];
236            SolidColorBrush brush = ColorToDateConverter.AlternationColors[(int) values[1]].Clone();
237            TimeSpan diff = DateTime.UtcNow.Subtract(date);
238
239            Color color;
240            if (diff >= TimeSpan.FromDays(4))
241            {
242                color = Color.FromArgb(
243                    (byte)50,
244                    brush.Color.R, 
245                    brush.Color.G, 
246                    brush.Color.B);
247
248                brush.Color = color;
249                return brush;
250            }
251
252            if (diff >= TimeSpan.FromDays(3))
253            {
254                 color = Color.FromArgb(
255                    (byte)100,
256                    brush.Color.R, 
257                    brush.Color.G, 
258                    brush.Color.B);
259
260                brush.Color = color;
261                return brush;
262            }
263
264            if (diff >= TimeSpan.FromDays(2))
265            {
266                 color = Color.FromArgb(
267                    (byte)150,
268                    brush.Color.R, 
269                    brush.Color.G, 
270                    brush.Color.B);
271
272                brush.Color = color;
273                return brush;
274            }
275
276            if (diff >= TimeSpan.FromDays(1))
277            {
278                color = Color.FromArgb(
279                    (byte)200,
280                    brush.Color.R, 
281                    brush.Color.G, 
282                    brush.Color.B);
283
284                brush.Color = color;
285                return brush;
286            }
287
288            if (diff >= TimeSpan.FromDays(0))
289            {
290
291                color = Color.FromArgb(
292                    (byte)255,
293                    brush.Color.R,
294                    brush.Color.G,
295                    brush.Color.B);
296
297                brush.Color = color;
298                return brush;
299            }
300            return Brushes.AntiqueWhite;
301        }
302
303        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
304        {
305            throw new NotImplementedException();
306        }
307    }
308    #endregion
309
310}
Note: See TracBrowser for help on using the repository browser.