aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Core/SynchronizedObservableCollection.cs
blob: 317d0e249672878eb6167220bb525fd04c13656f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
using System.Windows.Threading;

namespace Tango.Core
{
    public class SynchronizedObservableCollection<T> : ObservableCollection<T>
    {
        private object _sync_lock = new object();
        private object _modify_lock = new object();
        private SynchronizedObservableCollectionDispatcher _dispatcher;

        public SynchronizedObservableCollection() : base()
        {
            _dispatcher = new SynchronizedObservableCollectionDispatcher();
            BindingOperations.EnableCollectionSynchronization(this, _modify_lock);
        }

        public SynchronizedObservableCollection(IEnumerable<T> collection) : base(collection)
        {
            _dispatcher = new SynchronizedObservableCollectionDispatcher();
            BindingOperations.EnableCollectionSynchronization(this, _modify_lock);
        }

        protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
        {
            lock (_modify_lock)
            {
                _dispatcher.Invoke(() =>
                {
                    base.OnCollectionChanged(e);
                });
            }
        }

        protected override void InsertItem(int index, T item)
        {
            lock (_modify_lock)
            {
                base.InsertItem(index, item);
            }
        }

        protected override void RemoveItem(int index)
        {
            lock (_modify_lock)
            {
                base.RemoveItem(index);
            }
        }

        protected override void ClearItems()
        {
            lock (_modify_lock)
            {
                base.ClearItems();
            }
        }
    }

    internal class SynchronizedObservableCollectionDispatcher
    {
        internal Dispatcher Dispatcher { get; set; }

        internal SynchronizedObservableCollectionDispatcher()
        {
            if (Application.Current != null)
            {
                Dispatcher = Application.Current.Dispatcher;
            }
        }

        internal void Invoke(Action action)
        {
            if (Dispatcher != null)
            {
                Dispatcher.Invoke(action);
            }
            else
            {
                action();
            }
        }
    }
}
class="n">StubMotorRunStepTickRequest> { private static readonly pb::MessageParser<StubMotorRunStepTickRequest> _parser = new pb::MessageParser<StubMotorRunStepTickRequest>(() => new StubMotorRunStepTickRequest()); [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public static pb::MessageParser<StubMotorRunStepTickRequest> Parser { get { return _parser; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public static pbr::MessageDescriptor Descriptor { get { return global::Tango.PMR.Stubs.StubMotorRunStepTickRequestReflection.Descriptor.MessageTypes[0]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] pbr::MessageDescriptor pb::IMessage.Descriptor { get { return Descriptor; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public StubMotorRunStepTickRequest() { OnConstruction(); } partial void OnConstruction(); [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public StubMotorRunStepTickRequest(StubMotorRunStepTickRequest other) : this() { motorID_ = other.motorID_; direction_ = other.direction_; speed_ = other.speed_; } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public StubMotorRunStepTickRequest Clone() { return new StubMotorRunStepTickRequest(this); } /// <summary>Field number for the "Motor_ID" field.</summary> public const int MotorIDFieldNumber = 1; private uint motorID_; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public uint MotorID { get { return motorID_; } set { motorID_ = value; } } /// <summary>Field number for the "Direction" field.</summary> public const int DirectionFieldNumber = 2; private bool direction_; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public bool Direction { get { return direction_; } set { direction_ = value; } } /// <summary>Field number for the "Speed" field.</summary> public const int SpeedFieldNumber = 3; private double speed_; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public double Speed { get { return speed_; } set { speed_ = value; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public override bool Equals(object other) { return Equals(other as StubMotorRunStepTickRequest); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public bool Equals(StubMotorRunStepTickRequest other) { if (ReferenceEquals(other, null)) { return false; } if (ReferenceEquals(other, this)) { return true; } if (MotorID != other.MotorID) return false; if (Direction != other.Direction) return false; if (Speed != other.Speed) return false; return true; } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public override int GetHashCode() { int hash = 1; if (MotorID != 0) hash ^= MotorID.GetHashCode(); if (Direction != false) hash ^= Direction.GetHashCode(); if (Speed != 0D) hash ^= Speed.GetHashCode(); return hash; } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public override string ToString() { return pb::JsonFormatter.ToDiagnosticString(this); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public void WriteTo(pb::CodedOutputStream output) { if (MotorID != 0) { output.WriteRawTag(8); output.WriteUInt32(MotorID); } if (Direction != false) { output.WriteRawTag(16); output.WriteBool(Direction); } if (Speed != 0D) { output.WriteRawTag(25); output.WriteDouble(Speed); } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public int CalculateSize() { int size = 0; if (MotorID != 0) { size += 1 + pb::CodedOutputStream.ComputeUInt32Size(MotorID); } if (Direction != false) { size += 1 + 1; } if (Speed != 0D) { size += 1 + 8; } return size; } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public void MergeFrom(StubMotorRunStepTickRequest other) { if (other == null) { return; } if (other.MotorID != 0) { MotorID = other.MotorID; } if (other.Direction != false) { Direction = other.Direction; } if (other.Speed != 0D) { Speed = other.Speed; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public void MergeFrom(pb::CodedInputStream input) { uint tag; while ((tag = input.ReadTag()) != 0) { switch(tag) { default: input.SkipLastField(); break; case 8: { MotorID = input.ReadUInt32(); break; } case 16: { Direction = input.ReadBool(); break; } case 25: { Speed = input.ReadDouble(); break; } } } } } #endregion } #endregion Designer generated code