diff options
author | Silenio Quarti <silenio> | 2005-08-09 21:47:42 +0000 |
---|---|---|
committer | Silenio Quarti <silenio> | 2005-08-09 21:47:42 +0000 |
commit | 1bd4a6d238f246b1a33b1e165b82bcbcf963d2f9 (patch) | |
tree | 9154af8097c4b055540299cee6a46dd6b0d473c8 | |
parent | 4e692e594829c957204f8759719ba27bd5c7bed5 (diff) | |
download | eclipse.platform.swt-1bd4a6d238f246b1a33b1e165b82bcbcf963d2f9.tar.gz eclipse.platform.swt-1bd4a6d238f246b1a33b1e165b82bcbcf963d2f9.tar.xz eclipse.platform.swt-1bd4a6d238f246b1a33b1e165b82bcbcf963d2f9.zip |
45708 & 4862 - recursive dispose
21 files changed, 290 insertions, 184 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Canvas.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Canvas.java index cab0ff1910..93f1e6b2e8 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Canvas.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Canvas.java @@ -136,10 +136,12 @@ void redrawWidget (int control, int x, int y, int width, int height, boolean all if (isFocus) caret.setFocus (); } -void releaseWidget () { - if (caret != null) caret.releaseResources (); - caret = null; - super.releaseWidget (); +void releaseChildren (boolean destroy) { + if (caret != null) { + caret.releaseChildren (false); + caret = null; + } + super.releaseChildren (destroy); } /** diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Caret.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Caret.java index 05d80dbffb..b97763a926 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Caret.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Caret.java @@ -310,8 +310,8 @@ void killFocus () { if (isVisible) hideCaret (); } -void releaseChild () { - super.releaseChild (); +void releaseParent () { + super.releaseParent (); if (this == parent.getCaret ()) parent.setCaret (null); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Composite.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Composite.java index 5d08750106..412b2b44fe 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Composite.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Composite.java @@ -748,16 +748,18 @@ Point minimumSize (int wHint, int Hint, boolean changed) { return new Point (width, height); } -void releaseChildren () { +void releaseChildren (boolean destroy) { Control [] children = _getChildren (); for (int i=0; i<children.length; i++) { Control child = children [i]; - if (!child.isDisposed ()) child.releaseResources (); + if (child != null && !child.isDisposed ()) { + child.releaseChildren (false); + } } + super.releaseChildren (destroy); } void releaseWidget () { - releaseChildren (); super.releaseWidget (); if (scrolledVisibleRgn != 0) OS.DisposeRgn (scrolledVisibleRgn); if (siblingsVisibleRgn != 0) OS.DisposeRgn (siblingsVisibleRgn); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Control.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Control.java index 0707891dd7..b9da59e06b 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Control.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Control.java @@ -1707,17 +1707,16 @@ void register () { super.register (); display.addWidget (handle, this); } - -void releaseChild () { - setVisible (topHandle (), false); - parent.removeControl (this); -} - void releaseHandle () { super.releaseHandle (); handle = 0; } +void releaseParent () { + setVisible (topHandle (), false); + parent.removeControl (this); +} + void releaseWidget () { super.releaseWidget (); if (menu != null && !menu.isDisposed ()) { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Decorations.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Decorations.java index 682fed1aec..df630aa4a5 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Decorations.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Decorations.java @@ -341,28 +341,25 @@ Decorations menuShell () { return this; } -void releaseWidget () { - if (menuBar != null) menuBar.dispose (); - menuBar = null; +void releaseChildren (boolean destroy) { + if (menuBar != null) { + menuBar.dispose (); + menuBar = null; + } + Display display = this.display; + super.releaseChildren (destroy); Menu [] menus = display.getMenus (this); if (menus != null) { - do { - int index = 0; - while (index < menus.length) { - Menu menu = menus [index]; - if (menu != null && !menu.isDisposed ()) { - while (menu.getParentMenu () != null) { - menu = menu.getParentMenu (); - } - menu.dispose (); - break; - } - index++; + for (int i=0; i<menus.length; i++) { + Menu menu = menus [i]; + if (menu != null && !menu.isDisposed ()) { + menu.dispose (); } - if (index == menus.length) break; - } while (true); + } + menus = null; } - menus = null; +} +void releaseWidget () { super.releaseWidget (); image = null; images = null; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Menu.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Menu.java index b2e36915ec..d0316634e3 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Menu.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Menu.java @@ -315,7 +315,6 @@ void destroyItem (MenuItem item) { System.arraycopy (items, index + 1, items, index, --count - index); items [count] = null; if (count == 0) items = new MenuItem [4]; - if (item.menu == null) item.destroyEmptyMenu (index); modified = true; OS.DeleteMenuItem (handle, (short) (index + 1)); } @@ -441,7 +440,20 @@ public MenuItem [] getItems () { checkWidget (); int count = OS.CountMenuItems (handle); MenuItem [] result = new MenuItem [count]; - System.arraycopy (items, 0, result, 0, count); + int index = 0; + if (items != null) { + for (int i = 0; i < count; i++) { + MenuItem item = items [i]; + if (item != null && !item.isDisposed ()) { + result [index++] = item; + } + } + } + if (index != result.length) { + MenuItem [] newItems = new MenuItem[index]; + System.arraycopy(result, 0, newItems, 0, index); + result = newItems; + } return result; } @@ -864,12 +876,17 @@ int modifierIndex (String accelText) { return -1; } -void releaseChild () { - super.releaseChild (); - if (cascade != null) cascade.setMenu (null); - if ((style & SWT.BAR) != 0 && this == parent.menuBar) { - parent.setMenuBar (null); +void releaseChildren (boolean destroy, boolean releaseParent) { + if (items != null) { + for (int i=0; i<items.length; i++) { + MenuItem item = items [i]; + if (item != null && !item.isDisposed ()) { + item.releaseChildren (false); + } + } + items = null; } + super.releaseChildren (destroy, releaseParent); } void releaseHandle () { @@ -877,13 +894,15 @@ void releaseHandle () { handle = 0; } -void releaseWidget () { - int count = OS.CountMenuItems (handle); - for (int i=0; i<count; i++) { - MenuItem item = items [i]; - if (!item.isDisposed ()) item.releaseResources (); +void releaseParent () { + super.releaseParent (); + if (cascade != null) cascade.setMenu (null); + if ((style & SWT.BAR) != 0 && this == parent.menuBar) { + parent.setMenuBar (null); } - items = null; +} + +void releaseWidget () { super.releaseWidget (); display.removeMenu (this); parent = null; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/MenuItem.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/MenuItem.java index 0d617a762c..2796d00757 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/MenuItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/MenuItem.java @@ -240,6 +240,11 @@ void destroyEmptyMenu (int index) { } } +void destroyWidget () { + parent.destroyItem (this); + releaseHandle (); +} + /** * Returns the widget accelerator. An accelerator is the bit-wise * OR of zero or more modifier masks and a key. Examples: @@ -446,23 +451,25 @@ int keyGlyph (int key) { return OS.kMenuNullGlyph; } -void releaseChild () { - super.releaseChild (); - parent.destroyItem (this); +void releaseHandle () { + super.releaseHandle (); + parent = null; } -void releaseWidget () { +void releaseChildren (boolean destroy) { if (menu == null) { destroyEmptyMenu (-1); } else { - menu.releaseWidget (); - menu.destroyWidget (); + menu.releaseChildren (true, false); + menu = null; } - menu = null; + super.releaseChildren (destroy); +} + +void releaseWidget () { super.releaseWidget (); accelerator = 0; if (this == parent.defaultItem) parent.defaultItem = null; - parent = null; } /** diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ScrollBar.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ScrollBar.java index 8d8c27c80d..dc974bcdfd 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ScrollBar.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ScrollBar.java @@ -523,18 +523,18 @@ void register () { display.addWidget (handle, this); } -void releaseChild () { - super.releaseChild (); - if (parent.horizontalBar == this) parent.horizontalBar = null; - if (parent.verticalBar == this) parent.verticalBar = null; - parent.resizeClientArea (); -} - void releaseHandle () { super.releaseHandle (); handle = 0; } +void releaseParent () { + super.releaseParent (); + if (parent.horizontalBar == this) parent.horizontalBar = null; + if (parent.verticalBar == this) parent.verticalBar = null; + parent.resizeClientArea (); +} + void releaseWidget () { super.releaseWidget (); if (visibleRgn != 0) OS.DisposeRgn (visibleRgn); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Scrollable.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Scrollable.java index 0f67871033..0a4ec67fb1 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Scrollable.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Scrollable.java @@ -281,11 +281,16 @@ void releaseHandle () { scrolledHandle = 0; } -void releaseWidget () { - if (horizontalBar != null) horizontalBar.releaseResources (); - if (verticalBar != null) verticalBar.releaseResources (); - horizontalBar = verticalBar = null; - super.releaseWidget (); +void releaseChildren (boolean destroy) { + if (horizontalBar != null) { + horizontalBar.releaseChildren (false); + horizontalBar = null; + } + if (verticalBar != null) { + verticalBar.releaseChildren (false); + verticalBar = null; + } + super.releaseChildren (destroy); } void resetVisibleRegion (int control) { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java index 15215fcaca..41fc4318e8 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java @@ -1093,8 +1093,15 @@ void register () { display.addWidget (theRoot [0], this); } -void releaseChild () { - /* Do nothing */ +void releaseChildren (boolean destroy) { + Shell [] shells = getShells (); + for (int i=0; i<shells.length; i++) { + Shell shell = shells [i]; + if (shell != null && !shell.isDisposed ()) { + shell.dispose (); + } + } + super.releaseChildren (destroy); } void releaseHandle () { @@ -1102,18 +1109,13 @@ void releaseHandle () { shellHandle = 0; } -void releaseShells () { - Shell [] shells = getShells (); - for (int i=0; i<shells.length; i++) { - Shell shell = shells [i]; - if (!shell.isDisposed ()) shell.dispose (); - } +void releaseParent () { + /* Do nothing */ } void releaseWidget () { - disposed = true; - releaseShells (); super.releaseWidget (); + disposed = true; if (windowGroup != 0) OS.ReleaseWindowGroup (windowGroup); display.updateQuitMenu (); if (invalRgn != 0) OS.DisposeRgn (invalRgn); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TabFolder.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TabFolder.java index 87e1b4ad94..ae00677c43 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TabFolder.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TabFolder.java @@ -235,6 +235,7 @@ void destroyItem (TabItem item) { index++; } if (index == count) return; + redrawWidget (handle, false); int selectionIndex = OS.GetControl32BitValue (handle) - 1; --count; OS.SetControl32BitMaximum (handle, count); @@ -243,9 +244,13 @@ void destroyItem (TabItem item) { if (count == 0) { items = new TabItem [4]; } + for (int i = index; i < count; i++) { + items [i].update (); + } if (count > 0 && index == selectionIndex) { setSelection (Math.max (0, selectionIndex - 1), true); } + invalidateVisibleRegion (handle); } public Rectangle getClientArea () { @@ -465,14 +470,17 @@ int kEventControlSetFocusPart (int nextHandler, int theEvent, int userData) { return OS.eventNotHandledErr; } -void releaseWidget () { - int count = OS.GetControl32BitMaximum (handle); - for (int i=0; i<count; i++) { - TabItem item = items [i]; - if (!item.isDisposed ()) item.releaseResources (); +void releaseChildren (boolean destroy) { + if (items != null) { + for (int i=0; i<items.length; i++) { + TabItem item = items [i]; + if (item != null && !item.isDisposed ()) { + item.releaseChildren (false); + } + } + items = null; } - items = null; - super.releaseWidget (); + super.releaseChildren (destroy); } void removeControl (Control control) { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TabItem.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TabItem.java index 901bff7078..90ffa911c8 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TabItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TabItem.java @@ -125,6 +125,11 @@ protected void checkSubclass () { if (!isValidSubclass ()) error (SWT.ERROR_INVALID_SUBCLASS); } +void destroyWidget () { + parent.destroyItem (this); + releaseHandle (); +} + /** * Returns the control that is used to fill the client area of * the tab folder when the user selects the tab item. If no @@ -173,13 +178,17 @@ public String getToolTipText () { return toolTipText; } -void releaseChild () { - super.releaseChild (); +void releaseHandle () { + super.releaseHandle (); + parent = null; +} + +void releaseParent () { + super.releaseParent (); int index = parent.indexOf (this); if (index == parent.getSelectionIndex ()) { if (control != null) control.setVisible (false); } - parent.destroyItem (this); } void releaseWidget () { @@ -192,7 +201,6 @@ void releaseWidget () { cIcon = 0; } control = null; - parent = null; } /** @@ -315,4 +323,10 @@ public void setToolTipText (String string) { toolTipText = string; } +void update () { + setText (text); + setImage (image); + setToolTipText (toolTipText); +} + } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Table.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Table.java index fe5e165ec3..e561dd4ac2 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Table.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Table.java @@ -1769,18 +1769,26 @@ int kEventTextInputUnicodeForKeyEvent (int nextHandler, int theEvent, int userDa return result; } -void releaseWidget () { - for (int i=0; i<itemCount; i++) { - TableItem item = items [i]; - if (item != null && !item.isDisposed ()) item.releaseResources (); +void releaseChildren (boolean destroy) { + if (items != null) { + for (int i=0; i<itemCount; i++) { + TableItem item = items [i]; + if (item != null && !item.isDisposed ()) { + item.releaseChildren (false); + } + } + items = null; } - items = null; - for (int i=0; i<columnCount; i++) { - TableColumn column = columns [i]; - if (!column.isDisposed ()) column.releaseResources (); + if (columns != null) { + for (int i=0; i<columnCount; i++) { + TableColumn column = columns [i]; + if (column != null && !column.isDisposed ()) { + column.releaseChildren (false); + } + } + columns = null; } - columns = null; - super.releaseWidget (); + super.releaseChildren (destroy); } /** @@ -1801,15 +1809,15 @@ public void remove (int index) { checkWidget(); checkItems (true); if (!(0 <= index && index < itemCount)) error (SWT.ERROR_INVALID_RANGE); + TableItem item = items [index]; + if (item != null) item.releaseChildren (false); if (index != itemCount - 1) fixSelection (index, false); int [] id = new int [] {itemCount}; if (OS.RemoveDataBrowserItems (handle, OS.kDataBrowserNoItem, id.length, id, 0) != OS.noErr) { error (SWT.ERROR_ITEM_NOT_REMOVED); } - TableItem item = items [index]; System.arraycopy (items, index + 1, items, index, --itemCount - index); items [itemCount] = null; - if (item != null) item.releaseResources (); OS.UpdateDataBrowserItems (handle, 0, 0, null, OS.kDataBrowserItemNoProperty, OS.kDataBrowserNoItem); if (itemCount == 0) setTableEmpty (); } @@ -1890,6 +1898,10 @@ public void remove (int [] indices) { */ public void removeAll () { checkWidget(); + for (int i=0; i<itemCount; i++) { + TableItem item = items [i]; + if (item != null && !item.isDisposed ()) item.releaseChildren (false); + } /* * Feature in the Mac. When RemoveDataBrowserItems() is used * to remove items, item notification callbacks are issued with @@ -1905,10 +1917,6 @@ public void removeAll () { callbacks.v1_itemNotificationCallback = display.itemNotificationProc; OS.SetDataBrowserCallbacks (handle, callbacks); OS.SetDataBrowserScrollPosition (handle, 0, 0); - for (int i=0; i<itemCount; i++) { - TableItem item = items [i]; - if (item != null && !item.isDisposed ()) item.releaseResources (); - } setTableEmpty (); } @@ -2250,12 +2258,12 @@ public void setItemCount (int count) { if (count < itemCount) { int index = count; while (index < itemCount) { + TableItem item = items [index]; + if (item != null) item.releaseChildren (false); int [] id = new int [] {index + 1}; if (OS.RemoveDataBrowserItems (handle, OS.kDataBrowserNoItem, id.length, id, 0) != OS.noErr) { break; } - TableItem item = items [index]; - if (item != null) item.releaseResources (); index++; } if (index < itemCount) error (SWT.ERROR_ITEM_NOT_REMOVED); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableColumn.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableColumn.java index e3b735a757..605816f412 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableColumn.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableColumn.java @@ -183,6 +183,11 @@ protected void checkSubclass () { if (!isValidSubclass ()) error (SWT.ERROR_INVALID_SUBCLASS); } +void destroyWidget () { + parent.destroyItem (this); + releaseHandle (); +} + /** * Returns a value which describes the position of the * text or image in the receiver. The value will be one of @@ -316,9 +321,10 @@ public void pack () { setWidth (width + Table.EXTRA_WIDTH); } -void releaseChild () { - super.releaseChild (); - parent.destroyItem (this); +void releaseHandle () { + super.releaseHandle (); + id = -1; + parent = null; } void releaseWidget () { @@ -326,7 +332,6 @@ void releaseWidget () { if (parent.sortColumn == this) { parent.sortColumn = null; } - parent = null; if (iconRef != 0) OS.ReleaseIconRef (iconRef); iconRef = 0; } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableItem.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableItem.java index 577c533355..d51cfbf113 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableItem.java @@ -149,6 +149,11 @@ void clear () { width = -1; } +void destroyWidget () { + parent.destroyItem (this); + releaseHandle (); +} + /** * Returns the receiver's background color. * @@ -513,14 +518,13 @@ void redraw (int propertyID) { } } -void releaseChild () { - super.releaseChild (); - parent.destroyItem (this); +void releaseHandle () { + super.releaseHandle (); + parent = null; } void releaseWidget () { super.releaseWidget (); - parent = null; strings = null; images = null; background = foreground = null; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ToolBar.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ToolBar.java index 7403ec65e9..117b867aeb 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ToolBar.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ToolBar.java @@ -161,6 +161,7 @@ void destroyItem (ToolItem item) { if (index == itemCount) return; System.arraycopy (items, index + 1, items, index, --itemCount - index); items [itemCount] = null; + relayout (); } void drawBackground (int control) { @@ -410,14 +411,18 @@ void relayout () { layout (rect.width, rect.height, true); } -void releaseWidget () { - for (int i=0; i<itemCount; i++) { - ToolItem item = items [i]; - if (!item.isDisposed ()) item.releaseResources (); +void releaseChildren (boolean destroy) { + if (items != null) { + for (int i=0; i<itemCount; i++) { + ToolItem item = items [i]; + if (item != null && !item.isDisposed ()) { + item.releaseChildren (false); + } + } + itemCount = 0; + items = null; } - itemCount = 0; - items = null; - super.releaseWidget (); + super.releaseChildren (destroy); } void removeControl (Control control) { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ToolItem.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ToolItem.java index 881fadae19..850bee87a8 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ToolItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ToolItem.java @@ -281,6 +281,7 @@ void deregister () { } void destroyWidget () { + parent.destroyItem (this); int theControl = handle; releaseHandle (); if (theControl != 0) { @@ -288,13 +289,6 @@ void destroyWidget () { } } -public void dispose () { - if (isDisposed()) return; - ToolBar parent = this.parent; - super.dispose (); - parent.relayout (); -} - void drawBackground (int control) { drawBackground (control, parent.background); } @@ -702,15 +696,16 @@ void register () { if (labelHandle != 0) display.addWidget (labelHandle, this); } -void releaseChild () { - super.releaseChild (); + +void releaseParent () { + super.releaseParent (); setVisible (handle, false); - parent.destroyItem (this); } void releaseHandle () { super.releaseHandle (); handle = iconHandle = labelHandle = 0; + parent = null; } void releaseWidget () { @@ -720,7 +715,6 @@ void releaseWidget () { cIcon = labelCIcon = 0; if (visibleRgn != 0) OS.DisposeRgn (visibleRgn); visibleRgn = 0; - parent = null; control = null; toolTipText = null; image = disabledImage = hotImage = null; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Tree.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Tree.java index 5f5991d100..3453147c65 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Tree.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Tree.java @@ -625,7 +625,6 @@ void destroyItem (TreeColumn column) { } void destroyItem (TreeItem item) { - //checkItems (true); TreeItem parentItem = item.parentItem; if (parentItem == null || parentItem.getExpanded ()) { int parentID = parentItem == null ? OS.kDataBrowserNoItem : item.parentItem.id; @@ -635,8 +634,6 @@ void destroyItem (TreeItem item) { } ignoreExpand = false; } - releaseItems (item.getItems ()); - releaseItem (item); boolean hasChild = false; for (int i=0; i<items.length; i++) { if (items [i] != null && items [i].parentItem == parentItem) { @@ -1701,10 +1698,10 @@ int kEventMouseDown (int nextHandler, int theEvent, int userData) { return result; } -boolean releaseItem (TreeItem item) { - if (item.isDisposed ()) return false; - items [item.id - 1] = null; - return true; +void releaseItem (TreeItem item, boolean release) { + int id = item.id; + if (release) item.releaseChildren (false); + items [id - 1] = null; } void releaseItems (TreeItem [] nodes) { @@ -1714,26 +1711,32 @@ void releaseItems (TreeItem [] nodes) { if (sons.length != 0) { releaseItems (sons); } - if (releaseItem (item)) { - item.releaseResources (); + if (!isDisposed ()) { + releaseItem (item, true); } } } -void releaseWidget () { - for (int i=0; i<items.length; i++) { - TreeItem item = items [i]; - if (item != null && !item.isDisposed ()) { - item.releaseResources (); +void releaseChildren (boolean destroy) { + if (items != null) { + for (int i=0; i<items.length; i++) { + TreeItem item = items [i]; + if (item != null && !item.isDisposed ()) { + item.releaseChildren (false); + } } + items = null; } - items = null; - for (int i=0; i<columnCount; i++) { - TreeColumn column = columns [i]; - if (!column.isDisposed ()) column.releaseResources (); + if (columns != null) { + for (int i=0; i<columnCount; i++) { + TreeColumn column = columns [i]; + if (column != null && !column.isDisposed ()) { + column.releaseChildren (false); + } + } + columns = null; } - columns = null; - super.releaseWidget (); + super.releaseChildren (destroy); } /** @@ -1746,17 +1749,17 @@ void releaseWidget () { */ public void removeAll () { checkWidget (); + for (int i=0; i<items.length; i++) { + TreeItem item = items [i]; + if (item != null && !item.isDisposed ()) item.releaseChildren (false); + } + items = new TreeItem [4]; ignoreExpand = true; if (OS.RemoveDataBrowserItems (handle, OS.kDataBrowserNoItem, 0, null, 0) != OS.noErr) { error (SWT.ERROR_ITEM_NOT_REMOVED); } ignoreExpand = false; OS.SetDataBrowserScrollPosition (handle, 0, 0); - for (int i=0; i<items.length; i++) { - TreeItem item = items [i]; - if (item != null && !item.isDisposed ()) item.releaseResources (); - } - items = new TreeItem [4]; anchorFirst = anchorLast = 0; setScrollWidth (); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeColumn.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeColumn.java index 43c4ca331f..112ad0f328 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeColumn.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeColumn.java @@ -185,6 +185,11 @@ protected void checkSubclass () { if (!isValidSubclass ()) error (SWT.ERROR_INVALID_SUBCLASS); } +void destroyWidget () { + parent.destroyItem (this); + releaseHandle (); +} + /** * Returns a value which describes the position of the * text or image in the receiver. The value will be one of @@ -324,9 +329,10 @@ int calculateWidth (TreeItem[] items, int index, GC gc, int width) { return width; } -void releaseChild () { - super.releaseChild (); - parent.destroyItem (this); +void releaseHandle () { + super.releaseHandle (); + id = -1; + parent = null; } void releaseWidget () { @@ -334,7 +340,6 @@ void releaseWidget () { if (parent.sortColumn == this) { parent.sortColumn = null; } - parent = null; if (iconRef != 0) OS.ReleaseIconRef (iconRef); iconRef = 0; } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeItem.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeItem.java index 680c32b707..5cb3792158 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeItem.java @@ -220,6 +220,12 @@ protected void checkSubclass () { if (!isValidSubclass ()) error (SWT.ERROR_INVALID_SUBCLASS); } +void destroyWidget () { + parent.releaseItem (this, false); + parent.destroyItem (this); + releaseHandle (); +} + /** * Returns the receiver's background color. * @@ -741,17 +747,23 @@ void redraw (int propertyID) { } } -void releaseChild () { - super.releaseChild (); - parent.destroyItem (this); +void releaseChildren (boolean destroy) { + if (destroy) { + parent.releaseItems (getItems ()); + } + super.releaseChildren (destroy); } -void releaseWidget () { - super.releaseWidget (); +void releaseHandle () { + super.releaseHandle (); parentItem = null; - parent = null; - id = 0; index = -1; + id = 0; + parent = null; +} + +void releaseWidget () { + super.releaseWidget (); strings = null; images = null; background = foreground = null; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Widget.java index 5aad1fb653..4fb0d43a2b 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Widget.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Widget.java @@ -78,6 +78,7 @@ public abstract class Widget { /* More global state flags */ static final int RELEASED = 1<<13; + static final int DISPOSE_SENT = 1<<14; /* Default size for widgets */ static final int DEFAULT_WIDTH = 64; @@ -85,8 +86,10 @@ public abstract class Widget { static final Rect EMPTY_RECT = new Rect (); +static int count; Widget () { /* Do nothing */ + if (!(this instanceof Caret) && !(this instanceof Tracker)) count++; } /** @@ -123,6 +126,7 @@ public Widget (Widget parent, int style) { checkParent (parent); this.style = style; display = parent.display; + if (!(this instanceof Caret) && !(this instanceof Tracker)) count++; } int actionProc (int theControl, int partCode) { @@ -611,14 +615,7 @@ public void dispose () { */ if (isDisposed ()) return; if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - if ((state & RELEASED) != 0) { - state |= DISPOSED; - return; - } - state |= RELEASED; - releaseChild (); - releaseWidget (); - destroyWidget (); + releaseChildren (true); } void drawBackground (int control) { @@ -1289,8 +1286,31 @@ void redrawWidget (int control, int x, int y, int width, int height, boolean chi void register () { } -void releaseChild () { - /* Do nothing */ +void releaseChildren (boolean destroy) { + releaseChildren (destroy, true); +} + +void releaseChildren (boolean destroy, boolean releaseParent) { + if ((state & DISPOSE_SENT) == 0) { + state |= DISPOSE_SENT; + sendEvent (SWT.Dispose); + + if (!(this instanceof Caret) && !(this instanceof Tracker)) { + count--; + System.out.println(count + " " + this); + } + } + if ((state & RELEASED) == 0) { + state |= RELEASED; + if (destroy) { + if (releaseParent) releaseParent (); + releaseWidget (); + destroyWidget (); + } else { + releaseWidget (); + releaseHandle (); + } + } } void releaseHandle () { @@ -1298,16 +1318,11 @@ void releaseHandle () { display = null; } -void releaseResources () { - if ((state & RELEASED) != 0) return; - state |= RELEASED; - releaseWidget (); - releaseHandle (); +void releaseParent () { + /* Do nothing */ } void releaseWidget () { - sendEvent (SWT.Dispose); - state &= ~DISPOSED; deregister (); eventTable = null; data = null; |