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