/* Soot - a J*va Optimization Framework
* Copyright (C) 2003 Jennifer Lhotak
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
package ca.mcgill.sable.soot.resources;
import java.util.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.ITextListener;
import org.eclipse.jface.text.TextEvent;
import org.eclipse.jface.text.TextPresentation;
import ca.mcgill.sable.soot.attributes.SootAttributesHandler;
public class SootResourceManager implements IResourceChangeListener, ITextListener {
private static final String JAVA_FILE_EXT = Messages.getString("SootResourceManager.java"); //$NON-NLS-1$
public static final String JIMPLE_FILE_EXT = Messages.getString("SootResourceManager.jimple"); //$NON-NLS-1$
private static final int SOOT_RAN_BIT = 1;
private static final int CHANGED_BIT = 0;
private HashMap filesWithAttributes;
private HashMap changedResources;
private HashMap colorList;
public SootResourceManager() {
ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
}
public void textChanged(TextEvent e){
}
public void updateSootRanFlag(){
if (getChangedResources() == null) return;
Iterator it = getChangedResources().keySet().iterator();
while (it.hasNext()){
BitSet bits = (BitSet)getChangedResources().get(it.next());
bits.set(SOOT_RAN_BIT);
bits.clear(CHANGED_BIT);
}
setColorList(null);
}
public void updateFileChangedFlag(IFile file){
if (file.getFileExtension() == null) return;
if ((file.getFileExtension().equals(JAVA_FILE_EXT)) ||
(file.getFileExtension().equals(JIMPLE_FILE_EXT))){
if (getChangedResources() == null){
addToLists(file);
}
else if (getChangedResources().get(file) == null){
addToLists(file);
}
((BitSet)getChangedResources().get(file)).set(CHANGED_BIT);
}
}
public void clearColors(){
// clear colors
if (getColorList() != null){
Iterator it = getColorList().keySet().iterator();
while (it.hasNext()){
((TextPresentation)getColorList().get(it.next())).clear();
}
}
}
public boolean isFileMarkersUpdate(IFile file){
if (getChangedResources() == null) return false;
if (getChangedResources().get(file) == null) return false;
return ((BitSet)getChangedResources().get(file)).get(SOOT_RAN_BIT);
}
public void setToFalseUpdate(IFile file){
if (getChangedResources() == null) return;
if (getChangedResources().get(file) == null) return;
((BitSet)getChangedResources().get(file)).clear(SOOT_RAN_BIT);
}
public void setToFalseRemove(IFile file){
if (getChangedResources() == null) return;
if (getChangedResources().get(file) == null) return;
((BitSet)getChangedResources().get(file)).clear(CHANGED_BIT);
}
public boolean isFileMarkersRemove(IFile file){
if (getChangedResources() == null) return false;
if (getChangedResources().get(file) == null) return false;
return ((BitSet)getChangedResources().get(file)).get(CHANGED_BIT);
}
public void addToLists(IResource res){
if (res instanceof IFile){
IFile file = (IFile)res;
if ((file.getFileExtension().equals(JAVA_FILE_EXT)) ||
(file.getFileExtension().equals(JIMPLE_FILE_EXT))){
if (getChangedResources() == null){
setChangedResources(new HashMap());
}
getChangedResources().put(file, new BitSet(2));
}
}
}
/* (non-Javadoc)
* @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
*/
public void resourceChanged(IResourceChangeEvent event) {
switch(event.getType()){
case IResourceChangeEvent.POST_CHANGE:{
try {
event.getDelta().accept(new SootDeltaVisitor());
}
catch (CoreException e){
}
break;
}
}
}
public HashMap getChangedResources() {
return changedResources;
}
/**
* @param map
*/
public void setChangedResources(HashMap map) {
changedResources = map;
}
public void addToFileWithAttributes(IFile file, SootAttributesHandler handler){
if (getFilesWithAttributes() == null){
setFilesWithAttributes(new HashMap());
}
getFilesWithAttributes().put(file, handler);
}
public SootAttributesHandler getAttributesHandlerForFile(IFile file){
if (getFilesWithAttributes() == null) {
return null;
}
else return (SootAttributesHandler)getFilesWithAttributes().get(file);
}
// colors
public void addToColorList(IFile file, TextPresentation tp){
if (getColorList() == null){
setColorList(new HashMap());
}
getColorList().put(file, tp);
}
public boolean alreadyOnColorList(IFile file){
if (getColorList() == null) return false;
else return getColorList().containsKey(file);
}
/**
* @return
*/
public HashMap getFilesWithAttributes() {
return filesWithAttributes;
}
/**
* @param map
*/
public void setFilesWithAttributes(HashMap map) {
filesWithAttributes = map;
}
/**
* @return
*/
public HashMap getColorList() {
return colorList;
}
/**
* @param map
*/
public void setColorList(HashMap map) {
colorList = map;
}
}