package com.baselet.custom; import java.awt.BorderLayout; import java.lang.reflect.Method; import java.util.ArrayList; import javax.swing.JPanel; import javax.swing.ScrollPaneConstants; import javax.swing.text.JTextComponent; import javax.swing.text.PlainDocument; import org.fife.ui.autocomplete.AutoCompletion; import org.fife.ui.autocomplete.BasicCompletion; import org.fife.ui.autocomplete.DefaultCompletionProvider; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.fife.ui.rsyntaxtextarea.SyntaxConstants; import org.fife.ui.rtextarea.RTextScrollPane; import com.baselet.control.config.DerivedConfig; import com.baselet.element.old.custom.CustomElement; public class CustomCodeSyntaxPane { private final JPanel panel; private final RTextScrollPane scrollPane; private final RSyntaxTextArea textArea; private final DefaultCompletionProvider provider = new DefaultCompletionProvider(); public CustomCodeSyntaxPane() { panel = new JPanel(new BorderLayout()); textArea = new RSyntaxTextArea(); textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); textArea.setAntiAliasingEnabled(true); textArea.setCodeFoldingEnabled(true); textArea.setFont(DerivedConfig.getPanelContentFont()); // setup autocompletion for (String word : getAutocompletionStrings()) { provider.addCompletion(new BasicCompletion(provider, word)); } new AutoCompletion(provider).install(textArea); scrollPane = new RTextScrollPane(textArea); scrollPane.setFoldIndicatorEnabled(true); scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); panel.add(scrollPane); textArea.getDocument().putProperty(PlainDocument.tabSizeAttribute, 3); // Reduce tab size } public String getText() { return textArea.getText(); } public JTextComponent getTextComponent() { return textArea; } public JPanel getPanel() { return panel; } public void setCode(String text) { textArea.setText(text); } private String getStringForCustomElementMethod(Method m) { CustomFunction cm = m.getAnnotation(CustomFunction.class); StringBuilder sb = new StringBuilder(""); sb.append(m.getName()).append("("); String[] params = cm.param_defaults().split(","); Class<?>[] types = m.getParameterTypes(); for (int i = 0; i < params.length && i < types.length; i++) { if (i != 0) { sb.append(", "); } sb.append(types[i].getSimpleName()).append(" ").append(params[i].trim()); } return sb.append(");").toString(); } private ArrayList<String> getAutocompletionStrings() { ArrayList<String> descriptors = new ArrayList<String>(); for (Method m : CustomElement.class.getDeclaredMethods()) { if (m.isAnnotationPresent(CustomFunction.class)) { descriptors.add(getStringForCustomElementMethod(m)); } } return descriptors; } public void repaint() { if (scrollPane != null) { scrollPane.repaint(); } } }