summaryrefslogtreecommitdiff
path: root/scripting/examples/java/selector
diff options
context:
space:
mode:
Diffstat (limited to 'scripting/examples/java/selector')
-rw-r--r--scripting/examples/java/selector/ScriptSelector.java516
-rw-r--r--scripting/examples/java/selector/parcel-descriptor.xml17
2 files changed, 533 insertions, 0 deletions
diff --git a/scripting/examples/java/selector/ScriptSelector.java b/scripting/examples/java/selector/ScriptSelector.java
new file mode 100644
index 000000000000..9b0e36e0a5ab
--- /dev/null
+++ b/scripting/examples/java/selector/ScriptSelector.java
@@ -0,0 +1,516 @@
+import javax.swing.*;
+import javax.swing.tree.*;
+import javax.swing.table.*;
+import javax.swing.event.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+
+import com.sun.star.uno.UnoRuntime;
+import com.sun.star.uno.Exception;
+import com.sun.star.uno.Any;
+import com.sun.star.uno.AnyConverter;
+import com.sun.star.uno.Type;
+import com.sun.star.uno.XComponentContext;
+import com.sun.star.lang.XMultiComponentFactory;
+import com.sun.star.lang.XComponent;
+import com.sun.star.frame.XModel;
+import com.sun.star.container.XEnumeration;
+import com.sun.star.beans.*;
+import com.sun.star.util.XMacroExpander;
+
+import com.sun.star.lib.uno.helper.PropertySet;
+
+import drafts.com.sun.star.script.framework.browse.XBrowseNode;
+import drafts.com.sun.star.script.framework.browse.BrowseNodeTypes;
+import drafts.com.sun.star.script.framework.runtime.XScriptContext;
+
+public class ScriptSelector extends JFrame implements ActionListener {
+
+ private XBrowseNode myrootnode = null;
+ private JButton runButton, editButton, deleteButton;
+ private JTextField textField;
+
+ public ScriptSelector(XScriptContext ctxt)
+ {
+ //super("Script Selector Prototype");
+ // myrootnode = new RootBrowseNode(ctxt);
+
+ try {
+ String serviceName = "drafts.com.sun.star.script." +
+ "framework.provider.MasterScriptProvider";
+
+ XComponentContext xcc = ctxt.getComponentContext();
+ XMultiComponentFactory xmcf = xcc.getServiceManager();
+
+ Object serviceObj =
+ xmcf.createInstanceWithContext(serviceName, xcc);
+
+ myrootnode = (XBrowseNode)UnoRuntime.queryInterface(
+ XBrowseNode.class, serviceObj);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ return;
+ }
+
+ initUI();
+ }
+
+ public static void go(XScriptContext ctxt)
+ {
+ try {
+ ScriptSelector client = new ScriptSelector(ctxt);
+ client.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+ client.show();
+ }
+ catch (com.sun.star.uno.RuntimeException rue) {
+ rue.printStackTrace();
+ }
+ catch (java.lang.Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void initUI() {
+ JPanel panel = new JPanel();
+ panel.setLayout(new BorderLayout());
+
+ DefaultMutableTreeNode top = new DefaultMutableTreeNode(myrootnode);
+ initNodes(myrootnode, top);
+ final JTree tree = new JTree(top);
+
+ tree.setCellRenderer(new ScriptTreeRenderer());
+
+ tree.getSelectionModel().setSelectionMode
+ (TreeSelectionModel.SINGLE_TREE_SELECTION);
+
+ tree.addTreeSelectionListener(new TreeSelectionListener() {
+ public void valueChanged(TreeSelectionEvent e) {
+ DefaultMutableTreeNode node = (DefaultMutableTreeNode)
+ tree.getLastSelectedPathComponent();
+
+ if (node == null) return;
+
+ XBrowseNode xbn = (XBrowseNode)node.getUserObject();
+ XPropertySet props = (XPropertySet)UnoRuntime.queryInterface(
+ XPropertySet.class, xbn);
+
+ checkEnabled(props, "Deletable", deleteButton);
+ checkEnabled(props, "Editable", editButton);
+
+ String str = xbn.getName();
+ if (xbn.getType() == BrowseNodeTypes.SCRIPT && props != null)
+ {
+ try {
+ str = AnyConverter.toString(
+ props.getPropertyValue("URI"));
+ }
+ catch (Exception ignore) {
+ // default will be used
+ }
+ }
+ textField.setText(str);
+
+ if (xbn.getType() == BrowseNodeTypes.SCRIPT)
+ {
+ runButton.setEnabled(true);
+ }
+ else
+ {
+ runButton.setEnabled(false);
+ }
+ }
+
+ private void checkEnabled(XPropertySet props, String name,
+ JButton button)
+ {
+ boolean enable = false;
+
+ try
+ {
+ if (props != null)
+ {
+ Object o = props.getPropertyValue(name);
+ enable = AnyConverter.toBoolean(
+ props.getPropertyValue(name));
+ }
+ }
+ catch (com.sun.star.lang.IllegalArgumentException iae)
+ {
+ // leave enable set to false
+ }
+ catch (com.sun.star.beans.UnknownPropertyException upe)
+ {
+ // leave enable set to false
+ }
+ catch (com.sun.star.lang.WrappedTargetException wte)
+ {
+ // leave enable set to false
+ }
+
+ button.setEnabled(enable);
+ }
+ });
+
+ JScrollPane scroller = new JScrollPane(tree);
+ panel.add(scroller, BorderLayout.CENTER);
+
+ // JTable table = new JTable(new ScriptTableModel(myrootnode));
+ // JScrollPane tableScroller = new JScrollPane(table);
+ // panel.add(tableScroller, BorderLayout.NORTH);
+
+ JPanel lowerPanel = new JPanel();
+ textField = new JTextField();
+ lowerPanel.setLayout(new BorderLayout());
+ lowerPanel.add(textField, BorderLayout.NORTH);
+
+ JPanel buttonPanel = new JPanel();
+ runButton = new JButton("Run");
+ runButton.addActionListener(this);
+ runButton.setEnabled(false);
+
+ editButton = new JButton("Edit");
+ editButton.addActionListener(this);
+ editButton.setEnabled(false);
+
+ deleteButton = new JButton("Delete");
+ deleteButton.addActionListener(this);
+ deleteButton.setEnabled(false);
+
+ buttonPanel.add(runButton);
+ buttonPanel.add(editButton);
+ buttonPanel.add(deleteButton);
+ lowerPanel.add(buttonPanel, BorderLayout.SOUTH);
+
+ panel.add(lowerPanel, BorderLayout.SOUTH);
+
+ getContentPane().add(panel);
+ setSize(600, 300);
+ }
+
+ public void actionPerformed(ActionEvent event) {
+ if (event.getSource() == runButton) {
+ String uri = textField.getText();
+
+ // XScript script = msp.getScript(uri);
+ // script.invoke();
+ }
+ else if (event.getSource() == editButton) {
+ }
+ else if (event.getSource() == deleteButton) {
+ }
+ }
+
+ private void initNodes(XBrowseNode parent, DefaultMutableTreeNode top) {
+ if ( parent == null || parent.hasChildNodes() == false )
+ {
+ return;
+ }
+ System.err.println("initNodes parent = " + parent.getName() );
+ XBrowseNode[] children = parent.getChildNodes();
+
+ try {
+ if (children != null) {
+ for (int i = 0; i < children.length; i++) {
+ if ( children[i] != null )
+ {
+ System.err.println("initNodes child is " + children[ i ].getName() );
+ }
+ else
+ {
+ System.err.println("initNodes child " + i + " is null " );
+ continue;
+ }
+ DefaultMutableTreeNode newNode =
+ new DefaultMutableTreeNode(children[i]) {
+ public String toString(){ return ( (XBrowseNode)getUserObject() ).getName(); } };
+ top.add(newNode);
+ initNodes(children[i], newNode);
+ }
+ }
+ } catch (java.lang.Exception e) { e.printStackTrace(); }
+ }
+}
+
+class RootBrowseNode implements XBrowseNode {
+
+ private Collection nodes = new ArrayList();
+
+ public RootBrowseNode(XScriptContext ctxt) {
+
+ Object serviceObj = ctxt.getComponentContext().getValueByName(
+ "/singletons/com.sun.star.util.theMacroExpander");
+
+ try {
+ XMacroExpander me = (XMacroExpander) AnyConverter.toObject(
+ new Type(XMacroExpander.class), serviceObj);
+
+ MyMasterScriptProvider msp;
+
+ msp = new MyMasterScriptProvider(ctxt, me.expandMacros(
+ "${$SYSBINDIR/bootstraprc::BaseInstallation}/share"), "share");
+ nodes.add(msp);
+
+ msp = new MyMasterScriptProvider(ctxt, me.expandMacros(
+ "${$SYSBINDIR/bootstraprc::UserInstallation}/user"), "user");
+ nodes.add(msp);
+
+ XEnumeration docs =
+ ctxt.getDesktop().getComponents().createEnumeration();
+
+ while (docs.hasMoreElements())
+ {
+ Object o = docs.nextElement();
+ XComponent comp = (XComponent)AnyConverter.toObject(
+ new Type(XComponent.class), o);
+
+ XModel doc =
+ (XModel)UnoRuntime.queryInterface(XModel.class, comp);
+
+ msp = new MyMasterScriptProvider(doc, ctxt);
+ nodes.add(msp);
+ }
+ }
+ catch (Exception e) {
+ System.err.println("Error creating RootNode: " + e.getMessage());
+ }
+ }
+
+ public String getName() {
+ return "soffice";
+ }
+
+ public XBrowseNode[] getChildNodes() {
+ return (XBrowseNode[])nodes.toArray(new XBrowseNode[0]);
+ }
+
+ public boolean hasChildNodes() {
+ return true;
+ }
+
+ public short getType() {
+ return BrowseNodeTypes.ROOT;
+ }
+
+ public String toString() {
+ return getName();
+ }
+}
+
+class MyMasterScriptProvider implements XBrowseNode {
+
+ private Collection nodes = new ArrayList();
+ private XModel model;
+ private String path;
+ private String name;
+ private XComponentContext xcc;
+ private XMultiComponentFactory xmcf;
+
+ public MyMasterScriptProvider(XScriptContext ctxt, String path, String name)
+ {
+ this.path = path;
+ this.name = name;
+
+ xcc = ctxt.getComponentContext();
+ xmcf = xcc.getServiceManager();
+
+ String[] languages = {"Java", "BeanShell", "JavaScript"};
+
+ for (int i = 0; i < languages.length; i++)
+ {
+ createScriptProvider(languages[i]);
+ }
+ }
+
+ public MyMasterScriptProvider(XModel model, XScriptContext ctxt)
+ {
+ this.model = model;
+ this.name = model.getURL();
+ this.name = this.name.substring(this.name.lastIndexOf("/") + 1);
+
+ xcc = ctxt.getComponentContext();
+ xmcf = xcc.getServiceManager();
+
+ String[] languages = {"Java", "BeanShell", "JavaScript"};
+
+ for (int i = 0; i < languages.length; i++)
+ {
+ createScriptProvider(languages[i]);
+ }
+ }
+
+ private void createScriptProvider(String language) {
+
+ Any[] args = new Any[1];
+
+ if (path != null)
+ {
+ args[0] = new Any(new Type(String.class), path);
+ }
+ else if (model != null)
+ {
+ System.out.println("creating property set for: " + model.getURL());
+ XPropertySet props = new InvocationPropertySet(model);
+ System.out.println("property set created");
+ args[0] = new Any(new Type(XPropertySet.class), props);
+ System.out.println("and stuffed into Any");
+ }
+
+ try {
+ String serviceName = "drafts.com.sun.star.script." +
+ "framework.provider.ScriptProviderFor" + language;
+
+ System.out.println("now createInstance");
+ Object serviceObj = xmcf.createInstanceWithArgumentsAndContext(
+ serviceName, args, xcc);
+
+ XBrowseNode xbn = (XBrowseNode)UnoRuntime.queryInterface(
+ XBrowseNode.class, serviceObj);
+
+ nodes.add(xbn);
+ }
+ catch (com.sun.star.uno.Exception e) {
+ e.printStackTrace();
+ System.err.println("Error creating SPFor" + language + ": " + e);
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public XBrowseNode[] getChildNodes() {
+ return (XBrowseNode[])nodes.toArray(new XBrowseNode[0]);
+ }
+
+ public boolean hasChildNodes() {
+ return true;
+ }
+
+ public short getType() {
+ return BrowseNodeTypes.CONTAINER;
+ }
+
+ public String toString() {
+ return getName();
+ }
+
+ public class InvocationPropertySet extends PropertySet {
+ public XModel model;
+ public int id = 7;
+ public String uri;
+
+ public InvocationPropertySet(XModel model) {
+ this.model = model;
+ this.uri = model.getURL();
+
+ registerProperty("SCRIPTING_DOC_REF", new Type(XModel.class),
+ (short)0, "model");
+ registerProperty("SCRIPTING_DOC_STORAGE_ID", new Type(int.class),
+ (short)0, "id");
+ registerProperty("SCRIPTING_DOC_URI", new Type(String.class),
+ (short)0, "uri");
+ }
+ }
+}
+
+class ScriptTreeRenderer extends DefaultTreeCellRenderer {
+
+ private ImageIcon sofficeIcon;
+ private ImageIcon scriptIcon;
+ private ImageIcon containerIcon;
+
+ public ScriptTreeRenderer() {
+ sofficeIcon = new ImageIcon(getClass().getResource("soffice.gif"));
+ scriptIcon = new ImageIcon(getClass().getResource("script.gif"));
+ containerIcon = new ImageIcon(getClass().getResource("container.gif"));
+ }
+
+ public Component getTreeCellRendererComponent(
+ JTree tree,
+ Object value,
+ boolean sel,
+ boolean expanded,
+ boolean leaf,
+ int row,
+ boolean hasFocus) {
+
+ super.getTreeCellRendererComponent(
+ tree, value, sel,
+ expanded, leaf, row,
+ hasFocus);
+
+ DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
+ XBrowseNode xbn = (XBrowseNode)node.getUserObject();
+ if (xbn.getType() == BrowseNodeTypes.SCRIPT) {
+ setIcon(scriptIcon);
+ }
+ else if(xbn.getType() == BrowseNodeTypes.CONTAINER) {
+ setIcon(containerIcon);
+ }
+ else if(xbn.getType() == BrowseNodeTypes.ROOT) {
+ setIcon(sofficeIcon);
+ }
+
+ return this;
+ }
+}
+
+class ScriptTableModel extends AbstractTableModel {
+ final String[] columnNames = {"Name", "Full Name"};
+ private Vector scripts;
+
+ public ScriptTableModel(XBrowseNode myrootnode) {
+ scripts = new Vector();
+ addScriptNodes(myrootnode);
+ }
+
+ private void addScriptNodes(XBrowseNode root) {
+ XBrowseNode[] nodes = root.getChildNodes();
+
+ if (nodes != null) {
+ for (int i = 0; i < nodes.length; i++) {
+ if (nodes[i].getType() == BrowseNodeTypes.SCRIPT) {
+ scripts.addElement(nodes[i]);
+ }
+ else {
+ addScriptNodes(nodes[i]);
+ }
+ }
+ }
+ }
+
+ public int getColumnCount() {
+ return columnNames.length;
+ }
+
+ public int getRowCount() {
+ return scripts.size();
+ }
+
+ public String getColumnName(int col) {
+ return columnNames[col];
+ }
+
+ public Object getValueAt(int row, int col) {
+ String result = "";
+
+ XBrowseNode xbn = (XBrowseNode)scripts.elementAt(row);
+
+ if (col == 0)
+ result = xbn.getName();
+ else if (col == 1)
+ result = xbn.getName();
+
+ return result;
+ }
+
+ public boolean isCellEditable(int row, int col) {
+ return false;
+ }
+
+ public void setValueAt(Object value, int row, int col) {
+ return;
+ }
+}
diff --git a/scripting/examples/java/selector/parcel-descriptor.xml b/scripting/examples/java/selector/parcel-descriptor.xml
new file mode 100644
index 000000000000..5d840e70d04a
--- /dev/null
+++ b/scripting/examples/java/selector/parcel-descriptor.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<parcel language="Java" xmlns:parcel="scripting.dtd">
+ <script language="Java">
+ <locale lang="en">
+ <displayname value="Script Selector"/>
+ <description>
+ Prototype Script Selector GUI for StarOffice
+ </description>
+ </locale>
+ <functionname value="ScriptSelector.go"/>
+ <logicalname value="ScriptSelector.go"/>
+ <languagedepprops>
+ <prop name="classpath" value="selector.jar"/>
+ </languagedepprops>
+ </script>
+</parcel>