DropHandlerBase.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. using System.Collections.Generic;
  2. using Avalonia.Input;
  3. using Avalonia.Interactivity;
  4. namespace Avalonia.Xaml.Interactions.DragAndDrop;
  5. /// <summary>
  6. ///
  7. /// </summary>
  8. public abstract class DropHandlerBase : IDropHandler
  9. {
  10. /// <summary>
  11. ///
  12. /// </summary>
  13. /// <param name="items"></param>
  14. /// <param name="sourceIndex"></param>
  15. /// <param name="targetIndex"></param>
  16. /// <typeparam name="T"></typeparam>
  17. protected void MoveItem<T>(IList<T> items, int sourceIndex, int targetIndex)
  18. {
  19. if (sourceIndex < targetIndex)
  20. {
  21. var item = items[sourceIndex];
  22. items.RemoveAt(sourceIndex);
  23. items.Insert(targetIndex, item);
  24. }
  25. else
  26. {
  27. var removeIndex = sourceIndex + 1;
  28. if (items.Count + 1 > removeIndex)
  29. {
  30. var item = items[sourceIndex];
  31. items.RemoveAt(removeIndex - 1);
  32. items.Insert(targetIndex, item);
  33. }
  34. }
  35. }
  36. /// <summary>
  37. ///
  38. /// </summary>
  39. /// <param name="sourceItems"></param>
  40. /// <param name="targetItems"></param>
  41. /// <param name="sourceIndex"></param>
  42. /// <param name="targetIndex"></param>
  43. /// <typeparam name="T"></typeparam>
  44. protected void MoveItem<T>(IList<T> sourceItems, IList<T> targetItems, int sourceIndex, int targetIndex)
  45. {
  46. var item = sourceItems[sourceIndex];
  47. sourceItems.RemoveAt(sourceIndex);
  48. targetItems.Insert(targetIndex, item);
  49. }
  50. /// <summary>
  51. ///
  52. /// </summary>
  53. /// <param name="items"></param>
  54. /// <param name="sourceIndex"></param>
  55. /// <param name="targetIndex"></param>
  56. /// <typeparam name="T"></typeparam>
  57. protected void SwapItem<T>(IList<T> items, int sourceIndex, int targetIndex)
  58. {
  59. var item1 = items[sourceIndex];
  60. var item2 = items[targetIndex];
  61. items[targetIndex] = item1;
  62. items[sourceIndex] = item2;
  63. }
  64. /// <summary>
  65. ///
  66. /// </summary>
  67. /// <param name="sourceItems"></param>
  68. /// <param name="targetItems"></param>
  69. /// <param name="sourceIndex"></param>
  70. /// <param name="targetIndex"></param>
  71. /// <typeparam name="T"></typeparam>
  72. protected void SwapItem<T>(IList<T> sourceItems, IList<T> targetItems, int sourceIndex, int targetIndex)
  73. {
  74. var item1 = sourceItems[sourceIndex];
  75. var item2 = targetItems[targetIndex];
  76. targetItems[targetIndex] = item1;
  77. sourceItems[sourceIndex] = item2;
  78. }
  79. /// <summary>
  80. ///
  81. /// </summary>
  82. /// <param name="items"></param>
  83. /// <param name="item"></param>
  84. /// <param name="index"></param>
  85. /// <typeparam name="T"></typeparam>
  86. protected void InsertItem<T>(IList<T> items, T item, int index)
  87. {
  88. items.Insert(index, item);
  89. }
  90. /// <summary>
  91. ///
  92. /// </summary>
  93. /// <param name="sender"></param>
  94. /// <param name="e"></param>
  95. /// <param name="sourceContext"></param>
  96. /// <param name="targetContext"></param>
  97. public virtual void Enter(object? sender, DragEventArgs e, object? sourceContext, object? targetContext)
  98. {
  99. if (Validate(sender, e, sourceContext, targetContext, null) == false)
  100. {
  101. e.DragEffects = DragDropEffects.None;
  102. e.Handled = true;
  103. }
  104. else
  105. {
  106. e.DragEffects |= DragDropEffects.Copy | DragDropEffects.Move | DragDropEffects.Link;
  107. e.Handled = true;
  108. }
  109. }
  110. /// <summary>
  111. ///
  112. /// </summary>
  113. /// <param name="sender"></param>
  114. /// <param name="e"></param>
  115. /// <param name="sourceContext"></param>
  116. /// <param name="targetContext"></param>
  117. public virtual void Over(object? sender, DragEventArgs e, object? sourceContext, object? targetContext)
  118. {
  119. if (Validate(sender, e, sourceContext, targetContext, null) == false)
  120. {
  121. e.DragEffects = DragDropEffects.None;
  122. e.Handled = true;
  123. }
  124. else
  125. {
  126. e.DragEffects |= DragDropEffects.Copy | DragDropEffects.Move | DragDropEffects.Link;
  127. e.Handled = true;
  128. }
  129. }
  130. /// <summary>
  131. ///
  132. /// </summary>
  133. /// <param name="sender"></param>
  134. /// <param name="e"></param>
  135. /// <param name="sourceContext"></param>
  136. /// <param name="targetContext"></param>
  137. public virtual void Drop(object? sender, DragEventArgs e, object? sourceContext, object? targetContext)
  138. {
  139. if (Execute(sender, e, sourceContext, targetContext, null) == false)
  140. {
  141. e.DragEffects = DragDropEffects.None;
  142. e.Handled = true;
  143. }
  144. else
  145. {
  146. e.DragEffects |= DragDropEffects.Copy | DragDropEffects.Move | DragDropEffects.Link;
  147. e.Handled = true;
  148. }
  149. }
  150. /// <summary>
  151. ///
  152. /// </summary>
  153. /// <param name="sender"></param>
  154. /// <param name="e"></param>
  155. public virtual void Leave(object? sender, RoutedEventArgs e)
  156. {
  157. Cancel(sender, e);
  158. }
  159. /// <summary>
  160. ///
  161. /// </summary>
  162. /// <param name="sender"></param>
  163. /// <param name="e"></param>
  164. /// <param name="sourceContext"></param>
  165. /// <param name="targetContext"></param>
  166. /// <param name="state"></param>
  167. /// <returns></returns>
  168. public virtual bool Validate(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state)
  169. {
  170. return false;
  171. }
  172. /// <summary>
  173. ///
  174. /// </summary>
  175. /// <param name="sender"></param>
  176. /// <param name="e"></param>
  177. /// <param name="sourceContext"></param>
  178. /// <param name="targetContext"></param>
  179. /// <param name="state"></param>
  180. /// <returns></returns>
  181. public virtual bool Execute(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state)
  182. {
  183. return false;
  184. }
  185. /// <summary>
  186. ///
  187. /// </summary>
  188. /// <param name="sender"></param>
  189. /// <param name="e"></param>
  190. public virtual void Cancel(object? sender, RoutedEventArgs e)
  191. {
  192. }
  193. }