/*******************************************************************************
* Copyright (c) 2007 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.webflow.ui.navigator;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
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.navigator.CommonNavigator;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
import org.eclipse.ui.navigator.ICommonContentProvider;
import org.springframework.ide.eclipse.beans.core.model.IBeansConfig;
import org.springframework.ide.eclipse.core.SpringCore;
import org.springframework.ide.eclipse.core.java.JdtUtils;
import org.springframework.ide.eclipse.core.model.IModelElement;
import org.springframework.ide.eclipse.core.model.ISpringProject;
import org.springframework.ide.eclipse.webflow.core.Activator;
import org.springframework.ide.eclipse.webflow.core.internal.model.WebflowModelUtils;
import org.springframework.ide.eclipse.webflow.core.model.IWebflowConfig;
import org.springframework.ide.eclipse.webflow.core.model.IWebflowModel;
import org.springframework.ide.eclipse.webflow.core.model.IWebflowModelElement;
import org.springframework.ide.eclipse.webflow.core.model.IWebflowModelListener;
import org.springframework.ide.eclipse.webflow.core.model.IWebflowProject;
/**
* This class is a content provider for the {@link CommonNavigator} which knows
* about the web flow core model's {@link IWebflowConfig}.
* @author Christian Dupuis
* @author Torsten Juergeleit
* @since 2.0
*/
public class WebflowNavigatorContentProvider implements ICommonContentProvider,
IWebflowModelListener {
private String providerID;
private StructuredViewer viewer;
public void init(ICommonContentExtensionSite config) {
providerID = config.getExtension().getId();
Activator.getModel().registerModelChangeListener(this);
}
public void saveState(IMemento aMemento) {
}
public void restoreState(IMemento aMemento) {
}
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof ISpringProject) {
if (hasChildren(parentElement)) {
return new Object[] { Activator.getModel().getProject(
((ISpringProject) parentElement).getProject()) };
}
}
else if (parentElement instanceof IWebflowProject) {
return WebflowModelUtils.getFiles(
((IWebflowProject) parentElement).getProject()).toArray();
}
else if (parentElement instanceof IFile) {
IFile file = (IFile) parentElement;
if (WebflowModelUtils.isWebflowConfig(file)) {
return new Object[] { WebflowModelUtils.getWebflowConfig(file) };
}
}
else if (parentElement instanceof IWebflowConfig) {
List<Object> children = new ArrayList<Object>();
for (IModelElement config : ((IWebflowConfig) parentElement)
.getBeansConfigs()) {
if (config instanceof IBeansConfig) {
children.add(((IBeansConfig) config).getElementResource());
}
else {
children.add(config);
}
}
return children.toArray();
}
return IModelElement.NO_CHILDREN;
}
public Object getParent(Object element) {
if (element instanceof IWebflowModelElement) {
return ((IWebflowModelElement) element).getElementParent();
}
else if (element instanceof IFile
&& WebflowModelUtils.isWebflowConfig((IFile) element)) {
return WebflowModelUtils.getWebflowConfig(((IFile) element))
.getProject();
}
else if (element instanceof IWebflowProject) {
return SpringCore.getModel().getProject(
((IWebflowProject) element).getProject());
}
return null;
}
public boolean hasChildren(Object element) {
if (element instanceof ISpringProject) {
return Activator.getModel().getProject(
((ISpringProject) element).getProject()).getConfigs()
.size() > 0;
}
else if (element instanceof IWebflowProject) {
return ((IWebflowProject) element).getConfigs().size() > 0;
}
else if (element instanceof IFile) {
IFile file = (IFile) element;
return WebflowModelUtils.isWebflowConfig(file);
}
else if (element instanceof IWebflowConfig) {
IWebflowConfig config = (IWebflowConfig) element;
if (config.getBeansConfigs() != null
&& config.getBeansConfigs().size() > 0) {
return true;
}
}
return false;
}
public Object[] getElements(Object inputElement) {
return IModelElement.NO_CHILDREN;
}
public void dispose() {
Activator.getModel().removeModelChangeListener(this);
}
public void modelChanged(IWebflowProject project) {
if (project != null) {
IProject p = project.getProject();
if (org.springframework.ide.eclipse.webflow.ui.Activator.PROJECT_EXPLORER_CONTENT_PROVIDER_ID
.equals(providerID)) {
refreshViewerForElement(p);
refreshViewerForElement(JdtUtils.getJavaProject(p));
}
else if (org.springframework.ide.eclipse.webflow.ui.Activator.SPRING_EXPLORER_CONTENT_PROVIDER_ID
.equals(providerID)) {
refreshViewerForElement(SpringCore.getModel().getProject(p));
}
}
}
public final void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
if (viewer instanceof StructuredViewer) {
this.viewer = (StructuredViewer) viewer;
if (oldInput == null && newInput != null) {
Activator.getModel().registerModelChangeListener(this);
}
else if (oldInput != null && newInput == null) {
Activator.getModel().removeModelChangeListener(this);
}
}
else {
this.viewer = null;
}
}
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 IWebflowModel) {
viewer.refresh();
}
else {
viewer.refresh(element);
}
}
});
}
}
}
@Override
public String toString() {
return String.valueOf(providerID);
}
}