/**************************************************************
 * 
 * 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 "valueproperties.hxx"
#include "strings.hxx"
#include <com/sun/star/form/FormComponentType.hpp>

//.........................................................................
namespace xmloff
{
//.........................................................................

	using namespace ::com::sun::star::form;

	//=====================================================================
	//= OValuePropertiesMetaData
	//=====================================================================
	//---------------------------------------------------------------------
	void OValuePropertiesMetaData::getValuePropertyNames(
			OControlElement::ElementType _eType, sal_Int16 _nFormComponentType,
			sal_Char const * & _rpCurrentValuePropertyName, sal_Char const * & _rpValuePropertyName)
	{
		// reset the pointers in case we can't determine the property names
		_rpCurrentValuePropertyName = _rpValuePropertyName = NULL;
		switch (_nFormComponentType)
		{
			case FormComponentType::TEXTFIELD:
				if (OControlElement::FORMATTED_TEXT == _eType)
				{
					_rpCurrentValuePropertyName = PROPERTY_EFFECTIVE_VALUE;
					_rpValuePropertyName = PROPERTY_EFFECTIVE_DEFAULT;
				}
				else
				{
					if (OControlElement::PASSWORD != _eType)
						// no CurrentValue" for passwords
						_rpCurrentValuePropertyName = PROPERTY_TEXT;
					_rpValuePropertyName = PROPERTY_DEFAULT_TEXT;
				}
				break;

			case FormComponentType::NUMERICFIELD:
			case FormComponentType::CURRENCYFIELD:
				_rpCurrentValuePropertyName = PROPERTY_VALUE;
				_rpValuePropertyName = PROPERTY_DEFAULT_VALUE;
				break;

			case FormComponentType::PATTERNFIELD:
			case FormComponentType::FILECONTROL:
			case FormComponentType::COMBOBOX:
				_rpValuePropertyName = PROPERTY_DEFAULT_TEXT;
				// NO BREAK!!
			case FormComponentType::COMMANDBUTTON:
				_rpCurrentValuePropertyName = PROPERTY_TEXT;
				break;

            case FormComponentType::CHECKBOX:
			case FormComponentType::RADIOBUTTON:
				_rpValuePropertyName = PROPERTY_REFVALUE;
				break;

			case FormComponentType::HIDDENCONTROL:
				_rpValuePropertyName = PROPERTY_HIDDEN_VALUE;
				break;

            case FormComponentType::SCROLLBAR:
				_rpCurrentValuePropertyName = PROPERTY_SCROLLVALUE;
				_rpValuePropertyName = PROPERTY_SCROLLVALUE_DEFAULT;
                break;

            case FormComponentType::SPINBUTTON:
				_rpCurrentValuePropertyName = PROPERTY_SPINVALUE;
				_rpValuePropertyName = PROPERTY_DEFAULT_SPINVALUE;
                break;

            default:
                OSL_ENSURE( false, "OValuePropertiesMetaData::getValuePropertyNames: unsupported component type!" );
                break;
		}
	}
	

	//---------------------------------------------------------------------
	void OValuePropertiesMetaData::getValueLimitPropertyNames(sal_Int16 _nFormComponentType,
		sal_Char const * & _rpMinValuePropertyName, sal_Char const * & _rpMaxValuePropertyName)
	{
		_rpMinValuePropertyName = _rpMaxValuePropertyName = NULL;
		switch (_nFormComponentType)
		{
			case FormComponentType::NUMERICFIELD:
			case FormComponentType::CURRENCYFIELD:
				_rpMinValuePropertyName = PROPERTY_VALUE_MIN;
				_rpMaxValuePropertyName = PROPERTY_VALUE_MAX;
				break;

			case FormComponentType::TEXTFIELD:
				_rpMinValuePropertyName = PROPERTY_EFFECTIVE_MIN;
				_rpMaxValuePropertyName = PROPERTY_EFFECTIVE_MAX;
				break;

            case FormComponentType::SCROLLBAR:
				_rpMinValuePropertyName = PROPERTY_SCROLLVALUE_MIN;
				_rpMaxValuePropertyName = PROPERTY_SCROLLVALUE_MAX;
				break;

            case FormComponentType::SPINBUTTON:
				_rpMinValuePropertyName = PROPERTY_SPINVALUE_MIN;
				_rpMaxValuePropertyName = PROPERTY_SPINVALUE_MAX;
				break;

            default:
                OSL_ENSURE( false, "OValuePropertiesMetaData::getValueLimitPropertyNames: unsupported component type!" );
                break;
		}
	}

	//---------------------------------------------------------------------
	void OValuePropertiesMetaData::getRuntimeValuePropertyNames(
		OControlElement::ElementType _eType, sal_Int16 _nFormComponentType,
		sal_Char const * & _rpValuePropertyName, sal_Char const * & _rpDefaultValuePropertyName )
	{
		// reset the pointers in case we can't determine the property names
		_rpValuePropertyName = _rpDefaultValuePropertyName = NULL;
		switch (_nFormComponentType)
		{
			case FormComponentType::TEXTFIELD:
				if (OControlElement::FORMATTED_TEXT == _eType)
				{
					_rpValuePropertyName = PROPERTY_EFFECTIVE_VALUE;
					_rpDefaultValuePropertyName = PROPERTY_EFFECTIVE_DEFAULT;
				}
				else
				{
					_rpValuePropertyName = PROPERTY_TEXT;
					_rpDefaultValuePropertyName = PROPERTY_DEFAULT_TEXT;
				}
				break;

			case FormComponentType::DATEFIELD:
				_rpValuePropertyName = PROPERTY_DATE;
				_rpDefaultValuePropertyName = PROPERTY_DEFAULT_DATE;
                break;

			case FormComponentType::TIMEFIELD:
				_rpValuePropertyName = PROPERTY_TIME;
				_rpDefaultValuePropertyName = PROPERTY_DEFAULT_TIME;
                break;

			case FormComponentType::NUMERICFIELD:
			case FormComponentType::CURRENCYFIELD:
			case FormComponentType::PATTERNFIELD:
			case FormComponentType::FILECONTROL:
			case FormComponentType::COMBOBOX:
            case FormComponentType::SCROLLBAR:
            case FormComponentType::SPINBUTTON:
				// For these types, the runtime properties are the same as the ones which in the XML
				// stream are named "value properties"
				getValuePropertyNames( _eType, _nFormComponentType, _rpValuePropertyName, _rpDefaultValuePropertyName );
				break;

			case FormComponentType::CHECKBOX:
			case FormComponentType::RADIOBUTTON:
				_rpValuePropertyName = PROPERTY_STATE;
				_rpDefaultValuePropertyName = PROPERTY_DEFAULT_STATE;
				break;
		}
	}

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


