Workspace Access Plugin Extension (JavaScript-Based)
This extension can use the same API as the Workspace Access plugin extension, but the implementation is JavaScript-based and uses the bundled Rhino library to create and work with Java API from the JavaScript code.
The plugin descriptor file plugin.xml
needs to point to a JavaScript
file, as in the following
example:
<!DOCTYPE plugin PUBLIC "-//Oxygen Plugin" "../plugin.dtd"> <plugin id="unique.id.value" name="Add Action To DITA Maps Manager popup-menu" description="Plugin adds action to DITA Maps Manager contextual menu." version="1.0" vendor="Syncro Soft" class="ro.sync.exml.plugin.Plugin" classLoaderType="preferReferencedResources"> <extension type="WorkspaceAccessJS" href="wsAccess.js"/> </plugin>In the example above, the JavaScript file
wsAccess.js
, located in the plugin
folder, will be called. This JavaScript file needs to have two JavaScript methods
defined
inside. Methods that will be called when the application starts and when it
ends:function applicationStarted(pluginWorkspaceAccess) { .......... } function applicationClosing(pluginWorkspaceAccess) { .......... }
In regards to the applicationStarted
callback, besides using the ro.sync.exml.workspace.api.standalone.StandalonePluginWorkspace
API with the pluginWorkspaceAccesspluginWorkspaceAccess
parameter, you can
also use a globally defined field called jsDirURL
that points to the folder
where the JavaScript file is located.
Below is a much larger example with a JavaScript Workspace Access plugin extension
implementation that adds a new action in the contextual menu of the DITA Maps
Manager view. The action starts the notepad.exe
application
and passes the reference to the currently selected topicref
to
it.
function applicationStarted(pluginWorkspaceAccess) { Packages.java.lang.System.err.println("Application started " + pluginWorkspaceAccess); edChangedListener = { /*Called when a DITA Map is opened*/ editorOpened: function (editorLocation) { Packages.java.lang.System.err.println("\nrunning " + editorLocation); /*Get the opened DITA Map*/ editor = pluginWorkspaceAccess.getEditorAccess(editorLocation, Packages.ro.sync.exml.workspace.api.PluginWorkspace.DITA_MAPS_EDITING_AREA); ditaMapPage = editor.getCurrentPage(); /*Add listener called when right-click is done in the DITA Maps manager*/ customizerObj = { customizePopUpMenu: function (popUp, ditaMapDocumentController) { Packages.java.lang.System.err.println("RIGHT CLICK" + popUp); tree = ditaMapPage.getDITAMapTreeComponent(); /*Selected tree path*/ sel = tree.getSelectionPath(); if (sel != null) { selectedElement = sel.getLastPathComponent(); /*Reference attribute*/ href = selectedElement.getAttribute("href"); if (href != null) { try { /*Create absolute reference*/ absoluteRef = new Packages.java.net.URL(selectedElement.getXMLBaseURL(), href.getValue()); Packages.java.lang.System.err.println("Computed absolute reference " + absoluteRef); mi = new Packages.javax.swing.JMenuItem("Run notepad"); popUp.add(mi); actionPerfObj = { actionPerformed: function (e) { try { Packages.java.lang.Runtime.getRuntime().exec("notepad.exe " + pluginWorkspaceAccess.getUtilAccess().locateFile(absoluteRef)); } catch (e1) { e1.printStackTrace(); } } } mi.addActionListener(new JavaAdapter(Packages.java.awt.event.ActionListener, actionPerfObj)); } catch (e1) { Packages.java.lang.System.err.println(e1); } } } } } ditaMapPage.setPopUpMenuCustomizer(new Packages.ro.sync.exml.workspace.api. editor.page.ditamap.DITAMapPopupMenuCustomizer(customizerObj)); } } edChangedListener = new JavaAdapter(Packages.ro.sync.exml.workspace.api. listeners.WSEditorChangeListener, edChangedListener); pluginWorkspaceAccess.addEditorChangeListener( edChangedListener, Packages.ro.sync.exml.workspace.api.PluginWorkspace.DITA_MAPS_EDITING_AREA); } function applicationClosing(pluginWorkspaceAccess) { Packages.java.lang.System.err.println("Application closing " + pluginWorkspaceAccess); }
For more information and some samples, see GitHub Project with Multiple Workspace Access JavaScript-Based Plugin Samples.