Browse Source

Remove IDataObject to IDataTransfer wrappers and related methods (#20521)

* Remove IDataObject to IDataTransfer wrappers and related methods

* Remove IDataObject
pull/20166/merge
Julien Lebosquain 1 day ago
committed by GitHub
parent
commit
7b54818918
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 16
      api/Avalonia.Headless.nupkg.xml
  2. 276
      api/Avalonia.nupkg.xml
  3. 57
      src/Avalonia.Base/Input/DataFormats.cs
  4. 41
      src/Avalonia.Base/Input/DataObject.cs
  5. 54
      src/Avalonia.Base/Input/DataObjectExtensions.cs
  6. 9
      src/Avalonia.Base/Input/DataTransferExtensions.cs
  7. 10
      src/Avalonia.Base/Input/DragDrop.cs
  8. 17
      src/Avalonia.Base/Input/DragEventArgs.cs
  9. 32
      src/Avalonia.Base/Input/IDataObject.cs
  10. 55
      src/Avalonia.Base/Input/Platform/Clipboard.cs
  11. 76
      src/Avalonia.Base/Input/Platform/DataObjectToDataTransferItemWrapper.cs
  12. 95
      src/Avalonia.Base/Input/Platform/DataObjectToDataTransferWrapper.cs
  13. 42
      src/Avalonia.Base/Input/Platform/DataTransferToDataObjectWrapper.cs
  14. 55
      src/Avalonia.Base/Input/Platform/IClipboard.cs
  15. 9
      src/Avalonia.Base/Input/Platform/IPlatformDragSource.cs
  16. 22
      src/Avalonia.Base/Input/Raw/RawDragEvent.cs
  17. 10
      src/Avalonia.Controls/Platform/InProcessDragSource.cs
  18. 14
      src/Avalonia.DesignerSupport/Remote/Stubs.cs
  19. 7
      src/Avalonia.Native/AvaloniaNativeDragSource.cs
  20. 8
      src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs
  21. 7
      src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs
  22. 2
      src/Headless/Avalonia.Headless/IHeadlessWindow.cs
  23. 10
      src/Windows/Avalonia.Win32/DragSource.cs

16
api/Avalonia.Headless.nupkg.xml

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://learn.microsoft.com/dotnet/fundamentals/package-validation/diagnostic-ids -->
<Suppressions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Headless.HeadlessWindowExtensions.DragDrop(Avalonia.Controls.TopLevel,Avalonia.Point,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)</Target>
<Left>baseline/Avalonia.Headless/lib/net10.0/Avalonia.Headless.dll</Left>
<Right>current/Avalonia.Headless/lib/net10.0/Avalonia.Headless.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Headless.HeadlessWindowExtensions.DragDrop(Avalonia.Controls.TopLevel,Avalonia.Point,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)</Target>
<Left>baseline/Avalonia.Headless/lib/net8.0/Avalonia.Headless.dll</Left>
<Right>current/Avalonia.Headless/lib/net8.0/Avalonia.Headless.dll</Right>
</Suppression>
</Suppressions>

276
api/Avalonia.nupkg.xml

@ -43,6 +43,18 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Input.DataObjectExtensions</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Input.IDataObject</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0001</DiagnosticId> <DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Media.Fonts.FontFamilyLoader</Target> <Target>T:Avalonia.Media.Fonts.FontFamilyLoader</Target>
@ -157,6 +169,18 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Input.DataObjectExtensions</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Input.IDataObject</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0001</DiagnosticId> <DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Media.Fonts.FontFamilyLoader</Target> <Target>T:Avalonia.Media.Fonts.FontFamilyLoader</Target>
@ -241,6 +265,24 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Input.DataFormats.FileNames</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Input.DataFormats.Files</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Input.DataFormats.Text</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0002</DiagnosticId> <DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Media.DrawingImage.ViewboxProperty</Target> <Target>F:Avalonia.Media.DrawingImage.ViewboxProperty</Target>
@ -289,6 +331,48 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.Contains(System.String)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.Get(System.String)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.GetDataFormats</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.Set(System.String,System.Object)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DragDrop.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DragEventArgs.#ctor(Avalonia.Interactivity.RoutedEvent{Avalonia.Input.DragEventArgs},Avalonia.Input.IDataObject,Avalonia.Interactivity.Interactive,Avalonia.Point,Avalonia.Input.KeyModifiers)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DragEventArgs.get_Data</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0002</DiagnosticId> <DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)</Target> <Target>M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)</Target>
@ -301,6 +385,60 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.GetDataAsync(System.String)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.GetFormatsAsync</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.GetTextAsync</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.SetDataObjectAsync(Avalonia.Input.IDataObject)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.SetTextAsync(System.String)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.TryGetInProcessDataObjectAsync</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IPlatformDragSource.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Raw.RawDragEvent.#ctor(Avalonia.Input.Raw.IDragDropDevice,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IInputRoot,Avalonia.Point,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Raw.RawDragEvent.get_Data</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0002</DiagnosticId> <DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.TextInput.TextInputMethodClient.ShowInputPanel</Target> <Target>M:Avalonia.Input.TextInput.TextInputMethodClient.ShowInputPanel</Target>
@ -769,6 +907,24 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Input.DataFormats.FileNames</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Input.DataFormats.Files</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Input.DataFormats.Text</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0002</DiagnosticId> <DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Media.DrawingImage.ViewboxProperty</Target> <Target>F:Avalonia.Media.DrawingImage.ViewboxProperty</Target>
@ -817,6 +973,48 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.Contains(System.String)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.Get(System.String)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.GetDataFormats</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.Set(System.String,System.Object)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DragDrop.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DragEventArgs.#ctor(Avalonia.Interactivity.RoutedEvent{Avalonia.Input.DragEventArgs},Avalonia.Input.IDataObject,Avalonia.Interactivity.Interactive,Avalonia.Point,Avalonia.Input.KeyModifiers)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DragEventArgs.get_Data</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0002</DiagnosticId> <DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)</Target> <Target>M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)</Target>
@ -829,6 +1027,60 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.GetDataAsync(System.String)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.GetFormatsAsync</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.GetTextAsync</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.SetDataObjectAsync(Avalonia.Input.IDataObject)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.SetTextAsync(System.String)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.TryGetInProcessDataObjectAsync</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IPlatformDragSource.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Raw.RawDragEvent.#ctor(Avalonia.Input.Raw.IDragDropDevice,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IInputRoot,Avalonia.Point,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Raw.RawDragEvent.get_Data</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0002</DiagnosticId> <DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.TextInput.TextInputMethodClient.ShowInputPanel</Target> <Target>M:Avalonia.Input.TextInput.TextInputMethodClient.ShowInputPanel</Target>
@ -1621,6 +1873,12 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0008</DiagnosticId>
<Target>T:Avalonia.Input.DataObject</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0008</DiagnosticId> <DiagnosticId>CP0008</DiagnosticId>
<Target>T:Avalonia.Media.ImmediateDrawingContext</Target> <Target>T:Avalonia.Media.ImmediateDrawingContext</Target>
@ -1729,6 +1987,12 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Vulkan.dll</Left> <Left>baseline/Avalonia/lib/net10.0/Avalonia.Vulkan.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Vulkan.dll</Right> <Right>current/Avalonia/lib/net10.0/Avalonia.Vulkan.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0008</DiagnosticId>
<Target>T:Avalonia.Input.DataObject</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0008</DiagnosticId> <DiagnosticId>CP0008</DiagnosticId>
<Target>T:Avalonia.Media.ImmediateDrawingContext</Target> <Target>T:Avalonia.Media.ImmediateDrawingContext</Target>
@ -1843,6 +2107,12 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0009</DiagnosticId>
<Target>T:Avalonia.Input.DataObject</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0009</DiagnosticId> <DiagnosticId>CP0009</DiagnosticId>
<Target>T:Avalonia.Platform.Screen</Target> <Target>T:Avalonia.Platform.Screen</Target>
@ -1855,6 +2125,12 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0009</DiagnosticId>
<Target>T:Avalonia.Input.DataObject</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0009</DiagnosticId> <DiagnosticId>CP0009</DiagnosticId>
<Target>T:Avalonia.Platform.Screen</Target> <Target>T:Avalonia.Platform.Screen</Target>

57
src/Avalonia.Base/Input/DataFormats.cs

@ -1,56 +1,11 @@
using System; using System;
using System.ComponentModel;
using Avalonia.Input.Platform;
namespace Avalonia.Input namespace Avalonia.Input;
{
public static class DataFormats
{
/// <summary>
/// Dataformat for plaintext
/// </summary>
[Obsolete($"Use {nameof(DataFormat)}.{nameof(DataFormat.Text)} instead.")]
public static readonly string Text = nameof(Text);
// TODO13: remove
/// <summary> /// <summary>
/// Dataformat for one or more files. /// This class does not do anything anymore.
/// Use <see cref="DataFormat"/> instead.
/// </summary> /// </summary>
[Obsolete($"Use {nameof(DataFormat)}.{nameof(DataFormat.File)} instead.")] [Obsolete($"Use {nameof(DataFormat)} instead", true)]
public static readonly string Files = nameof(Files); public static class DataFormats;
/// <summary>
/// Dataformat for one or more filenames
/// </summary>
/// <remarks>
/// This data format is supported only on desktop platforms.
/// </remarks>
[Obsolete($"Use {nameof(DataFormat)}.{nameof(DataFormat.File)} instead."), EditorBrowsable(EditorBrowsableState.Never)]
public static readonly string FileNames = nameof(FileNames);
#pragma warning disable CS0618 // Type or member is obsolete
internal static DataFormat ToDataFormat(string format)
{
if (format == Text)
return DataFormat.Text;
if (format == Files || format == FileNames)
return DataFormat.File;
return DataFormat.CreateBytesPlatformFormat(format);
}
internal static string ToString(DataFormat format)
{
if (DataFormat.Text.Equals(format))
return Text;
if (DataFormat.File.Equals(format))
return Files;
return format.Identifier;
}
#pragma warning restore CS0618 // Type or member is obsolete
}
}

41
src/Avalonia.Base/Input/DataObject.cs

@ -1,40 +1,11 @@
using System; using System;
using System.Collections.Generic;
namespace Avalonia.Input namespace Avalonia.Input;
{
/// <summary>
/// Specific and mutable implementation of the IDataObject interface.
/// </summary>
[Obsolete($"Use {nameof(DataTransfer)} instead")]
public class DataObject : IDataObject
{
private readonly Dictionary<string, object> _items = new();
/// <inheritdoc />
public bool Contains(string dataFormat)
{
return _items.ContainsKey(dataFormat);
}
/// <inheritdoc />
public object? Get(string dataFormat)
{
return _items.TryGetValue(dataFormat, out var item) ? item : null;
}
/// <inheritdoc />
public IEnumerable<string> GetDataFormats()
{
return _items.Keys;
}
// TODO13: remove
/// <summary> /// <summary>
/// Sets a value to the internal store of the data object with <see cref="DataFormats"/> as a key. /// This class does not do anything anymore.
/// Use <see cref="DataTransfer"/> instead.
/// </summary> /// </summary>
public void Set(string dataFormat, object value) [Obsolete($"Use {nameof(DataTransfer)} instead", true)]
{ public sealed class DataObject;
_items[dataFormat] = value;
}
}
}

54
src/Avalonia.Base/Input/DataObjectExtensions.cs

@ -1,54 +0,0 @@
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using Avalonia.Platform.Storage;
#pragma warning disable CS0618 // Type or member is obsolete
namespace Avalonia.Input
{
// TODO12: remove
public static class DataObjectExtensions
{
/// <summary>
/// Returns a list of files if the DataObject contains files or filenames.
/// <seealso cref="DataFormats.Files"/>.
/// </summary>
/// <returns>
/// Collection of storage items - files or folders. If format isn't available, returns null.
/// </returns>
public static IEnumerable<IStorageItem>? GetFiles(this IDataObject dataObject)
{
return dataObject.Get(DataFormats.Files) as IEnumerable<IStorageItem>;
}
/// <summary>
/// Returns a list of filenames if the DataObject contains filenames.
/// <seealso cref="DataFormats.FileNames"/>
/// </summary>
/// <returns>
/// Collection of file names. If format isn't available, returns null.
/// </returns>
[System.Obsolete("Use GetFiles, this method is supported only on desktop platforms."), EditorBrowsable(EditorBrowsableState.Never)]
public static IEnumerable<string>? GetFileNames(this IDataObject dataObject)
{
return (dataObject.Get(DataFormats.FileNames) as IEnumerable<string>)
?? dataObject.GetFiles()?
.Select(f => f.TryGetLocalPath())
.Where(p => !string.IsNullOrEmpty(p))
.OfType<string>();
}
/// <summary>
/// Returns the dragged text if the DataObject contains any text.
/// <seealso cref="DataFormats.Text"/>
/// </summary>
/// <returns>
/// A text string. If format isn't available, returns null.
/// </returns>
public static string? GetText(this IDataObject dataObject)
{
return dataObject.Get(DataFormats.Text) as string;
}
}
}

9
src/Avalonia.Base/Input/DataTransferExtensions.cs

@ -1,7 +1,5 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using Avalonia.Input.Platform;
using Avalonia.Media.Imaging; using Avalonia.Media.Imaging;
using Avalonia.Platform.Storage; using Avalonia.Platform.Storage;
@ -14,11 +12,6 @@ namespace Avalonia.Input;
/// </summary> /// </summary>
public static class DataTransferExtensions public static class DataTransferExtensions
{ {
[Obsolete]
internal static IDataObject ToLegacyDataObject(this IDataTransfer dataTransfer)
=> (dataTransfer as DataObjectToDataTransferWrapper)?.DataObject
?? new DataTransferToDataObjectWrapper(dataTransfer);
/// <summary> /// <summary>
/// Gets whether a <see cref="IDataTransfer"/> supports a specific format. /// Gets whether a <see cref="IDataTransfer"/> supports a specific format.
/// </summary> /// </summary>

10
src/Avalonia.Base/Input/DragDrop.cs

@ -122,16 +122,6 @@ namespace Avalonia.Input
element.RemoveHandler(DropEvent, handler); element.RemoveHandler(DropEvent, handler);
} }
/// <summary>
/// Starts a dragging operation with the given <see cref="IDataObject"/> and returns the applied drop effect from the target.
/// <seealso cref="DataObject"/>
/// </summary>
[Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
public static Task<DragDropEffects> DoDragDrop(PointerEventArgs triggerEvent, IDataObject data, DragDropEffects allowedEffects)
{
return DoDragDropAsync(triggerEvent, new DataObjectToDataTransferWrapper(data), allowedEffects);
}
/// <summary> /// <summary>
/// Starts a dragging operation with the given <see cref="IDataTransfer"/> and returns the applied drop effect from the target. /// Starts a dragging operation with the given <see cref="IDataTransfer"/> and returns the applied drop effect from the target.
/// <seealso cref="DataTransfer"/> /// <seealso cref="DataTransfer"/>

17
src/Avalonia.Base/Input/DragEventArgs.cs

@ -1,5 +1,4 @@
using System; using System;
using Avalonia.Input.Platform;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.Metadata; using Avalonia.Metadata;
@ -9,16 +8,11 @@ namespace Avalonia.Input
{ {
private readonly Interactive _target; private readonly Interactive _target;
private readonly Point _targetLocation; private readonly Point _targetLocation;
[Obsolete] private IDataObject? _legacyDataObject;
public DragDropEffects DragEffects { get; set; } public DragDropEffects DragEffects { get; set; }
public IDataTransfer DataTransfer { get; } public IDataTransfer DataTransfer { get; }
[Obsolete($"Use {nameof(DataTransfer)} instead.")]
public IDataObject Data
=> _legacyDataObject ??= DataTransfer.ToLegacyDataObject();
public KeyModifiers KeyModifiers { get; } public KeyModifiers KeyModifiers { get; }
public Point GetPosition(Visual relativeTo) public Point GetPosition(Visual relativeTo)
@ -31,17 +25,6 @@ namespace Avalonia.Input
return _target.TranslatePoint(_targetLocation, relativeTo) ?? new Point(0, 0); return _target.TranslatePoint(_targetLocation, relativeTo) ?? new Point(0, 0);
} }
[Obsolete($"Use the constructor accepting a {nameof(IDataTransfer)} instance instead.")]
public DragEventArgs(
RoutedEvent<DragEventArgs> routedEvent,
IDataObject data,
Interactive target,
Point targetLocation,
KeyModifiers keyModifiers)
: this(routedEvent, new DataObjectToDataTransferWrapper(data), target, targetLocation, keyModifiers)
{
}
[Unstable("This constructor might be removed in 12.0. For unit testing, consider using DragDrop.DoDragDrop or IHeadlessWindow.DragDrop.")] [Unstable("This constructor might be removed in 12.0. For unit testing, consider using DragDrop.DoDragDrop or IHeadlessWindow.DragDrop.")]
public DragEventArgs( public DragEventArgs(
RoutedEvent<DragEventArgs> routedEvent, RoutedEvent<DragEventArgs> routedEvent,

32
src/Avalonia.Base/Input/IDataObject.cs

@ -1,32 +0,0 @@
using System;
using System.Collections.Generic;
namespace Avalonia.Input
{
/// <summary>
/// Interface to access information about the data of a drag-and-drop operation.
/// </summary>
[Obsolete($"Use {nameof(IDataTransfer)} or {nameof(IAsyncDataTransfer)} instead")]
public interface IDataObject
{
/// <summary>
/// Lists all formats which are present in the DataObject.
/// <seealso cref="DataFormats"/>
/// </summary>
IEnumerable<string> GetDataFormats();
/// <summary>
/// Checks whether a given DataFormat is present in this object
/// <seealso cref="DataFormats"/>
/// </summary>
bool Contains(string dataFormat);
/// <summary>
/// Tries to get the data of the given DataFormat.
/// </summary>
/// <returns>
/// Object data. If format isn't available, returns null.
/// </returns>
object? Get(string dataFormat);
}
}

55
src/Avalonia.Base/Input/Platform/Clipboard.cs

@ -1,9 +1,4 @@
using System; using System.Threading.Tasks;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Avalonia.Compatibility;
using Avalonia.Platform.Storage;
namespace Avalonia.Input.Platform; namespace Avalonia.Input.Platform;
@ -15,12 +10,6 @@ internal sealed class Clipboard(IClipboardImpl clipboardImpl) : IClipboard
private readonly IClipboardImpl _clipboardImpl = clipboardImpl; private readonly IClipboardImpl _clipboardImpl = clipboardImpl;
private IAsyncDataTransfer? _lastDataTransfer; private IAsyncDataTransfer? _lastDataTransfer;
Task<string?> IClipboard.GetTextAsync()
=> this.TryGetTextAsync();
Task IClipboard.SetTextAsync(string? text)
=> this.SetValueAsync(DataFormat.Text, text);
public Task ClearAsync() public Task ClearAsync()
{ {
_lastDataTransfer?.Dispose(); _lastDataTransfer?.Dispose();
@ -29,10 +18,6 @@ internal sealed class Clipboard(IClipboardImpl clipboardImpl) : IClipboard
return _clipboardImpl.ClearAsync(); return _clipboardImpl.ClearAsync();
} }
[Obsolete($"Use {nameof(SetDataAsync)} instead.")]
Task IClipboard.SetDataObjectAsync(IDataObject data)
=> SetDataAsync(new DataObjectToDataTransferWrapper(data));
public Task SetDataAsync(IAsyncDataTransfer? dataTransfer) public Task SetDataAsync(IAsyncDataTransfer? dataTransfer)
{ {
if (dataTransfer is null) if (dataTransfer is null)
@ -47,47 +32,9 @@ internal sealed class Clipboard(IClipboardImpl clipboardImpl) : IClipboard
public Task FlushAsync() public Task FlushAsync()
=> _clipboardImpl is IFlushableClipboardImpl flushable ? flushable.FlushAsync() : Task.CompletedTask; => _clipboardImpl is IFlushableClipboardImpl flushable ? flushable.FlushAsync() : Task.CompletedTask;
async Task<string[]> IClipboard.GetFormatsAsync()
{
var dataTransfer = await TryGetDataAsync();
return dataTransfer is null ? [] : dataTransfer.Formats.Select(DataFormats.ToString).ToArray();
}
[Obsolete($"Use {nameof(TryGetDataAsync)} instead.")]
async Task<object?> IClipboard.GetDataAsync(string format)
{
// No ConfigureAwait(false) here: we want TryGetXxxAsync() below to be called on the initial thread.
using var dataTransfer = await TryGetDataAsync();
if (dataTransfer is null)
return null;
if (format == DataFormats.Text)
return await dataTransfer.TryGetTextAsync().ConfigureAwait(false);
if (format == DataFormats.Files)
return await dataTransfer.TryGetFilesAsync().ConfigureAwait(false);
if (format == DataFormats.FileNames)
{
return (await dataTransfer.TryGetFilesAsync().ConfigureAwait(false))
?.Select(file => file.TryGetLocalPath())
.Where(path => path is not null)
.ToArray();
}
return null;
}
public Task<IAsyncDataTransfer?> TryGetDataAsync() public Task<IAsyncDataTransfer?> TryGetDataAsync()
=> _clipboardImpl.TryGetDataAsync(); => _clipboardImpl.TryGetDataAsync();
[Obsolete($"Use {nameof(TryGetInProcessDataAsync)} instead.")]
async Task<IDataObject?> IClipboard.TryGetInProcessDataObjectAsync()
{
var dataTransfer = await TryGetInProcessDataAsync().ConfigureAwait(false);
return (dataTransfer as DataObjectToDataTransferWrapper)?.DataObject;
}
public async Task<IAsyncDataTransfer?> TryGetInProcessDataAsync() public async Task<IAsyncDataTransfer?> TryGetInProcessDataAsync()
{ {
if (_lastDataTransfer is null || _clipboardImpl is not IOwnedClipboardImpl ownedClipboardImpl) if (_lastDataTransfer is null || _clipboardImpl is not IOwnedClipboardImpl ownedClipboardImpl)

76
src/Avalonia.Base/Input/Platform/DataObjectToDataTransferItemWrapper.cs

@ -1,76 +0,0 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using Avalonia.Compatibility;
namespace Avalonia.Input.Platform;
/// <summary>
/// Wraps a legacy <see cref="IDataObject"/> into a <see cref="IDataTransferItem"/>.
/// </summary>
[Obsolete]
internal sealed class DataObjectToDataTransferItemWrapper(
IDataObject dataObject,
DataFormat[] formats,
string[] formatStrings)
: PlatformDataTransferItem
{
private readonly IDataObject _dataObject = dataObject;
private readonly DataFormat[] _formats = formats;
private readonly string[] _formatStrings = formatStrings;
protected override DataFormat[] ProvideFormats()
=> _formats;
protected override object? TryGetRawCore(DataFormat format)
{
var index = Array.IndexOf(Formats, format);
if (index < 0)
return null;
// We should never have DataFormat.File here, it's been handled by DataObjectToDataTransferWrapper.
Debug.Assert(!DataFormat.File.Equals(format));
var formatString = _formatStrings[index];
var data = _dataObject.Get(formatString);
if (DataFormat.Text.Equals(format))
return Convert.ToString(data) ?? string.Empty;
if (format is DataFormat<string>)
return Convert.ToString(data);
if (format is DataFormat<byte[]>)
return ConvertLegacyDataToBytes(format, data);
return null;
}
private static byte[]? ConvertLegacyDataToBytes(DataFormat format, object? data)
{
switch (data)
{
case null:
return null;
case byte[] bytes:
return bytes;
case string str:
return OperatingSystemEx.IsWindows() || OperatingSystemEx.IsMacOS() || OperatingSystemEx.IsIOS() ?
Encoding.Unicode.GetBytes(str) :
Encoding.UTF8.GetBytes(str);
case Stream stream:
var length = (int)(stream.Length - stream.Position);
var buffer = new byte[length];
stream.ReadExactly(buffer, 0, length);
return buffer;
default:
return null;
}
}
}

95
src/Avalonia.Base/Input/Platform/DataObjectToDataTransferWrapper.cs

@ -1,95 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Avalonia.Platform.Storage;
using Avalonia.Platform.Storage.FileIO;
namespace Avalonia.Input.Platform;
#pragma warning disable CS0618 // Type or member is obsolete: usages of IDataObject and DataFormats
// TODO12: remove
/// <summary>
/// Wraps a legacy <see cref="IDataObject"/> into a <see cref="IDataTransfer"/>.
/// </summary>
[Obsolete]
internal sealed class DataObjectToDataTransferWrapper(IDataObject dataObject)
: PlatformDataTransfer
{
public IDataObject DataObject { get; } = dataObject;
protected override DataFormat[] ProvideFormats()
=> DataObject.GetDataFormats().Select(DataFormats.ToDataFormat).Distinct().ToArray();
protected override PlatformDataTransferItem[] ProvideItems()
{
var items = new List<PlatformDataTransferItem>();
var nonFileFormats = new List<DataFormat>();
var nonFileFormatStrings = new List<string>();
var hasFiles = false;
foreach (var formatString in DataObject.GetDataFormats())
{
var format = DataFormats.ToDataFormat(formatString);
if (formatString == DataFormats.Files)
{
if (hasFiles)
continue;
// This is not ideal as we're reading the filenames ahead of time to generate the appropriate items.
// We don't really care about that for this legacy wrapper.
if (DataObject.Get(formatString) is IEnumerable<IStorageItem> storageItems)
{
hasFiles = true;
foreach (var storageItem in storageItems)
items.Add(PlatformDataTransferItem.Create(DataFormat.File, storageItem));
}
}
else if (formatString == DataFormats.FileNames)
{
if (hasFiles)
continue;
if (DataObject.Get(formatString) is IEnumerable<string> fileNames)
{
hasFiles = true;
foreach (var fileName in fileNames)
{
if (StorageProviderHelpers.TryCreateBclStorageItem(fileName) is { } storageItem)
items.Add(PlatformDataTransferItem.Create(DataFormat.File, storageItem));
}
}
}
else
{
nonFileFormats.Add(format);
nonFileFormatStrings.Add(formatString);
}
}
if (nonFileFormats.Count > 0)
{
Debug.Assert(nonFileFormats.Count == nonFileFormatStrings.Count);
// Single item containing all formats except for DataFormat.File.
items.Add(new DataObjectToDataTransferItemWrapper(
DataObject,
nonFileFormats.ToArray(),
nonFileFormatStrings.ToArray()));
}
return items.ToArray();
}
[SuppressMessage(
"ReSharper",
"SuspiciousTypeConversion.Global",
Justification = "IDisposable may be implemented externally by the IDataObject instance.")]
public override void Dispose()
=> (DataObject as IDisposable)?.Dispose();
}

42
src/Avalonia.Base/Input/Platform/DataTransferToDataObjectWrapper.cs

@ -1,42 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Avalonia.Platform.Storage;
namespace Avalonia.Input.Platform;
/// <summary>
/// Wraps a <see cref="IDataTransfer"/> into a legacy <see cref="IDataObject"/>.
/// </summary>
[Obsolete]
internal sealed class DataTransferToDataObjectWrapper(IDataTransfer dataTransfer) : IDataObject
{
public IDataTransfer DataTransfer { get; } = dataTransfer;
public IEnumerable<string> GetDataFormats()
=> DataTransfer.Formats.Select(DataFormats.ToString);
public bool Contains(string dataFormat)
=> DataTransfer.Contains(DataFormats.ToDataFormat(dataFormat));
public object? Get(string dataFormat)
{
if (dataFormat == DataFormats.Text)
return DataTransfer.TryGetText();
if (dataFormat == DataFormats.Files)
return DataTransfer.TryGetFiles();
if (dataFormat == DataFormats.FileNames)
{
return DataTransfer
.TryGetFiles()
?.Select(file => file.TryGetLocalPath())
.Where(path => path is not null)
.ToArray();
}
return null;
}
}

55
src/Avalonia.Base/Input/Platform/IClipboard.cs

@ -1,4 +1,3 @@
using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Avalonia.Metadata; using Avalonia.Metadata;
@ -10,41 +9,11 @@ namespace Avalonia.Input.Platform
[NotClientImplementable] [NotClientImplementable]
public interface IClipboard public interface IClipboard
{ {
// TODO12: remove, ClipboardExtensions.TryGetTextAsync exists
/// <summary>
/// Returns a string containing the text data on the clipboard.
/// </summary>
/// <returns>A string containing text data, or null if no corresponding text data is available.</returns>
[Obsolete($"Use {nameof(ClipboardExtensions)}.{nameof(ClipboardExtensions.TryGetTextAsync)} instead")]
Task<string?> GetTextAsync();
// TODO12: remove, ClipboardExtensions.SetTextAsync exists
/// <summary>
/// Places a text on the clipboard.
/// </summary>
/// <param name="text">The text value to set.</param>
/// <remarks>
/// <para>By calling this method, the clipboard will get cleared of any possible previous data.</para>
/// <para>
/// If <paramref name="text"/> is null or empty, nothing will get placed on the clipboard and this method
/// will be equivalent to <see cref="ClearAsync"/>.
/// </para>
/// </remarks>
Task SetTextAsync(string? text);
/// <summary> /// <summary>
/// Clears any data from the system clipboard. /// Clears any data from the system clipboard.
/// </summary> /// </summary>
Task ClearAsync(); Task ClearAsync();
/// <summary>
/// Places a specified non-persistent data object on the system Clipboard.
/// </summary>
/// <param name="data">A data object (an object that implements <see cref="IDataObject"/>) to place on the system Clipboard.</param>
/// <exception cref="System.ArgumentNullException"><paramref name="data"/> is null.</exception>
[Obsolete($"Use {nameof(SetDataAsync)} instead.")]
Task SetDataObjectAsync(IDataObject data);
/// <summary> /// <summary>
/// Places a data object on the clipboard. /// Places a data object on the clipboard.
/// The data object is responsible for providing supported formats and data upon request. /// The data object is responsible for providing supported formats and data upon request.
@ -69,20 +38,6 @@ namespace Avalonia.Input.Platform
/// <remarks>This method is only supported on the Windows platform. This method will do nothing on other platforms.</remarks> /// <remarks>This method is only supported on the Windows platform. This method will do nothing on other platforms.</remarks>
Task FlushAsync(); Task FlushAsync();
/// <summary>
/// Get list of available Clipboard format.
/// </summary>
[Obsolete($"Use {nameof(ClipboardExtensions.GetDataFormatsAsync)} instead.")]
Task<string[]> GetFormatsAsync();
/// <summary>
/// Retrieves data in a specified format from the Clipboard.
/// </summary>
/// <param name="format">A string that specifies the format of the data to retrieve. For a set of predefined data formats, see the <see cref="DataFormats"/> class.</param>
/// <returns></returns>
[Obsolete($"Use {nameof(TryGetDataAsync)} instead.")]
Task<object?> GetDataAsync(string format);
/// <summary> /// <summary>
/// Retrieves data from the clipboard. /// Retrieves data from the clipboard.
/// </summary> /// </summary>
@ -95,16 +50,6 @@ namespace Avalonia.Input.Platform
/// </remarks> /// </remarks>
Task<IAsyncDataTransfer?> TryGetDataAsync(); Task<IAsyncDataTransfer?> TryGetDataAsync();
/// <summary>
/// If clipboard contains the IDataObject that was set by a previous call to <see cref="SetDataObjectAsync(Avalonia.Input.IDataObject)"/>,
/// return said IDataObject instance. Otherwise, return null.
/// Note that not every platform supports that method, on unsupported platforms this method will always return
/// null
/// </summary>
/// <returns></returns>
[Obsolete($"Use {nameof(TryGetInProcessDataAsync)} instead.")]
Task<IDataObject?> TryGetInProcessDataObjectAsync();
/// <summary> /// <summary>
/// Retrieves the exact instance of a <see cref="IAsyncDataTransfer"/> previously placed on the clipboard /// Retrieves the exact instance of a <see cref="IAsyncDataTransfer"/> previously placed on the clipboard
/// by <see cref="SetDataAsync"/>, if any. /// by <see cref="SetDataAsync"/>, if any.

9
src/Avalonia.Base/Input/Platform/IPlatformDragSource.cs

@ -1,5 +1,4 @@
using System; using System.Threading.Tasks;
using System.Threading.Tasks;
using Avalonia.Metadata; using Avalonia.Metadata;
namespace Avalonia.Input.Platform namespace Avalonia.Input.Platform
@ -7,12 +6,6 @@ namespace Avalonia.Input.Platform
[NotClientImplementable] [NotClientImplementable]
public interface IPlatformDragSource public interface IPlatformDragSource
{ {
[Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
Task<DragDropEffects> DoDragDrop(
PointerEventArgs triggerEvent,
IDataObject data,
DragDropEffects allowedEffects);
Task<DragDropEffects> DoDragDropAsync( Task<DragDropEffects> DoDragDropAsync(
PointerEventArgs triggerEvent, PointerEventArgs triggerEvent,
IDataTransfer dataTransfer, IDataTransfer dataTransfer,

22
src/Avalonia.Base/Input/Raw/RawDragEvent.cs

@ -1,40 +1,20 @@
using System; using Avalonia.Metadata;
using Avalonia.Input.Platform;
using Avalonia.Metadata;
namespace Avalonia.Input.Raw namespace Avalonia.Input.Raw
{ {
[PrivateApi] [PrivateApi]
public class RawDragEvent : RawInputEventArgs public class RawDragEvent : RawInputEventArgs
{ {
[Obsolete] private IDataObject? _legacyDataObject;
public Point Location { get; set; } public Point Location { get; set; }
public IDataTransfer DataTransfer { get; } public IDataTransfer DataTransfer { get; }
[Obsolete($"Use {nameof(DataTransfer)} instead.")]
public IDataObject Data
=> _legacyDataObject ??= DataTransfer.ToLegacyDataObject();
public DragDropEffects Effects { get; set; } public DragDropEffects Effects { get; set; }
public RawDragEventType Type { get; } public RawDragEventType Type { get; }
public KeyModifiers KeyModifiers { get; } public KeyModifiers KeyModifiers { get; }
[Obsolete($"Use the constructor accepting a {nameof(IDataTransfer)} instance instead.")]
public RawDragEvent(IDragDropDevice inputDevice,
RawDragEventType type,
IInputRoot root,
Point location,
IDataObject data,
DragDropEffects effects,
RawInputModifiers modifiers)
: this(inputDevice, type, root, location, new DataObjectToDataTransferWrapper(data), effects, modifiers)
{
}
public RawDragEvent( public RawDragEvent(
IDragDropDevice inputDevice, IDragDropDevice inputDevice,
RawDragEventType type, RawDragEventType type,

10
src/Avalonia.Controls/Platform/InProcessDragSource.cs

@ -1,5 +1,4 @@
using System; using System.Linq;
using System.Linq;
using Avalonia.Reactive; using Avalonia.Reactive;
using System.Threading.Tasks; using System.Threading.Tasks;
using Avalonia.Controls; using Avalonia.Controls;
@ -31,13 +30,6 @@ namespace Avalonia.Platform
_dragDrop = AvaloniaLocator.Current.GetRequiredService<IDragDropDevice>(); _dragDrop = AvaloniaLocator.Current.GetRequiredService<IDragDropDevice>();
} }
[Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
Task<DragDropEffects> IPlatformDragSource.DoDragDrop(
PointerEventArgs triggerEvent,
IDataObject data,
DragDropEffects allowedEffects)
=> DoDragDropAsync(triggerEvent, new DataObjectToDataTransferWrapper(data), allowedEffects);
public async Task<DragDropEffects> DoDragDropAsync( public async Task<DragDropEffects> DoDragDropAsync(
PointerEventArgs triggerEvent, PointerEventArgs triggerEvent,
IDataTransfer dataTransfer, IDataTransfer dataTransfer,

14
src/Avalonia.DesignerSupport/Remote/Stubs.cs

@ -223,26 +223,12 @@ namespace Avalonia.DesignerSupport.Remote
class ClipboardStub : IClipboard class ClipboardStub : IClipboard
{ {
public Task<string?> GetTextAsync() => Task.FromResult<string?>(null);
public Task SetTextAsync(string? text) => Task.CompletedTask;
public Task ClearAsync() => Task.CompletedTask; public Task ClearAsync() => Task.CompletedTask;
[Obsolete($"Use {nameof(SetDataAsync)} instead.")]
public Task SetDataObjectAsync(IDataObject data) => Task.CompletedTask;
public Task SetDataAsync(IAsyncDataTransfer? dataTransfer) => Task.CompletedTask; public Task SetDataAsync(IAsyncDataTransfer? dataTransfer) => Task.CompletedTask;
public Task<string[]> GetFormatsAsync() => Task.FromResult<string[]>([]);
public Task<object?> GetDataAsync(string format) => Task.FromResult<object?>(null);
public Task<IAsyncDataTransfer?> TryGetDataAsync() => Task.FromResult<IAsyncDataTransfer?>(null); public Task<IAsyncDataTransfer?> TryGetDataAsync() => Task.FromResult<IAsyncDataTransfer?>(null);
[Obsolete($"Use {nameof(TryGetInProcessDataAsync)} instead.")]
public Task<IDataObject?> TryGetInProcessDataObjectAsync() => Task.FromResult<IDataObject?>(null);
public Task FlushAsync() => Task.CompletedTask; public Task FlushAsync() => Task.CompletedTask;
public Task<IAsyncDataTransfer?> TryGetInProcessDataAsync() => Task.FromResult<IAsyncDataTransfer?>(null); public Task<IAsyncDataTransfer?> TryGetInProcessDataAsync() => Task.FromResult<IAsyncDataTransfer?>(null);

7
src/Avalonia.Native/AvaloniaNativeDragSource.cs

@ -32,13 +32,6 @@ namespace Avalonia.Native
} }
} }
[Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
Task<DragDropEffects> IPlatformDragSource.DoDragDrop(
PointerEventArgs triggerEvent,
IDataObject data,
DragDropEffects allowedEffects)
=> DoDragDropAsync(triggerEvent, new DataObjectToDataTransferWrapper(data), allowedEffects);
public Task<DragDropEffects> DoDragDropAsync( public Task<DragDropEffects> DoDragDropAsync(
PointerEventArgs triggerEvent, PointerEventArgs triggerEvent,
IDataTransfer dataTransfer, IDataTransfer dataTransfer,

8
src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs

@ -121,14 +121,6 @@ public static class HeadlessWindowExtensions
RawInputModifiers modifiers = RawInputModifiers.None) => RawInputModifiers modifiers = RawInputModifiers.None) =>
RunJobsOnImpl(topLevel, w => w.MouseWheel(point, delta, modifiers)); RunJobsOnImpl(topLevel, w => w.MouseWheel(point, delta, modifiers));
/// <summary>
/// Simulates a drag and drop target event on the headless window/toplevel. This event simulates a user moving files from another app to the current app.
/// </summary>
[Obsolete($"Use the overload accepting a {nameof(IDataTransfer)} instance instead.")]
public static void DragDrop(this TopLevel topLevel, Point point, RawDragEventType type, IDataObject data,
DragDropEffects effects, RawInputModifiers modifiers = RawInputModifiers.None) =>
RunJobsOnImpl(topLevel, w => w.DragDrop(point, type, data, effects, modifiers));
/// <summary> /// <summary>
/// Simulates a drag and drop target event on the headless window/toplevel. This event simulates a user moving files from another app to the current app. /// Simulates a drag and drop target event on the headless window/toplevel. This event simulates a user moving files from another app to the current app.
/// </summary> /// </summary>

7
src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs

@ -349,13 +349,6 @@ namespace Avalonia.Headless
point, delta, modifiers)); point, delta, modifiers));
} }
[Obsolete($"Use the overload accepting a {nameof(IDataTransfer)} instance instead.")]
void IHeadlessWindow.DragDrop(Point point, RawDragEventType type, IDataObject data, DragDropEffects effects, RawInputModifiers modifiers)
{
var device = AvaloniaLocator.Current.GetRequiredService<IDragDropDevice>();
Input?.Invoke(new RawDragEvent(device, type, InputRoot!, point, new DataObjectToDataTransferWrapper(data), effects, modifiers));
}
void IHeadlessWindow.DragDrop(Point point, RawDragEventType type, IDataTransfer data, DragDropEffects effects, RawInputModifiers modifiers) void IHeadlessWindow.DragDrop(Point point, RawDragEventType type, IDataTransfer data, DragDropEffects effects, RawInputModifiers modifiers)
{ {
var device = AvaloniaLocator.Current.GetRequiredService<IDragDropDevice>(); var device = AvaloniaLocator.Current.GetRequiredService<IDragDropDevice>();

2
src/Headless/Avalonia.Headless/IHeadlessWindow.cs

@ -15,8 +15,6 @@ namespace Avalonia.Headless
void MouseMove(Point point, RawInputModifiers modifiers = RawInputModifiers.None); void MouseMove(Point point, RawInputModifiers modifiers = RawInputModifiers.None);
void MouseUp(Point point, MouseButton button, RawInputModifiers modifiers = RawInputModifiers.None); void MouseUp(Point point, MouseButton button, RawInputModifiers modifiers = RawInputModifiers.None);
void MouseWheel(Point point, Vector delta, RawInputModifiers modifiers = RawInputModifiers.None); void MouseWheel(Point point, Vector delta, RawInputModifiers modifiers = RawInputModifiers.None);
[Obsolete($"Use the overload accepting a {nameof(IDataTransfer)} instance instead.")]
void DragDrop(Point point, RawDragEventType type, IDataObject data, DragDropEffects effects, RawInputModifiers modifiers = RawInputModifiers.None);
void DragDrop(Point point, RawDragEventType type, IDataTransfer data, DragDropEffects effects, RawInputModifiers modifiers = RawInputModifiers.None); void DragDrop(Point point, RawDragEventType type, IDataTransfer data, DragDropEffects effects, RawInputModifiers modifiers = RawInputModifiers.None);
} }
} }

10
src/Windows/Avalonia.Win32/DragSource.cs

@ -1,5 +1,4 @@
using System; using System.Threading.Tasks;
using System.Threading.Tasks;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Input.Platform; using Avalonia.Input.Platform;
using Avalonia.Threading; using Avalonia.Threading;
@ -10,13 +9,6 @@ namespace Avalonia.Win32
{ {
internal sealed class DragSource : IPlatformDragSource internal sealed class DragSource : IPlatformDragSource
{ {
[Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
Task<DragDropEffects> IPlatformDragSource.DoDragDrop(
PointerEventArgs triggerEvent,
IDataObject data,
DragDropEffects allowedEffects)
=> DoDragDropAsync(triggerEvent, new DataObjectToDataTransferWrapper(data), allowedEffects);
public Task<DragDropEffects> DoDragDropAsync( public Task<DragDropEffects> DoDragDropAsync(
PointerEventArgs triggerEvent, PointerEventArgs triggerEvent,
IDataTransfer dataTransfer, IDataTransfer dataTransfer,

Loading…
Cancel
Save