IssueZilla 12906

Add Script Selector Java GUI as example java script
This commit is contained in:
Tomas O'Connor
2003-09-04 08:48:33 +00:00
parent 6c434faa81
commit 115a2ecfe3
3 changed files with 561 additions and 2 deletions

View File

@@ -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;
}
}

View File

@@ -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>