/**************************************************************
 *
 * 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.
 *
 *************************************************************/

#ifndef _EXTENSIONS_FORMCTRLR_PROPRESID_HRC_
#include "formresid.hrc"
#endif
#include "propctrlr.hrc"
#ifndef EXTENSIONS_SOURCE_PROPCTRLR_FORMLINKDIALOG_HRC
#include "formlinkdialog.hrc"
#endif

ModalDialog RID_DLG_FORMLINKS
{
	HelpID = "extensions:ModalDialog:RID_DLG_FORMLINKS" ;
	OutputSize = TRUE ;
	Moveable = TRUE ;
	Closeable = TRUE ;
	SVLook = TRUE ;
	Size = MAP_APPFONT ( 252, 110 ) ;

	Text [ en-US ] = "Link fields" ;

	FixedText FT_EXPLANATION
	{
		Pos = MAP_APPFONT ( 6, 6 ) ;
		Size = MAP_APPFONT ( 187, 24 ) ;

		WordBreak = TRUE ;

		Text [ en-US ] = "Sub forms can be used to display detailed data about the current record of the master form. To do this, you can specify which columns in the sub form match which columns in the master form." ;
	};

	FixedText FT_DETAIL_LABEL
	{
		Pos = MAP_APPFONT ( 6, 36 ) ;
		Size = MAP_APPFONT ( 85, 8 ) ;
	};

	FixedText FT_MASTER_LABEL
	{
		Pos = MAP_APPFONT ( 102, 36 ) ;
		Size = MAP_APPFONT ( 85, 8 ) ;
	};

#define ROW( n ) \
	Window n \
	{ \
		Pos = MAP_APPFONT ( 6, 47 + 15 * ( n - 1 ) ) ;	\
		Size = MAP_APPFONT ( 181, 13 ) ;				\
														\
		Hide = FALSE ;									\
		DialogControl = TRUE ;							\
														\
		ComboBox 1										\
		{												\
			Pos = MAP_APPFONT ( 0, 0 ) ;				\
			Size = MAP_APPFONT ( 85, 12 ) ;				\
														\
			DropDown = TRUE ;							\
			TabStop = TRUE ;							\
														\
			HelpId = HID_FIELDLINK_DETAIL_COLUMN ;		\
			UniqueId = UID_FIELDLINK_DETAIL#n ;			\
		};												\
		FixedText 1										\
		{												\
			Pos = MAP_APPFONT ( 85, 0 ) ;				\
			Size = MAP_APPFONT ( 10, 12 ) ;				\
			Center = TRUE ;								\
		};												\
		ComboBox 2										\
		{												\
			Pos = MAP_APPFONT ( 95, 0 ) ;				\
			Size = MAP_APPFONT ( 85, 12 ) ;				\
														\
			DropDown = TRUE ;							\
			TabStop = TRUE ;							\
														\
			HelpId = HID_FIELDLINK_MASTER_COLUMN ;		\
			UniqueId = UID_FIELDLINK_MASTER#n ;			\
		};												\
	}

	ROW( 1 ) ;
	ROW( 2 ) ;
	ROW( 3 ) ;
	ROW( 4 ) ;

	OKButton PB_OK
	{
		Pos = MAP_APPFONT ( 199, 6 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		TabStop = TRUE ;
		DefButton = TRUE ;
	};

	CancelButton PB_CANCEL
	{
		Pos = MAP_APPFONT ( 199, 23 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		TabStop = TRUE ;
	};

	HelpButton PB_HELP
	{
		Pos = MAP_APPFONT ( 199, 43 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		TabStop = TRUE ;
	};

	PushButton PB_SUGGEST
	{
		HelpID = "extensions:PushButton:RID_DLG_FORMLINKS:PB_SUGGEST" ;
		Pos = MAP_APPFONT ( 199, 90 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		TabStop = TRUE ;
		Hide = FALSE ;
		Disable = TRUE ;

		Text [ en-US ] = "Suggest" ;
	};

	String STR_DETAIL_FORM
	{
		Text [ en-US ] = "Sub Form" ;
	};

	String STR_MASTER_FORM
	{
		Text [ en-US ] = "Master Form" ;
	};

	String STR_ERROR_RETRIEVING_COLUMNS
	{
		Text [ en-US ] = "The columns of '#' could not be retrieved." ;
	};
};

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