blob: 40ba2b53162acc52e496ed161a81ffc717ba99d5 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2015 CEA LIST.
*
*
* 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:
* CEA LIST - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.moka.animation.presentation.control;
import java.util.Iterator;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.papyrus.moka.animation.presentation.data.AnimatedDiagramTree;
import org.eclipse.papyrus.moka.animation.presentation.data.IAnimationTreeNode;
import org.eclipse.swt.widgets.Display;
public class AnimatedDiagramTreeContentProvider implements ITreeContentProvider {
// Does a refresh has already been requested but it is still not realized.
protected boolean pendingRefresh;
// The viewer that is in charge of displaying the data model
protected TreeViewer viewer;
public AnimatedDiagramTreeContentProvider() {
this.pendingRefresh = false;
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
this.viewer = (TreeViewer) viewer;
if (oldInput != null) {
IAnimationTreeNode node = null;
if (oldInput instanceof AnimatedDiagramTree) {
node = ((AnimatedDiagramTree) oldInput).getRoot();
} else {
node = (IAnimationTreeNode) oldInput;
}
this.removeListenerTo(node);
}
if (newInput != null) {
IAnimationTreeNode node = null;
if (newInput instanceof AnimatedDiagramTree) {
node = ((AnimatedDiagramTree) newInput).getRoot();
} else {
node = (IAnimationTreeNode) newInput;
}
this.addListenerTo(node);
}
this.pendingRefresh = false;
}
protected void addListenerTo(IAnimationTreeNode node) {
node.addListener(this);
Iterator<IAnimationTreeNode> nodeIterator = node.getChildren().iterator();
while (nodeIterator.hasNext()) {
this.addListenerTo(nodeIterator.next());
}
}
protected void removeListenerTo(IAnimationTreeNode node) {
node.removeListener(this);
Iterator<IAnimationTreeNode> nodeIterator = node.getChildren().iterator();
while (nodeIterator.hasNext()) {
this.removeListenerTo(nodeIterator.next());
}
}
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof AnimatedDiagramTree) {
return new Object[] { ((AnimatedDiagramTree) inputElement).getRoot() };
}
return new Object[] {};
}
@Override
public Object[] getChildren(Object parentElement) {
Object[] children = null;
if (parentElement instanceof IAnimationTreeNode) {
children = ((IAnimationTreeNode) parentElement).getChildren().toArray();
}
return children;
}
@Override
public Object getParent(Object element) {
if (element instanceof IAnimationTreeNode) {
return ((IAnimationTreeNode) element).getParent();
}
return null;
}
@Override
public boolean hasChildren(Object element) {
boolean hasChildren = true;
if (element instanceof IAnimationTreeNode) {
hasChildren = !((IAnimationTreeNode) element).getChildren().isEmpty();
}
return hasChildren;
}
public void requestRefresh() {
if (!this.pendingRefresh) {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
TreeViewer viewer = (TreeViewer) AnimatedDiagramTreeContentProvider.this.viewer;
viewer.refresh();
viewer.expandAll();
}
});
}
}
@Override
public void dispose() {
}
}