1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski import javax.swing.*; 23*b1cdbd2cSJim Jagielski import javax.swing.tree.*; 24*b1cdbd2cSJim Jagielski import javax.swing.table.*; 25*b1cdbd2cSJim Jagielski import javax.swing.event.*; 26*b1cdbd2cSJim Jagielski import javax.swing.border.*; 27*b1cdbd2cSJim Jagielski import java.awt.*; 28*b1cdbd2cSJim Jagielski import java.awt.event.*; 29*b1cdbd2cSJim Jagielski import java.util.*; 30*b1cdbd2cSJim Jagielski import java.beans.*; 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime; 33*b1cdbd2cSJim Jagielski import com.sun.star.uno.Exception; 34*b1cdbd2cSJim Jagielski import com.sun.star.uno.Any; 35*b1cdbd2cSJim Jagielski import com.sun.star.uno.AnyConverter; 36*b1cdbd2cSJim Jagielski import com.sun.star.uno.Type; 37*b1cdbd2cSJim Jagielski import com.sun.star.uno.XComponentContext; 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiComponentFactory; 40*b1cdbd2cSJim Jagielski import com.sun.star.lang.XComponent; 41*b1cdbd2cSJim Jagielski import com.sun.star.frame.XModel; 42*b1cdbd2cSJim Jagielski import com.sun.star.frame.FrameSearchFlag; 43*b1cdbd2cSJim Jagielski import com.sun.star.frame.XDispatchProvider; 44*b1cdbd2cSJim Jagielski import com.sun.star.frame.XDispatchHelper; 45*b1cdbd2cSJim Jagielski import com.sun.star.frame.XDispatch; 46*b1cdbd2cSJim Jagielski import com.sun.star.util.XURLTransformer; 47*b1cdbd2cSJim Jagielski import com.sun.star.beans.*; 48*b1cdbd2cSJim Jagielski import com.sun.star.script.XInvocation; 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski import com.sun.star.lib.uno.helper.PropertySet; 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski import com.sun.star.script.browse.XBrowseNode; 53*b1cdbd2cSJim Jagielski import com.sun.star.script.browse.BrowseNodeTypes; 54*b1cdbd2cSJim Jagielski import com.sun.star.script.browse.XBrowseNodeFactory; 55*b1cdbd2cSJim Jagielski import com.sun.star.script.browse.BrowseNodeFactoryViewTypes; 56*b1cdbd2cSJim Jagielski import com.sun.star.script.provider.XScriptContext; 57*b1cdbd2cSJim Jagielski import com.sun.star.script.provider.XScript; 58*b1cdbd2cSJim Jagielski import com.sun.star.script.provider.XScriptProvider; 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski public class ScriptSelector { 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim Jagielski private static final int BIG_GAP = 10; 63*b1cdbd2cSJim Jagielski private static final int MED_GAP = 5; 64*b1cdbd2cSJim Jagielski 65*b1cdbd2cSJim Jagielski private ScriptSelectorPanel selectorPanel; 66*b1cdbd2cSJim Jagielski ScriptSelector()67*b1cdbd2cSJim Jagielski public ScriptSelector() 68*b1cdbd2cSJim Jagielski { 69*b1cdbd2cSJim Jagielski } 70*b1cdbd2cSJim Jagielski showOrganizer(final XScriptContext ctxt)71*b1cdbd2cSJim Jagielski public void showOrganizer(final XScriptContext ctxt) 72*b1cdbd2cSJim Jagielski { 73*b1cdbd2cSJim Jagielski try { 74*b1cdbd2cSJim Jagielski XBrowseNode root = getRootNode(ctxt); 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski final XScriptProvider msp = 77*b1cdbd2cSJim Jagielski (XScriptProvider)UnoRuntime.queryInterface( 78*b1cdbd2cSJim Jagielski XScriptProvider.class, root); 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski final JFrame client = new JFrame("Script"); 81*b1cdbd2cSJim Jagielski 82*b1cdbd2cSJim Jagielski selectorPanel = new ScriptSelectorPanel(root); 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski final JButton runButton, closeButton, createButton, 85*b1cdbd2cSJim Jagielski editButton, deleteButton; 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski runButton = new JButton("Run"); 88*b1cdbd2cSJim Jagielski runButton.setEnabled(false); 89*b1cdbd2cSJim Jagielski 90*b1cdbd2cSJim Jagielski closeButton = new JButton("Close"); 91*b1cdbd2cSJim Jagielski 92*b1cdbd2cSJim Jagielski editButton = new JButton("Edit"); 93*b1cdbd2cSJim Jagielski editButton.setEnabled(false); 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski JPanel northButtons = 96*b1cdbd2cSJim Jagielski new JPanel(new GridLayout(2, 1, MED_GAP, MED_GAP)); 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski northButtons.add(runButton); 99*b1cdbd2cSJim Jagielski northButtons.add(closeButton); 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski createButton = new JButton("Create"); 102*b1cdbd2cSJim Jagielski createButton.setEnabled(false); 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski deleteButton = new JButton("Delete"); 105*b1cdbd2cSJim Jagielski deleteButton.setEnabled(false); 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski JPanel southButtons = 108*b1cdbd2cSJim Jagielski new JPanel(new GridLayout(3, 1, MED_GAP, MED_GAP)); 109*b1cdbd2cSJim Jagielski 110*b1cdbd2cSJim Jagielski southButtons.add(editButton); 111*b1cdbd2cSJim Jagielski southButtons.add(createButton); 112*b1cdbd2cSJim Jagielski southButtons.add(deleteButton); 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski selectorPanel.tree.addTreeSelectionListener( 115*b1cdbd2cSJim Jagielski new TreeSelectionListener() { 116*b1cdbd2cSJim Jagielski public void valueChanged(TreeSelectionEvent e) { 117*b1cdbd2cSJim Jagielski XBrowseNode xbn = selectorPanel.getSelection(); 118*b1cdbd2cSJim Jagielski XPropertySet props = (XPropertySet) 119*b1cdbd2cSJim Jagielski UnoRuntime.queryInterface(XPropertySet.class, xbn); 120*b1cdbd2cSJim Jagielski 121*b1cdbd2cSJim Jagielski checkEnabled(props, "Creatable", createButton); 122*b1cdbd2cSJim Jagielski checkEnabled(props, "Deletable", deleteButton); 123*b1cdbd2cSJim Jagielski checkEnabled(props, "Editable", editButton); 124*b1cdbd2cSJim Jagielski 125*b1cdbd2cSJim Jagielski if (xbn != null && 126*b1cdbd2cSJim Jagielski xbn.getType() == BrowseNodeTypes.SCRIPT) 127*b1cdbd2cSJim Jagielski { 128*b1cdbd2cSJim Jagielski runButton.setEnabled(true); 129*b1cdbd2cSJim Jagielski } 130*b1cdbd2cSJim Jagielski else 131*b1cdbd2cSJim Jagielski { 132*b1cdbd2cSJim Jagielski runButton.setEnabled(false); 133*b1cdbd2cSJim Jagielski } 134*b1cdbd2cSJim Jagielski } 135*b1cdbd2cSJim Jagielski } 136*b1cdbd2cSJim Jagielski ); 137*b1cdbd2cSJim Jagielski 138*b1cdbd2cSJim Jagielski ActionListener listener = new ActionListener() { 139*b1cdbd2cSJim Jagielski public void actionPerformed(ActionEvent event) { 140*b1cdbd2cSJim Jagielski if (event.getSource() == runButton) { 141*b1cdbd2cSJim Jagielski String uri = selectorPanel.textField.getText(); 142*b1cdbd2cSJim Jagielski 143*b1cdbd2cSJim Jagielski try { 144*b1cdbd2cSJim Jagielski XScript script = msp.getScript(uri); 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski Object[][] out = new Object[1][0]; 147*b1cdbd2cSJim Jagielski out[0] = new Object[0]; 148*b1cdbd2cSJim Jagielski 149*b1cdbd2cSJim Jagielski short[][] num = new short[1][0]; 150*b1cdbd2cSJim Jagielski num[0] = new short[0]; 151*b1cdbd2cSJim Jagielski 152*b1cdbd2cSJim Jagielski script.invoke(new Object[0], num, out); 153*b1cdbd2cSJim Jagielski } 154*b1cdbd2cSJim Jagielski catch (Exception e) { 155*b1cdbd2cSJim Jagielski e.printStackTrace(); 156*b1cdbd2cSJim Jagielski } 157*b1cdbd2cSJim Jagielski } 158*b1cdbd2cSJim Jagielski else if (event.getSource() == closeButton) { 159*b1cdbd2cSJim Jagielski client.dispose(); 160*b1cdbd2cSJim Jagielski } 161*b1cdbd2cSJim Jagielski else if (event.getSource() == editButton) { 162*b1cdbd2cSJim Jagielski DefaultMutableTreeNode node = 163*b1cdbd2cSJim Jagielski (DefaultMutableTreeNode) 164*b1cdbd2cSJim Jagielski selectorPanel.tree.getLastSelectedPathComponent(); 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski if (node == null) return; 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski showEditor(ctxt, node); 169*b1cdbd2cSJim Jagielski } 170*b1cdbd2cSJim Jagielski else if (event.getSource() == createButton) { 171*b1cdbd2cSJim Jagielski DefaultMutableTreeNode node = 172*b1cdbd2cSJim Jagielski (DefaultMutableTreeNode) 173*b1cdbd2cSJim Jagielski selectorPanel.tree.getLastSelectedPathComponent(); 174*b1cdbd2cSJim Jagielski 175*b1cdbd2cSJim Jagielski if (node == null) return; 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski doCreate(ctxt, node); 178*b1cdbd2cSJim Jagielski } 179*b1cdbd2cSJim Jagielski else if (event.getSource() == deleteButton) { 180*b1cdbd2cSJim Jagielski DefaultMutableTreeNode node = 181*b1cdbd2cSJim Jagielski (DefaultMutableTreeNode) 182*b1cdbd2cSJim Jagielski selectorPanel.tree.getLastSelectedPathComponent(); 183*b1cdbd2cSJim Jagielski 184*b1cdbd2cSJim Jagielski if (node == null) return; 185*b1cdbd2cSJim Jagielski 186*b1cdbd2cSJim Jagielski doDelete(ctxt, node); 187*b1cdbd2cSJim Jagielski } 188*b1cdbd2cSJim Jagielski } 189*b1cdbd2cSJim Jagielski }; 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski runButton.addActionListener(listener); 192*b1cdbd2cSJim Jagielski closeButton.addActionListener(listener); 193*b1cdbd2cSJim Jagielski createButton.addActionListener(listener); 194*b1cdbd2cSJim Jagielski editButton.addActionListener(listener); 195*b1cdbd2cSJim Jagielski deleteButton.addActionListener(listener); 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski JPanel buttonPanel = new JPanel(new BorderLayout()); 198*b1cdbd2cSJim Jagielski buttonPanel.add(northButtons, BorderLayout.NORTH); 199*b1cdbd2cSJim Jagielski buttonPanel.add(southButtons, BorderLayout.SOUTH); 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski JPanel mainPanel = new JPanel(new BorderLayout(MED_GAP, MED_GAP)); 202*b1cdbd2cSJim Jagielski mainPanel.setBorder( 203*b1cdbd2cSJim Jagielski new EmptyBorder(BIG_GAP, BIG_GAP, BIG_GAP, BIG_GAP)); 204*b1cdbd2cSJim Jagielski mainPanel.add(selectorPanel, BorderLayout.CENTER); 205*b1cdbd2cSJim Jagielski mainPanel.add(buttonPanel, BorderLayout.EAST); 206*b1cdbd2cSJim Jagielski 207*b1cdbd2cSJim Jagielski client.getContentPane().add(mainPanel); 208*b1cdbd2cSJim Jagielski client.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 209*b1cdbd2cSJim Jagielski client.setSize(500, 350); 210*b1cdbd2cSJim Jagielski 211*b1cdbd2cSJim Jagielski // set the x and y locations so that the frame is in the 212*b1cdbd2cSJim Jagielski // centre of the screen 213*b1cdbd2cSJim Jagielski Dimension d = client.getToolkit().getScreenSize(); 214*b1cdbd2cSJim Jagielski 215*b1cdbd2cSJim Jagielski int x = (int)((d.getWidth() - client.getWidth()) / 2); 216*b1cdbd2cSJim Jagielski int y = (int)((d.getHeight() - client.getHeight()) / 2); 217*b1cdbd2cSJim Jagielski 218*b1cdbd2cSJim Jagielski client.setLocation(x, y); 219*b1cdbd2cSJim Jagielski 220*b1cdbd2cSJim Jagielski client.show(); 221*b1cdbd2cSJim Jagielski } 222*b1cdbd2cSJim Jagielski catch (com.sun.star.uno.RuntimeException rue) { 223*b1cdbd2cSJim Jagielski rue.printStackTrace(); 224*b1cdbd2cSJim Jagielski } 225*b1cdbd2cSJim Jagielski catch (java.lang.Exception e) { 226*b1cdbd2cSJim Jagielski e.printStackTrace(); 227*b1cdbd2cSJim Jagielski } 228*b1cdbd2cSJim Jagielski } 229*b1cdbd2cSJim Jagielski showOrganizer(final XScriptContext ctxt, final com.sun.star.awt.MouseEvent e)230*b1cdbd2cSJim Jagielski public void showOrganizer(final XScriptContext ctxt, 231*b1cdbd2cSJim Jagielski final com.sun.star.awt.MouseEvent e) 232*b1cdbd2cSJim Jagielski { 233*b1cdbd2cSJim Jagielski showOrganizer(ctxt); 234*b1cdbd2cSJim Jagielski } 235*b1cdbd2cSJim Jagielski showOrganizer(final XScriptContext ctxt, final com.sun.star.awt.ActionEvent e)236*b1cdbd2cSJim Jagielski public void showOrganizer(final XScriptContext ctxt, 237*b1cdbd2cSJim Jagielski final com.sun.star.awt.ActionEvent e) 238*b1cdbd2cSJim Jagielski { 239*b1cdbd2cSJim Jagielski showOrganizer(ctxt); 240*b1cdbd2cSJim Jagielski } 241*b1cdbd2cSJim Jagielski doDelete( XScriptContext ctxt, DefaultMutableTreeNode node)242*b1cdbd2cSJim Jagielski private void doDelete( 243*b1cdbd2cSJim Jagielski XScriptContext ctxt, DefaultMutableTreeNode node) 244*b1cdbd2cSJim Jagielski { 245*b1cdbd2cSJim Jagielski Object obj = node.getUserObject(); 246*b1cdbd2cSJim Jagielski XInvocation inv = 247*b1cdbd2cSJim Jagielski (XInvocation)UnoRuntime.queryInterface( 248*b1cdbd2cSJim Jagielski XInvocation.class, obj); 249*b1cdbd2cSJim Jagielski Object[] args = new Object[] { ctxt }; 250*b1cdbd2cSJim Jagielski try { 251*b1cdbd2cSJim Jagielski Object result = inv.invoke("Deletable", args, 252*b1cdbd2cSJim Jagielski new short[1][0], new Object[1][0]); 253*b1cdbd2cSJim Jagielski 254*b1cdbd2cSJim Jagielski if (result != null && AnyConverter.toBoolean(result) == true) 255*b1cdbd2cSJim Jagielski { 256*b1cdbd2cSJim Jagielski selectorPanel.removeNode(node); 257*b1cdbd2cSJim Jagielski } 258*b1cdbd2cSJim Jagielski } 259*b1cdbd2cSJim Jagielski catch (Exception e) { 260*b1cdbd2cSJim Jagielski e.printStackTrace(); 261*b1cdbd2cSJim Jagielski } 262*b1cdbd2cSJim Jagielski } 263*b1cdbd2cSJim Jagielski doCreate( XScriptContext ctxt, DefaultMutableTreeNode node)264*b1cdbd2cSJim Jagielski private void doCreate( 265*b1cdbd2cSJim Jagielski XScriptContext ctxt, DefaultMutableTreeNode node) 266*b1cdbd2cSJim Jagielski { 267*b1cdbd2cSJim Jagielski Object obj = node.getUserObject(); 268*b1cdbd2cSJim Jagielski XInvocation inv = 269*b1cdbd2cSJim Jagielski (XInvocation)UnoRuntime.queryInterface( 270*b1cdbd2cSJim Jagielski XInvocation.class, obj); 271*b1cdbd2cSJim Jagielski Object[] args = new Object[] { ctxt }; 272*b1cdbd2cSJim Jagielski try { 273*b1cdbd2cSJim Jagielski Object result = inv.invoke("Creatable", args, 274*b1cdbd2cSJim Jagielski new short[1][0], new Object[1][0]); 275*b1cdbd2cSJim Jagielski 276*b1cdbd2cSJim Jagielski if (result != null) 277*b1cdbd2cSJim Jagielski { 278*b1cdbd2cSJim Jagielski XBrowseNode xbn = (XBrowseNode) 279*b1cdbd2cSJim Jagielski AnyConverter.toObject(new Type(XBrowseNode.class), result); 280*b1cdbd2cSJim Jagielski selectorPanel.addNode(node, xbn); 281*b1cdbd2cSJim Jagielski } 282*b1cdbd2cSJim Jagielski } 283*b1cdbd2cSJim Jagielski catch (Exception e) { 284*b1cdbd2cSJim Jagielski e.printStackTrace(); 285*b1cdbd2cSJim Jagielski } 286*b1cdbd2cSJim Jagielski } 287*b1cdbd2cSJim Jagielski showEditor( XScriptContext ctxt, DefaultMutableTreeNode node)288*b1cdbd2cSJim Jagielski private void showEditor( 289*b1cdbd2cSJim Jagielski XScriptContext ctxt, DefaultMutableTreeNode node) 290*b1cdbd2cSJim Jagielski { 291*b1cdbd2cSJim Jagielski Object obj = node.getUserObject(); 292*b1cdbd2cSJim Jagielski XInvocation inv = 293*b1cdbd2cSJim Jagielski (XInvocation)UnoRuntime.queryInterface( 294*b1cdbd2cSJim Jagielski XInvocation.class, obj); 295*b1cdbd2cSJim Jagielski Object[] args = new Object[] { ctxt }; 296*b1cdbd2cSJim Jagielski try { 297*b1cdbd2cSJim Jagielski inv.invoke("Editable", args, 298*b1cdbd2cSJim Jagielski new short[1][0], new Object[1][0]); 299*b1cdbd2cSJim Jagielski } 300*b1cdbd2cSJim Jagielski catch (Exception e) { 301*b1cdbd2cSJim Jagielski e.printStackTrace(); 302*b1cdbd2cSJim Jagielski } 303*b1cdbd2cSJim Jagielski } 304*b1cdbd2cSJim Jagielski checkEnabled(XPropertySet props, String name, JButton button)305*b1cdbd2cSJim Jagielski private void checkEnabled(XPropertySet props, String name, 306*b1cdbd2cSJim Jagielski JButton button) 307*b1cdbd2cSJim Jagielski { 308*b1cdbd2cSJim Jagielski boolean enable = false; 309*b1cdbd2cSJim Jagielski 310*b1cdbd2cSJim Jagielski try 311*b1cdbd2cSJim Jagielski { 312*b1cdbd2cSJim Jagielski if (props != null) 313*b1cdbd2cSJim Jagielski { 314*b1cdbd2cSJim Jagielski Object o = props.getPropertyValue(name); 315*b1cdbd2cSJim Jagielski enable = AnyConverter.toBoolean( 316*b1cdbd2cSJim Jagielski props.getPropertyValue(name)); 317*b1cdbd2cSJim Jagielski } 318*b1cdbd2cSJim Jagielski } 319*b1cdbd2cSJim Jagielski catch (com.sun.star.lang.IllegalArgumentException iae) 320*b1cdbd2cSJim Jagielski { 321*b1cdbd2cSJim Jagielski // leave enable set to false 322*b1cdbd2cSJim Jagielski } 323*b1cdbd2cSJim Jagielski catch (com.sun.star.beans.UnknownPropertyException upe) 324*b1cdbd2cSJim Jagielski { 325*b1cdbd2cSJim Jagielski // leave enable set to false 326*b1cdbd2cSJim Jagielski } 327*b1cdbd2cSJim Jagielski catch (com.sun.star.lang.WrappedTargetException wte) 328*b1cdbd2cSJim Jagielski { 329*b1cdbd2cSJim Jagielski // leave enable set to false 330*b1cdbd2cSJim Jagielski } 331*b1cdbd2cSJim Jagielski 332*b1cdbd2cSJim Jagielski button.setEnabled(enable); 333*b1cdbd2cSJim Jagielski } 334*b1cdbd2cSJim Jagielski getRootNode(XScriptContext ctxt)335*b1cdbd2cSJim Jagielski private XBrowseNode getRootNode(XScriptContext ctxt) { 336*b1cdbd2cSJim Jagielski 337*b1cdbd2cSJim Jagielski XBrowseNode result = null; 338*b1cdbd2cSJim Jagielski 339*b1cdbd2cSJim Jagielski 340*b1cdbd2cSJim Jagielski XComponentContext xcc = ctxt.getComponentContext(); 341*b1cdbd2cSJim Jagielski XMultiComponentFactory xmcf = xcc.getServiceManager(); 342*b1cdbd2cSJim Jagielski XBrowseNodeFactory xBrowseFac = (XBrowseNodeFactory) 343*b1cdbd2cSJim Jagielski UnoRuntime.queryInterface( XBrowseNodeFactory.class, xcc.getValueByName( 344*b1cdbd2cSJim Jagielski "/singletons/com.sun.star.script.browse.theBrowseNodeFactory") ); 345*b1cdbd2cSJim Jagielski 346*b1cdbd2cSJim Jagielski 347*b1cdbd2cSJim Jagielski result = (XBrowseNode)UnoRuntime.queryInterface( 348*b1cdbd2cSJim Jagielski XBrowseNode.class, xBrowseFac.createView( BrowseNodeFactoryViewTypes.MACROORGANIZER ) ); 349*b1cdbd2cSJim Jagielski return result; 350*b1cdbd2cSJim Jagielski } 351*b1cdbd2cSJim Jagielski } 352*b1cdbd2cSJim Jagielski 353*b1cdbd2cSJim Jagielski class ScriptSelectorPanel extends JPanel { 354*b1cdbd2cSJim Jagielski 355*b1cdbd2cSJim Jagielski private XBrowseNode myrootnode = null; 356*b1cdbd2cSJim Jagielski public JTextField textField; 357*b1cdbd2cSJim Jagielski public JTree tree; 358*b1cdbd2cSJim Jagielski public DefaultTreeModel treeModel; 359*b1cdbd2cSJim Jagielski ScriptSelectorPanel(XBrowseNode root)360*b1cdbd2cSJim Jagielski public ScriptSelectorPanel(XBrowseNode root) 361*b1cdbd2cSJim Jagielski { 362*b1cdbd2cSJim Jagielski this.myrootnode = root; 363*b1cdbd2cSJim Jagielski initUI(); 364*b1cdbd2cSJim Jagielski } 365*b1cdbd2cSJim Jagielski getSelection()366*b1cdbd2cSJim Jagielski public XBrowseNode getSelection() { 367*b1cdbd2cSJim Jagielski DefaultMutableTreeNode node = (DefaultMutableTreeNode) 368*b1cdbd2cSJim Jagielski tree.getLastSelectedPathComponent(); 369*b1cdbd2cSJim Jagielski 370*b1cdbd2cSJim Jagielski if (node == null) { 371*b1cdbd2cSJim Jagielski return null; 372*b1cdbd2cSJim Jagielski } 373*b1cdbd2cSJim Jagielski 374*b1cdbd2cSJim Jagielski return (XBrowseNode)node.getUserObject(); 375*b1cdbd2cSJim Jagielski } 376*b1cdbd2cSJim Jagielski initUI()377*b1cdbd2cSJim Jagielski private void initUI() { 378*b1cdbd2cSJim Jagielski setLayout(new BorderLayout()); 379*b1cdbd2cSJim Jagielski 380*b1cdbd2cSJim Jagielski DefaultMutableTreeNode top = 381*b1cdbd2cSJim Jagielski new DefaultMutableTreeNode(myrootnode) { 382*b1cdbd2cSJim Jagielski public String toString() { 383*b1cdbd2cSJim Jagielski return ((XBrowseNode)getUserObject()).getName(); 384*b1cdbd2cSJim Jagielski } 385*b1cdbd2cSJim Jagielski }; 386*b1cdbd2cSJim Jagielski initNodes(myrootnode, top); 387*b1cdbd2cSJim Jagielski treeModel = new DefaultTreeModel(top); 388*b1cdbd2cSJim Jagielski tree = new JTree(treeModel); 389*b1cdbd2cSJim Jagielski 390*b1cdbd2cSJim Jagielski tree.setCellRenderer(new ScriptTreeRenderer()); 391*b1cdbd2cSJim Jagielski 392*b1cdbd2cSJim Jagielski tree.getSelectionModel().setSelectionMode 393*b1cdbd2cSJim Jagielski (TreeSelectionModel.SINGLE_TREE_SELECTION); 394*b1cdbd2cSJim Jagielski 395*b1cdbd2cSJim Jagielski tree.addTreeSelectionListener(new TreeSelectionListener() { 396*b1cdbd2cSJim Jagielski public void valueChanged(TreeSelectionEvent e) { 397*b1cdbd2cSJim Jagielski XBrowseNode xbn = getSelection(); 398*b1cdbd2cSJim Jagielski XPropertySet props = (XPropertySet)UnoRuntime.queryInterface( 399*b1cdbd2cSJim Jagielski XPropertySet.class, xbn); 400*b1cdbd2cSJim Jagielski 401*b1cdbd2cSJim Jagielski if (xbn == null) { 402*b1cdbd2cSJim Jagielski textField.setText(""); 403*b1cdbd2cSJim Jagielski return; 404*b1cdbd2cSJim Jagielski } 405*b1cdbd2cSJim Jagielski 406*b1cdbd2cSJim Jagielski String str = xbn.getName(); 407*b1cdbd2cSJim Jagielski if (xbn.getType() == BrowseNodeTypes.SCRIPT && props != null) 408*b1cdbd2cSJim Jagielski { 409*b1cdbd2cSJim Jagielski try { 410*b1cdbd2cSJim Jagielski str = AnyConverter.toString( 411*b1cdbd2cSJim Jagielski props.getPropertyValue("URI")); 412*b1cdbd2cSJim Jagielski } 413*b1cdbd2cSJim Jagielski catch (Exception ignore) { 414*b1cdbd2cSJim Jagielski // default will be used 415*b1cdbd2cSJim Jagielski } 416*b1cdbd2cSJim Jagielski } 417*b1cdbd2cSJim Jagielski textField.setText(str); 418*b1cdbd2cSJim Jagielski } 419*b1cdbd2cSJim Jagielski }); 420*b1cdbd2cSJim Jagielski 421*b1cdbd2cSJim Jagielski JScrollPane scroller = new JScrollPane(tree); 422*b1cdbd2cSJim Jagielski add(scroller, BorderLayout.CENTER); 423*b1cdbd2cSJim Jagielski 424*b1cdbd2cSJim Jagielski textField = new JTextField(); 425*b1cdbd2cSJim Jagielski add(textField, BorderLayout.SOUTH); 426*b1cdbd2cSJim Jagielski } 427*b1cdbd2cSJim Jagielski removeNode(DefaultMutableTreeNode node)428*b1cdbd2cSJim Jagielski public void removeNode(DefaultMutableTreeNode node) { 429*b1cdbd2cSJim Jagielski MutableTreeNode parent = (MutableTreeNode)(node.getParent()); 430*b1cdbd2cSJim Jagielski if (parent != null) { 431*b1cdbd2cSJim Jagielski treeModel.removeNodeFromParent(node); 432*b1cdbd2cSJim Jagielski } 433*b1cdbd2cSJim Jagielski } 434*b1cdbd2cSJim Jagielski addNode(DefaultMutableTreeNode parent, XBrowseNode xbn)435*b1cdbd2cSJim Jagielski public void addNode(DefaultMutableTreeNode parent, XBrowseNode xbn) { 436*b1cdbd2cSJim Jagielski DefaultMutableTreeNode newNode = 437*b1cdbd2cSJim Jagielski new DefaultMutableTreeNode(xbn) { 438*b1cdbd2cSJim Jagielski public String toString() { 439*b1cdbd2cSJim Jagielski return ((XBrowseNode)getUserObject()).getName(); 440*b1cdbd2cSJim Jagielski } 441*b1cdbd2cSJim Jagielski }; 442*b1cdbd2cSJim Jagielski 443*b1cdbd2cSJim Jagielski treeModel.insertNodeInto(newNode, parent, parent.getChildCount()); 444*b1cdbd2cSJim Jagielski tree.scrollPathToVisible(new TreePath(newNode.getPath())); 445*b1cdbd2cSJim Jagielski } 446*b1cdbd2cSJim Jagielski initNodes(XBrowseNode parent, DefaultMutableTreeNode top)447*b1cdbd2cSJim Jagielski private void initNodes(XBrowseNode parent, DefaultMutableTreeNode top) { 448*b1cdbd2cSJim Jagielski if ( parent == null || parent.hasChildNodes() == false ) 449*b1cdbd2cSJim Jagielski { 450*b1cdbd2cSJim Jagielski return; 451*b1cdbd2cSJim Jagielski } 452*b1cdbd2cSJim Jagielski 453*b1cdbd2cSJim Jagielski XBrowseNode[] children = parent.getChildNodes(); 454*b1cdbd2cSJim Jagielski 455*b1cdbd2cSJim Jagielski try { 456*b1cdbd2cSJim Jagielski if (children != null) { 457*b1cdbd2cSJim Jagielski for (int i = 0; i < children.length; i++) { 458*b1cdbd2cSJim Jagielski if ( children[i] == null ) 459*b1cdbd2cSJim Jagielski { 460*b1cdbd2cSJim Jagielski continue; 461*b1cdbd2cSJim Jagielski } 462*b1cdbd2cSJim Jagielski DefaultMutableTreeNode newNode = 463*b1cdbd2cSJim Jagielski new DefaultMutableTreeNode(children[i]) { 464*b1cdbd2cSJim Jagielski public String toString() { 465*b1cdbd2cSJim Jagielski return ((XBrowseNode)getUserObject()).getName(); 466*b1cdbd2cSJim Jagielski } 467*b1cdbd2cSJim Jagielski }; 468*b1cdbd2cSJim Jagielski top.add(newNode); 469*b1cdbd2cSJim Jagielski initNodes(children[i], newNode); 470*b1cdbd2cSJim Jagielski } 471*b1cdbd2cSJim Jagielski } 472*b1cdbd2cSJim Jagielski } 473*b1cdbd2cSJim Jagielski catch (java.lang.Exception e) { 474*b1cdbd2cSJim Jagielski e.printStackTrace(); 475*b1cdbd2cSJim Jagielski } 476*b1cdbd2cSJim Jagielski } 477*b1cdbd2cSJim Jagielski } 478*b1cdbd2cSJim Jagielski 479*b1cdbd2cSJim Jagielski class ScriptTreeRenderer extends DefaultTreeCellRenderer { 480*b1cdbd2cSJim Jagielski 481*b1cdbd2cSJim Jagielski private ImageIcon sofficeIcon; 482*b1cdbd2cSJim Jagielski private ImageIcon scriptIcon; 483*b1cdbd2cSJim Jagielski private ImageIcon containerIcon; 484*b1cdbd2cSJim Jagielski ScriptTreeRenderer()485*b1cdbd2cSJim Jagielski public ScriptTreeRenderer() { 486*b1cdbd2cSJim Jagielski sofficeIcon = new ImageIcon(getClass().getResource("soffice.gif")); 487*b1cdbd2cSJim Jagielski scriptIcon = new ImageIcon(getClass().getResource("script.gif")); 488*b1cdbd2cSJim Jagielski containerIcon = new ImageIcon(getClass().getResource("container.gif")); 489*b1cdbd2cSJim Jagielski } 490*b1cdbd2cSJim Jagielski getTreeCellRendererComponent( JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus)491*b1cdbd2cSJim Jagielski public Component getTreeCellRendererComponent( 492*b1cdbd2cSJim Jagielski JTree tree, 493*b1cdbd2cSJim Jagielski Object value, 494*b1cdbd2cSJim Jagielski boolean sel, 495*b1cdbd2cSJim Jagielski boolean expanded, 496*b1cdbd2cSJim Jagielski boolean leaf, 497*b1cdbd2cSJim Jagielski int row, 498*b1cdbd2cSJim Jagielski boolean hasFocus) { 499*b1cdbd2cSJim Jagielski 500*b1cdbd2cSJim Jagielski super.getTreeCellRendererComponent( 501*b1cdbd2cSJim Jagielski tree, value, sel, 502*b1cdbd2cSJim Jagielski expanded, leaf, row, 503*b1cdbd2cSJim Jagielski hasFocus); 504*b1cdbd2cSJim Jagielski 505*b1cdbd2cSJim Jagielski DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; 506*b1cdbd2cSJim Jagielski XBrowseNode xbn = (XBrowseNode)node.getUserObject(); 507*b1cdbd2cSJim Jagielski if (xbn.getType() == BrowseNodeTypes.SCRIPT) { 508*b1cdbd2cSJim Jagielski setIcon(scriptIcon); 509*b1cdbd2cSJim Jagielski } 510*b1cdbd2cSJim Jagielski else if(xbn.getType() == BrowseNodeTypes.CONTAINER) { 511*b1cdbd2cSJim Jagielski setIcon(containerIcon); 512*b1cdbd2cSJim Jagielski } 513*b1cdbd2cSJim Jagielski else if(xbn.getType() == BrowseNodeTypes.ROOT) { 514*b1cdbd2cSJim Jagielski setIcon(sofficeIcon); 515*b1cdbd2cSJim Jagielski } 516*b1cdbd2cSJim Jagielski 517*b1cdbd2cSJim Jagielski return this; 518*b1cdbd2cSJim Jagielski } 519*b1cdbd2cSJim Jagielski } 520