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

// RID_SVXPAGE_OPTIONS_JAVA ----------------------------------------------

TabPage RID_SVXPAGE_OPTIONS_JAVA
{
	HelpId = HID_OPTIONS_JAVA ;
	OutputSize = TRUE ;
	SVLook = TRUE ;
	Hide = TRUE ;
	Size = MAP_APPFONT ( 260, 185 ) ;
	Text [ en-US ] = "Java" ;

	FixedLine FL_JAVA
	{
		Pos = MAP_APPFONT ( 6, 3 ) ;
		Size = MAP_APPFONT ( 248, 8 ) ;
		Text [ en-US ] = "Java options" ;
	};
	CheckBox CB_JAVA_ENABLE
	{
		HelpID = "cui:CheckBox:RID_SVXPAGE_OPTIONS_JAVA:CB_JAVA_ENABLE" ;
		Pos = MAP_APPFONT ( 12, 14 ) ;
		Size = MAP_APPFONT ( 242, 10 ) ;
		Text [ en-US ] = "~Use a Java runtime environment" ;
	};
	FixedText FT_JAVA_FOUND
	{
		Pos = MAP_APPFONT ( 21, 27 ) ;
		Size = MAP_APPFONT ( 233, 8 ) ;
		Text [ en-US ] = "~Java runtime environments (JRE) already installed:" ;
	};
	Control LB_JAVA
	{
		Pos = MAP_APPFONT ( 21, 38 ) ;
		Size = MAP_APPFONT ( 177, 130 ) ;
		Border = TRUE ;
		TabStop = TRUE ;
	};
	FixedText FT_JAVA_PATH
	{
		Pos = MAP_APPFONT ( 21, 171 ) ;
		Size = MAP_APPFONT ( 233, 8 ) ;
		NoLabel = TRUE ;
	};
	PushButton PB_ADD
	{
		HelpID = "cui:PushButton:RID_SVXPAGE_OPTIONS_JAVA:PB_ADD" ;
		Pos = MAP_APPFONT ( 204, 38 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		Text [ en-US ] = "~Add..." ;
	};
	PushButton PB_PARAMETER
	{
		HelpID = "cui:PushButton:RID_SVXPAGE_OPTIONS_JAVA:PB_PARAMETER" ;
		Pos = MAP_APPFONT ( 204, 55 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		Text [ en-US ] = "~Parameters..." ;
	};
	PushButton PB_CLASSPATH
	{
		HelpID = "cui:PushButton:RID_SVXPAGE_OPTIONS_JAVA:PB_CLASSPATH" ;
		Pos = MAP_APPFONT ( 204, 72 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		Text [ en-US ] = "~Class Path..." ;
	};
	String STR_INSTALLED_IN
	{
		Text [ en-US ] = "Location: " ;
	};
	String STR_ACCESSIBILITY
	{
		Text [ en-US ] = "with accessibility support" ;
	};
	String STR_ADDDLGTEXT
	{
		Text [ en-US ] = "Select a Java Runtime Environment" ;
	};
	String STR_HEADER_VENDOR
	{
		Text [ en-US ] = "Vendor" ;
	};
	String STR_HEADER_VERSION
	{
		Text [ en-US ] = "Version" ;
	};
	String STR_HEADER_FEATURES
	{
		Text [ en-US ] = "Features" ;
	};
};

// RID_SVXDLG_JAVA_PARAMETER ---------------------------------------------

ModalDialog RID_SVXDLG_JAVA_PARAMETER
{
	HelpId = HID_OPTIONS_JAVA_PARAMETER ;
	OutputSize = TRUE ;
	SVLook = TRUE ;
	Size = MAP_APPFONT ( 270, 140 ) ;
	Text [ en-US ] = "Java Start Parameters" ;
	Moveable = TRUE ;
	FixedText FT_PARAMETER
	{
		Pos = MAP_APPFONT ( 6, 3 ) ;
		Size = MAP_APPFONT ( 202, 8 ) ;
		Text [ en-US ] = "Java start ~parameter" ;
	};
	Edit ED_PARAMETER
	{
		HelpID = "cui:Edit:RID_SVXDLG_JAVA_PARAMETER:ED_PARAMETER" ;
		Pos = MAP_APPFONT ( 6, 15 ) ;
		Size = MAP_APPFONT ( 202, 12 ) ;
		Border = TRUE ;
	};
	PushButton PB_ASSIGN
	{
		HelpID = "cui:PushButton:RID_SVXDLG_JAVA_PARAMETER:PB_ASSIGN" ;
		Pos = MAP_APPFONT ( 214, 14 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		Text [ en-US ] = "~Assign" ;
	};
	FixedText FT_ASSIGNED
	{
		Pos = MAP_APPFONT ( 6, 31 ) ;
		Size = MAP_APPFONT ( 202, 8 ) ;
		Text [ en-US ] = "Assig~ned start parameters" ;
	};
	ListBox LB_ASSIGNED
	{
		HelpID = "cui:ListBox:RID_SVXDLG_JAVA_PARAMETER:LB_ASSIGNED" ;
		Border = TRUE ;
		Pos = MAP_APPFONT ( 6, 42 ) ;
		Size = MAP_APPFONT ( 202, 53 ) ;
		AutoHScroll = TRUE ;
	};
	FixedText FT_EXAMPLE
	{
		Pos = MAP_APPFONT ( 6, 98 ) ;
		Size = MAP_APPFONT ( 202, 8 ) ;
		Text [ en-US ] = "For example: -Dmyprop=c:\\program files\\java" ;
	};
	PushButton PB_REMOVE
	{
		HelpID = "cui:PushButton:RID_SVXDLG_JAVA_PARAMETER:PB_REMOVE" ;
		Pos = MAP_APPFONT ( 214, 42 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		Text [ en-US ] = "~Remove" ;
	};
	FixedLine FL_BUTTONS
	{
		Pos = MAP_APPFONT ( 3, 109 ) ;
		Size = MAP_APPFONT ( 264, 8 ) ;
	};
	OKButton PB_PARAMETER_OK
	{
		Pos = MAP_APPFONT ( 105, 120 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		DefButton = TRUE ;
	};
	CancelButton PB_PARAMETER_ESC
	{
		Pos = MAP_APPFONT ( 158, 120 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
	};
	HelpButton PB_PARAMETER_HLP
	{
		Pos = MAP_APPFONT ( 214, 120 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
	};
};

// RID_SVXDLG_JAVA_CLASSPATH ---------------------------------------------

ModalDialog RID_SVXDLG_JAVA_CLASSPATH
{
	HelpId = HID_OPTIONS_JAVA_CLASSPATH ;
	OutputSize = TRUE ;
	SVLook = TRUE ;
	Size = MAP_APPFONT ( 240, 120 ) ;
	Text [ en-US ] = "Class Path" ;
	Moveable = TRUE ;
	FixedText FT_PATH
	{
		Pos = MAP_APPFONT ( 6, 3 ) ;
		Size = MAP_APPFONT ( 172, 8 ) ;
		Text [ en-US ] = "A~ssigned folders and archives" ;
	};
	ListBox LB_PATH
	{
		HelpID = "cui:ListBox:RID_SVXDLG_JAVA_CLASSPATH:LB_PATH" ;
		Pos = MAP_APPFONT ( 6, 14 ) ;
		Size = MAP_APPFONT ( 172, 72 ) ;
		Border = TRUE ;
		AutoHScroll = TRUE ;
	};
	PushButton PB_ADDARCHIVE
	{
		HelpID = "cui:PushButton:RID_SVXDLG_JAVA_CLASSPATH:PB_ADDARCHIVE" ;
		Pos = MAP_APPFONT ( 184, 14 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		Text [ en-US ] = "~Add Archive..." ;
	};
	PushButton PB_ADDPATH
	{
		HelpID = "cui:PushButton:RID_SVXDLG_JAVA_CLASSPATH:PB_ADDPATH" ;
		Pos = MAP_APPFONT ( 184, 31 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		Text [ en-US ] = "Add ~Folder" ;
	};
	PushButton PB_REMOVE_PATH
	{
		HelpID = "cui:PushButton:RID_SVXDLG_JAVA_CLASSPATH:PB_REMOVE_PATH" ;
		Pos = MAP_APPFONT ( 184, 48 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		Text [ en-US ] = "~Remove" ;
	};
	FixedLine FL_PATH_BUTTONS
	{
		Pos = MAP_APPFONT ( 3, 89 ) ;
		Size = MAP_APPFONT ( 236, 8 ) ;
	};
	OKButton PB_PATH_OK
	{
		Pos = MAP_APPFONT ( 75, 100 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		DefButton = TRUE ;
	};
	CancelButton PB_PATH_ESC
	{
		Pos = MAP_APPFONT ( 128, 100 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
	};
	HelpButton PB_PATH_HLP
	{
		Pos = MAP_APPFONT ( 186, 100 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
	};
};

ErrorBox RID_SVXERR_JRE_NOT_RECOGNIZED
{
	BUTTONS = WB_OK ;
	DEFBUTTON = WB_DEF_OK ;
	Message [ en-US ] = "The folder you selected does not contain a Java runtime environment.\nPlease select a different folder." ;
};

ErrorBox RID_SVXERR_JRE_FAILED_VERSION
{
	BUTTONS = WB_OK ;
	DEFBUTTON = WB_DEF_OK ;
	Message [ en-US ] = "The Java runtime environment you selected is not the required version.\nPlease select a different folder." ;
};

WarningBox RID_SVX_MSGBOX_JAVA_RESTART
{
	BUTTONS = WB_OK ;
	DEFBUTTON = WB_DEF_OK ;
	Message [ en-US ] = "For the selected Java runtime environment to work properly, %PRODUCTNAME must be restarted.\nPlease restart %PRODUCTNAME now." ;
};

WarningBox RID_SVX_MSGBOX_JAVA_RESTART2
{
	BUTTONS = WB_OK ;
	DEFBUTTON = WB_DEF_OK ;
	Message [ en-US ] = "You have to restart %PRODUCTNAME so the new or modified values can take effect.\nPlease restart %PRODUCTNAME now." ;
};

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