/**************************************************************
 * 
 * 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." ;
};

