2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Collections.Generic;
19 using System.ComponentModel;
24 public interface IInvalidatable : IDisposable
26 void MakeInvalidate();
29 public enum EvasObjectCallbackType
69 public class EvasObjectEvent<TEventArgs> : IInvalidatable where TEventArgs : EventArgs
71 public delegate TEventArgs SmartEventInfoParser(IntPtr data, IntPtr obj, IntPtr info);
73 private bool _disposed = false;
74 private EvasObject _sender;
75 private IntPtr _handle;
76 private readonly EvasObjectCallbackType _type;
77 private readonly SmartEventInfoParser _parser;
78 private readonly List<NativeCallback> _nativeCallbacks = new List<NativeCallback>();
80 public EvasObjectEvent(EvasObject sender, EvasObjectCallbackType type, SmartEventInfoParser parser) : this(sender, sender.Handle, type, parser)
84 [EditorBrowsableAttribute(EditorBrowsableState.Never)]
85 public EvasObjectEvent(EvasObject sender, IntPtr handle, EvasObjectCallbackType type, SmartEventInfoParser parser)
91 sender.AddToEventLifeTracker(this);
94 public EvasObjectEvent(EvasObject sender, EvasObjectCallbackType type) : this(sender, type, null)
103 private struct NativeCallback
105 public Interop.Evas.EventCallback callback;
106 public EventHandler<TEventArgs> eventHandler;
109 public event EventHandler<TEventArgs> On
113 if (_handle == IntPtr.Zero)
117 EventHandler<TEventArgs> handler = value;
118 var cb = new Interop.Evas.EventCallback((data, evas, obj, info) =>
120 TEventArgs ea = _parser == null ? (TEventArgs)EventArgs.Empty : _parser(data, obj, info);
121 handler(_sender, ea);
123 _nativeCallbacks.Add(new NativeCallback { callback = cb, eventHandler = handler });
124 int i = _nativeCallbacks.Count - 1;
125 Interop.Evas.evas_object_event_callback_add(_handle, (Interop.Evas.ObjectCallbackType)_type, _nativeCallbacks[i].callback, IntPtr.Zero);
130 if (_handle == IntPtr.Zero)
134 EventHandler<TEventArgs> handler = value;
135 var callbacks = _nativeCallbacks.Where(cb => cb.eventHandler == handler);
136 foreach (var cb in callbacks)
138 Interop.Evas.evas_object_event_callback_del(_handle, (Interop.Evas.ObjectCallbackType)_type, cb.callback);
143 protected virtual void Dispose(bool disposing)
149 // Place holder to dispose managed state (managed objects).
151 if (_handle != IntPtr.Zero)
153 foreach (var cb in _nativeCallbacks)
155 Interop.Evas.evas_object_event_callback_del(_handle, (Interop.Evas.ObjectCallbackType)_type, cb.callback);
158 _nativeCallbacks.Clear();
163 public void Dispose()
166 GC.SuppressFinalize(this);
169 public void MakeInvalidate()
172 _handle = IntPtr.Zero;
176 public class EvasObjectEvent : IInvalidatable
178 private EvasObjectEvent<EventArgs> _evasObjectEvent;
179 private event EventHandler _handlers;
180 private bool _disposed = false;
182 public EvasObjectEvent(EvasObject sender, EvasObjectCallbackType type) : this(sender, sender.Handle, type)
186 [EditorBrowsableAttribute(EditorBrowsableState.Never)]
187 public EvasObjectEvent(EvasObject sender, IntPtr handle, EvasObjectCallbackType type)
189 _evasObjectEvent = new EvasObjectEvent<EventArgs>(sender, handle, type, null);
197 public event EventHandler On
201 if (_handlers == null)
203 _evasObjectEvent.On += SendEvent;
211 if (_handlers == null)
213 _evasObjectEvent.On -= SendEvent;
218 private void SendEvent(object sender, EventArgs e)
220 _handlers?.Invoke(sender, e);
223 protected virtual void Dispose(bool disposing)
229 _evasObjectEvent.Dispose();
235 public void Dispose()
238 GC.SuppressFinalize(this);
241 public void MakeInvalidate()
243 _evasObjectEvent.MakeInvalidate();