diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index fa238f94c..e5aa9e6bb 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -89,6 +89,7 @@ public abstract class Editor extends JFrame implements RunnerListener { private JMenuItem undoItem, redoItem; protected UndoAction undoAction; protected RedoAction redoAction; + /** the currently selected tab's undo manager */ private UndoManager undo; // used internally, and only briefly private CompoundEdit compoundEdit; @@ -1068,6 +1069,9 @@ public abstract class Editor extends JFrame implements RunnerListener { } updateUndoState(); redoAction.updateRedoState(); + if (sketch != null) { + sketch.setModified(!getText().equals(sketch.getCurrentCode().getSavedProgram())); + } } protected void updateUndoState() { @@ -1076,17 +1080,17 @@ public abstract class Editor extends JFrame implements RunnerListener { undoItem.setEnabled(true); undoItem.setText(undo.getUndoPresentationName()); putValue(Action.NAME, undo.getUndoPresentationName()); - if (sketch != null) { - sketch.setModified(true); // 0107 - } +// if (sketch != null) { +// sketch.setModified(true); // 0107, removed for 0196 +// } } else { this.setEnabled(false); undoItem.setEnabled(false); undoItem.setText("Undo"); putValue(Action.NAME, "Undo"); - if (sketch != null) { - sketch.setModified(false); // 0107 - } +// if (sketch != null) { +// sketch.setModified(false); // 0107 +// } } } } @@ -1113,6 +1117,9 @@ public abstract class Editor extends JFrame implements RunnerListener { } updateRedoState(); undoAction.updateUndoState(); + if (sketch != null) { + sketch.setModified(!getText().equals(sketch.getCurrentCode().getSavedProgram())); + } } protected void updateRedoState() { diff --git a/app/src/processing/app/Sketch.java b/app/src/processing/app/Sketch.java index cb649f9fc..25839bcad 100644 --- a/app/src/processing/app/Sketch.java +++ b/app/src/processing/app/Sketch.java @@ -626,9 +626,11 @@ public class Sketch { */ public void setModified(boolean state) { //System.out.println("setting modified to " + state); - //new Exception().printStackTrace(); - current.setModified(state); - calcModified(); + //new Exception().printStackTrace(System.out); + if (current.isModified() != state) { + current.setModified(state); + calcModified(); + } } diff --git a/app/src/processing/app/SketchCode.java b/app/src/processing/app/SketchCode.java index da5192307..0a37efd20 100644 --- a/app/src/processing/app/SketchCode.java +++ b/app/src/processing/app/SketchCode.java @@ -45,6 +45,9 @@ public class SketchCode { /** Text of the program text for this tab */ private String program; + + /** Last version of the program on disk. */ + private String savedProgram; /** Document object for this tab. Currently this is a SyntaxDocument. */ private Document document; @@ -58,6 +61,9 @@ public class SketchCode { * that's currently the front. */ private UndoManager undo = new UndoManager(); + + /** What was on top of the undo stack when last saved. */ +// private UndoableEdit lastEdit; // saved positions from last time this tab was used private int selectionStart; @@ -150,16 +156,24 @@ public class SketchCode { return extension.equals(what); } - + + /** get the current text for this tab */ public String getProgram() { return program; } - - + + + /** set the current text for this tab */ public void setProgram(String replacement) { program = replacement; } - + + + /** get the last version saved of this tab */ + public String getSavedProgram() { + return savedProgram; + } + public int getLineCount() { return Base.countLines(program); @@ -259,6 +273,7 @@ public class SketchCode { */ public void load() throws IOException { program = Base.loadFile(file); + savedProgram = program; if (program.indexOf('\uFFFD') != -1) { System.err.println(file.getName() + " contains unrecognized characters."); @@ -282,6 +297,7 @@ public class SketchCode { //history.record(s, SketchHistory.SAVE); Base.saveFile(program, file); + savedProgram = program; setModified(false); } @@ -291,12 +307,13 @@ public class SketchCode { */ public void saveAs(File newFile) throws IOException { Base.saveFile(program, newFile); + savedProgram = program; file = newFile; makePrettyName(); setModified(false); } - + /** * Called when the sketch folder name/location has changed. Called when * renaming tab 0, the main code. diff --git a/app/src/processing/mode/java/PdeKeyListener.java b/app/src/processing/mode/java/PdeKeyListener.java index 6341bbb4d..1c46a7253 100644 --- a/app/src/processing/mode/java/PdeKeyListener.java +++ b/app/src/processing/mode/java/PdeKeyListener.java @@ -128,12 +128,12 @@ public class PdeKeyListener { } // TODO i don't like these accessors. clean em up later. - if (!editor.getSketch().isModified()) { - if ((code == KeyEvent.VK_BACK_SPACE) || (code == KeyEvent.VK_TAB) || - (code == KeyEvent.VK_ENTER) || ((c >= 32) && (c < 128))) { - sketch.setModified(true); - } +// if (!editor.getSketch().isModified()) { + if ((code == KeyEvent.VK_BACK_SPACE) || (code == KeyEvent.VK_TAB) || + (code == KeyEvent.VK_ENTER) || ((c >= 32) && (c < 128))) { + sketch.setModified(true); } +// } if ((code == KeyEvent.VK_UP) && ((event.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {