Changeset 13045 for branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/Primitives/Group.cs
- Timestamp:
- 10/21/15 14:18:31 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/Primitives/Group.cs
r12535 r13045 21 21 22 22 using System; 23 using System.Collections; 23 24 using System.Collections.Generic; 24 using System.Collections.ObjectModel;25 25 using System.Drawing; 26 26 using System.Linq; … … 29 29 namespace HeuristicLab.Visualization { 30 30 public class Group : PrimitiveBase, IGroup { 31 private LinkedList<IPrimitive> myPrimitives; 32 private HashSet<IPrimitive> myPrimitivesLookup; 33 public virtual ReadOnlyCollection<IPrimitive> Primitives { 34 get { return new ReadOnlyCollection<IPrimitive>(new List<IPrimitive>(myPrimitives)); } 35 } 36 public virtual ReadOnlyCollection<IPrimitive> SelectedPrimitives { 37 get { 38 List<IPrimitive> selected = new List<IPrimitive>(); 39 foreach (IPrimitive primitive in myPrimitives) { 40 if (primitive.Selected) selected.Add(primitive); 41 } 42 return new ReadOnlyCollection<IPrimitive>(selected); 43 } 44 } 31 private readonly LinkedList<IPrimitive> primitives; 32 private readonly HashSet<IPrimitive> primitivesLookup; 33 34 public virtual IEnumerable<IPrimitive> Primitives { 35 get { return primitives.ToArray(); } 36 } 37 public virtual IEnumerable<IPrimitive> SelectedPrimitives { 38 get { return primitives.Where(x => x.Selected).ToArray(); } 39 } 40 45 41 public override bool Selected { 46 42 get { return base.Selected; } 47 43 set { 48 bool updateEnabled = UpdateEnabled; 49 UpdateEnabled = false; 50 foreach (IPrimitive primitive in myPrimitives) 51 primitive.Selected = value; 52 UpdateEnabled = updateEnabled; 53 base.Selected = value; 44 SuppressEvents = true; 45 try { 46 foreach (var primitive in primitives) 47 primitive.Selected = value; 48 base.Selected = value; 49 } finally { 50 SuppressEvents = false; 51 OnRedrawRequired(); 52 } 54 53 } 55 54 } … … 57 56 public Group(IChart chart) 58 57 : base(chart) { 59 myPrimitives = new LinkedList<IPrimitive>();60 myPrimitivesLookup = new HashSet<IPrimitive>();58 primitives = new LinkedList<IPrimitive>(); 59 primitivesLookup = new HashSet<IPrimitive>(); 61 60 } 62 61 63 62 public virtual void Add(IPrimitive primitive) { 64 if (Contains(primitive)) 65 throw new ArgumentException("Primitive already added"); 66 67 myPrimitives.AddFirst(primitive); 68 myPrimitivesLookup.Add(primitive); 69 primitive.Group = this; 70 primitive.Update += new EventHandler(primitive_Update); 71 OnUpdate(); 63 if (Contains(primitive)) throw new ArgumentException("Primitive already added"); 64 primitives.AddFirst(primitive); 65 primitivesLookup.Add(primitive); 66 primitive.RedrawRequired += PrimitiveOnRedrawRequired; 67 OnRedrawRequired(); 72 68 } 73 69 public virtual void AddRange(IEnumerable<IPrimitive> primitives) { 74 foreach (IPrimitive primitive in primitives) { 75 if (Contains(primitive)) 76 throw new ArgumentException("Primitive already added"); 77 78 myPrimitives.AddFirst(primitive); 79 myPrimitivesLookup.Add(primitive); 80 primitive.Group = this; 81 primitive.Update += new EventHandler(primitive_Update); 82 } 83 OnUpdate(); 84 } 70 foreach (var primitive in this.primitives) { 71 if (Contains(primitive)) throw new ArgumentException("Primitive already added"); 72 this.primitives.AddFirst(primitive); 73 primitivesLookup.Add(primitive); 74 primitive.RedrawRequired += PrimitiveOnRedrawRequired; 75 } 76 OnRedrawRequired(); 77 } 78 85 79 public virtual bool Contains(IPrimitive primitive) { 86 return myPrimitivesLookup.Contains(primitive); 87 } 80 return primitivesLookup.Contains(primitive); 81 } 82 88 83 public virtual bool Remove(IPrimitive primitive) { 89 if (myPrimitives.Remove(primitive)) { 90 primitive.Group = null; 91 primitive.Update -= new EventHandler(primitive_Update); 92 OnUpdate(); 93 return true; 94 } else { 95 return false; 96 } 97 } 84 if (!primitives.Remove(primitive)) return false; 85 primitivesLookup.Remove(primitive); 86 87 primitive.RedrawRequired -= PrimitiveOnRedrawRequired; 88 OnRedrawRequired(); 89 return true; 90 } 91 98 92 public virtual void Clear() { 99 foreach (IPrimitive primitive in myPrimitives) { 100 primitive.Group = null; 101 primitive.Update -= new EventHandler(primitive_Update); 102 } 103 myPrimitives.Clear(); 104 myPrimitivesLookup.Clear(); 105 OnUpdate(); 93 foreach (var primitive in primitives) { 94 primitive.RedrawRequired -= PrimitiveOnRedrawRequired; 95 } 96 primitives.Clear(); 97 primitivesLookup.Clear(); 98 OnRedrawRequired(); 106 99 } 107 100 108 101 public virtual IPrimitive GetPrimitive(PointD point) { 109 return myPrimitives.FirstOrDefault(primitive => primitive.ContainsPoint(point)); 110 } 111 112 public IPrimitive GetPrimitive(double x, double y) { 113 return GetPrimitive(new PointD(x, y)); 114 } 115 public virtual IList<IPrimitive> GetAllPrimitives(PointD point) { 116 var primitives = new List<IPrimitive>(); 117 foreach (var primitive in myPrimitives.Where(primitive => primitive.ContainsPoint(point))) { 118 primitives.Add(primitive); 102 return primitives.FirstOrDefault(primitive => primitive.ContainsPoint(point)); 103 } 104 105 public virtual IEnumerable<IPrimitive> GetAllPrimitives(PointD point) { 106 var result = new List<IPrimitive>(); 107 foreach (var primitive in primitives.Where(primitive => primitive.ContainsPoint(point))) { 108 result.Add(primitive); 119 109 var group = primitive as IGroup; 120 110 if (group != null) 121 primitives.AddRange(group.Primitives); 122 } 123 return primitives; 124 } 125 public IList<IPrimitive> GetAllPrimitives(double x, double y) { 126 return GetAllPrimitives(new PointD(x, y)); 111 result.AddRange(group.GetAllPrimitives(point)); 112 } 113 return result; 127 114 } 128 115 129 116 public override void Move(Offset delta) { 130 bool updateEnabled = UpdateEnabled; 131 UpdateEnabled = false; 132 foreach (IPrimitive primitive in myPrimitives) 133 primitive.Move(delta); 134 UpdateEnabled = updateEnabled; 135 OnUpdate(); 117 SuppressEvents = true; 118 try { 119 foreach (var primitive in primitives) 120 primitive.Move(delta); 121 } finally { 122 SuppressEvents = false; 123 OnRedrawRequired(); 124 } 125 } 126 127 public override void Move(PointD point, Offset delta) { 128 SuppressEvents = true; 129 try { 130 foreach (var primitive in primitives) 131 primitive.Move(point, delta); 132 } finally { 133 SuppressEvents = false; 134 OnRedrawRequired(); 135 } 136 } 137 138 public override void SnapToGrid(IGrid grid) { 139 SuppressEvents = true; 140 try { 141 foreach (var primitive in primitives) 142 primitive.SnapToGrid(grid); 143 } finally { 144 SuppressEvents = false; 145 OnRedrawRequired(); 146 } 147 } 148 149 public override void SnapToGrid(PointD point, IGrid grid) { 150 SuppressEvents = true; 151 try { 152 foreach (var primitive in primitives) 153 primitive.SnapToGrid(point, grid); 154 } finally { 155 SuppressEvents = false; 156 OnRedrawRequired(); 157 } 136 158 } 137 159 … … 141 163 142 164 public override Cursor GetCursor(PointD point) { 143 IPrimitiveprimitive = GetPrimitive(point);144 if (primitive != null) return primitive.GetCursor(point);145 else return base.GetCursor(point);146 } 165 var primitive = GetPrimitive(point); 166 return primitive != null ? primitive.GetCursor(point) : base.GetCursor(point); 167 } 168 147 169 public override string GetToolTipText(PointD point) { 148 IPrimitive primitive = GetPrimitive(point); 149 if (primitive != null) return primitive.GetToolTipText(point); 150 else return base.GetToolTipText(point); 170 var primitive = GetPrimitive(point); 171 return primitive != null ? primitive.GetToolTipText(point) : base.GetToolTipText(point); 151 172 } 152 173 153 174 public void OneLayerUp(IPrimitive primitive) { 154 if (!Contains(primitive)) 155 throw new ArgumentException("Primitive not found"); 156 157 var curr = myPrimitives.Find(primitive); 175 if (!Contains(primitive)) throw new ArgumentException("Primitive not found"); 176 177 var curr = primitives.Find(primitive); 158 178 if (curr == null) return; 159 179 var prev = curr.Previous; … … 162 182 prev.Value = temp; 163 183 164 OnUpdate(); 165 } 166 184 OnRedrawRequired(); 185 } 167 186 public void OneLayerDown(IPrimitive primitive) { 168 if (!Contains(primitive)) 169 throw new ArgumentException("Primitive not found"); 170 171 var curr = myPrimitives.Find(primitive); 187 if (!Contains(primitive)) throw new ArgumentException("Primitive not found"); 188 189 var curr = primitives.Find(primitive); 172 190 if (curr == null) return; 173 191 var next = curr.Next; … … 177 195 } 178 196 public void IntoForeground(IPrimitive primitive) { 179 if (!Contains(primitive)) 180 throw new ArgumentException("Primitive not found"); 181 182 myPrimitives.Remove(primitive); 183 myPrimitives.AddFirst(primitive); 184 OnUpdate(); 197 if (!Contains(primitive)) throw new ArgumentException("Primitive not found"); 198 primitives.Remove(primitive); 199 primitives.AddFirst(primitive); 200 OnRedrawRequired(); 185 201 } 186 202 public void IntoBackground(IPrimitive primitive) { 187 if (!Contains(primitive)) 188 throw new ArgumentException("Primitive not found"); 189 190 myPrimitives.Remove(primitive); 191 myPrimitives.AddLast(primitive); 192 OnUpdate(); 203 if (!Contains(primitive)) throw new ArgumentException("Primitive not found"); 204 205 primitives.Remove(primitive); 206 primitives.AddLast(primitive); 207 OnRedrawRequired(); 193 208 } 194 209 195 210 public override void Draw(Graphics graphics) { 196 var current = myPrimitives.Last;211 var current = primitives.Last; 197 212 while (current != null) { 198 213 var primitive = current.Value; … … 204 219 } 205 220 206 private void primitive_Update(object sender, EventArgs e) { 207 OnUpdate(); 221 private void PrimitiveOnRedrawRequired(object sender, EventArgs e) { 222 if (SuppressEvents) return; 223 OnRedrawRequired(); 224 } 225 226 public IEnumerator<IPrimitive> GetEnumerator() { 227 return primitives.GetEnumerator(); 228 } 229 230 IEnumerator IEnumerable.GetEnumerator() { 231 return GetEnumerator(); 208 232 } 209 233 }
Note: See TracChangeset
for help on using the changeset viewer.