/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



package integration.extensions;

import com.sun.star.uno.*;
import com.sun.star.lang.*;
import com.sun.star.beans.*;
import com.sun.star.reflection.*;
import com.sun.star.inspection.*;

/**
 *
 * @author fs93730
 */
public class MethodHandler implements XPropertyHandler
{
    private XComponentContext       m_context;
    private XIntrospection          m_introspection;
    private XIntrospectionAccess    m_introspectionAccess;
    private XIdlClass               m_idlClass;
    private XIdlMethod[]            m_methods;
    private java.util.HashMap       m_methodsHash;

    /** Creates a new instance of MethodHandler */
    public MethodHandler( XComponentContext _context )
    {
        m_context = _context;
        m_methodsHash = new java.util.HashMap();

        try
        {
            m_introspection = (XIntrospection)UnoRuntime.queryInterface( XIntrospection.class,
                m_context.getServiceManager().createInstanceWithContext( "com.sun.star.beans.Introspection", m_context )
            );
        }
        catch( com.sun.star.uno.Exception e )
        {
            System.err.println( "MethodHandler: could not create a Introspection service, not much functionality will be available." );
        }
    }

    static public XSingleComponentFactory getFactory()
    {
        return new ComponentFactory( MethodHandler.class );
    }

    public void actuatingPropertyChanged(String _propertyName, Object _newValue, Object _oldValue, com.sun.star.inspection.XObjectInspectorUI _objectInspectorUI, boolean _firstTimeInit) throws com.sun.star.lang.NullPointerException
    {
        // not interested in
    }

    public void addEventListener(com.sun.star.lang.XEventListener _eventListener)
    {
        // ingnoring this
    }

    public void addPropertyChangeListener(com.sun.star.beans.XPropertyChangeListener _propertyChangeListener) throws com.sun.star.lang.NullPointerException
    {
        // ingnoring this
    }

    public Object convertToControlValue(String _propertyName, Object _propertyValue, com.sun.star.uno.Type type) throws com.sun.star.beans.UnknownPropertyException
    {
        return _propertyValue;
    }

    public Object convertToPropertyValue(String _propertyName, Object _controlValue) throws com.sun.star.beans.UnknownPropertyException
    {
        return _controlValue;
    }

    public com.sun.star.inspection.LineDescriptor describePropertyLine(String _propertyName, com.sun.star.inspection.XPropertyControlFactory _propertyControlFactory) throws com.sun.star.beans.UnknownPropertyException, com.sun.star.lang.NullPointerException
    {
        com.sun.star.inspection.LineDescriptor descriptor = new com.sun.star.inspection.LineDescriptor();

        descriptor = new LineDescriptor();
        descriptor.Category = "Methods";
        descriptor.DisplayName = "has method";
        descriptor.HasPrimaryButton = descriptor.HasSecondaryButton = false;
        descriptor.IndentLevel = 0;
        try
        {
            XPropertyControl control = (XPropertyControl)UnoRuntime.queryInterface(
                    XPropertyControl.class, _propertyControlFactory.createPropertyControl(
                    PropertyControlType.TextField, true ) );

            descriptor.Control = control;
        }
        catch( com.sun.star.lang.IllegalArgumentException e )
        {
        }
        return descriptor;
    }

    public void dispose()
    {
        // nothing to do
    }

    public String[] getActuatingProperties()
    {
        // none
        return new String[] { };
    }

    public com.sun.star.beans.PropertyState getPropertyState(String _propertyName) throws com.sun.star.beans.UnknownPropertyException
    {
        return com.sun.star.beans.PropertyState.DIRECT_VALUE;
    }

    public Object getPropertyValue(String _propertyName) throws com.sun.star.beans.UnknownPropertyException
    {
        XIdlMethod method = impl_getMethod( _propertyName );

        String signature = new String();
        signature += method.getReturnType().getName();
        signature += " ";
        signature += method.getName();

        signature += "(";

        XIdlClass[] parameterTypes = method.getParameterTypes();
        for ( int param = 0; param<parameterTypes.length; ++param )
        {
            signature += ( param == 0 ) ? " " : ", ";
            signature += parameterTypes[param].getName();
        }

        signature += " )";
        return signature;
    }

    public String[] getSupersededProperties()
    {
        return new String[] {  };
    }

    public com.sun.star.beans.Property[] getSupportedProperties()
    {
        Property[] properties = new Property[] { };
        if ( m_methods != null )
        {
            properties = new Property[ m_methods.length ];
            for ( int i=0; i<m_methods.length; ++i )
            {
                properties[i] = new Property( m_methods[i].getName(), 0, new Type( String.class ), (short)0 );
                m_methodsHash.put( m_methods[i].getName(), m_methods[i] );
            }
        }
        return properties;
    }

    public void inspect(Object _component) throws com.sun.star.lang.NullPointerException
    {
        if ( m_introspection == null )
            return;

        m_introspectionAccess = null;
        m_methods = null;
        m_methodsHash = new java.util.HashMap();

        m_introspectionAccess = m_introspection.inspect( _component );
        if ( m_introspectionAccess == null )
            return;

        m_methods = m_introspectionAccess.getMethods( MethodConcept.ALL );
    }

    public boolean isComposable(String _propertyName) throws com.sun.star.beans.UnknownPropertyException
    {
        return true;
    }

    public com.sun.star.inspection.InteractiveSelectionResult onInteractivePropertySelection(String str, boolean param, Object[] obj, com.sun.star.inspection.XObjectInspectorUI xObjectInspectorUI) throws com.sun.star.beans.UnknownPropertyException, com.sun.star.lang.NullPointerException
    {
        return InteractiveSelectionResult.Cancelled;
    }

    public void removeEventListener(com.sun.star.lang.XEventListener _eventListener)
    {
        // ignoring this
    }

    public void removePropertyChangeListener(com.sun.star.beans.XPropertyChangeListener _propertyChangeListener)
    {
        // ignoring this
    }

    public void setPropertyValue(String str, Object obj) throws com.sun.star.beans.UnknownPropertyException
    {
        // we declared our properties as readonly
        throw new java.lang.RuntimeException();
    }

    public boolean suspend(boolean param)
    {
        return true;
    }

    /** returns the descriptor for the method with the given name
     *  @param _propertyName
     *      the name of the method whose descriptor should be obtained
     *  @throws com.sun.star.beans.UnknownPropertyException
     *      if we don't have a method hash, or the given property name does not denote a method of our inspectee
     */
    private XIdlMethod impl_getMethod( String _methodName ) throws UnknownPropertyException
    {
        XIdlMethod method = (XIdlMethod)m_methodsHash.get( _methodName );
        if ( method == null )
            throw new com.sun.star.beans.UnknownPropertyException();

        return method;
    }
}
