/*******************************************************************************
* Copyright (c) 2009 University of Edinburgh.
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the BSD Licence, which accompanies this feature
* and can be downloaded from http://groups.inf.ed.ac.uk/pepa/update/licence.txt
******************************************************************************/
package uk.ac.ed.inf.biopepa.ui;
import java.util.*;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import uk.ac.ed.inf.biopepa.ui.editors.BioPEPAEditor;
import uk.ac.ed.inf.biopepa.ui.interfaces.BioPEPAModel;
public class BioPEPAManager {
public static boolean isValidBioPEPAFile(IResource resource) {
if (resource == null)
return false;
return (resource.getType() == IResource.FILE && resource.getFileExtension().equals("biopepa"));
}
private Map<IResource, BioPEPAModel> map = new HashMap<IResource, BioPEPAModel>();
private Map<BioPEPAModel, Integer> editorCount = new HashMap<BioPEPAModel, Integer>();
private IResourceChangeListener resourceListener = new IResourceChangeListener() {
public void resourceChanged(IResourceChangeEvent event) {
try {
IResourceDelta resourceDelta = event.getDelta();
if (resourceDelta == null)
return;
resourceDelta.accept(new IResourceDeltaVisitor() {
public boolean visit(IResourceDelta delta)
throws CoreException {
if (!isValidBioPEPAFile(delta.getResource())) {
return true;
}
switch (delta.getKind()) {
case IResourceDelta.ADDED:
break;
case IResourceDelta.REMOVED:
if(map.containsKey(delta.getResource()))
map.remove(delta.getResource()).dispose();
break;
case IResourceDelta.CONTENT:
case IResourceDelta.CHANGED:
// only interested in content change (not markers)
if ((delta.getFlags() & IResourceDelta.CONTENT) == 0)
break;
if (map.containsKey(delta.getResource()))
map.get(delta.getResource()).parse();
break;
default:
break;
}
return true;
}
});
} catch (CoreException e) {
e.printStackTrace();
}
}
};
BioPEPAManager() {
ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceListener, IResourceChangeEvent.PRE_BUILD | IResourceChangeEvent.PRE_CLOSE);
}
public void editorOpened(BioPEPAEditor editor) {
BioPEPAModel model = editor.getModel();
Integer count = editorCount.get(model);
if(count == null)
editorCount.put(model, 1);
else
editorCount.put(model, count + 1);
}
public void editorClosed(BioPEPAEditor editor) {
BioPEPAModel model = editor.getModel();
Integer count = editorCount.get(model);
if(count == 1) {
editorCount.remove(model);
IResource resource = null;
for(Map.Entry<IResource, BioPEPAModel> me : map.entrySet())
if(me.getValue() == model) {
resource = me.getKey();
break;
}
map.remove(resource);
model.dispose();
} else {
editorCount.put(model, count - 1);
}
}
public BioPEPAModel getModel(IResource resource) {
if (resource == null || !resource.exists())
return null;
BioPEPAModel model = map.get(resource);
if (model == null && isValidBioPEPAFile(resource)) {
try {
model = new BioPEPAModelImpl(resource);
map.put(resource, model);
model.parse();
} catch (Exception e) {
e.printStackTrace();
}
}
return model;
}
public void shutdown() {
for(BioPEPAModel model : map.values())
model.dispose();
ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceListener);
}
}