///*
// * To change this template, choose Tools | Templates
// * and open the template in the editor.
// */
//package robotinterface.gui.panels.code;
//
//import java.awt.BorderLayout;
//import java.awt.Color;
//import java.awt.event.ActionEvent;
//import java.awt.event.ActionListener;
//import java.awt.event.KeyEvent;
//import java.awt.event.KeyListener;
//import java.util.ArrayList;
//import java.util.Collection;
//import javax.swing.JButton;
//import javax.swing.JPanel;
//import javax.swing.JScrollPane;
//import javax.swing.JToolBar;
//import javax.swing.UIManager;
//import javax.swing.event.DocumentEvent;
//import javax.swing.event.DocumentListener;
//import robotinterface.algorithm.parser.FunctionToken;
//import robotinterface.algorithm.parser.Parser;
//import robotinterface.algorithm.procedure.Function;
//import robotinterface.gui.panels.code.jedit.*;
//import static robotinterface.gui.panels.code.jedit.InputHandler.BACKSPACE;
//import static robotinterface.gui.panels.code.jedit.InputHandler.BACKSPACE_WORD;
//import static robotinterface.gui.panels.code.jedit.InputHandler.DELETE;
//import static robotinterface.gui.panels.code.jedit.InputHandler.DELETE_WORD;
//import static robotinterface.gui.panels.code.jedit.InputHandler.INSERT_BREAK;
//import static robotinterface.gui.panels.code.jedit.InputHandler.INSERT_TAB;
//import static robotinterface.gui.panels.code.jedit.InputHandler.getTextArea;
//import robotinterface.gui.panels.robot.RobotControlPanel;
//import robotinterface.plugin.PluginManager;
//import robotinterface.robot.device.Device;
//import robotinterface.util.cyzx.Undoable;
//import robotinterface.util.cyzx.HistoryManager;
//
///**
// *
// * @author antunes
// */
//class TextAreaState {
//
// public String string;
// public int cursor;
//
// public TextAreaState(String string, int cursor) {
// this.string = string;
// this.cursor = cursor;
// }
//
// @Override
// public String toString() {
// return "{" + "string=" + string.length() + ", cursor=" + cursor + '}';
// }
//}
//
//public class CodeEditorPanel extends JPanel implements Undoable<TextAreaState> {
//
// private Function function;
// private JEditTextArea textArea;
//
// public CodeEditorPanel(Function function) {
// super(new BorderLayout());
//
// this.function = function;
//
// textArea = new JEditTextArea();
// textArea.setTokenMarker(new FunctionTokenMarker());
// textArea.setText(Parser.encode(function));
// textArea.getPainter().setFont(UIManager.getDefaults().getFont("TextPane.font"));
// textArea.recalculateVisibleLines();
// textArea.setFirstLine(0);
// textArea.setElectricScroll(0);
// textArea.getPainter().setSelectionColor(UIManager.getColor("TextArea.selectionBackground"));
//
// SyntaxStyle[] styles = SyntaxUtilities.getDefaultSyntaxStyles();
//
// Color cstring = Color.decode("#f07818");
// Color cfunction = Color.decode("#6a4a3c");
// Color cvar = Color.decode("#cc333f");
// Color cblocks = Color.decode("#00a0b0");
// Color cfuncandbool = Color.decode("#8fbe00");
// Color cdevices = Color.decode("#00C12B");
//
// styles[Token.COMMENT1] = new SyntaxStyle(Color.GRAY, false, false);
// styles[Token.KEYWORD1] = new SyntaxStyle(cblocks, false, true);
// styles[Token.KEYWORD2] = new SyntaxStyle(cvar, false, true);
// styles[Token.KEYWORD3] = new SyntaxStyle(cfunction, true, true);
//
// styles[Token.LITERAL1] = new SyntaxStyle(cstring, false, false);
// styles[Token.LITERAL2] = new SyntaxStyle(cfuncandbool, false, true);
//
// styles[Token.OPERATOR] = new SyntaxStyle(cdevices, false, true);
//
// textArea.getPainter().setStyles(styles);
//
// JScrollPane jsp = new JScrollPane(textArea);
//
// jsp.getVerticalScrollBar().setUnitIncrement(10);
//
// JToolBar tb = new JToolBar();
// tb.setFloatable(false);
////
//// JButton commentButton = new JButton("COM");
//// commentButton.addActionListener(new ActionListener() {
//// @Override
//// public void actionPerformed(ActionEvent e) {
//// commentSelection(textArea);
//// }
//// });
////
//// tb.add(commentButton);
////
//// JButton uncommentButton = new JButton("UNC");
//// uncommentButton.addActionListener(new ActionListener() {
//// @Override
//// public void actionPerformed(ActionEvent e) {
//// uncommentSelection(textArea);
//// }
//// });
////
//// tb.add(uncommentButton);
////
//// JButton cut = new JButton("Cut");
//// cut.addActionListener(new ActionListener() {
//// @Override
//// public void actionPerformed(ActionEvent e) {
//// textArea.cut();
//// }
//// });
////
//// tb.add(cut);
////
//// JButton copyButton = new JButton("Copy");
//// copyButton.addActionListener(new ActionListener() {
//// @Override
//// public void actionPerformed(ActionEvent e) {
//// textArea.copy();
//// }
//// });
////
//// tb.add(copyButton);
//
// JButton pasteButton = new JButton("Exemplo");
// pasteButton.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
// textArea.setText(
// "func MyFunc(){\n"
// + " var x = 0;\n"
// + " var y;\n"
// + " while (1 == 1){\n"
// + " read(Bussola,y);\n"
// + " print(\"%v\", y);\n"
// + " var z = -x;\n"
// + " move(x, z);\n"
// + " wait(500);\n"
// + " move(0);\n"
// + " wait(300);\n"
// + " x = x + 10;\n"
// + " if (x >= 120){\n"
// + " x = 0;\n"
// + " }\n"
// + " }\n"
// + "}");
// }
// });
//
// tb.add(pasteButton);
//
// add(tb, BorderLayout.PAGE_START);
//// add(new JButton("converter"));
//// add(new JButton("sei lá..."));
// add(jsp);
//
// final HistoryManager<TextAreaState> hm = new HistoryManager(this, 2);
//
// textArea.getDocument().addDocumentListener(new DocumentListener() {
//
// @Override
// public void insertUpdate(DocumentEvent e) {
// hm.saveState();
// }
//
// @Override
// public void removeUpdate(DocumentEvent e) {
// hm.saveState();
// }
//
// @Override
// public void changedUpdate(DocumentEvent e) {
// hm.saveState();
// }
// });
//
// textArea.getInputHandler().addKeyBinding("C+z", new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent evt) {
// hm.undo();
// }
// });
//
// textArea.getInputHandler().addKeyBinding("C+y", new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent evt) {
// hm.redo();
// }
// });
//
// updateFunctionTokens();
//
// }
// private static ArrayList<Class> functionTokenClass = new ArrayList<>();
// private static ArrayList<FunctionToken> functionTokenInstances = new ArrayList<>();
//
// public static Collection<FunctionToken> getFunctionTokens() {
// return functionTokenInstances;
// }
//
// public static void updateFunctionTokens() {
// KeywordMap keywords = FunctionTokenMarker.getKeywords();
//
// for (Class c : PluginManager.getPluginsAlpha("robotinterface/plugin/cmdpack/plugin.txt", FunctionToken.class
// )) {
// if (!functionTokenClass.contains(c)) {
// functionTokenClass.add(c);
// try {
// FunctionToken ft = (FunctionToken) c.newInstance();
// keywords.add(ft.getToken(), Token.LITERAL2);
// functionTokenInstances.add(ft);
// } catch (Exception ex) {
// ex.printStackTrace();
// }
// }
// }
//
// for (Class<? extends Device> c : RobotControlPanel.getAvailableDevices()) {
// String str = c.getSimpleName();
// try {
// str = c.newInstance().getName();
// } catch (Exception ex) {
// }
// keywords.add(str, Token.OPERATOR);
// }
// }
//
// private static void commentSelection(JEditTextArea textArea) {
// String line;
// int lineStart;
// int lineEnd;
// int i;
// if (textArea.getSelectedText() != null) {
// int start = textArea.getSelectionStart();
// int end = textArea.getSelectionEnd();
// int startLine = textArea.getSelectionStartLine();
// int endLine = textArea.getSelectionEndLine();
// for (i = startLine; i <= endLine; i++) {
// line = textArea.getLineText(i);
// lineStart = textArea.getLineStartOffset(i);
// lineEnd = textArea.getLineEndOffset(i);
// textArea.select(lineStart, lineEnd - 1);
// textArea.setSelectedText("//" + line);
// }
//
// i -= startLine;
//
// textArea.select(start + 2, end + i * 2);
//
// } else {
// i = textArea.getCaretLine();
// line = textArea.getLineText(i);
// lineStart = textArea.getLineStartOffset(i);
// lineEnd = textArea.getLineEndOffset(i);
// textArea.select(lineStart, lineEnd - 1);
// textArea.setSelectedText("//" + line);
// textArea.selectNone();
// }
// }
//
// private static void uncommentSelection(JEditTextArea textArea) {
// String line;
// int lineStart;
// int lineEnd;
// int i;
// if (textArea.getSelectedText() != null) {
// int start = textArea.getSelectionStart();
// int end = textArea.getSelectionEnd();
// int startLine = textArea.getSelectionStartLine();
// int endLine = textArea.getSelectionEndLine();
// int j = 0;
// for (i = startLine; i <= endLine; i++) {
// line = textArea.getLineText(i);
// lineStart = textArea.getLineStartOffset(i);
// lineEnd = textArea.getLineEndOffset(i);
// textArea.select(lineStart, lineEnd - 1);
// if (line.startsWith("//")) {
// textArea.setSelectedText(line.substring(2));
// j++;
// }
//
// }
//
// if (j > 0) {
// start -= 2;
// }
//
// textArea.select(start, end - j * 2);
// } else {
// i = textArea.getCaretLine();
// line = textArea.getLineText(i);
// lineStart = textArea.getLineStartOffset(i);
// lineEnd = textArea.getLineEndOffset(i);
// textArea.select(lineStart, lineEnd - 1);
// if (line.startsWith("//")) {
// textArea.setSelectedText(line.substring(2));
// }
// textArea.selectNone();
// }
// }
//
// public JEditTextArea getTextArea() {
// return textArea;
// }
//
// public Function getFunction() {
// return function;
// }
//
// @Override
// public void setState(TextAreaState state) {
// textArea.setText(state.string);
// try {
// textArea.setCaretPosition(state.cursor);
// } catch (java.lang.IllegalArgumentException e) {
//
// }
// }
//
// @Override
// public TextAreaState copy() {
// if (textArea.getText().isEmpty()) {
// return null;
// }
// return new TextAreaState(textArea.getText(), textArea.getCaretPosition() + 1);
// }
//
//}
package robotinterface.gui.panels.editor;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Collection;
import javax.swing.*;
import org.fife.ui.autocomplete.*;
import org.fife.ui.rsyntaxtextarea.AbstractTokenMakerFactory;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.Style;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.fife.ui.rsyntaxtextarea.Token;
import org.fife.ui.rsyntaxtextarea.TokenMakerFactory;
import org.fife.ui.rsyntaxtextarea.TokenMap;
import org.fife.ui.rtextarea.RTextScrollPane;
import robotinterface.algorithm.parser.FunctionToken;
import robotinterface.algorithm.parser.Parser;
import robotinterface.algorithm.procedure.Function;
import robotinterface.gui.panels.editor.syntaxtextarea.FunctionTokenMaker;
import robotinterface.gui.panels.robot.RobotControlPanel;
import robotinterface.plugin.PluginManager;
import robotinterface.robot.device.Device;
public class EditorPanel extends JPanel {
private Function function;
private final RSyntaxTextArea textArea;
private static DefaultCompletionProvider provider = null;
private static final ArrayList<Class> functionTokenClass = new ArrayList<>();
private static final ArrayList<FunctionToken> functionTokenInstances = new ArrayList<>();
public EditorPanel(Function function) {
super(new BorderLayout());
this.function = function;
textArea = new RSyntaxTextArea(20, 60);
AbstractTokenMakerFactory atmf = (AbstractTokenMakerFactory) TokenMakerFactory.getDefaultInstance();
atmf.putMapping("text/Function", "robotinterface.gui.panels.editor.syntaxtextarea.FunctionTokenMaker");
textArea.setSyntaxEditingStyle("text/Function");
//textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_C);
Color cstring = Color.decode("#f07818");
Color cfunction = Color.decode("#6a4a3c");
Color cvar = Color.decode("#cc333f");
Color cblocks = Color.decode("#00a0b0");
Color cfunc = Color.decode("#8fbe00");
Color cdevices = Color.decode("#00C12B");
//monstrinho:
Style styleDATA_TYPE = textArea.getSyntaxScheme().getStyle(Token.DATA_TYPE);//device
styleDATA_TYPE.font = textArea.getFontForTokenType(Token.RESERVED_WORD);
styleDATA_TYPE.foreground = cstring;
styleDATA_TYPE.underline = true;
Style styleFUNCTION = textArea.getSyntaxScheme().getStyle(Token.FUNCTION);//funções
styleFUNCTION.font = textArea.getFontForTokenType(Token.RESERVED_WORD);
styleFUNCTION.foreground = Color.GREEN.darker();
Style styleRESERVED_WORD = textArea.getSyntaxScheme().getStyle(Token.RESERVED_WORD);//if else...
// styleRESERVED_WORD.foreground = cfunction;
Style styleRESERVED_WORD_2 = textArea.getSyntaxScheme().getStyle(Token.RESERVED_WORD_2);//var func
styleRESERVED_WORD_2.foreground = cvar;
textArea.setCodeFoldingEnabled(true);
super.add(new RTextScrollPane(textArea));
AutoCompletion ac = new AutoCompletion(getCompletionProvider());
int mask = InputEvent.SHIFT_MASK;
ac.setTriggerKey(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, mask));
ac.setShowDescWindow(true);
// ac.setAutoCompleteEnabled(true);
// ac.setAutoActivationDelay(500);
// ac.setAutoActivationEnabled(true);
// ac.setAutoCompleteSingleChoices(true);
ac.install(textArea);
textArea.setText(Parser.encode(function));
updateFunctionTokens();
super.setName("Código Fonte");
}
public RSyntaxTextArea getTextArea() {
return textArea;
}
public static Collection<FunctionToken> getFunctionTokens() {
return functionTokenInstances;
}
public static void updateFunctionTokens() {
TokenMap tokenMap = FunctionTokenMaker.getTokenMap();
getCompletionProvider();
provider.clear();
for (Class c : PluginManager.getPluginsAlpha("robotinterface/plugin/cmdpack/plugin.txt", FunctionToken.class
)) {
int index = functionTokenClass.indexOf(c);
if (index == -1) {
functionTokenClass.add(c);
try {
FunctionToken ft = (FunctionToken) c.newInstance();
index = functionTokenInstances.size();
functionTokenInstances.add(ft);
} catch (Exception ex) {
ex.printStackTrace();
return;
}
}
FunctionToken ft = functionTokenInstances.get(index);
Completion completion = ft.getInfo(provider);
if (completion != null) {
provider.addCompletion(completion);
tokenMap.put(ft.getToken(), Token.FUNCTION);
}
}
for (Class<? extends Device> c : RobotControlPanel.getAvailableDevices()) {
String str = c.getSimpleName();
try {
str = c.newInstance().getName();
} catch (Exception ex) {
}
provider.addCompletion(new BasicCompletion(provider, str));
tokenMap.put(str, Token.DATA_TYPE);
}
}
/**
* Create a simple provider that adds some Java-related completions.
*/
private static CompletionProvider getCompletionProvider() {
if (provider == null) {
// A DefaultCompletionProvider is the simplest concrete implementation
// of CompletionProvider. This provider has no understanding of
// language semantics. It simply checks the text entered up to the
// caret position for a match against known completions. This is all
// that is needed in the majority of cases.
provider = new DefaultCompletionProvider();
// Add completions for all Java keywords. A BasicCompletion is just
// a straightforward word completion.
// provider.addCompletion(new BasicCompletion(provider, "abstract"));
// provider.addCompletion(new BasicCompletion(provider, "assert"));
// provider.addCompletion(new BasicCompletion(provider, "break"));
// provider.addCompletion(new BasicCompletion(provider, "case"));
// // ... etc ...
// provider.addCompletion(new BasicCompletion(provider, "transient"));
// provider.addCompletion(new BasicCompletion(provider, "try"));
// provider.addCompletion(new BasicCompletion(provider, "void"));
// provider.addCompletion(new BasicCompletion(provider, "volatile"));
// provider.addCompletion(new BasicCompletion(provider, "while"));
//
// // Add a couple of "shorthand" completions. These completions don't
// // require the input text to be the same thing as the replacement text.
// provider.addCompletion(new ShorthandCompletion(provider, "sysout",
// "System.out.println(", "System.out.println("));
// provider.addCompletion(new ShorthandCompletion(provider, "syserr",
// "System.err.println(", "System.err.println("));
}
return provider;
}
//
// public static void main(String[] args) {
// // Instantiate GUI on the EDT.
// SwingUtilities.invokeLater(new Runnable() {
// public void run() {
// try {
// String laf = UIManager.getSystemLookAndFeelClassName();
// UIManager.setLookAndFeel(laf);
// } catch (Exception e) { /* Never happens */ }
// new AutoCompleteDemo().setVisible(true);
// }
// });
// }
}