/**************************************************************
 *
 * 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 _DBU_QRY_HRC_
#include "dbu_qry.hrc"
#endif
#ifndef DBAUI_QUERYDLG_HRC
#include "querydlg.hrc"
#endif
#include "dbaccess_helpid.hrc"

ModalDialog DLG_QRY_JOIN
{
	OutputSize = TRUE ;
	SVLook = TRUE ;
	HelpId = HID_DLG_QRY_JOIN ;
	Size = MAP_APPFONT ( 265, 219 ) ;

	Moveable = TRUE ;
	Closeable = TRUE ;

    Window WND_JOIN_CONTROL
	{
		Pos = MAP_APPFONT( 0, 0 );
		Size = MAP_APPFONT( 203, 44 );
		DialogControl = TRUE;
		HelpId        = HID_DLG_QRY_JOIN_CONTROL ;
        FixedLine FL_JOIN
	    {
		    Pos = MAP_APPFONT ( 6 , 3 ) ;
		    Size = MAP_APPFONT ( 191 , 8 ) ;
		    Text [ en-US ] = "Options";
	    };

	    FixedText FT_LISTBOXTITLE
	    {
		    Pos = MAP_APPFONT ( 12 , 16 ) ;
		    Size = MAP_APPFONT ( 89 , 8 ) ;

		    Text [ en-US ] = "~Type";
	    };

	    ListBox LB_JOINTYPE
	    {
		    Pos             = MAP_APPFONT ( 101 , 15 ) ;
		    Size            = MAP_APPFONT ( 90 , 60 ) ;
		    HelpId          = HID_DLG_QRY_JOINTYPE ;

		    DropDown		= TRUE;
		    DDExtraWidth	= TRUE;
	        StringList [ en-US ] =
	        {
		        < "Inner join"          ; ID_INNER_JOIN;    > ;
		        < "Left join"           ; ID_LEFT_JOIN;     > ;
		        < "Right join"          ; ID_RIGHT_JOIN;    > ;
		        < "Full (outer) join"   ; ID_FULL_JOIN;     > ;
                < "Cross join"          ; ID_CROSS_JOIN;    > ;
	        };
	    };
        CheckBox CB_NATURAL
	    {
            HelpID = "dbaccess:CheckBox:DLG_QRY_JOIN:CB_NATURAL";
		    Pos = MAP_APPFONT ( 101 , 31 ) ;
		    Size = MAP_APPFONT ( 89 , 8 ) ;

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

	Window WND_CONTROL
	{
		Pos = MAP_APPFONT( 0, 0 );
		Size = MAP_APPFONT( 203, 153 );
		DialogControl = TRUE;
		HelpId        = HID_DLG_QRY_WINDOW_CONTROL ;

		FixedLine FL_INVOLVED_TABLES
		{
			Pos = MAP_APPFONT ( 6 , 3 ) ;
			Size = MAP_APPFONT ( 191 , 8 ) ;
			Text [ en-US ] = "Tables involved";
		};

		ListBox LB_LEFT_TABLE
		{
			Border = TRUE;
			Pos = MAP_APPFONT( 12, 14 );
			Size = MAP_APPFONT( 87, 60 );
			HelpId        = HID_DLG_QRY_LEFT_TABLE ;
			DropDown = TRUE;
			TabStop = TRUE;
		};

		ListBox LB_RIGHT_TABLE
		{
			Border = TRUE;
			Pos = MAP_APPFONT( 104, 14 );
			Size = MAP_APPFONT( 87, 60 );
			HelpId        = HID_DLG_QRY_RIGHT_TABLE ;
			DropDown = TRUE;
			TabStop = TRUE;
		};

		FixedLine FL_INVOLVED_FIELDS
		{
			Pos = MAP_APPFONT ( 6 , 29 ) ;
			Size = MAP_APPFONT ( 191 , 8 ) ;
			Text [ en-US ] = "Fields involved";
		};
	};

	FixedText ML_HELPTEXT
	{
		Pos             = MAP_APPFONT ( 12 , 159 ) ;
		Size            = MAP_APPFONT ( 179 , 49 ) ;
		UniqueId        = HID_DLG_QRY_HELPTEXT ;
		SVLook          = TRUE;
		WordBreak		= TRUE;
	};

	OKButton PB_OK
	{
		Pos = MAP_APPFONT ( 206 , 6 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		TabStop = TRUE ;
		DefButton = TRUE ;
	};
	CancelButton PB_CANCEL
	{
		Pos = MAP_APPFONT ( 206 , 23 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		TabStop = TRUE ;
	};
	HelpButton PB_HELP
	{
		Pos = MAP_APPFONT ( 206 , 43 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		TabStop = TRUE ;
	};

	Text [ en-US ] = "Join Properties";
};

String STR_JOIN_TYPE_HINT
{
    Text [ en-US ] = "Please note that some databases may not support this join type.";
};

String STR_QUERY_INNER_JOIN
{
	Text [ en-US ] = "Includes only records for which the contents of the related fields of both tables are identical.";
};

String STR_QUERY_LEFTRIGHT_JOIN
{
	Text [ en-US ] = "Contains ALL records from table '%1' but only records from table '%2' where the values in the related fields are matching.";
};

String STR_QUERY_FULL_JOIN
{
	Text [ en-US ] = "Contains ALL records from '%1' and from '%2'.";
};
String STR_QUERY_CROSS_JOIN
{
	Text [ en-US ] = "Contains the cartesian product of ALL records from '%1' and from '%2'.";
};
String STR_QUERY_NATURAL_JOIN
{
	Text [ en-US ] = "Contains only one column for each pair of equally-named columns from '%1' and from '%2'.";
};
