Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/21/15 14:18:31 (9 years ago)
Author:
jkarder
Message:

#1265: merged changes from abeham

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/Primitives/Group.cs

    r12535 r13045  
    2121
    2222using System;
     23using System.Collections;
    2324using System.Collections.Generic;
    24 using System.Collections.ObjectModel;
    2525using System.Drawing;
    2626using System.Linq;
     
    2929namespace HeuristicLab.Visualization {
    3030  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
    4541    public override bool Selected {
    4642      get { return base.Selected; }
    4743      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        }
    5453      }
    5554    }
     
    5756    public Group(IChart chart)
    5857      : base(chart) {
    59       myPrimitives = new LinkedList<IPrimitive>();
    60       myPrimitivesLookup = new HashSet<IPrimitive>();
     58      primitives = new LinkedList<IPrimitive>();
     59      primitivesLookup = new HashSet<IPrimitive>();
    6160    }
    6261
    6362    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();
    7268    }
    7369    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
    8579    public virtual bool Contains(IPrimitive primitive) {
    86       return myPrimitivesLookup.Contains(primitive);
    87     }
     80      return primitivesLookup.Contains(primitive);
     81    }
     82
    8883    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
    9892    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();
    10699    }
    107100
    108101    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);
    119109        var group = primitive as IGroup;
    120110        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;
    127114    }
    128115
    129116    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      }
    136158    }
    137159
     
    141163
    142164    public override Cursor GetCursor(PointD point) {
    143       IPrimitive primitive = 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
    147169    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);
    151172    }
    152173
    153174    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);
    158178      if (curr == null) return;
    159179      var prev = curr.Previous;
     
    162182      prev.Value = temp;
    163183
    164       OnUpdate();
    165     }
    166 
     184      OnRedrawRequired();
     185    }
    167186    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);
    172190      if (curr == null) return;
    173191      var next = curr.Next;
     
    177195    }
    178196    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();
    185201    }
    186202    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();
    193208    }
    194209
    195210    public override void Draw(Graphics graphics) {
    196       var current = myPrimitives.Last;
     211      var current = primitives.Last;
    197212      while (current != null) {
    198213        var primitive = current.Value;
     
    204219    }
    205220
    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();
    208232    }
    209233  }
Note: See TracChangeset for help on using the changeset viewer.