blob: c530ca03be4313e6f0e01b7107d0e33fc4f53cb6 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
import com.sun.star.reflection.ParamInfo;
import com.sun.star.reflection.XIdlMethod;
import com.sun.star.uno.TypeClass;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
/**
* @author bc93774
*/
public class MethodParametersDialog extends JDialog{
private javax.swing.JPanel jPnlParamContainer;
private ParameterPanel[] m_aParameterPanels;
private ParamInfo[] m_aParamInfo;
private XIdlMethod m_xIdlMethod;
private ActionListener oActionListener;
private JButton jHelpButton = new JButton("Help");
private JButton jOKButton = new JButton("Ok");
private JButton jInvokeButton = new JButton("Invoke");
private Object m_oReturnButton = null;
private Object m_oUnoObject = null;
private Object m_oUnoReturnObject = null;
private JLabel jLblResult;
private JPanel jResultPanel = null;
private boolean bisdiposed = false;
private XUnoMethodNode m_xUnoMethodNode;
public MethodParametersDialog(XUnoMethodNode _xUnoMethodNode){
m_xUnoMethodNode = _xUnoMethodNode;
m_xIdlMethod = _xUnoMethodNode.getXIdlMethod();
m_aParamInfo = m_xIdlMethod.getParameterInfos();
m_oUnoObject = m_xUnoMethodNode.getUnoObject();
Object[] m_aParameterObjects = new Object[m_aParamInfo.length];
}
public Vector getMethodObjects() {
super.setModal(true);
addBorderPanel(getContentPane(), BorderLayout.NORTH);
addBorderPanel(getContentPane(), BorderLayout.WEST);
addBorderPanel(getContentPane(), BorderLayout.EAST);
jPnlParamContainer = new JPanel();
jPnlParamContainer.setLayout(new javax.swing.BoxLayout(jPnlParamContainer, javax.swing.BoxLayout.Y_AXIS));
JPanel jHeaderPanel = new JPanel(new BorderLayout());
JLabel jLblHeader = new JLabel();
jLblHeader.setText("Please insert the values for the given Parameters of the method '" + m_xIdlMethod.getName() + "'");
jHeaderPanel.add(jLblHeader,BorderLayout.WEST);
jPnlParamContainer.add(jHeaderPanel);
m_aParameterPanels = new ParameterPanel[m_aParamInfo.length];
for (int i = 0; i < m_aParameterPanels.length; i++){
m_aParameterPanels[i] = new ParameterPanel(m_aParamInfo[i]);
jPnlParamContainer.add(m_aParameterPanels[i]);
}
jPnlParamContainer.add(new ButtonPanel(), java.awt.BorderLayout.SOUTH);
getContentPane().add(jPnlParamContainer, java.awt.BorderLayout.CENTER);
pack();
setLocation(350, 350);
setTitle("Object Inspector - Parameter Values of '" + m_xIdlMethod.getName() + "'");
super.setFocusable(true);
super.setFocusableWindowState(true);
super.requestFocus();
m_aParameterPanels[0].getInputComponent().requestFocusInWindow();
setVisible(true);
if (!bisdiposed){
Vector aMethodObjects = new Vector();
for (int i = 0; i < m_aParameterPanels.length; i++){
aMethodObjects.add(m_aParameterPanels[i].getValue());
}
aMethodObjects.add(m_oUnoReturnObject);
return aMethodObjects;
}
else{
return null;
}
}
private void insertResultPanel(Exception _oInvocationException){
boolean bAddPanel = false;
if (jResultPanel == null){
jResultPanel = new JPanel(new BorderLayout());
bAddPanel = true;
}
else{
jResultPanel.removeAll();
}
jLblResult = new JLabel();
jLblResult.setMaximumSize(new java.awt.Dimension(getSize().width - 20, 57));
if (_oInvocationException != null){
jLblResult.setText("<html>Invoking the method cause an exception: <br>" + _oInvocationException.toString() + "</html>");
}
else{
jLblResult.setText("<html>The invocation of the method did not produce any error</html>");
}
jResultPanel.add(jLblResult,BorderLayout.WEST);
if (bAddPanel){
int nPos = jPnlParamContainer.getComponentCount() - 1;
jPnlParamContainer.add(jResultPanel, nPos);
}
super.pack();
super.validate();
}
private Object[] getParameterValues(){
Object[] oParameterValues = new Object[m_aParameterPanels.length];
for (int i = 0; i < m_aParameterPanels.length; i++){
oParameterValues[i] = m_aParameterPanels[i].getValue();
}
return oParameterValues;
}
private boolean isCompleted(){
boolean bIsCompleted = true;
for (int i = 0; i < m_aParameterPanels.length; i++){
bIsCompleted = m_aParameterPanels[i].isCompleted();
if (!bIsCompleted){
break;
}
}
return bIsCompleted;
}
private void addBorderPanel(java.awt.Container _jContainer, String _sLayout){
JPanel jPnlBorder = new JPanel();
jPnlBorder.setPreferredSize(new java.awt.Dimension(10, 10));
_jContainer.add(jPnlBorder, _sLayout);
}
private void addGapPanel(java.awt.Container _jContainer){
JPanel jPnlBorder = new JPanel();
jPnlBorder.setPreferredSize(new java.awt.Dimension(10, 10));
jPnlBorder.setMaximumSize(new java.awt.Dimension(10, 10));
_jContainer.add(jPnlBorder);
}
private class ParameterPanel extends JPanel{
private JComponent m_jComponent;
private TypeClass m_aTypeClass = null;
public ParameterPanel(ParamInfo _aParamInfo){
JTextField jTextField = new JTextField();
JComboBox jComboBox = new JComboBox();
m_aTypeClass = _aParamInfo.aType.getTypeClass();
setLayout(new java.awt.BorderLayout());
addBorderPanel(this, BorderLayout.NORTH);
addBorderPanel(this, BorderLayout.SOUTH);
JPanel jPnlCenter1 = new javax.swing.JPanel();
jPnlCenter1.setLayout(new javax.swing.BoxLayout(jPnlCenter1, javax.swing.BoxLayout.X_AXIS));
JLabel jLabel1 = new JLabel();
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
String sParamText = _aParamInfo.aName + " (" + _aParamInfo.aType.getName() +")";
jLabel1.setText(sParamText);
jPnlCenter1.add(jLabel1);
addGapPanel(jPnlCenter1);
switch (m_aTypeClass.getValue()){
case TypeClass.BOOLEAN_value:
jComboBox.setBackground(new java.awt.Color(255, 255, 255));
jComboBox.setPreferredSize(new java.awt.Dimension(50, 19));
jComboBox.addItem("True");
jComboBox.addItem("False");
jComboBox.addKeyListener(new UpdateUIAdapter());
jPnlCenter1.add(jComboBox);
m_jComponent = jComboBox;
break;
case TypeClass.BYTE_value:
case TypeClass.CHAR_value:
case TypeClass.DOUBLE_value:
case TypeClass.ENUM_value:
case TypeClass.FLOAT_value:
case TypeClass.HYPER_value:
case TypeClass.LONG_value:
case TypeClass.SHORT_value:
case TypeClass.STRING_value:
case TypeClass.UNSIGNED_HYPER_value:
case TypeClass.UNSIGNED_LONG_value:
case TypeClass.UNSIGNED_SHORT_value:
jTextField.setPreferredSize(new java.awt.Dimension(50, 19));
jTextField.addKeyListener(new UpdateUIAdapter());
jPnlCenter1.add(jTextField);
m_jComponent = jTextField;
break;
default:
System.out.println("Type " + m_aTypeClass.getValue() + " not yet defined in 'ParameterPanel()'");
}
add(jPnlCenter1, java.awt.BorderLayout.CENTER);
JPanel jPnlEast = new JPanel();
add(jPnlEast, BorderLayout.EAST);
}
private JComponent getInputComponent(){
return m_jComponent;
}
public Object getValue(){
Object oReturn = null;
if (m_jComponent instanceof JTextField){
String sText = ((JTextField) m_jComponent).getText();
oReturn = Introspector.getIntrospector().getValueOfText(m_aTypeClass, sText);
}
else{
JComboBox jComboBox = ((JComboBox) m_jComponent);
oReturn = Boolean.valueOf(jComboBox.getSelectedIndex() == 0);
}
return oReturn;
}
public boolean isCompleted(){
if (m_jComponent instanceof JTextField){
return !((JTextField) m_jComponent).getText().equals("");
}
else{
return true;
}
}
}
private class UpdateUIAdapter extends KeyAdapter{
public void keyReleased(KeyEvent e){
boolean bIsCompleted = isCompleted();
jOKButton.setEnabled(bIsCompleted);
jInvokeButton.setEnabled(bIsCompleted);
if (jLblResult != null){
jLblResult.setEnabled(false);
jLblResult.invalidate();
}
}
}
private class ButtonPanel extends JPanel{
public ButtonPanel(){
super();
setLayout(new BorderLayout());
addBorderPanel(this, BorderLayout.NORTH);
addBorderPanel(this, BorderLayout.SOUTH);
JPanel jPnlBottomCenter = new JPanel();
jPnlBottomCenter.setLayout(new javax.swing.BoxLayout(jPnlBottomCenter, javax.swing.BoxLayout.X_AXIS));
jHelpButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
oActionListener.actionPerformed(e);
}
});
jHelpButton.setEnabled(oActionListener != null);
jPnlBottomCenter.add(jHelpButton);
addGapPanel(jPnlBottomCenter);
jOKButton.setEnabled(false);
jOKButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
invokeParameterMethod();
dispose();
}
});
jOKButton.setEnabled(isCompleted());
jInvokeButton.setEnabled(isCompleted());
jInvokeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
invokeParameterMethod();
}
});
jPnlBottomCenter.add(jOKButton);
addGapPanel(jPnlBottomCenter);
jPnlBottomCenter.add(jInvokeButton);
addGapPanel(jPnlBottomCenter);
JButton jCancelButton = new JButton("Cancel");
jCancelButton.setFocusCycleRoot(true);
jCancelButton.setFocusPainted(true);
jCancelButton.addActionListener(new ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt) {
bisdiposed = true;
dispose();
}
});
jPnlBottomCenter.add(jCancelButton);
add(jPnlBottomCenter);
}
}
public void addActionListener(ActionListener _oActionListener){
oActionListener = _oActionListener;
jHelpButton.setEnabled(oActionListener != null);
}
public void invokeParameterMethod(){
try{
Object[] oParameters = getParameterValues();
m_oUnoReturnObject = m_xUnoMethodNode.invoke(m_oUnoObject, oParameters);
insertResultPanel(null);
} catch (Exception ex) {
insertResultPanel(ex);
m_oUnoReturnObject = null;
}}
}