Skip to content

Commit

Permalink
Wpf: Fix adding a Bitmap to the clipboard.
Browse files Browse the repository at this point in the history
  • Loading branch information
cwensley committed Oct 4, 2017
1 parent 9246bf9 commit 0062802
Show file tree
Hide file tree
Showing 4 changed files with 149 additions and 7 deletions.
15 changes: 13 additions & 2 deletions Source/Eto.Gtk/Forms/ClipboardHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Eto.GtkSharp.Drawing;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Eto.GtkSharp.Forms
{
Expand Down Expand Up @@ -117,18 +118,28 @@ public Image Image
{
set
{
var icon = value as Icon;
if (icon != null)
{
// todo: save as icon
//SetData(data, "eto-icon");
}
var pixbuf = value.ToGdk();
if (pixbuf == null)
throw new NotSupportedException();
AddImageEntry(pixbuf, (data, selection) => selection.SetPixbuf(data.Data as Gdk.Pixbuf));
}
get
{
var iconData = GetData("eto-icon");
if (iconData != null)
{
return new Icon(new MemoryStream(iconData, false));
}
var image = Control.WaitForImage();
if (image != null)
{
var handler = new BitmapHandler(image);
return new Bitmap(handler);
return new Bitmap(new BitmapHandler(image));
}
return null;
}
Expand Down
11 changes: 7 additions & 4 deletions Source/Eto.Mac/Forms/ClipboardHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,10 +88,10 @@ public Image Image
set
{
ClearIfNeeded();
var handler = value.Handler as BitmapHandler;
if (handler != null)
var nsimage = value.ToNS();
if (nsimage != null)
{
var data = handler.Control.AsTiff();
var data = nsimage.AsTiff();
Control.SetDataForType(data, NSPasteboard.NSTiffType);
}
}
Expand All @@ -103,7 +103,10 @@ public Image Image
Class.ThrowOnInitFailure = oldFail;
if (image.Handle == IntPtr.Zero)
return null;
return new Bitmap(new BitmapHandler(image));
if (image.Representations().Length > 1)
return new Icon(new IconHandler(image));
else
return new Bitmap(new BitmapHandler(image));
}
}

Expand Down
127 changes: 127 additions & 0 deletions Source/Eto.Test/Eto.Test/UnitTests/Forms/ClipboardTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Eto.Drawing;

namespace Eto.Test.UnitTests.Forms
{
Expand Down Expand Up @@ -81,5 +82,131 @@ public void SettingMultipleFormatsShouldWork()
}
});
}

[TestCase("Text")]
[TestCase("Html")]
//[TestCase("Image-Icon")] // TODO: not yet implemented fully, if even possible on all platforms
[TestCase("Image-Bitmap")]
[TestCase("String")]
[TestCase("Data")]
public void SettingIndividualValueShouldWork(string property)
{
Invoke(() =>
{
var byteData = new byte[] { 10, 20, 30 };
using (var clipboard = new Clipboard())
{
switch (property)
{
case "Text":
clipboard.Text = "Some Text";
Assert.AreEqual("Some Text", clipboard.Text);
Assert.AreEqual(null, clipboard.Html);
Assert.AreEqual(null, clipboard.Image);
Assert.AreEqual(null, clipboard.GetString("eto-woot"));
Assert.AreEqual(null, clipboard.GetData("eto-byte-data"));
break;
case "Html":
clipboard.Html = "<strong>Some Html</strong>";
Assert.AreEqual(null, clipboard.Text);
Assert.AreEqual("<strong>Some Html</strong>", clipboard.Html);
Assert.AreEqual(null, clipboard.Image);
Assert.AreEqual(null, clipboard.GetString("eto-woot"));
Assert.AreEqual(null, clipboard.GetData("eto-byte-data"));
break;
case "Image-Icon":
clipboard.Image = TestIcons.Logo;
Assert.AreEqual(null, clipboard.Text);
Assert.AreEqual(null, clipboard.Html);
Assert.IsNotNull(clipboard.Image);
Assert.IsInstanceOf<Icon>(clipboard.Image);
Assert.AreEqual(null, clipboard.GetString("eto-woot"));
Assert.AreEqual(null, clipboard.GetData("eto-byte-data"));
break;
case "Image-Bitmap":
clipboard.Image = TestIcons.TestImage;
Assert.AreEqual(null, clipboard.Text);
Assert.AreEqual(null, clipboard.Html);
Assert.IsNotNull(clipboard.Image);
Assert.IsInstanceOf<Bitmap>(clipboard.Image);
Assert.AreEqual(null, clipboard.GetString("eto-woot"));
Assert.AreEqual(null, clipboard.GetData("eto-byte-data"));
break;
case "String":
clipboard.SetString("Some string value", "eto-woot");
Assert.AreEqual(null, clipboard.Text);
Assert.AreEqual(null, clipboard.Html);
Assert.AreEqual(null, clipboard.Image);
Assert.AreEqual("Some string value", clipboard.GetString("eto-woot"));
Assert.AreEqual(null, clipboard.GetData("eto-byte-data"));
Assert.Contains("eto-woot", clipboard.Types);
break;
case "Data":
clipboard.SetData(byteData, "eto-byte-data");
Assert.Contains("eto-byte-data", clipboard.Types);
Assert.AreEqual(null, clipboard.Text);
Assert.AreEqual(null, clipboard.Html);
Assert.AreEqual(null, clipboard.Image);
Assert.AreEqual(null, clipboard.GetString("eto-woot"));
Assert.AreEqual(byteData, clipboard.GetData("eto-byte-data"));
break;
}
}

using (var clipboard = new Clipboard())
{
switch (property)
{
case "Text":
Assert.AreEqual("Some Text", clipboard.Text);
Assert.AreEqual(null, clipboard.Html);
Assert.AreEqual(null, clipboard.Image);
Assert.AreEqual(null, clipboard.GetString("eto-woot"));
Assert.AreEqual(null, clipboard.GetData("eto-byte-data"));
break;
case "Html":
Assert.AreEqual(null, clipboard.Text);
Assert.AreEqual("<strong>Some Html</strong>", clipboard.Html);
Assert.AreEqual(null, clipboard.Image);
Assert.AreEqual(null, clipboard.GetString("eto-woot"));
Assert.AreEqual(null, clipboard.GetData("eto-byte-data"));
break;
case "Image-Icon":
Assert.AreEqual(null, clipboard.Text);
Assert.AreEqual(null, clipboard.Html);
Assert.IsNotNull(clipboard.Image);
Assert.IsInstanceOf<Icon>(clipboard.Image);
Assert.AreEqual(null, clipboard.GetString("eto-woot"));
Assert.AreEqual(null, clipboard.GetData("eto-byte-data"));
break;
case "Image-Bitmap":
Assert.AreEqual(null, clipboard.Text);
Assert.AreEqual(null, clipboard.Html);
Assert.IsNotNull(clipboard.Image);
Assert.IsInstanceOf<Bitmap>(clipboard.Image);
Assert.AreEqual(null, clipboard.GetString("eto-woot"));
Assert.AreEqual(null, clipboard.GetData("eto-byte-data"));
break;
case "String":
Assert.AreEqual(null, clipboard.Text);
Assert.AreEqual(null, clipboard.Html);
Assert.AreEqual(null, clipboard.Image);
Assert.AreEqual("Some string value", clipboard.GetString("eto-woot"));
Assert.AreEqual(null, clipboard.GetData("eto-byte-data"));
Assert.Contains("eto-woot", clipboard.Types);
break;
case "Data":
Assert.Contains("eto-byte-data", clipboard.Types);
Assert.AreEqual(null, clipboard.Text);
Assert.AreEqual(null, clipboard.Html);
Assert.AreEqual(null, clipboard.Image);
Assert.AreEqual(null, clipboard.GetString("eto-woot"));
Assert.AreEqual(byteData, clipboard.GetData("eto-byte-data"));
break;
}

}
});
}
}
}
3 changes: 2 additions & 1 deletion Source/Eto.Wpf/Forms/ClipboardHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,11 +127,12 @@ public Image Image
get { return Retry(() => sw.Clipboard.ContainsImage() ? new Bitmap(new BitmapHandler(sw.Clipboard.GetImage())) : null); }
set
{
var dib = (value as Bitmap).ToDIB();
var dib = (value as Bitmap)?.ToDIB();
if (dib != null)
{
// write a DIB here, so we can preserve transparency of the image
Control.SetData(sw.DataFormats.Dib, dib);
Update();
return;
}

Expand Down

0 comments on commit 0062802

Please sign in to comment.