123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Globalization;
- using System.Windows;
- namespace HandyControl.Media.Animation;
- public class GeometryKeyFrameCollection : Freezable, IList
- {
- private List<GeometryKeyFrame> _keyFrames;
- private static GeometryKeyFrameCollection s_emptyCollection;
- public GeometryKeyFrameCollection()
- {
- _keyFrames = new List<GeometryKeyFrame>(2);
- }
- public static GeometryKeyFrameCollection Empty
- {
- get
- {
- if (s_emptyCollection == null)
- {
- var emptyCollection = new GeometryKeyFrameCollection
- {
- _keyFrames = new List<GeometryKeyFrame>(0)
- };
- emptyCollection.Freeze();
- s_emptyCollection = emptyCollection;
- }
- return s_emptyCollection;
- }
- }
- public new GeometryKeyFrameCollection Clone() => (GeometryKeyFrameCollection) base.Clone();
- protected override Freezable CreateInstanceCore() => new GeometryKeyFrameCollection();
- protected override void CloneCore(Freezable sourceFreezable)
- {
- var sourceCollection = (GeometryKeyFrameCollection) sourceFreezable;
- base.CloneCore(sourceFreezable);
- var count = sourceCollection._keyFrames.Count;
- _keyFrames = new List<GeometryKeyFrame>(count);
- for (var i = 0; i < count; i++)
- {
- var keyFrame = (GeometryKeyFrame) sourceCollection._keyFrames[i].Clone();
- _keyFrames.Add(keyFrame);
- OnFreezablePropertyChanged(null, keyFrame);
- }
- }
- protected override void CloneCurrentValueCore(Freezable sourceFreezable)
- {
- var sourceCollection = (GeometryKeyFrameCollection) sourceFreezable;
- base.CloneCurrentValueCore(sourceFreezable);
- var count = sourceCollection._keyFrames.Count;
- _keyFrames = new List<GeometryKeyFrame>(count);
- for (var i = 0; i < count; i++)
- {
- var keyFrame = (GeometryKeyFrame) sourceCollection._keyFrames[i].CloneCurrentValue();
- _keyFrames.Add(keyFrame);
- OnFreezablePropertyChanged(null, keyFrame);
- }
- }
- protected override void GetAsFrozenCore(Freezable sourceFreezable)
- {
- var sourceCollection = (GeometryKeyFrameCollection) sourceFreezable;
- base.GetAsFrozenCore(sourceFreezable);
- var count = sourceCollection._keyFrames.Count;
- _keyFrames = new List<GeometryKeyFrame>(count);
- for (var i = 0; i < count; i++)
- {
- var keyFrame = (GeometryKeyFrame) sourceCollection._keyFrames[i].GetAsFrozen();
- _keyFrames.Add(keyFrame);
- OnFreezablePropertyChanged(null, keyFrame);
- }
- }
- protected override void GetCurrentValueAsFrozenCore(Freezable sourceFreezable)
- {
- var sourceCollection = (GeometryKeyFrameCollection) sourceFreezable;
- base.GetCurrentValueAsFrozenCore(sourceFreezable);
- var count = sourceCollection._keyFrames.Count;
- _keyFrames = new List<GeometryKeyFrame>(count);
- for (var i = 0; i < count; i++)
- {
- var keyFrame = (GeometryKeyFrame) sourceCollection._keyFrames[i].GetCurrentValueAsFrozen();
- _keyFrames.Add(keyFrame);
- OnFreezablePropertyChanged(null, keyFrame);
- }
- }
- protected override bool FreezeCore(bool isChecking)
- {
- var canFreeze = base.FreezeCore(isChecking);
- for (var i = 0; i < _keyFrames.Count && canFreeze; i++)
- {
- canFreeze &= Freeze(_keyFrames[i], isChecking);
- }
- return canFreeze;
- }
- public IEnumerator GetEnumerator()
- {
- ReadPreamble();
- return _keyFrames.GetEnumerator();
- }
- void ICollection.CopyTo(Array array, int index)
- {
- ReadPreamble();
- ((ICollection) _keyFrames).CopyTo(array, index);
- }
- public void CopyTo(GeometryKeyFrame[] array, int index)
- {
- ReadPreamble();
- _keyFrames.CopyTo(array, index);
- }
- public int Count
- {
- get
- {
- ReadPreamble();
- return _keyFrames.Count;
- }
- }
- public object SyncRoot
- {
- get
- {
- ReadPreamble();
- return ((ICollection) _keyFrames).SyncRoot;
- }
- }
- public bool IsSynchronized
- {
- get
- {
- ReadPreamble();
- return IsFrozen || Dispatcher != null;
- }
- }
- int IList.Add(object keyFrame) => Add((GeometryKeyFrame) keyFrame);
- public int Add(GeometryKeyFrame keyFrame)
- {
- if (keyFrame == null)
- {
- throw new ArgumentNullException(nameof(keyFrame));
- }
- WritePreamble();
- OnFreezablePropertyChanged(null, keyFrame);
- _keyFrames.Add(keyFrame);
- WritePostscript();
- return _keyFrames.Count - 1;
- }
- public void Clear()
- {
- WritePreamble();
- if (_keyFrames.Count <= 0) return;
- foreach (var frame in _keyFrames)
- {
- OnFreezablePropertyChanged(frame, null);
- }
- _keyFrames.Clear();
- WritePostscript();
- }
- bool IList.Contains(object keyFrame) => Contains((GeometryKeyFrame) keyFrame);
- public bool Contains(GeometryKeyFrame keyFrame)
- {
- ReadPreamble();
- return _keyFrames.Contains(keyFrame);
- }
- int IList.IndexOf(object keyFrame) => IndexOf((GeometryKeyFrame) keyFrame);
- public int IndexOf(GeometryKeyFrame keyFrame)
- {
- ReadPreamble();
- return _keyFrames.IndexOf(keyFrame);
- }
- void IList.Insert(int index, object keyFrame) => Insert(index, (GeometryKeyFrame) keyFrame);
- public void Insert(int index, GeometryKeyFrame keyFrame)
- {
- if (keyFrame == null)
- {
- throw new ArgumentNullException(nameof(keyFrame));
- }
- WritePreamble();
- OnFreezablePropertyChanged(null, keyFrame);
- _keyFrames.Insert(index, keyFrame);
- WritePostscript();
- }
- void IList.Remove(object keyFrame) => Remove((GeometryKeyFrame) keyFrame);
- public void Remove(GeometryKeyFrame keyFrame)
- {
- WritePreamble();
- if (_keyFrames.Contains(keyFrame))
- {
- OnFreezablePropertyChanged(keyFrame, null);
- _keyFrames.Remove(keyFrame);
- WritePostscript();
- }
- }
- public void RemoveAt(int index)
- {
- WritePreamble();
- OnFreezablePropertyChanged(_keyFrames[index], null);
- _keyFrames.RemoveAt(index);
- WritePostscript();
- }
- object IList.this[int index]
- {
- get => this[index];
- set => this[index] = (GeometryKeyFrame) value;
- }
- public GeometryKeyFrame this[int index]
- {
- get
- {
- ReadPreamble();
- return _keyFrames[index];
- }
- set
- {
- if (value == null)
- {
- throw new ArgumentNullException(string.Format(CultureInfo.InvariantCulture, "DoubleKeyFrameCollection[{0}]", index));
- }
- WritePreamble();
- if (value != _keyFrames[index])
- {
- OnFreezablePropertyChanged(_keyFrames[index], value);
- _keyFrames[index] = value;
- WritePostscript();
- }
- }
- }
- public bool IsReadOnly
- {
- get
- {
- ReadPreamble();
- return IsFrozen;
- }
- }
- public bool IsFixedSize
- {
- get
- {
- ReadPreamble();
- return IsFrozen;
- }
- }
- }
|