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