package gate.groovy.gui; import gate.Resource; import gate.creole.AbstractVisualResource; import gate.creole.metadata.*; import gate.groovy.ScriptableController; import gate.util.GateRuntimeException; import groovy.ui.ConsoleTextEditor; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; import javax.swing.event.DocumentListener; import javax.swing.event.DocumentEvent; import java.awt.BorderLayout; @CreoleResource(name = "Control Script", comment = "Editor for the Groovy " + "script controlling a scriptable controller", guiType = GuiType.LARGE, resourceDisplayed = "gate.groovy.ScriptableController") public class ControllerScriptEditor extends AbstractVisualResource implements DocumentListener, PropertyChangeListener { private static final long serialVersionUID = -3690719863931044767L; protected ConsoleTextEditor editor; protected ScriptableController controller; public Resource init() { initGuiComponents(); return this; } protected void initGuiComponents() { setLayout(new BorderLayout()); editor = new ConsoleTextEditor(); editor.getTextEditor().getDocument().addDocumentListener(this); add(editor, BorderLayout.CENTER); } public void setTarget(Object target) { if(controller != null && target != controller) { controller.removePropertyChangeListener("controlScript", this); } if(target == null) return; if(!(target instanceof ScriptableController)) { throw new GateRuntimeException(this.getClass().getName() + " can only be used to display " + ScriptableController.class.getName() + "\n" + target.getClass().getName() + " is not a " + ScriptableController.class.getName() + "!"); } controller = (ScriptableController)target; // populate the editor from the current script value on the controller propertyChange(null); controller.addPropertyChangeListener("controlScript", this); } // PropertyChangeListener methods /** * Trap to ensure we don't get an infinite loop between the property change * events from the controller and the document events from the editor. */ private volatile boolean changeEvents = true; public void propertyChange(PropertyChangeEvent e) { if(changeEvents && controller != null) { changeEvents = false; editor.getTextEditor().setText(controller.getControlScript()); changeEvents = true; } } // DocumentListener methods public void insertUpdate(DocumentEvent e) { setControllerScript(); } public void removeUpdate(DocumentEvent e) { setControllerScript(); } public void changedUpdate(DocumentEvent e) { // do nothing, we don't care about changes to attributes } protected void setControllerScript() { if(changeEvents && controller != null) { changeEvents = false; controller.setControlScript(editor.getTextEditor().getText()); changeEvents = true; } } }