package tern.swing.rsyntaxtextarea.samples; import java.awt.BorderLayout; import java.io.File; import java.io.IOException; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.plaf.nimbus.NimbusLookAndFeel; import org.fife.ui.autocomplete.AutoCompletion; import org.fife.ui.autocomplete.LanguageAwareCompletionProvider; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.fife.ui.rsyntaxtextarea.SyntaxConstants; import org.fife.ui.rtextarea.RTextScrollPane; import tern.EcmaVersion; import tern.ITernProject; import tern.TernException; import tern.TernResourcesManager; import tern.repository.ITernRepository; import tern.repository.TernRepository; import tern.server.TernDef; import tern.server.nodejs.NodejsTernServer; import tern.server.nodejs.process.NodejsProcessManager; import tern.server.nodejs.process.PrintNodejsProcessListener; public class SwingNodeSample extends JFrame { private static final long serialVersionUID = 1L; private RSyntaxTextArea textArea; private NodejsTernServer server; public SwingNodeSample() throws IOException, TernException { createEditor(); createServer(); createCompletionProvider(); } private static String getTernJavaRoot() { // the path to the tern.java source repository. You must change this to // your local configuration. return "../../../../tern.java"; } private static ITernProject createTernProject() throws IOException { // Create tern repository. File ternBaseDir = new File(getTernJavaRoot(), "core/ternjs"); if (!ternBaseDir.exists()) { throw new IllegalArgumentException( "The folder " + ternBaseDir.getCanonicalFile().getAbsolutePath() + " does not exist."); } ITernRepository repository = new TernRepository("ternjs", ternBaseDir); // Create tern project by setting the tern repository File projectDir = new File("."); ITernProject project = TernResourcesManager.getTernProject(projectDir); project.setEcmaVersion(EcmaVersion.ES5); project.setRepository(repository); return project; } private void createServer() throws IOException, TernException { ITernProject project = createTernProject(); project.addLib(TernDef.ecma5); project.addLib(TernDef.browser); project.save(); File nodejsTernBaseDir = new File(getTernJavaRoot(), "core/ternjs/node_modules/tern"); NodejsProcessManager.getInstance().init(nodejsTernBaseDir); server = new NodejsTernServer(project); ((NodejsTernServer) server).addProcessListener(PrintNodejsProcessListener.getInstance()); } private void createEditor() { JPanel cp = new JPanel(new BorderLayout()); textArea = new RSyntaxTextArea(20, 60); textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVASCRIPT); textArea.setAutoIndentEnabled(true); textArea.setAntiAliasingEnabled(true); textArea.setCodeFoldingEnabled(true); textArea.setMarkOccurrences(true); textArea.setUseFocusableTips(true); RTextScrollPane sp = new RTextScrollPane(textArea); cp.add(sp); setContentPane(cp); setTitle("Swing Node Sample"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setLocationRelativeTo(null); } private void createCompletionProvider() { JavaScriptCompletionProvider defaultProvider = new JavaScriptCompletionProvider(server); LanguageAwareCompletionProvider provider = new LanguageAwareCompletionProvider(defaultProvider); AutoCompletion ac = new AutoCompletion(provider); ac.setAutoActivationEnabled(true); ac.setAutoActivationDelay(0); ac.setAutoCompleteSingleChoices(false); ac.setShowDescWindow(true); ac.setParameterAssistanceEnabled(true); ac.install(textArea); textArea.setToolTipSupplier(provider); } public static void main(String[] args) throws IOException, TernException { try { UIManager.setLookAndFeel(NimbusLookAndFeel.class.getName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { e.printStackTrace(); } SwingNodeSample sample = new SwingNodeSample(); sample.setVisible(true); } }