Component.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. //
  2. // System.ComponentModel.Component.cs
  3. //
  4. // Author:
  5. // Miguel de Icaza ([email protected])
  6. // Andreas Nahr ([email protected])
  7. //
  8. // (C) Ximian, Inc. http://www.ximian.com
  9. // (C) 2003 Andreas Nahr
  10. //
  11. using System;
  12. using System.ComponentModel;
  13. namespace System.ComponentModel {
  14. // <summary>
  15. // Component class.
  16. // </summary>
  17. //
  18. // <remarks>
  19. // Longer description
  20. // </remarks>
  21. [DesignerCategory ("Component")]
  22. public class Component : MarshalByRefObject, IComponent, IDisposable
  23. {
  24. private EventHandlerList event_handlers;
  25. private ISite mySite;
  26. private object disposedEvent = new object ();
  27. // <summary>
  28. // Component Constructor
  29. // </summary>
  30. public Component ()
  31. {
  32. event_handlers = null;
  33. }
  34. // <summary>
  35. // Get IContainer of this Component
  36. // </summary>
  37. [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  38. public IContainer Container {
  39. get {
  40. if (mySite == null)
  41. return null;
  42. return mySite.Container;
  43. }
  44. }
  45. [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  46. protected bool DesignMode {
  47. get {
  48. if (mySite == null)
  49. return false;
  50. return mySite.DesignMode;
  51. }
  52. }
  53. protected EventHandlerList Events {
  54. get {
  55. // Note: space vs. time tradeoff
  56. // We create the object here if it's never be accessed before. This potentially
  57. // saves space. However, we must check each time the propery is accessed to
  58. // determine whether we need to create the object, which increases overhead.
  59. // We could put the creation in the contructor, but that would waste space
  60. // if it were never used. However, accessing this property would be faster.
  61. if (null == event_handlers)
  62. event_handlers = new EventHandlerList();
  63. return event_handlers;
  64. }
  65. }
  66. [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  67. public virtual ISite Site {
  68. get { return mySite; }
  69. set { mySite = value; }
  70. }
  71. ~Component()
  72. {
  73. Dispose (false);
  74. }
  75. // <summary>
  76. // Dispose resources used by this component
  77. // </summary>
  78. public void Dispose ()
  79. {
  80. Dispose (true);
  81. GC.SuppressFinalize (this);
  82. }
  83. // <summary>
  84. // Controls disposal of resources used by this.
  85. // </summary>
  86. //
  87. // <param name="release_all"> Controls which resources are released</param>
  88. //
  89. // <remarks>
  90. // if release_all is set to true, both managed and unmanaged
  91. // resources should be released. If release_all is set to false,
  92. // only unmanaged resources should be disposed
  93. // </remarks>
  94. protected virtual void Dispose (bool release_all)
  95. {
  96. if (release_all) {
  97. EventHandler eh = (EventHandler) Events [disposedEvent];
  98. if (eh != null)
  99. eh (this, EventArgs.Empty);
  100. }
  101. mySite = null;
  102. }
  103. // <summary>
  104. // Implements the IServiceProvider interface
  105. // </summary>
  106. [MonoTODO]
  107. protected virtual object GetService (Type service)
  108. {
  109. // FIXME: Not sure what this should do.
  110. return null;
  111. }
  112. public override string ToString ()
  113. {
  114. if (mySite == null)
  115. return GetType ().ToString ();
  116. return String.Format ("{0} [{1}]", mySite.Name, GetType ().ToString ());
  117. }
  118. // <summary>
  119. // This event is called when the component is explicitly disposed.
  120. // </summary>
  121. [Browsable (false), EditorBrowsable (EditorBrowsableState.Advanced)]
  122. public event EventHandler Disposed {
  123. add { Events.AddHandler (disposedEvent, value); }
  124. remove { Events.RemoveHandler (disposedEvent, value); }
  125. }
  126. }
  127. }