xref: /AOO41X/main/unodevtools/source/skeletonmaker/javacompskeleton.cxx (revision 7ceddb922c36bc48f0711c90dec62c8f86ce5272)
1*7ceddb92SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*7ceddb92SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*7ceddb92SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*7ceddb92SAndrew Rist  * distributed with this work for additional information
6*7ceddb92SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*7ceddb92SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*7ceddb92SAndrew Rist  * "License"); you may not use this file except in compliance
9*7ceddb92SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*7ceddb92SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*7ceddb92SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*7ceddb92SAndrew Rist  * software distributed under the License is distributed on an
15*7ceddb92SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*7ceddb92SAndrew Rist  * KIND, either express or implied.  See the License for the
17*7ceddb92SAndrew Rist  * specific language governing permissions and limitations
18*7ceddb92SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*7ceddb92SAndrew Rist  *************************************************************/
21*7ceddb92SAndrew Rist 
22*7ceddb92SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "codemaker/commonjava.hxx"
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "skeletoncommon.hxx"
27cdf0e10cSrcweir #include "skeletonjava.hxx"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <iostream>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir using namespace ::rtl;
32cdf0e10cSrcweir using namespace ::codemaker::java;
33cdf0e10cSrcweir 
34cdf0e10cSrcweir namespace skeletonmaker { namespace java {
35cdf0e10cSrcweir 
generatePackage(std::ostream & o,const OString & implname)36cdf0e10cSrcweir void generatePackage(std::ostream & o, const OString & implname)
37cdf0e10cSrcweir {
38cdf0e10cSrcweir     sal_Int32 index = implname.lastIndexOf('.');
39cdf0e10cSrcweir     if (index != -1)
40cdf0e10cSrcweir         o << "package " << implname.copy(0, index) << ";\n\n";
41cdf0e10cSrcweir }
42cdf0e10cSrcweir 
generateImports(std::ostream & o,ProgramOptions const & options,const std::hash_set<OString,OStringHash> &,const OString & propertyhelper,bool serviceobject,bool supportxcomponent)43cdf0e10cSrcweir void generateImports(std::ostream & o, ProgramOptions const & options,
44cdf0e10cSrcweir          const std::hash_set< OString, OStringHash >& /*interfaces*/,
45cdf0e10cSrcweir          const OString & propertyhelper,
46cdf0e10cSrcweir          bool serviceobject, bool supportxcomponent)
47cdf0e10cSrcweir {
48cdf0e10cSrcweir     if (options.componenttype == 3)
49cdf0e10cSrcweir         o << "import com.sun.star.uno.UnoRuntime;\n";
50cdf0e10cSrcweir     o << "import com.sun.star.uno.XComponentContext;\n";
51cdf0e10cSrcweir     if (serviceobject) {
52cdf0e10cSrcweir         o << "import com.sun.star.lib.uno.helper.Factory;\n";
53cdf0e10cSrcweir         o << "import com.sun.star.lang.XSingleComponentFactory;\n";
54cdf0e10cSrcweir         o << "import com.sun.star.registry.XRegistryKey;\n";
55cdf0e10cSrcweir     }
56cdf0e10cSrcweir 
57cdf0e10cSrcweir     if  (!propertyhelper.equals("_")) {
58cdf0e10cSrcweir         if (supportxcomponent)
59cdf0e10cSrcweir             o << "import com.sun.star.lib.uno.helper.ComponentBase;\n";
60cdf0e10cSrcweir         else
61cdf0e10cSrcweir             o << "import com.sun.star.lib.uno.helper.WeakBase;\n";
62cdf0e10cSrcweir     }
63cdf0e10cSrcweir     if (propertyhelper.getLength() > 0) {
64cdf0e10cSrcweir         if (propertyhelper.equals("_")) {
65cdf0e10cSrcweir             o << "import com.sun.star.lib.uno.helper.PropertySet;\n";
66cdf0e10cSrcweir             o << "import com.sun.star.beans.PropertyAttribute;\n";
67cdf0e10cSrcweir         } else {
68cdf0e10cSrcweir             o << "import com.sun.star.uno.Type;\n";
69cdf0e10cSrcweir             o << "import com.sun.star.uno.Any;\n";
70cdf0e10cSrcweir             o << "import com.sun.star.beans.Ambiguous;\n";
71cdf0e10cSrcweir             o << "import com.sun.star.beans.Defaulted;\n";
72cdf0e10cSrcweir             o << "import com.sun.star.beans.Optional;\n";
73cdf0e10cSrcweir             o << "import com.sun.star.lib.uno.helper.PropertySetMixin;\n";
74cdf0e10cSrcweir         }
75cdf0e10cSrcweir     }
76cdf0e10cSrcweir 
77cdf0e10cSrcweir 
78cdf0e10cSrcweir //     std::hash_set< OString, OStringHash >::const_iterator iter =
79cdf0e10cSrcweir //                    interfaces.begin();
80cdf0e10cSrcweir //     while (iter != interfaces.end())
81cdf0e10cSrcweir //     {
82cdf0e10cSrcweir //         o << "import " << ((*iter).getStr()) << ";\n";
83cdf0e10cSrcweir //         iter++;
84cdf0e10cSrcweir //     }
85cdf0e10cSrcweir }
86cdf0e10cSrcweir 
generateCompFunctions(std::ostream & o,const OString & classname)87cdf0e10cSrcweir void generateCompFunctions(std::ostream & o, const OString & classname)
88cdf0e10cSrcweir {
89cdf0e10cSrcweir     o << "    public static XSingleComponentFactory __getComponentFactory("
90cdf0e10cSrcweir         " String sImplementationName ) {\n"
91cdf0e10cSrcweir         "        XSingleComponentFactory xFactory = null;\n\n"
92cdf0e10cSrcweir         "        if ( sImplementationName.equals( m_implementationName ) )\n"
93cdf0e10cSrcweir         "            xFactory = Factory.createComponentFactory("
94cdf0e10cSrcweir       << classname << ".class, m_serviceNames);\n"
95cdf0e10cSrcweir         "        return xFactory;\n    }\n\n";
96cdf0e10cSrcweir 
97cdf0e10cSrcweir     o << "    public static boolean __writeRegistryServiceInfo("
98cdf0e10cSrcweir         " XRegistryKey xRegistryKey ) {\n"
99cdf0e10cSrcweir         "        return Factory.writeRegistryServiceInfo(m_implementationName,\n"
100cdf0e10cSrcweir         "                                                m_serviceNames,\n"
101cdf0e10cSrcweir         "                                                xRegistryKey);\n"
102cdf0e10cSrcweir         "    }\n\n";
103cdf0e10cSrcweir }
104cdf0e10cSrcweir 
generateXServiceInfoBodies(std::ostream & o)105cdf0e10cSrcweir void generateXServiceInfoBodies(std::ostream& o)
106cdf0e10cSrcweir {
107cdf0e10cSrcweir     o << "    // com.sun.star.lang.XServiceInfo:\n";
108cdf0e10cSrcweir     o << "    public String getImplementationName() {\n"
109cdf0e10cSrcweir       << "         return m_implementationName;\n    }\n\n";
110cdf0e10cSrcweir 
111cdf0e10cSrcweir     o << "    public boolean supportsService( String sService ) {\n"
112cdf0e10cSrcweir       << "        int len = m_serviceNames.length;\n\n"
113cdf0e10cSrcweir       << "        for( int i=0; i < len; i++) {\n"
114cdf0e10cSrcweir       << "            if (sService.equals(m_serviceNames[i]))\n"
115cdf0e10cSrcweir       << "                return true;\n"
116cdf0e10cSrcweir       << "        }\n        return false;\n    }\n\n";
117cdf0e10cSrcweir 
118cdf0e10cSrcweir     o << "    public String[] getSupportedServiceNames() {\n"
119cdf0e10cSrcweir       << "        return m_serviceNames;\n    }\n\n";
120cdf0e10cSrcweir }
121cdf0e10cSrcweir 
generateXPropertySetBodies(std::ostream & o)122cdf0e10cSrcweir void generateXPropertySetBodies(std::ostream& o)
123cdf0e10cSrcweir {
124cdf0e10cSrcweir     o << "    // com.sun.star.beans.XPropertySet:\n";
125cdf0e10cSrcweir     o << "    public com.sun.star.beans.XPropertySetInfo getPropertySetInfo()\n"
126cdf0e10cSrcweir       "    {\n        return m_prophlp.getPropertySetInfo();\n    }\n\n";
127cdf0e10cSrcweir 
128cdf0e10cSrcweir     o << "    public void setPropertyValue(String aPropertyName, "
129cdf0e10cSrcweir         "Object aValue) throws "
130cdf0e10cSrcweir         "com.sun.star.beans.UnknownPropertyException, "
131cdf0e10cSrcweir         "com.sun.star.beans.PropertyVetoException, "
132cdf0e10cSrcweir         "com.sun.star.lang.IllegalArgumentException,"
133cdf0e10cSrcweir         "com.sun.star.lang.WrappedTargetException\n    {\n        "
134cdf0e10cSrcweir         "m_prophlp.setPropertyValue(aPropertyName, aValue);\n    }\n\n";
135cdf0e10cSrcweir 
136cdf0e10cSrcweir     o << "    public Object getPropertyValue(String "
137cdf0e10cSrcweir         "aPropertyName) throws com.sun.star.beans.UnknownPropertyException, "
138cdf0e10cSrcweir         "com.sun.star.lang.WrappedTargetException\n    {\n        return "
139cdf0e10cSrcweir         "m_prophlp.getPropertyValue(aPropertyName);\n    }\n\n";
140cdf0e10cSrcweir 
141cdf0e10cSrcweir     o << "    public void addPropertyChangeListener(String aPropertyName"
142cdf0e10cSrcweir         ", com.sun.star.beans.XPropertyChangeListener xListener) throws "
143cdf0e10cSrcweir         "com.sun.star.beans.UnknownPropertyException, "
144cdf0e10cSrcweir         "com.sun.star.lang.WrappedTargetException\n    {\n        "
145cdf0e10cSrcweir         "m_prophlp.addPropertyChangeListener(aPropertyName, xListener);\n    }\n\n";
146cdf0e10cSrcweir 
147cdf0e10cSrcweir     o << "    public void removePropertyChangeListener(String "
148cdf0e10cSrcweir         "aPropertyName, com.sun.star.beans.XPropertyChangeListener xListener) "
149cdf0e10cSrcweir         "throws com.sun.star.beans.UnknownPropertyException, "
150cdf0e10cSrcweir         "com.sun.star.lang.WrappedTargetException\n    {\n        "
151cdf0e10cSrcweir         "m_prophlp.removePropertyChangeListener(aPropertyName, xListener);\n"
152cdf0e10cSrcweir         "    }\n\n";
153cdf0e10cSrcweir 
154cdf0e10cSrcweir     o << "    public void addVetoableChangeListener(String aPropertyName"
155cdf0e10cSrcweir         ", com.sun.star.beans.XVetoableChangeListener xListener) throws "
156cdf0e10cSrcweir         "com.sun.star.beans.UnknownPropertyException, "
157cdf0e10cSrcweir         "com.sun.star.lang.WrappedTargetException\n    {\n        "
158cdf0e10cSrcweir         "m_prophlp.addVetoableChangeListener(aPropertyName, xListener);\n    }\n\n";
159cdf0e10cSrcweir 
160cdf0e10cSrcweir     o << "    public void removeVetoableChangeListener(String "
161cdf0e10cSrcweir         "aPropertyName, com.sun.star.beans.XVetoableChangeListener xListener) "
162cdf0e10cSrcweir         "throws com.sun.star.beans.UnknownPropertyException, "
163cdf0e10cSrcweir         "com.sun.star.lang.WrappedTargetException\n    {\n        "
164cdf0e10cSrcweir         "m_prophlp.removeVetoableChangeListener(aPropertyName, xListener);\n }\n\n";
165cdf0e10cSrcweir }
166cdf0e10cSrcweir 
generateXFastPropertySetBodies(std::ostream & o)167cdf0e10cSrcweir void generateXFastPropertySetBodies(std::ostream& o)
168cdf0e10cSrcweir {
169cdf0e10cSrcweir     o << "    // com.sun.star.beans.XFastPropertySet:\n";
170cdf0e10cSrcweir 
171cdf0e10cSrcweir     o << "    public void setFastPropertyValue(int nHandle, Object "
172cdf0e10cSrcweir         "aValue) throws com.sun.star.beans.UnknownPropertyException, "
173cdf0e10cSrcweir         "com.sun.star.beans.PropertyVetoException, "
174cdf0e10cSrcweir         "com.sun.star.lang.IllegalArgumentException, "
175cdf0e10cSrcweir         "com.sun.star.lang.WrappedTargetException\n    {\n        "
176cdf0e10cSrcweir         "m_prophlp.setFastPropertyValue(nHandle, aValue);\n    }\n\n";
177cdf0e10cSrcweir 
178cdf0e10cSrcweir     o << "    public Object getFastPropertyValue(int nHandle) throws "
179cdf0e10cSrcweir         "com.sun.star.beans.UnknownPropertyException, "
180cdf0e10cSrcweir         "com.sun.star.lang.WrappedTargetException\n    {\n        return "
181cdf0e10cSrcweir         "m_prophlp.getFastPropertyValue(nHandle);\n    }\n\n";
182cdf0e10cSrcweir }
183cdf0e10cSrcweir 
generateXPropertyAccessBodies(std::ostream & o)184cdf0e10cSrcweir void generateXPropertyAccessBodies(std::ostream& o)
185cdf0e10cSrcweir {
186cdf0e10cSrcweir     o << "    // com.sun.star.beans.XPropertyAccess:\n";
187cdf0e10cSrcweir 
188cdf0e10cSrcweir     o << "    public com.sun.star.beans.PropertyValue[] getPropertyValues()\n"
189cdf0e10cSrcweir         " {\n        return m_prophlp.getPropertyValues();\n    }\n\n";
190cdf0e10cSrcweir 
191cdf0e10cSrcweir     o << "    public void setPropertyValues(com.sun.star.beans.PropertyValue[] "
192cdf0e10cSrcweir         "aProps) throws com.sun.star.beans.UnknownPropertyException, "
193cdf0e10cSrcweir         "com.sun.star.beans.PropertyVetoException, "
194cdf0e10cSrcweir         "com.sun.star.lang.IllegalArgumentException, "
195cdf0e10cSrcweir         "com.sun.star.lang.WrappedTargetException\n    {\n        "
196cdf0e10cSrcweir         "m_prophlp.setPropertyValues(aProps);\n    }\n\n";
197cdf0e10cSrcweir }
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 
checkAttribute(OStringBuffer & attributeValue,sal_uInt16 attribute)200cdf0e10cSrcweir bool checkAttribute(OStringBuffer& attributeValue, sal_uInt16 attribute)
201cdf0e10cSrcweir {
202cdf0e10cSrcweir     bool cast = false;
203cdf0e10cSrcweir     sal_uInt16 attributes[9] = {
204cdf0e10cSrcweir         /* com::sun::star::beans::PropertyValue::MAYBEVOID */ 1,
205cdf0e10cSrcweir         /* com::sun::star::beans::PropertyValue::BOUND */ 2,
206cdf0e10cSrcweir         /* com::sun::star::beans::PropertyValue::CONSTRAINED */ 4,
207cdf0e10cSrcweir         /* com::sun::star::beans::PropertyValue::TRANSIENT */ 8,
208cdf0e10cSrcweir         /* com::sun::star::beans::PropertyValue::READONLY */ 16,
209cdf0e10cSrcweir         /* com::sun::star::beans::PropertyValue::MAYBEAMBIGIOUS */ 32,
210cdf0e10cSrcweir         /* com::sun::star::beans::PropertyValue::MAYBEDEFAULT */ 64,
211cdf0e10cSrcweir         /* com::sun::star::beans::PropertyValue::REMOVEABLE */ 128,
212cdf0e10cSrcweir         /* com::sun::star::beans::PropertyValue::OPTIONAL */ 256 };
213cdf0e10cSrcweir 
214cdf0e10cSrcweir     for (sal_uInt16 i = 0; i < 9; i++)
215cdf0e10cSrcweir     {
216cdf0e10cSrcweir         if (attribute & attributes[i]) {
217cdf0e10cSrcweir             if (attributeValue.getLength() > 0) {
218cdf0e10cSrcweir                 cast |= true;
219cdf0e10cSrcweir                 attributeValue.append("|");
220cdf0e10cSrcweir             }
221cdf0e10cSrcweir             switch (attributes[i])
222cdf0e10cSrcweir             {
223cdf0e10cSrcweir             case 1:
224cdf0e10cSrcweir                 attributeValue.append("PropertyAttribute.MAYBEVOID");
225cdf0e10cSrcweir                 break;
226cdf0e10cSrcweir             case 2:
227cdf0e10cSrcweir                 attributeValue.append("PropertyAttribute.BOUND");
228cdf0e10cSrcweir                 break;
229cdf0e10cSrcweir             case 4:
230cdf0e10cSrcweir                 attributeValue.append("PropertyAttribute.CONSTRAINED");
231cdf0e10cSrcweir                 break;
232cdf0e10cSrcweir             case 8:
233cdf0e10cSrcweir                 attributeValue.append("PropertyAttribute.TRANSIENT");
234cdf0e10cSrcweir                 break;
235cdf0e10cSrcweir             case 16:
236cdf0e10cSrcweir                 attributeValue.append("PropertyAttribute.READONLY");
237cdf0e10cSrcweir                 break;
238cdf0e10cSrcweir             case 32:
239cdf0e10cSrcweir                 attributeValue.append("PropertyAttribute.MAYBEAMBIGIOUS");
240cdf0e10cSrcweir                 break;
241cdf0e10cSrcweir             case 64:
242cdf0e10cSrcweir                 attributeValue.append("PropertyAttribute.MAYBEDEFAULT");
243cdf0e10cSrcweir                 break;
244cdf0e10cSrcweir             case 128:
245cdf0e10cSrcweir                 attributeValue.append("PropertyAttribute.REMOVEABLE");
246cdf0e10cSrcweir                 break;
247cdf0e10cSrcweir             case 256:
248cdf0e10cSrcweir                 attributeValue.append("PropertyAttribute.OPTIONAL");
249cdf0e10cSrcweir                 break;
250cdf0e10cSrcweir             }
251cdf0e10cSrcweir         }
252cdf0e10cSrcweir     }
253cdf0e10cSrcweir     if (cast) {
254cdf0e10cSrcweir         attributeValue.insert(0, '(');
255cdf0e10cSrcweir         attributeValue.append(')');
256cdf0e10cSrcweir     }
257cdf0e10cSrcweir 
258cdf0e10cSrcweir     return cast;
259cdf0e10cSrcweir }
260cdf0e10cSrcweir 
registerProperties(std::ostream & o,TypeManager const &,const AttributeInfo & properties,const OString & indentation)261cdf0e10cSrcweir void registerProperties(std::ostream& o,
262cdf0e10cSrcweir                         TypeManager const & /*manager*/,
263cdf0e10cSrcweir                         const AttributeInfo& properties,
264cdf0e10cSrcweir                         const OString& indentation)
265cdf0e10cSrcweir {
266cdf0e10cSrcweir     if (!properties.empty()) {
267cdf0e10cSrcweir         bool cast = false;
268cdf0e10cSrcweir         OStringBuffer attributeValue;
269cdf0e10cSrcweir         for (AttributeInfo::const_iterator i(properties.begin());
270cdf0e10cSrcweir              i != properties.end(); ++i)
271cdf0e10cSrcweir         {
272cdf0e10cSrcweir             if (i->second.second > 0) {
273cdf0e10cSrcweir                 cast = checkAttribute(attributeValue, i->second.second);
274cdf0e10cSrcweir             } else {
275cdf0e10cSrcweir                 cast = true;
276cdf0e10cSrcweir                 attributeValue.append('0');
277cdf0e10cSrcweir             }
278cdf0e10cSrcweir 
279cdf0e10cSrcweir             o << indentation << "registerProperty(\"" << i->first
280cdf0e10cSrcweir               << "\", \"m_" << i->first << "\",\n"
281cdf0e10cSrcweir               << indentation << "      ";
282cdf0e10cSrcweir             if (cast)
283cdf0e10cSrcweir                 o << "(short)";
284cdf0e10cSrcweir 
285cdf0e10cSrcweir             o << attributeValue.makeStringAndClear() << ");\n";
286cdf0e10cSrcweir         }
287cdf0e10cSrcweir     }
288cdf0e10cSrcweir }
289cdf0e10cSrcweir 
generateXLocalizableBodies(std::ostream & o)290cdf0e10cSrcweir void generateXLocalizableBodies(std::ostream& o) {
291cdf0e10cSrcweir     // com.sun.star.lang.XLocalizable:
292cdf0e10cSrcweir     // setLocale
293cdf0e10cSrcweir     o << "    // com.sun.star.lang.XLocalizable:\n"
294cdf0e10cSrcweir         "    public void setLocale(com.sun.star.lang.Locale eLocale)\n    {\n"
295cdf0e10cSrcweir         "        m_locale = eLocale;\n    }\n\n";
296cdf0e10cSrcweir 
297cdf0e10cSrcweir     // getLocale
298cdf0e10cSrcweir     o << "    public com.sun.star.lang.Locale getLocale()\n    {\n"
299cdf0e10cSrcweir         "        return m_locale;\n    }\n\n";
300cdf0e10cSrcweir }
301cdf0e10cSrcweir 
generateXAddInBodies(std::ostream & o,ProgramOptions const & options)302cdf0e10cSrcweir void generateXAddInBodies(std::ostream& o, ProgramOptions const & options)
303cdf0e10cSrcweir {
304cdf0e10cSrcweir     // com.sun.star.sheet.XAddIn:
305cdf0e10cSrcweir     // getProgrammaticFuntionName
306cdf0e10cSrcweir     o << "    // com.sun.star.sheet.XAddIn:\n"
307cdf0e10cSrcweir         "    public String getProgrammaticFuntionName(String "
308cdf0e10cSrcweir         "aDisplayName)\n    {\n"
309cdf0e10cSrcweir         "        try {\n"
310cdf0e10cSrcweir         "            com.sun.star.container.XNameAccess xNAccess =\n"
311cdf0e10cSrcweir         "                (com.sun.star.container.XNameAccess)UnoRuntime."
312cdf0e10cSrcweir         "queryInterface(\n"
313cdf0e10cSrcweir         "                    com.sun.star.container.XNameAccess.class, m_xHAccess);"
314cdf0e10cSrcweir         "\n            String functions[] = xNAccess.getElementNames();\n"
315cdf0e10cSrcweir         "            String sDisplayName = \"\";\n"
316cdf0e10cSrcweir         "            int len = functions.length;\n"
317cdf0e10cSrcweir         "            for (int i=0; i < len; ++i) {\n"
318cdf0e10cSrcweir         "                sDisplayName = com.sun.star.uno.AnyConverter.toString(\n"
319cdf0e10cSrcweir         "                    getAddinProperty(functions[i], \"\", sDISPLAYNAME));\n"
320cdf0e10cSrcweir         "                if (sDisplayName.equals(aDisplayName))\n"
321cdf0e10cSrcweir         "                    return functions[i];\n            }\n"
322cdf0e10cSrcweir         "        }\n        catch ( com.sun.star.uno.RuntimeException e ) {\n"
323cdf0e10cSrcweir         "            throw e;\n        }\n"
324cdf0e10cSrcweir         "        catch ( com.sun.star.uno.Exception e ) {\n        }\n\n"
325cdf0e10cSrcweir         "        return \"\";\n    }\n\n";
326cdf0e10cSrcweir 
327cdf0e10cSrcweir     // getDisplayFunctionName
328cdf0e10cSrcweir     o << "    public String getDisplayFunctionName(String "
329cdf0e10cSrcweir         "aProgrammaticName)\n    {\n"
330cdf0e10cSrcweir         "        return getAddinProperty(aProgrammaticName, \"\", sDISPLAYNAME);\n"
331cdf0e10cSrcweir         "    }\n\n";
332cdf0e10cSrcweir 
333cdf0e10cSrcweir     // getFunctionDescription
334cdf0e10cSrcweir     o << "    public String getFunctionDescription(String "
335cdf0e10cSrcweir         "aProgrammaticName)\n    {\n"
336cdf0e10cSrcweir         "        return getAddinProperty(aProgrammaticName, \"\", sDESCRIPTION);\n"
337cdf0e10cSrcweir         "    }\n\n";
338cdf0e10cSrcweir 
339cdf0e10cSrcweir     // getDisplayArgumentName
340cdf0e10cSrcweir     o << "    public String getDisplayArgumentName(String "
341cdf0e10cSrcweir         "aProgrammaticFunctionName, int nArgument)\n    {\n";
342cdf0e10cSrcweir     if (options.java5) {
343cdf0e10cSrcweir         o << "        return getAddinProperty(aProgrammaticFunctionName,\n"
344cdf0e10cSrcweir             "                                m_functionMap.get(\n"
345cdf0e10cSrcweir             "                                    aProgrammaticFunctionName).get("
346cdf0e10cSrcweir             "nArgument),\n"
347cdf0e10cSrcweir             "                                sDISPLAYNAME);\n    }\n\n";
348cdf0e10cSrcweir     } else {
349cdf0e10cSrcweir         o << "        return getAddinProperty(aProgrammaticFunctionName, (String)\n"
350cdf0e10cSrcweir             "                                ((java.util.Hashtable)m_functionMap."
351cdf0e10cSrcweir             "get(\n                                    aProgrammaticFunctionName))."
352cdf0e10cSrcweir             "get(\n                                        new Integer(nArgument))"
353cdf0e10cSrcweir             ", sDISPLAYNAME);\n    }\n\n";
354cdf0e10cSrcweir     }
355cdf0e10cSrcweir 
356cdf0e10cSrcweir     // getArgumentDescription
357cdf0e10cSrcweir     o << "    public String getArgumentDescription(String "
358cdf0e10cSrcweir         "aProgrammaticFunctionName, int nArgument)\n    {\n";
359cdf0e10cSrcweir     if (options.java5) {
360cdf0e10cSrcweir         o << "        return getAddinProperty(aProgrammaticFunctionName,\n"
361cdf0e10cSrcweir             "                                m_functionMap.get(\n"
362cdf0e10cSrcweir             "                                    aProgrammaticFunctionName).get("
363cdf0e10cSrcweir             "nArgument),\n"
364cdf0e10cSrcweir             "                                sDESCRIPTION);\n    }\n\n";
365cdf0e10cSrcweir     } else {
366cdf0e10cSrcweir         o << "        return getAddinProperty(aProgrammaticFunctionName, (String)\n"
367cdf0e10cSrcweir             "                                ((java.util.Hashtable)m_functionMap."
368cdf0e10cSrcweir             "get(\n                                    aProgrammaticFunctionName))."
369cdf0e10cSrcweir             "get(\n                                        new Integer(nArgument))"
370cdf0e10cSrcweir             ", sDESCRIPTION);\n    }\n\n";
371cdf0e10cSrcweir     }
372cdf0e10cSrcweir     // getProgrammaticCategoryName
373cdf0e10cSrcweir     o << "    public String getProgrammaticCategoryName(String "
374cdf0e10cSrcweir         "aProgrammaticFunctionName)\n    {\n"
375cdf0e10cSrcweir         "        return getAddinProperty(aProgrammaticFunctionName, \"\", "
376cdf0e10cSrcweir         "sCATEGORY);\n    }\n\n";
377cdf0e10cSrcweir 
378cdf0e10cSrcweir     // getDisplayCategoryName
379cdf0e10cSrcweir     o << "    public String getDisplayCategoryName(String "
380cdf0e10cSrcweir         "aProgrammaticFunctionName)\n    {\n"
381cdf0e10cSrcweir         "        return getAddinProperty(aProgrammaticFunctionName, \"\", "
382cdf0e10cSrcweir         "sCATEGORYDISPLAYNAME);\n    }\n\n";
383cdf0e10cSrcweir }
384cdf0e10cSrcweir 
generateXCompatibilityNamesBodies(std::ostream & o)385cdf0e10cSrcweir void generateXCompatibilityNamesBodies(std::ostream& o)
386cdf0e10cSrcweir {
387cdf0e10cSrcweir     o << "    // com.sun.star.sheet.XCompatibilityNames:\n"
388cdf0e10cSrcweir         "    public com.sun.star.sheet.LocalizedName[] getCompatibilityNames("
389cdf0e10cSrcweir         "String aProgrammaticName)\n    {\n"
390cdf0e10cSrcweir         "        com.sun.star.sheet.LocalizedName[] seqLocalizedNames =\n"
391cdf0e10cSrcweir         "            new com.sun.star.sheet.LocalizedName[0];\n\n        try {\n";
392cdf0e10cSrcweir 
393cdf0e10cSrcweir     o << "            StringBuffer path = new StringBuffer(aProgrammaticName);\n"
394cdf0e10cSrcweir         "            path.append(\"/CompatibilityName\");\n"
395cdf0e10cSrcweir         "            String hname = path.toString();\n\n";
396cdf0e10cSrcweir 
397cdf0e10cSrcweir     o << "            if ( m_xCompAccess.hasByHierarchicalName(hname) ) {\n"
398cdf0e10cSrcweir         "                com.sun.star.container.XNameAccess xNameAccess =\n"
399cdf0e10cSrcweir         "                    (com.sun.star.container.XNameAccess)UnoRuntime."
400cdf0e10cSrcweir         "queryInterface(\n"
401cdf0e10cSrcweir         "                        com.sun.star.container.XNameAccess.class,\n"
402cdf0e10cSrcweir         "                        m_xCompAccess.getByHierarchicalName(hname));\n\n"
403cdf0e10cSrcweir         "                String elems[] = xNameAccess.getElementNames();\n"
404cdf0e10cSrcweir         "                int len = elems.length;\n"
405cdf0e10cSrcweir         "                seqLocalizedNames = new com.sun.star.sheet.LocalizedName"
406cdf0e10cSrcweir         "[len];\n                String sCompatibilityName = \"\";\n\n";
407cdf0e10cSrcweir 
408cdf0e10cSrcweir     o << "                for (int i=0; i < len; ++i) {\n"
409cdf0e10cSrcweir         "                    String sLocale = elems[i];\n"
410cdf0e10cSrcweir         "                    sCompatibilityName = com.sun.star.uno.AnyConverter."
411cdf0e10cSrcweir         "toString(\n                        xNameAccess.getByName(sLocale));\n\n"
412cdf0e10cSrcweir         "                    com.sun.star.lang.Locale aLocale = \n"
413cdf0e10cSrcweir         "                        new com.sun.star.lang.Locale();\n\n"
414cdf0e10cSrcweir         "                    String tokens[] = sLocale.split(\"-\");\n"
415cdf0e10cSrcweir         "                    int nToken = tokens.length;\n"
416cdf0e10cSrcweir         "                    if (nToken >= 1) aLocale.Language = tokens[0];\n"
417cdf0e10cSrcweir         "                    if (nToken >= 2) aLocale.Country = tokens[1];\n"
418cdf0e10cSrcweir         "                    if (nToken >= 3)  {\n"
419cdf0e10cSrcweir         "                        StringBuffer buf = \n"
420cdf0e10cSrcweir         "                            new StringBuffer(tokens[2]);\n"
421cdf0e10cSrcweir         "                        for (int t=3; t < nToken; ++t)\n"
422cdf0e10cSrcweir         "                            buf.append(tokens[t]);\n\n"
423cdf0e10cSrcweir         "                        aLocale.Variant = buf.toString();\n"
424cdf0e10cSrcweir         "                    }\n\n"
425cdf0e10cSrcweir         "                    seqLocalizedNames[i].Locale = aLocale;\n"
426cdf0e10cSrcweir         "                    seqLocalizedNames[i].Name = sCompatibilityName;\n"
427cdf0e10cSrcweir         "                }\n        }\n        }\n"
428cdf0e10cSrcweir         "        catch ( com.sun.star.uno.RuntimeException e ) {\n"
429cdf0e10cSrcweir         "            throw e;\n        }\n"
430cdf0e10cSrcweir         "        catch ( com.sun.star.uno.Exception e ) {\n        }\n\n"
431cdf0e10cSrcweir         "        return seqLocalizedNames;\n    }\n\n";
432cdf0e10cSrcweir }
433cdf0e10cSrcweir 
generateXInitializationBodies(std::ostream & o)434cdf0e10cSrcweir void generateXInitializationBodies(std::ostream& o)
435cdf0e10cSrcweir {
436cdf0e10cSrcweir     o << "    // com.sun.star.lang.XInitialization:\n"
437cdf0e10cSrcweir         "    public void initialize( Object[] object )\n"
438cdf0e10cSrcweir         "        throws com.sun.star.uno.Exception\n    {\n"
439cdf0e10cSrcweir         "        if ( object.length > 0 )\n        {\n"
440cdf0e10cSrcweir         "            m_xFrame = (com.sun.star.frame.XFrame)UnoRuntime.queryInterface(\n"
441cdf0e10cSrcweir         "                com.sun.star.frame.XFrame.class, object[0]);\n        }\n    }\n\n";
442cdf0e10cSrcweir }
443cdf0e10cSrcweir 
generateXDispatchBodies(std::ostream & o,ProgramOptions const & options)444cdf0e10cSrcweir void generateXDispatchBodies(std::ostream& o, ProgramOptions const & options)
445cdf0e10cSrcweir {
446cdf0e10cSrcweir     // com.sun.star.frame.XDispatch
447cdf0e10cSrcweir     // dispatch
448cdf0e10cSrcweir     o << "    // com.sun.star.frame.XDispatch:\n"
449cdf0e10cSrcweir         "     public void dispatch( com.sun.star.util.URL aURL,\n"
450cdf0e10cSrcweir         "                           com.sun.star.beans.PropertyValue[] aArguments )\n    {\n";
451cdf0e10cSrcweir 
452cdf0e10cSrcweir     ProtocolCmdMap::const_iterator iter = options.protocolCmdMap.begin();
453cdf0e10cSrcweir     while (iter != options.protocolCmdMap.end()) {
454cdf0e10cSrcweir         o << "         if ( aURL.Protocol.compareTo(\"" << (*iter).first
455cdf0e10cSrcweir           << "\") == 0 )\n        {\n";
456cdf0e10cSrcweir 
457cdf0e10cSrcweir         for (std::vector< OString >::const_iterator i = (*iter).second.begin();
458cdf0e10cSrcweir              i != (*iter).second.end(); ++i) {
459cdf0e10cSrcweir             o << "            if ( aURL.Path.compareTo(\"" << (*i) << "\") == 0 )\n"
460cdf0e10cSrcweir                 "            {\n                // add your own code here\n"
461cdf0e10cSrcweir                 "                return;\n            }\n";
462cdf0e10cSrcweir         }
463cdf0e10cSrcweir 
464cdf0e10cSrcweir         o << "        }\n";
465cdf0e10cSrcweir         iter++;
466cdf0e10cSrcweir     }
467cdf0e10cSrcweir     o << "    }\n\n";
468cdf0e10cSrcweir 
469cdf0e10cSrcweir     // addStatusListener
470cdf0e10cSrcweir     o << "    public void addStatusListener( com.sun.star.frame.XStatusListener xControl,\n"
471cdf0e10cSrcweir         "                                    com.sun.star.util.URL aURL )\n    {\n"
472cdf0e10cSrcweir         "        // add your own code here\n    }\n\n";
473cdf0e10cSrcweir 
474cdf0e10cSrcweir     // com.sun.star.frame.XDispatch
475cdf0e10cSrcweir     o << "    public void removeStatusListener( com.sun.star.frame.XStatusListener xControl,\n"
476cdf0e10cSrcweir         "                                       com.sun.star.util.URL aURL )\n    {\n"
477cdf0e10cSrcweir         "        // add your own code here\n    }\n\n";
478cdf0e10cSrcweir }
479cdf0e10cSrcweir 
generateXDispatchProviderBodies(std::ostream & o,ProgramOptions const & options)480cdf0e10cSrcweir void generateXDispatchProviderBodies(std::ostream& o, ProgramOptions const & options)
481cdf0e10cSrcweir {
482cdf0e10cSrcweir     // com.sun.star.frame.XDispatchProvider
483cdf0e10cSrcweir     // queryDispatch
484cdf0e10cSrcweir     o << "    // com.sun.star.frame.XDispatchProvider:\n"
485cdf0e10cSrcweir         "    public com.sun.star.frame.XDispatch queryDispatch( com.sun.star.util.URL aURL,\n"
486cdf0e10cSrcweir         "                                                       String sTargetFrameName,\n"
487cdf0e10cSrcweir         "                                                       int iSearchFlags )\n    {\n";
488cdf0e10cSrcweir 
489cdf0e10cSrcweir     ProtocolCmdMap::const_iterator iter = options.protocolCmdMap.begin();
490cdf0e10cSrcweir     while (iter != options.protocolCmdMap.end()) {
491cdf0e10cSrcweir         o << "        if ( aURL.Protocol.compareTo(\"" << (*iter).first
492cdf0e10cSrcweir           << "\") == 0 )\n        {\n";
493cdf0e10cSrcweir 
494cdf0e10cSrcweir         for (std::vector< OString >::const_iterator i = (*iter).second.begin();
495cdf0e10cSrcweir              i != (*iter).second.end(); ++i) {
496cdf0e10cSrcweir             o << "            if ( aURL.Path.compareTo(\"" << (*i) << "\") == 0 )\n"
497cdf0e10cSrcweir                 "                return this;\n";
498cdf0e10cSrcweir         }
499cdf0e10cSrcweir 
500cdf0e10cSrcweir         o << "        }\n";
501cdf0e10cSrcweir         iter++;
502cdf0e10cSrcweir     }
503cdf0e10cSrcweir     o << "        return null;\n    }\n\n";
504cdf0e10cSrcweir 
505cdf0e10cSrcweir     // queryDispatches
506cdf0e10cSrcweir     o << "    // com.sun.star.frame.XDispatchProvider:\n"
507cdf0e10cSrcweir         "    public com.sun.star.frame.XDispatch[] queryDispatches(\n"
508cdf0e10cSrcweir         "         com.sun.star.frame.DispatchDescriptor[] seqDescriptors )\n    {\n"
509cdf0e10cSrcweir         "        int nCount = seqDescriptors.length;\n"
510cdf0e10cSrcweir         "        com.sun.star.frame.XDispatch[] seqDispatcher =\n"
511cdf0e10cSrcweir         "            new com.sun.star.frame.XDispatch[seqDescriptors.length];\n\n"
512cdf0e10cSrcweir         "        for( int i=0; i < nCount; ++i )\n        {\n"
513cdf0e10cSrcweir         "            seqDispatcher[i] = queryDispatch(seqDescriptors[i].FeatureURL,\n"
514cdf0e10cSrcweir         "                                             seqDescriptors[i].FrameName,\n"
515cdf0e10cSrcweir         "                                             seqDescriptors[i].SearchFlags );\n"
516cdf0e10cSrcweir         "        }\n        return seqDispatcher;\n    }\n\n";
517cdf0e10cSrcweir }
518cdf0e10cSrcweir 
generateMethodBodies(std::ostream & o,ProgramOptions const & options,TypeManager const & manager,const std::hash_set<OString,OStringHash> & interfaces,const OString & indentation,bool usepropertymixin)519cdf0e10cSrcweir void generateMethodBodies(std::ostream& o,
520cdf0e10cSrcweir          ProgramOptions const & options,
521cdf0e10cSrcweir          TypeManager const & manager,
522cdf0e10cSrcweir          const std::hash_set< OString, OStringHash >& interfaces,
523cdf0e10cSrcweir          const OString& indentation, bool usepropertymixin)
524cdf0e10cSrcweir {
525cdf0e10cSrcweir     std::hash_set< OString, OStringHash >::const_iterator iter =
526cdf0e10cSrcweir         interfaces.begin();
527cdf0e10cSrcweir     codemaker::GeneratedTypeSet generated;
528cdf0e10cSrcweir     while (iter != interfaces.end()) {
529cdf0e10cSrcweir         OString type(*iter);
530cdf0e10cSrcweir         iter++;
531cdf0e10cSrcweir         if (type.equals("com.sun.star.lang.XServiceInfo")) {
532cdf0e10cSrcweir             generateXServiceInfoBodies(o);
533cdf0e10cSrcweir             generated.add(type);
534cdf0e10cSrcweir         } else {
535cdf0e10cSrcweir             if (options.componenttype == 2) {
536cdf0e10cSrcweir                 if (type.equals("com.sun.star.lang.XServiceName")) {
537cdf0e10cSrcweir                     o << "    // com.sun.star.lang.XServiceName:\n"
538cdf0e10cSrcweir                         "    public String getServiceName() {\n"
539cdf0e10cSrcweir                         "        return sADDIN_SERVICENAME;\n    }\n";
540cdf0e10cSrcweir                     generated.add(type);
541cdf0e10cSrcweir                     continue;
542cdf0e10cSrcweir                 } else if (type.equals("com.sun.star.sheet.XAddIn")) {
543cdf0e10cSrcweir                     generateXAddInBodies(o, options);
544cdf0e10cSrcweir                     generated.add(type);
545cdf0e10cSrcweir 
546cdf0e10cSrcweir                     // special handling of XLocalizable -> parent of XAddIn
547cdf0e10cSrcweir                     if (!generated.contains("com.sun.star.lang.XLocalizable")) {
548cdf0e10cSrcweir                         generateXLocalizableBodies(o);
549cdf0e10cSrcweir                         generated.add("com.sun.star.lang.XLocalizable");
550cdf0e10cSrcweir                     }
551cdf0e10cSrcweir                     continue;
552cdf0e10cSrcweir                 } else if (type.equals("com.sun.star.lang.XLocalizable")) {
553cdf0e10cSrcweir                     generateXLocalizableBodies(o);
554cdf0e10cSrcweir                     generated.add(type);
555cdf0e10cSrcweir                     continue;
556cdf0e10cSrcweir                 } else if (type.equals("com.sun.star.sheet.XCompatibilityNames")) {
557cdf0e10cSrcweir                     generateXCompatibilityNamesBodies(o);
558cdf0e10cSrcweir                     generated.add(type);
559cdf0e10cSrcweir                     continue;
560cdf0e10cSrcweir                 }
561cdf0e10cSrcweir             }
562cdf0e10cSrcweir             if (options.componenttype == 3) {
563cdf0e10cSrcweir                 if (type.equals("com.sun.star.lang.XInitialization")) {
564cdf0e10cSrcweir                     generateXInitializationBodies(o);
565cdf0e10cSrcweir                     generated.add(type);
566cdf0e10cSrcweir                     continue;
567cdf0e10cSrcweir                 } else if (type.equals("com.sun.star.frame.XDispatch")) {
568cdf0e10cSrcweir                     generateXDispatchBodies(o, options);
569cdf0e10cSrcweir                     generated.add(type);
570cdf0e10cSrcweir                     continue;
571cdf0e10cSrcweir                 } else if (type.equals("com.sun.star.frame.XDispatchProvider")) {
572cdf0e10cSrcweir                     generateXDispatchProviderBodies(o, options);
573cdf0e10cSrcweir                     generated.add(type);
574cdf0e10cSrcweir                     continue;
575cdf0e10cSrcweir                 }
576cdf0e10cSrcweir             }
577cdf0e10cSrcweir             typereg::Reader reader(manager.getTypeReader(type.replace('.','/')));
578cdf0e10cSrcweir             printMethods(o, options, manager, reader, generated, "_",
579cdf0e10cSrcweir                          indentation, true, usepropertymixin);
580cdf0e10cSrcweir         }
581cdf0e10cSrcweir     }
582cdf0e10cSrcweir }
583cdf0e10cSrcweir 
584cdf0e10cSrcweir static const char* propcomment=
585cdf0e10cSrcweir "        // use the last parameter of the PropertySetMixin constructor\n"
586cdf0e10cSrcweir "        // for your optional attributes if necessary. See the documentation\n"
587cdf0e10cSrcweir "        // of the PropertySetMixin helper for further information.\n"
588cdf0e10cSrcweir "        // Ensure that your attributes are initialized correctly!\n";
589cdf0e10cSrcweir 
590cdf0e10cSrcweir 
generateAddinConstructorAndHelper(std::ostream & o,ProgramOptions const & options,TypeManager const & manager,const OString & classname,const std::hash_set<OString,OStringHash> & services,const std::hash_set<OString,OStringHash> & interfaces)591cdf0e10cSrcweir void generateAddinConstructorAndHelper(std::ostream& o,
592cdf0e10cSrcweir          ProgramOptions const & options,
593cdf0e10cSrcweir          TypeManager const & manager, const OString & classname,
594cdf0e10cSrcweir          const std::hash_set< OString, OStringHash >& services,
595cdf0e10cSrcweir          const std::hash_set< OString, OStringHash >& interfaces)
596cdf0e10cSrcweir {
597cdf0e10cSrcweir     o << "    private com.sun.star.lang.Locale m_locale = "
598cdf0e10cSrcweir         "new com.sun.star.lang.Locale();\n";
599cdf0e10cSrcweir 
600cdf0e10cSrcweir     if (!options.backwardcompatible) {
601cdf0e10cSrcweir         // Constructor
602cdf0e10cSrcweir         o << "\n    public " << classname << "( XComponentContext context )\n"
603cdf0e10cSrcweir             "    {\n        m_xContext = context;\n    }\n\n";
604cdf0e10cSrcweir         return;
605cdf0e10cSrcweir     }
606cdf0e10cSrcweir 
607cdf0e10cSrcweir 
608cdf0e10cSrcweir     // get the one and only add-in service for later use
609cdf0e10cSrcweir     std::hash_set< OString, OStringHash >::const_iterator iter = services.begin();
610cdf0e10cSrcweir     OString sAddinService = (*iter).replace('/', '.');
611cdf0e10cSrcweir     if (sAddinService.equals("com.sun.star.sheet.AddIn")) {
612cdf0e10cSrcweir         sAddinService = (*(++iter)).replace('/', '.');
613cdf0e10cSrcweir     }
614cdf0e10cSrcweir 
615cdf0e10cSrcweir 
616cdf0e10cSrcweir     // add-in specific fields
617cdf0e10cSrcweir     o << "\n    private static final String sADDIN_SERVICENAME = \""
618cdf0e10cSrcweir       << sAddinService << "\";\n\n";
619cdf0e10cSrcweir     o << "    private static final String sDISPLAYNAME = "
620cdf0e10cSrcweir         "\"DisplayName\";\n"
621cdf0e10cSrcweir         "    private static final String sDESCRIPTION = "
622cdf0e10cSrcweir         "\"Description\";\n"
623cdf0e10cSrcweir         "    private static final String sCATEGORY = \"Category\";\n"
624cdf0e10cSrcweir         "    private static final String sCATEGORYDISPLAYNAME = "
625cdf0e10cSrcweir         "\"CategoryDisplayName\";\n\n";
626cdf0e10cSrcweir 
627cdf0e10cSrcweir     o << "    private com.sun.star.container.XHierarchicalNameAccess  "
628cdf0e10cSrcweir         "m_xHAccess = null;\n"
629cdf0e10cSrcweir         "    private com.sun.star.container.XHierarchicalNameAccess  "
630cdf0e10cSrcweir         "m_xCompAccess = null;\n";
631cdf0e10cSrcweir     if (options.java5) {
632cdf0e10cSrcweir         o << "    private java.util.Hashtable<\n        String, "
633cdf0e10cSrcweir             "java.util.Hashtable< Integer, String> > m_functionMap = null;\n\n";
634cdf0e10cSrcweir     } else {
635cdf0e10cSrcweir         o << "    private java.util.Hashtable m_functionMap = null;\n\n";
636cdf0e10cSrcweir     }
637cdf0e10cSrcweir     // Constructor
638cdf0e10cSrcweir     o << "\n    public " << classname << "( XComponentContext context )\n    {\n"
639cdf0e10cSrcweir         "        m_xContext = context;\n\n"
640cdf0e10cSrcweir         "        try {\n";
641cdf0e10cSrcweir 
642cdf0e10cSrcweir     if (options.java5) {
643cdf0e10cSrcweir         o << "        m_functionMap = new java.util.Hashtable<\n"
644cdf0e10cSrcweir             "            String, java.util.Hashtable< Integer, "
645cdf0e10cSrcweir             "String > >();\n\n";
646cdf0e10cSrcweir     } else {
647cdf0e10cSrcweir         o << "        m_functionMap = new java.util.Hashtable();\n\n";
648cdf0e10cSrcweir     }
649cdf0e10cSrcweir 
650cdf0e10cSrcweir     generateFunctionParameterMap(o, options,  manager, interfaces);
651cdf0e10cSrcweir 
652cdf0e10cSrcweir     o << "        com.sun.star.lang.XMultiServiceFactory xProvider = \n"
653cdf0e10cSrcweir         "            (com.sun.star.lang.XMultiServiceFactory)UnoRuntime."
654cdf0e10cSrcweir         "queryInterface(\n"
655cdf0e10cSrcweir         "                com.sun.star.lang.XMultiServiceFactory.class,\n"
656cdf0e10cSrcweir         "                m_xContext.getServiceManager().createInstanceWithContext("
657cdf0e10cSrcweir         "\n                    \"com.sun.star.configuration.ConfigurationProvider\""
658cdf0e10cSrcweir         ",\n                    m_xContext));\n\n";
659cdf0e10cSrcweir 
660cdf0e10cSrcweir     o << "        String sReadOnlyView = "
661cdf0e10cSrcweir         "\"com.sun.star.configuration.ConfigurationAccess\";\n\n";
662cdf0e10cSrcweir 
663cdf0e10cSrcweir     o << "        StringBuffer sPath = new StringBuffer(\n"
664cdf0e10cSrcweir         "             \"/org.openoffice.Office.CalcAddIns/AddInInfo/\");\n"
665cdf0e10cSrcweir         "        sPath.append(sADDIN_SERVICENAME);\n"
666cdf0e10cSrcweir         "        sPath.append(\"/AddInFunctions\");\n\n";
667cdf0e10cSrcweir 
668cdf0e10cSrcweir     o << "        // create arguments: nodepath\n"
669cdf0e10cSrcweir         "         com.sun.star.beans.PropertyValue aArgument = \n"
670cdf0e10cSrcweir         "             new com.sun.star.beans.PropertyValue();\n"
671cdf0e10cSrcweir         "         aArgument.Name = \"nodepath\";\n"
672cdf0e10cSrcweir         "         aArgument.Value = new com.sun.star.uno.Any(\n"
673cdf0e10cSrcweir         "             com.sun.star.uno.Type.STRING, sPath.toString());\n\n";
674cdf0e10cSrcweir 
675cdf0e10cSrcweir     o << "        Object aArguments[] = new Object[1];\n"
676cdf0e10cSrcweir         "        aArguments[0] = new com.sun.star.uno.Any("
677cdf0e10cSrcweir         " new com.sun.star.uno.Type(\n"
678cdf0e10cSrcweir         "            com.sun.star.beans.PropertyValue.class), aArgument);\n\n";
679cdf0e10cSrcweir 
680cdf0e10cSrcweir     o << "        // create the default view using default UI locale\n"
681cdf0e10cSrcweir         "         Object xIface = \n"
682cdf0e10cSrcweir         "             xProvider.createInstanceWithArguments(sReadOnlyView, "
683cdf0e10cSrcweir         "aArguments);\n\n";
684cdf0e10cSrcweir 
685cdf0e10cSrcweir     o << "        m_xHAccess = (com.sun.star.container.XHierarchicalNameAccess)\n"
686cdf0e10cSrcweir         "             UnoRuntime.queryInterface(\n"
687cdf0e10cSrcweir         "                 com.sun.star.container.XHierarchicalNameAccess.class, "
688cdf0e10cSrcweir         "xIface);\n\n";
689cdf0e10cSrcweir 
690cdf0e10cSrcweir     o << "        // extends arguments to create a view for all locales to get "
691cdf0e10cSrcweir         "simple\n        // access to the compatibilityname property\n"
692cdf0e10cSrcweir         "        aArguments = new Object[2];\n"
693cdf0e10cSrcweir         "        aArguments[0] = new com.sun.star.uno.Any( "
694cdf0e10cSrcweir         "new com.sun.star.uno.Type(\n"
695cdf0e10cSrcweir         "            com.sun.star.beans.PropertyValue.class), aArgument);\n"
696cdf0e10cSrcweir         "        aArgument.Name = \"locale\";\n"
697cdf0e10cSrcweir         "        aArgument.Value = new com.sun.star.uno.Any(\n"
698cdf0e10cSrcweir         "            com.sun.star.uno.Type.STRING, \"*\");\n"
699cdf0e10cSrcweir         "        aArguments[1] = new com.sun.star.uno.Any( "
700cdf0e10cSrcweir         " new com.sun.star.uno.Type(\n"
701cdf0e10cSrcweir         "            com.sun.star.beans.PropertyValue.class), aArgument);\n\n";
702cdf0e10cSrcweir 
703cdf0e10cSrcweir     o << "        // create view for all locales\n"
704cdf0e10cSrcweir         "        xIface = xProvider.createInstanceWithArguments(sReadOnlyView, "
705cdf0e10cSrcweir         "aArguments);\n\n"
706cdf0e10cSrcweir         "        m_xCompAccess = (com.sun.star.container.XHierarchicalNameAccess)\n"
707cdf0e10cSrcweir         "            UnoRuntime.queryInterface(\n"
708cdf0e10cSrcweir         "                com.sun.star.container.XHierarchicalNameAccess.class, "
709cdf0e10cSrcweir         "xIface);\n        }\n"
710cdf0e10cSrcweir         "        catch ( com.sun.star.uno.Exception e ) {\n        }\n    }\n\n";
711cdf0e10cSrcweir 
712cdf0e10cSrcweir     // add-in helper function
713cdf0e10cSrcweir     o << "    // addin configuration property helper function:\n"
714cdf0e10cSrcweir         "    String getAddinProperty(String funcName, "
715cdf0e10cSrcweir         "String paramName, String propName)\n    {\n"
716cdf0e10cSrcweir         "        try {\n            StringBuffer buf = "
717cdf0e10cSrcweir         "new StringBuffer(funcName);\n\n"
718cdf0e10cSrcweir         "            if (paramName.length() > 0) {\n"
719cdf0e10cSrcweir         "                buf.append(\"/Parameters/\");\n"
720cdf0e10cSrcweir         "                buf.append(paramName);\n            }\n\n";
721cdf0e10cSrcweir 
722cdf0e10cSrcweir     o << "            com.sun.star.beans.XPropertySet xPropSet =\n"
723cdf0e10cSrcweir         "                (com.sun.star.beans.XPropertySet)UnoRuntime."
724cdf0e10cSrcweir         "queryInterface(\n"
725cdf0e10cSrcweir         "                    com.sun.star.beans.XPropertySet.class,\n"
726cdf0e10cSrcweir         "                    m_xHAccess.getByHierarchicalName(buf.toString()));\n\n"
727cdf0e10cSrcweir         "            return com.sun.star.uno.AnyConverter.toString(\n"
728cdf0e10cSrcweir         "                xPropSet.getPropertyValue(propName));\n        }\n"
729cdf0e10cSrcweir         "        catch ( com.sun.star.uno.RuntimeException e ) {\n"
730cdf0e10cSrcweir         "            throw e;\n        }\n"
731cdf0e10cSrcweir         "        catch ( com.sun.star.uno.Exception e ) {\n        }\n"
732cdf0e10cSrcweir         "        return \"\";\n    }\n\n";
733cdf0e10cSrcweir }
734cdf0e10cSrcweir 
735cdf0e10cSrcweir 
generateClassDefinition(std::ostream & o,ProgramOptions const & options,TypeManager const & manager,const OString & classname,const std::hash_set<OString,OStringHash> & services,const std::hash_set<OString,OStringHash> & interfaces,const AttributeInfo & properties,const AttributeInfo & attributes,const OString & propertyhelper,bool supportxcomponent)736cdf0e10cSrcweir void generateClassDefinition(std::ostream& o,
737cdf0e10cSrcweir          ProgramOptions const & options,
738cdf0e10cSrcweir          TypeManager const & manager,
739cdf0e10cSrcweir          const OString & classname,
740cdf0e10cSrcweir          const std::hash_set< OString, OStringHash >& services,
741cdf0e10cSrcweir          const std::hash_set< OString, OStringHash >& interfaces,
742cdf0e10cSrcweir          const AttributeInfo& properties,
743cdf0e10cSrcweir          const AttributeInfo& attributes,
744cdf0e10cSrcweir          const OString& propertyhelper, bool supportxcomponent)
745cdf0e10cSrcweir {
746cdf0e10cSrcweir     o << "\n\npublic final class " << classname << " extends ";
747cdf0e10cSrcweir 
748cdf0e10cSrcweir     if (!interfaces.empty()) {
749cdf0e10cSrcweir         if (propertyhelper.equals("_")) {
750cdf0e10cSrcweir                 o << "PropertySet\n";
751cdf0e10cSrcweir         } else {
752cdf0e10cSrcweir             if (supportxcomponent)
753cdf0e10cSrcweir                 o << "ComponentBase\n";
754cdf0e10cSrcweir             else
755cdf0e10cSrcweir                 o << "WeakBase\n";
756cdf0e10cSrcweir         }
757cdf0e10cSrcweir         o << "   implements ";
758cdf0e10cSrcweir         std::hash_set< OString, OStringHash >::const_iterator iter =
759cdf0e10cSrcweir             interfaces.begin();
760cdf0e10cSrcweir         while (iter != interfaces.end()) {
761cdf0e10cSrcweir             o << (*iter);
762cdf0e10cSrcweir             iter++;
763cdf0e10cSrcweir             if (iter != interfaces.end())
764cdf0e10cSrcweir                 o << ",\n              ";
765cdf0e10cSrcweir         }
766cdf0e10cSrcweir     }
767cdf0e10cSrcweir     o << "\n{\n";
768cdf0e10cSrcweir 
769cdf0e10cSrcweir     o << "    private final XComponentContext m_xContext;\n";
770cdf0e10cSrcweir 
771cdf0e10cSrcweir     // additional member for add-ons
772cdf0e10cSrcweir     if (options.componenttype == 3) {
773cdf0e10cSrcweir         o << "    private com.sun.star.frame.XFrame m_xFrame;\n";
774cdf0e10cSrcweir     }
775cdf0e10cSrcweir 
776cdf0e10cSrcweir     // check property helper
777cdf0e10cSrcweir     if (propertyhelper.getLength() > 1)
778cdf0e10cSrcweir         o << "    private final PropertySetMixin m_prophlp;\n";
779cdf0e10cSrcweir 
780cdf0e10cSrcweir     o << "    private static final String m_implementationName = "
781cdf0e10cSrcweir       << classname << ".class.getName();\n";
782cdf0e10cSrcweir 
783cdf0e10cSrcweir     if (!services.empty()) {
784cdf0e10cSrcweir         o << "    private static final String[] m_serviceNames = {\n";
785cdf0e10cSrcweir         std::hash_set< OString, OStringHash >::const_iterator iter =
786cdf0e10cSrcweir             services.begin();
787cdf0e10cSrcweir         while (iter != services.end()) {
788cdf0e10cSrcweir             o << "        \"" << (*iter).replace('/','.') << "\"";
789cdf0e10cSrcweir             iter++;
790cdf0e10cSrcweir             if (iter != services.end())
791cdf0e10cSrcweir                 o << ",\n";
792cdf0e10cSrcweir             else
793cdf0e10cSrcweir                 o << " };\n\n";
794cdf0e10cSrcweir         }
795cdf0e10cSrcweir     }
796cdf0e10cSrcweir 
797cdf0e10cSrcweir     // attribute/property members
798cdf0e10cSrcweir     if (!properties.empty()) {
799cdf0e10cSrcweir         AttributeInfo::const_iterator iter =
800cdf0e10cSrcweir             properties.begin();
801cdf0e10cSrcweir         o << "    // properties\n";
802cdf0e10cSrcweir         while (iter != properties.end()) {
803cdf0e10cSrcweir             o << "    protected ";
804cdf0e10cSrcweir             printType(o, options, manager, iter->second.first.replace('.','/'),
805cdf0e10cSrcweir                       false, false);
806cdf0e10cSrcweir             o << " m_" << iter->first << ";\n";
807cdf0e10cSrcweir             iter++;
808cdf0e10cSrcweir         }
809cdf0e10cSrcweir     } else if (!attributes.empty()) {
810cdf0e10cSrcweir         AttributeInfo::const_iterator iter =
811cdf0e10cSrcweir             attributes.begin();
812cdf0e10cSrcweir         o << "    // attributes\n";
813cdf0e10cSrcweir         while (iter != attributes.end()) {
814cdf0e10cSrcweir             o << "    private ";
815cdf0e10cSrcweir             printType(o, options, manager, iter->second.first.replace('.','/'),
816cdf0e10cSrcweir                       false, false);
817cdf0e10cSrcweir             o << " m_" << iter->first << " = ";
818cdf0e10cSrcweir             printType(o, options, manager, iter->second.first.replace('.','/'),
819cdf0e10cSrcweir                       false, true);
820cdf0e10cSrcweir             o <<";\n";
821cdf0e10cSrcweir             iter++;
822cdf0e10cSrcweir         }
823cdf0e10cSrcweir     }
824cdf0e10cSrcweir 
825cdf0e10cSrcweir     // special handling of calc add-ins
826cdf0e10cSrcweir     if (options.componenttype == 2)
827cdf0e10cSrcweir     {
828cdf0e10cSrcweir         generateAddinConstructorAndHelper(o, options, manager, classname,
829cdf0e10cSrcweir                                           services, interfaces);
830cdf0e10cSrcweir     } else {
831cdf0e10cSrcweir         o << "\n    public " << classname << "( XComponentContext context )\n"
832cdf0e10cSrcweir             "    {\n        m_xContext = context;\n";
833cdf0e10cSrcweir         if (propertyhelper.equals("_")) {
834cdf0e10cSrcweir             registerProperties(o, manager, properties, "        ");
835cdf0e10cSrcweir         } else {
836cdf0e10cSrcweir             if (propertyhelper.getLength() > 1) {
837cdf0e10cSrcweir                 o << propcomment
838cdf0e10cSrcweir                   << "        m_prophlp = new PropertySetMixin(m_xContext, this,\n"
839cdf0e10cSrcweir                   << "            new Type(" << propertyhelper
840cdf0e10cSrcweir                   << ".class), null);\n";
841cdf0e10cSrcweir             }
842cdf0e10cSrcweir         }
843cdf0e10cSrcweir         o << "    };\n\n";
844cdf0e10cSrcweir 
845cdf0e10cSrcweir     }
846cdf0e10cSrcweir 
847cdf0e10cSrcweir     if (!services.empty())
848cdf0e10cSrcweir         generateCompFunctions(o, classname);
849cdf0e10cSrcweir 
850cdf0e10cSrcweir     generateMethodBodies(o, options, manager, interfaces,
851cdf0e10cSrcweir                          "    ", propertyhelper.getLength() > 1);
852cdf0e10cSrcweir 
853cdf0e10cSrcweir     // end of class definition
854cdf0e10cSrcweir     o << "}\n";
855cdf0e10cSrcweir }
856cdf0e10cSrcweir 
generateSkeleton(ProgramOptions const & options,TypeManager const & manager,std::vector<OString> const & types,OString const &)857cdf0e10cSrcweir void generateSkeleton(ProgramOptions const & options,
858cdf0e10cSrcweir                       TypeManager const & manager,
859cdf0e10cSrcweir                       std::vector< OString > const & types,
860cdf0e10cSrcweir                       OString const & /*delegate*/)
861cdf0e10cSrcweir {
862cdf0e10cSrcweir     std::hash_set< OString, OStringHash > interfaces;
863cdf0e10cSrcweir     std::hash_set< OString, OStringHash > services;
864cdf0e10cSrcweir     AttributeInfo properties;
865cdf0e10cSrcweir     AttributeInfo attributes;
866cdf0e10cSrcweir     std::hash_set< OString, OStringHash > propinterfaces;
867cdf0e10cSrcweir     bool serviceobject = false;
868cdf0e10cSrcweir     bool supportxcomponent = false;
869cdf0e10cSrcweir 
870cdf0e10cSrcweir     std::vector< OString >::const_iterator iter = types.begin();
871cdf0e10cSrcweir     while (iter != types.end()) {
872cdf0e10cSrcweir         checkType(manager, *iter, interfaces, services, properties);
873cdf0e10cSrcweir         iter++;
874cdf0e10cSrcweir     }
875cdf0e10cSrcweir 
876cdf0e10cSrcweir     if (options.componenttype == 3) {
877cdf0e10cSrcweir         // the Protocolhandler service is mandatory for an protocol handler add-on,
878cdf0e10cSrcweir         // so it is defaulted. The XDispatchProvider provides Dispatch objects for
879cdf0e10cSrcweir         // certain functions and the generated impl object implements XDispatch
880cdf0e10cSrcweir         // directly for simplicity reasons.
881cdf0e10cSrcweir         checkType(manager, "com.sun.star.frame.ProtocolHandler",
882cdf0e10cSrcweir                   interfaces, services, properties);
883cdf0e10cSrcweir         checkType(manager, "com.sun.star.frame.XDispatch",
884cdf0e10cSrcweir                   interfaces, services, properties);
885cdf0e10cSrcweir 
886cdf0e10cSrcweir 
887cdf0e10cSrcweir //         ProtocolCmdMap::const_iterator iter2 = options.protocolCmdMap.begin();
888cdf0e10cSrcweir //         while (iter2 != options.protocolCmdMap.end()) {
889cdf0e10cSrcweir //             fprintf(stdout, "prt=%s\n", (*iter2).first.getStr());
890cdf0e10cSrcweir 
891cdf0e10cSrcweir //             for (std::vector< OString >::const_iterator i = (*iter2).second.begin();
892cdf0e10cSrcweir //                  i != (*iter2).second.end(); ++i) {
893cdf0e10cSrcweir //                 fprintf(stdout, "cmd=%s\n", (*i).getStr());
894cdf0e10cSrcweir //             }
895cdf0e10cSrcweir //             iter2++;
896cdf0e10cSrcweir //         }
897cdf0e10cSrcweir //         return;
898cdf0e10cSrcweir     }
899cdf0e10cSrcweir 
900cdf0e10cSrcweir     if (options.componenttype == 2) {
901cdf0e10cSrcweir         if (services.size() != 1) {
902cdf0e10cSrcweir             throw CannotDumpException(
903cdf0e10cSrcweir                 "for calc add-in components one and only one service type is "
904cdf0e10cSrcweir                 "necessary! Please reference a valid type with the '-t' option.");
905cdf0e10cSrcweir         }
906cdf0e10cSrcweir 
907cdf0e10cSrcweir         // if backwardcompatible==true the AddIn service needs to be added to the
908cdf0e10cSrcweir         // suported service list, the necessary intefaces are mapped to the add-in
909cdf0e10cSrcweir         // configuration. Since OO.org 2.0.4 this is obsolete and the add-in is
910cdf0e10cSrcweir         // take form the configuration from Calc directly, this simplifies the
911cdf0e10cSrcweir         // add-in code
912cdf0e10cSrcweir         if (options.backwardcompatible) {
913cdf0e10cSrcweir             checkType(manager, "com.sun.star.sheet.AddIn",
914cdf0e10cSrcweir                       interfaces, services, properties);
915cdf0e10cSrcweir         } else {
916cdf0e10cSrcweir             // special case for the optional XLocalization interface. It should be
917cdf0e10cSrcweir             // implemented always. But it is parent of the XAddIn and we need it only
918cdf0e10cSrcweir             // if backwardcompatible is false.
919cdf0e10cSrcweir             if (interfaces.find("com.sun.star.lang.XLocalizable") == interfaces.end()) {
920cdf0e10cSrcweir                 interfaces.insert("com.sun.star.lang.XLocalizable");
921cdf0e10cSrcweir             }
922cdf0e10cSrcweir         }
923cdf0e10cSrcweir     }
924cdf0e10cSrcweir 
925cdf0e10cSrcweir 
926cdf0e10cSrcweir     // check if service object or simple UNO object
927cdf0e10cSrcweir     if (!services.empty())
928cdf0e10cSrcweir         serviceobject = true;
929cdf0e10cSrcweir 
930cdf0e10cSrcweir     OString propertyhelper = checkPropertyHelper(
931cdf0e10cSrcweir         options, manager, services, interfaces, attributes, propinterfaces);
932cdf0e10cSrcweir     checkDefaultInterfaces(interfaces, services, propertyhelper);
933cdf0e10cSrcweir 
934cdf0e10cSrcweir     if (options.componenttype == 2) {
935cdf0e10cSrcweir         if (propertyhelper.getLength() > 0)
936cdf0e10cSrcweir             std::cerr << "WARNING: interfaces specifying calc add-in functions "
937cdf0e10cSrcweir                 "shouldn't support attributes!\n";
938cdf0e10cSrcweir     }
939cdf0e10cSrcweir 
940cdf0e10cSrcweir     supportxcomponent = checkXComponentSupport(manager, interfaces);
941cdf0e10cSrcweir 
942cdf0e10cSrcweir     OString compFileName;
943cdf0e10cSrcweir     OString tmpFileName;
944cdf0e10cSrcweir     std::ostream* pofs = NULL;
945cdf0e10cSrcweir     bool standardout = getOutputStream(options, ".java",
946cdf0e10cSrcweir                                        &pofs, compFileName, tmpFileName);
947cdf0e10cSrcweir 
948cdf0e10cSrcweir     try {
949cdf0e10cSrcweir         if (!standardout && options.license) {
950cdf0e10cSrcweir             printLicenseHeader(*pofs, compFileName);
951cdf0e10cSrcweir         }
952cdf0e10cSrcweir 
953cdf0e10cSrcweir         generatePackage(*pofs, options.implname);
954cdf0e10cSrcweir 
955cdf0e10cSrcweir         generateImports(*pofs, options, interfaces, propertyhelper,
956cdf0e10cSrcweir                         serviceobject, supportxcomponent);
957cdf0e10cSrcweir 
958cdf0e10cSrcweir         OString classname(options.implname);
959cdf0e10cSrcweir         sal_Int32 index = 0;
960cdf0e10cSrcweir         if ((index = classname.lastIndexOf('.')) > 0)
961cdf0e10cSrcweir             classname = classname.copy(index+1);
962cdf0e10cSrcweir 
963cdf0e10cSrcweir         generateClassDefinition(*pofs, options, manager, classname, services,
964cdf0e10cSrcweir                                 interfaces, properties, attributes, propertyhelper,
965cdf0e10cSrcweir                                 supportxcomponent);
966cdf0e10cSrcweir 
967cdf0e10cSrcweir         if ( !standardout && pofs && ((std::ofstream*)pofs)->is_open()) {
968cdf0e10cSrcweir             ((std::ofstream*)pofs)->close();
969cdf0e10cSrcweir             delete pofs;
970cdf0e10cSrcweir             OSL_VERIFY(makeValidTypeFile(compFileName, tmpFileName, sal_False));
971cdf0e10cSrcweir         }
972cdf0e10cSrcweir     } catch(CannotDumpException& e) {
973cdf0e10cSrcweir 
974cdf0e10cSrcweir         std::cerr << "ERROR: " << e.m_message.getStr() << "\n";
975cdf0e10cSrcweir         if ( !standardout ) {
976cdf0e10cSrcweir             if (pofs && ((std::ofstream*)pofs)->is_open()) {
977cdf0e10cSrcweir                 ((std::ofstream*)pofs)->close();
978cdf0e10cSrcweir                 delete pofs;
979cdf0e10cSrcweir             }
980cdf0e10cSrcweir             // remove existing type file if something goes wrong to ensure
981cdf0e10cSrcweir             // consistency
982cdf0e10cSrcweir             if (fileExists(compFileName))
983cdf0e10cSrcweir                 removeTypeFile(compFileName);
984cdf0e10cSrcweir 
985cdf0e10cSrcweir             // remove tmp file if something goes wrong
986cdf0e10cSrcweir             removeTypeFile(tmpFileName);
987cdf0e10cSrcweir         }
988cdf0e10cSrcweir     }
989cdf0e10cSrcweir }
990cdf0e10cSrcweir 
991cdf0e10cSrcweir } }
992cdf0e10cSrcweir 
993cdf0e10cSrcweir 
994