/**************************************************************
 *
 * 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 "javaedit.hrc"
#include "fldui.hrc"
#include "helpid.h"
// pragma ----------------------------------------------------------------

// RID_SVXDLG_POSTIT -----------------------------------------------------
ModalDialog DLG_JAVAEDIT
{
	HelpID = "sw:ModalDialog:DLG_JAVAEDIT" ;
	OutputSize = TRUE ;
	SvLook = TRUE ;
	Size = MAP_APPFONT ( 248, 157 ) ;
	Moveable = TRUE ;
	FixedText FT_TYPE
	{
		Pos = MAP_APPFONT ( 12, 15 ) ;
		Size = MAP_APPFONT ( 55, 10 ) ;
		Text [ en-US ] = "Script type" ;
	};
	Edit ED_TYPE
	{
		HelpID = "sw:Edit:DLG_JAVAEDIT:ED_TYPE" ;
		Border = TRUE ;
		Text = "JavaScript" ;
		// Do not translate!!!
		Pos = MAP_APPFONT ( 70, 14 ) ;
		Size = MAP_APPFONT ( 87, 12 ) ;
		TabStop = TRUE ;
	};
	RadioButton RB_URL
	{
		HelpID = "sw:RadioButton:DLG_JAVAEDIT:RB_URL" ;
		Pos = MAP_APPFONT ( 12, 28 ) ;
		Size = MAP_APPFONT ( 55, 10 ) ;
		TabStop = TRUE ;
		Text [ en-US ] = "URL" ;
	};
	Edit ED_URL
	{
		HelpID = "sw:Edit:DLG_JAVAEDIT:ED_URL" ;
		Border = TRUE ;
		Pos = MAP_APPFONT ( 70, 27 ) ;
		Size = MAP_APPFONT ( 87, 12 ) ;
		TabStop = TRUE ;
	};
	PushButton PB_URL
	{
		HelpID = "sw:PushButton:DLG_JAVAEDIT:PB_URL" ;
		Pos = MAP_APPFONT ( 163, 26 ) ;
		Size = MAP_APPFONT ( 14, 14 ) ;
		Text = "~..." ;
		TabStop = TRUE ;
	};
	RadioButton RB_EDIT
	{
		HelpID = "sw:RadioButton:DLG_JAVAEDIT:RB_EDIT" ;
		Pos = MAP_APPFONT ( 12, 40 ) ;
		Size = MAP_APPFONT ( 140, 10 ) ;
		Text [ en-US ] = "~Text" ;
		TabStop = TRUE ;
		Check = TRUE ;
	};
	MultiLineEdit ED_EDIT
	{
		HelpID = "sw:MultiLineEdit:DLG_JAVAEDIT:ED_EDIT" ;
		Border = TRUE ;
		Pos = MAP_APPFONT ( 23, 54 ) ;
		Size = MAP_APPFONT ( 155, 91 ) ;
		Left = TRUE ;
		VScroll = TRUE ;
		HScroll = TRUE ;
		IgnoreTab = TRUE ;
		TabStop = TRUE ;
	};
	FixedLine FL_POSTIT
	{
		Pos = MAP_APPFONT ( 6, 3 ) ;
		Size = MAP_APPFONT ( 179, 8 ) ;
		Text [ en-US ] = "Contents" ;
	};
	OKButton BTN_POST_OK
	{
		Pos = MAP_APPFONT ( 191, 6 ) ;
		Size = MAP_APPFONT ( 50, 15 ) ;
		DefButton = TRUE ;
	};
	CancelButton BTN_POST_CANCEL
	{
		Pos = MAP_APPFONT ( 191, 23 ) ;
		Size = MAP_APPFONT ( 50, 15 ) ;
	};
	HelpButton BTN_POST_HELP
	{
		Pos = MAP_APPFONT ( 191, 40 ) ;
		Size = MAP_APPFONT ( 50, 15 ) ;
	};
	ImageButton BTN_PREV
	{
		HelpID = "sw:ImageButton:DLG_JAVAEDIT:BTN_PREV" ;
		Pos = MAP_APPFONT ( 191, 60 ) ;
		Size = MAP_APPFONT ( 24, 14 ) ;
		Symbol = IMAGEBUTTON_ARROW_LEFT ;
	};
	ImageButton BTN_NEXT
	{
		HelpID = "sw:ImageButton:DLG_JAVAEDIT:BTN_NEXT" ;
		Pos = MAP_APPFONT ( 217, 60 ) ;
		Size = MAP_APPFONT ( 24, 14 ) ;
		Symbol = IMAGEBUTTON_ARROW_RIGHT ;
	};
	// local strings
	String STR_JAVA_EDIT
	{
		Text [ en-US ] = "Edit Script" ;
	};
	String STR_JAVA_INSERT
	{
		Text [ en-US ] = "Insert Script" ;
	};
	Text [ en-US ] = "Edit Script" ;
};

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