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 {
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";
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
}
}