/*******************************************************************************
* Copyright (c) 2004 Vlad Dumitrescu 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:
* Vlad Dumitrescu
*******************************************************************************/
package org.erlide.ui.editors.erl.outline;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.erlide.engine.ErlangEngine;
import org.erlide.engine.model.ErlModelException;
import org.erlide.engine.model.IErlElement;
import org.erlide.engine.model.IParent;
import org.erlide.engine.model.root.IErlModule;
import org.erlide.util.ErlLogger;
public class ErlangContentProvider implements ITreeContentProvider {
private final Object[] NO_CHILDREN = new Object[] {};
private ElementChangedListener fListener;
@Override
public Object[] getChildren(final Object parent) {
if (parent instanceof IParent) {
final IParent p = (IParent) parent;
try {
return p.getChildren().toArray();
} catch (final ErlModelException x) {
ErlLogger.warn(x);
}
}
return NO_CHILDREN;
}
@Override
public Object[] getElements(final Object parent) {
return getChildren(parent);
}
@Override
public Object getParent(final Object child) {
if (child instanceof IErlElement) {
final IErlElement e = (IErlElement) child;
return e.getParent();
}
return null;
}
@Override
public boolean hasChildren(final Object parent) {
if (parent instanceof IParent) {
final IParent p = (IParent) parent;
return p.hasChildren();
}
return false;
}
public boolean isDeleted(final Object o) {
return false;
}
@Override
public void dispose() {
if (fListener != null) {
ErlangEngine.getInstance().getModel().removeElementChangedListener(fListener);
fListener = null;
}
}
/*
* @see IContentProvider#inputChanged(Viewer, Object, Object)
*/
@Override
public void inputChanged(final Viewer viewer, final Object oldInput,
final Object newInput) {
final boolean isModule = newInput instanceof IErlModule;
// ErlLogger.debug("content set input:: " + newInput);
if (isModule && fListener == null) {
fListener = new ElementChangedListener(null);
ErlangEngine.getInstance().getModel().addElementChangedListener(fListener);
} else if (!isModule && fListener != null) {
ErlangEngine.getInstance().getModel().removeElementChangedListener(fListener);
fListener = null;
}
}
}