2007-04-17 Everaldo Canuto <everaldo@simios.org>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / DataFormats.cs
index 75da261d96ec4c6be910a65a9693db2847cf68c3..4a91ed0295ab955c2c7b9f6eeba52b6538869e58 100644 (file)
@@ -32,25 +32,31 @@ using System.Text;
 
 namespace System.Windows.Forms {
        public class DataFormats {
-               #region DataFormats.Format Subclass
                public class Format {
-                       #region Local Variables
-                       private string  name;
-                       private int     id;
-                       private Format  next;
-                       #endregion Local Variables
-
-                       #region Public Constructors
-                       public Format(string name, int ID) {
+                       static readonly object lockobj = new object ();
+                       
+                       private static Format   formats;
+                       private string          name;
+                       private int             id;
+                       private Format          next;
+
+                       public Format (string name, int ID)
+                       {
                                this.name = name;
                                this.id = ID;
+                               
+                               lock (lockobj) {
+                                       if (formats == null)
+                                               formats = this;
+                                       else {
+                                               Format f = formats;
+                                               while (f.next != null)
+                                                       f = f.next;
+                                               f.next = this;
+                                       }
+                               }
                        }
 
-                       internal Format(string name, int ID, Format after) : this(name, ID) {
-                               after.next = this;
-                       }
-                       #endregion      // Public Constructors
-
                        #region Public Instance Properties
                        public int Id {
                                get {
@@ -63,37 +69,70 @@ namespace System.Windows.Forms {
                                        return this.name;
                                }
                        }
+
+                       internal Format Next {
+                               get {
+                                       return this.next;
+                               }
+                       }
                        #endregion      // Public Instance Properties
 
                        #region Private Methods
-                       internal static Format Find(Format f, int id) {
+                       internal static Format Add(string name) {
+                               Format f;
+
+                               f = Find(name);
+                               if (f == null) {
+                                       IntPtr cliphandle;
+
+                                       cliphandle = XplatUI.ClipboardOpen(false);
+                                       f = new Format(name, XplatUI.ClipboardGetID(cliphandle, name));
+                                       XplatUI.ClipboardClose(cliphandle);
+                               }
+                               return f;
+                       }
+
+                       internal static Format Add(int id) {
+                               Format f;
+
+                               f = Find(id);
+                               if (f == null) {
+                                       f = new Format("Format"+id.ToString(), id);
+                               }
+                               return f;
+                       }
+
+                       internal static Format Find(int id) {
+                               Format f;
+
+                               f = formats;
                                while ((f != null) && (f.Id != id)) {
                                        f = f.next;
                                }
                                return f;
                        }
 
-                       internal static Format Find(Format f, string name) {
+                       internal static Format Find(string name) {
+                               Format f;
+
+                               f = formats;
                                while ((f != null) && (!f.Name.Equals(name))) {
                                        f = f.next;
                                }
                                return f;
                        }
-                       #endregion      // Private Methods
 
-               }
-               #endregion      // DataFormats.Format Subclass
-
-               #region Local Variables
-               private static bool     initialized = false;
-               private static Format   formats;
-               #endregion      // Local Variables
+                       internal static Format List {
+                               get {
+                                       return formats;
+                               }
+                       }
+                       #endregion      // Private Methods
 
-               #region Constructors
-               private DataFormats() {
                }
-               #endregion      // Constructors
-
+               
+               private DataFormats () {}
+               
                #region Public Static Fields
                public static readonly string Bitmap                    = "Bitmap";
                public static readonly string CommaSeparatedValue       = "Csv";
@@ -118,61 +157,59 @@ namespace System.Windows.Forms {
                public static readonly string WaveAudio                 = "WaveAudio";
                #endregion      // Public Static Fields
 
-               #region Public Static Methods
-               public static Format GetFormat(int ID) {
-                       if (!initialized) {
-                               Initialize();
-                       }
+               private static object lock_object = new object ();
+               private static bool initialized;
 
-                       return Format.Find(formats, ID);
+               public static Format GetFormat (int ID)
+               {
+                       lock (lock_object) {
+                               if (!initialized)
+                                       Init ();
+                               return Format.Find (ID);
+                       }
                }
 
-               public static Format GetFormat(string format) {
-                       if (!initialized) {
-                               Initialize();
+               public static Format GetFormat (string format)
+               {
+                       lock (lock_object) {
+                               if (!initialized)
+                                       Init ();
+                               return Format.Add (format);
                        }
-
-                       return Format.Find(formats, format);
                }
-               #endregion      // Public Static Methods
-
-               #region Private Methods
-               private static void Initialize() {
-                       lock (typeof(DataFormats.Format)) {
-                               if (!initialized) {
-                                       Format  f;
-                                       IntPtr  cliphandle;
-
-                                       cliphandle = XplatUI.ClipboardOpen();
-                                       formats = new DataFormats.Format(Text, 1);
-                                       f = new Format(Bitmap, 2, formats);
-                                       f = new Format(MetafilePict, 3, f);
-                                       f = new Format(SymbolicLink, 4, f);
-                                       f = new Format(Dif, 5, f);
-                                       f = new Format(Tiff, 6, f);
-                                       f = new Format(OemText, 7, f);
-                                       f = new Format(Dib, 8, f);
-                                       f = new Format(Palette, 9, f);
-                                       f = new Format(PenData, 10, f);
-                                       f = new Format(Riff, 11, f);
-                                       f = new Format(WaveAudio, 12, f);
-                                       f = new Format(UnicodeText, 13, f);
-                                       f = new Format(EnhancedMetafile, 14, f);
-                                       f = new Format(FileDrop, 15, f);
-                                       f = new Format(Locale, 16, f);
-
-                                       f = new Format(CommaSeparatedValue, XplatUI.ClipboardGetID(cliphandle, CommaSeparatedValue), f);
-                                       f = new Format(Html, XplatUI.ClipboardGetID(cliphandle, Html), f);
-                                       f = new Format(Rtf, XplatUI.ClipboardGetID(cliphandle, Rtf), f);
-                                       f = new Format(Serializable, XplatUI.ClipboardGetID(cliphandle, Serializable), f);
-                                       f = new Format(StringFormat, XplatUI.ClipboardGetID(cliphandle, StringFormat), f);
 
-                                       XplatUI.ClipboardClose(cliphandle);
-                                       
-                               }
-                               initialized = true;
-                       }
+               // Assumes we are locked on the lock_object when it is called
+               private static void Init ()
+               {
+                       if (initialized)
+                               return;
+                       IntPtr cliphandle = XplatUI.ClipboardOpen(false);
+
+                       new Format (Text, XplatUI.ClipboardGetID (cliphandle, Text));
+                       new Format (Bitmap, XplatUI.ClipboardGetID (cliphandle, Bitmap));
+                       new Format (MetafilePict, XplatUI.ClipboardGetID (cliphandle, MetafilePict));
+                       new Format (SymbolicLink, XplatUI.ClipboardGetID (cliphandle, SymbolicLink));
+                       new Format (Dif, XplatUI.ClipboardGetID (cliphandle, Dif)) ;
+                       new Format (Tiff, XplatUI.ClipboardGetID (cliphandle, Tiff));
+                       new Format (OemText, XplatUI.ClipboardGetID (cliphandle, OemText));
+                       new Format (Dib, XplatUI.ClipboardGetID (cliphandle, Dib));
+                       new Format (Palette, XplatUI.ClipboardGetID (cliphandle, Palette));
+                       new Format (PenData, XplatUI.ClipboardGetID (cliphandle, PenData));
+                       new Format (Riff, XplatUI.ClipboardGetID (cliphandle, Riff));
+                       new Format (WaveAudio, XplatUI.ClipboardGetID (cliphandle, WaveAudio));
+                       new Format (UnicodeText, XplatUI.ClipboardGetID (cliphandle, UnicodeText));
+                       new Format (EnhancedMetafile, XplatUI.ClipboardGetID (cliphandle, EnhancedMetafile));
+                       new Format (FileDrop, XplatUI.ClipboardGetID (cliphandle, FileDrop));
+                       new Format (Locale, XplatUI.ClipboardGetID (cliphandle, Locale));
+                       new Format (CommaSeparatedValue, XplatUI.ClipboardGetID (cliphandle, CommaSeparatedValue));
+                       new Format (Html, XplatUI.ClipboardGetID (cliphandle, Html));
+                       new Format (Rtf, XplatUI.ClipboardGetID (cliphandle, Rtf));
+                       new Format (Serializable, XplatUI.ClipboardGetID (cliphandle, Serializable));
+                       new Format (StringFormat, XplatUI.ClipboardGetID (cliphandle, StringFormat));
+
+                       XplatUI.ClipboardClose (cliphandle);
+
+                       initialized = true;
                }
-               #endregion      // Private Methods
        }
 }