1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
23 // Peter Bartok (pbartok@novell.com)
32 using System.Collections;
33 using System.Collections.Specialized;
34 using System.ComponentModel;
35 using System.Runtime.InteropServices;
37 namespace System.Windows.Forms {
38 [ClassInterface(ClassInterfaceType.None)]
39 public class DataObject : IDataObject {
40 #region DataObject.Entry Class
42 #region Local Variables
45 //private bool autoconvert;
47 #endregion // Local Variables
50 internal Entry(string type, object data, bool autoconvert) {
53 //this.autoconvert = autoconvert;
55 #endregion // Constructors
67 #endregion // Properties
70 public static int Count(Entry entries) {
75 while (entries != null) {
77 entries = entries.next;
83 public static Entry Find(Entry entries, string type) {
84 while (entries != null) {
85 if (entries.type.Equals(type)) {
88 entries = entries.next;
94 public static Entry FindConvertible(Entry entries, string type) {
97 e = Find(entries, type);
104 if (type == DataFormats.Text) {
105 if (e.type == DataFormats.UnicodeText) {
108 } else if (type == DataFormats.UnicodeText) {
109 if (e.type == DataFormats.Text) {
112 } else if (type == DataFormats.StringFormat) {
113 if (e.type == DataFormats.Text) {
115 } else if (e.type == DataFormats.UnicodeText) {
125 public static string[] Entries(Entry entries, bool convertible) {
130 // Initially store into something that we can grow easily
131 list = new ArrayList(Entry.Count(entries));
140 // Add the convertibles
141 if ((Entry.Find(entries, DataFormats.Text) != null) && (Entry.Find(entries, DataFormats.UnicodeText) == null)) {
142 list.Add(DataFormats.UnicodeText);
145 if ((Entry.Find(entries, DataFormats.Text) == null) && (Entry.Find(entries, DataFormats.UnicodeText) != null)) {
146 list.Add(DataFormats.Text);
149 if (((Entry.Find(entries, DataFormats.Text) != null) || (Entry.Find(entries, DataFormats.UnicodeText) != null)) && (Entry.Find(entries, DataFormats.StringFormat) == null)) {
150 list.Add(DataFormats.StringFormat);
154 // Copy the results into a string array
155 result = new string[list.Count];
156 for (int i = 0; i < list.Count; i++) {
157 result[i] = (string)list[i];
162 #endregion // Methods
164 #endregion // DataObject.Entry class
166 #region Local Variables
167 private Entry entries;
168 #endregion // Local Variables
170 #region Public Constructors
171 public DataObject() {
175 public DataObject(object data) {
179 public DataObject(string format, object data) {
180 SetData(format, data);
182 #endregion // Public Constructors
184 #region Public Instance Methods
186 public virtual bool ContainsAudio ()
188 return GetDataPresent (DataFormats.WaveAudio, true);
191 public virtual bool ContainsFileDropList ()
193 return GetDataPresent (DataFormats.FileDrop, true);
196 public virtual bool ContainsImage ()
198 return GetDataPresent (DataFormats.Bitmap, true);
201 public virtual bool ContainsText ()
203 return GetDataPresent (DataFormats.UnicodeText, true);
206 public virtual bool ContainsText (TextDataFormat format)
208 if (!Enum.IsDefined (typeof (TextDataFormat), format))
209 throw new InvalidEnumArgumentException (string.Format ("Enum argument value '{0}' is not valid for TextDataFormat", format));
211 return GetDataPresent (TextFormatToDataFormat (format), true);
214 public virtual Stream GetAudioStream ()
216 return (Stream)GetData (DataFormats.WaveAudio, true);
220 public virtual object GetData(string format) {
221 return GetData(format, true);
224 public virtual object GetData(string format, bool autoConvert) {
227 e = Entry.FindConvertible(entries, format);
229 e = Entry.Find(entries, format);
236 public virtual object GetData(Type format) {
237 return GetData(format.FullName, true);
240 public virtual bool GetDataPresent(string format) {
241 return GetDataPresent(format, true);
244 public virtual bool GetDataPresent(string format, bool autoConvert) {
246 return Entry.FindConvertible(entries, format) != null;
248 return Entry.Find(entries, format) != null;
252 public virtual bool GetDataPresent(Type format) {
253 return GetDataPresent(format.FullName, true);
257 public virtual StringCollection GetFileDropList ()
259 return (StringCollection)GetData (DataFormats.FileDrop, true);
262 public virtual string[] GetFormats() {
263 return GetFormats(true);
266 public virtual string[] GetFormats(bool autoConvert) {
267 return Entry.Entries(entries, autoConvert);
271 public virtual Image GetImage ()
273 return (Image)GetData (DataFormats.Bitmap, true);
276 public virtual string GetText ()
278 return (string)GetData (DataFormats.UnicodeText, true);
281 public virtual string GetText (TextDataFormat format)
283 if (!Enum.IsDefined (typeof (TextDataFormat), format))
284 throw new InvalidEnumArgumentException (string.Format ("Enum argument value '{0}' is not valid for TextDataFormat", format));
286 return (string)GetData (TextFormatToDataFormat (format), false);
289 public virtual void SetAudio (byte[] audioBytes)
291 if (audioBytes == null)
292 throw new ArgumentNullException ("audioBytes");
294 MemoryStream ms = new MemoryStream (audioBytes);
299 public virtual void SetAudio (Stream audioStream)
301 if (audioStream == null)
302 throw new ArgumentNullException ("audioStream");
304 SetData (DataFormats.WaveAudio, audioStream);
308 public virtual void SetData(object data) {
309 SetData(data.GetType(), data);
312 public virtual void SetData(string format, bool autoConvert, object data) {
316 entry = Entry.Find(entries, format);
319 entry = new DataObject.Entry(format, data, autoConvert);
326 if (entries == null) {
329 // Insert into the list of known/defined formats
332 while (e.next != null) {
340 public virtual void SetData(string format, object data) {
341 SetData(format, true, data);
344 public virtual void SetData(Type format, object data) {
345 SetData(EnsureFormat(format), true, data);
349 [MonoInternalNote ("Needs additional checks for valid paths, see MSDN")]
350 public virtual void SetFileDropList (StringCollection filePaths)
352 if (filePaths == null)
353 throw new ArgumentNullException ("filePaths");
355 SetData (DataFormats.FileDrop, filePaths);
358 public virtual void SetImage (Image image)
361 throw new ArgumentNullException ("image");
363 SetData (DataFormats.Bitmap, image);
366 public virtual void SetText (string text)
368 if (string.IsNullOrEmpty (text))
369 throw new ArgumentNullException ("text");
371 SetData (DataFormats.UnicodeText, text);
374 public virtual void SetText (string text, TextDataFormat format)
376 if (string.IsNullOrEmpty (text))
377 throw new ArgumentNullException ("text");
378 if (!Enum.IsDefined (typeof (TextDataFormat), format))
379 throw new InvalidEnumArgumentException (string.Format ("Enum argument value '{0}' is not valid for TextDataFormat", format));
382 case TextDataFormat.Text:
383 SetData (DataFormats.Text, text);
385 case TextDataFormat.UnicodeText:
386 SetData (DataFormats.UnicodeText, text);
388 case TextDataFormat.Rtf:
389 SetData (DataFormats.Rtf, text);
391 case TextDataFormat.Html:
392 SetData (DataFormats.Html, text);
394 case TextDataFormat.CommaSeparatedValue:
395 SetData (DataFormats.CommaSeparatedValue, text);
400 #endregion // Public Instance Methods
402 #region Private Methods
403 internal string EnsureFormat(string name) {
404 DataFormats.Format f;
406 f = DataFormats.Format.Find(name);
408 // Register the format
409 f = DataFormats.Format.Add(name);
415 internal string EnsureFormat(Type type) {
416 return EnsureFormat(type.FullName);
420 private string TextFormatToDataFormat (TextDataFormat format)
423 case TextDataFormat.Text:
425 return DataFormats.Text;
426 case TextDataFormat.UnicodeText:
427 return DataFormats.UnicodeText;
428 case TextDataFormat.Rtf:
429 return DataFormats.Rtf;
430 case TextDataFormat.Html:
431 return DataFormats.Html;
432 case TextDataFormat.CommaSeparatedValue:
433 return DataFormats.CommaSeparatedValue;
437 #endregion // Private Methods