blob: d31e5cd294417fa548af2b223eab2e5aaa730936 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 xored software, Inc. and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* xored software, Inc. - initial API and Implementation
*******************************************************************************/
package org.eclipse.dltk.internal.core.caching;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.dltk.core.DLTKLanguageManager;
import org.eclipse.dltk.core.ElementChangedEvent;
import org.eclipse.dltk.core.IElementChangedListener;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IModelElementDelta;
import org.eclipse.dltk.core.IProjectFragment;
import org.eclipse.dltk.core.IScriptFolder;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ISourceModule;
public abstract class ModelCacheListener implements IResourceChangeListener,
IElementChangedListener {
protected void remove(ISourceModule module) {
}
protected void remove(IScriptProject element) {
}
protected void remove(IScriptFolder element) {
}
protected void remove(IProject element) {
}
protected void remove(IProjectFragment element) {
}
@Override
public void elementChanged(ElementChangedEvent event) {
IModelElementDelta delta = event.getDelta();
processDelta(delta);
}
private void processDelta(IModelElementDelta delta) {
IModelElement element = delta.getElement();
if (delta.getKind() == IModelElementDelta.REMOVED
|| delta.getKind() == IModelElementDelta.CHANGED
|| (delta.getFlags() & IModelElementDelta.F_REMOVED_FROM_BUILDPATH) != 0
|| (delta.getFlags() & IModelElementDelta.CHANGED) != 0) {
if (element.getElementType() != IModelElement.SOURCE_MODULE
&& element.getElementType() != IModelElement.PROJECT_FRAGMENT
&& element.getElementType() != IModelElement.SCRIPT_FOLDER
&& element.getElementType() != IModelElement.SCRIPT_MODEL
&& element.getElementType() != IModelElement.SCRIPT_PROJECT) {
ISourceModule module = (ISourceModule) element
.getAncestor(IModelElement.SOURCE_MODULE);
remove(module);
}
if (element.getElementType() == IModelElement.SOURCE_MODULE) {
remove((ISourceModule) element);
}
}
if (element.getElementType() == IModelElement.SCRIPT_PROJECT
&& delta.getKind() == IModelElementDelta.CHANGED
&& (delta.getFlags() & IModelElementDelta.F_BUILDPATH_CHANGED) != 0) {
remove((IScriptProject) element);
return;
}
if ((delta.getFlags() & IModelElementDelta.F_CHILDREN) != 0) {
IModelElementDelta[] affectedChildren = delta.getAffectedChildren();
for (int i = 0; i < affectedChildren.length; i++) {
IModelElementDelta child = affectedChildren[i];
processDelta(child);
}
} else if ((delta.getKind() == IModelElementDelta.REMOVED || delta
.getKind() == IModelElementDelta.CHANGED)
&& element.getElementType() == IModelElement.SCRIPT_FOLDER) {
if (delta.getAffectedChildren().length == 0) {
remove((IScriptFolder) element);
}
} else if ((delta.getKind() == IModelElementDelta.REMOVED || delta
.getKind() == IModelElementDelta.CHANGED)
&& element.getElementType() == IModelElement.PROJECT_FRAGMENT) {
if (delta.getAffectedChildren().length == 0) {
remove((IProjectFragment) element);
}
}
}
@Override
public void resourceChanged(IResourceChangeEvent event) {
int eventType = event.getType();
IResource resource = event.getResource();
// IResourceDelta delta = event.getDelta();
switch (eventType) {
case IResourceChangeEvent.PRE_DELETE:
if (resource.getType() == IResource.PROJECT
&& DLTKLanguageManager.hasScriptNature((IProject) resource)) {
remove((IProject) resource);
}
return;
}
}
}