Log in Help
Print
Homereleasesgate-8.4-build5748-ALLpluginsGroovysrcgategroovygui 〉 ControllerScriptEditor.java
 
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;
    }
  }
}