blob: e1226c9df2bc946a55571dfd731a743eca76e384 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2007 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
* Brad Reynolds - bug 164134
*******************************************************************************/
package org.eclipse.core.internal.databinding.observable.tree;
import org.eclipse.core.databinding.observable.AbstractObservable;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.util.Policy;
import org.eclipse.core.internal.databinding.BindingMessages;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.Status;
/**
* @since 3.3
*
*/
public abstract class AbstractObservableTree extends AbstractObservable
implements IObservableTree {
private boolean stale;
private ListenerList treeListeners = new ListenerList(ListenerList.IDENTITY);
/**
* @param realm
*/
public AbstractObservableTree(Realm realm) {
super(realm);
}
public void addChild(TreePath parentPath, Object childElement) {
throw new UnsupportedOperationException();
}
public void addTreeChangeListener(ITreeChangeListener listener) {
treeListeners.add(listener);
}
public int getChildCount(TreePath parentPath) {
return getChildren(parentPath).length;
}
public boolean hasChildren(TreePath parentPath) {
return getChildCount(parentPath) > 0;
}
public void insertChild(TreePath parentPath, int index, Object childElement) {
throw new UnsupportedOperationException();
}
public boolean isLazy() {
return false;
}
public boolean isOrdered() {
return false;
}
public void removeChild(TreePath parentPath, Object childElement) {
throw new UnsupportedOperationException();
}
public void removeChild(TreePath parentPath, int index) {
throw new UnsupportedOperationException();
}
public void removeTreeChangeListener(ITreeChangeListener listener) {
treeListeners.remove(listener);
}
public void setChildCount(TreePath parentPath, int count) {
throw new UnsupportedOperationException();
}
public void setChildren(TreePath parentPath, Object[] children) {
throw new UnsupportedOperationException();
}
public void updateChildren(IChildrenUpdate update) {
TreePath parent = update.getParent();
Object[] children = getChildren(parent);
for (int i = 0; i < update.getLength(); i++) {
int targetIndex = update.getOffset() + i;
if (targetIndex < children.length) {
update.setChild(children[targetIndex], targetIndex);
} else {
update
.setStatus(new Status(
IStatus.WARNING,
Policy.JFACE_DATABINDING,
IStatus.OK,
BindingMessages
.getString(BindingMessages.INDEX_OUT_OF_RANGE),
null));
}
}
update.done();
}
public void updateChildrenCount(IChildrenCountUpdate update) {
TreePath[] parents = update.getParents();
for (int i = 0; i < parents.length; i++) {
update.setChildCount(parents[i], getChildCount(parents[i]));
}
update.done();
}
public void updateHasChildren(IHasChildrenUpdate update) {
TreePath[] parents = update.getElements();
for (int i = 0; i < parents.length; i++) {
update.setHasChilren(parents[i], hasChildren(parents[i]));
}
update.done();
}
public boolean isStale() {
return stale;
}
/**
* @param stale
*/
public void setStale(boolean stale) {
this.stale = stale;
if (stale) {
fireStale();
}
}
protected void fireTreeChange(TreeDiff diff) {
// fire general change event first
fireChange();
Object[] listeners = treeListeners.getListeners();
TreeChangeEvent event = new TreeChangeEvent(this, diff);
for (int i = 0; i < listeners.length; i++) {
((ITreeChangeListener) listeners[i]).handleTreeChange(event);
}
}
}