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