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



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_xmloff.hxx"
#include "formattributes.hxx"
#include "xmloff/xmlnmspe.hxx"
#include <xmloff/xmluconv.hxx>
#include <rtl/ustrbuf.hxx>
#include <rtl/logfile.hxx>
//.........................................................................
namespace xmloff
{
//.........................................................................

	using namespace ::com::sun::star::uno;
	using namespace ::com::sun::star::lang;
	using namespace ::com::sun::star::beans;


	//=====================================================================
	//= OAttributeMetaData
	//=====================================================================
	//---------------------------------------------------------------------
	const sal_Char* OAttributeMetaData::getCommonControlAttributeName(sal_Int32 _nId)
	{
		switch (_nId)
		{
			case CCA_NAME: 				return "name";
			case CCA_SERVICE_NAME: 		return "control-implementation";
			case CCA_BUTTON_TYPE: 		return "button-type";
// disabled(AddAttributeIdLegacy)	case CCA_CONTROL_ID: 		return "id";
			case CCA_CURRENT_SELECTED: 	return "current-selected";
			case CCA_CURRENT_VALUE: 	return "current-value";
			case CCA_DISABLED: 			return "disabled";
			case CCA_ENABLEVISIBLE: 	return "visible";
			case CCA_DROPDOWN: 			return "dropdown";
			case CCA_FOR: 				return "for";
			case CCA_IMAGE_DATA: 		return "image-data";
			case CCA_LABEL: 			return "label";
			case CCA_MAX_LENGTH: 		return "max-length";
			case CCA_PRINTABLE: 		return "printable";
			case CCA_READONLY: 			return "readonly";
			case CCA_SELECTED: 			return "selected";
			case CCA_SIZE: 				return "size";
			case CCA_TAB_INDEX: 		return "tab-index";
			case CCA_TARGET_FRAME: 		return "target-frame";
			case CCA_TARGET_LOCATION: 	return "href";		// the only special thing here: TargetLocation is represented by an xlink:href attribute
			case CCA_TAB_STOP: 			return "tab-stop";
			case CCA_TITLE: 			return "title";
			case CCA_VALUE: 			return "value";
            case CCA_ORIENTATION:       return "orientation";
            case CCA_VISUAL_EFFECT:     return "visual-effect";
			default:
				OSL_ENSURE(sal_False, "OAttributeMetaData::getCommonControlAttributeName: invalid id (maybe you or-ed two flags?)!");
		}
		return "";
	}

	//---------------------------------------------------------------------
	sal_uInt16 OAttributeMetaData::getCommonControlAttributeNamespace(sal_Int32 _nId)
	{
		if (CCA_TARGET_LOCATION == _nId)
			return XML_NAMESPACE_XLINK;

		if (CCA_TARGET_FRAME == _nId)
			return XML_NAMESPACE_OFFICE;

		return XML_NAMESPACE_FORM;
	}

	//---------------------------------------------------------------------
	const sal_Char* OAttributeMetaData::getFormAttributeName(FormAttributes _eAttrib)
	{
		switch (_eAttrib)
		{
			case faName: 				return "name";
			case faServiceName: 		return "service-name";
			case faAction: 				return "href";		// the only special thing here: Action is represented by an xlink:href attribute
			case faEnctype: 			return "enctype";
			case faMethod: 				return "method";
			case faTargetFrame: 		return "target-frame";
			case faAllowDeletes:		return "allow-deletes";
			case faAllowInserts:		return "allow-inserts";
			case faAllowUpdates:		return "allow-updates";
			case faApplyFilter: 		return "apply-filter";
			case faCommand: 			return "command";
			case faCommandType: 		return "command-type";
			case faEscapeProcessing:	return "escape-processing";
			case faDatasource: 			return "datasource";
			case faConnectionResource: 	return "connection-resource";
			case faDetailFiels: 		return "detail-fields";
			case faFilter: 				return "filter";
			case faIgnoreResult: 		return "ignore-result";
			case faMasterFields: 		return "master-fields";
			case faNavigationMode:		return "navigation-mode";
			case faOrder: 				return "order";
			case faTabbingCycle: 		return "tab-cycle";
			default:
				OSL_ENSURE(sal_False, "OAttributeMetaData::getFormAttributeName: invalid id!");
		}
		return "";
	}

	//---------------------------------------------------------------------
	sal_uInt16 OAttributeMetaData::getFormAttributeNamespace(FormAttributes _eAttrib)
	{
		if (faAction == _eAttrib)
			return XML_NAMESPACE_XLINK;

		if (faTargetFrame == _eAttrib)
			return XML_NAMESPACE_OFFICE;

		return XML_NAMESPACE_FORM;
	}

	//---------------------------------------------------------------------
	const sal_Char* OAttributeMetaData::getDatabaseAttributeName(sal_Int32 _nId)
	{
		switch (_nId)
		{
			case DA_BOUND_COLUMN:		return "bound-column";
			case DA_CONVERT_EMPTY:		return "convert-empty-to-null";
			case DA_DATA_FIELD:			return "data-field";
			case DA_LIST_SOURCE:		return "list-source";
			case DA_LIST_SOURCE_TYPE:	return "list-source-type";
            case DA_INPUT_REQUIRED:	    return "input-required";
			default:
				OSL_ENSURE(sal_False, "OAttributeMetaData::getDatabaseAttributeName: invalid id (maybe you or-ed two flags?)!");
		}
		return "";
	}

	//---------------------------------------------------------------------
	sal_uInt16 OAttributeMetaData::getDatabaseAttributeNamespace(sal_Int32 /*_nId*/)
	{
		// nothing special here
		return XML_NAMESPACE_FORM;
	}

	//---------------------------------------------------------------------
    const sal_Char* OAttributeMetaData::getBindingAttributeName(sal_Int32 _nId)
    {
		switch (_nId)
		{
			case BA_LINKED_CELL:       return "linked-cell";
            case BA_LIST_LINKING_TYPE: return "list-linkage-type";
			case BA_LIST_CELL_RANGE:   return "source-cell-range";
			default:
				OSL_ENSURE(sal_False, "OAttributeMetaData::getBindingAttributeName: invalid id (maybe you or-ed two flags?)!");
		}
		return "";
    }

	//---------------------------------------------------------------------
	sal_uInt16 OAttributeMetaData::getBindingAttributeNamespace(sal_Int32)
    {
		// nothing special here
		return XML_NAMESPACE_FORM;
    }

	//---------------------------------------------------------------------
	const sal_Char* OAttributeMetaData::getSpecialAttributeName(sal_Int32 _nId)
	{
		switch (_nId)
		{
			case SCA_ECHO_CHAR: 			return "echo-char";
			case SCA_MAX_VALUE:				return "max-value";
			case SCA_MIN_VALUE:				return "min-value";
			case SCA_VALIDATION:			return "validation";
			case SCA_MULTI_LINE:			return "multi-line";
			case SCA_AUTOMATIC_COMPLETION:	return "auto-complete";
			case SCA_MULTIPLE: 				return "multiple";
			case SCA_DEFAULT_BUTTON: 		return "default-button";
			case SCA_CURRENT_STATE: 		return "current-state";
			case SCA_IS_TRISTATE: 			return "is-tristate";
			case SCA_STATE: 				return "state";
			case SCA_COLUMN_STYLE_NAME:		return "text-style-name";
			case SCA_STEP_SIZE:		        return "step-size";
			case SCA_PAGE_STEP_SIZE:		return "page-step-size";
			case SCA_REPEAT_DELAY:		    return "delay-for-repeat";
            case SCA_TOGGLE:                return "toggle";
            case SCA_FOCUS_ON_CLICK:        return "focus-on-click";
			default:
				OSL_ENSURE(sal_False, "OAttributeMetaData::getSpecialAttributeName: invalid id (maybe you or-ed two flags?)!");
		}
		return "";
	}

	//---------------------------------------------------------------------
	sal_uInt16 OAttributeMetaData::getSpecialAttributeNamespace(sal_Int32 /*_nId*/)
	{
		// nothing special here
		return XML_NAMESPACE_FORM;
	}

	//---------------------------------------------------------------------
	const sal_Char* OAttributeMetaData::getOfficeFormsAttributeName(OfficeFormsAttributes _eAttrib)
	{
		switch (_eAttrib)
		{
			case ofaAutomaticFocus:		return "automatic-focus";
			case ofaApplyDesignMode:	return "apply-design-mode";
			default:
				OSL_ENSURE(sal_False, "OAttributeMetaData::getOfficeFormsAttributeName: invalid id!");
		}
		return "";
	}

	//---------------------------------------------------------------------
	sal_uInt16 OAttributeMetaData::getOfficeFormsAttributeNamespace(OfficeFormsAttributes /* _eAttrib */)
	{
		// nothing special here
		return XML_NAMESPACE_FORM;
	}

	//=====================================================================
	//= OAttribute2Property
	//=====================================================================
	//---------------------------------------------------------------------
	OAttribute2Property::OAttribute2Property()
	{
	}

	//---------------------------------------------------------------------
	OAttribute2Property::~OAttribute2Property()
	{
	}

	//---------------------------------------------------------------------
	const OAttribute2Property::AttributeAssignment* OAttribute2Property::getAttributeTranslation(
			const ::rtl::OUString& _rAttribName)
	{
		ConstAttributeAssignmentsIterator aPos = m_aKnownProperties.find(_rAttribName);
		if (m_aKnownProperties.end() != aPos)
			return &aPos->second;
		return NULL;
	}

	//---------------------------------------------------------------------
	void OAttribute2Property::addStringProperty(
		const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
		const sal_Char* _pAttributeDefault)
	{
		implAdd(_pAttributeName, _rPropertyName, ::getCppuType( static_cast< ::rtl::OUString* >(NULL) ),
			_pAttributeDefault ? ::rtl::OUString::createFromAscii(_pAttributeDefault) : ::rtl::OUString());
	}

	//---------------------------------------------------------------------
	void OAttribute2Property::addBooleanProperty(
		const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
		const sal_Bool _bAttributeDefault, const sal_Bool _bInverseSemantics)
	{
		::rtl::OUStringBuffer aDefault;
		SvXMLUnitConverter::convertBool(aDefault, _bAttributeDefault);
		AttributeAssignment& aAssignment = implAdd(_pAttributeName, _rPropertyName, ::getBooleanCppuType(), aDefault.makeStringAndClear());
		aAssignment.bInverseSemantics = _bInverseSemantics;
	}

	//---------------------------------------------------------------------
	void OAttribute2Property::addInt16Property(
		const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
		const sal_Int16 _nAttributeDefault)
	{
		::rtl::OUStringBuffer aDefault;
		SvXMLUnitConverter::convertNumber(aDefault, (sal_Int32)_nAttributeDefault);
		implAdd(_pAttributeName, _rPropertyName, ::getCppuType( static_cast< sal_Int16* >(NULL) ), aDefault.makeStringAndClear());
	}

	//---------------------------------------------------------------------
	void OAttribute2Property::addInt32Property(
		const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
		const sal_Int32 _nAttributeDefault)
	{
		::rtl::OUStringBuffer aDefault;
		SvXMLUnitConverter::convertNumber( aDefault, _nAttributeDefault );
		implAdd( _pAttributeName, _rPropertyName, ::getCppuType( static_cast< sal_Int32* >(NULL) ), aDefault.makeStringAndClear() );
	}

	//---------------------------------------------------------------------
	void OAttribute2Property::addEnumProperty(
			const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
			const sal_uInt16 _nAttributeDefault, const SvXMLEnumMapEntry* _pValueMap,
			const ::com::sun::star::uno::Type* _pType)
	{
		::rtl::OUStringBuffer aDefault;
		SvXMLUnitConverter::convertEnum(aDefault, _nAttributeDefault, _pValueMap);
		AttributeAssignment& aAssignment = implAdd(_pAttributeName, _rPropertyName,
			_pType ? *_pType : ::getCppuType( static_cast< sal_Int32* >(NULL) ),
				// this assumes that the setPropertyValue for enums can handle int32's ....
			aDefault.makeStringAndClear());
		aAssignment.pEnumMap = _pValueMap;
	}

	//---------------------------------------------------------------------
	OAttribute2Property::AttributeAssignment& OAttribute2Property::implAdd(
			const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
			const ::com::sun::star::uno::Type& _rType, const ::rtl::OUString& /*_rDefaultString*/)
	{
		OSL_ENSURE(m_aKnownProperties.end() == m_aKnownProperties.find(::rtl::OUString::createFromAscii(_pAttributeName)),
			"OAttribute2Property::implAdd: already have this attribute!");

		::rtl::OUString sAttributeName = ::rtl::OUString::createFromAscii(_pAttributeName);

		AttributeAssignment aAssignment;
		aAssignment.sAttributeName = sAttributeName;
		aAssignment.sPropertyName = _rPropertyName;
		aAssignment.aPropertyType = _rType;

		// redundance, the accessor is stored in aAssignment.sAttributeName, too
		return m_aKnownProperties[sAttributeName] = aAssignment;
	}

//.........................................................................
}	// namespace xmloff
//.........................................................................
