package org.kevoree.tools.ui.kevscript; import jsyntaxpane.components.Markers; import jsyntaxpane.syntaxkits.KevScriptSyntaxKit; import org.kevoree.api.ModelService; import org.kevoree.kevscript.Parser; import org.waxeye.input.InputBuffer; import org.waxeye.parser.ParseResult; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * Created with IntelliJ IDEA. * User: duke * Date: 30/11/2013 * Time: 13:43 */ public class KevScriptEditorPanel extends JPanel implements Runnable { private ModelService modelService; public KevScriptEditorPanel(ModelService ms) { modelService = ms; init(); } public KevScriptEditorPanel() { init(); } private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); private JEditorPane codeEditor = null; private Boolean isChanged = true; private void init() { this.setLayout(new BorderLayout()); jsyntaxpane.DefaultSyntaxKit.initKit(); jsyntaxpane.DefaultSyntaxKit.registerContentType("text/kevs", KevScriptSyntaxKit.class.getName()); codeEditor = new JEditorPane(); codeEditor.setDoubleBuffered(true); JScrollPane scrPane = new JScrollPane(codeEditor); codeEditor.setContentType("text/kevs; charset=UTF-8"); codeEditor.setBackground(Color.DARK_GRAY); codeEditor.setText(""); add(scrPane, BorderLayout.CENTER); scheduler.scheduleAtFixedRate(this, 0, 1, TimeUnit.SECONDS); codeEditor.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { isChanged = true; } @Override public void removeUpdate(DocumentEvent e) { isChanged = true; } @Override public void changedUpdate(DocumentEvent e) { isChanged = true; } }); } public String getContent() { return codeEditor.getText(); } public void setContent(String c) { codeEditor.setText(c); } public void stop() { scheduler.shutdownNow(); } private Parser parser = new Parser(); @Override public void run() { try { Markers.removeMarkers(codeEditor); if (!codeEditor.getText().trim().isEmpty()) { ParseResult result = parser.parse(new InputBuffer(codeEditor.getText().toCharArray())); if (result.getError() != null) { Markers.SimpleMarker marker = new Markers.SimpleMarker(Color.RED, result.getError().getNT()); Markers.markText(codeEditor, result.getError().getPosition(), result.getError().getPosition() + 1, marker); } isChanged = false; } } catch (Exception e) { } } }