| /******************************************************************************* |
| * Copyright (c) 2005 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.bpel.common.ui.editmodel; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IMarkerDelta; |
| import org.eclipse.core.resources.IResourceChangeEvent; |
| import org.eclipse.core.resources.IResourceChangeListener; |
| import org.eclipse.core.resources.IResourceDelta; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.swt.widgets.Display; |
| /** |
| * A eclipse resource listener used by the shared resource framework |
| * to support updating/reloading the model, informing the user, or closing the editor |
| * when a resource is changed by another editor kind or outside the |
| * workspace. |
| * |
| * Internal - Should not be used by clients. |
| */ |
| class ResourceListener implements IResourceChangeListener { |
| |
| ResourceInfo fModelInfo; |
| |
| IFile fFile; |
| |
| /** |
| * |
| */ |
| |
| static Runner runner = new Runner ( ) { |
| public void run(Runnable runnable) { |
| Display.getDefault().asyncExec(runnable); |
| } |
| }; |
| |
| |
| protected ResourceListener (ResourceInfo modelInfo,IFile fileResource) { |
| this.fModelInfo = modelInfo; |
| this.fFile = fileResource; |
| } |
| |
| /** |
| * This method can be called if the file for a ResourceInfo changes. |
| * @param file |
| */ |
| |
| public void setFile(IFile file) { |
| this.fFile = file; |
| } |
| |
| /** (non-Javadoc) |
| * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) |
| */ |
| |
| public void resourceChanged (IResourceChangeEvent e) { |
| |
| IResourceDelta delta = e.getDelta(); |
| |
| if (delta != null) { |
| delta = delta.findMember(fFile.getFullPath()); |
| } |
| |
| if (delta != null) { |
| switch (delta.getKind()) { |
| |
| case IResourceDelta.CHANGED: |
| if ((delta.getFlags() & IResourceDelta.CONTENT) != 0) { |
| if (!isDirty()) |
| fireModelRefresh(); |
| } |
| |
| if ((delta.getFlags() & IResourceDelta.MARKERS) != 0) { |
| fireMarkerChange( delta.getMarkerDeltas() ); |
| } |
| break; |
| |
| case IResourceDelta.REMOVED: |
| if ((delta.getFlags() & IResourceDelta.MOVED_TO) != 0) { |
| fireModelMoved(delta.getMovedToPath()); |
| } else if (!isDirty()) { |
| fireModelDeleted(); |
| } |
| break; |
| } |
| } |
| } |
| |
| private void fireMarkerChange ( final IMarkerDelta [] delta ) { |
| Runnable runnable = new Runnable () { |
| public void run() { |
| fModelInfo.markersChanged( delta ); |
| } |
| }; |
| run(runnable); |
| } |
| |
| |
| private void fireModelRefresh() { |
| Runnable runnable = new Runnable() { |
| public void run() { |
| fModelInfo.refresh(); |
| } |
| }; |
| run(runnable); |
| } |
| |
| private void fireModelMoved(final IPath path) { |
| Runnable runnable = new Runnable() { |
| public void run() { |
| IFile movedTofile = ResourcesPlugin.getWorkspace().getRoot().getFile(path); |
| if (fFile == null) { |
| return; |
| } |
| fModelInfo.move(movedTofile); |
| fFile = movedTofile; |
| } |
| }; |
| |
| run(runnable); |
| } |
| |
| private void fireModelDeleted() { |
| Runnable runnable = new Runnable() { |
| public void run() { |
| fModelInfo.deleted(); |
| fModelInfo.dispose(); |
| } |
| }; |
| run(runnable); |
| } |
| protected boolean isDirty() { |
| // if we are not initialized we are not dirty |
| if (fModelInfo.getResource() == null) |
| return false; |
| return fModelInfo.getResource().isModified(); |
| } |
| |
| /** |
| * Run the runnable. |
| * @param runnable |
| */ |
| public void run(Runnable runnable) { |
| if(runner == null) { |
| runnable.run(); |
| } else { |
| runner.run(runnable); |
| } |
| } |
| |
| |
| interface Runner { |
| /** |
| * @param runnable |
| */ |
| void run(Runnable runnable); |
| } |
| } |