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

// RID_SVXDLG_MULTIPATH --------------------------------------------------

ModalDialog RID_SVXDLG_MULTIPATH
{
	HelpId = HID_MULTIPATH ;
	OutputSize = TRUE ;
	Size = MAP_APPFONT ( 260, 120 ) ;
	Text [ en-US ] = "Select Paths" ;
	Moveable = TRUE ;
	Closeable = TRUE ;
	FixedLine FL_MULTIPATH
	{
		Pos = MAP_APPFONT ( 6, 3 ) ;
		Size = MAP_APPFONT ( 248, 8 ) ;
		Text [ en-US ] = "Paths" ;
	};
	ListBox LB_MULTIPATH
	{
		HelpID = "cui:ListBox:RID_SVXDLG_MULTIPATH:LB_MULTIPATH" ;
		Border = TRUE ;
		Pos = MAP_APPFONT ( 12, 14 ) ;
		Size = MAP_APPFONT ( 189, 80 ) ;
		AutoHScroll = TRUE ;
	};
	Control LB_RADIOBUTTON
	{
		HelpId = HID_OPTIONS_MULTIPATH_LIST ;
		Hide = TRUE ;
		Border = TRUE ;
		Pos = MAP_APPFONT ( 6, 6 ) ;
		Size = MAP_APPFONT ( 195, 77 ) ;
	};
	FixedText FT_RADIOBUTTON
	{
		Hide = TRUE ;
		NoLabel = TRUE ;
		Pos = MAP_APPFONT ( 6, 86 ) ;
		Size = MAP_APPFONT ( 195, 8 ) ;
		Text [ en-US ] = "Mark the default path for new files." ;
	};
	PushButton BTN_ADD_MULTIPATH
	{
		HelpID = "cui:PushButton:RID_SVXDLG_MULTIPATH:BTN_ADD_MULTIPATH" ;
		Pos = MAP_APPFONT ( 204, 14 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		Text [ en-US ] = "~Add..." ;
	};
	PushButton BTN_DEL_MULTIPATH
	{
		HelpID = "cui:PushButton:RID_SVXDLG_MULTIPATH:BTN_DEL_MULTIPATH" ;
		Pos = MAP_APPFONT ( 204, 31 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		Text [ en-US ] = "~Delete" ;
	};
	OKButton BTN_MULTIPATH_OK
	{
		Pos = MAP_APPFONT ( 95, 100 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		DefButton = TRUE;
	};
	CancelButton BTN_MULTIPATH_CANCEL
	{
		Pos = MAP_APPFONT ( 148, 100 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
	};
	HelpButton BTN_MULTIPATH_HELP
	{
		Pos = MAP_APPFONT ( 204, 100 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
	};
	String STR_HEADER_PATHS
	{
		Text [ en-US ] = "Path list" ;
	};
};
String RID_MULTIPATH_DBL_ERR
{
	Text [ en-US ] = "The path %1 already exists." ;
};
String RID_SVXSTR_FILE_TITLE
{
	Text [ en-US ] = "Select files" ;
};
String RID_SVXSTR_FILE_HEADLINE
{
	Text [ en-US ] = "Files" ;
};
String RID_SVXSTR_ARCHIVE_TITLE
{
	Text [ en-US ] = "Select Archives" ;
};
String RID_SVXSTR_ARCHIVE_HEADLINE
{
	Text [ en-US ] = "Archives" ;
};
String RID_SVXSTR_MULTIFILE_DBL_ERR
{
	Text [ en-US ] = "The file %1 already exists." ;
};

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