1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  *  The Contents of this file are made available subject to the terms of
4*cdf0e10cSrcweir  *  the BSD license.
5*cdf0e10cSrcweir  *
6*cdf0e10cSrcweir  *  Copyright 2000, 2010 Oracle and/or its affiliates.
7*cdf0e10cSrcweir  *  All rights reserved.
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  *  Redistribution and use in source and binary forms, with or without
10*cdf0e10cSrcweir  *  modification, are permitted provided that the following conditions
11*cdf0e10cSrcweir  *  are met:
12*cdf0e10cSrcweir  *  1. Redistributions of source code must retain the above copyright
13*cdf0e10cSrcweir  *     notice, this list of conditions and the following disclaimer.
14*cdf0e10cSrcweir  *  2. Redistributions in binary form must reproduce the above copyright
15*cdf0e10cSrcweir  *     notice, this list of conditions and the following disclaimer in the
16*cdf0e10cSrcweir  *     documentation and/or other materials provided with the distribution.
17*cdf0e10cSrcweir  *  3. Neither the name of Sun Microsystems, Inc. nor the names of its
18*cdf0e10cSrcweir  *     contributors may be used to endorse or promote products derived
19*cdf0e10cSrcweir  *     from this software without specific prior written permission.
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22*cdf0e10cSrcweir  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23*cdf0e10cSrcweir  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24*cdf0e10cSrcweir  *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25*cdf0e10cSrcweir  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26*cdf0e10cSrcweir  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27*cdf0e10cSrcweir  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
28*cdf0e10cSrcweir  *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29*cdf0e10cSrcweir  *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
30*cdf0e10cSrcweir  *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
31*cdf0e10cSrcweir  *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32*cdf0e10cSrcweir  *
33*cdf0e10cSrcweir  *************************************************************************/
34*cdf0e10cSrcweir 
35*cdf0e10cSrcweir import com.sun.star.reflection.ParamInfo;
36*cdf0e10cSrcweir import com.sun.star.reflection.ParamMode;
37*cdf0e10cSrcweir import com.sun.star.reflection.XIdlClass;
38*cdf0e10cSrcweir import com.sun.star.reflection.XIdlMethod;
39*cdf0e10cSrcweir import com.sun.star.uno.TypeClass;
40*cdf0e10cSrcweir import java.awt.event.ActionEvent;
41*cdf0e10cSrcweir import java.awt.event.ActionListener;
42*cdf0e10cSrcweir import java.util.Vector;
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir public class UnoMethodNode extends UnoNode{
45*cdf0e10cSrcweir     XIdlMethod m_xIdlMethod = null;
46*cdf0e10cSrcweir     Object[] m_oParamObjects = null;
47*cdf0e10cSrcweir     Object m_oUnoReturnObject = null;
48*cdf0e10cSrcweir     boolean m_bisInvoked = false;
49*cdf0e10cSrcweir     XUnoMethodNode m_xUnoMethodNode = null;
50*cdf0e10cSrcweir 
51*cdf0e10cSrcweir 
52*cdf0e10cSrcweir     /** Creates a new instance of UnoMethodNode */
53*cdf0e10cSrcweir     public UnoMethodNode(XIdlMethod _xIdlMethod, Object _oUnoObject, XUnoMethodNode _xUnoMethodNode) {
54*cdf0e10cSrcweir         super(_oUnoObject);
55*cdf0e10cSrcweir         m_xIdlMethod = _xIdlMethod;
56*cdf0e10cSrcweir         m_oParamObjects = new Object[m_xIdlMethod.getParameterInfos().length];
57*cdf0e10cSrcweir         m_xUnoMethodNode = _xUnoMethodNode;
58*cdf0e10cSrcweir     }
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir     protected boolean isFoldable(){
61*cdf0e10cSrcweir         return ((!this.isPrimitive()) &&  (getTypeClass().getValue() != TypeClass.VOID_value));
62*cdf0e10cSrcweir     }
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir     protected boolean isInvokable(){
65*cdf0e10cSrcweir         boolean bisFoldable = true;
66*cdf0e10cSrcweir         XIdlClass[] xIdlClasses = m_xIdlMethod.getParameterTypes();
67*cdf0e10cSrcweir         for (int i = 0; i < xIdlClasses.length; i++){
68*cdf0e10cSrcweir             bisFoldable = Introspector.isPrimitive(xIdlClasses[i].getTypeClass());
69*cdf0e10cSrcweir             if (!bisFoldable){
70*cdf0e10cSrcweir                 return false;
71*cdf0e10cSrcweir             }
72*cdf0e10cSrcweir         }
73*cdf0e10cSrcweir         return bisFoldable;
74*cdf0e10cSrcweir     }
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir     public XIdlMethod getXIdlMethod(){
77*cdf0e10cSrcweir         return m_xIdlMethod;
78*cdf0e10cSrcweir     }
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir     public String getAnchor(){
82*cdf0e10cSrcweir         return getXIdlMethod().getName();
83*cdf0e10cSrcweir     }
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir 
86*cdf0e10cSrcweir     public String getName(){
87*cdf0e10cSrcweir         return getXIdlMethod().getName();
88*cdf0e10cSrcweir     }
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir 
91*cdf0e10cSrcweir     public Object invoke(){
92*cdf0e10cSrcweir         Object oUnoReturnObject = null;
93*cdf0e10cSrcweir         if (!hasParameters()){
94*cdf0e10cSrcweir             oUnoReturnObject = invokeParameterlessMethod();
95*cdf0e10cSrcweir             m_bisInvoked = true;
96*cdf0e10cSrcweir         }
97*cdf0e10cSrcweir         else{
98*cdf0e10cSrcweir             Vector oUnoMethodObjects = m_xUnoMethodNode.getMethodObjects();
99*cdf0e10cSrcweir             if (oUnoMethodObjects != null){
100*cdf0e10cSrcweir                 for (int i = 0; i < getXIdlMethod().getParameterInfos().length; i++){
101*cdf0e10cSrcweir                     this.m_oParamObjects[i] = oUnoMethodObjects.get(i);
102*cdf0e10cSrcweir                 }
103*cdf0e10cSrcweir                 if (oUnoMethodObjects.size() == m_oParamObjects.length + 1){
104*cdf0e10cSrcweir                     oUnoReturnObject = oUnoMethodObjects.get(oUnoMethodObjects.size()-1);
105*cdf0e10cSrcweir                 }
106*cdf0e10cSrcweir                 m_bisInvoked = (oUnoReturnObject != null);
107*cdf0e10cSrcweir             }
108*cdf0e10cSrcweir         }
109*cdf0e10cSrcweir         m_oUnoReturnObject = oUnoReturnObject;
110*cdf0e10cSrcweir         return oUnoReturnObject;
111*cdf0e10cSrcweir     }
112*cdf0e10cSrcweir 
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir     public boolean isInvoked(){
115*cdf0e10cSrcweir         return m_bisInvoked;
116*cdf0e10cSrcweir     }
117*cdf0e10cSrcweir 
118*cdf0e10cSrcweir 
119*cdf0e10cSrcweir     protected String getNodeDescription(){
120*cdf0e10cSrcweir         String sNodeDescription = "";
121*cdf0e10cSrcweir         String sParameters = getParameterDescription();
122*cdf0e10cSrcweir         if (m_xIdlMethod.getParameterInfos().length > 0){
123*cdf0e10cSrcweir             sNodeDescription = getStandardMethodDescription();
124*cdf0e10cSrcweir         }
125*cdf0e10cSrcweir         else{
126*cdf0e10cSrcweir             TypeClass typeClass = getTypeClass();
127*cdf0e10cSrcweir             if (typeClass != TypeClass.VOID){
128*cdf0e10cSrcweir                 sNodeDescription = getStandardMethodDescription();
129*cdf0e10cSrcweir             }
130*cdf0e10cSrcweir             else{
131*cdf0e10cSrcweir                 sNodeDescription = getStandardMethodDescription();
132*cdf0e10cSrcweir             }
133*cdf0e10cSrcweir         }
134*cdf0e10cSrcweir         return sNodeDescription;
135*cdf0e10cSrcweir     }
136*cdf0e10cSrcweir 
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir     public String getStandardMethodDescription(){
139*cdf0e10cSrcweir         String sNodeDescription = m_xIdlMethod.getReturnType().getName() + " " + m_xIdlMethod.getName() + " (" + getParameterDescription() + " )";
140*cdf0e10cSrcweir         if (isPrimitive()){
141*cdf0e10cSrcweir             sNodeDescription += "";
142*cdf0e10cSrcweir         }
143*cdf0e10cSrcweir         return sNodeDescription;
144*cdf0e10cSrcweir     }
145*cdf0e10cSrcweir 
146*cdf0e10cSrcweir 
147*cdf0e10cSrcweir     public boolean hasParameters(){
148*cdf0e10cSrcweir         return (m_xIdlMethod.getParameterInfos().length > 0);
149*cdf0e10cSrcweir     }
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir     public Object[] getLastParameterObjects(){
153*cdf0e10cSrcweir         return m_oParamObjects;
154*cdf0e10cSrcweir     }
155*cdf0e10cSrcweir 
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir     public Object getLastUnoReturnObject(){
158*cdf0e10cSrcweir         return m_oUnoReturnObject;
159*cdf0e10cSrcweir     }
160*cdf0e10cSrcweir 
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir     public String getParameterDescription(){
163*cdf0e10cSrcweir         ParamInfo[] paramInfo = m_xIdlMethod.getParameterInfos();
164*cdf0e10cSrcweir         String sParameters = "";
165*cdf0e10cSrcweir         String sStandardMethodDisplayText = m_xIdlMethod.getReturnType().getName() + " " + m_xIdlMethod.getName() + " (" + sParameters + " )";
166*cdf0e10cSrcweir         if (Introspector.isValid(paramInfo)) {
167*cdf0e10cSrcweir             //  get all parameters with type and mode
168*cdf0e10cSrcweir             for ( int i = 0; i < paramInfo.length; i++ ) {
169*cdf0e10cSrcweir                 XIdlClass xIdlClass = paramInfo[ i ].aType;
170*cdf0e10cSrcweir                 if ( i == 0 ) {
171*cdf0e10cSrcweir                     //  the first parameter has no leading comma
172*cdf0e10cSrcweir                     sParameters += "[" + getParamMode(paramInfo[ i ].aMode ) + "] " + xIdlClass.getName();
173*cdf0e10cSrcweir                 }
174*cdf0e10cSrcweir                 else {
175*cdf0e10cSrcweir                     //  all other parameters are separated with comma
176*cdf0e10cSrcweir                     sParameters += ", [" + getParamMode(paramInfo[ i ].aMode ) + "] " + xIdlClass.getName();
177*cdf0e10cSrcweir                 }
178*cdf0e10cSrcweir             }
179*cdf0e10cSrcweir         }
180*cdf0e10cSrcweir         return sParameters;
181*cdf0e10cSrcweir     }
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir 
184*cdf0e10cSrcweir     //  return the parameter mode (IN, OUT, INOUT)
185*cdf0e10cSrcweir     private static String getParamMode(ParamMode paramMode) {
186*cdf0e10cSrcweir         String toReturn = "";
187*cdf0e10cSrcweir         if ( paramMode == ParamMode.IN ) {
188*cdf0e10cSrcweir             toReturn = "IN";
189*cdf0e10cSrcweir         }
190*cdf0e10cSrcweir         if ( paramMode == ParamMode.OUT ) {
191*cdf0e10cSrcweir             toReturn = "OUT";
192*cdf0e10cSrcweir         }
193*cdf0e10cSrcweir         if ( paramMode == ParamMode.INOUT ) {
194*cdf0e10cSrcweir             toReturn = "INOUT";
195*cdf0e10cSrcweir         }
196*cdf0e10cSrcweir         return( toReturn );
197*cdf0e10cSrcweir     }
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir     public TypeClass getTypeClass(){
200*cdf0e10cSrcweir         XIdlClass xIdlClass = m_xIdlMethod.getReturnType();
201*cdf0e10cSrcweir         return xIdlClass.getTypeClass();
202*cdf0e10cSrcweir     }
203*cdf0e10cSrcweir 
204*cdf0e10cSrcweir 
205*cdf0e10cSrcweir     private Object invokeParameterlessMethod(){
206*cdf0e10cSrcweir     try {
207*cdf0e10cSrcweir         Object[][] aParamInfo = new Object[1][];
208*cdf0e10cSrcweir         aParamInfo[0] = new Object[] {};
209*cdf0e10cSrcweir         return getXIdlMethod().invoke(getUnoObject(), aParamInfo);
210*cdf0e10cSrcweir     } catch (Exception ex) {
211*cdf0e10cSrcweir         ex.printStackTrace(System.out);
212*cdf0e10cSrcweir         return null;
213*cdf0e10cSrcweir     }}
214*cdf0e10cSrcweir 
215*cdf0e10cSrcweir 
216*cdf0e10cSrcweir     public boolean isPrimitive(){
217*cdf0e10cSrcweir         return Introspector.isObjectPrimitive(m_xIdlMethod.getClass(), getTypeClass());
218*cdf0e10cSrcweir     }
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir 
221*cdf0e10cSrcweir     protected Object invoke(Object _oUnoObject, Object[] oParameters) throws com.sun.star.uno.Exception{
222*cdf0e10cSrcweir         Object[][] aParams = new Object[1][oParameters.length];
223*cdf0e10cSrcweir         for ( int i = 0; i < oParameters.length; i++ ) {
224*cdf0e10cSrcweir             aParams[0][i] = oParameters[i];
225*cdf0e10cSrcweir         }
226*cdf0e10cSrcweir         return m_xIdlMethod.invoke(_oUnoObject, aParams);
227*cdf0e10cSrcweir     }
228*cdf0e10cSrcweir }
229