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



import com.sun.star.beans.Property;
import com.sun.star.beans.PropertyValue;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.reflection.TypeDescriptionSearchDepth;
import com.sun.star.reflection.XConstantTypeDescription;
import com.sun.star.reflection.XPropertyTypeDescription;
import com.sun.star.reflection.XServiceTypeDescription;
import com.sun.star.reflection.XTypeDescription;
import com.sun.star.reflection.XTypeDescriptionEnumeration;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.TypeClass;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import javax.swing.tree.DefaultMutableTreeNode;

public class UnoPropertyNode extends UnoNode{
    
    Property aProperty;
    PropertyValue aPropertyValue;
    String m_sPropertyName;
    Object m_oUnoReturnObject;
    private int m_nPropertyType = XUnoPropertyNode.nDEFAULT;
    private String sLabel = "";
    
    private static XConstantTypeDescription[] xPropertyAttributesTypeDescriptions = null;
    
    
    /** Creates a new instance of UnoMethodNode */
    public UnoPropertyNode(Property _aProperty, Object _oUnoObject, Object _oUnoReturnObject) {
        super(_oUnoObject);
        aProperty = _aProperty;
        m_sPropertyName = aProperty.Name;
        m_oUnoReturnObject = _oUnoReturnObject;
    }


    public UnoPropertyNode(Property _aProperty){
        super(null);
        aProperty = _aProperty;
        m_sPropertyName = aProperty.Name;
        m_oUnoReturnObject = null;
    }
    
    public UnoPropertyNode(PropertyValue _aPropertyValue, Object _oUnoObject, Object _oUnoReturnObject) {
        super(_oUnoObject);
        m_oUnoReturnObject = _oUnoReturnObject;
        aPropertyValue = _aPropertyValue;
        m_sPropertyName = aPropertyValue.Name;
    }

    
    public int getPropertyNodeType(){
        return m_nPropertyType;
    }
    
    
    public void setPropertyNodeType(int _nPropertyType){
        m_nPropertyType = _nPropertyType;
    }
       
    
    public String getPropertyName(){
        return m_sPropertyName;
    }

    public String getName(){
        return this.m_sPropertyName;
    }

    
    public String getClassName(){
        String sClassName = "";
        if (m_oUnoObject != null){
            XServiceInfo xServiceInfo = (XServiceInfo) UnoRuntime.queryInterface(XServiceInfo.class, m_oUnoObject);
            if (xServiceInfo != null){
                String[] sServiceNames = xServiceInfo.getSupportedServiceNames();
                for (int i = 0; i < sServiceNames.length; i++){
                    if (doesServiceSupportProperty(sServiceNames[i], m_sPropertyName)){
                        sClassName = sServiceNames[i];
                        break;
                    }
                }
            }
        }
        else{
            sClassName = "com.sun.star.beans.Property";
        }
        return sClassName;
    }    
    
    
    public String getAnchor(){
        return m_sPropertyName;
    }
    
        
    
    protected boolean doesServiceSupportProperty(String _sServiceName, String _sPropertyName){
    try {
        XPropertyTypeDescription[] xPropertyTypeDescriptions = Introspector.getIntrospector().getPropertyDescriptionsOfService(_sServiceName);
        for (int i = 0; i < xPropertyTypeDescriptions.length; i++){
            if (xPropertyTypeDescriptions[i].getName().equals(_sServiceName + "." + _sPropertyName)){
                return true;
            }
        }
    } catch ( java.lang.Exception e) {
        System.out.println(System.out);
    }
        return false;
    }
    
    
    public Object getUnoReturnObject(){
        return m_oUnoReturnObject;
    }
    
    
    private boolean isPrimitive(){
        boolean bIsPrimitive = true;
        if (getUnoReturnObject() != null){
            if (getProperty() != null){
                bIsPrimitive = Introspector.isObjectPrimitive(getUnoReturnObject().getClass(), getProperty().Type.getTypeClass());                
            }
            else{
                bIsPrimitive = Introspector.isObjectPrimitive(getUnoReturnObject().getClass());
            }
        }
        else{
            bIsPrimitive = Introspector.isObjectPrimitive(aProperty.Type.getTypeClass());
        }
        return bIsPrimitive;
    }
    
    
    protected boolean isFoldable(){
        boolean bIsFoldable = false;
        if (! isPrimitive()){
            String sTypeName = getUnoReturnObject().getClass().getName();
            bIsFoldable = (!sTypeName.equals("com.sun.star.uno.Type"));
        }
        return bIsFoldable;
    }
    
    
    protected String getLabel(){
        if (!sLabel.equals("")){
            if (! isPrimitive()){
                if (isFoldable()){
                    sLabel = getPropertyTypeDescription(aProperty, getUnoReturnObject());
                }
                else{
                    sLabel = getStandardPropertyDescription(aProperty, getUnoReturnObject());
                }
            }
            else {                                                        
                sLabel =  getStandardPropertyDescription(aProperty, getUnoReturnObject());
            }
        }
        return sLabel;
    }
    
    public Property getProperty(){
        return aProperty;
    }
    
    protected  static String getPropertyTypeDescription(Property _aProperty, Object _oUnoObject){
        return _aProperty.Type.getTypeName() + " " + _aProperty.Name + " = " + _oUnoObject.toString();        
    }        


    protected static String getStandardPropertyDescription(Property _aProperty, Object _objectElement){
        if (!Introspector.isObjectPrimitive(_objectElement)){
            return _aProperty.Name + " = (" + _aProperty.Type.getTypeName() + ") ";    
        }
        else{
            return _aProperty.Name + " (" + _aProperty.Type.getTypeName() + ") = " + getDisplayValueOfPrimitiveType(_objectElement);        
        }
    }

    
    protected static String getStandardPropertyValueDescription(PropertyValue _aPropertyValue){
        if (!Introspector.isObjectPrimitive(_aPropertyValue.Value)){
            return _aPropertyValue.Name;
        }
        else{
            return _aPropertyValue.Name + " : " + UnoNode.getDisplayValueOfPrimitiveType(_aPropertyValue.Value);
        }
    }    
}


