/**************************************************************
 *
 * 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 "optctl.hrc"
#include "helpid.hrc"
#include <cuires.hrc>

#include <sfx2/sfx.hrc>

TabPage RID_SVXPAGE_OPTIONS_CTL
{
	HelpId = HID_OPTIONS_CTL ;
	OutputSize = TRUE ;
	Size = MAP_APPFONT ( 260, 185 ) ;
	SVLook = TRUE ;
	Hide = TRUE ;
	Text [ en-US ] = "Complex Text Layout" ;
	FixedLine FL_SEQUENCECHECKING
	{
		Pos = MAP_APPFONT ( 6, ROW_0 ) ;
		Size = MAP_APPFONT ( 248, RSC_CD_FIXEDLINE_HEIGHT ) ;
		Text [ en-US ] = "Sequence checking" ;
	};
	CheckBox CB_SEQUENCECHECKING
	{
		HelpID = "cui:CheckBox:RID_SVXPAGE_OPTIONS_CTL:CB_SEQUENCECHECKING" ;
		Pos = MAP_APPFONT ( 12, ROW_1 ) ;
		Size = MAP_APPFONT ( 236, RSC_CD_CHECKBOX_HEIGHT ) ;
		Text [ en-US ] = "Use se~quence checking" ;
	};
	CheckBox CB_RESTRICTED
	{
		HelpID = "cui:CheckBox:RID_SVXPAGE_OPTIONS_CTL:CB_RESTRICTED" ;
		Pos = MAP_APPFONT ( 18, ROW_2 ) ;
		Size = MAP_APPFONT ( 236, RSC_CD_CHECKBOX_HEIGHT );
		Text [ en-US ] = "Restricted" ;
	};
	CheckBox CB_TYPE_REPLACE
	{
		HelpID = "cui:CheckBox:RID_SVXPAGE_OPTIONS_CTL:CB_TYPE_REPLACE" ;
		Pos = MAP_APPFONT ( 18, ROW_2 + RSC_CD_CHECKBOX_HEIGHT + RSC_SP_FLGR_SPACE_Y ) ;
		Size = MAP_APPFONT ( 236, RSC_CD_CHECKBOX_HEIGHT ) ;
		Text [ en-US ] = "~Type and replace" ;
	};
	FixedLine FL_CURSORCONTROL
	{
		Pos = MAP_APPFONT ( 6, ROW_3 ) ;
		Size = MAP_APPFONT ( 248, RSC_CD_FIXEDLINE_HEIGHT ) ;
		Text [ en-US ] = "Cursor control" ;
	};
	FixedText FT_MOVEMENT
	{
		Pos = MAP_APPFONT ( 12, ROW_5 ) ;
		Size = MAP_APPFONT ( 90, RSC_CD_FIXEDTEXT_HEIGHT ) ;
		Text [ en-US ] = "Movement" ;
	};
	RadioButton RB_MOVEMENT_LOGICAL
	{
		HelpID = "cui:RadioButton:RID_SVXPAGE_OPTIONS_CTL:RB_MOVEMENT_LOGICAL" ;
		Pos = MAP_APPFONT ( 105, ROW_4 ) ;
		Size = MAP_APPFONT ( 69, RSC_CD_RADIOBUTTON_HEIGHT ) ;
		Text [ en-US ] = "Lo~gical" ;
	};
	RadioButton RB_MOVEMENT_VISUAL
	{
		HelpID = "cui:RadioButton:RID_SVXPAGE_OPTIONS_CTL:RB_MOVEMENT_VISUAL" ;
		Pos = MAP_APPFONT ( 177, ROW_4 ) ;
		Size = MAP_APPFONT ( 69, RSC_CD_RADIOBUTTON_HEIGHT ) ;
		Text [ en-US ] = "~Visual" ;
	};
	FixedLine FL_GENERAL
	{
		Pos = MAP_APPFONT ( 6, ROW_6 ) ;
		Size = MAP_APPFONT ( 248, RSC_CD_FIXEDLINE_HEIGHT ) ;
		Text [ en-US ] = "General options" ;
	};
	FixedText FT_NUMERALS
	{
		Pos = MAP_APPFONT ( 12, ROW_8 ) ;
		Size = MAP_APPFONT ( 90, RSC_CD_FIXEDTEXT_HEIGHT ) ;
		Text [ en-US ] = "~Numerals" ;
	};
	ListBox LB_NUMERALS
	{
		HelpID = "cui:ListBox:RID_SVXPAGE_OPTIONS_CTL:LB_NUMERALS" ;
		Pos = MAP_APPFONT ( 105, ROW_7 ) ;
		Size = MAP_APPFONT ( 69, 3 * RSC_CD_DROPDOWN_HEIGHT ) ;
		DropDown = TRUE ;
		Border = TRUE ;
		StringList [ en-US ] =
		{
			< "Arabic" ;	> ;
			< "Hindi" ;		> ;
			< "System" ;	> ;
			< "Context" ;	> ;
		};
	};
};

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