office-gobmx/odk/examples/java/Inspector/SwingTreeControlProvider.java

427 lines
18 KiB
Java

/*************************************************************************
*
* The Contents of this file are made available subject to the terms of
* the BSD license.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of Sun Microsystems, Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*************************************************************************/
import com.sun.star.beans.Property;
import com.sun.star.beans.PropertyValue;
import com.sun.star.lang.NullPointerException;
import com.sun.star.reflection.XConstantTypeDescription;
import com.sun.star.reflection.XIdlMethod;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.Type;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.tree.DefaultTreeSelectionModel;
import javax.swing.tree.ExpandVetoException;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
public class SwingTreeControlProvider implements XTreeControlProvider{
private JTextArea jtxtGeneratedSourceCode = new JTextArea();
private JTextField jtxtFilter = new JTextField();
private javax.swing.JLabel jlblFilter = new javax.swing.JLabel("Set a filter");
private JPanel jPnlBottom = new JPanel(new BorderLayout());
private JPanel jPanelProgress = new JPanel(new BorderLayout());
private JPanel jPnlPath = new JPanel(new BorderLayout());
private JLabel jLblPath = new JLabel("Generated source code");
private JProgressBar jProgressBar1 = new JProgressBar();
private JTree jTree = new javax.swing.JTree();
private XDialogProvider m_xDialogProvider;
private HideableTreeModel treeModel;
private UnoTreeRenderer oUnoTreeRenderer;
private InspectorPane m_oInspectorPane;
private Object oUserDefinedObject = null;
private boolean bIsUserDefined = false;
private SwingUnoNode oRootNode;
private final int nDIALOGWIDTH = 800;
public SwingTreeControlProvider(XDialogProvider _xDialogProvider){
m_xDialogProvider = _xDialogProvider;
}
public void addInspectorPane(InspectorPane _oInspectorPane){
m_oInspectorPane = _oInspectorPane;
}
public InspectorPane getInspectorPane() throws NullPointerException{
if (m_oInspectorPane == null){
throw new NullPointerException("InspectorPage has not been added to TreeControl");
}
else{
return m_oInspectorPane;
}
}
private void ComponentSelector(Object _oRootObject, String _sRootTreeNodeName) {
String sTreeNodeName = _sRootTreeNodeName;
oRootNode = new SwingUnoNode(_oRootObject);
oRootNode.setLabel(_sRootTreeNodeName);
treeModel = new HideableTreeModel(oRootNode);
jTree.setModel(treeModel);
jTree.setRootVisible(true);
jTree.setVisible(true);
oRootNode.setFoldable(true);
enableFilterElements(null);
}
private void insertTopPanel(JPanel _jPnlCenter){
javax.swing.JPanel jPnlTop = new javax.swing.JPanel(new BorderLayout(10, 10));
jPnlTop.setPreferredSize(new java.awt.Dimension(nDIALOGWIDTH, 20));
jlblFilter.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
jlblFilter.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
jPnlTop.add(jlblFilter, java.awt.BorderLayout.WEST);
jtxtFilter.setHorizontalAlignment(javax.swing.JTextField.LEFT);
jtxtFilter.setPreferredSize(new java.awt.Dimension(200, 10));
jtxtFilter.addKeyListener(new InspectorKeyFilterAdapter());
jPnlTop.add(jtxtFilter, java.awt.BorderLayout.CENTER);
_jPnlCenter.add(jPnlTop, java.awt.BorderLayout.NORTH);
}
private void insertBottomPanel(JSplitPane _jSplitPane){ //JPanel _jPnlCenter){
jtxtGeneratedSourceCode.setTabSize(4);
jtxtGeneratedSourceCode.getAccessibleContext().setAccessibleName("generated SourceCode");
JScrollPane jScrollPane = new JScrollPane(jtxtGeneratedSourceCode);
jScrollPane.setPreferredSize(new Dimension(nDIALOGWIDTH,205));
jtxtGeneratedSourceCode.setEditable(false);
_jSplitPane.setBottomComponent(jScrollPane);
}
private void insertBorderPanes(Container _cp){
JPanel jPnlEast = new JPanel(new BorderLayout());
JPanel jPnlNorth = new JPanel(new BorderLayout());
JPanel jPnlSouth = new JPanel(new BorderLayout());
JPanel jPnlWest = new JPanel(new BorderLayout());
_cp.add(jPnlNorth, java.awt.BorderLayout.NORTH);
jPnlWest.setPreferredSize(new java.awt.Dimension(10, 10));
_cp.add(jPnlWest, java.awt.BorderLayout.WEST);
jPnlEast.setPreferredSize(new java.awt.Dimension(10, 10));
_cp.add(jPnlEast, java.awt.BorderLayout.EAST);
jPnlSouth.setPreferredSize(new java.awt.Dimension(10, 10));
_cp.add(jPnlSouth, java.awt.BorderLayout.SOUTH);
}
public String enableFilterElements(XUnoNode _oUnoNode){
String sFilter ="";
boolean bIsFacetteNode = isFacetteNode(_oUnoNode);
this.jtxtFilter.setEnabled(bIsFacetteNode);
this.jlblFilter.setEnabled(bIsFacetteNode);
sFilter = m_oInspectorPane.getFilter(_oUnoNode);
jtxtFilter.setText(sFilter);
return sFilter;
}
private class InspectorKeyFilterAdapter extends KeyAdapter{
public void keyReleased(KeyEvent e){
String sFilter = jtxtFilter.getText();
SwingTreePathProvider oSwingTreePathProvider = new SwingTreePathProvider(jTree.getSelectionPath());
XUnoNode oUnoNode = oSwingTreePathProvider.getLastPathComponent();
if (oUnoNode instanceof XUnoFacetteNode){
m_oInspectorPane.applyFilter((XUnoFacetteNode) oUnoNode, sFilter);
}
}
}
/** Inspect the given object for methods, properties, interfaces, and
* services.
* @param a The object to inspect
* @throws RuntimeException If
*/
public Object inspect(java.lang.Object _oUserDefinedObject, String _sTitle) throws com.sun.star.uno.RuntimeException {
JPanel jPnlContainer = new javax.swing.JPanel(new BorderLayout(10, 10));
try {
javax.swing.JPanel jPnlCenter = new javax.swing.JPanel();
bIsUserDefined = (_oUserDefinedObject != null);
if (bIsUserDefined){
oUserDefinedObject = _oUserDefinedObject;
m_oInspectorPane.setTitle(_sTitle);
}
javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
TreeSelectionModel tsm = new DefaultTreeSelectionModel();
tsm.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
jTree.setSelectionModel(tsm);
jTree.setVisible(false);
jPnlCenter.setLayout(new java.awt.BorderLayout(10, 10));
jPnlCenter.getAccessibleContext().setAccessibleName("inspection tab view");
insertTopPanel(jPnlCenter);
jScrollPane1.setViewportView(jTree);
jScrollPane1.setPreferredSize(new java.awt.Dimension(600, 600));
jScrollPane1.getAccessibleContext().setAccessibleName("API view scroll pane");
JScrollBar jHScrollBar = jScrollPane1.createHorizontalScrollBar();
jHScrollBar.getAccessibleContext().setAccessibleName("API view horizontal scroll bar");
jScrollPane1.setHorizontalScrollBar(jHScrollBar);
JScrollBar jVScrollBar = jScrollPane1.createVerticalScrollBar();
jVScrollBar.getAccessibleContext().setAccessibleName("API view vertical scroll bar");
jScrollPane1.setVerticalScrollBar(jVScrollBar);
JSplitPane jSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
jSplitPane.setTopComponent(jScrollPane1);
jPnlCenter.add(jSplitPane, java.awt.BorderLayout.CENTER);
jSplitPane.setDividerLocation(500);
insertBottomPanel(jSplitPane);
UnoTreeRenderer oUnoTreeRenderer = new UnoTreeRenderer();
jTree.setCellRenderer(oUnoTreeRenderer);
jTree.addTreeSelectionListener(
new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent event) {
TreePath tp = event.getNewLeadSelectionPath();
if (tp != null){
XUnoNode oUnoNode = getSelectedNode();
String sFilter = enableFilterElements(oUnoNode);
}
}
}
);
// Add KeyListener for help
jTree.addKeyListener( new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent event) {
if ( event.getKeyCode() == KeyEvent.VK_F1 ) {
// function key F1 pressed
TreePath aTreePath = jTree.getSelectionPath();
SwingUnoNode oUnoNode = (SwingUnoNode) aTreePath.getLastPathComponent();
oUnoNode.openIdlDescription(m_xDialogProvider.getIDLPath());
}
}
});
jTree.addMouseListener(new MouseAdapter() {
public void mousePressed (MouseEvent e) {
if (e.isPopupTrigger()){
m_oInspectorPane.showPopUpMenu(e.getComponent(), e.getX(), e.getY());
}
//unfortunately under Windows the method "isPopupTrigger" always returns false
else if ((e.getModifiersEx() & MouseEvent.BUTTON3_DOWN_MASK) == MouseEvent.BUTTON3_DOWN_MASK){
m_oInspectorPane.showPopUpMenu(e.getComponent(), e.getX(), e.getY());
}
}
});
jPnlContainer.add(jPnlCenter, java.awt.BorderLayout.CENTER);
insertBorderPanes(jPnlContainer);
if (this.bIsUserDefined){
ComponentSelector(oUserDefinedObject, m_oInspectorPane.getTitle());
}
m_xDialogProvider.addInspectorPage(m_oInspectorPane.getTitle(), jPnlContainer);
addTreeExpandListener();
}
catch( Exception exception ) {
exception.printStackTrace(System.out);
}
return jPnlContainer;
}
public HideableTreeModel getModel(){
return treeModel;
}
public void addTreeExpandListener(){
jTree.addTreeWillExpandListener(
new TreeWillExpandListener() {
public void treeWillExpand(javax.swing.event.TreeExpansionEvent event) throws javax.swing.tree.ExpandVetoException {
SwingTreePathProvider oSwingTreePathProvider = new SwingTreePathProvider(event.getPath());
XUnoNode oUnoNode = oSwingTreePathProvider.getLastPathComponent();
if (!m_oInspectorPane.expandNode(oUnoNode, oSwingTreePathProvider)){
throw new ExpandVetoException(event);
}
}
public void treeWillCollapse( javax.swing.event.TreeExpansionEvent evt) throws javax.swing.tree.ExpandVetoException {
}
});
}
public void setSourceCode(String _sSourceCode){
jtxtGeneratedSourceCode.setText(_sSourceCode);
}
public XTreePathProvider getSelectedPath(){
return new SwingTreePathProvider(jTree.getSelectionPath());
}
public void expandPath(XTreePathProvider _xTreePathProvider) throws ClassCastException{
SwingTreePathProvider oSwingTreePathProvider = (SwingTreePathProvider) _xTreePathProvider;
jTree.expandPath(oSwingTreePathProvider.getSwingTreePath());
}
public XUnoNode getSelectedNode(){
XUnoNode oUnoNode = null;
TreePath aTreePath = jTree.getSelectionPath();
Object oNode = aTreePath.getLastPathComponent();
if (oNode instanceof XUnoNode){
oUnoNode = (XUnoNode) oNode;
}
return oUnoNode;
}
public void nodeInserted(XUnoNode _oParentNode, XUnoNode _oChildNode, int index) {
getModel().nodeInserted(_oParentNode, _oChildNode, _oParentNode.getChildCount()-1);
}
public void nodeChanged(XUnoNode _oNode) {
getModel().nodeChanged(_oNode);
}
public boolean setNodeVisible(Object node, boolean v) {
return getModel().setNodeVisible(node, v);
}
public boolean isPropertyNode(XUnoNode _oUnoNode){
return (_oUnoNode instanceof SwingUnoPropertyNode);
}
public boolean isMethodNode(XUnoNode _oUnoNode){
return (_oUnoNode instanceof SwingUnoMethodNode);
}
public boolean isFacetteNode(XUnoNode _oUnoNode){
return (_oUnoNode instanceof SwingUnoFacetteNode);
}
public XUnoNode addUnoNode(Object _oUnoObject){
return new SwingUnoNode(_oUnoObject);
}
public XUnoNode addUnoNode(Object _oUnoObject, Type _aType){
return new SwingUnoNode(_oUnoObject, _aType);
}
public XUnoFacetteNode addUnoFacetteNode(XUnoNode _oParentNode, String _sNodeDescription, Object _oUnoObject){
SwingUnoFacetteNode oSwingUnoFacetteNode = new SwingUnoFacetteNode(_oUnoObject);
oSwingUnoFacetteNode.setLabel(_sNodeDescription);
if (_oParentNode != null){
((SwingUnoNode) _oParentNode).addChildNode(oSwingUnoFacetteNode);
}
return oSwingUnoFacetteNode;
}
public XUnoMethodNode addMethodNode(Object _objectElement, XIdlMethod _xIdlMethod){
SwingUnoMethodNode oSwingUnoMethodNode = new SwingUnoMethodNode(_xIdlMethod, _objectElement, m_xDialogProvider);
return oSwingUnoMethodNode;
}
public XUnoPropertyNode addUnoPropertyNodeWithName(Property _aProperty){
SwingUnoPropertyNode oUnoPropertyNode = new SwingUnoPropertyNode(_aProperty);
oUnoPropertyNode.setLabel("Name: " + _aProperty.Name);
return oUnoPropertyNode;
}
public XUnoPropertyNode addUnoPropertyNodeWithHandle(Property _aProperty){
SwingUnoPropertyNode oUnoPropertyNode = new SwingUnoPropertyNode(_aProperty);
oUnoPropertyNode.setLabel("Handle: " + _aProperty.Handle);
return oUnoPropertyNode;
}
public XUnoPropertyNode addUnoPropertyNodeWithType(Property _aProperty){
SwingUnoPropertyNode oUnoPropertyNode = new SwingUnoPropertyNode(_aProperty);
oUnoPropertyNode.setLabel("Type: " + _aProperty.Type.getTypeName());
return oUnoPropertyNode;
}
public XUnoPropertyNode addUnoPropertyNodeWithAttributesDescription(Property _aProperty){
SwingUnoPropertyNode oUnoPropertyNode = new SwingUnoPropertyNode(_aProperty);
XConstantTypeDescription[] xPropertyAttributesTypeDescriptions = Introspector.getIntrospector().getFieldsOfConstantGroup("com.sun.star.beans.PropertyAttribute");
String sDisplay = Introspector.getIntrospector().getConstantDisplayString((int) _aProperty.Attributes, xPropertyAttributesTypeDescriptions, "Attributes: ");
oUnoPropertyNode.setLabel(sDisplay);
return oUnoPropertyNode;
}
public XUnoPropertyNode addUnoPropertyNode(Object _oUnoObject, Property _aProperty){
SwingUnoPropertyNode oUnoPropertyNode = new SwingUnoPropertyNode(_aProperty, _oUnoObject, null);
oUnoPropertyNode.setPropertyNodeType(XUnoPropertyNode.nPROPERTYSETINFOTYPE);
oUnoPropertyNode.setLabel(UnoPropertyNode.getStandardPropertyDescription(_aProperty, null));
return oUnoPropertyNode;
}
public XUnoPropertyNode addUnoPropertyNode(Object _oUnoObject, Property _aProperty, Object _oUnoReturnObject){
SwingUnoPropertyNode oUnoPropertyNode = new SwingUnoPropertyNode(_aProperty, _oUnoObject, _oUnoReturnObject);
oUnoPropertyNode.setLabel(UnoPropertyNode.getStandardPropertyDescription(_aProperty, _oUnoReturnObject));
return oUnoPropertyNode;
}
public XUnoPropertyNode addUnoPropertyNode(Object _oUnoObject, PropertyValue _aPropertyValue, Object _oReturnObject){
SwingUnoPropertyNode oUnoPropertyNode = new SwingUnoPropertyNode(_aPropertyValue, _oUnoObject, _oReturnObject);
oUnoPropertyNode.setLabel(UnoPropertyNode.getStandardPropertyValueDescription(_aPropertyValue));
return oUnoPropertyNode;
}
}