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

#include "fontsubs.hrc"
#include "helpid.hrc"

 // pragma -------------------------------------------------------------------




/**************************************************************************/
/*                                                                        */
/*                                                                        */
/*                                                                        */
/**************************************************************************/

TabPage RID_SVX_FONT_SUBSTITUTION
{
	HelpID = HID_OFA_FONT_SUBSTITUTION ;
	SVLook = TRUE ;
	Hide = TRUE ;
	Size = MAP_APPFONT ( 260 , 185 ) ;
	CheckBox CB_USETABLE
	{
	    HelpID = "cui:CheckBox:RID_SVX_FONT_SUBSTITUTION:CB_USETABLE";
		Pos = MAP_APPFONT ( 6 , 6 ) ;
		Size = MAP_APPFONT ( 248 , 10 ) ;
		TabStop = TRUE ;
		Text [ en-US ] = "~Apply replacement table";
	};
    FixedText FT_FONT1
	{
        Pos = MAP_APPFONT ( 6 , 20 ) ;
		Size = MAP_APPFONT ( 100 , 8 ) ;
		Left = TRUE ;
		Text [ en-US ] = "~Font";
	};
	ComboBox CB_FONT1
	{
	    HelpID = "cui:ComboBox:RID_SVX_FONT_SUBSTITUTION:CB_FONT1";
		Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 33 ) ;
		Size = MAP_APPFONT ( 100 , 100 ) ;
		TabStop = TRUE ;
		AutoSize = TRUE ;
		AutoHScroll = TRUE ;
		DDExtraWidth = TRUE ;
		DropDown = TRUE;
        Sort = TRUE;
	};
	FixedText FT_FONT2
	{
        Pos = MAP_APPFONT ( 110 , 20 ) ;
		Size = MAP_APPFONT ( 100 , 8 ) ;
		Left = TRUE ;
		Text [ en-US ] = "Re~place with";
	};
	ComboBox CB_FONT2
	{
	    HelpID = "cui:ComboBox:RID_SVX_FONT_SUBSTITUTION:CB_FONT2";
		Border = TRUE ;
        Pos = MAP_APPFONT ( 110 , 33 ) ;
		Size = MAP_APPFONT ( 100 , 100 ) ;
		TabStop = TRUE ;
		AutoSize = TRUE ;
		AutoHScroll = TRUE ;
		DDExtraWidth = TRUE ;
		DropDown = TRUE;
        Sort = TRUE;
	};
	ImageList IL_ICON
	{
        Prefix = "nu";
		MaskColor = Color { Red = 0xFFFF ; Green = 0x0000 ; Blue = 0xFFFF ; };
		IdList =
		{
			BT_SUBSTAPPLY ;
			BT_SUBSTDELETE ;
		};
		IdCount = { 2 ; };
	};
	ToolBox TBX_SUBSTNEWDEL
	{
        Pos = MAP_APPFONT ( 214 , 33 ) ;
		SVLook = TRUE ;
		Border = FALSE ;
		ItemList =
		{
			ToolBoxItem
			{
				Identifier = BT_SUBSTAPPLY ;
				HelpID = HID_OFA_SUBST_APPLY ;
				Text [ en-US ] = "Apply" ;
			};
			ToolBoxItem
			{
				Identifier = BT_SUBSTDELETE ;
				HelpID = HID_OFA_SUBST_DELETE ;
				Text [ en-US ] = "Delete" ;
			};
		};
	};
    Control CLB_SUBSTITUTES
	{
        Pos = MAP_APPFONT ( 6 , 48 ) ;
        Size = MAP_APPFONT ( 248 , 75 ) ;
		Border = TRUE ;
		TabStop = TRUE ;
	};
    FixedLine FL_SOURCEVIEW
    {
        Pos = MAP_APPFONT ( 6 , 129 ) ;
        Size = MAP_APPFONT ( 248 , 8 ) ;
        Text [ en-US ] = "Font settings for HTML, Basic and SQL sources" ;
	};
    FixedText FT_FONTNAME
    {
        Pos = MAP_APPFONT ( 6 , 142 ) ;
        Size = MAP_APPFONT ( 57 , 8 ) ;
        Text [ en-US ] = "Fonts" ;
	};
    ListBox LB_FONTNAME
    {
        HelpID = "cui:ListBox:RID_SVX_FONT_SUBSTITUTION:LB_FONTNAME";
        Pos = MAP_APPFONT ( 65 , 140 ) ;
        Size = MAP_APPFONT ( 100 , 68 ) ;
		Border = TRUE ;
		TabStop = TRUE ;
        DropDown = TRUE;
	};
    CheckBox  CB_NONPROP
    {
        HelpID = "cui:CheckBox:RID_SVX_FONT_SUBSTITUTION:CB_NONPROP";
        Pos = MAP_APPFONT ( 65 , 155 ) ;
        Size = MAP_APPFONT ( 180 , 10 ) ;
		TabStop = TRUE ;
        Text [ en-US ] = "Non-proportional fonts only" ;
	};
    FixedText FT_FONTHEIGHT
    {
        Pos = MAP_APPFONT ( 6 , 171 ) ;
        Size = MAP_APPFONT ( 57 , 8 ) ;
        Text [ en-US ] ="~Size";
	};
    ListBox LB_FONTHEIGHT
    {
        HelpID = "cui:ListBox:RID_SVX_FONT_SUBSTITUTION:LB_FONTHEIGHT";
        Pos = MAP_APPFONT ( 65 , 169 ) ;
        Size = MAP_APPFONT ( 30 , 68 ) ;
		Border = TRUE ;
		TabStop = TRUE ;
        DropDown = TRUE;
    };
    String STR_HEADER1
	{
		Text [ en-US ] = "Always";
	};
	String STR_HEADER2
	{
		Text [ en-US ] = "Screen only";
	};
	String STR_HEADER3
	{
		Text [ en-US ] = "Font";
	};
	String STR_HEADER4
	{
		Text [ en-US ] = "Replace with";
	};
    String STR_AUTOMATIC
    {
        Text [ en-US ] = "Automatic";
	};
};

