/**************************************************************
 * 
 * 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 <rubydialog.hrc>
#include "helpid.hrc"
#include <svx/dialogs.hrc>

ModelessDialog RID_SVXDLG_RUBY
{
	OutputSize = TRUE ;
	Hide = TRUE ;
	SVLook = TRUE ;
	HelpId = HID_RUBY_DIALOG;
	Pos = MAP_APPFONT ( 0 , 0 ) ;
    Size = MAP_APPFONT ( 227 , 195 ) ;
    Text [ en-US ] = "Asian Phonetic Guide" ;
	Moveable = TRUE ;
	Closeable = TRUE ;
	CheckBox CB_AUTO_DETECT
	{
	    HelpID = "svx:CheckBox:RID_SVXDLG_RUBY:CB_AUTO_DETECT";
		Pos = MAP_APPFONT ( 6, 6 ) ;
		Size = MAP_APPFONT ( 186 , 12 ) ;
		Text [ en-US ] = "Automatic detection";
	};
    FixedText FT_LEFT
	{
        Pos = MAP_APPFONT ( 6 , 17 ) ;
        Size = MAP_APPFONT ( 80 , 8 ) ;
		Text [ en-US ] = "Base text";
	};
    FixedText FT_RIGHT
	{
        Pos = MAP_APPFONT ( 109 , 17 ) ;
        Size = MAP_APPFONT ( 80 , 8 ) ;
		Text [ en-US ] = "Ruby text";
	};
    Edit ED_LEFT_1
	{
        HelpID = "svx:Edit:RID_SVXDLG_RUBY:ED_LEFT_1";
		Pos = MAP_APPFONT ( 6 , 30 ) ;
        Size = MAP_APPFONT ( 102 , 12 ) ;
		Hide = False;
		Border = TRUE;
	};
	Edit ED_RIGHT_1
	{
	    HelpID = "svx:Edit:RID_SVXDLG_RUBY:ED_RIGHT_1";
        Pos = MAP_APPFONT ( 109 , 30 ) ;
        Size = MAP_APPFONT ( 102 , 12 ) ;
		Border = TRUE;
	};
	Edit ED_LEFT_2
	{
	    HelpID = "svx:Edit:RID_SVXDLG_RUBY:ED_LEFT_2";
		Pos = MAP_APPFONT ( 6 ,  42) ;
        Size = MAP_APPFONT ( 102 , 12 ) ;
		Border = TRUE;
	};
	Edit ED_RIGHT_2
	{
	    HelpID = "svx:Edit:RID_SVXDLG_RUBY:ED_RIGHT_2";
        Pos = MAP_APPFONT ( 109 , 42 ) ;
        Size = MAP_APPFONT ( 102 , 12 ) ;
		Border = TRUE;
	};
	Edit ED_LEFT_3
	{
	    HelpID = "svx:Edit:RID_SVXDLG_RUBY:ED_LEFT_3";
		Pos = MAP_APPFONT ( 6 , 54 ) ;
        Size = MAP_APPFONT ( 102 , 12 ) ;
		Border = TRUE;
	};
	Edit ED_RIGHT_3
	{
	    HelpID = "svx:Edit:RID_SVXDLG_RUBY:ED_RIGHT_3";
        Pos = MAP_APPFONT ( 109 , 54 ) ;
        Size = MAP_APPFONT ( 102 , 12 ) ;
		Border = TRUE;
	};
	Edit ED_LEFT_4
	{
	    HelpID = "svx:Edit:RID_SVXDLG_RUBY:ED_LEFT_4";
		Pos = MAP_APPFONT ( 6 , 66 ) ;
        Size = MAP_APPFONT ( 102 , 12 ) ;
		Border = TRUE;
	};
	Edit ED_RIGHT_4
	{
	    HelpID = "svx:Edit:RID_SVXDLG_RUBY:ED_RIGHT_4";
        Pos = MAP_APPFONT ( 109 , 66 ) ;
        Size = MAP_APPFONT ( 102 , 12 ) ;
		Border = TRUE;
	};
	ScrollBar SB_SCROLL
	{
        Pos = MAP_APPFONT ( 213 , 30 ) ;
		Size = MAP_APPFONT ( 8 , 48 ) ;
		VScroll = TRUE ;
		Drag = TRUE ;
	};
	FixedText FT_ADJUST
	{
		Pos = MAP_APPFONT ( 6 , 82 ) ;
        Size = MAP_APPFONT ( 35 , 8 ) ;
		Text [ en-US ] = "Alignment";
	};
	ListBox LB_ADJUST
	{
	    HelpID = "svx:ListBox:RID_SVXDLG_RUBY:LB_ADJUST";
		Pos = MAP_APPFONT ( 6 , 93) ;
        Size = MAP_APPFONT ( 35 , 60 ) ;
		DropDown = TRUE;
		Border = TRUE;
	StringList [ en-US ] =
	{
			"Left" ;
			"Center" ;
			"Right" ;
			"0 1 0" ;
			"1 2 1" ;
	};
	};
    FixedText FT_POSITION
	{
        Pos = MAP_APPFONT ( 43 , 82 ) ;
        Size = MAP_APPFONT ( 35 , 8 ) ;
    	Text [ en-US ] = "Position";
	};
    ListBox LB_POSITION
	{
        HelpID = "svx:ListBox:RID_SVXDLG_RUBY:LB_POSITION";
        Pos = MAP_APPFONT ( 43 , 93) ;
        Size = MAP_APPFONT ( 35 , 60 ) ;
		DropDown = TRUE;
		Border = TRUE;
	StringList [ en-US ] =
	{
		"Top" ;
		"Bottom" ;
	};
	};
    FixedText FT_CHAR_STYLE
	{
        Pos = MAP_APPFONT ( 80 , 82 ) ;
        Size = MAP_APPFONT ( 141 , 8 ) ;
		Text [ en-US ] = "Character Style for ruby text";
	};
	ListBox LB_CHAR_STYLE
	{
	    HelpID = "svx:ListBox:RID_SVXDLG_RUBY:LB_CHAR_STYLE";
        Pos = MAP_APPFONT ( 80 , 93) ;
        Size = MAP_APPFONT ( 89 , 60 ) ;
		DropDown = TRUE;
		Border = TRUE;
        Sort = TRUE;
    };
	PushButton PB_STYLIST
	{
	    HelpID = "svx:PushButton:RID_SVXDLG_RUBY:PB_STYLIST";
        Pos = MAP_APPFONT ( 171 , 92 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		Text [ en-US ] = "Styles";
	};
	FixedText FT_PREVIEW
	{
		Pos = MAP_APPFONT ( 6, 110 ) ;
		Size = MAP_APPFONT ( 195 , 8 ) ;
		Text [ en-US ] = "Preview:";
	};
	Window WIN_PREVIEW
	{
		Pos = MAP_APPFONT ( 6 , 121 ) ;
		Size = MAP_APPFONT ( 215 , 50 ) ;
		Border = TRUE ;
	};
	OKButton PB_APPLY
	{
        DefButton = TRUE;
        Pos = MAP_APPFONT ( 65 , 175 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		Text [ en-US ] = "~Apply";
	};
	PushButton PB_CLOSE
	{
	    HelpID = "svx:PushButton:RID_SVXDLG_RUBY:PB_CLOSE";
        Pos = MAP_APPFONT (  118, 175 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		Text [ en-US ] = "~Close";
	};
	HelpButton PB_HELP
	{
        Pos = MAP_APPFONT ( 171 , 175 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
	};
};

