Merge pull request #1407 from chrisvire/bug-24587
[mono.git] / mcs / class / System.Design / System.Windows.Forms.Design / ControlDataObject.cs
1 using System;
2 using System.Windows.Forms;
3
4 namespace System.Windows.Forms.Design
5 {
6         // A IDataObject that supports Control and Control[] format
7         //
8         internal class ControlDataObject : IDataObject
9         {
10                 private object _data = null;
11                 private string _format = null;
12
13                 public ControlDataObject ()
14                 {
15                         _data = null;
16                         _format = null;
17                 }
18
19                 public ControlDataObject (Control control)
20                 {
21                         SetData (control);
22                 }
23
24                 public ControlDataObject (Control[] controls)
25                 {
26                         SetData (controls);
27                 }
28
29                 public object GetData (Type format)
30                 {
31                         return this.GetData (format.ToString ());
32                 }
33
34                 public object GetData (string format)
35                 {
36                         return this.GetData (format, true);
37                 }
38
39                 public object GetData (string format, bool autoConvert)
40                 {
41                         if (format == _format) {
42                                 return _data;
43                         }
44                         return null;
45                 }
46
47                 public bool GetDataPresent (Type format)
48                 {
49                         return this.GetDataPresent (format.ToString());
50                 }
51
52                 public bool GetDataPresent (string format)
53                 {
54                         return this.GetDataPresent (format, true);
55                 }
56
57                 public bool GetDataPresent (string format, bool autoConvert)
58                 {
59                         if (format == _format) {
60                                 return true;
61                         }
62                         return false;
63                 }
64
65                 public string[] GetFormats ()
66                 {
67                         return this.GetFormats (true);
68                 }
69
70                 public string[] GetFormats (bool autoConvert)
71                 {
72                         string[] formats = new string[2];
73                         formats[0] = typeof (Control).ToString ();
74                         formats[1] = typeof (Control[]).ToString ();
75                         return formats;
76                 }
77
78                 public void SetData (object data)
79                 {
80                         if (data is Control)
81                                 this.SetData (typeof (Control), data);
82                         else if (data is Control[])
83                                 this.SetData (typeof (Control[]), data);
84                 }
85
86                 public void SetData (Type format, object data)
87                 {
88                         this.SetData (format.ToString (), data);
89                 }
90
91                 public void SetData (string format, object data)
92                 {
93                         this.SetData (format, true, data);
94                 }
95
96                 public void SetData (string format, bool autoConvert, object data)
97                 {
98                         if (ValidateFormat (format)) {
99                                 _data = data;
100                                 _format = format;
101                         }
102                 }
103
104                 private bool ValidateFormat (string format)
105                 {
106                         bool valid = false;
107
108                         string[] formats = GetFormats ();
109                         foreach (string f in formats) {
110                                 if (f == format) {
111                                         valid = true;
112                                         break;
113                                 }
114                         }
115
116                         return valid;
117                 }
118         }
119 }
120