/**************************************************************
 *
 * 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 "formenums.hxx"
#include <osl/diagnose.h>
#include <com/sun/star/form/FormSubmitEncoding.hpp>
#include <com/sun/star/form/FormSubmitMethod.hpp>
#include <com/sun/star/sdb/CommandType.hpp>
#include <com/sun/star/form/NavigationBarMode.hpp>
#include <com/sun/star/form/TabulatorCycle.hpp>
#include <com/sun/star/form/FormButtonType.hpp>
#include <com/sun/star/form/ListSourceType.hpp>
#include <com/sun/star/awt/TextAlign.hpp>
#include <com/sun/star/awt/FontWidth.hpp>
#include <com/sun/star/awt/FontEmphasisMark.hpp>
#include <com/sun/star/awt/FontRelief.hpp>
#include <com/sun/star/awt/ScrollBarOrientation.hpp>
#include <com/sun/star/awt/VisualEffect.hpp>
#include <com/sun/star/awt/ImageScaleMode.hpp>
#include <tools/wintypes.hxx>		// for check states
#include <xmloff/xmltoken.hxx>

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

	using namespace ::com::sun::star::form;
	using namespace ::com::sun::star::sdb;
	using namespace ::com::sun::star::awt;
	using namespace ::xmloff::token;

	const SvXMLEnumMapEntry*	OEnumMapper::s_pEnumMap[OEnumMapper::KNOWN_ENUM_PROPERTIES] =
	{
		NULL,
		NULL,
		NULL,
		NULL,
		NULL,
		NULL,
		NULL,
		NULL,
		NULL,
		NULL,
		NULL,
		NULL,
		NULL,
		NULL,
		NULL
	};

	//---------------------------------------------------------------------
	const SvXMLEnumMapEntry*	OEnumMapper::getEnumMap(EnumProperties _eProperty)
	{
		OSL_ENSURE(_eProperty < KNOWN_ENUM_PROPERTIES, "OEnumMapper::getEnumMap: invalid index (this will crash)!");

		const SvXMLEnumMapEntry*& rReturn = s_pEnumMap[_eProperty];
		if (!rReturn)
		{
			// the map for this property is not initialized yet
		 	switch (_eProperty)
			{
				// FormSubmitEncoding
				case epSubmitEncoding:
				{
					static SvXMLEnumMapEntry aSubmitEncodingMap[] =
					{
						{ XML_APPLICATION_X_WWW_FORM_URLENCODED, FormSubmitEncoding_URL },
						{ XML_MULTIPART_FORMDATA, FormSubmitEncoding_MULTIPART },
						{ XML_APPLICATION_TEXT, FormSubmitEncoding_TEXT },
						{ XML_TOKEN_INVALID, 0 }
					};
					rReturn = aSubmitEncodingMap;
				}
				break;
				// FormSubmitMethod
				case epSubmitMethod:
				{
					static SvXMLEnumMapEntry aSubmitMethodMap[] =
					{
						{ XML_GET, FormSubmitMethod_GET },
						{ XML_POST, FormSubmitMethod_POST },
						{ XML_TOKEN_INVALID, 0 }
					};
					rReturn = aSubmitMethodMap;
				}
				break;
				// CommandType
				case epCommandType:
				{
					static SvXMLEnumMapEntry aCommandTypeMap[] =
					{
						{ XML_TABLE, CommandType::TABLE },
						{ XML_QUERY, CommandType::QUERY },
						{ XML_COMMAND, CommandType::COMMAND },
						{ XML_TOKEN_INVALID, 0 }
					};
					rReturn = aCommandTypeMap;
				}
				break;
				// NavigationBarMode
				case epNavigationType:
				{
					static SvXMLEnumMapEntry aNavigationTypeMap[] =
					{
						{ XML_NONE, NavigationBarMode_NONE },
						{ XML_CURRENT, NavigationBarMode_CURRENT },
						{ XML_PARENT, NavigationBarMode_PARENT },
						{ XML_TOKEN_INVALID, 0 }
					};
					rReturn = aNavigationTypeMap;
				};
				break;
				// TabulatorCycle
				case epTabCyle:
				{
					static SvXMLEnumMapEntry aTabulytorCycleMap[] =
					{
						{ XML_RECORDS, TabulatorCycle_RECORDS },
						{ XML_CURRENT, TabulatorCycle_CURRENT },
						{ XML_PAGE, TabulatorCycle_PAGE },
						{ XML_TOKEN_INVALID, 0 }
					};
					rReturn = aTabulytorCycleMap;
				};
				break;
				// FormButtonType
				case epButtonType:
				{
					static SvXMLEnumMapEntry aFormButtonTypeMap[] =
					{
						{ XML_PUSH, FormButtonType_PUSH },
						{ XML_SUBMIT, FormButtonType_SUBMIT },
						{ XML_RESET, FormButtonType_RESET },
						{ XML_URL, FormButtonType_URL },
						{ XML_TOKEN_INVALID, 0 }
					};
					rReturn = aFormButtonTypeMap;
				};
				break;
				// ListSourceType
				case epListSourceType:
				{
					static SvXMLEnumMapEntry aListSourceTypeMap[] =
					{
						{ XML_VALUE_LIST, ListSourceType_VALUELIST },
						{ XML_TABLE, ListSourceType_TABLE },
						{ XML_QUERY, ListSourceType_QUERY },
						{ XML_SQL, ListSourceType_SQL },
						{ XML_SQL_PASS_THROUGH, ListSourceType_SQLPASSTHROUGH },
						{ XML_TABLE_FIELDS, ListSourceType_TABLEFIELDS },
						{ XML_TOKEN_INVALID, 0 }
					};
					rReturn = aListSourceTypeMap;
				};
				break;
				// check state of a checkbox
				case epCheckState:
				{
					static SvXMLEnumMapEntry aCheckStateMap[] =
					{
						{ XML_UNCHECKED, STATE_NOCHECK },
						{ XML_CHECKED, STATE_CHECK },
						{ XML_UNKNOWN, STATE_DONTKNOW },
						{ XML_TOKEN_INVALID, 0 }
					};
					rReturn = aCheckStateMap;
				};
				break;
				case epTextAlign:
				{
					static SvXMLEnumMapEntry aTextAlignMap[] =
					{
						{ XML_START,		TextAlign::LEFT },
						{ XML_CENTER,		TextAlign::CENTER },
						{ XML_END,			TextAlign::RIGHT },
						{ XML_JUSTIFY,		(sal_uInt16)-1 },
                        { XML_JUSTIFIED,    (sal_uInt16)-1 },
						{ XML_TOKEN_INVALID, 0 }
					};
					rReturn = aTextAlignMap;
				};
				break;
				case epBorderWidth:
				{
					static SvXMLEnumMapEntry aBorderTypeMap[] =
					{
						{ XML_NONE,	    0 },
						{ XML_HIDDEN, 	0 },
						{ XML_SOLID, 	2 },
						{ XML_DOUBLE,	2 },
						{ XML_DOTTED, 	2 },
						{ XML_DASHED, 	2 },
						{ XML_GROOVE, 	1 },
						{ XML_RIDGE,  	1 },
						{ XML_INSET,  	1 },
						{ XML_OUTSET, 	1 },
						{ XML_TOKEN_INVALID, 0 }
					};
					rReturn = aBorderTypeMap;
				};
				break;

				case epFontEmphasis:
				{
					static SvXMLEnumMapEntry aFontEmphasisMap[] =
					{
						{ XML_NONE,	    FontEmphasisMark::NONE },
						{ XML_DOT,		FontEmphasisMark::DOT },
						{ XML_CIRCLE,	FontEmphasisMark::CIRCLE },
						{ XML_DISC,	    FontEmphasisMark::DISC },
						{ XML_ACCENT,	FontEmphasisMark::ACCENT },
						{ XML_TOKEN_INVALID, 0 }
					};
					rReturn = aFontEmphasisMap;
				}
				break;

				case epFontRelief:
				{
					static SvXMLEnumMapEntry aFontReliefMap[] =
					{
						{ XML_NONE,		FontRelief::NONE },
						{ XML_ENGRAVED,	FontRelief::ENGRAVED },
						{ XML_EMBOSSED,	FontRelief::EMBOSSED },
						{ XML_TOKEN_INVALID, 0 }
					};
					rReturn = aFontReliefMap;
				}
				break;

                case epListLinkageType:
				{
					static SvXMLEnumMapEntry aListLinkageMap[] =
					{
						{ XML_SELECTION,            0 },
						{ XML_SELECTION_INDEXES,    1 },
						{ XML_TOKEN_INVALID, 0 }
					};
					rReturn = aListLinkageMap;
				}
				break;

                case epOrientation:
                {
                    static SvXMLEnumMapEntry aOrientationMap[] =
                    {
                        { XML_HORIZONTAL,   ScrollBarOrientation::HORIZONTAL },
                        { XML_VERTICAL,     ScrollBarOrientation::VERTICAL },
                        { XML_TOKEN_INVALID, 0 }
                    };
                    rReturn = aOrientationMap;
                }
				break;

                case epVisualEffect:
                {
                    static SvXMLEnumMapEntry aVisualEffectMap[] =
                    {
                        { XML_NONE, VisualEffect::NONE },
                        { XML_3D,   VisualEffect::LOOK3D },
                        { XML_FLAT, VisualEffect::FLAT },
                        { XML_TOKEN_INVALID, 0 }
                    };
                    rReturn = aVisualEffectMap;
                }
                break;

                case epImagePosition:
                {
                    static SvXMLEnumMapEntry aImagePositionMap[] =
                    {
                        { XML_START,  0 },
                        { XML_END,    1 },
                        { XML_TOP,    2 },
                        { XML_BOTTOM, 3 },
                        { XML_CENTER, (sal_uInt16)-1 },
                        { XML_TOKEN_INVALID, 0 }
                    };
                    rReturn = aImagePositionMap;
                }
                break;

                case epImageAlign:
                {
                    static SvXMLEnumMapEntry aImageAlignMap[] =
                    {
                        { XML_START,  0 },
                        { XML_CENTER, 1 },
                        { XML_END, 2 },
                        { XML_TOKEN_INVALID, 0 }
                    };
                    rReturn = aImageAlignMap;
                }
                break;

                case epImageScaleMode:
                {
                    static const SvXMLEnumMapEntry aScaleModeMap[] =
                    {
                        { XML_BACKGROUND_NO_REPEAT, ImageScaleMode::NONE },
                        { XML_REPEAT,               ImageScaleMode::NONE },  // repeating the image is not supported
                        { XML_STRETCH,              ImageScaleMode::ANISOTROPIC },
                        { XML_SCALE,                ImageScaleMode::ISOTROPIC },
                        { XML_TOKEN_INVALID,        ImageScaleMode::NONE }
                    };
                    rReturn = aScaleModeMap;
                }
                break;

                case KNOWN_ENUM_PROPERTIES:
                    break;
			}
		}

		return rReturn;
	}

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