dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dotgnu-pnet-commits] pnetlib ./ChangeLog System.Windows.Forms/Contro...


From: Heiko Weiss
Subject: [dotgnu-pnet-commits] pnetlib ./ChangeLog System.Windows.Forms/Contro...
Date: Thu, 06 Apr 2006 10:06:16 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    pnetlib
Branch:         
Changes by:     Heiko Weiss <address@hidden>    06/04/06 10:06:16

Modified files:
        .              : ChangeLog 
        System.Windows.Forms: Control.cs ControlBindingsCollection.cs 
                              ControlToolkitMgr.cs Form.cs MainMenu.cs 
                              ScrollableControl.cs TextBox.cs 
                              TextBoxBase.cs 

Log message:
        fixed some memory leaks by keeping references.
        Now a weak reference of a control is given for the toolkit
        and not the control itself.
        This avoids keeping a reference of the control in
        toolkit.
        Still some memory leaks are in pnetlib.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnetlib/ChangeLog.diff?tr1=1.2378&tr2=1.2379&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnetlib/System.Windows.Forms/Control.cs.diff?tr1=1.118&tr2=1.119&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnetlib/System.Windows.Forms/ControlBindingsCollection.cs.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnetlib/System.Windows.Forms/ControlToolkitMgr.cs.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnetlib/System.Windows.Forms/Form.cs.diff?tr1=1.51&tr2=1.52&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnetlib/System.Windows.Forms/MainMenu.cs.diff?tr1=1.9&tr2=1.10&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnetlib/System.Windows.Forms/ScrollableControl.cs.diff?tr1=1.13&tr2=1.14&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnetlib/System.Windows.Forms/TextBox.cs.diff?tr1=1.51&tr2=1.52&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnetlib/System.Windows.Forms/TextBoxBase.cs.diff?tr1=1.17&tr2=1.18&r1=text&r2=text

Patches:
Index: pnetlib/ChangeLog
diff -u pnetlib/ChangeLog:1.2378 pnetlib/ChangeLog:1.2379
--- pnetlib/ChangeLog:1.2378    Mon Apr  3 07:55:15 2006
+++ pnetlib/ChangeLog   Thu Apr  6 10:06:16 2006
@@ -1,3 +1,18 @@
+2006-04-06  Heiko Weiss  <address@hidden>
+
+       * System.Windows.Forms/Control.cs,
+       System.Windows.Forms/ControlBindingsCollection.cs,
+       System.Windows.Forms/ControlToolkitMgr.cs,
+       System.Windows.Forms/Form.cs,
+       System.Windows.Forms/MainMenu.cs,
+       System.Windows.Forms/ScrollableControl.cs,
+       System.Windows.Forms/TextBox.cs,
+       System.Windows.Forms/TextBoxBase.cs: fixed some memory leaks by keeping 
references. 
+       Now a weak reference of a control is given for the toolkit 
+       and not the control itself. This avoids keeping a reference of the 
control in
+       toolkit.
+       Still some memory leaks are in pnetlib.
+
 2006-04-03  Heiko Weiss  <address@hidden>
 
        * System.Windows.Forms/Control.cs: fixed some layouting issues. Do 
layout in PerformLayout, if control visible, even if parent not visible.
Index: pnetlib/System.Windows.Forms/Control.cs
diff -u pnetlib/System.Windows.Forms/Control.cs:1.118 
pnetlib/System.Windows.Forms/Control.cs:1.119
--- pnetlib/System.Windows.Forms/Control.cs:1.118       Mon Apr  3 07:55:16 2006
+++ pnetlib/System.Windows.Forms/Control.cs     Thu Apr  6 10:06:16 2006
@@ -961,6 +961,9 @@
                        {
                                get
                                {
+                                       if( null == controlBindingsCollection ) 
{
+                                               controlBindingsCollection = new 
ControlBindingsCollection(this);
+                                       }
                                        return controlBindingsCollection;
                                }
                        }
@@ -2244,16 +2247,37 @@
                                                
                                                // Dispose all childs
                                                if( null != controlCollection ) 
{
-                                                       Control o;
-                                                       int iCount = 
controlCollection.Count;
-                                                       for( int i = 0; i < 
iCount; i++ ) {
-                                                               o = 
controlCollection[i];
-                                                               o.parent = null;
-                                                               o.Dispose();
-                                                               o = null;
+                                                       try {
+                                                               Control o;
+                                                               int iCount = 
controlCollection.Count;
+                                                               for( int i = 0; 
i < iCount; i++ ) {
+                                                                       o = 
controlCollection[i];
+                                                                       
o.parent = null;
+                                                                       
o.Dispose();
+                                                                       o = 
null;
+                                                               }
+                                                       }
+                                                       catch( Exception ) {
+                                                               // ignore 
exceptions
                                                        }
                                                        controlCollection = 
null;
                                                }
+                                               
+                                               if( null != children ) {
+                                                       for(int i = 0; i < 
children.Length; i++ )
+                                                       {
+                                                               children[i] = 
null;
+                                                       }
+                                               }
+                                               numChildren = 0;
+                                               children = null;
+                                               
+                                               if( null != hoverTimer ) {
+                                                       hoverTimer.Enabled = 
false;
+                                                       hoverTimer.Tick -= new 
EventHandler(this.ProcessHoverTimerEvent);
+                                                       hoverTimer.Dispose();
+                                                       hoverTimer = null;
+                                               }
                                        }
                                        finally
                                        {
@@ -2265,7 +2289,7 @@
                                        SetControlFlag(ControlFlags.Disposing, 
false);
                                }
 #if CONFIG_COMPONENT_MODEL
-                               // not needed in this implementation 
base.Dispose(disposing);
+                               base.Dispose(disposing);
 #endif
                        }
 
@@ -4982,6 +5006,7 @@
 #endif
        protected virtual void OnMouseDown(MouseEventArgs e)
                        {
+                               if( null == hoverTimer ) return; // we are 
disposed
                                hoverTimer.Enabled = false;
                                hoverTimer.Stop();
 
@@ -5001,6 +5026,7 @@
 #endif
        protected virtual void OnMouseEnter(EventArgs e)
                        {
+                               if( null == hoverTimer ) return; // we are 
disposed
                                hoverTimer.Enabled = true;
                                hoverTimer.Start();
 
@@ -5016,6 +5042,7 @@
 #endif
        protected virtual void OnMouseHover(EventArgs e)
                        {
+                               if( null == hoverTimer ) return; // we are 
disposed
                                hoverTimer.Stop();
 
                                EventHandler handler;
@@ -5030,6 +5057,7 @@
 #endif
        protected virtual void OnMouseLeave(EventArgs e)
                        {
+                               if( null == hoverTimer ) return; // we are 
disposed
                                hoverTimer.Enabled = false;
                                hoverTimer.Stop();
 
@@ -5057,6 +5085,7 @@
 #endif
        protected virtual void OnMouseUp(MouseEventArgs e)
                        {
+                               if( null == hoverTimer ) return; // we are 
disposed
                                hoverTimer.Enabled = false;
                                hoverTimer.Stop();
 
@@ -5076,6 +5105,7 @@
 #endif
        protected virtual void OnMouseWheel(MouseEventArgs e)
                        {
+                               if( null == hoverTimer ) return; // we are 
disposed
                                hoverTimer.Enabled = false;
                                hoverTimer.Stop();
 
@@ -5533,12 +5563,14 @@
        {
                // Internal state.
                private Control owner;
+               bool bDisposeRemove = false;
 
                // Constructor.
                public ControlCollection(Control owner)
                                {
                                        this.owner = owner;
                                }
+                               
 
                // Get the control at a specific index.
                public virtual Control this[int index]
@@ -5616,6 +5648,7 @@
                                                owner.ResumeLayout();
                                        }
                                }
+                               
                bool IList.Contains(Object value)
                                {
                                        if(value is Control)
@@ -5770,6 +5803,8 @@
                // Remove a specific control from the collection.
                public virtual void Remove(Control value)
                                {
+                                       if( this.bDisposeRemove ) return;
+                                       
                                        if(value != null && value.Parent == 
owner)
                                        {
                                                // Update the parent.
Index: pnetlib/System.Windows.Forms/ControlBindingsCollection.cs
diff -u pnetlib/System.Windows.Forms/ControlBindingsCollection.cs:1.3 
pnetlib/System.Windows.Forms/ControlBindingsCollection.cs:1.4
--- pnetlib/System.Windows.Forms/ControlBindingsCollection.cs:1.3       Tue Jun 
29 14:43:40 2004
+++ pnetlib/System.Windows.Forms/ControlBindingsCollection.cs   Thu Apr  6 
10:06:16 2006
@@ -76,6 +76,10 @@
        
        protected override void ClearCore()
                        {
+                               int iCount = this.Count;
+                               for( int i = 0; i < iCount; i++ ) {
+                                       base[i].AssociateControl(null);
+                               }
                                base.ClearCore();
                        }
 
@@ -91,6 +95,7 @@
 
        protected override void RemoveCore(Binding dataBinding)
                        {
+                               dataBinding.AssociateControl(null);
                                base.RemoveCore(dataBinding);
                        }
 
Index: pnetlib/System.Windows.Forms/ControlToolkitMgr.cs
diff -u pnetlib/System.Windows.Forms/ControlToolkitMgr.cs:1.1 
pnetlib/System.Windows.Forms/ControlToolkitMgr.cs:1.2
--- pnetlib/System.Windows.Forms/ControlToolkitMgr.cs:1.1       Mon Mar 27 
14:03:55 2006
+++ pnetlib/System.Windows.Forms/ControlToolkitMgr.cs   Thu Apr  6 10:06:16 2006
@@ -21,6 +21,7 @@
 
 using System;
 using System.Threading;
+using System.Drawing;
 using System.Drawing.Toolkit;
 
 /*
@@ -59,13 +60,13 @@
                if(parent != null )
                {
                        return parent.Toolkit.CreateChildWindow
-                                       (parent, x, y, w, h, control);
+                                       (parent, x, y, w, h, new 
ControlWeakRef(control) );
                }
                else
                {
                        // Use the default toolkit to create.
                        return ToolkitManager.Toolkit.CreateChildWindow
-                                       (null, x, y, w, h, control);
+                                       (null, x, y, w, h, new 
ControlWeakRef(control) );
                }
        }
        
@@ -84,7 +85,7 @@
                        new object[] { control, w, h } );
                }
                
-               return ToolkitManager.Toolkit.CreateTopLevelWindow( w, h, 
control );
+               return ToolkitManager.Toolkit.CreateTopLevelWindow( w, h, new 
ControlWeakRef(control) );
        }
        
        #endregion 
@@ -103,7 +104,7 @@
                                );
                }
                
-               return mdiClient.CreateChildWindow(x,y,w,h, control);
+               return mdiClient.CreateChildWindow(x,y,w,h, new 
ControlWeakRef(control) );
        }
        
        #endregion
@@ -123,10 +124,10 @@
                }
                
                if( null != parent ) {
-                       return parent.Toolkit.CreateMdiClient( parent, x, y, w, 
h, control );
+                       return parent.Toolkit.CreateMdiClient( parent, x, y, w, 
h, new ControlWeakRef(control) );
                }
                else {
-                       return ToolkitManager.Toolkit.CreateMdiClient(null, x, 
y, w, h, control);
+                       return ToolkitManager.Toolkit.CreateMdiClient(null, x, 
y, w, h, new ControlWeakRef(control) );
                }
        }
        
@@ -146,7 +147,7 @@
                                );
                }
                
-               return ToolkitManager.Toolkit.CreatePopupWindow( 
x,y,w,h,control);
+               return ToolkitManager.Toolkit.CreatePopupWindow( x,y,w,h, new 
ControlWeakRef(control) );
        }
 
        #endregion
@@ -189,4 +190,174 @@
 
 }
 
+// Helper class to keep WeakReferences to Control
+// this is needed, because we must not keep a real reference in ToolkitWindow, 
+// else Control never would get disposed.
+internal class ControlWeakRef : IToolkitEventSink
+{
+       private WeakReference mControlWeakRef;
+
+       public ControlWeakRef( IToolkitEventSink control ) {
+               this.mControlWeakRef = new WeakReference( control, false );
+       }
+
+       public void ToolkitExpose(Graphics graphics) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitExpose(graphics);
+               }
+       }
+
+       public void ToolkitMouseEnter() {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitMouseEnter();
+               }
+       }
+
+       public void ToolkitMouseLeave() {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitMouseLeave();
+               }
+       }
+
+       public void ToolkitFocusEnter() {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitFocusEnter();
+               }
+       }
+
+       public void ToolkitFocusLeave() {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitFocusLeave();
+               }
+       }
+
+       public void ToolkitPrimaryFocusEnter() {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitPrimaryFocusEnter();
+               }
+       }
+
+       public void ToolkitPrimaryFocusLeave() {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitPrimaryFocusLeave();
+               }
+       }
+
+       public bool ToolkitKeyDown(ToolkitKeys key) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       return co.ToolkitKeyDown(key);
+               }
+               return false;
+       }
+
+       public bool ToolkitKeyUp(ToolkitKeys key) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       return co.ToolkitKeyUp(key);
+               }
+               return false;
+       }
+
+       public bool ToolkitKeyChar(char charCode) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       return co.ToolkitKeyChar(charCode);
+               }
+               return false;
+       }
+
+       public void ToolkitMouseDown(ToolkitMouseButtons buttons, ToolkitKeys 
modifiers, int clicks, int x, int y, int delta) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitMouseDown(buttons, modifiers, clicks, x, y, 
delta);
+               }
+       }
+
+       public void ToolkitMouseUp(ToolkitMouseButtons buttons, ToolkitKeys 
modifiers, int clicks, int x, int y, int delta) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitMouseUp(buttons, modifiers, clicks, x, y, 
delta);
+               }
+       }
+
+       public void ToolkitMouseHover(ToolkitMouseButtons buttons, ToolkitKeys 
modifiers, int clicks, int x, int y, int delta) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitMouseHover(buttons, modifiers, clicks, x, y, 
delta);
+               }
+       }
+
+       public void ToolkitMouseMove(ToolkitMouseButtons buttons, ToolkitKeys 
modifiers, int clicks, int x, int y, int delta) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitMouseMove(buttons, modifiers, clicks, x, y, 
delta);
+               }
+       }
+
+       public void ToolkitMouseWheel(ToolkitMouseButtons buttons, ToolkitKeys 
modifiers, int clicks, int x, int y, int delta) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitMouseWheel(buttons, modifiers, clicks, x, y, 
delta);
+               }
+       }
+
+       public void ToolkitExternalMove(int x, int y) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitExternalMove(x,y);
+               }
+       }
+
+       public void ToolkitExternalResize(int width, int height) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitExternalResize(width,height);
+               }
+       }
+
+       public void ToolkitClose() {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitClose();
+               }
+       }
+
+       public void ToolkitHelp() {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitHelp();
+               }
+       }
+
+       public void ToolkitStateChanged(int state) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitStateChanged(state);
+               }
+       }
+
+       public void ToolkitMdiActivate(IToolkitWindow child) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitMdiActivate(child);
+               }
+       }
+
+       public void ToolkitBeginInvoke(IntPtr i_gch) {
+               IToolkitEventSink co = this.mControlWeakRef.Target as 
IToolkitEventSink;
+               if( null != co ) {
+                       co.ToolkitBeginInvoke(i_gch);
+               }
+       }
+
+}
+
 }
\ No newline at end of file
Index: pnetlib/System.Windows.Forms/Form.cs
diff -u pnetlib/System.Windows.Forms/Form.cs:1.51 
pnetlib/System.Windows.Forms/Form.cs:1.52
--- pnetlib/System.Windows.Forms/Form.cs:1.51   Mon Mar 27 14:03:55 2006
+++ pnetlib/System.Windows.Forms/Form.cs        Thu Apr  6 10:06:16 2006
@@ -1179,6 +1179,35 @@
        // Dispose of this control.
        protected override void Dispose(bool disposing)
                        {
+                               acceptButton = null;
+                               defaultButton = null;
+                               cancelButton = null;
+                               mdiClient = null;
+                               if( null != owner ) {
+                                       this.RemoveOwnedForm(owner);
+                                       owner = null;
+                               }
+                               if( null != ownedForms ) {
+                                       int iCount = ownedForms.Length;
+                                       for( int i = iCount-1; i >= 0; i-- ) {
+                                               if( null != ownedForms[i] ) {
+                                                       ownedForms[i].Dispose();
+                                               }
+                                       }
+                               }
+
+                               if( null != menu ) {
+                                       menu.ownerForm = null;
+                                       menu = null;
+                               }
+
+                               if( null != mergedMenu ) {
+                                       if( mergedMenu.ownerForm == this || 
mergedMenu.ownerForm == null ) {
+                                               mergedMenu.Dispose();
+                                       }
+                                       mergedMenu = null;
+                               }
+
                                base.Dispose(disposing);
                        }
 
@@ -1696,7 +1725,6 @@
 
        }; // class ControlCollection
 
-
        protected override void OnMouseDown(MouseEventArgs e)
                        {
                                // If the mouse is in the non client area,
Index: pnetlib/System.Windows.Forms/MainMenu.cs
diff -u pnetlib/System.Windows.Forms/MainMenu.cs:1.9 
pnetlib/System.Windows.Forms/MainMenu.cs:1.10
--- pnetlib/System.Windows.Forms/MainMenu.cs:1.9        Sun Aug  7 10:37:45 2005
+++ pnetlib/System.Windows.Forms/MainMenu.cs    Thu Apr  6 10:06:16 2006
@@ -29,7 +29,7 @@
        {
                // Internal state.
                private RightToLeft rightToLeft;
-               private Form ownerForm;
+               internal Form ownerForm;
                private ContextMenu menuPopup;
                private int currentMouseItem = -1;
                // Has the menu been clicked.
@@ -314,9 +314,9 @@
                        }
                }
 
-               protected internal override void ItemSelectTimerTick(object 
sender, EventArgs e)
-               {
-                       base.ItemSelectTimerTick (sender, e);
+               protected internal override void ItemSelectTimerTick(object 
sender, EventArgs e)
+               {
+                       base.ItemSelectTimerTick (sender, e);
                        if(currentMouseItem != -1)
                        {
                                ItemSelected(currentMouseItem);
Index: pnetlib/System.Windows.Forms/ScrollableControl.cs
diff -u pnetlib/System.Windows.Forms/ScrollableControl.cs:1.13 
pnetlib/System.Windows.Forms/ScrollableControl.cs:1.14
--- pnetlib/System.Windows.Forms/ScrollableControl.cs:1.13      Thu Mar 16 
07:22:48 2006
+++ pnetlib/System.Windows.Forms/ScrollableControl.cs   Thu Apr  6 10:06:16 2006
@@ -52,6 +52,12 @@
                                base.SetStyle(ControlStyles.ContainerControl, 
true);
                                // HandleCreated+=new 
EventHandler(ScrollableControl_HandleCreated);
                        }
+                       
+       protected override void Dispose(bool disposing) {
+               DestroyScrollBars();
+               base.Dispose( disposing );
+       }
+
 
        protected virtual void AdjustFormScrollbars(bool displayScrollbars)
                        {
@@ -77,10 +83,7 @@
                                        }
                                        else
                                        {
-                                               vScrollBar.Dispose();
-                                               vScrollBar = null;
-                                               hScrollBar.Dispose();
-                                               hScrollBar = null;
+                                               DestroyScrollBars();
                                        }
                                }
                        }
@@ -547,6 +550,21 @@
                                vScrollBar.toolkitWindow.Raise();
                                UpdateScrollBars();
                        }
+                       
+       private void DestroyScrollBars() 
+                       {
+                               if( null != vScrollBar ) {
+                                       vScrollBar.Scroll-=new 
ScrollEventHandler(HandleScroll);
+                                       vScrollBar.Dispose();
+                                       vScrollBar = null;
+                               }
+                               if( null != hScrollBar ) {
+                                       hScrollBar.Scroll-=new 
ScrollEventHandler(HandleScroll);
+                                       hScrollBar.Dispose();
+                                       hScrollBar = null;
+                               }
+                       }
+                       
 
        // Dock padding edge definitions.
        public class DockPaddingEdges: ICloneable
Index: pnetlib/System.Windows.Forms/TextBox.cs
diff -u pnetlib/System.Windows.Forms/TextBox.cs:1.51 
pnetlib/System.Windows.Forms/TextBox.cs:1.52
--- pnetlib/System.Windows.Forms/TextBox.cs:1.51        Mon Mar 20 06:11:14 2006
+++ pnetlib/System.Windows.Forms/TextBox.cs     Thu Apr  6 10:06:16 2006
@@ -219,6 +219,7 @@
                }
                else if (vScrollBar != null)
                {
+                       vScrollBar.ValueChanged-=new 
EventHandler(vScrollBar_ValueChanged);
                        Controls.Remove(vScrollBar);
                        vScrollBar = null;
                }
@@ -238,6 +239,7 @@
                }
                else if (hScrollBar != null)
                {
+                       hScrollBar.ValueChanged-=new 
EventHandler(hScrollBar_ValueChanged);
                        Controls.Remove(hScrollBar);
                        hScrollBar = null;
                }
@@ -589,7 +591,10 @@
                InvalidateDirty();
                mouseDown = false;
                // We dont need to update any selection
-               selectedRegion = null;
+               if( null != selectedRegion ) {
+                       selectedRegion.Dispose();
+                       selectedRegion = null;
+               }
        }
 
        protected override void OnFontChanged(EventArgs e)
@@ -1094,14 +1099,12 @@
                InvalidateDirty();
        }
 
-       
        // Called to change the text. Sets the update to whats needed to but 
doesnt change the selection point or caret
        private void SetTextActual( string text)
        {
-               if (!IsHandleCreated)
-               {
-                       (this as Control).text = text;
-                       return;
+               if( !IsHandleCreated ) {
+                       // create handle here to be sure that LayoutInfo will 
be set correct.
+                       this.CreateHandle();
                }
                // Layout the new text. Compare with old layout, Creating a 
region for areas that must be updated.
                bool prevLayout = layout != null;
@@ -2090,16 +2093,35 @@
                        invalidateRegion.Dispose();
                        invalidateRegion = null;
                }
+               if( selectedRegion != null ) {
+                       selectedRegion.Dispose();
+                       selectedRegion = null;
+               }
                if (vScrollBar != null)
                {
+                       vScrollBar.ValueChanged-=new 
EventHandler(vScrollBar_ValueChanged);
                        vScrollBar.Dispose();
                        vScrollBar = null;
                }
                if (hScrollBar != null)
                {
+                       hScrollBar.ValueChanged-=new 
EventHandler(hScrollBar_ValueChanged);
                        hScrollBar.Dispose();
                        hScrollBar = null;
                }
+               
+               // remove event handler
+               MouseDown -= new MouseEventHandler(HandleMouseDown);
+               MouseMove -= new MouseEventHandler(HandleMouseMove);
+               DoubleClick -= new EventHandler(HandleDoubleClick);
+               Paint -= new PaintEventHandler(HandlePaint);
+               MultilineChanged -=new EventHandler(HandleMultilineChanged);
+               WordWrapChanged -=new EventHandler(HandleWordWrapChanged);
+               
+#if CONFIG_COMPONENT_MODEL
+               this.DataBindings.CollectionChanged -=new 
CollectionChangeEventHandler(HandleDataBindingCollectionChanged);
+#endif
+               
                base.Dispose (disposing);
        }
 
Index: pnetlib/System.Windows.Forms/TextBoxBase.cs
diff -u pnetlib/System.Windows.Forms/TextBoxBase.cs:1.17 
pnetlib/System.Windows.Forms/TextBoxBase.cs:1.18
--- pnetlib/System.Windows.Forms/TextBoxBase.cs:1.17    Mon Mar  6 11:19:16 2006
+++ pnetlib/System.Windows.Forms/TextBoxBase.cs Thu Apr  6 10:06:16 2006
@@ -60,6 +60,13 @@
                                KeyDown += new KeyEventHandler(HandleKeyDown);
                        }
 
+       protected override void Dispose(bool disposing)
+       {
+               // remove event handler
+               KeyDown -= new KeyEventHandler(HandleKeyDown);
+               base.Dispose(disposing);
+       }
+                       
        // Get or set this object's properties.
        public bool AcceptsTab
                        {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]