/**************************************************************
 *
 * 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_PRELOAD_PRELOAD_HRC_
#include "preload.hrc"
#endif

ModalDialog RID_DLG_OEMWIZARD
{
	HelpID = "extensions:ModalDialog:RID_DLG_OEMWIZARD" ;
	Text = "%PRODUCTNAME %PRODUCTVERSION" ;

	OutputSize		= TRUE ;
	SVLook			= TRUE ;
	Moveable		= TRUE ;
	Closeable		= TRUE ;
	Hide			= TRUE ;
	PushButton PB_PREV
	{
		HelpID = "extensions:PushButton:RID_DLG_OEMWIZARD:PB_PREV" ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		Text [ en-US ] = "< Back" ;
	};
	PushButton PB_NEXT
	{
		HelpID = "extensions:PushButton:RID_DLG_OEMWIZARD:PB_NEXT" ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		Text [ en-US ] = "Next >" ;
	};
	CancelButton PB_CANCEL
	{
		Size = MAP_APPFONT ( 50, 14 ) ;
	};
	String ST_ACCEPT
	{
		Text [ en-US ] = "Accept" ;
	};
	String ST_FINISH
	{
		Text [ en-US ] = "Finish" ;
	};
	String ST_LICENSE_AGREEMENT
	{
		Text [ en-US ] = " - Software License Agreement" ;
	};

	String ST_INSERT_USER_DATA
	{
		Text [ en-US ] = "- User Data" ;
	};
};
TabPage RID_TP_WELCOME
{
	HelpID = "extensions:TabPage:RID_TP_WELCOME" ;
//	HelpId = ;
	OutputSize = TRUE ;
	SVLook = TRUE ;
	Hide = TRUE ;
	Size = MAP_APPFONT ( 260, 185 ) ;
	Text [ en-US ] = "Welcome" ;
	FixedText FT_INFO
	{
		Pos = MAP_APPFONT ( 6, 3 ) ;
		Size = MAP_APPFONT ( 248, 174 ) ;
		WordBreak = TRUE ;
		Text [ en-US ] = "Welcome to %PRODUCTNAME %PRODUCTVERSION OEM\n\nTo start the %PRODUCTNAME %PRODUCTVERSION OEM, "
		"please enter your personal data in the dialog following the license text. Important information is contained "
		"in the readme files which are located in the %PRODUCTNAME product directory. Please read these files carefully. "
		"You can also find detailed information at the OpenOffice website \n\n"
		"https://www.openoffice.org." ;
	};
};

#define LICENSE_DIALOG_WIDTH	260
#define LICENSE_DIALOG_HEIGTH	185
#define LICENSE_RIGHT_BORDER	7
#define LICENSE_BOTTOM_BORDER	0
#define LICENSE_ROW_1 (7)
#define LICENSE_COL_1 (7)

#define OFFSET		2
#define COL2_WIDTH	10
#define OFFSET_IMG	10
#define FT_HEIGHT	8
#define PB_HEIGHT	14
#define PD_WIDTH	40

#define LICENCE_HEIGHT 102
#define LICENSE_ROW_2 (LICENSE_ROW_1 + OFFSET + LICENCE_HEIGHT)
#define LICENSE_ROW_3 (LICENSE_ROW_2 + OFFSET + FT_HEIGHT)
#define LICENSE_ROW_4 (LICENSE_ROW_3 + OFFSET + 3 * FT_HEIGHT )
#define LICENSE_ROW_5 (LICENSE_ROW_4 + OFFSET + FT_HEIGHT)

/*
#define LICENSE_ROW_5 (LICENSE_DIALOG_HEIGTH - LICENSE_BOTTOM_BORDER - OFFSET - FT_HEIGHT)
#define LICENSE_ROW_4 (LICENSE_ROW_5 - OFFSET - FT_HEIGHT)
#define LICENSE_ROW_3 (LICENSE_ROW_4 - OFFSET - 3 * FT_HEIGHT)
#define LICENSE_ROW_2 (LICENSE_ROW_3 - OFFSET - FT_HEIGHT)
#define LICENCE_HEIGHT (LICENSE_ROW_2 - LICENSE_ROW_1 - OFFSET)
*/


#define LICENSE_COL_2 (LICENSE_COL_1 + OFFSET_IMG)
#define LICENSE_COL_3 (LICENSE_COL_2 + COL2_WIDTH + 1)
#define LICENSE_COL_4 (LICENSE_DIALOG_WIDTH - LICENSE_RIGHT_BORDER - PD_WIDTH)

#define LICENSE_WIDTH (LICENSE_DIALOG_WIDTH - LICENSE_RIGHT_BORDER - LICENSE_ROW_1)
#define COL3_WIDTH (LICENSE_COL_4 - LICENSE_COL_3)


TabPage RID_TP_LICENSE
{
	HelpID = "extensions:TabPage:RID_TP_LICENSE" ;
	OutputSize = TRUE ;
	SVLook = TRUE ;
	Hide = TRUE ;
	Size = MAP_APPFONT ( LICENSE_DIALOG_WIDTH, LICENSE_DIALOG_HEIGTH ) ;
	Text [ en-US ] = "License Agreement" ;

	MultiLineEdit ML_LICENSE
	{
		HelpID = "extensions:MultiLineEdit:RID_TP_LICENSE:ML_LICENSE" ;
		PosSize = MAP_APPFONT ( LICENSE_COL_1, LICENSE_ROW_1, LICENSE_WIDTH, LICENCE_HEIGHT ) ;
		Border = TRUE ;
		VScroll = TRUE ;
		ReadOnly = TRUE ;
	};

	FixedText FT_INFO1
	{
		WordBreak = TRUE ;
		Pos = MAP_APPFONT ( LICENSE_COL_1, LICENSE_ROW_2 ) ;
		Size = MAP_APPFONT ( LICENSE_WIDTH, FT_HEIGHT ) ;
		Text [ en-US ] = "Please follow these steps to proceed with the installation:" ;
	};

	FixedImage IMG_ARROW
	{
		Pos = MAP_APPFONT ( LICENSE_COL_1, LICENSE_ROW_3 ) ;
		Size = MAP_PIXEL ( 16, 16 ) ;
		Fixed = Image
		{
			ImageBitmap = Bitmap
			{
				File = "arrow.png" ;
				File [ ar ] = "m_arrow.png" ;
			};
		};
	};

	FixedText FT_INFO2_1
	{
		WordBreak = TRUE ;
		Pos = MAP_APPFONT ( LICENSE_COL_2, LICENSE_ROW_3 ) ;
		Size = MAP_APPFONT ( COL2_WIDTH, FT_HEIGHT ) ;
		Text [ en-US ] = "1." ;
	};

	FixedText FT_INFO2
	{
		WordBreak = TRUE ;
		Pos = MAP_APPFONT ( LICENSE_COL_3, LICENSE_ROW_3 ) ;
		Size = MAP_APPFONT ( COL3_WIDTH, 3*FT_HEIGHT ) ;
		Text [ en-US ] = "View the complete License Agreement. Please use the scroll bar or the '%PAGEDOWN' button in this dialog to view the entire license text." ;
	};

	PushButton PB_PAGEDOWN
	{
		HelpID = "extensions:PushButton:RID_TP_LICENSE:PB_PAGEDOWN" ;
		TabStop = TRUE ;
		Pos = MAP_APPFONT ( LICENSE_COL_4, LICENSE_ROW_3 ) ;
		Size = MAP_APPFONT ( PD_WIDTH, PB_HEIGHT ) ;
		Text [ en-US ] = "Page Down" ;
	};

	FixedText FT_INFO3_1
	{
		WordBreak = TRUE ;
		Pos = MAP_APPFONT ( LICENSE_COL_2, LICENSE_ROW_4 ) ;
		Size = MAP_APPFONT ( COL2_WIDTH, FT_HEIGHT ) ;
		Text [ en-US ] = "2." ;
	};

	FixedText FT_INFO3
	{
		WordBreak = TRUE ;
		Pos = MAP_APPFONT ( LICENSE_COL_3, LICENSE_ROW_4 ) ;
		Size = MAP_APPFONT ( COL3_WIDTH, FT_HEIGHT ) ;
		Text [ en-US ] = "Accept the License Agreement." ;
	};

	CheckBox CB_ACCEPT
	{
		HelpID = "extensions:CheckBox:RID_TP_LICENSE:CB_ACCEPT" ;
		TabStop = TRUE ;
		Pos = MAP_APPFONT ( LICENSE_COL_3, LICENSE_ROW_5 ) ;
		Size = MAP_APPFONT ( COL3_WIDTH, FT_HEIGHT ) ;
		Text [ en-US ] = "I accept the terms of the Agreement." ;
	};

	String LICENCE_ACCEPT
	{
		Text [ en-US ] = "~Accept" ;
	};

	String LICENCE_NOTACCEPT
	{
		Text [ en-US ] = "Decline" ;
	};

};

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