/**************************************************************
 *
 * 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 "about.hrc"

#define BTN_WIDTH	50
#define BTN_HEIGHT	14

ModalDialog RID_DEFAULTABOUT
{
	HelpID = "cui:ModalDialog:RID_DEFAULTABOUT" ;
	OutputSize = TRUE ;
	Moveable = TRUE ;
	SVLook = TRUE ;
	Size = MAP_APPFONT ( 200, 150 ) ;
	Text [ en-US ] = "About %FULLPRODUCTNAME" ;
	OKButton RID_CUI_ABOUT_BTN_OK
	{
		DefButton = TRUE ;
		Size = MAP_APPFONT ( BTN_WIDTH, BTN_HEIGHT ) ;
	};
	PushButton RID_CUI_ABOUT_BTN_README
	{
		DefButton = FALSE ;
		Size = MAP_APPFONT ( BTN_WIDTH, BTN_HEIGHT ) ;
		Text [ en-US ] = "License..." ;
	};
	FixedText RID_CUI_ABOUT_FTXT_VERSION
	{
		WordBreak = TRUE ;
		Text = "%FULLPRODUCTNAME %ABOUTBOXPRODUCTVERSION %PRODUCTEXTENSION" ;
	};
	MultiLineEdit RID_CUI_ABOUT_FTXT_BUILDDATA
	{
		//HelpID = "cui:MultiLineEdit:RID_DEFAULTABOUT:ABOUT_FTXT_BUILDDATA" ;
		Border = FALSE ;
		IgnoreTab = TRUE ;
		ReadOnly = TRUE ;
		AutoVScroll = FALSE ;
	};
	MultiLineEdit RID_CUI_ABOUT_FTXT_COPYRIGHT
	{
		HelpID = "cui:MultiLineEdit:RID_DEFAULTABOUT:ABOUT_FTXT_COPYRIGHT" ;
		Border = FALSE ;
		IgnoreTab = TRUE ;
		ReadOnly = TRUE ;
		AutoVScroll = FALSE ;
	};
	FixedText RID_CUI_ABOUT_FTXT_WELCOME_LINK
	{
		Left = TRUE ;
		Text = "https://www.openoffice.org/welcome/credits.html" ;
	};
	String RID_CUI_ABOUT_STR_COPYRIGHT_VENDOR
	{
		Text = "%OOOVENDOR" ;
	};
	String RID_CUI_ABOUT_STR_CREATED
	{
		Text [ en-US ] = "This product was created by the OpenOffice community." ;
	};
	String RID_CUI_ABOUT_STR_CREATED_VENDOR
	{
		Text [ en-US ] = "This product was created by %OOOVENDOR, based on Apache OpenOffice." ;
	};
	String RID_CUI_ABOUT_STR_ACKNOWLEDGE
	{
		Text [ en-US ] = "The OpenOffice community acknowledges all contributing members, especially those mentioned at" ;
	};
};


#define TAB_WIDTH	290
#define TAB_HEIGHT	270

#define CTRL_MARGIN 3
#define DLG_WIDTH	CTRL_MARGIN + TAB_WIDTH + CTRL_MARGIN
#define DLG_HEIGHT	CTRL_MARGIN + TAB_HEIGHT + CTRL_MARGIN + BTN_HEIGHT + CTRL_MARGIN

ModalDialog RID_CUI_README_DLG
{
	OutputSize = TRUE ;
	SvLook = TRUE ;
	Moveable = TRUE ;
	Closeable = TRUE ;
	Size = MAP_APPFONT ( DLG_WIDTH, DLG_HEIGHT ) ;
	Text [ en-US ] = "Readme, License and Notice" ;

	TabControl RID_CUI_README_TBCTL
	{
		OutputSize = TRUE ;
		Pos = MAP_APPFONT ( CTRL_MARGIN, CTRL_MARGIN ) ;
		Size = MAP_APPFONT ( TAB_WIDTH, TAB_HEIGHT ) ;
		PageList =
		{
			PageItem
			{
				Identifier = RID_CUI_READMEPAGE ;
				PageResID = RID_CUI_README_TBPAGE ;
				Text [ en-US ] = "Readme" ;
			};
			PageItem
			{
				Identifier = RID_CUI_LICENSEPAGE ;
				PageResID = RID_CUI_README_TBPAGE ;
				Text [ en-US ] = "License" ;
			};
			PageItem
			{
				Identifier = RID_CUI_NOTICEPAGE ;
				PageResID = RID_CUI_README_TBPAGE ;
				Text [ en-US ] = "Notice" ;
			};
		};
	};

	OKButton RID_CUI_README_OKBTN
	{
		DefButton = TRUE ;
		Pos = MAP_APPFONT ( 0, CTRL_MARGIN + TAB_HEIGHT + CTRL_MARGIN ) ;
		Size = MAP_APPFONT ( BTN_WIDTH, BTN_HEIGHT ) ;
	};
};

TabPage RID_CUI_README_TBPAGE
{
	OutputSize = TRUE ;
	SVLook = TRUE ;
	Hide = TRUE ;
	Size = MAP_APPFONT ( TAB_WIDTH, TAB_HEIGHT ) ;

	MultiLineEdit RID_CUI_README_TBPAGE_EDIT
	{
		Border = TRUE ;
		IgnoreTab = TRUE ;
		ReadOnly = TRUE ;
		AutoVScroll = TRUE ;
		Pos = MAP_APPFONT ( CTRL_MARGIN, CTRL_MARGIN ) ;
		Size = MAP_APPFONT ( TAB_WIDTH - CTRL_MARGIN - CTRL_MARGIN, TAB_HEIGHT - CTRL_MARGIN - CTRL_MARGIN ) ;
	};
};

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