/**************************************************************
 * 
 * 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 "xmlfiltertabpagebasic.hrc"
#include "xmlfilterhelpids.hrc"

#define TAB_PAGE_WIDTH	260
#define TAB_PAGE_HEIGHT	185

#define SPACING			3

#define	FIRST_ROW_X			6
#define FIRST_ROW_Y			6
#define FIRST_ROW_WIDTH		60

#define SECOND_ROW_X		(FIRST_ROW_X + FIRST_ROW_WIDTH + SPACING)
#define SECOND_ROW_Y		6
#define SECOND_ROW_WIDTH	(TAB_PAGE_WIDTH - SECOND_ROW_X - SPACING)

#define FIXED_TEXT_OFFSET	2

#define ROW_HEIGHT			12


TabPage RID_XML_FILTER_TABPAGE_BASIC
{
	HelpId					= HID_XML_FILTER_TABPAGE_BASIC;
	Hide					= TRUE;
	Size					= MAP_APPFONT ( TAB_PAGE_WIDTH , TAB_PAGE_HEIGHT );
	Text [ en-US ]		= "General";

	// Filter Name ----------------------------------------------------

	FixedText FT_XML_FILTER_NAME
	{
        Pos					= MAP_APPFONT ( FIRST_ROW_X , FIRST_ROW_Y + 0 * ROW_HEIGHT + 0 * SPACING + FIXED_TEXT_OFFSET ) ;
        Size				= MAP_APPFONT ( FIRST_ROW_WIDTH , 8 ) ;
		Text [ en-US ]	= "Filter name";
	};

    Edit ED_XML_FILTER_NAME
	{
		Pos					= MAP_APPFONT ( SECOND_ROW_X , SECOND_ROW_Y + 0 * ROW_HEIGHT + 0 * SPACING ) ;
        Size				= MAP_APPFONT ( 102 , 12 ) ;
		HelpId				= HID_XML_FILTER_NAME;
		Border				= TRUE;
	};

	// Application ----------------------------------------------------

    FixedText FT_XML_APPLICATION
	{
        Pos					= MAP_APPFONT ( FIRST_ROW_X , FIRST_ROW_Y + 1 * ROW_HEIGHT + 1 * SPACING + FIXED_TEXT_OFFSET ) ;
        Size				= MAP_APPFONT ( FIRST_ROW_WIDTH , 8 ) ;
		Text [ en-US ]	= "Application";
	};

	ComboBox CB_XML_APPLICATION
	{
		Pos					= MAP_APPFONT ( SECOND_ROW_X , SECOND_ROW_Y + 1 * ROW_HEIGHT + 1 * SPACING ) ;
        Size				= MAP_APPFONT ( 102 , 60 ) ;
		HelpId				= HID_XML_FILTER_APPLICATION;
		Border				= TRUE ;
		TabStop				= TRUE ;
		DropDown			= TRUE ;
		Sort				= TRUE ;
	};

	// Interface Name -------------------------------------------------

    FixedText FT_XML_INTERFACE_NAME
	{
        Pos					= MAP_APPFONT ( FIRST_ROW_X , FIRST_ROW_Y + 2 * ROW_HEIGHT + 2 * SPACING ) ; // + FIXED_TEXT_OFFSET ) ;
        Size				= MAP_APPFONT ( FIRST_ROW_WIDTH , 16 ) ;
		Text [ en-US ]	= "Name of\nfile type";
	};

    Edit ED_XML_INTERFACE_NAME
	{
		Pos					= MAP_APPFONT ( SECOND_ROW_X , 2 + SECOND_ROW_Y + 2 * ROW_HEIGHT + 2 * SPACING ) ;
        Size				= MAP_APPFONT ( 102 , 12 ) ;
		HelpId				= HID_XML_FILTER_INTERFACE_NAME;
		Border				= TRUE;
	};

	// Extension ------------------------------------------------------

    FixedText FT_XML_EXTENSION
	{
        Pos					= MAP_APPFONT ( FIRST_ROW_X , 4 + FIRST_ROW_Y + 3 * ROW_HEIGHT + 3 * SPACING + FIXED_TEXT_OFFSET) ;
        Size				= MAP_APPFONT ( FIRST_ROW_WIDTH , 8 ) ;
		Text [ en-US ]	= "File extension";
	};

    Edit ED_XML_EXTENSION
	{
		Pos					= MAP_APPFONT ( SECOND_ROW_X , 4 + SECOND_ROW_Y + 3 * ROW_HEIGHT + 3 * SPACING ) ;
        Size				= MAP_APPFONT ( 32 , 12 ) ;
		HelpId				= HID_XML_FILTER_EXTENSION;
		Border				= TRUE;
	};

	// Description ----------------------------------------------------

    FixedText FT_XML_DESCRIPTION
	{
        Pos					= MAP_APPFONT ( FIRST_ROW_X , 4 + FIRST_ROW_Y + 4 * ROW_HEIGHT + 4 * SPACING + FIXED_TEXT_OFFSET ) ;
        Size				= MAP_APPFONT ( FIRST_ROW_WIDTH , 8 ) ;
		Text [ en-US ]	= "Comments";
	};

    MultiLineEdit ED_XML_DESCRIPTION
	{
		Pos					= MAP_APPFONT ( SECOND_ROW_X , 4 + SECOND_ROW_Y + 4 * ROW_HEIGHT + 4 * SPACING ) ;
        Size				= MAP_APPFONT ( SECOND_ROW_WIDTH , 3*ROW_HEIGHT ) ;
		HelpId				= HID_XML_FILTER_DESCRIPTION;
		Border				= TRUE;
		IgnoreTab = TRUE ;
	};
};








