/**************************************************************
 *
 * 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 "dbnamdlg.hrc"
ModelessDialog RID_SCDLG_DBNAMES
{
	OutputSize = TRUE ;
	HelpId = CMD_SID_DEFINE_DBNAME ;
	Hide = TRUE ;
	SVLook = TRUE ;
	Size = MAP_APPFONT ( 222 , 142 ) ;
	Text [ en-US ] = "Define Database Range" ;
	Moveable = TRUE ;
	 // Closeable = TRUE;	// Dieser Dialog hat einen Cancel-Button !
    FixedLine FL_NAME
	{
		Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 154 , 8 ) ;
		Text [ en-US ] = "Na~me" ;
	};
	ComboBox ED_NAME
	{
	    HelpID = "sc:ComboBox:RID_SCDLG_DBNAMES:ED_NAME";
		Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 145 , 92 ) ;
		TabStop = TRUE ;
		VScroll = TRUE ;
	};
    FixedLine FL_ASSIGN
	{
        Pos = MAP_APPFONT ( 6 , 112 ) ;
        Size = MAP_APPFONT ( 154 , 8 ) ;
		Text [ en-US ] = "~Range" ;
	};
	Edit ED_DBAREA
	{
	    HelpID = "sc:Edit:RID_SCDLG_DBNAMES:ED_DBAREA";
		Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 123 ) ;
        Size = MAP_APPFONT ( 131 , 12 ) ;
		TabStop = TRUE ;
	};
	ImageButton RB_DBAREA
	{
	    HelpID = "sc:ImageButton:RID_SCDLG_DBNAMES:RB_DBAREA";
        Pos = MAP_APPFONT ( 145 , 122 ) ;
		Size = MAP_APPFONT ( 13 , 15 ) ;
		TabStop = FALSE ;
		QuickHelpText [ en-US ] = "Shrink" ;
	};
    FixedLine FL_OPTIONS
	{
		Hide = TRUE ;
		Pos = MAP_APPFONT ( 6 , 142 ) ;
        Size = MAP_APPFONT ( 154 , 8 ) ;
		Text [ en-US ] = "Options" ;
	};
	CheckBox BTN_HEADER
	{
	    HelpID = "sc:CheckBox:RID_SCDLG_DBNAMES:BTN_HEADER";
		Hide = TRUE ;
        Pos = MAP_APPFONT ( 12 , 153 ) ;
        Size = MAP_APPFONT ( 145 , 10 ) ;
		TabStop = TRUE ;
		Text [ en-US ] = "Co~ntains column labels" ;
	};
	CheckBox BTN_SIZE
	{
	    HelpID = "sc:CheckBox:RID_SCDLG_DBNAMES:BTN_SIZE";
		Hide = TRUE ;
		Pos = MAP_APPFONT ( 12 , 167 ) ;
        Size = MAP_APPFONT ( 145 , 10 ) ;
		TabStop = TRUE ;
		Text [ en-US ] = "Insert or delete ~cells" ;
	};
	CheckBox BTN_FORMAT
	{
	    HelpID = "sc:CheckBox:RID_SCDLG_DBNAMES:BTN_FORMAT";
		Hide = TRUE ;
        Pos = MAP_APPFONT ( 12 , 181 ) ;
        Size = MAP_APPFONT ( 145 , 10 ) ;
		TabStop = TRUE ;
		Text [ en-US ] = "Keep ~formatting" ;
	};
	CheckBox BTN_STRIPDATA
	{
	    HelpID = "sc:CheckBox:RID_SCDLG_DBNAMES:BTN_STRIPDATA";
		Hide = TRUE ;
        Pos = MAP_APPFONT ( 12 , 195 ) ;
        Size = MAP_APPFONT ( 145 , 10 ) ;
		TabStop = TRUE ;
		Text [ en-US ] = "Don't save ~imported data" ;
	};
	FixedText FT_SOURCE
	{
		Hide = TRUE ;
        Pos = MAP_APPFONT ( 12 , 209 ) ;
        Size = MAP_APPFONT ( 145 , 8 ) ;
		Text [ en-US ] = "Source:" ;
	};
	FixedText FT_OPERATIONS
	{
		Hide = TRUE ;
        Pos = MAP_APPFONT ( 12 , 221 ) ;
        Size = MAP_APPFONT ( 145 , 8 ) ;
		Text [ en-US ] = "Operations:" ;
	};
	OKButton BTN_OK
	{
		Pos = MAP_APPFONT ( 166 , 6 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		TabStop = TRUE ;
	};
	CancelButton BTN_CANCEL
	{
		Pos = MAP_APPFONT ( 166 , 23 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		TabStop = TRUE ;
	};
	PushButton BTN_ADD
	{
	    HelpID = "sc:PushButton:RID_SCDLG_DBNAMES:BTN_ADD";
        Pos = MAP_APPFONT ( 166 , 74 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		Text [ en-US ] = "~Add" ;
		TabStop = TRUE ;
		DefButton = TRUE ;
	};
	PushButton BTN_REMOVE
	{
	    HelpID = "sc:PushButton:RID_SCDLG_DBNAMES:BTN_REMOVE";
        Pos = MAP_APPFONT ( 166 , 92 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		Text [ en-US ] = "~Delete" ;
		TabStop = TRUE ;
	};
	HelpButton BTN_HELP
	{
		Pos = MAP_APPFONT ( 166 , 43 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		TabStop = TRUE ;
	};
	MoreButton BTN_MORE
	{
	    HelpID = "sc:MoreButton:RID_SCDLG_DBNAMES:BTN_MORE";
        Pos = MAP_APPFONT ( 166 , 122 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		TabStop = TRUE ;
		MapUnit = MAP_APPFONT ;
        Delta = 93 ;
	};
	String STR_ADD
	{
		Text [ en-US ] = "~Add" ;
	};
	String STR_MODIFY
	{
		Text [ en-US ] = "M~odify" ;
	};
	String STR_DB_INVALID
	{
		Text [ en-US ] = "Invalid range" ;
	};
};
