source: trunk/CrypPlugins/QuadraticSieve/ProgressRelationPackages.xaml.cs @ 2018

Last change on this file since 2018 was 2018, checked in by Sven Rech, 11 years ago

put UniqueIdentifier class in PluginBase

File size: 6.0 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;
14
15namespace Cryptool.Plugins.QuadraticSieve
16{
17    /// <summary>
18    /// Interaction logic for ProgressRelationPackages.xaml
19    /// </summary>
20    public partial class ProgressRelationPackages : UserControl
21    {
22        private long ourID;
23        private ScrollViewer scrollViewer;
24
25        public void Set(int i, long id, string name)
26        {
27            if (root.Children.Count <= i)   //if no shape exists for this relation package yet
28            {
29                //Create some shapes to fill the gap:
30                for (int c = root.Children.Count; c < i; c++)
31                    CreateRelationPackageShape(c, 0, name);
32                //create the rect:
33                CreateRelationPackageShape(i, id, name);
34            }
35            else
36            {
37                SetShapeToStatus(i, id, name);
38            }
39        }
40
41        public void Clear()
42        {
43            root.Children.Clear();
44        }
45
46        public void setOurID(long id)
47        {
48            ourID = id;
49        }
50
51        private void SetShapeToStatus(int index, long uploaderID, string uploaderName)
52        {
53            ToolTip tooltip = new ToolTip();
54            Shape shape = root.Children[index] as Shape;
55
56            if (uploaderID == ourID)
57            {
58                if (!(shape is Ellipse))
59                {
60                    root.Children.Remove(shape);
61                    shape = GetRelationPackageShape(uploaderID);                   
62                    root.Children.Insert(index, shape);
63                }
64                shape.Fill = GetColor(uploaderID);
65                tooltip.Content = "This relation package was sieved by us";
66            }
67            else if (uploaderID == 0)
68            {
69                shape.Fill = Brushes.Black;
70                tooltip.Content = "This relation package was sieved by an unknown user and we didn't load it yet";
71            }
72            else if (uploaderID == -1)
73            {
74                if (!(shape is Path))
75                {
76                    root.Children.Remove(shape);
77                    shape = GetRelationPackageShape(-1);
78                    root.Children.Insert(index, shape);
79                }
80                shape.Fill = Brushes.Black;
81                tooltip.Content = "This relation package got lost";
82            }
83            else
84            {
85                shape.Fill = GetColor(uploaderID);
86                if (uploaderName == null)
87                    uploaderName = "other user";
88                tooltip.Content = "This relation package was sieved by " + uploaderName + " but we loaded it";
89            }           
90            shape.ToolTip = tooltip;
91        }
92
93        private Brush GetColor(long uploaderID)
94        {           
95            SolidColorBrush color = new SolidColorBrush();
96            Random random = new Random((int)uploaderID);
97
98            bool ok;
99            do
100            {
101                ok = true;
102                color.Color = Color.FromRgb((byte)random.Next(256), (byte)random.Next(256), (byte)random.Next(256));
103
104                if (SimilarColors(color.Color, Color.FromRgb(0, 0, 0)))             //Check Black similarity
105                    ok = false;
106                else if (SimilarColors(color.Color, Color.FromRgb(255, 255, 255)))  //Check White similarity
107                    ok = false;
108
109            } while (!ok);
110
111            return color;       
112        }
113
114        private bool SimilarColors(Color col1, Color col2)
115        {
116            const int toleratedDifference = 15;
117            int diffR = Math.Abs(col1.R - col2.R);
118            int diffG = Math.Abs(col1.G - col2.G);
119            int diffB = Math.Abs(col1.B - col2.B);
120            return (diffR < toleratedDifference) && (diffG < toleratedDifference) && (diffB < toleratedDifference);
121        }
122
123        private void CreateRelationPackageShape(int c, long id, string name)
124        {
125            Shape shape = GetRelationPackageShape(id);           
126            root.Children.Add(shape);
127            SetShapeToStatus(root.Children.Count-1, id, name);
128            scrollViewer.ScrollToBottom();
129        }
130
131        private Shape GetRelationPackageShape(long id)
132        {
133            Shape shape;
134            if (id == ourID)
135                shape = new Ellipse();
136            else if (id == -1)
137                shape = new Path();
138            else
139                shape = new Rectangle();
140
141            shape.Width = 10;
142            shape.Height = shape.Width;
143            shape.Stroke = Brushes.White;
144            shape.StrokeThickness = 0.1;
145
146            if (id == -1)       //Draw the null shape
147            {
148                Path path = shape as Path;
149                RectangleGeometry rect = new RectangleGeometry();
150                rect.Rect = new Rect(0, 0, 10, 10);
151                LineGeometry line1 = new LineGeometry();
152                line1.StartPoint = new Point(0, 0);
153                line1.EndPoint = new Point(shape.Width, shape.Height);
154                LineGeometry line2 = new LineGeometry();
155                line2.StartPoint = new Point(shape.Width, 0);
156                line2.EndPoint = new Point(0, shape.Height);
157                GeometryGroup group = new GeometryGroup();
158                group.Children.Add(rect);
159                group.Children.Add(line1);
160                group.Children.Add(line2);
161                path.StrokeThickness = 1;
162                path.Data = group;
163            }
164
165            return shape;
166        }
167
168        public ProgressRelationPackages(ScrollViewer scrollViewer)
169        {
170            InitializeComponent();
171            root.Children.Clear();
172            this.scrollViewer = scrollViewer;
173        }
174    }
175}
Note: See TracBrowser for help on using the repository browser.