Skip to content
Snippets Groups Projects
Commit e79a09dd authored by Tobias Ask's avatar Tobias Ask
Browse files

Implement save as action

Add support for the Save as action. Also, fix a bug that caused an unnecessary model reset whenever the document was saved by the user.
parent 6ee2cd97
No related branches found
No related tags found
No related merge requests found
Pipeline #45817 failed
...@@ -27,14 +27,20 @@ import org.eclipse.jdt.core.JavaModelException; ...@@ -27,14 +27,20 @@ import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PartInitException; import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SaveAsDialog;
import org.eclipse.ui.ide.IDE; import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.operations.RedoActionHandler; import org.eclipse.ui.operations.RedoActionHandler;
import org.eclipse.ui.operations.UndoActionHandler; import org.eclipse.ui.operations.UndoActionHandler;
...@@ -78,6 +84,7 @@ public class FXMLEditor extends EditorPart implements IInputChangeListener { ...@@ -78,6 +84,7 @@ public class FXMLEditor extends EditorPart implements IInputChangeListener {
private RedoActionHandler redoActionHandler; private RedoActionHandler redoActionHandler;
private String fxmlText = null; private String fxmlText = null;
private EditorInputWatcher inputWatcher; private EditorInputWatcher inputWatcher;
private boolean saveWasInvoked;
private ChangeListener<Number> editorSelectionListener = (oV, oldNum, newNum) -> { private ChangeListener<Number> editorSelectionListener = (oV, oldNum, newNum) -> {
FXOMObject fxomRoot = editorController.getFxomDocument().getFxomRoot(); FXOMObject fxomRoot = editorController.getFxomDocument().getFxomRoot();
...@@ -182,7 +189,7 @@ public class FXMLEditor extends EditorPart implements IInputChangeListener { ...@@ -182,7 +189,7 @@ public class FXMLEditor extends EditorPart implements IInputChangeListener {
@Override @Override
public boolean isSaveAsAllowed() { public boolean isSaveAsAllowed() {
return false; return true;
} }
@Override @Override
...@@ -192,6 +199,7 @@ public class FXMLEditor extends EditorPart implements IInputChangeListener { ...@@ -192,6 +199,7 @@ public class FXMLEditor extends EditorPart implements IInputChangeListener {
String newFxmlText = editorController.getFxmlText(); String newFxmlText = editorController.getFxmlText();
byte[] fxmlBytes = newFxmlText.getBytes("UTF-8"); byte[] fxmlBytes = newFxmlText.getBytes("UTF-8");
updateDirtyStatus(false); updateDirtyStatus(false);
saveWasInvoked = true;
file.setContents(new ByteArrayInputStream(fxmlBytes), IResource.FORCE, monitor); file.setContents(new ByteArrayInputStream(fxmlBytes), IResource.FORCE, monitor);
this.fxmlText = newFxmlText; this.fxmlText = newFxmlText;
} catch (UnsupportedEncodingException | CoreException e) { } catch (UnsupportedEncodingException | CoreException e) {
...@@ -202,8 +210,28 @@ public class FXMLEditor extends EditorPart implements IInputChangeListener { ...@@ -202,8 +210,28 @@ public class FXMLEditor extends EditorPart implements IInputChangeListener {
@Override @Override
public void doSaveAs() { public void doSaveAs() {
// TODO Auto-generated method stub Shell shell = PlatformUI.getWorkbench().getModalDialogShellProvider().getShell();
SaveAsDialog dialog = new SaveAsDialog(shell);
dialog.setOriginalFile(((IFileEditorInput) getEditorInput()).getFile());
if (dialog.open() == Window.CANCEL) {
return;
}
IPath path = dialog.getResult();
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
String newFxmlText = editorController.getFxmlText();
byte[] fxmlBytes = newFxmlText.getBytes();
try {
file.create(new ByteArrayInputStream(fxmlBytes), IResource.FORCE, null);
FileEditorInput newInput = new FileEditorInput(file);
executeOnUiThread(() -> {
setInputWithNotify(newInput);
setPartName(newInput.getName());
});
inputWatcher.setInput(file);
updateDirtyStatus(false);
} catch (CoreException e) {
e.printStackTrace();
}
} }
@Override @Override
...@@ -334,17 +362,28 @@ public class FXMLEditor extends EditorPart implements IInputChangeListener { ...@@ -334,17 +362,28 @@ public class FXMLEditor extends EditorPart implements IInputChangeListener {
} }
} }
private void executeOnUiThread(Runnable runnable) {
Display display = PlatformUI.getWorkbench().getDisplay();
display.asyncExec(runnable);
}
@Override @Override
public void inputRemoved() { public void inputRemoved() {
Display display = getSite().getShell().getDisplay(); if (dirty) {
display.asyncExec(() -> getSite().getPage().closeEditor(FXMLEditor.this, false)); executeOnUiThread(() -> doSaveAs());
} else {
executeOnUiThread(() -> getSite().getPage().closeEditor(FXMLEditor.this, false));
}
} }
@Override @Override
public void inputContentChanged() { public void inputContentChanged() {
if (saveWasInvoked) {
saveWasInvoked = false;
return;
}
if (dirty) { if (dirty) {
Display display = getSite().getShell().getDisplay(); executeOnUiThread(() -> {
display.asyncExec(() -> {
boolean reload = (Dialog.OK != MessageDialog.open(MessageDialog.WARNING, getSite().getShell(), boolean reload = (Dialog.OK != MessageDialog.open(MessageDialog.WARNING, getSite().getShell(),
"Reload data?", "Reload data?",
getEditorInput().getName() + " has changed outside editor, would you like to reload it?", getEditorInput().getName() + " has changed outside editor, would you like to reload it?",
...@@ -364,8 +403,7 @@ public class FXMLEditor extends EditorPart implements IInputChangeListener { ...@@ -364,8 +403,7 @@ public class FXMLEditor extends EditorPart implements IInputChangeListener {
FileEditorInput newInput = new FileEditorInput(file); FileEditorInput newInput = new FileEditorInput(file);
try { try {
loadFxml(file.getLocationURI().toURL()); loadFxml(file.getLocationURI().toURL());
Display display = getSite().getShell().getDisplay(); executeOnUiThread(() -> {
display.asyncExec(() -> {
setInputWithNotify(newInput); setInputWithNotify(newInput);
setPartName(newInput.getName()); setPartName(newInput.getName());
}); });
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment