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;
25 /// IInvalidatable is an interface, which can be overrided by its children class.
26 /// Inherits IDisposable.
28 /// <since_tizen> preview </since_tizen>
29 public interface IInvalidatable : IDisposable
32 /// Makes the current instance invalidate.
34 /// <since_tizen> preview </since_tizen>
35 void MakeInvalidate();
39 /// Enumeration for EvasObjectCallbackType.
41 /// <since_tizen> preview </since_tizen>
42 public enum EvasObjectCallbackType
45 /// Mouse In Event CallbackType.
50 /// Mouse Out Event CallbackType.
55 /// Mouse Button Down Event CallbackType.
60 /// Mouse Button Up Event CallbackType.
65 /// Mouse Move Event CallbackType.
70 /// Mouse Wheel Event CallbackType.
75 /// Multi-touch Down Event CallbackType.
80 /// Multi-touch Up Event CallbackType.
85 /// Multi-touch Move Event CallbackType.
90 /// Object Being Freed (Called after Del).
95 /// Key Press Event CallbackType.
100 /// Key Release Event CallbackType.
105 /// Focus In Event CallbackType.
110 /// Focus Out Event CallbackType.
115 /// Show Event CallbackType.
120 /// Hide Event CallbackType.
125 /// Move Event CallbackType.
130 /// Resize Event CallbackType.
135 /// Restack Event CallbackType.
140 /// Object being deleted (called before Free).
145 /// Hold Event CallbackType, Informational purpose event to indicate something.
150 /// Size hints changed the CallbackType event.
155 /// Image has been pre-loaded.
160 /// Canvas got focus as a whole.
165 /// Canvas lost focus as a whole.
170 /// Called just before rendering is updated on the canvas target.
175 /// Called just after rendering is updated on the canvas target.
180 /// Canvas object got focus.
185 /// Canvas object lost focus.
187 CanvasObjectFocusOut,
190 /// Image data has been unloaded (by some mechanism in Evas that throw out the original image data).
195 /// Called just before rendering starts on the canvas target.
200 /// Called just after rendering stops on the canvas target.
205 /// Image size is changed.
210 /// Devices added, removed, or changed on canvas.
220 /// Canvas Viewport size is changed.
226 /// Event class for EvasObject.
228 /// <typeparam name="TEventArgs">Kinds of EventArgs.</typeparam>
229 /// <since_tizen> preview </since_tizen>
230 public class EvasObjectEvent<TEventArgs> : IInvalidatable where TEventArgs : EventArgs
233 /// SmartEventInfoParser delegate of the EvasObjectEvent class.
235 /// <param name="data">data</param>
236 /// <param name="obj">obj</param>
237 /// <param name="info">info</param>
238 /// <returns>Delegate handle.</returns>
239 /// <since_tizen> preview </since_tizen>
240 public delegate TEventArgs SmartEventInfoParser(IntPtr data, IntPtr obj, IntPtr info);
242 private bool _disposed = false;
243 private EvasObject _sender;
244 private IntPtr _handle;
245 private readonly EvasObjectCallbackType _type;
246 private readonly SmartEventInfoParser _parser;
247 private readonly List<NativeCallback> _nativeCallbacks = new List<NativeCallback>();
250 /// Creates and initializes a new instance of the EvasObjectEvent.
252 /// <param name="sender">EvasObject class belongs to.</param>
253 /// <param name="type">EvasObjectCallbackType</param>
254 /// <param name="parser">SmartEventInfoParser</param>
255 /// <since_tizen> preview </since_tizen>
256 public EvasObjectEvent(EvasObject sender, EvasObjectCallbackType type, SmartEventInfoParser parser) : this(sender, sender.Handle, type, parser)
261 /// Creates and initializes a new instance of the EvasObjectEvent.
263 /// <param name="sender">EvasObject class belongs to.</param>
264 /// <param name="handle">EvasObject handle.</param>
265 /// <param name="type">EvasObjectCallbackType</param>
266 /// <param name="parser">SmartEventInfoParser</param>
267 /// <since_tizen> preview </since_tizen>
268 [EditorBrowsableAttribute(EditorBrowsableState.Never)]
269 public EvasObjectEvent(EvasObject sender, IntPtr handle, EvasObjectCallbackType type, SmartEventInfoParser parser)
275 sender.AddToEventLifeTracker(this);
279 /// Creates and initializes a new instance of the EvasObjectEvent.
281 /// <param name="sender">EvasObject class belongs to.</param>
282 /// <param name="type">SmartEventInfoParser</param>
283 /// <since_tizen> preview </since_tizen>
284 public EvasObjectEvent(EvasObject sender, EvasObjectCallbackType type) : this(sender, type, null)
289 /// Destroys the EvasObjectEvent object.
296 private struct NativeCallback
298 public Interop.Evas.EventCallback callback;
299 public EventHandler<TEventArgs> eventHandler;
303 /// On Event Handler of the EvasObjectEvent.
305 /// <since_tizen> preview </since_tizen>
306 public event EventHandler<TEventArgs> On
310 if (_handle == IntPtr.Zero)
314 EventHandler<TEventArgs> handler = value;
315 var cb = new Interop.Evas.EventCallback((data, evas, obj, info) =>
317 TEventArgs ea = _parser == null ? (TEventArgs)EventArgs.Empty : _parser(data, obj, info);
318 handler(_sender, ea);
320 _nativeCallbacks.Add(new NativeCallback { callback = cb, eventHandler = handler });
321 int i = _nativeCallbacks.Count - 1;
322 Interop.Evas.evas_object_event_callback_add(_handle, (Interop.Evas.ObjectCallbackType)_type, _nativeCallbacks[i].callback, IntPtr.Zero);
327 if (_handle == IntPtr.Zero)
331 EventHandler<TEventArgs> handler = value;
332 var callbacks = _nativeCallbacks.Where(cb => cb.eventHandler == handler);
333 foreach (var cb in callbacks)
335 Interop.Evas.evas_object_event_callback_del(_handle, (Interop.Evas.ObjectCallbackType)_type, cb.callback);
341 /// Releases all the resources currently used by this instance.
343 /// <param name="disposing">
344 /// true if the managed resources should be disposed
345 /// otherwise, false.
347 /// <since_tizen> preview </since_tizen>
348 protected virtual void Dispose(bool disposing)
354 _sender.RemoveFromEventLifeTracker(this);
356 if (_handle != IntPtr.Zero)
358 foreach (var cb in _nativeCallbacks)
360 Interop.Evas.evas_object_event_callback_del(_handle, (Interop.Evas.ObjectCallbackType)_type, cb.callback);
363 _nativeCallbacks.Clear();
369 /// Destroys the current object.
371 /// <since_tizen> preview </since_tizen>
372 public void Dispose()
375 GC.SuppressFinalize(this);
379 /// Makes the current instance invalidate.
381 /// <since_tizen> preview </since_tizen>
382 public void MakeInvalidate()
385 _handle = IntPtr.Zero;
390 /// Event class for EvasObject.
392 /// <since_tizen> preview </since_tizen>
393 public class EvasObjectEvent : IInvalidatable
395 private EvasObjectEvent<EventArgs> _evasObjectEvent;
397 private event EventHandler _handlers;
399 private bool _disposed = false;
402 /// Creates and initializes a new instance of the EvasObjectEvent.
404 /// <param name="sender">EvasObject class belongs to.</param>
405 /// <param name="type">EvasObjectCallbackType</param>
406 /// <since_tizen> preview </since_tizen>
407 public EvasObjectEvent(EvasObject sender, EvasObjectCallbackType type) : this(sender, sender.Handle, type)
412 /// Creates and initializes a new instance of the EvasObjectEvent.
414 /// <param name="sender">EvasObject class belongs to.</param>
415 /// <param name="handle">EvasObject handle.</param>
416 /// <param name="type">EvasObjectCallbackType</param>
417 /// <since_tizen> preview </since_tizen>
418 [EditorBrowsableAttribute(EditorBrowsableState.Never)]
419 public EvasObjectEvent(EvasObject sender, IntPtr handle, EvasObjectCallbackType type)
421 _evasObjectEvent = new EvasObjectEvent<EventArgs>(sender, handle, type, null);
425 /// Destroys the EvasObjectEvent object.
433 /// On Event Handler of EvasObjectEvent.
435 /// <since_tizen> preview </since_tizen>
436 public event EventHandler On
440 if (_handlers == null)
442 _evasObjectEvent.On += SendEvent;
450 if (_handlers == null)
452 _evasObjectEvent.On -= SendEvent;
457 private void SendEvent(object sender, EventArgs e)
459 _handlers?.Invoke(sender, e);
463 /// Releases all the resources currently used by this instance.
465 /// <param name="disposing">
466 /// true if managed resources should be disposed
467 /// otherwise, false.
469 /// <since_tizen> preview </since_tizen>
470 protected virtual void Dispose(bool disposing)
476 _evasObjectEvent.Dispose();
483 /// Destroys the current object.
485 /// <since_tizen> preview </since_tizen>
486 public void Dispose()
489 GC.SuppressFinalize(this);
493 /// Makes the current instance invalidate.
495 /// <since_tizen> preview </since_tizen>
496 public void MakeInvalidate()
498 _evasObjectEvent.MakeInvalidate();