/* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.activiti.designer.eclipse.navigator.project; import java.util.ArrayList; import java.util.List; import org.activiti.designer.eclipse.navigator.AbstractTreeContentProvider; import org.activiti.designer.eclipse.navigator.TreeNode; import org.activiti.designer.util.ActivitiConstants; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.ui.progress.UIJob; /** * @author Tiese Barrell */ public class ProjectTreeContentProvider extends AbstractTreeContentProvider { public ProjectTreeContentProvider() { super(); } @Override public Object[] getElements(Object inputElement) { return getChildren(inputElement); } @Override public Object getParent(Object element) { if (element instanceof TreeNode) { TreeNode data = (TreeNode) element; return data.getParent(); } return null; } @Override protected boolean hasChildrenForElement(final Object element) { if (element instanceof IProject) { return isActivitiProject((IProject) element); } return false; } @Override protected Object[] getChildrenForElement(final Object parentElement) { Object[] result = null; if (parentElement instanceof IProject) { final IProject project = (IProject) parentElement; if (isActivitiProject(project)) { result = getDataArray(project); if (result == null && !updateModel(project).isEmpty()) { result = getDataArray(project); } } } return result; } private Object[] getDataArray(final IProject project) { Object[] result = null; final List<TreeNode> projectTreeData = getCachedChildrenForResource(project); if (projectTreeData != null) { result = getChildrenAsArray(projectTreeData.get(0)); } return result; } @Override public boolean visit(final IResourceDelta delta) throws CoreException { IResource source = delta.getResource(); switch (source.getType()) { case IResource.ROOT: case IResource.PROJECT: final IProject project = (IProject) source; if (isActivitiProject(project)) { updateModel(project); new UIJob("Update Project Model in CommonViewer") { //$NON-NLS-1$ @Override public IStatus runInUIThread(IProgressMonitor monitor) { if (getStructuredViewer() != null && !getStructuredViewer().getControl().isDisposed()) { getStructuredViewer().refresh(project); } return Status.OK_STATUS; } }.schedule(); } return false; case IResource.FOLDER: return true; case IResource.FILE: } return false; } private boolean isActivitiProject(final IProject project) { boolean result = false; try { result = project.hasNature(ActivitiConstants.NATURE_ID); } catch (CoreException e) { // no-op } return result; } /** * Load the model from the given project, if possible. * * @param project * The IProject to get the model for */ private synchronized List<TreeNode> updateModel(IProject project) { List<TreeNode> model = new ArrayList<TreeNode>(); if (isActivitiProject(project)) { if (project.exists()) { model = new ArrayList<TreeNode>(); model.add(ProjectTreeNodeFactory.createProcessesNode(project)); addModelToCache(project, model); return model; } else { removeModelFromCache(project); } } return model; } }