1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski class ExampleAddInResult implements com.sun.star.sheet.XVolatileResult
25*b1cdbd2cSJim Jagielski {
26*b1cdbd2cSJim Jagielski     private String aName;
27*b1cdbd2cSJim Jagielski     private int nValue;
28*b1cdbd2cSJim Jagielski     private java.util.Vector aListeners = new java.util.Vector();
29*b1cdbd2cSJim Jagielski 
ExampleAddInResult( String aNewName )30*b1cdbd2cSJim Jagielski     public ExampleAddInResult( String aNewName )
31*b1cdbd2cSJim Jagielski     {
32*b1cdbd2cSJim Jagielski         aName = aNewName;
33*b1cdbd2cSJim Jagielski     }
34*b1cdbd2cSJim Jagielski 
getResult()35*b1cdbd2cSJim Jagielski     private com.sun.star.sheet.ResultEvent getResult()
36*b1cdbd2cSJim Jagielski     {
37*b1cdbd2cSJim Jagielski         com.sun.star.sheet.ResultEvent aEvent =
38*b1cdbd2cSJim Jagielski             new com.sun.star.sheet.ResultEvent();
39*b1cdbd2cSJim Jagielski         aEvent.Value = aName + " " + String.valueOf( nValue );
40*b1cdbd2cSJim Jagielski         aEvent.Source = this;
41*b1cdbd2cSJim Jagielski         return aEvent;
42*b1cdbd2cSJim Jagielski     }
43*b1cdbd2cSJim Jagielski 
addResultListener(com.sun.star.sheet.XResultListener aListener)44*b1cdbd2cSJim Jagielski     public void addResultListener(com.sun.star.sheet.XResultListener aListener)
45*b1cdbd2cSJim Jagielski     {
46*b1cdbd2cSJim Jagielski         aListeners.addElement( aListener );
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski         // immediately notify of initial value
49*b1cdbd2cSJim Jagielski         aListener.modified( getResult() );
50*b1cdbd2cSJim Jagielski     }
51*b1cdbd2cSJim Jagielski 
removeResultListener(com.sun.star.sheet.XResultListener aListener)52*b1cdbd2cSJim Jagielski     public void removeResultListener(com.sun.star.sheet.XResultListener aListener)
53*b1cdbd2cSJim Jagielski     {
54*b1cdbd2cSJim Jagielski         aListeners.removeElement( aListener );
55*b1cdbd2cSJim Jagielski     }
56*b1cdbd2cSJim Jagielski 
incrementValue()57*b1cdbd2cSJim Jagielski     public void incrementValue()
58*b1cdbd2cSJim Jagielski     {
59*b1cdbd2cSJim Jagielski         ++nValue;
60*b1cdbd2cSJim Jagielski         com.sun.star.sheet.ResultEvent aEvent = getResult();
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski         java.util.Enumeration aEnum = aListeners.elements();
63*b1cdbd2cSJim Jagielski         while (aEnum.hasMoreElements())
64*b1cdbd2cSJim Jagielski             ((com.sun.star.sheet.XResultListener)aEnum.nextElement()).modified(
65*b1cdbd2cSJim Jagielski                 aEvent);
66*b1cdbd2cSJim Jagielski     }
67*b1cdbd2cSJim Jagielski }
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski class ExampleAddInThread extends Thread
70*b1cdbd2cSJim Jagielski {
71*b1cdbd2cSJim Jagielski     private java.util.Hashtable aCounters;
72*b1cdbd2cSJim Jagielski 
ExampleAddInThread( java.util.Hashtable aResults )73*b1cdbd2cSJim Jagielski     public ExampleAddInThread( java.util.Hashtable aResults )
74*b1cdbd2cSJim Jagielski     {
75*b1cdbd2cSJim Jagielski         aCounters = aResults;
76*b1cdbd2cSJim Jagielski     }
77*b1cdbd2cSJim Jagielski 
run()78*b1cdbd2cSJim Jagielski     public void run()
79*b1cdbd2cSJim Jagielski     {
80*b1cdbd2cSJim Jagielski         while ( true )
81*b1cdbd2cSJim Jagielski         {
82*b1cdbd2cSJim Jagielski             try
83*b1cdbd2cSJim Jagielski             {
84*b1cdbd2cSJim Jagielski                 sleep(1000);
85*b1cdbd2cSJim Jagielski             }
86*b1cdbd2cSJim Jagielski             catch( InterruptedException exception )
87*b1cdbd2cSJim Jagielski             {
88*b1cdbd2cSJim Jagielski             }
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski             // increment all counters
91*b1cdbd2cSJim Jagielski             java.util.Enumeration aEnum = aCounters.elements();
92*b1cdbd2cSJim Jagielski             while (aEnum.hasMoreElements())
93*b1cdbd2cSJim Jagielski                 ((ExampleAddInResult)aEnum.nextElement()).incrementValue();
94*b1cdbd2cSJim Jagielski         }
95*b1cdbd2cSJim Jagielski     }
96*b1cdbd2cSJim Jagielski }
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski public class ExampleAddIn
99*b1cdbd2cSJim Jagielski {
100*b1cdbd2cSJim Jagielski     static public class _ExampleAddIn extends com.sun.star.lib.uno.helper.WeakBase
101*b1cdbd2cSJim Jagielski            implements org.openoffice.sheet.addin.XExampleAddIn,
102*b1cdbd2cSJim Jagielski                       com.sun.star.sheet.XAddIn,
103*b1cdbd2cSJim Jagielski                       com.sun.star.lang.XServiceName,
104*b1cdbd2cSJim Jagielski                       com.sun.star.lang.XServiceInfo
105*b1cdbd2cSJim Jagielski     {
106*b1cdbd2cSJim Jagielski         static private final String aExampleService = "org.openoffice.sheet.addin.ExampleAddIn";
107*b1cdbd2cSJim Jagielski         static private final String aAddInService = "com.sun.star.sheet.AddIn";
108*b1cdbd2cSJim Jagielski         static private final String aImplName = _ExampleAddIn.class.getName();
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski         private static final short FUNCTION_INVALID   = -1;
111*b1cdbd2cSJim Jagielski         private static final short FUNCTION_INCREMENT = 0;
112*b1cdbd2cSJim Jagielski         private static final short FUNCTION_COUNTER   = 1;
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski         private static final String[] aFunctionNames =
115*b1cdbd2cSJim Jagielski         {
116*b1cdbd2cSJim Jagielski             "getIncremented",
117*b1cdbd2cSJim Jagielski             "getCounter"
118*b1cdbd2cSJim Jagielski         };
119*b1cdbd2cSJim Jagielski         private static final String[] aDisplayFunctionNames =
120*b1cdbd2cSJim Jagielski         {
121*b1cdbd2cSJim Jagielski             "Increment",
122*b1cdbd2cSJim Jagielski             "Counter"
123*b1cdbd2cSJim Jagielski         };
124*b1cdbd2cSJim Jagielski         private static final String[] aDescriptions =
125*b1cdbd2cSJim Jagielski         {
126*b1cdbd2cSJim Jagielski             "Increments a value",
127*b1cdbd2cSJim Jagielski             "Returns a counter"
128*b1cdbd2cSJim Jagielski         };
129*b1cdbd2cSJim Jagielski         private static final String[] aFirstArgumentNames =
130*b1cdbd2cSJim Jagielski         {
131*b1cdbd2cSJim Jagielski             "Value",
132*b1cdbd2cSJim Jagielski             "Name"
133*b1cdbd2cSJim Jagielski         };
134*b1cdbd2cSJim Jagielski         private static final String[] aFirstArgumentDescriptions =
135*b1cdbd2cSJim Jagielski         {
136*b1cdbd2cSJim Jagielski             "The value that is incremented",
137*b1cdbd2cSJim Jagielski             "The name of the counter"
138*b1cdbd2cSJim Jagielski         };
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski         private com.sun.star.lang.Locale aFuncLocale;
141*b1cdbd2cSJim Jagielski         private java.util.Hashtable aResults;
142*b1cdbd2cSJim Jagielski 
_ExampleAddIn( com.sun.star.lang.XMultiServiceFactory xFactory )143*b1cdbd2cSJim Jagielski         public _ExampleAddIn( com.sun.star.lang.XMultiServiceFactory xFactory )
144*b1cdbd2cSJim Jagielski         {
145*b1cdbd2cSJim Jagielski         }
146*b1cdbd2cSJim Jagielski 
getFunctionID( String aProgrammaticFunctionName )147*b1cdbd2cSJim Jagielski         private int getFunctionID( String aProgrammaticFunctionName )
148*b1cdbd2cSJim Jagielski         {
149*b1cdbd2cSJim Jagielski             for ( int i = 0; i < aFunctionNames.length; i++ )
150*b1cdbd2cSJim Jagielski                 if ( aProgrammaticFunctionName.equals(aFunctionNames[i]) )
151*b1cdbd2cSJim Jagielski                     return i;
152*b1cdbd2cSJim Jagielski             return FUNCTION_INVALID;
153*b1cdbd2cSJim Jagielski         }
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski         //  XExampleAddIn
156*b1cdbd2cSJim Jagielski 
getIncremented( int nValue )157*b1cdbd2cSJim Jagielski         public int getIncremented( int nValue )
158*b1cdbd2cSJim Jagielski         {
159*b1cdbd2cSJim Jagielski             return nValue + 1;
160*b1cdbd2cSJim Jagielski         }
161*b1cdbd2cSJim Jagielski 
getCounter(String aName)162*b1cdbd2cSJim Jagielski         public com.sun.star.sheet.XVolatileResult getCounter(String aName)
163*b1cdbd2cSJim Jagielski         {
164*b1cdbd2cSJim Jagielski             if ( aResults == null )
165*b1cdbd2cSJim Jagielski             {
166*b1cdbd2cSJim Jagielski                 // create the table of results, and start a thread to increment
167*b1cdbd2cSJim Jagielski                 // all counters
168*b1cdbd2cSJim Jagielski                 aResults = new java.util.Hashtable();
169*b1cdbd2cSJim Jagielski                 ExampleAddInThread aThread = new ExampleAddInThread( aResults );
170*b1cdbd2cSJim Jagielski                 aThread.start();
171*b1cdbd2cSJim Jagielski             }
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski             ExampleAddInResult aResult = (ExampleAddInResult) aResults.get(aName);
174*b1cdbd2cSJim Jagielski             if ( aResult == null )
175*b1cdbd2cSJim Jagielski             {
176*b1cdbd2cSJim Jagielski                 aResult = new ExampleAddInResult(aName);
177*b1cdbd2cSJim Jagielski                 aResults.put( aName, aResult );
178*b1cdbd2cSJim Jagielski             }
179*b1cdbd2cSJim Jagielski             return aResult;
180*b1cdbd2cSJim Jagielski         }
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski         //  XAddIn
183*b1cdbd2cSJim Jagielski 
getProgrammaticFuntionName(String aDisplayName)184*b1cdbd2cSJim Jagielski         public String getProgrammaticFuntionName(String aDisplayName)
185*b1cdbd2cSJim Jagielski         {
186*b1cdbd2cSJim Jagielski             for ( int i = 0; i < aFunctionNames.length; i++ )
187*b1cdbd2cSJim Jagielski                 if ( aDisplayName.equals(aDisplayFunctionNames[i]) )
188*b1cdbd2cSJim Jagielski                     return aFunctionNames[i];
189*b1cdbd2cSJim Jagielski             return "";
190*b1cdbd2cSJim Jagielski         }
191*b1cdbd2cSJim Jagielski 
getDisplayFunctionName(String aProgrammaticName)192*b1cdbd2cSJim Jagielski         public String getDisplayFunctionName(String aProgrammaticName)
193*b1cdbd2cSJim Jagielski         {
194*b1cdbd2cSJim Jagielski             int nFunction = getFunctionID( aProgrammaticName );
195*b1cdbd2cSJim Jagielski             return ( nFunction == FUNCTION_INVALID ) ? "" :
196*b1cdbd2cSJim Jagielski                 aDisplayFunctionNames[nFunction];
197*b1cdbd2cSJim Jagielski         }
198*b1cdbd2cSJim Jagielski 
getFunctionDescription(String aProgrammaticName)199*b1cdbd2cSJim Jagielski         public String getFunctionDescription(String aProgrammaticName)
200*b1cdbd2cSJim Jagielski         {
201*b1cdbd2cSJim Jagielski             int nFunction = getFunctionID( aProgrammaticName );
202*b1cdbd2cSJim Jagielski             return ( nFunction == FUNCTION_INVALID ) ? "" :
203*b1cdbd2cSJim Jagielski                 aDescriptions[nFunction];
204*b1cdbd2cSJim Jagielski         }
205*b1cdbd2cSJim Jagielski 
getDisplayArgumentName(String aProgrammaticFunctionName, int nArgument)206*b1cdbd2cSJim Jagielski         public String getDisplayArgumentName(String aProgrammaticFunctionName,
207*b1cdbd2cSJim Jagielski                                              int nArgument)
208*b1cdbd2cSJim Jagielski         {
209*b1cdbd2cSJim Jagielski             //  both functions in this example only have a first argument
210*b1cdbd2cSJim Jagielski             int nFunction = getFunctionID( aProgrammaticFunctionName );
211*b1cdbd2cSJim Jagielski             return ( nFunction == FUNCTION_INVALID || nArgument != 0) ? "" :
212*b1cdbd2cSJim Jagielski                 aFirstArgumentNames[nFunction];
213*b1cdbd2cSJim Jagielski         }
214*b1cdbd2cSJim Jagielski 
getArgumentDescription(String aProgrammaticFunctionName, int nArgument )215*b1cdbd2cSJim Jagielski         public String getArgumentDescription(String aProgrammaticFunctionName,
216*b1cdbd2cSJim Jagielski                                              int nArgument )
217*b1cdbd2cSJim Jagielski         {
218*b1cdbd2cSJim Jagielski             //  both functions in this example only have a first argument
219*b1cdbd2cSJim Jagielski             int nFunction = getFunctionID( aProgrammaticFunctionName );
220*b1cdbd2cSJim Jagielski             return ( nFunction == FUNCTION_INVALID || nArgument != 0) ? "" :
221*b1cdbd2cSJim Jagielski                 aFirstArgumentDescriptions[nFunction];
222*b1cdbd2cSJim Jagielski         }
223*b1cdbd2cSJim Jagielski 
getProgrammaticCategoryName(String aProgrammaticFunctionName)224*b1cdbd2cSJim Jagielski         public String getProgrammaticCategoryName(String aProgrammaticFunctionName)
225*b1cdbd2cSJim Jagielski         {
226*b1cdbd2cSJim Jagielski             return( "Add-In" );
227*b1cdbd2cSJim Jagielski         }
228*b1cdbd2cSJim Jagielski 
getDisplayCategoryName(String aProgrammaticFunctionName)229*b1cdbd2cSJim Jagielski         public String getDisplayCategoryName(String aProgrammaticFunctionName)
230*b1cdbd2cSJim Jagielski         {
231*b1cdbd2cSJim Jagielski             return( "Add-In" );
232*b1cdbd2cSJim Jagielski         }
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski         //  XLocalizable
235*b1cdbd2cSJim Jagielski 
setLocale( com.sun.star.lang.Locale aLocale )236*b1cdbd2cSJim Jagielski         public void setLocale( com.sun.star.lang.Locale aLocale )
237*b1cdbd2cSJim Jagielski         {
238*b1cdbd2cSJim Jagielski             // the locale is stored and used for getLocale, but otherwise
239*b1cdbd2cSJim Jagielski             // ignored in this example
240*b1cdbd2cSJim Jagielski             aFuncLocale = aLocale;
241*b1cdbd2cSJim Jagielski         }
242*b1cdbd2cSJim Jagielski 
getLocale()243*b1cdbd2cSJim Jagielski         public com.sun.star.lang.Locale getLocale()
244*b1cdbd2cSJim Jagielski         {
245*b1cdbd2cSJim Jagielski             return aFuncLocale;
246*b1cdbd2cSJim Jagielski         }
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski         //  XServiceName
249*b1cdbd2cSJim Jagielski 
getServiceName()250*b1cdbd2cSJim Jagielski         public String getServiceName()
251*b1cdbd2cSJim Jagielski         {
252*b1cdbd2cSJim Jagielski             return aExampleService;
253*b1cdbd2cSJim Jagielski         }
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski         //  XServiceInfo
256*b1cdbd2cSJim Jagielski 
getImplementationName()257*b1cdbd2cSJim Jagielski         public String getImplementationName()
258*b1cdbd2cSJim Jagielski         {
259*b1cdbd2cSJim Jagielski             return aImplName;
260*b1cdbd2cSJim Jagielski         }
261*b1cdbd2cSJim Jagielski 
getSupportedServiceNames()262*b1cdbd2cSJim Jagielski         public String[] getSupportedServiceNames()
263*b1cdbd2cSJim Jagielski         {
264*b1cdbd2cSJim Jagielski             String [] aSupportedServices = new String[ 2 ];
265*b1cdbd2cSJim Jagielski             aSupportedServices[ 0 ] = aExampleService;
266*b1cdbd2cSJim Jagielski             aSupportedServices[ 1 ] = aAddInService;
267*b1cdbd2cSJim Jagielski             return aSupportedServices;
268*b1cdbd2cSJim Jagielski         }
269*b1cdbd2cSJim Jagielski 
supportsService( String aService )270*b1cdbd2cSJim Jagielski         public boolean supportsService( String aService )
271*b1cdbd2cSJim Jagielski         {
272*b1cdbd2cSJim Jagielski             return (aService.equals( aExampleService ) ||
273*b1cdbd2cSJim Jagielski                     aService.equals( aAddInService ) );
274*b1cdbd2cSJim Jagielski         }
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski     }
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski 
__getServiceFactory( String implName, com.sun.star.lang.XMultiServiceFactory multiFactory, com.sun.star.registry.XRegistryKey regKey)279*b1cdbd2cSJim Jagielski     public static com.sun.star.lang.XSingleServiceFactory __getServiceFactory(
280*b1cdbd2cSJim Jagielski         String implName,
281*b1cdbd2cSJim Jagielski         com.sun.star.lang.XMultiServiceFactory multiFactory,
282*b1cdbd2cSJim Jagielski         com.sun.star.registry.XRegistryKey regKey)
283*b1cdbd2cSJim Jagielski     {
284*b1cdbd2cSJim Jagielski         com.sun.star.lang.XSingleServiceFactory xSingleServiceFactory = null;
285*b1cdbd2cSJim Jagielski         if ( implName.equals(_ExampleAddIn.aImplName) )
286*b1cdbd2cSJim Jagielski             xSingleServiceFactory =
287*b1cdbd2cSJim Jagielski                 com.sun.star.comp.loader.FactoryHelper.getServiceFactory(
288*b1cdbd2cSJim Jagielski                     _ExampleAddIn.class, _ExampleAddIn.aExampleService,
289*b1cdbd2cSJim Jagielski                     multiFactory, regKey);
290*b1cdbd2cSJim Jagielski         return xSingleServiceFactory;
291*b1cdbd2cSJim Jagielski     }
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski     // This method not longer necessary since OOo 3.4 where the component registration
294*b1cdbd2cSJim Jagielski     // was changed to passive component registration. For more details see
295*b1cdbd2cSJim Jagielski     // http://wiki.services.openoffice.org/wiki/Passive_Component_Registration
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski //     public static boolean __writeRegistryServiceInfo(
298*b1cdbd2cSJim Jagielski //         com.sun.star.registry.XRegistryKey regKey)
299*b1cdbd2cSJim Jagielski //     {
300*b1cdbd2cSJim Jagielski //         //  register for both the base AddIn and the own service
301*b1cdbd2cSJim Jagielski //         return com.sun.star.comp.loader.FactoryHelper.writeRegistryServiceInfo(
302*b1cdbd2cSJim Jagielski //                     _ExampleAddIn.aImplName, _ExampleAddIn.aExampleService, regKey)
303*b1cdbd2cSJim Jagielski //             && com.sun.star.comp.loader.FactoryHelper.writeRegistryServiceInfo(
304*b1cdbd2cSJim Jagielski //                     _ExampleAddIn.aImplName, _ExampleAddIn.aAddInService, regKey);
305*b1cdbd2cSJim Jagielski //     }
306*b1cdbd2cSJim Jagielski }
307*b1cdbd2cSJim Jagielski 
308