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