1*34dd1e25SAndrew Rist /************************************************************** 2*34dd1e25SAndrew Rist * 3*34dd1e25SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*34dd1e25SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*34dd1e25SAndrew Rist * distributed with this work for additional information 6*34dd1e25SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*34dd1e25SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*34dd1e25SAndrew Rist * "License"); you may not use this file except in compliance 9*34dd1e25SAndrew Rist * with the License. You may obtain a copy of the License at 10*34dd1e25SAndrew Rist * 11*34dd1e25SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*34dd1e25SAndrew Rist * 13*34dd1e25SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*34dd1e25SAndrew Rist * software distributed under the License is distributed on an 15*34dd1e25SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*34dd1e25SAndrew Rist * KIND, either express or implied. See the License for the 17*34dd1e25SAndrew Rist * specific language governing permissions and limitations 18*34dd1e25SAndrew Rist * under the License. 19*34dd1e25SAndrew Rist * 20*34dd1e25SAndrew Rist *************************************************************/ 21*34dd1e25SAndrew Rist 22*34dd1e25SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir import com.sun.star.reflection.ParamInfo; 25cdf0e10cSrcweir import com.sun.star.reflection.ParamMode; 26cdf0e10cSrcweir import com.sun.star.reflection.XIdlClass; 27cdf0e10cSrcweir import com.sun.star.reflection.XIdlMethod; 28cdf0e10cSrcweir import com.sun.star.uno.TypeClass; 29cdf0e10cSrcweir import java.awt.event.ActionEvent; 30cdf0e10cSrcweir import java.awt.event.ActionListener; 31cdf0e10cSrcweir import java.util.Vector; 32cdf0e10cSrcweir 33cdf0e10cSrcweir public class UnoMethodNode extends UnoNode{ 34cdf0e10cSrcweir XIdlMethod m_xIdlMethod = null; 35cdf0e10cSrcweir Object[] m_oParamObjects = null; 36cdf0e10cSrcweir Object m_oUnoReturnObject = null; 37cdf0e10cSrcweir boolean m_bisInvoked = false; 38cdf0e10cSrcweir XUnoMethodNode m_xUnoMethodNode = null; 39cdf0e10cSrcweir 40cdf0e10cSrcweir 41cdf0e10cSrcweir /** Creates a new instance of UnoMethodNode */ UnoMethodNode(XIdlMethod _xIdlMethod, Object _oUnoObject, XUnoMethodNode _xUnoMethodNode)42cdf0e10cSrcweir public UnoMethodNode(XIdlMethod _xIdlMethod, Object _oUnoObject, XUnoMethodNode _xUnoMethodNode) { 43cdf0e10cSrcweir super(_oUnoObject); 44cdf0e10cSrcweir m_xIdlMethod = _xIdlMethod; 45cdf0e10cSrcweir m_oParamObjects = new Object[m_xIdlMethod.getParameterInfos().length]; 46cdf0e10cSrcweir m_xUnoMethodNode = _xUnoMethodNode; 47cdf0e10cSrcweir } 48cdf0e10cSrcweir isFoldable()49cdf0e10cSrcweir protected boolean isFoldable(){ 50cdf0e10cSrcweir return ((!this.isPrimitive()) && (getTypeClass().getValue() != TypeClass.VOID_value)); 51cdf0e10cSrcweir } 52cdf0e10cSrcweir isInvokable()53cdf0e10cSrcweir protected boolean isInvokable(){ 54cdf0e10cSrcweir boolean bisFoldable = true; 55cdf0e10cSrcweir XIdlClass[] xIdlClasses = m_xIdlMethod.getParameterTypes(); 56cdf0e10cSrcweir for (int i = 0; i < xIdlClasses.length; i++){ 57cdf0e10cSrcweir bisFoldable = Introspector.isPrimitive(xIdlClasses[i].getTypeClass()); 58cdf0e10cSrcweir if (!bisFoldable){ 59cdf0e10cSrcweir return false; 60cdf0e10cSrcweir } 61cdf0e10cSrcweir } 62cdf0e10cSrcweir return bisFoldable; 63cdf0e10cSrcweir } 64cdf0e10cSrcweir getXIdlMethod()65cdf0e10cSrcweir public XIdlMethod getXIdlMethod(){ 66cdf0e10cSrcweir return m_xIdlMethod; 67cdf0e10cSrcweir } 68cdf0e10cSrcweir 69cdf0e10cSrcweir getAnchor()70cdf0e10cSrcweir public String getAnchor(){ 71cdf0e10cSrcweir return getXIdlMethod().getName(); 72cdf0e10cSrcweir } 73cdf0e10cSrcweir 74cdf0e10cSrcweir getName()75cdf0e10cSrcweir public String getName(){ 76cdf0e10cSrcweir return getXIdlMethod().getName(); 77cdf0e10cSrcweir } 78cdf0e10cSrcweir 79cdf0e10cSrcweir invoke()80cdf0e10cSrcweir public Object invoke(){ 81cdf0e10cSrcweir Object oUnoReturnObject = null; 82cdf0e10cSrcweir if (!hasParameters()){ 83cdf0e10cSrcweir oUnoReturnObject = invokeParameterlessMethod(); 84cdf0e10cSrcweir m_bisInvoked = true; 85cdf0e10cSrcweir } 86cdf0e10cSrcweir else{ 87cdf0e10cSrcweir Vector oUnoMethodObjects = m_xUnoMethodNode.getMethodObjects(); 88cdf0e10cSrcweir if (oUnoMethodObjects != null){ 89cdf0e10cSrcweir for (int i = 0; i < getXIdlMethod().getParameterInfos().length; i++){ 90cdf0e10cSrcweir this.m_oParamObjects[i] = oUnoMethodObjects.get(i); 91cdf0e10cSrcweir } 92cdf0e10cSrcweir if (oUnoMethodObjects.size() == m_oParamObjects.length + 1){ 93cdf0e10cSrcweir oUnoReturnObject = oUnoMethodObjects.get(oUnoMethodObjects.size()-1); 94cdf0e10cSrcweir } 95cdf0e10cSrcweir m_bisInvoked = (oUnoReturnObject != null); 96cdf0e10cSrcweir } 97cdf0e10cSrcweir } 98cdf0e10cSrcweir m_oUnoReturnObject = oUnoReturnObject; 99cdf0e10cSrcweir return oUnoReturnObject; 100cdf0e10cSrcweir } 101cdf0e10cSrcweir 102cdf0e10cSrcweir isInvoked()103cdf0e10cSrcweir public boolean isInvoked(){ 104cdf0e10cSrcweir return m_bisInvoked; 105cdf0e10cSrcweir } 106cdf0e10cSrcweir 107cdf0e10cSrcweir getNodeDescription()108cdf0e10cSrcweir protected String getNodeDescription(){ 109cdf0e10cSrcweir String sNodeDescription = ""; 110cdf0e10cSrcweir String sParameters = getParameterDescription(); 111cdf0e10cSrcweir if (m_xIdlMethod.getParameterInfos().length > 0){ 112cdf0e10cSrcweir sNodeDescription = getStandardMethodDescription(); 113cdf0e10cSrcweir } 114cdf0e10cSrcweir else{ 115cdf0e10cSrcweir TypeClass typeClass = getTypeClass(); 116cdf0e10cSrcweir if (typeClass != TypeClass.VOID){ 117cdf0e10cSrcweir sNodeDescription = getStandardMethodDescription(); 118cdf0e10cSrcweir } 119cdf0e10cSrcweir else{ 120cdf0e10cSrcweir sNodeDescription = getStandardMethodDescription(); 121cdf0e10cSrcweir } 122cdf0e10cSrcweir } 123cdf0e10cSrcweir return sNodeDescription; 124cdf0e10cSrcweir } 125cdf0e10cSrcweir 126cdf0e10cSrcweir getStandardMethodDescription()127cdf0e10cSrcweir public String getStandardMethodDescription(){ 128cdf0e10cSrcweir String sNodeDescription = m_xIdlMethod.getReturnType().getName() + " " + m_xIdlMethod.getName() + " (" + getParameterDescription() + " )"; 129cdf0e10cSrcweir if (isPrimitive()){ 130cdf0e10cSrcweir sNodeDescription += ""; 131cdf0e10cSrcweir } 132cdf0e10cSrcweir return sNodeDescription; 133cdf0e10cSrcweir } 134cdf0e10cSrcweir 135cdf0e10cSrcweir hasParameters()136cdf0e10cSrcweir public boolean hasParameters(){ 137cdf0e10cSrcweir return (m_xIdlMethod.getParameterInfos().length > 0); 138cdf0e10cSrcweir } 139cdf0e10cSrcweir 140cdf0e10cSrcweir getLastParameterObjects()141cdf0e10cSrcweir public Object[] getLastParameterObjects(){ 142cdf0e10cSrcweir return m_oParamObjects; 143cdf0e10cSrcweir } 144cdf0e10cSrcweir 145cdf0e10cSrcweir getLastUnoReturnObject()146cdf0e10cSrcweir public Object getLastUnoReturnObject(){ 147cdf0e10cSrcweir return m_oUnoReturnObject; 148cdf0e10cSrcweir } 149cdf0e10cSrcweir 150cdf0e10cSrcweir getParameterDescription()151cdf0e10cSrcweir public String getParameterDescription(){ 152cdf0e10cSrcweir ParamInfo[] paramInfo = m_xIdlMethod.getParameterInfos(); 153cdf0e10cSrcweir String sParameters = ""; 154cdf0e10cSrcweir String sStandardMethodDisplayText = m_xIdlMethod.getReturnType().getName() + " " + m_xIdlMethod.getName() + " (" + sParameters + " )"; 155cdf0e10cSrcweir if (Introspector.isValid(paramInfo)) { 156cdf0e10cSrcweir // get all parameters with type and mode 157cdf0e10cSrcweir for ( int i = 0; i < paramInfo.length; i++ ) { 158cdf0e10cSrcweir XIdlClass xIdlClass = paramInfo[ i ].aType; 159cdf0e10cSrcweir if ( i == 0 ) { 160cdf0e10cSrcweir // the first parameter has no leading comma 161cdf0e10cSrcweir sParameters += "[" + getParamMode(paramInfo[ i ].aMode ) + "] " + xIdlClass.getName(); 162cdf0e10cSrcweir } 163cdf0e10cSrcweir else { 164cdf0e10cSrcweir // all other parameters are separated with comma 165cdf0e10cSrcweir sParameters += ", [" + getParamMode(paramInfo[ i ].aMode ) + "] " + xIdlClass.getName(); 166cdf0e10cSrcweir } 167cdf0e10cSrcweir } 168cdf0e10cSrcweir } 169cdf0e10cSrcweir return sParameters; 170cdf0e10cSrcweir } 171cdf0e10cSrcweir 172cdf0e10cSrcweir 173cdf0e10cSrcweir // return the parameter mode (IN, OUT, INOUT) getParamMode(ParamMode paramMode)174cdf0e10cSrcweir private static String getParamMode(ParamMode paramMode) { 175cdf0e10cSrcweir String toReturn = ""; 176cdf0e10cSrcweir if ( paramMode == ParamMode.IN ) { 177cdf0e10cSrcweir toReturn = "IN"; 178cdf0e10cSrcweir } 179cdf0e10cSrcweir if ( paramMode == ParamMode.OUT ) { 180cdf0e10cSrcweir toReturn = "OUT"; 181cdf0e10cSrcweir } 182cdf0e10cSrcweir if ( paramMode == ParamMode.INOUT ) { 183cdf0e10cSrcweir toReturn = "INOUT"; 184cdf0e10cSrcweir } 185cdf0e10cSrcweir return( toReturn ); 186cdf0e10cSrcweir } 187cdf0e10cSrcweir getTypeClass()188cdf0e10cSrcweir public TypeClass getTypeClass(){ 189cdf0e10cSrcweir XIdlClass xIdlClass = m_xIdlMethod.getReturnType(); 190cdf0e10cSrcweir return xIdlClass.getTypeClass(); 191cdf0e10cSrcweir } 192cdf0e10cSrcweir 193cdf0e10cSrcweir invokeParameterlessMethod()194cdf0e10cSrcweir private Object invokeParameterlessMethod(){ 195cdf0e10cSrcweir try { 196cdf0e10cSrcweir Object[][] aParamInfo = new Object[1][]; 197cdf0e10cSrcweir aParamInfo[0] = new Object[] {}; 198cdf0e10cSrcweir return getXIdlMethod().invoke(getUnoObject(), aParamInfo); 199cdf0e10cSrcweir } catch (Exception ex) { 200cdf0e10cSrcweir ex.printStackTrace(System.out); 201cdf0e10cSrcweir return null; 202cdf0e10cSrcweir }} 203cdf0e10cSrcweir 204cdf0e10cSrcweir isPrimitive()205cdf0e10cSrcweir public boolean isPrimitive(){ 206cdf0e10cSrcweir return Introspector.isObjectPrimitive(m_xIdlMethod.getClass(), getTypeClass()); 207cdf0e10cSrcweir } 208cdf0e10cSrcweir 209cdf0e10cSrcweir invoke(Object _oUnoObject, Object[] oParameters)210cdf0e10cSrcweir protected Object invoke(Object _oUnoObject, Object[] oParameters) throws com.sun.star.uno.Exception{ 211cdf0e10cSrcweir Object[][] aParams = new Object[1][oParameters.length]; 212cdf0e10cSrcweir for ( int i = 0; i < oParameters.length; i++ ) { 213cdf0e10cSrcweir aParams[0][i] = oParameters[i]; 214cdf0e10cSrcweir } 215cdf0e10cSrcweir return m_xIdlMethod.invoke(_oUnoObject, aParams); 216cdf0e10cSrcweir } 217cdf0e10cSrcweir } 218