/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/


 // #pragma ******************************************************************

 // #include *****************************************************************
#include "globals.hrc"
#include "chrdlg.hrc"
#include "ccoll.hrc"
#include "helpid.h"
 // TabPage ******************************************************************
TabPage TP_CONDCOLL
{
	HelpID = HID_COND_COLL ;
	Size = MAP_APPFONT ( 260 , 185 ) ;
	Hide = TRUE ;
    FixedLine    FL_CONDITION
	{
		Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248 , 8 ) ;
		Text [ en-US ] = "Options";
	};
	CheckBox CB_CONDITION
	{
	    HelpID = "sw:CheckBox:TP_CONDCOLL:CB_CONDITION";
		Pos = MAP_APPFONT ( 12 , 14 ) ;
		Size = MAP_APPFONT ( 100 , 10 ) ;
		TabStop = TRUE ;
		Disable = TRUE ;
		Text [ en-US ] = "~Conditional Style" ;
	};
	FixedText FT_CONTEXT
	{
		Pos = MAP_APPFONT ( 12 , 28 ) ;
		Size = MAP_APPFONT ( 50 , 8 ) ;
		Disable = TRUE ;
		Text [ en-US ] = "Conte~xt" ;
	};
	FixedText FT_USED
	{
		Pos = MAP_APPFONT ( 100 , 28 ) ;
		Size = MAP_APPFONT ( 80 , 8 ) ;
		Disable = TRUE ;
		Text [ en-US ] = "Applied Styles" ;
	};
	Control TB_CONDCOLLS
	{
		Border = TRUE ;
		Pos = MAP_APPFONT ( 12 , 39 ) ;
		Size = MAP_APPFONT ( 173 , 123 ) ;
		TabStop = TRUE ;
		ClipChildren = TRUE ;
		Disable = TRUE ;
		Border = TRUE ;
	};
	FixedText FT_STYLE
	{
		Pos = MAP_APPFONT ( 190 , 28 ) ;
        Size = MAP_APPFONT ( 58 , 8 ) ;
		Disable = TRUE ;
		Text [ en-US ] = "~Paragraph Styles" ;
	};
	ListBox LB_STYLE
	{
	    HelpID = "sw:ListBox:TP_CONDCOLL:LB_STYLE";
		Pos = MAP_APPFONT ( 188 , 39 ) ;
		Size = MAP_APPFONT ( 60 , 108 ) ;
		TabStop = TRUE ;
		Border = TRUE ;
		Sort = TRUE ;
		Disable = TRUE ;
		HScroll = TRUE ;
	};
	ListBox LB_FILTER
	{
	    HelpID = "sw:ListBox:TP_CONDCOLL:LB_FILTER";
		Pos = MAP_APPFONT ( 188 , 150 ) ;
		Size = MAP_APPFONT ( 60 , 50 ) ;
		DropDown = TRUE ;
		TabStop = TRUE ;
		Border = TRUE ;
		Disable = TRUE ;
		HScroll = TRUE ;
	};
	PushButton PB_REMOVE
	{
	    HelpID = "sw:PushButton:TP_CONDCOLL:PB_REMOVE";
		Pos = MAP_APPFONT ( 129 , 165 ) ;
		Size = MAP_APPFONT ( 50 , 12 ) ;
		TabStop = TRUE ;
		Disable = TRUE ;
		Text [ en-US ] = "Re~move" ;
	};
	PushButton PB_ASSIGN
	{
	    HelpID = "sw:PushButton:TP_CONDCOLL:PB_ASSIGN";
		Pos = MAP_APPFONT ( 185 , 165 ) ;
		Size = MAP_APPFONT ( 50 , 12 ) ;
		TabStop = TRUE ;
		Disable = TRUE ;
		Text [ en-US ] = "~Apply" ;
	};
	StringArray STR_REGIONS
	{
		ItemList [ en-US ] =
		{
			< "Table Header" ; > ;
			< "Table" ; > ;
			< "Frame" ; > ;
			< "Section" ; > ;
			< "Footnote" ; > ;
			< "Endnote" ; > ;
			< "Header" ; > ;
			< "Footer" ; > ;
			< " 1st Outline Level" ; > ;
			< " 2nd Outline Level" ; > ;
			< " 3rd Outline Level" ; > ;
			< " 4th Outline Level" ; > ;
			< " 5th Outline Level" ; > ;
			< " 6th Outline Level" ; > ;
			< " 7th Outline Level" ; > ;
			< " 8th Outline Level" ; > ;
			< " 9th Outline Level" ; > ;
			< "10th Outline Level" ; > ;
			< " 1st Numbering Level" ; > ;
			< " 2nd Numbering Level" ; > ;
			< " 3rd Numbering Level" ; > ;
			< " 4th Numbering Level" ; > ;
			< " 5th Numbering Level" ; > ;
			< " 6th Numbering Level" ; > ;
			< " 7th Numbering Level" ; > ;
			< " 8th Numbering Level" ; > ;
			< " 9th Numbering Level" ; > ;
			< "10th Numbering Level" ; > ;
		};
	};
	String STR_NOTEMPL
	{
		Text [ en-US ] = "<none>" ;
	};
};
 // ********************************************************************** EOF
