/*******************************************************************************
* Copyright (c) 2010 BestSolution.at and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tom Schindl<tom.schindl@bestsolution.at> - initial API and implementation
* Fu Zebest<fuzebest@mail.ru> - bugfix in 320685
*******************************************************************************/
package org.eclipse.ufacekit.ui.swing.databinding.swing.model;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.tree.TreeNode;
import org.eclipse.core.databinding.observable.list.IListChangeListener;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.ListChangeEvent;
import org.eclipse.core.databinding.observable.list.ListDiffVisitor;
import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
public class ObservableTreeNode implements TreeNode {
private ObservableTreeNode parent;
private Vector<ObservableTreeNode> nodeList;
private Object userObject;
// Only root-node
private IObservableList list;
private IObservableFactory factory;
private ObservableTreeNodeModel treeModel;
public ObservableTreeNode(ObservableTreeNode parent, Object userObject) {
this.parent = parent;
this.userObject = userObject;
}
ObservableTreeNode(IObservableList list, IObservableFactory factory) {
this.list = list;
this.factory = factory;
children();
}
void setTreeModel(ObservableTreeNodeModel treeModel) {
this.treeModel = treeModel;
}
private ObservableTreeNodeModel getTreeModel() {
if(this.treeModel == null && this.parent != null) {
return parent.getTreeModel();
}
return this.treeModel;
}
public Enumeration children() {
if( nodeList == null ) {
nodeList = new Vector<ObservableTreeNode>();
list = createObservableList();
if( list != null ) {
for( Object o : list ) {
nodeList.add(new ObservableTreeNode(this, o));
}
list.addListChangeListener(new IListChangeListener() {
public void handleListChange(ListChangeEvent event) {
event.diff.accept(new ListDiffVisitor() {
@Override
public void handleRemove(int index, Object element) {
nodeList.remove(index);
getTreeModel().fireTreeNodesRemoved(getTreeModel(), getTreeModel().getPathToRoot(ObservableTreeNode.this), new int[] {index}, new Object[] {element});
}
@Override
public void handleAdd(int index, Object element) {
nodeList.add(index, new ObservableTreeNode(ObservableTreeNode.this, element));
getTreeModel().fireTreeNodesInserted(getTreeModel(), getTreeModel().getPathToRoot(ObservableTreeNode.this), new int[] {index}, new Object[] {element});
}
});
}
});
}
}
return nodeList.elements();
}
private IObservableFactory getFactory() {
return factory == null ? parent.getFactory() : factory;
}
private IObservableList createObservableList() {
return list == null ? (IObservableList)getFactory().createObservable(userObject) : list;
}
public boolean getAllowsChildren() {
// We need to be more clever here to no materialize until expanded!
if( nodeList == null ) {
children();
}
return nodeList == null || nodeList.size() > 0;
}
public TreeNode getChildAt(int childIndex) {
return nodeList != null ? nodeList.get(childIndex) : null;
}
public int getChildCount() {
if( nodeList == null ) {
children();
}
return nodeList != null ? nodeList.size() : 0;
}
public int getIndex(TreeNode node) {
return nodeList != null ? nodeList.indexOf(node) : -1;
}
public TreeNode getParent() {
return parent;
}
public boolean isLeaf() {
return nodeList != null && nodeList.size() == 0;
}
@Override
public String toString() {
return userObject == null ? "" : userObject.toString(); //$NON-NLS-1$
}
}