[572448] renaming dtp files updates editor title

renaming in the tree (or workspace) now correctly refreshes editor
title, saving changes will correctly update the new renamed file

Bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=572448
Change-Id: Ibfd1a0fef9e89259878b253d1058e7c3d38dd6ea
Signed-off-by: Bianca Wiesmayr <bianca.wiesmayr@jku.at>
diff --git a/plugins/org.eclipse.fordiac.ide.datatypeeditor/src/org/eclipse/fordiac/ide/datatypeeditor/DataTypeListener.java b/plugins/org.eclipse.fordiac.ide.datatypeeditor/src/org/eclipse/fordiac/ide/datatypeeditor/DataTypeListener.java
new file mode 100644
index 0000000..8a6fbbc
--- /dev/null
+++ b/plugins/org.eclipse.fordiac.ide.datatypeeditor/src/org/eclipse/fordiac/ide/datatypeeditor/DataTypeListener.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Primetals Technologies Austria GmbH
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Bianca Wiesmayr - initial implementation and/or initial documentation
+ *******************************************************************************/
+package org.eclipse.fordiac.ide.datatypeeditor;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.fordiac.ide.datatypeeditor.editors.DataTypeEditor;
+
+public class DataTypeListener implements IResourceChangeListener {
+	IPath file;
+	DataTypeEditor editor;
+
+	public DataTypeListener(IFile file, DataTypeEditor editor) {
+		this.file = file.getFullPath();
+		this.editor = editor;
+	}
+
+	@Override
+	public void resourceChanged(IResourceChangeEvent event) {
+		IResourceDelta delta = event.getDelta();
+
+		// Look for change to our file
+
+		delta = delta.findMember(file);
+		// renaming: kind REMOVED, flag MOVED_TO
+		if ((delta != null) && (delta.getKind() == IResourceDelta.REMOVED)) {
+			if ((delta.getFlags() & IResourceDelta.MOVED_TO) != 0) {
+				file = delta.getMovedToPath();
+				editor.updateDataType(file);
+			}
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.fordiac.ide.datatypeeditor/src/org/eclipse/fordiac/ide/datatypeeditor/editors/DataTypeEditor.java b/plugins/org.eclipse.fordiac.ide.datatypeeditor/src/org/eclipse/fordiac/ide/datatypeeditor/editors/DataTypeEditor.java
index 66813e4..af45f01 100644
--- a/plugins/org.eclipse.fordiac.ide.datatypeeditor/src/org/eclipse/fordiac/ide/datatypeeditor/editors/DataTypeEditor.java
+++ b/plugins/org.eclipse.fordiac.ide.datatypeeditor/src/org/eclipse/fordiac/ide/datatypeeditor/editors/DataTypeEditor.java
@@ -1,5 +1,6 @@
 /*******************************************************************************
  * Copyright (c) 2020 Johannes Kepler University, Linz
+ *               2021 Primetals Technologies Austria GmbH
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -20,8 +21,12 @@
 import javax.xml.stream.XMLStreamException;
 
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.fordiac.ide.datatypeeditor.Activator;
+import org.eclipse.fordiac.ide.datatypeeditor.DataTypeListener;
 import org.eclipse.fordiac.ide.datatypeeditor.Messages;
 import org.eclipse.fordiac.ide.datatypeeditor.widgets.StructViewingComposite;
 import org.eclipse.fordiac.ide.model.data.AnyDerivedType;
@@ -71,6 +76,7 @@
 	private Composite errorComposite;
 	private boolean importFailed;
 	private boolean outsideWorkspace;
+	private DataTypeListener listener;
 
 	private ActionRegistry actionRegistry;
 	private final List<String> selectionActions = new ArrayList<>();
@@ -94,6 +100,7 @@
 		getCommandStack().removeCommandStackEventListener(this);
 		getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener(this);
 		getActionRegistry().dispose();
+		ResourcesPlugin.getWorkspace().removeResourceChangeListener(listener);
 		super.dispose();
 	}
 
@@ -146,16 +153,23 @@
 
 		try {
 			if (null != file) {
-				setPartName(file.getName().substring(0, file.getName().lastIndexOf('.')));
+				setPartName(getDatatypeNameFromFile(file));
 				final DataTypeImporter importer = new DataTypeImporter(file);
 				importer.loadElement();
 				dataType = importer.getElement();
+				listener = new DataTypeListener(file, this);
+				final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+				workspace.addResourceChangeListener(listener);
 			}
 		} catch (final Exception e) {
 			throw new PartInitException(e.getMessage(), e);
 		}
 	}
 
+	private static String getDatatypeNameFromFile(IFile file) {
+		return file.getName().substring(0, file.getName().lastIndexOf('.'));
+	}
+
 	private void setActionHandlers(final IEditorSite site) {
 		final ActionRegistry registry = getActionRegistry();
 		final IActionBars bars = site.getActionBars();
@@ -279,4 +293,14 @@
 		}
 		return actionRegistry;
 	}
+
+	public void updateDataType(IPath path) {
+		this.file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+		final String name = getDatatypeNameFromFile(file);
+		dataType.setName(name);
+		setPartName(name);
+		setTitle(name);
+		setInput(new FileEditorInput(file));
+	}
+
 }