| /******************************************************************************* |
| * 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; |
| } |
| } |
| } |