/*******************************************************************************
* Copyright (c) 2007, 2008 Spring IDE Developers
* 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:
* Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.ui.internal.navigator;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
import org.eclipse.ui.navigator.ICommonContentProvider;
import org.springframework.ide.eclipse.core.SpringCore;
import org.springframework.ide.eclipse.core.SpringCoreUtils;
import org.springframework.ide.eclipse.core.model.IModelChangeListener;
import org.springframework.ide.eclipse.core.model.IModelElement;
import org.springframework.ide.eclipse.core.model.ISpringModel;
import org.springframework.ide.eclipse.core.model.ISpringProject;
import org.springframework.ide.eclipse.core.model.ModelChangeEvent;
import org.springframework.ide.eclipse.core.model.ModelChangeEvent.Type;
import org.springframework.ide.eclipse.ui.SpringUIPlugin;
/**
* This {@link ICommonContentProvider} knows about the Spring projects.
* @author Torsten Juergeleit
* @author Christian Dupuis
* @since 2.0
*/
public class SpringNavigatorContentProvider implements ICommonContentProvider,
IModelChangeListener {
private boolean refresh;
private StructuredViewer viewer;
private String providerID;
public SpringNavigatorContentProvider() {
this(true);
}
public SpringNavigatorContentProvider(boolean refresh) {
this.refresh = refresh;
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (viewer instanceof StructuredViewer) {
this.viewer = (StructuredViewer) viewer;
if (refresh) {
if (oldInput == null && newInput != null) {
SpringCore.getModel().addChangeListener(this);
} else if (oldInput != null && newInput == null) {
SpringCore.getModel().removeChangeListener(this);
}
}
} else {
this.viewer = null;
}
}
public void dispose() {
if (refresh) {
SpringCore.getModel().removeChangeListener(this);
}
}
public Object[] getElements(Object inputElement) {
if (inputElement instanceof IWorkingSet) {
return IModelElement.NO_CHILDREN;
}
return SpringCore.getModel().getProjects().toArray();
}
public boolean hasChildren(Object element) {
return false;
}
public Object[] getChildren(Object parentElement) {
// Show virtual folder "Spring Elements" only in project explorer
if (SpringUIPlugin.PROJECT_EXPLORER_CONTENT_PROVIDER_ID
.equals(providerID)) {
if (parentElement instanceof IProject) {
ISpringProject springProject = SpringCore.getModel()
.getProject((IProject) parentElement);
if (springProject != null) {
return new Object[] { springProject };
}
}
}
return IModelElement.NO_CHILDREN;
}
public Object getParent(Object element) {
return null;
}
public void init(ICommonContentExtensionSite config) {
providerID = config.getExtension().getId();
}
public void saveState(IMemento aMemento) {
}
public void restoreState(IMemento aMemento) {
}
public void elementChanged(ModelChangeEvent event) {
IModelElement element = event.getElement();
// For events of type ADDED or REMOVED refresh the parent of the changed
// model element
if (event.getType() == Type.CHANGED) {
refreshViewerForElement(element);
} else {
if (element.getElementParent() instanceof ISpringModel) {
refreshViewerForElement(ResourcesPlugin.getWorkspace().getRoot());
}
else {
refreshViewerForElement(element.getElementParent());
}
}
}
protected final StructuredViewer getViewer() {
return viewer;
}
protected final void refreshViewerForElement(final Object element) {
if (viewer instanceof StructuredViewer && element != null) {
// Abort if this happens after disposes
Control ctrl = viewer.getControl();
if (ctrl == null || ctrl.isDisposed()) {
return;
}
// Are we in the UI thread?
if (ctrl.getDisplay().getThread() == Thread.currentThread()) {
viewer.refresh(element);
} else {
ctrl.getDisplay().asyncExec(new Runnable() {
public void run() {
// Abort if this happens after disposes
Control ctrl = viewer.getControl();
if (ctrl == null || ctrl.isDisposed()) {
return;
}
if (element instanceof ISpringModel) {
viewer.refresh();
} else {
viewer.refresh(element);
}
}
});
}
}
}
@Override
public String toString() {
return String.valueOf(providerID);
}
}