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