Bug 138608 [Viewers] JFace AbstractTreeViewer: itemExists doesn't handle equal tree entries
I use a TreeViewer with - setUseHashLookup(true) - without any sorter or filter - with a comparer When I try to add an object that is equal to an existing entry in the tree, it will not be added. This is because the method private boolean itemExists(Item[] items, Object element) { if(usingElementMap()) { return findItem(element) != null; } for (int i = 0; i < items.length; i++) { if(items[i].getData().equals(element)) { return true; } } return false; } takes a shortcut if there is an element map, but the shortcut doesn't handle the 'multiple equal elements' case. There is a workaround, however: Setting a dummy sorter will avoid the call to itemExists and multiple equal elements can be added to the tree.
bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java
}
		return new TreePath(segments.toArray());
	}
	/**
	 * This implementation of getSelection() returns an instance of
	 * ITreeSelection.
	 * 
	 * @since 3.2
	 */
	public ISelection getSelection() {
		Control control = getControl();
		if (control == null || control.isDisposed()) {
			return TreeSelection.EMPTY;
		}
		Widget[] items = getSelection(getControl());
		ArrayList list = new ArrayList(items.length);
		for (int i = 0; i < items.length; i++) {
			Widget item = items[i];
			if (item.getData() != null) {
				list.add(getTreePathFromItem((Item) item));
			}
		}
		return new TreeSelection((TreePath[]) list.toArray(new TreePath[list
				.size()]), getComparer());
	}
	
	protected void setSelectionToWidget(ISelection selection, boolean reveal) {
		if(selection instanceof ITreeSelection) {
			ITreeSelection treeSelection = (ITreeSelection) selection;
			setSelectionToWidget(Arrays.asList(treeSelection.getPaths()), reveal);