Embedded Nashorn in JEditorPane

Posted by Geertjan on Oracle Blogs See other posts from Oracle Blogs or by Geertjan
Published on Tue, 27 Nov 2012 15:51:42 +0000 Indexed on 2012/11/27 23:18 UTC
Read the original article Hit count: 230

Filed under:

Here's a prototype for some kind of backoffice content management system. Several interesting goodies are included, such as an embedded JavaScript editor, as can be seen in the screenshot:

Key items of interest in the above are as follows:

  • Embedded JavaScript editor (i.e., the latest and greatest Nashorn technology, look it up, if you're not aware of what that is.) The way that's done is to include the relevant JavaScript modules in your NetBeans Platform application. Make very sure to include "Lexer to NetBeans Bridge", which does a bunch of critical stuff under the hood. The JEditorPane is defined as follows, along the lines that I blogged about recently thanks to Steven Yi:
    javaScriptPane.setContentType("text/javascript");
    EditorKit kit = CloneableEditorSupport.getEditorKit("text/javascript");
    javaScriptPane.setEditorKit(kit);
    javaScriptPane.getDocument().putProperty("mimeType", "text/javascript");

    Note that "javaScriptPane" above is simply a JEditorPane.

  • Timon Veenstra's excellent solution for integrating Nodes with MultiViewElements, which is described here by Timon, and nowhere else in the world. The tab you see above is within a pluggable container, so anyone else could create a new module and register their own MultiViewElement such that it will be incorporated into the editor.

  • A small trick to ensure that only one window opens per news item:
    @NbBundle.Messages("OpenNews=Open")
    private class OpenNewsAction extends AbstractAction {
    
        public OpenNewsAction() {
            super(Bundle.OpenNews());
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            News news = getLookup().lookup(News.class);
            Mode editorMode = WindowManager.getDefault().findMode("editor");
            for (TopComponent tc : WindowManager.getDefault().getOpenedTopComponents(editorMode)) {
                if (tc.getDisplayName().equals(news.getTitle())) {
                    tc.requestActive();
                    return;
                }
            }
            TopComponent tc = MultiViews.createMultiView("application/x-newsnode", NewsNode.this);
            tc.open();
            tc.requestActive();
        }
    
    }

The rest of what you see above is all standard NetBeans Platform stuff. The sources of everything you see above is here:

http://java.net/projects/nb-api-samples/sources/api-samples/show/versions/7.3/misc/CMSBackOffice

© Oracle Blogs or respective owner

Related posts about /NetBeans IDE