| /******************************************************************************* |
| * Copyright (c) 2003, 2006 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 |
| *******************************************************************************/ |
| package org.eclipse.jst.j2ee.navigator.internal; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.runtime.jobs.ISchedulingRule; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.edit.provider.ItemProvider; |
| import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; |
| import org.eclipse.jem.util.emf.workbench.ProjectUtilities; |
| import org.eclipse.jface.viewers.AbstractTreeViewer; |
| import org.eclipse.jface.viewers.ITreeContentProvider; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jst.j2ee.internal.ejb.provider.BeanClassProviderHelper; |
| import org.eclipse.jst.j2ee.internal.ejb.provider.J2EEJavaClassProviderHelper; |
| import org.eclipse.jst.j2ee.internal.provider.MethodsProviderDelegate; |
| import org.eclipse.jst.j2ee.navigator.internal.EMFRootObjectProvider.IRefreshHandlerListener; |
| import org.eclipse.jst.j2ee.navigator.internal.plugin.J2EENavigatorPlugin; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.ui.navigator.CommonViewer; |
| import org.eclipse.ui.progress.UIJob; |
| import org.eclipse.wst.common.internal.emfworkbench.integration.DynamicAdapterFactory; |
| |
| /** |
| * <p> |
| * The following class is experimental until fully documented. |
| * </p> |
| */ |
| public class J2EEContentProvider implements ITreeContentProvider, IRefreshHandlerListener { |
| |
| private final EMFRootObjectProvider rootObjectProvider; |
| |
| private AdapterFactoryContentProvider delegateContentProvider; |
| private MethodsProviderDelegate delegateMethodsProvider; |
| |
| private String viewerId = null; |
| private AbstractTreeViewer viewer; |
| |
| /** |
| * |
| */ |
| public J2EEContentProvider() { |
| rootObjectProvider = new EMFRootObjectProvider(); |
| rootObjectProvider.addRefreshHandlerListener(this); |
| } |
| |
| /** |
| * |
| */ |
| public J2EEContentProvider(String aViewerId) { |
| rootObjectProvider = new EMFRootObjectProvider(); |
| updateContentProviders(aViewerId); |
| rootObjectProvider.addRefreshHandlerListener(this); |
| } |
| |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) |
| */ |
| public Object[] getElements(Object anInputElement) { |
| return getChildren(anInputElement); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getChildren(java.lang.Object) |
| */ |
| public Object[] getChildren(Object aParentElement) { |
| IProject project = null; |
| List children = new ArrayList(); |
| if (aParentElement instanceof IAdaptable && !(aParentElement instanceof EObject) && !(aParentElement instanceof ItemProvider) |
| && !(aParentElement instanceof J2EEJavaClassProviderHelper)) { |
| project = ProjectUtilities.getProject(aParentElement); |
| |
| if (project != null) { |
| // Verify if the model *is being* |
| // loaded and just return the place holder |
| if (LoadingDDNode.isBeingLoaded(project)) { |
| children.add(LoadingDDNode.createPlaceHolder(project)); |
| |
| // Verify if the model has been loaded, just return it |
| } else if (rootObjectProvider.hasLoadedModels(project)) { |
| /* model already loaded, just return the model */ |
| children.addAll(Arrays.asList(rootObjectProvider.getModels(project))); |
| |
| // Otherwise return a place holder node and start loading |
| // job |
| } else { |
| LoadingDDNode placeHolder = LoadingDDNode.createPlaceHolder(project); |
| /* |
| * we need to load the model; possible long running |
| * operation |
| */ |
| if (LoadingDDNode.canBeginLoading(project)) |
| new LoadingDDJob(viewer, placeHolder, (IAdaptable) aParentElement, rootObjectProvider).schedule(); |
| children.add(placeHolder); |
| } |
| |
| } |
| } else if (MethodsProviderDelegate.providesContentFor(aParentElement)) |
| return delegateMethodsProvider.getChildren(aParentElement); |
| else /* if (isEMFEditObject(aParentElement)) */{ |
| Object[] siblings = null; |
| try { |
| siblings = delegateContentProvider.getChildren(aParentElement); |
| } catch (Exception e) { |
| J2EENavigatorPlugin.logError(0, e.getMessage(), e); } |
| if (siblings != null) |
| children.addAll(Arrays.asList(siblings)); |
| } |
| return children.toArray(); |
| } |
| |
| public Object getParent(Object object) { |
| if (MethodsProviderDelegate.providesContentFor(object)) |
| return delegateMethodsProvider.getParent(object); |
| Object parent = delegateContentProvider.getParent(object); |
| if(parent instanceof Resource) { |
| parent = ProjectUtilities.getProject((EObject) object); |
| } else if (parent == null) { |
| if(object instanceof BeanClassProviderHelper) |
| parent = ((BeanClassProviderHelper) object).getEjb(); |
| else if (object instanceof EObject) { |
| parent = ProjectUtilities.getProject((EObject) object); |
| } |
| } |
| return parent; |
| } |
| |
| /** |
| * @see org.eclipse.jface.viewers.IContentProvider#dispose() |
| */ |
| public void dispose() { |
| rootObjectProvider.removeRefreshHandlerListener(this); |
| delegateContentProvider.dispose(); |
| rootObjectProvider.dispose(); |
| delegateMethodsProvider.dispose(); |
| |
| } |
| |
| /* |
| * @see ITreeContentProvider#hasChildren(Object) |
| */ |
| public boolean hasChildren(Object element) { |
| if (MethodsProviderDelegate.providesContentFor(element)) |
| return delegateMethodsProvider.hasChildren(element); |
| /* else if (isEMFEditObject(element)) */ |
| if(element instanceof ItemProvider) |
| return true; |
| return delegateContentProvider.hasChildren(element); |
| |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, |
| * java.lang.Object, java.lang.Object) |
| */ |
| public void inputChanged(Viewer aViewer, Object anOldInput, Object aNewInput) { |
| String newViewerId = null; |
| viewer = (AbstractTreeViewer) aViewer; |
| if (aViewer instanceof CommonViewer) |
| newViewerId = ((CommonViewer) aViewer).getNavigatorContentService().getViewerId(); |
| |
| if (newViewerId != null && (viewerId == null || !viewerId.equals(newViewerId))) |
| updateContentProviders(newViewerId); |
| |
| delegateContentProvider.inputChanged(aViewer, anOldInput, aNewInput); |
| delegateMethodsProvider.inputChanged(aViewer, anOldInput, aNewInput); |
| } |
| |
| /** |
| * @param viewerId2 |
| */ |
| private void updateContentProviders(String aViewerId) { |
| |
| /* Dispose of the existing content providers */ |
| if (delegateContentProvider != null) |
| delegateContentProvider.dispose(); |
| if (delegateMethodsProvider != null) |
| delegateMethodsProvider.dispose(); |
| |
| /* Create new content providers using the new viewer id */ |
| DynamicAdapterFactory adapterFactory = new DynamicAdapterFactory(aViewerId); |
| delegateContentProvider = new AdapterFactoryContentProvider(adapterFactory); |
| delegateMethodsProvider = new MethodsProviderDelegate(adapterFactory); |
| |
| /* Remember the viewer id */ |
| viewerId = aViewerId; |
| |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jst.j2ee.navigator.internal.EMFRootObjectManager.IRefreshHandlerListener#onRefresh(java.lang.Object) |
| */ |
| public void onRefresh(final Object element) { |
| if (Display.getCurrent() != null) { |
| (viewer).refresh(element, true); |
| } else { |
| /* Create and schedule a UI Job to update the Navigator Content Viewer */ |
| Job job = new UIJob("Update the Navigator Content Viewer Job") { //$NON-NLS-1$ |
| @Override |
| public IStatus runInUIThread(IProgressMonitor monitor) { |
| (viewer).refresh(element, true); |
| return Status.OK_STATUS; |
| } |
| }; |
| ISchedulingRule rule = new ISchedulingRule() { |
| public boolean contains(ISchedulingRule rule) { |
| return rule == this; |
| } |
| public boolean isConflicting(ISchedulingRule rule) { |
| return rule == this; |
| } |
| }; |
| job.setRule(rule); |
| job.schedule(); |
| } |
| } |
| |
| } |