// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
// Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
//
// Authors:
// Peter Bartok (pbartok@novell.com)
//
//
// COMPLETE
using System;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
namespace System.Windows.Forms {
public sealed class Clipboard {
#region Local Variables
#endregion // Local Variables
#region Constructors
private Clipboard() {
}
#endregion // Constructors
#region Private Methods
private static bool ConvertToClipboardData(ref int type, object obj, out byte[] data) {
data = null;
return false;
}
private static bool ConvertFromClipboardData(int type, IntPtr data, out object obj) {
obj = null;
if (data == IntPtr.Zero) {
return false;
}
return false;
}
#endregion // Private Methods
#region Public Static Methods
public static IDataObject GetDataObject() {
DataObject clipboard;
IntPtr clipboard_handle;
int[] native_formats;
DataFormats.Format item_format;
object managed_clipboard_item;
XplatUI.ClipboardToObject converter;
converter = new XplatUI.ClipboardToObject(ConvertFromClipboardData);
clipboard_handle = XplatUI.ClipboardOpen();
native_formats = XplatUI.ClipboardAvailableFormats(clipboard_handle);
if (native_formats == null) {
return null; // Clipboard empty
}
// Build the IDataObject
clipboard = new DataObject();
for (int i = 0; i < native_formats.Length; i++) {
// We might get a format we don't understand or know
item_format = DataFormats.GetFormat(native_formats[i]);
if (item_format != null) {
managed_clipboard_item = XplatUI.ClipboardRetrieve(clipboard_handle, native_formats[i], converter);
if (managed_clipboard_item != null) {
clipboard.SetData(item_format.Name, managed_clipboard_item);
// We don't handle 'bitmap' since it involves handles, so we'll equate it to dib
if (item_format.Name == DataFormats.Dib) {
clipboard.SetData(DataFormats.Bitmap, managed_clipboard_item);
}
}
}
}
XplatUI.ClipboardClose(clipboard_handle);
return clipboard;
}
public static void SetDataObject(object data) {
SetDataObject(data, true);
}
public static void SetDataObject(object data, bool copy) {
IntPtr clipboard_handle;
XplatUI.ObjectToClipboard converter;
int native_format;
DataFormats.Format item_format;
converter = new XplatUI.ObjectToClipboard(ConvertToClipboardData);
clipboard_handle = XplatUI.ClipboardOpen();
XplatUI.ClipboardStore(clipboard_handle, null, 0, null); // Empty clipboard
native_format = -1;
if (data is IDataObject) {
string[] formats;
formats = ((IDataObject)data).GetFormats();
for (int i = 0; i < formats.Length; i++) {
item_format = DataFormats.GetFormat(formats[i]);
if ((item_format != null) && (item_format.Name != DataFormats.StringFormat)) {
native_format = item_format.Id;
}
XplatUI.ClipboardStore(clipboard_handle, ((IDataObject)data).GetData(formats[i]), native_format, converter);
}
} else {
item_format = DataFormats.Format.Find(data.GetType().FullName);
if ((item_format != null) && (item_format.Name != DataFormats.StringFormat)) {
native_format = item_format.Id;
}
XplatUI.ClipboardStore(clipboard_handle, data, native_format, converter);
}
XplatUI.ClipboardClose(clipboard_handle);
}
#endregion // Public Static Methods
}
}