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

// tab page for setting the default colors used for new charts

TabPage RID_OPTPAGE_CHART_DEFCOLORS
{
	HelpID = HID_OPTIONS_CHART_DEFCOLORS ;
	Size = MAP_APPFONT ( 260, 185 ) ;
	Hide = TRUE ;
	Text [ en-US ] = "Default Colors" ;
	FixedLine FL_CHART_COLOR_LIST
	{
		Pos = MAP_APPFONT ( 6, 3 ) ;
		Size = MAP_APPFONT ( 80, 8 ) ;
		Text [ en-US ] = "Chart colors" ;
	};
	ListBox LB_CHART_COLOR_LIST
	{
		HelpID = "cui:ListBox:RID_OPTPAGE_CHART_DEFCOLORS:LB_CHART_COLOR_LIST" ;
		Border = TRUE ;
		Pos = MAP_APPFONT ( 12, 15 ) ;
		Size = MAP_APPFONT ( 68, 152 ) ;
		DropDown = FALSE ;
		TabStop = TRUE ;
	};
	FixedLine FL_COLOR_BOX
	{
		Pos = MAP_APPFONT ( 92, 3 ) ;
		Size = MAP_APPFONT ( 106, 8 ) ;
		Text [ en-US ] = "Color table" ;
	};
	Control CT_COLOR_BOX
	{
		Border = TRUE ;
		Pos = MAP_APPFONT ( 98, 15 ) ;
		Size = MAP_APPFONT ( 94, 152 ) ;
		TabStop = TRUE ;
	};
	PushButton PB_RESET_TO_DEFAULT
	{
		HelpID = "cui:PushButton:RID_OPTPAGE_CHART_DEFCOLORS:PB_RESET_TO_DEFAULT" ;
		Pos = MAP_APPFONT ( 204, 165 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		Text [ en-US ] = "~Default" ;
	};
};

String RID_SVXSTR_DIAGRAM_ROW
{
	// $(ROW) can be a number or the caption of the row in quotes

	Text [ en-US ] = "Data Series $(ROW)" ;
};

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