summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT/carbon/org
diff options
context:
space:
mode:
authorSilenio Quarti <silenio>2005-08-09 21:47:42 +0000
committerSilenio Quarti <silenio>2005-08-09 21:47:42 +0000
commit1bd4a6d238f246b1a33b1e165b82bcbcf963d2f9 (patch)
tree9154af8097c4b055540299cee6a46dd6b0d473c8 /bundles/org.eclipse.swt/Eclipse SWT/carbon/org
parent4e692e594829c957204f8759719ba27bd5c7bed5 (diff)
downloadeclipse.platform.swt-1bd4a6d238f246b1a33b1e165b82bcbcf963d2f9.tar.gz
eclipse.platform.swt-1bd4a6d238f246b1a33b1e165b82bcbcf963d2f9.tar.xz
eclipse.platform.swt-1bd4a6d238f246b1a33b1e165b82bcbcf963d2f9.zip
45708 & 4862 - recursive dispose
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/carbon/org')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Canvas.java10
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Caret.java4
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Composite.java8
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Control.java11
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Decorations.java33
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Menu.java45
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/MenuItem.java23
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ScrollBar.java14
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Scrollable.java15
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java22
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TabFolder.java22
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TabItem.java22
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Table.java44
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableColumn.java13
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableItem.java12
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ToolBar.java19
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/ToolItem.java16
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Tree.java53
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeColumn.java13
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeItem.java26
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Widget.java49
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;