Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
package org.eclipse.swt.widgets;


import java.util.*;

import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
Expand Down Expand Up @@ -179,6 +181,7 @@ void _addListener (int eventType, Listener listener) {
}

TreeItem _getItem (long iter) {
if (iter == 0) return null;
int id = getId (iter, true);
if (items [id] != null) return items [id];
long path = GTK.gtk_tree_model_get_path (modelHandle, iter);
Expand All @@ -191,19 +194,16 @@ TreeItem _getItem (long iter) {
parentIter = OS.g_malloc (GTK.GtkTreeIter_sizeof ());
GTK.gtk_tree_model_get_iter (modelHandle, parentIter, path);
}
items [id] = new TreeItem (this, parentIter, SWT.NONE, indices [indices.length -1], false);
items [id] = new TreeItem (this, _getItem(parentIter), SWT.NONE, indices [indices.length -1], iter);
GTK.gtk_tree_path_free (path);
if (parentIter != 0) OS.g_free (parentIter);
return items [id];
}

TreeItem _getItem (long parentIter, int index) {
long iter = OS.g_malloc (GTK.GtkTreeIter_sizeof ());
GTK.gtk_tree_model_iter_nth_child(modelHandle, iter, parentIter, index);
TreeItem _getItem (long parentIter, long iter, int index) {
int id = getId (iter, true);
OS.g_free (iter);
if (items [id] != null) return items [id];
return items [id] = new TreeItem (this, parentIter, SWT.NONE, index, false);
return items [id] = new TreeItem (this, _getItem(parentIter), SWT.NONE, index, iter);
}

void reallocateIds(int newSize) {
Expand Down Expand Up @@ -1745,10 +1745,14 @@ public boolean getHeaderVisible () {
*/
public TreeItem getItem (int index) {
checkWidget();
if (!(0 <= index && index < GTK.gtk_tree_model_iter_n_children (modelHandle, 0))) {
error (SWT.ERROR_INVALID_RANGE);
if (index < 0) error (SWT.ERROR_INVALID_RANGE);
long iter = OS.g_malloc (GTK.GtkTreeIter_sizeof ());
try {
if (!GTK.gtk_tree_model_iter_nth_child (modelHandle, iter, 0, index)) error (SWT.ERROR_INVALID_RANGE);
return _getItem (0, iter, index);
} finally {
OS.g_free (iter);
}
return _getItem (0, index);
}

/**
Expand Down Expand Up @@ -1924,26 +1928,15 @@ int getItemHeightInPixels () {
}

TreeItem [] getItems (long parent) {
int length = GTK.gtk_tree_model_iter_n_children (modelHandle, parent);
TreeItem[] result = new TreeItem [length];
if (length == 0) return result;
if ((style & SWT.VIRTUAL) != 0) {
for (int i=0; i<length; i++) {
result [i] = _getItem (parent, i);
}
} else {
int i = 0;
int[] index = new int [1];
long iter = OS.g_malloc (GTK.GtkTreeIter_sizeof ());
boolean valid = GTK.gtk_tree_model_iter_children (modelHandle, iter, parent);
while (valid) {
GTK.gtk_tree_model_get (modelHandle, iter, ID_COLUMN, index, -1);
result [i++] = items [index [0]];
valid = GTK.gtk_tree_model_iter_next (modelHandle, iter);
}
OS.g_free (iter);
ArrayList<TreeItem> result = new ArrayList<>();
long iter = OS.g_malloc (GTK.GtkTreeIter_sizeof ());
boolean valid = GTK.gtk_tree_model_iter_children (modelHandle, iter, parent);
while (valid) {
result.add (_getItem (parent, iter, result.size ()));
valid = GTK.gtk_tree_model_iter_next (modelHandle, iter);
}
return result;
OS.g_free (iter);
return result.toArray (new TreeItem [result.size()]);
}

/**
Expand Down Expand Up @@ -3532,7 +3525,7 @@ void setItemCount (long parentIter, int count) {
OS.g_free (iters);
} else {
for (int i=itemCount; i<count; i++) {
new TreeItem (this, parentIter, SWT.NONE, itemCount, true);
new TreeItem (this, _getItem(parentIter), SWT.NONE, itemCount, 0);
}
}
if (!isVirtual) setRedraw (true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public class TreeItem extends Item {
Font[] cellFont;
String [] strings;
boolean cached, grayed, isExpanded, updated, settingData;
private TreeItem [] itemCache;
static final int EXPANDER_EXTRA_PADDING = 4;

/**
Expand All @@ -70,7 +71,7 @@ public class TreeItem extends Item {
* @see Widget#getStyle
*/
public TreeItem (Tree parent, int style) {
this (checkNull (parent), 0, style, -1, true);
this (checkNull (parent), null, style, -1, 0);
}

/**
Expand Down Expand Up @@ -103,7 +104,7 @@ public TreeItem (Tree parent, int style) {
* @see Tree#setRedraw
*/
public TreeItem (Tree parent, int style, int index) {
this (checkNull (parent), 0, style, checkIndex (index), true);
this (checkNull (parent), null, style, checkIndex (index), 0);
}

/**
Expand All @@ -129,7 +130,7 @@ public TreeItem (Tree parent, int style, int index) {
* @see Widget#getStyle
*/
public TreeItem (TreeItem parentItem, int style) {
this (checkNull (parentItem).parent, parentItem.handle, style, -1, true);
this (checkNull (parentItem).parent, parentItem, style, -1, 0);
}

/**
Expand Down Expand Up @@ -158,17 +159,21 @@ public TreeItem (TreeItem parentItem, int style) {
* @see Tree#setRedraw
*/
public TreeItem (TreeItem parentItem, int style, int index) {
this (checkNull (parentItem).parent, parentItem.handle, style, checkIndex (index), true);
this (checkNull (parentItem).parent, parentItem, style, checkIndex (index), 0);
}

TreeItem (Tree parent, long parentIter, int style, int index, boolean create) {
TreeItem (Tree parent, TreeItem parentItem, int style, int index, long iter) {
super (parent, style);
this.parent = parent;
if (create) {
long parentIter = parentItem != null ? parentItem.handle : 0;
if (iter == 0) {
if (parentItem != null) parentItem.itemCache = null;
parent.createItem (this, parentIter, index);
} else {
assert handle == 0;
handle = OS.g_malloc (GTK.GtkTreeIter_sizeof ());
GTK.gtk_tree_model_iter_nth_child (parent.modelHandle, handle, parentIter, index);
if (handle == 0) error(SWT.ERROR_NO_HANDLES);
C.memmove(handle, iter, GTK.GtkTreeIter_sizeof ());
}
}

Expand Down Expand Up @@ -347,6 +352,10 @@ public void clearAll (boolean all) {

@Override
void destroyWidget () {
TreeItem parentItem = getParentItem ();
if (parentItem != null) {
parentItem.itemCache = null;
}
parent.releaseItem (this, false);
parent.destroyItem (this);
releaseHandle ();
Expand Down Expand Up @@ -768,6 +777,7 @@ Rectangle getImageBoundsInPixels (int index) {
public int getItemCount () {
checkWidget();
if (!parent.checkData (this)) error (SWT.ERROR_WIDGET_DISPOSED);
if (itemCache != null) return itemCache.length;
return GTK.gtk_tree_model_iter_n_children (parent.modelHandle, handle);
}

Expand All @@ -792,9 +802,18 @@ public TreeItem getItem (int index) {
checkWidget();
if (index < 0) error (SWT.ERROR_INVALID_RANGE);
if (!parent.checkData (this)) error (SWT.ERROR_WIDGET_DISPOSED);
int itemCount = GTK.gtk_tree_model_iter_n_children (parent.modelHandle, handle);
if (index >= itemCount) error (SWT.ERROR_INVALID_RANGE);
return parent._getItem (handle, index);

if (itemCache != null) {
if (itemCache.length <= index) error (SWT.ERROR_INVALID_RANGE);
return itemCache [index];
}
long iter = OS.g_malloc (GTK.GtkTreeIter_sizeof ());
try {
if (!GTK.gtk_tree_model_iter_nth_child (parent.modelHandle, iter, handle, index)) error (SWT.ERROR_INVALID_RANGE);
return parent._getItem (handle, iter, index);
} finally {
OS.g_free (iter);
}
}

/**
Expand All @@ -816,7 +835,8 @@ public TreeItem getItem (int index) {
public TreeItem [] getItems () {
checkWidget();
if (!parent.checkData (this)) error (SWT.ERROR_WIDGET_DISPOSED);
return parent.getItems (handle);
if (itemCache != null) return itemCache;
return itemCache = parent.getItems (handle);
}

@Override
Expand Down Expand Up @@ -1628,6 +1648,7 @@ public void setImage (Image [] images) {
*/
public void setItemCount (int count) {
checkWidget ();
itemCache = null;
count = Math.max (0, count);
parent.setItemCount (handle, count);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1174,6 +1174,15 @@ public void test_setTextILjava_lang_String(){

}

@Test
public void test_removeAll() {
TreeItem item = new TreeItem(treeItem, SWT.NONE);
assertEquals(1, treeItem.getItemCount());
treeItem.removeAll();
assertEquals(0, treeItem.getItemCount());
assertTrue(item.isDisposed());
}

/* custom */
TreeItem treeItem;
Tree tree;
Expand Down
Loading