package de.sciss.syntaxpane.actions;
import de.sciss.syntaxpane.SyntaxDocument;
import de.sciss.syntaxpane.util.Configuration;
import javax.swing.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public abstract class AbstractUndoRedoAction extends DefaultSyntaxAction {
private JEditorPane editor;
protected SyntaxDocument doc;
private final String property;
protected AbstractUndoRedoAction(String property, String key) {
super(key);
this.property = property;
}
private PropertyChangeListener propListener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
// System.out.println(property + " - " + e);
setEnabled(updateState());
}
};
abstract protected boolean updateState();
private void removeDocument() {
if (doc != null) {
doc.removePropertyChangeListener(property, propListener);
doc = null;
}
}
private void setDocument(SyntaxDocument newDoc) {
if (doc != null) throw new IllegalStateException();
doc = newDoc;
doc.addPropertyChangeListener(property, propListener);
setEnabled(updateState());
}
private PropertyChangeListener docListener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
// if (e.getPropertyName().equals("document")) {
removeDocument();
Object newDoc = e.getNewValue();
if (newDoc instanceof SyntaxDocument) {
setDocument((SyntaxDocument) newDoc);
// editor.removePropertyChangeListener("document", docListener);
}
// } else {
// System.out.println(e.getPropertyName() + " " + e.getNewValue());
// }
}
};
@Override
public void install(JEditorPane editor, Configuration config, String name) {
super.install(editor, config, name);
if (this.editor != null) throw new IllegalStateException();
this.editor = editor;
editor.addPropertyChangeListener("document", docListener);
// editor.addPropertyChangeListener("editorKit", docListener);
// Document doc = editor.getDocument();
// if (doc instanceof SyntaxDocument) {
// setDocument((SyntaxDocument) doc);
// }
}
@Override
public void deinstall(JEditorPane editor) {
super.deinstall(editor);
if (this.editor != editor) throw new IllegalStateException();
editor.removePropertyChangeListener("document", docListener);
removeDocument();
this.editor = null;
}
}