/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



/*
This example shows a UNO component that inherits com.sun.star.lib.uno.helper.PropertySet in 
order to provide implementations of  these interfaces:

      com.sun.star.beans.XPropertySet
      com.sun.star.beans.XMultiPropertySet
      com.sun.star.beans.XFastPropertySet
      com.sun.star.lang.XComponent
      com.sun.star.uno.XWeak
      com.sun.star.lang.XTypeProvider
*/
import com.sun.star.lib.uno.helper.PropertySet;
import com.sun.star.comp.loader.FactoryHelper;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XSingleServiceFactory;
import com.sun.star.registry.XRegistryKey;
import com.sun.star.uno.Any;
import com.sun.star.uno.Type;
import com.sun.star.uno.XInterface;
import com.sun.star.lang.XTypeProvider;
import com.sun.star.beans.PropertyAttribute;

/**
   This component contains the followin properties:
 *  <table border>
 *  <tr>
 *  <th> Property Name </th>
 *  <th> Type Name </th>
 *  <th> PropertyAttribute </th>
 *  <tr><td>boolA</td><td>BOOLEAN</td><td> - </td</tr>
 *  <tr><td>charA</td><td>CHAR</td><td> - </td></tr>
 *  <tr><td>byteA</td><td>BYTE</td><td> - </td></tr>
 *  <tr><td>shortA</td><td>SHORT</td><td> - </td></tr>
 *  <tr><td>intA</td><td>LONG</td><td> - </td></tr>
 *  <tr><td>longA</td><td>HYPER</td><td> - </td></tr>
 *  <tr><td>floatA</td><td>FLOAT</td><td> - </td></tr>
 *  <tr><td>doubleA</td><td>DOUBLE</td><td> - </td></tr>
 *  <tr><td>stringA</td><td>STRING</td><td> - </td></tr>
 *  <tr><td>objectA</td><td>ANY</td><td> - </td></tr>
 *  <tr><td>anyA</td><td>ANY</td><td> - </td></tr>
 *  <tr><td>typeA</td><td>TYPE</td><td> - </td></tr>
 *  <tr><td>xinterfaceA</td><td>INTERFACE</td><td> - </td></tr>
 *  <tr><td>xtypeproviderA</td><td>INTERFACE</td><td> - </td></tr>
 *  <tr><td>arBoolA</td><td>[]boolean</td><td> - </td></tr>
 *  <tr><td>arCharA</td><td>[]char</td><td> - </td></tr>
 *  <tr><td>arByteA</td><td>[]byte</td><td> - </td></tr>
 *  <tr><td>arShortA</td><td>[]short</td><td> - </td></tr>
 *  <tr><td>arIntA</td><td>[]long</td><td> - </td></tr>
 *  <tr><td>arLongA</td><td>[]hyper</td><td> - </td></tr>
 *  <tr><td>arFloatA</td><td>[]float</td><td> - </td></tr>
 *  <tr><td>arDoubleA</td><td>[]double</td><td> - </td></tr>
 *  <tr><td>arStringA</td><td>[]string</td><td> - </td></tr>
 *  <tr><td>arObjectA</td><td>[]any</td><td> - </td></tr>
 *  <tr><td>arXinterfaceA</td><td>[]com.sun.star.uno.XInterface</td><td> - </td></tr>
 *  <tr><td>ar2BoolA</td><td>[][]boolean</td><td> - </td></tr>
 *  <tr><td>boolClassA</td><td>boolean</td><td> - </td></tr>
 *  <tr><td>charClassA</td><td>char</td><td> - </td></tr>
 *  <tr><td>byteClassA</td><td>byte</td><td> - </td></tr>
 *  <tr><td>shortClassA</td><td>short</td><td> - </td></tr>
 *  <tr><td>intClassA</td><td>long</td><td> - </td></tr>
 *  <tr><td>longClassA</td><td>hyper</td><td> - </td></tr>
 *  <tr><td>floatClassA</td><td>float</td><td> - </td></tr>
 *  <tr><td>doubleClassA</td><td>double</td><td> - </td></tr>
 *  <tr><td>roIntA</td><td>long</td><td>READONLY</td></tr>
 *  <tr><td>roIntClassA</td><td>long</td><td>READONLY</td></tr>
 *  <tr><td>roObjectA</td><td>any</td><td>READONLY</td></tr>
 *  <tr><td>roAnyA</td><td>any</td><td>READONLY</td></tr>
 *  <tr><td>bcBoolA</td><td>boolean</td><td>BOUND,CONSTRAINED</td></tr>
 *  <tr><td>bcBoolClassA</td><td>boolean</td><td>BOUND,CONSTRAINED</td></tr>
 *  <tr><td>bcObjectA</td><td>any</td><td>BOUND,CONSTRAINED</td></tr>
 *  <tr><td>bcAnyA</td><td>any</td><td>BOUND,CONSTRAINED</td></tr>
 *  <tr><td>mvIntA</td><td>long</td><td>MAYBEVOID</td></tr>
 *  <tr><td>mvObjectA</td><td>any</td><td>MAYBEVOID</td></tr>
 *  <tr><td>mvAnyA</td><td>any</td><td>MAYBEVOID</td></tr>
 *  <tr><td>mvXinterfaceA</td><td>any</td><td>MAYBEVOID</td></tr>
 </table>
*/

public class PropTest extends PropertySet implements XServiceInfo
{

    public boolean boolA;
    public char charA;
    public byte byteA;
    public short shortA;
    public int intA;
    public long longA;
    public float floatA;
    public double doubleA;
    public String stringA; // MAYBEVOID
    public Object objectA; // MAYBEVOID
    public Any anyA; // MAYBEVOID
    public Type typeA;// MAYBEVOID
    public XInterface xinterfaceA;// MAYBEVOID
    public XTypeProvider xtypeproviderA;// MAYBEVOID
    public boolean[] arBoolA; // MAYBEVOID
    public char[] arCharA; // MAYBEVOID
    public byte[] arByteA; // MAYBEVOID
    public short[] arShortA; // MAYBEVOID
    public int[] arIntA; // MAYBEVOID
    public long[] arLongA; // MAYBEVOID
    public float[] arFloatA; // MAYBEVOID
    public double[] arDoubleA; // MAYBEVOID
    public String[] arStringA; // MAYBEVOID
    public Object[] arObjectA; // MAYBEVOID
    public Any[] arAnyA; // MAYBEVOID
    public XInterface[] arXinterfaceA; // MAYBEVOID
    public boolean[][] ar2BoolA; // MAYBEVOID 
    public Boolean boolClassA; // MAYBEVOID
    public Character charClassA; // MAYBEVOID
    public Byte byteClassA; // MAYBEVOID 
    public Short shortClassA; // MAYBEVOID 
    public Integer intClassA; // MAYBEVOID
    public Long longClassA; // MAYBEVOID
    public Float floatClassA; // MAYBEVOID
    public Double doubleClassA; // MAYBEVOID

    // readonly
    public int roIntA= 100;
    public Integer roIntClassA= new Integer(100); 
    public Object roObjectA= new Integer(101);
    public Any roAnyA= new Any( new Type(int.class), new Integer(102));

    // BOUND & CONSTRAINED
    public boolean bcBoolA;
    public Boolean bcBoolClassA; // MAYBEVOID
    public Object bcObjectA; // MAYBEVOID
    public Any bcAnyA;       // MAYBEVOID

    // MAYBEVOID
    public Integer mvIntA;
    public Object mvObjectA;
    public Any mvAnyA;
    public XInterface mvXinterfaceA;
    
    public static final String __serviceName="PropTest";

    public PropTest() {
        registerProperty("boolA", (short) 0);
        registerProperty("charA", (short) 0);
        registerProperty("byteA", (short) 0);
        registerProperty("shortA", (short) 0);
        registerProperty("intA", (short) 0);
        registerProperty("longA", (short) 0);
        registerProperty("floatA", (short) 0);
        registerProperty("doubleA", (short) 0);
        registerProperty("stringA", PropertyAttribute.MAYBEVOID);
        registerProperty("objectA", PropertyAttribute.MAYBEVOID);
        registerProperty("anyA", PropertyAttribute.MAYBEVOID);
        registerProperty("typeA", PropertyAttribute.MAYBEVOID);
        registerProperty("xinterfaceA", PropertyAttribute.MAYBEVOID);
        registerProperty("xtypeproviderA", PropertyAttribute.MAYBEVOID);
        registerProperty("arBoolA", PropertyAttribute.MAYBEVOID);
        registerProperty("arCharA", PropertyAttribute.MAYBEVOID);
        registerProperty("arByteA", PropertyAttribute.MAYBEVOID);
        registerProperty("arShortA", PropertyAttribute.MAYBEVOID);
        registerProperty("arIntA", PropertyAttribute.MAYBEVOID);
        registerProperty("arLongA", PropertyAttribute.MAYBEVOID);
        registerProperty("arFloatA", PropertyAttribute.MAYBEVOID);
        registerProperty("arDoubleA", PropertyAttribute.MAYBEVOID);
        registerProperty("arStringA", PropertyAttribute.MAYBEVOID);
        registerProperty("arObjectA", PropertyAttribute.MAYBEVOID);
        registerProperty("arAnyA", PropertyAttribute.MAYBEVOID);
        registerProperty("arXinterfaceA", PropertyAttribute.MAYBEVOID);
        registerProperty("ar2BoolA", PropertyAttribute.MAYBEVOID);
        registerProperty("boolClassA", PropertyAttribute.MAYBEVOID);
        registerProperty("charClassA", PropertyAttribute.MAYBEVOID);
        registerProperty("byteClassA", PropertyAttribute.MAYBEVOID);
        registerProperty("shortClassA", PropertyAttribute.MAYBEVOID);
        registerProperty("intClassA", PropertyAttribute.MAYBEVOID);
        registerProperty("longClassA", PropertyAttribute.MAYBEVOID);
        registerProperty("floatClassA", PropertyAttribute.MAYBEVOID);
        registerProperty("doubleClassA", PropertyAttribute.MAYBEVOID);
        registerProperty("roIntA", PropertyAttribute.READONLY);
        registerProperty("roIntClassA", PropertyAttribute.READONLY);
        registerProperty("roObjectA", PropertyAttribute.READONLY);
        registerProperty("roAnyA", PropertyAttribute.READONLY);
        registerProperty("bcBoolA",(short) ( PropertyAttribute.BOUND | PropertyAttribute.CONSTRAINED));
        registerProperty("bcBoolClassA", (short) (PropertyAttribute.BOUND | PropertyAttribute.CONSTRAINED | PropertyAttribute.MAYBEVOID));
        registerProperty("bcObjectA", (short) (PropertyAttribute.BOUND | PropertyAttribute.CONSTRAINED | PropertyAttribute.MAYBEVOID));
        registerProperty("bcAnyA", (short) (PropertyAttribute.BOUND | PropertyAttribute.CONSTRAINED |PropertyAttribute.MAYBEVOID));
        registerProperty("mvIntA", PropertyAttribute.MAYBEVOID);
        registerProperty("mvObjectA", PropertyAttribute.MAYBEVOID);
        registerProperty("mvAnyA", PropertyAttribute.MAYBEVOID);
        registerProperty("mvXinterfaceA", PropertyAttribute.MAYBEVOID);
    }
            

    // XServiceName
    public String getImplementationName(  )
    {
        return getClass().getName();
    }

    // XServiceName
    public boolean supportsService( /*IN*/String name )
    {
        if (name.equals(__serviceName))
            return true;
        return false;
    }
    
    //XServiceName
    public String[] getSupportedServiceNames(  )
    {
        String[] retValue= new String[]{__serviceName};
        return retValue;
    }

    public static XSingleServiceFactory __getServiceFactory(String implName,
    XMultiServiceFactory multiFactory,
    XRegistryKey regKey)
    {
        XSingleServiceFactory xSingleServiceFactory = null;

        if (implName.equals( PropTest.class.getName()) )
            xSingleServiceFactory = FactoryHelper.getServiceFactory( PropTest.class,
            PropTest.__serviceName,
            multiFactory,
            regKey);

        return xSingleServiceFactory;
    }

    // This method not longer necessary since OOo 3.4 where the component registration
    // was changed to passive component registration. For more details see
    // http://wiki.services.openoffice.org/wiki/Passive_Component_Registration

//     public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) 
//     {
//         return FactoryHelper.writeRegistryServiceInfo( PropTest.class.getName(),
//         PropTest.__serviceName, regKey);
//     }
}
