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



#include "CustomAnimationCreateDialog.hrc"
#include "CustomAnimation.hrc"

TabDialog DLG_CUSTOMANIMATION_CREATE
{
	Size = MAP_APPFONT ( 162, 244 ) ;
	OutputSize = TRUE ;
	SVLook = TRUE ;
	Moveable = TRUE ;
	Closeable = TRUE ;

	Text [ en-US ] = "Custom Animation" ;

	TabControl 1
	{
		OutputSize = TRUE ;
		Pos = MAP_APPFONT ( 3, 3 ) ;
		Size = MAP_APPFONT ( 156, 217 ) ;
		PageList =
		{
			PageItem
			{
				Identifier = RID_TP_CUSTOMANIMATION_ENTRANCE ;
				Text [ en-US ] = "Entrance" ;
			};

			PageItem
			{
				Identifier = RID_TP_CUSTOMANIMATION_EMPHASIS ;
				Text [ en-US ] = "Emphasis" ;
			};

			PageItem
			{
				Identifier = RID_TP_CUSTOMANIMATION_EXIT ;
				Text [ en-US ] = "Exit" ;
			};

			PageItem
			{
				Identifier = RID_TP_CUSTOMANIMATION_MOTIONPATH ;
				Text [ en-US ] = "Motion Paths" ;
			};

			PageItem
			{
				Identifier = RID_TP_CUSTOMANIMATION_MISCEFFECTS ;
				Text [ en-US ] = "Misc Effects" ;
			};
		};
	};
	OKButton 1
	{
		Pos = MAP_APPFONT ( 3, 223 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		TabStop = TRUE ;
		DefButton = TRUE ;
	};
	CancelButton 1
	{
		Pos = MAP_APPFONT ( 56, 223 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		TabStop = TRUE ;
		DefButton = TRUE ;
	};
	HelpButton 1
	{
		Pos = MAP_APPFONT ( 109, 223 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		TabStop = TRUE ;
	};
};

TabPage RID_TP_CUSTOMANIMATION_ENTRANCE
{
	HelpID = "sd:TabPage:RID_TP_CUSTOMANIMATION_ENTRANCE" ;
	Hide = TRUE ;
	Size = MAP_APPFONT ( 156, 217 ) ;

	ListBox LB_EFFECTS
	{
		HelpID = "sd:ListBox:RID_TP_CUSTOMANIMATION_ENTRANCE:LB_EFFECTS" ;
		Pos = MAP_APPFONT ( 3, 3 ) ;
		Size = MAP_APPFONT ( 144, 160 ) ;
		OutputSize = TRUE ;
		TabStop = TRUE ;
		Border = TRUE ;
	};

	FixedText FT_SPEED
	{
		OutputSize = TRUE ;
		Pos = MAP_APPFONT ( 3, 167 ) ;
		Size = MAP_APPFONT ( 42, 8 ) ;

		Text [ en-US ] = "Speed" ;
	};

	ComboBox CB_SPEED
	{
		HelpID = "sd:ComboBox:RID_TP_CUSTOMANIMATION_ENTRANCE:CB_SPEED" ;
		Pos = MAP_APPFONT ( 48, 166 ) ;
		Size = MAP_APPFONT ( 101, 48 ) ;
		TabStop = TRUE ;
		Border = TRUE ;
		DropDown = TRUE ;
	};

	CheckBox CBX_PREVIEW
	{
		HelpID = "sd:CheckBox:RID_TP_CUSTOMANIMATION_ENTRANCE:CBX_PREVIEW" ;
		Pos = MAP_APPFONT ( 3, 181 ) ;
		Size = MAP_APPFONT ( 143, 10 ) ;
		TabStop = TRUE ;
		Text [ en-US ] = "Automatic preview" ;
	};

	String STR_USERPATH
	{
		Text [ en-US ] = "User paths" ;
	};
};

// ********************************************************************** EOF
