/**************************************************************
 *
 * 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 "optcomp.hrc"
#include "globals.hrc"
#include "helpid.h"

// TabPage TP_OPTCOMPATIBILITY_PAGE --------------------------------------

TabPage TP_OPTCOMPATIBILITY_PAGE
{
	HelpID = HID_OPTCOMPATIBILITY_PAGE ;
	Size = MAP_APPFONT ( 260, 185 ) ;
	Hide = TRUE ;
	FixedLine FL_MAIN
	{
		Pos = MAP_APPFONT ( 6, 3 ) ;
		Size = MAP_APPFONT ( 248, 8 ) ;
		Text [ en-US ] = "Compatibility options for %DOCNAME" ;
	};
	FixedText FT_FORMATTING
	{
		Pos = MAP_APPFONT ( 12, 14 ) ;
		Size = MAP_APPFONT ( 236, 8 ) ;
		Text [ en-US ] = "Recommended ~formatting options for" ;
	};
	ListBox LB_FORMATTING
	{
		HelpID = "sw:ListBox:TP_OPTCOMPATIBILITY_PAGE:LB_FORMATTING" ;
		Pos = MAP_APPFONT ( 12, 25 ) ;
		Size = MAP_APPFONT ( 118, 24 ) ;
		DropDown = TRUE ;
	};
	FixedText FT_OPTIONS
	{
		Pos = MAP_APPFONT ( 12, 40 ) ;
		Size = MAP_APPFONT ( 236, 8 ) ;
		Text [ en-US ] = "~Options" ;
	};
	Control LB_OPTIONS
	{
		HelpId = HID_COMPATIBILITY_OPTIONS_BOX ;
		Pos = MAP_APPFONT ( 12, 51 ) ;
		Size = MAP_APPFONT ( 236, 108 ) ;
		Border = TRUE ;
		TabStop = TRUE ;
	};
	PushButton PB_RESET
	{
		HelpID = "sw:PushButton:TP_OPTCOMPATIBILITY_PAGE:PB_RESET" ;
		Pos = MAP_APPFONT ( 125, 165 ) ;
		Size = MAP_APPFONT ( 60, 14 ) ;
		Text [ en-US ] = "~Reset" ;
	};
	PushButton PB_DEFAULT
	{
		HelpID = "sw:PushButton:TP_OPTCOMPATIBILITY_PAGE:PB_DEFAULT" ;
		Pos = MAP_APPFONT ( 188, 165 ) ;
		Size = MAP_APPFONT ( 60, 14 ) ;
		Text [ en-US ] = "Use as ~Default" ;
	};

	String STR_USERENTRY
	{
		Text [ en-US ] = "<User settings>" ;
	};

	String STR_QRYBOX_USEASDEFAULT
	{
		Text [ en-US ] = "Do you want to change the compatibility options of the default template?\nThis will affect all new documents based on the default template." ;
	};

// the option strings ----------------------------------------------------

	String STR_PRINTER_METRICS
	{
		Text [ en-US ] = "Use printer metrics for document formatting" ;
	};
	String STR_MERGE_PARA_DIST
	{
		Text [ en-US ] = "Add spacing between paragraphs and tables (in current document)" ;
	};
	String STR_MERGE_PARA_DIST_PAGESTART
	{
		Text [ en-US ] = "Add paragraph and table spacing at tops of pages (in current document)" ;
	};
	String STR_TAB_ALIGNMENT
	{
		Text [ en-US ] = "Use %WRITERCOMPATIBILITYVERSIONOOO11 tabstop formatting" ;
	};
	String STR_EXTERNAL_LEADING
	{
		Text [ en-US ] = "Do not add leading (extra space) between lines of text" ;
	};
	String STR_LINE_SPACING
	{
		Text [ en-US ] = "Use %WRITERCOMPATIBILITYVERSIONOOO11 line spacing" ;
	};
	String STR_ADD_TABLESPACING
	{
		Text [ en-US ] = "Add paragraph and table spacing at bottom of table cells" ;
	};
	String STR_USE_OBJPOSITIONING
	{
		Text [ en-US ] = "Use %WRITERCOMPATIBILITYVERSIONOOO11 object positioning" ;
	};
	String STR_USE_OURTEXTWRAPPING
	{
		Text [ en-US ] = "Use %WRITERCOMPATIBILITYVERSIONOOO11 text wrapping around objects" ;
	};
	String STR_CONSIDER_WRAPPINGSTYLE
	{
		Text [ en-US ] = "Consider wrapping style when positioning objects" ;
	};
	String STR_EXPAND_WORDSPACE
	{
		Text [ en-US ] = "Expand word space on lines with manual line breaks in justified paragraphs" ;
	};
};

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