/**************************************************************
 *
 * 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 ---------------------------------------------------------------
#include <sfx2/sfx.hrc>
#include <cuires.hrc>
#include "helpid.hrc"
#include "optsave.hrc"

// SID_SFXPAGE_SAVE ------------------------------------------------------
#define TEXT_SAVEPAGE \
	Text [ en-US ] = "Save" ;\

TabPage RID_SFXPAGE_SAVE
{
	HelpId = HID_OPTIONS_SAVE ;
	OutputSize = TRUE ;
	SVLook = TRUE ;
	Hide = TRUE ;
	TEXT_SAVEPAGE
	Size = MAP_APPFONT ( 260, 185 ) ;
	FixedLine LB_LOAD
	{
		Pos = MAP_APPFONT ( 6, 2 ) ;
		Size = MAP_APPFONT ( 248, 8 ) ;
		Text [ en-US ] = "Load" ;
	};
	CheckBox CB_LOAD_SETTINGS
	{
		HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:CB_LOAD_SETTINGS" ;
		Pos = MAP_APPFONT ( 12, 11 ) ;
		Size = MAP_APPFONT ( 236, 10 ) ;
		Text [ en-US ] = "Load user-specific settings with the document" ;
	};
	CheckBox CB_LOAD_DOCPRINTER
	{
		HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:CB_LOAD_DOCPRINTER" ;
		Pos = MAP_APPFONT ( 12, 22 ) ;
		Size = MAP_APPFONT ( 236, 10 ) ;
		Text [ en-US ] = "Load printer settings with the document" ;
	};
	FixedLine GB_SAVE
	{
		Pos = MAP_APPFONT ( 6, 32 ) ;
		Size = MAP_APPFONT ( 248, 8 ) ;
		Text [ en-US ] = "Save" ;
	};
	CheckBox BTN_DOCINFO
	{
		HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:BTN_DOCINFO" ;
		Pos = MAP_APPFONT ( 12, 41 ) ;
		Size = MAP_APPFONT ( 236, 10 ) ;
		Text [ en-US ] = "~Edit document properties before saving" ;
		TabStop = TRUE ;
	};
	FixedImage FI_BACKUP
	{
		Pos = MAP_APPFONT ( 5, 53 ) ;
		Size = MAP_APPFONT ( 6, 6 ) ;
		Hide = TRUE ;
	};
	CheckBox BTN_BACKUP
	{
		HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:BTN_BACKUP" ;
		Pos = MAP_APPFONT ( 12, 52 ) ;
		Size = MAP_APPFONT ( 236, 10 ) ;
		Text [ en-US ] = "Al~ways create backup copy" ;
	};
	CheckBox BTN_AUTOSAVE
	{
		HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:BTN_AUTOSAVE" ;
		Pos = MAP_APPFONT ( 12, 63 ) ;
		Size = MAP_APPFONT ( 150, 10 ) ;
		Text [ en-US ] = "Save ~AutoRecovery information every" ;
	};
	NumericField ED_AUTOSAVE
	{
		HelpID = "cui:NumericField:RID_SFXPAGE_SAVE:ED_AUTOSAVE" ;
		Border = TRUE ;
		Pos = MAP_APPFONT ( 180, 62 ) ;
		Size = MAP_APPFONT ( 21, 12 ) ;
		Left = TRUE ;
		Repeat = TRUE ;
		Spin = TRUE ;
		Minimum = 1 ;
		Maximum = 60 ;
		StrictFormat = TRUE ;
		First = 1 ;
		Last = 60 ;
		SpinSize = 1 ;
		TabStop = TRUE ;
	};
	FixedText FT_MINUTE
	{
		Pos = MAP_APPFONT ( 204, 63 ) ;
		Size = MAP_APPFONT ( 35, 8 ) ;
		Text [ en-US ] = "Minutes" ;
	};
	CheckBox BTN_RELATIVE_FSYS
	{
		HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:BTN_RELATIVE_FSYS" ;
		Pos = MAP_APPFONT ( 12, 74 ) ;
		Size = MAP_APPFONT ( 236, 10 ) ;
		Text [ en-US ] = "Save URLs relative to file system" ;
	};
	CheckBox BTN_RELATIVE_INET
	{
		HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:BTN_RELATIVE_INET" ;
		Pos = MAP_APPFONT ( 12, 85 ) ;
		Size = MAP_APPFONT ( 248, 10 ) ;
		Text [ en-US ] = "Save URLs relative to internet" ;
	};
	FixedLine FL_FILTER
	{
		Pos = MAP_APPFONT ( 6, 97 ) ;
		Size = MAP_APPFONT ( 248, 8 ) ;
		Text [ en-US ] = "Default file format and ODF settings" ;
	};
	FixedText FT_ODF_VERSION
	{
		Pos = MAP_APPFONT ( 12, 107 ) ;
		Size = MAP_APPFONT ( 121, 8 ) ;
		Text [ en-US ] = "ODF format version" ;
	};
	ListBox LB_ODF_VERSION
	{
		HelpID = "cui:ListBox:RID_SFXPAGE_SAVE:LB_ODF_VERSION" ;
		Pos = MAP_APPFONT ( 136, 105 ) ;
		Size = MAP_APPFONT ( 108, 58 ) ;
		Border = TRUE ;
		DropDown = TRUE ;
		StringList [ en-US ] =
		{
			< "1.0/1.1" ;						2 ; > ;
			< "1.2" ;							4 ; > ;
			< "1.2 Extended (recommended)" ;	0x7fffffff ; > ;
		};
	};
	CheckBox BTN_ODFENCRYPTION
	{
		HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:BTN_ODFENCRYPTION" ;
		Pos = MAP_APPFONT ( 12, 120 ) ;
		Size = MAP_APPFONT ( 248, 10 ) ;
		Text [ en-US ] = "Enable AES-256 encryption (ODF 1.2)" ;
	};
	CheckBox BTN_NOPRETTYPRINTING
	{
		HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:BTN_NOPRETTYPRINTING" ;
		Pos = MAP_APPFONT ( 12, 131 ) ;
		Size = MAP_APPFONT ( 248, 10 ) ;
		Text [ en-US ] = "Size optimization for ODF format" ;
	};
	CheckBox BTN_WARNALIENFORMAT
	{
		HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:BTN_WARNALIENFORMAT" ;
		Pos = MAP_APPFONT ( 12, 142 ) ;
		Size = MAP_APPFONT ( 248, 10 ) ;
		Text [ en-US ] = "Warn when not saving in ODF or default format" ;
	};
	FixedText FT_APP
	{
		Pos = MAP_APPFONT ( 12, 153 ) ;
		Size = MAP_APPFONT ( 120, 8 ) ;
		Text [ en-US ] = "D~ocument type" ;
	};
	FixedText FT_FILTER
	{
		Pos = MAP_APPFONT ( 136, 153 ) ;
		Size = MAP_APPFONT ( 120, 8 ) ;
		Text [ en-US ] = "Always sa~ve as" ;
	};
	ListBox LB_APP
	{
		HelpID = "cui:ListBox:RID_SFXPAGE_SAVE:LB_APP" ;
		Pos = MAP_APPFONT ( 12, 164 ) ;
		Size = MAP_APPFONT ( 108, 58 ) ;
		Border = TRUE ;
		DropDown = TRUE ;
		StringList [ en-US ] =
		{
			< "Text document" ;		APP_WRITER			; > ;
			< "HTML document" ;		APP_WRITER_WEB		; > ;
			< "Master document" ;	APP_WRITER_GLOBAL	; > ;
			< "Spreadsheet" ;		APP_CALC			; > ;
			< "Presentation" ;		APP_IMPRESS			; > ;
			< "Drawing" ;			APP_DRAW			; > ;
			< "Formula" ;			APP_MATH			; > ;
		};
	};
	FixedImage FI_FILTER
	{
		Pos = MAP_APPFONT ( 129, 153 ) ;
		Size = MAP_APPFONT ( 6, 6 ) ;
		Hide = TRUE ;
	};
	ListBox LB_FILTER
	{
		HelpID = "cui:ListBox:RID_SFXPAGE_SAVE:LB_FILTER" ;
		Pos = MAP_APPFONT ( 136, 164 ) ;
		Size = MAP_APPFONT ( 108, 58 ) ;
		Border = TRUE ;
		Sort = TRUE ;
		DropDown = TRUE ;
	};
	FixedImage FI_ODF_WARNING
	{
		Pos = MAP_APPFONT ( 12, 177 ) ;
		Size = MAP_APPFONT ( 8, 8 ) ;
		Hide = TRUE ;
	};
	FixedText FT_WARN
	{
		Pos = MAP_APPFONT ( 23, 177 ) ;
		Size = MAP_APPFONT ( 239, 8 ) ;
		Hide = TRUE ;
		Text [ en-US ] = "Not using ODF 1.2 Extended may cause information to be lost." ;
	};
	Image IMG_ODF_WARNING
	{
		ImageBitmap = Bitmap
		{
			File = "odfwarning.png" ;
		};
	};
	Image IMG_ODF_WARNING_HC
	{
		ImageBitmap = Bitmap
		{
			File = "odfwarning_h.png" ;
		};
	};
};

ModalDialog RID_SVXDLG_FILTER_WARNING
{
	HelpID = HID_SVXDLG_FILTER_WARNING ;
	OutputSize = TRUE ;
	Moveable = TRUE ;
	Closeable = TRUE ;
	Sizeable = FALSE ;
	Border = TRUE ;
	SVLook = TRUE ;
	Size = MAP_APPFONT ( 175 + 39 + (3 * 6), (4 * 9)+ 12 + (3 * 12) + 6 - 21 ) ;
	Text = "%PRODUCTNAME %PRODUCTVERSION" ;
	FixedImage IMG_WARNING
	{
		Pos = MAP_APPFONT ( 6, 6 ) ;
		Size = MAP_APPFONT ( 30, 30 ) ;
	};
	FixedText FT_FILTER_WARNING
	{
		Pos = MAP_APPFONT ( 39, 6 ) ;
		Size = MAP_APPFONT ( 175, 4 * 9 ) ;
		Wordbreak = TRUE ;
		Text [ en-US ] = "Using \"%1\" as default file format may cause information loss.\n" ;
	};
	OKButton PB_OK
	{
		Pos = MAP_APPFONT ( 60, (4 * 9)/*+ 12*/ + 13 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		DefButton = TRUE ;
	};
	CancelButton PB_CANCEL
	{
		Pos = MAP_APPFONT ( 120, (4 * 9)/*+ 12*/ + 13 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
	};
};

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