/**************************************************************
 *
 * 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 "EnhancedCustomShapeToken.hxx"
#include <osl/mutex.hxx>
#include <hash_map>
#include <rtl/string.hxx>

namespace xmloff { namespace EnhancedCustomShapeToken {

typedef std::hash_map< const char*, EnhancedCustomShapeTokenEnum, rtl::CStringHash, rtl::CStringEqual> TypeNameHashMap;
static TypeNameHashMap* pHashMap = NULL;
static ::osl::Mutex& getHashMapMutex()
{
	static osl::Mutex s_aHashMapProtection;
	return s_aHashMapProtection;
}

struct TokenTable
{
	const char*						    pS;
	EnhancedCustomShapeTokenEnum		pE;
};

static const TokenTable pTokenTableArray[] =
{
	{ "type",								EAS_type },
	{ "name",								EAS_name },
	{ "mirror-horizontal",					EAS_mirror_horizontal },
	{ "mirror-vertical",					EAS_mirror_vertical },
	{ "viewBox",							EAS_viewBox },
	{ "text-rotate-angle",					EAS_text_rotate_angle },
	{ "extrusion-allowed",					EAS_extrusion_allowed },
	{ "extrusion-text-path-allowed",		EAS_text_path_allowed },
	{ "extrusion-concentric-gradient-fill", EAS_concentric_gradient_fill_allowed },
	{ "extrusion",							EAS_extrusion },
	{ "extrusion-brightness",				EAS_extrusion_brightness },
	{ "extrusion-depth",					EAS_extrusion_depth },
	{ "extrusion-diffusion",				EAS_extrusion_diffusion },
	{ "extrusion-number-of-line-segments",	EAS_extrusion_number_of_line_segments },
	{ "extrusion-light-face",				EAS_extrusion_light_face },
	{ "extrusion-first-light-harsh",		EAS_extrusion_first_light_harsh },
	{ "extrusion-second-light-harsh",		EAS_extrusion_second_light_harsh },
	{ "extrusion-first-light-livel",		EAS_extrusion_first_light_level },
	{ "extrusion-second-light-level",		EAS_extrusion_second_light_level },
	{ "extrusion-first-light-direction",	EAS_extrusion_first_light_direction },
	{ "extrusion-second-light-direction",	EAS_extrusion_second_light_direction },
	{ "extrusion-metal",					EAS_extrusion_metal },
	{ "shade-mode",							EAS_shade_mode },
	{ "extrusion-rotation-angle",			EAS_extrusion_rotation_angle },
	{ "extrusion-rotation-center",			EAS_extrusion_rotation_center },
	{ "extrusion-shininess",				EAS_extrusion_shininess },
	{ "extrusion-skew",						EAS_extrusion_skew },
	{ "extrusion-specularity",				EAS_extrusion_specularity },
	{ "projection",							EAS_projection },
	{ "extrusion-viewpoint",				EAS_extrusion_viewpoint },
	{ "extrusion-origin",					EAS_extrusion_origin },
	{ "extrusion-color",					EAS_extrusion_color },
	{ "enhanced-path",						EAS_enhanced_path },
	{ "path-stretchpoint-x",				EAS_path_stretchpoint_x },
	{ "path-stretchpoint-y",				EAS_path_stretchpoint_y },
	{ "text-areas",							EAS_text_areas },
	{ "glue-points",						EAS_glue_points },
	{ "glue-point-type",					EAS_glue_point_type },
	{ "glue-point-leaving-directions",		EAS_glue_point_leaving_directions },
	{ "text-path",							EAS_text_path },
	{ "text-path-mode",						EAS_text_path_mode },
	{ "text-path-scale",					EAS_text_path_scale },
	{ "text-path-same-letter-heights",		EAS_text_path_same_letter_heights },
	{ "modifiers",							EAS_modifiers },
	{ "equation",							EAS_equation },
	{ "formula",							EAS_formula },
	{ "handle",								EAS_handle },
	{ "handle-mirror-horizontal",			EAS_handle_mirror_horizontal },
	{ "handle-mirror-vertical",				EAS_handle_mirror_vertical },
	{ "handle-switched",					EAS_handle_switched },
	{ "handle-position",					EAS_handle_position },
	{ "handle-range-x-minimum",				EAS_handle_range_x_minimum },
	{ "handle-range-x-maximum",				EAS_handle_range_x_maximum },
	{ "handle-range-y-minimum",				EAS_handle_range_y_minimum },
	{ "handle-range-y-maximum",				EAS_handle_range_y_maximum },
	{ "handle-polar",						EAS_handle_polar },
	{ "handle-radius-range-minimum",		EAS_handle_radius_range_minimum },
	{ "handle-radius-range-maximum",		EAS_handle_radius_range_maximum },

	{ "CustomShapeEngine",					EAS_CustomShapeEngine },
	{ "CustomShapeData",					EAS_CustomShapeData },
	{ "Type",								EAS_Type },
	{ "MirroredX",							EAS_MirroredX },
	{ "MirroredY",							EAS_MirroredY },
	{ "ViewBox",							EAS_ViewBox },
	{ "TextRotateAngle",					EAS_TextRotateAngle },
	{ "ExtrusionAllowed",					EAS_ExtrusionAllowed },
	{ "TextPathAllowed",					EAS_TextPathAllowed },
	{ "ConcentricGradientFillAllowed",		EAS_ConcentricGradientFillAllowed },
	{ "Extrusion",							EAS_Extrusion },
	{ "Equations",							EAS_Equations },
	{ "Equation",							EAS_Equation },
	{ "Path",								EAS_Path },
	{ "TextPath",							EAS_TextPath },
	{ "Handles",							EAS_Handles },
	{ "Handle",								EAS_Handle },
	{ "Brightness",							EAS_Brightness },
	{ "Depth",								EAS_Depth },
	{ "Diffusion",							EAS_Diffusion },
	{ "NumberOfLineSegments",				EAS_NumberOfLineSegments },
	{ "LightFace",							EAS_LightFace },
	{ "FirstLightHarsh",					EAS_FirstLightHarsh },
	{ "SecondLightHarsh",					EAS_SecondLightHarsh },
	{ "FirstLightLevel",					EAS_FirstLightLevel },
	{ "SecondLightLevel",					EAS_SecondLightLevel },
	{ "FirstLightDirection",				EAS_FirstLightDirection },
	{ "SecondLightDirection",				EAS_SecondLightDirection },
	{ "Metal",								EAS_Metal },
	{ "ShadeMode",							EAS_ShadeMode },
	{ "RotateAngle",						EAS_RotateAngle },
	{ "RotationCenter",						EAS_RotationCenter },
	{ "Shininess",							EAS_Shininess },
	{ "Skew",								EAS_Skew },
	{ "Specularity",						EAS_Specularity },
	{ "ProjectionMode",						EAS_ProjectionMode },
	{ "ViewPoint",							EAS_ViewPoint },
	{ "Origin",								EAS_Origin },
	{ "Color",								EAS_Color },
	{ "Switched",							EAS_Switched },
 	{ "Polar",								EAS_Polar },
	{ "RangeXMinimum",						EAS_RangeXMinimum },
	{ "RangeXMaximum",						EAS_RangeXMaximum },
	{ "RangeYMinimum",						EAS_RangeYMinimum },
	{ "RangeYMaximum",						EAS_RangeYMaximum },
	{ "RadiusRangeMinimum",					EAS_RadiusRangeMinimum },
	{ "RadiusRangeMaximum",					EAS_RadiusRangeMaximum },
	{ "Coordinates",						EAS_Coordinates },
	{ "Segments",							EAS_Segments },
	{ "StretchX",							EAS_StretchX },
	{ "StretchY",							EAS_StretchY },
	{ "TextFrames",							EAS_TextFrames },
	{ "GluePoints",							EAS_GluePoints },
	{ "GluePointLeavingDirections",			EAS_GluePointLeavingDirections },
	{ "GluePointType",						EAS_GluePointType },
	{ "TextPathMode",						EAS_TextPathMode },
	{ "ScaleX",								EAS_ScaleX },
	{ "SameLetterHeights",					EAS_SameLetterHeights },
	{ "Position",							EAS_Position },
	{ "AdjustmentValues",					EAS_AdjustmentValues },

	{ "Last",								EAS_Last },
	{ "NotFound",							EAS_NotFound }
};

EnhancedCustomShapeTokenEnum EASGet( const rtl::OUString& rShapeType )
{
	if ( !pHashMap )
	{	// init hash map
		::osl::MutexGuard aGuard( getHashMapMutex() );
		if ( !pHashMap )
		{
			TypeNameHashMap* pH = new TypeNameHashMap;
			const TokenTable* pPtr = pTokenTableArray;
			const TokenTable* pEnd = pPtr + ( sizeof( pTokenTableArray ) / sizeof( TokenTable ) );
			for ( ; pPtr < pEnd; pPtr++ )
				(*pH)[ pPtr->pS ] = pPtr->pE;
			pHashMap = pH;
		}
	}
	EnhancedCustomShapeTokenEnum eRetValue = EAS_NotFound;
	int i, nLen = rShapeType.getLength();
	char* pBuf = new char[ nLen + 1 ];
	for ( i = 0; i < nLen; i++ )
		pBuf[ i ] = (char)rShapeType[ i ];
	pBuf[ i ] = 0;
	TypeNameHashMap::iterator aHashIter( pHashMap->find( pBuf ) );
	delete[] pBuf;
	if ( aHashIter != pHashMap->end() )
		eRetValue = (*aHashIter).second;
	return eRetValue;
}

rtl::OUString EASGet( const EnhancedCustomShapeTokenEnum eToken )
{
	sal_uInt32 i = eToken >= EAS_Last
		? (sal_uInt32)EAS_NotFound
		: (sal_uInt32)eToken;
	return rtl::OUString::createFromAscii( pTokenTableArray[ i ].pS );
}

}
}
