/* 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.diagram;
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.IFile;
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 DiagramTreeContentProvider extends AbstractTreeContentProvider {
public DiagramTreeContentProvider() {
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;
}
private boolean isDiagramFile(IFile modelFile) {
return ActivitiConstants.DATA_FILE_EXTENSION_RAW.equals(modelFile.getFileExtension());
}
@Override
protected boolean hasChildrenForElement(final Object element) {
if (element instanceof IFile) {
return isDiagramFile((IFile) element);
}
return false;
}
@Override
protected Object[] getChildrenForElement(final Object parentElement) {
Object[] result = null;
if (parentElement instanceof IFile) {
/* Possible model file */
final IFile modelFile = (IFile) parentElement;
if (isDiagramFile(modelFile)) {
result = getDataArray(modelFile);
if (result == null && !updateModel(modelFile).isEmpty()) {
result = getDataArray(modelFile);
}
}
}
return result;
}
private Object[] getDataArray(final IFile modelFile) {
Object[] result = null;
final List<TreeNode> diagramTreeData = getCachedChildrenForResource(modelFile);
if (diagramTreeData != null) {
result = getChildrenAsArray(diagramTreeData.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:
case IResource.FOLDER:
return true;
case IResource.FILE:
final IFile file = (IFile) source;
if (isDiagramFile(file)) {
updateModel(file);
new UIJob("Update Process Model in CommonViewer") { //$NON-NLS-1$
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
if (getStructuredViewer() != null && !getStructuredViewer().getControl().isDisposed()) {
getStructuredViewer().refresh(file);
}
return Status.OK_STATUS;
}
}.schedule();
}
return false;
}
return false;
}
/**
* Load the model from the given file, if possible.
*
* @param modelFile
* The IFile which contains the persisted model
*/
private synchronized List<TreeNode> updateModel(IFile modelFile) {
List<TreeNode> model = new ArrayList<TreeNode>();
if (isDiagramFile(modelFile)) {
if (modelFile.exists()) {
model = new ArrayList<TreeNode>();
model.add(DiagramTreeNodeFactory.createModelFileNode(modelFile));
addModelToCache(modelFile, model);
return model;
} else {
removeModelFromCache(modelFile);
}
}
return model;
}
}