/*******************************************************************************
* Copyright (c) 2012, 2014 Original authors 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:
* Original authors and others - initial API and implementation
* Dirk Fauth <dirk.fauth@googlemail.com> - Bug 453707, 455364
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.tree;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
public abstract class AbstractTreeRowModel<T> implements ITreeRowModel<T> {
private final Collection<ITreeRowModelListener> listeners = new HashSet<ITreeRowModelListener>();
private final ITreeData<T> treeData;
public AbstractTreeRowModel(ITreeData<T> treeData) {
this.treeData = treeData;
}
public void registerRowGroupModelListener(ITreeRowModelListener listener) {
this.listeners.add(listener);
}
public void notifyListeners() {
for (ITreeRowModelListener listener : this.listeners) {
listener.treeRowModelChanged();
}
}
@Override
public int depth(int index) {
return this.treeData.getDepthOfData(this.treeData.getDataAtIndex(index));
}
@Override
public boolean isLeaf(int index) {
return !hasChildren(index);
}
@Override
@Deprecated
public String getObjectAtIndexAndDepth(int index, int depth) {
return this.treeData.formatDataForDepth(depth, index);
}
@Override
public boolean hasChildren(int index) {
return this.treeData.hasChildren(index);
}
@Override
public boolean isCollapsed(T object) {
return isCollapsed(this.getTreeData().indexOf(object));
}
/**
* {@inheritDoc}
*
* @return <code>true</code> if the tree node at the given index has
* children, <code>false</code> if not.
*/
@Override
public boolean isCollapsible(int index) {
return hasChildren(index);
}
@Override
public List<Integer> collapse(T object) {
return collapse(this.getTreeData().indexOf(object));
};
@Override
public List<Integer> expand(T object) {
return expand(this.getTreeData().indexOf(object));
};
@Override
public List<Integer> expandToLevel(T object, int level) {
return expandToLevel(this.getTreeData().indexOf(object), level);
}
@Override
public List<Integer> getChildIndexes(int parentIndex) {
List<Integer> result = new ArrayList<Integer>();
List<T> children = getDirectChildren(parentIndex);
for (T child : children) {
int index = this.treeData.indexOf(child);
// if the index is -1 the element is not found
// this means it is not visible and therefore can not be handled
if (index >= 0) {
result.add(index);
result.addAll(getChildIndexes(index));
}
}
return result;
}
@Override
public List<Integer> getDirectChildIndexes(int parentIndex) {
List<Integer> result = new ArrayList<Integer>();
List<T> children = getDirectChildren(parentIndex);
for (T child : children) {
int index = this.treeData.indexOf(child);
// if the index is -1 the element is not found
// this means it is not visible and therefore can not be handled
if (index >= 0) {
result.add(index);
}
}
return result;
}
@Override
public List<T> getChildren(int parentIndex) {
return getChildren(this.treeData.getDataAtIndex(parentIndex));
}
protected List<T> getChildren(T parent) {
List<T> result = new ArrayList<T>();
List<T> children = getDirectChildren(parent);
for (T child : children) {
result.add(child);
result.addAll(getChildren(child));
}
return result;
}
@Override
public List<T> getDirectChildren(int parentIndex) {
return this.treeData.getChildren(parentIndex);
}
protected List<T> getDirectChildren(T parent) {
return this.treeData.getChildren(parent);
}
protected ITreeData<T> getTreeData() {
return this.treeData;
}
}