blob: 7ab8b33fb09be5aa99f2ad8da6485ca5b35f8776 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jface.databinding;
import java.util.HashMap;
import org.eclipse.jface.internal.databinding.beans.PropertyHelper;
/**
* A description object for a property based tree structure.
* <p>
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
* part of a work in progress. There is no guarantee that this API will remain
* unchanged during the 3.2 release cycle. Please do not use this API without
* consulting with the Platform/UI team.
* </p>
*
* If a domain model is organized as a tree, you can describe the tree with this class in order
* to bind it to a visual tree.
*
* @see ITree for a more flexible manner to bind a tree.
* @since 3.2
*
*/
public class TreeModelDescription {
private HashMap childrenProperties = new HashMap();
private Class[] types = new Class[0];
private Object root;
/**
* @param root element/s or for the tree.
*/
public TreeModelDescription(Object root) { // IUpdatable or Property
this.root = root;
}
/**
* Register a property for getting, or setting the Tree's children(array or collection).
* This property may or may not be an index property.
* A given instanceType, may have multiple children properties.
*
* @param instanceType
* @param childrenProperty
*/
public void addChildrenProperty (Class instanceType, String childrenProperty) {
PropertyHelper prop = new PropertyHelper(childrenProperty, instanceType);
if (prop.getGetter()==null)
throw new BindingException("Invalid children property: "+childrenProperty); //$NON-NLS-1$
addType(instanceType);
childrenProperties.put(instanceType, addProperty(childrenProperty, (String[])childrenProperties.get(instanceType)));
}
private String[] addProperty(String property, String[] list) {
if (list==null)
return new String[] { property } ;
for (int i = 0; i < list.length; i++) {
if (list[i].equals(property)) return list;
}
String[] newList = new String[list.length+1];
System.arraycopy(list,0, newList, 0, list.length);
newList[list.length]=property;
return newList;
}
private String[] addProperties(String[] properties, String[] list) {
String[] result = list;
for (int i = 0; i < properties.length; i++)
result = addProperty(properties[i], result);
return result;
}
private void addType(Class instanceType) {
for (int i = 0; i < types.length; i++) {
if (types[i]==instanceType) return;
}
Class[] newTypes = new Class[types.length+1];
System.arraycopy(types,0, newTypes, 0, types.length);
newTypes[types.length]=instanceType;
types = newTypes;
}
/**
* @param instanceType
* @return property denoting the children for instanceType
*/
public String[] getChildrenProperties(Class instanceType) {
String[] properties = null;
for (int i = 0; i < types.length; i++) {
if (types[i].isAssignableFrom(instanceType)) {
String[] props = (String[])childrenProperties.get(types[i]);
properties = addProperties(props, properties);
}
}
return properties;
}
/**
* @return types associated with the tree
*/
public Class[] getTypes() {
return types;
}
/**
* @return Tree root objects
*/
public Object getRoot() {
return root;
}
}