Skip to content
Snippets Groups Projects
Commit c97a40c1 authored by Florian Hölzl's avatar Florian Hölzl
Browse files

bugfix: automatic reload of disk changes works properly now.

parent 8a69c699
No related branches found
No related tags found
No related merge requests found
...@@ -32,7 +32,6 @@ import org.eclipse.emf.ecore.EObject; ...@@ -32,7 +32,6 @@ import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.Saveable; import org.eclipse.ui.Saveable;
import org.eclipse.ui.part.ViewPart;
import org.fortiss.tooling.kernel.ToolingKernelActivator; import org.fortiss.tooling.kernel.ToolingKernelActivator;
import org.fortiss.tooling.kernel.interfaces.ITopLevelElementChangeListener; import org.fortiss.tooling.kernel.interfaces.ITopLevelElementChangeListener;
import org.fortiss.tooling.kernel.interfaces.ITopLevelElementContext; import org.fortiss.tooling.kernel.interfaces.ITopLevelElementContext;
...@@ -47,7 +46,7 @@ import org.fortiss.tooling.kernel.ui.util.EObjectSelectionUtils; ...@@ -47,7 +46,7 @@ import org.fortiss.tooling.kernel.ui.util.EObjectSelectionUtils;
* @author hoelzl * @author hoelzl
* @author $Author$ * @author $Author$
* @version $Rev$ * @version $Rev$
* @ConQAT.Rating YELLOW Hash: B7F899DC2CFB74320D2F7A19A2D5FEBB * @ConQAT.Rating YELLOW Hash: FB5662C65C21DF94B8E8D3C1F25DC679
*/ */
public class NavigatorService implements INavigatorService, public class NavigatorService implements INavigatorService,
ITopLevelElementChangeListener, CommandStackListener { ITopLevelElementChangeListener, CommandStackListener {
...@@ -73,12 +72,6 @@ public class NavigatorService implements INavigatorService, ...@@ -73,12 +72,6 @@ public class NavigatorService implements INavigatorService,
this.navigatorViewPart = part; this.navigatorViewPart = part;
} }
/** {@inheritDoc} */
@Override
public ViewPart getNavigatorView() {
return navigatorViewPart;
}
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public ISelection getCurrentSelection() { public ISelection getCurrentSelection() {
...@@ -91,7 +84,7 @@ public class NavigatorService implements INavigatorService, ...@@ -91,7 +84,7 @@ public class NavigatorService implements INavigatorService,
public void topLevelElementAdded(ITopLevelElementContext context) { public void topLevelElementAdded(ITopLevelElementContext context) {
context.addCommandStackListener(this); context.addCommandStackListener(this);
saveables.put(context, new TopLevelElementSaveable(context)); saveables.put(context, new TopLevelElementSaveable(context));
navigatorViewPart.refresh(); refresh();
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
...@@ -99,12 +92,18 @@ public class NavigatorService implements INavigatorService, ...@@ -99,12 +92,18 @@ public class NavigatorService implements INavigatorService,
public void topLevelElementRemoved(ITopLevelElementContext context) { public void topLevelElementRemoved(ITopLevelElementContext context) {
context.removeCommandStackListener(this); context.removeCommandStackListener(this);
saveables.remove(context); saveables.remove(context);
navigatorViewPart.refresh(); refresh();
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public void commandStackChanged(EventObject event) { public void commandStackChanged(EventObject event) {
refresh();
}
/** {@inheritDoc} */
@Override
public void refresh() {
navigatorViewPart.refresh(); navigatorViewPart.refresh();
} }
......
...@@ -109,6 +109,8 @@ public final class NavigatorViewPart extends ViewPart implements ...@@ -109,6 +109,8 @@ public final class NavigatorViewPart extends ViewPart implements
} }
IActionService.INSTANCE.refresh(); IActionService.INSTANCE.refresh();
viewer.refresh(); viewer.refresh();
firePropertyChange(IWorkbenchPartConstants.PROP_DIRTY);
return Status.OK_STATUS; return Status.OK_STATUS;
} }
}; };
...@@ -298,11 +300,7 @@ public final class NavigatorViewPart extends ViewPart implements ...@@ -298,11 +300,7 @@ public final class NavigatorViewPart extends ViewPart implements
/** Refreshes the navigator view. */ /** Refreshes the navigator view. */
public void refresh() { public void refresh() {
if (INavigatorService.INSTANCE.getNavigatorView() != this) {
return;
}
updateUI.schedule(); updateUI.schedule();
firePropertyChange(IWorkbenchPartConstants.PROP_DIRTY);
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
......
...@@ -20,7 +20,6 @@ package org.fortiss.tooling.kernel.ui.services; ...@@ -20,7 +20,6 @@ package org.fortiss.tooling.kernel.ui.services;
import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.Saveable; import org.eclipse.ui.Saveable;
import org.eclipse.ui.part.ViewPart;
import org.fortiss.tooling.kernel.ui.internal.NavigatorService; import org.fortiss.tooling.kernel.ui.internal.NavigatorService;
/** /**
...@@ -29,7 +28,7 @@ import org.fortiss.tooling.kernel.ui.internal.NavigatorService; ...@@ -29,7 +28,7 @@ import org.fortiss.tooling.kernel.ui.internal.NavigatorService;
* @author hoelzl * @author hoelzl
* @author $Author$ * @author $Author$
* @version $Rev$ * @version $Rev$
* @ConQAT.Rating YELLOW Hash: 3C201DC07138A2C1A15C710F8A81A242 * @ConQAT.Rating YELLOW Hash: E84D4BEC9A2F32EAF84A8FDCF21EE3F4
*/ */
public interface INavigatorService { public interface INavigatorService {
/** Returns the singleton instance of the service. */ /** Returns the singleton instance of the service. */
...@@ -38,12 +37,6 @@ public interface INavigatorService { ...@@ -38,12 +37,6 @@ public interface INavigatorService {
/** Returns view id of the navigator view. */ /** Returns view id of the navigator view. */
public static final String NAVIGATOR_VIEW = "org.fortiss.tooling.kernel.model.navigator"; public static final String NAVIGATOR_VIEW = "org.fortiss.tooling.kernel.model.navigator";
/**
* Returns the navigator view part. May return <code>null</code> if
* navigator has not yet been created or has already been disposed.
*/
ViewPart getNavigatorView();
/** Returns the current naviaator selection. */ /** Returns the current naviaator selection. */
ISelection getCurrentSelection(); ISelection getCurrentSelection();
...@@ -55,4 +48,7 @@ public interface INavigatorService { ...@@ -55,4 +48,7 @@ public interface INavigatorService {
/** Reveals the given model element. */ /** Reveals the given model element. */
void revealModelElement(EObject modelElement); void revealModelElement(EObject modelElement);
/** Refreshes the navigator view part. */
void refresh();
} }
...@@ -32,8 +32,12 @@ import org.eclipse.core.resources.IResourceChangeListener; ...@@ -32,8 +32,12 @@ import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EObject;
import org.fortiss.tooling.kernel.ToolingKernelActivator; import org.fortiss.tooling.kernel.ToolingKernelActivator;
import org.fortiss.tooling.kernel.interfaces.IEclipseResourceStorageLocationProvider; import org.fortiss.tooling.kernel.interfaces.IEclipseResourceStorageLocationProvider;
...@@ -51,7 +55,7 @@ import org.osgi.framework.Bundle; ...@@ -51,7 +55,7 @@ import org.osgi.framework.Bundle;
* @author hoelzlf * @author hoelzlf
* @author $Author$ * @author $Author$
* @version $Rev$ * @version $Rev$
* @ConQAT.Rating YELLOW Hash: B8363ADD63E4E6D34D97577B26670CEB * @ConQAT.Rating YELLOW Hash: E6C694CF323750F7A6415B755FAC5522
*/ */
public class EclipseResourceStorageProvider implements IResourceChangeListener, public class EclipseResourceStorageProvider implements IResourceChangeListener,
IResourceDeltaVisitor, IStorageProvider { IResourceDeltaVisitor, IStorageProvider {
...@@ -144,39 +148,50 @@ public class EclipseResourceStorageProvider implements IResourceChangeListener, ...@@ -144,39 +148,50 @@ public class EclipseResourceStorageProvider implements IResourceChangeListener,
if (delta.getResource() instanceof IFile if (delta.getResource() instanceof IFile
&& delta.getResource().getParent() instanceof IProject && delta.getResource().getParent() instanceof IProject
&& delta.getResource().getFileExtension().equals("af3_20")) { && delta.getResource().getFileExtension().equals("af3_20")) {
IFile file = (IFile) delta.getResource(); runWorkspaceChangeJob((IFile) delta.getResource(), delta.getKind());
if (delta.getKind() == IResourceDelta.ADDED) {
try {
loadContext(file);
} catch (IOException ioex) {
LoggingUtils.error(ToolingKernelActivator.getDefault(),
"Had an error during reloading the file!", ioex);
}
} else if (delta.getKind() == IResourceDelta.REMOVED
&& isLoaded(file)) {
unloadContext((IFile) delta.getResource());
} else if (delta.getKind() == IResourceDelta.CHANGED) {
handleChange((IFile) delta.getResource());
}
// Refresh the top-level elements
IPersistencyService.INSTANCE
.refreshTopLevelElements(EclipseResourceStorageProvider.this);
} }
return true; return true;
} }
/** Runs resource change job as workspace job. */
private void runWorkspaceChangeJob(final IFile file, final int changeKind) {
new WorkspaceJob("ModelFileChangedJob") {
@Override
public IStatus runInWorkspace(IProgressMonitor monitor) {
synchronized (EclipseResourceStorageProvider.this) {
if (changeKind == IResourceDelta.ADDED) {
try {
loadContext(file);
} catch (IOException ioex) {
LoggingUtils.error(
ToolingKernelActivator.getDefault(),
"Had an error during reloading the file!",
ioex);
}
} else if (changeKind == IResourceDelta.REMOVED
&& isLoaded(file)) {
unloadContext(file);
} else if (changeKind == IResourceDelta.CHANGED) {
handleChange(file);
}
// Refresh the top-level elements
IPersistencyService.INSTANCE
.refreshTopLevelElements(EclipseResourceStorageProvider.this);
}
return Status.OK_STATUS;
}
}.schedule();
}
/** Handles a change of the given file (which is actually managed). */ /** Handles a change of the given file (which is actually managed). */
private void handleChange(final IFile file) { private void handleChange(IFile file) {
final ModelContext context = loadedContexts.get(file); ModelContext context = loadedContexts.get(file);
if (!context.getLastChangeWasIntended()) { if (!context.getLastChangeWasIntended()) {
unloadContext(file); unloadContext(file);
try { try {
loadContext(file).setLastChangeWasIntended(); loadContext(file);
// perform touch to make sure the viewer does a
// refresh
file.touch(null);
} catch (final Exception e) { } catch (final Exception e) {
LoggingUtils.error(ToolingKernelActivator.getDefault(), LoggingUtils.error(ToolingKernelActivator.getDefault(),
"Had an error during reloading the file!", e); "Had an error during reloading the file!", e);
...@@ -199,7 +214,7 @@ public class EclipseResourceStorageProvider implements IResourceChangeListener, ...@@ -199,7 +214,7 @@ public class EclipseResourceStorageProvider implements IResourceChangeListener,
/** Loads a file and creates a new context from its contents. */ /** Loads a file and creates a new context from its contents. */
private void unloadContext(IFile file) { private void unloadContext(IFile file) {
final ModelContext context = loadedContexts.remove(file); ModelContext context = loadedContexts.remove(file);
if (context != null) { if (context != null) {
rootElementContexts.remove(context.getTopLevelElement()); rootElementContexts.remove(context.getTopLevelElement());
context.destroy(); context.destroy();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment