2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System / System.ComponentModel / Component.cs
index dea77cd9ad34b46f1d1e2e7bde11f88bce2041d1..e370a6aa6834ae328c4237904f1ffb104f5e3012 100644 (file)
@@ -2,46 +2,66 @@
 // System.ComponentModel.Component.cs
 //
 // Author:
-//   Miguel de Icaza (miguel@ximian.com)
+//  Miguel de Icaza (miguel@ximian.com)
+//  Andreas Nahr (ClassDevelopment@A-SoftTech.com)
 //
 // (C) Ximian, Inc.  http://www.ximian.com
+// (C) 2003 Andreas Nahr
+//
+
+//
+// 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.
 //
 
 using System;
+using System.ComponentModel;
 
 namespace System.ComponentModel {
 
-       // <summary>
-       //   Component class.
-       // </summary>
-       //
-       // <remarks>
-       //   Longer description
-       // </remarks>
-       public class Component : MarshalByRefObject, IComponent, IDisposable {
+       [DesignerCategory ("Component")]
+       public class Component : MarshalByRefObject, IComponent, IDisposable
+       {
 
-               EventHandlerList event_handlers;
-               ISite            mySite;
+               private EventHandlerList event_handlers;
+               private ISite mySite;
+               private object disposedEvent = new object ();
 
-               // <summary>
-               //   Component Constructor
-               // </summary>
                public Component ()
                {
                        event_handlers = null;
                }
 
-               // <summary>
-               //   Get IContainer of this Component
-               // </summary>
+               [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public IContainer Container {
                        get {
+                               if (mySite == null)
+                                       return null;
                                return mySite.Container;
                        }
                }
 
+               [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                protected bool DesignMode {
                        get {
+                               if (mySite == null)
+                                       return false;
                                return mySite.DesignMode;
                        }
                }
@@ -54,41 +74,28 @@ namespace System.ComponentModel {
                                // determine whether we need to create the object, which increases overhead.
                                // We could put the creation in the contructor, but that would waste space
                                // if it were never used.  However, accessing this property would be faster.
-                               if (null == event_handlers)\r
-                               {
+                               if (null == event_handlers)
                                        event_handlers = new EventHandlerList();
-                               }
+
                                return event_handlers;
                        }
                }
 
+               [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public virtual ISite Site {
-                       get {
-                               return mySite;
-                       }
-
-                       set {
-                               mySite = value;
-                       }
+                       get { return mySite; }
+                       set { mySite = value; }
                }
 
-               [MonoTODO]
                ~Component()
                {
-                       // FIXME: Not sure this is correct.
-                       Dispose(true);
+                       Dispose (false);
                }
 
-               // <summary>
-               //   Dispose resources used by this component
-               // </summary>
-               [MonoTODO]
-               public virtual void Dispose ()
+               public void Dispose ()
                {
-                       // FIXME: Not sure this is correct.
-                       Dispose(false);
-                       if (Disposed != null)
-                               Disposed(this, EventArgs.Empty);
+                       Dispose (true);
+                       GC.SuppressFinalize (this);
                }
 
                // <summary>
@@ -104,23 +111,34 @@ namespace System.ComponentModel {
                // </remarks>
                protected virtual void Dispose (bool release_all)
                {
+                       if (release_all) {
+                               EventHandler eh = (EventHandler) Events [disposedEvent];
+                               if (eh != null)
+                                       eh (this, EventArgs.Empty);
+                       }
+                       mySite = null;
                }
 
-               // <summary>
-               //   Implements the IServiceProvider interface
-               // </summary>
-               [MonoTODO]
                protected virtual object GetService (Type service)
                {
-                       // FIXME: Not sure what this should do.
-                       return null;
+                       if (mySite != null) {
+                               return mySite.GetService(service); 
+                       }
+                       return null; 
                }
 
-               // <summary>
-               //   FIXME: Figure out this one.
-               // </summary>
-               [MonoTODO ("Figure this out")]
-               public event EventHandler Disposed;
+               public override string ToString ()
+               {
+                       if (mySite == null)
+                               return GetType ().ToString ();
+                       return String.Format ("{0} [{1}]", mySite.Name, GetType ().ToString ());
+               }
+
+               [Browsable (false), EditorBrowsable (EditorBrowsableState.Advanced)]
+               public event EventHandler Disposed {
+                       add { Events.AddHandler (disposedEvent, value); }
+                       remove { Events.RemoveHandler (disposedEvent, value); }
+               }
        }
        
 }