/**************************************************************
 * 
 * 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 <cuires.hrc>
#include "charmap.hrc"
#include "helpid.hrc"
#include <svx/dialogs.hrc> // for RID_SVXDLG_CHARMAP

 // RID_SVXDLG_CHARMAP ----------------------------------------------------
ModalDialog RID_SVXDLG_CHARMAP
{
	HelpId = CMD_SID_CHARMAP ;
	SvLook = TRUE ;
	Text [ en-US ] = "Special Characters";
	Size = MAP_APPFONT ( 297 , 153 ) ;
	OutputSize = TRUE ;
	Moveable = TRUE ;
	Control CT_SHOWSET
	{
		HelpId = HID_CHARMAP_CTL_SHOWSET ;
		Border = TRUE ;
		Pos = MAP_APPFONT ( 6 , 24 ) ;
		Size = MAP_APPFONT ( 230 , 112 ) ;
		TabStop = TRUE ;
		Group = TRUE ;
	};
	FixedText FT_FONT
	{
		Pos = MAP_APPFONT ( 6 , 8 ) ;
		Size = MAP_APPFONT ( 33 , 8 ) ;
		Text [ en-US ] = "~Font" ;
		Left = TRUE ;
		Group = TRUE ;
	};
	ListBox LB_FONT
	{
	    HelpID = "cui:ListBox:RID_SVXDLG_CHARMAP:LB_FONT";
		Pos = MAP_APPFONT ( 42 , 6 ) ;
		Size = MAP_APPFONT ( 70 , 58 ) ;
		Sort = TRUE ;
		TabStop = TRUE ;
		DropDown = TRUE ;
	};
	FixedText FT_SUBSET
	{
		Pos = MAP_APPFONT ( 118 , 8 ) ;
		Size = MAP_APPFONT ( 42 , 8 ) ;
		Text [ en-US ] = "~Subset";
	};
	ListBox LB_SUBSET
	{
	    HelpID = "cui:ListBox:RID_SVXDLG_CHARMAP:LB_SUBSET";
		Pos = MAP_APPFONT ( 161 , 6 ) ;
		Size = MAP_APPFONT ( 63 , 68 ) ;
		Sort = FALSE ;
		TabStop = TRUE ;
		DropDown = TRUE ;
	};
	FixedText FT_SYMBOLE
	{
		Pos = MAP_APPFONT ( 6 , 140 ) ;
		Size = MAP_APPFONT ( 38 , 8 ) ;
		Left = TRUE ;
		Text [ en-US ] = "Characters:";
	};
	Control CT_SHOWTEXT
	{
		HelpId = HID_CHARMAP_CTL_SHOWTEXT ;
		Pos = MAP_APPFONT ( 46 , 137 ) ;
		Size = MAP_APPFONT ( 244 , 16 ) ;
		Group = TRUE ;
	};
	Control CT_SHOWCHAR
	{
		HelpId = HID_CHARMAP_CTL_SHOWCHAR ;
		Pos = MAP_APPFONT ( 241 , 79 ) ;
		Size = MAP_APPFONT ( 50 , 44 ) ;
		Group = TRUE ;
	};
	FixedText FT_CHARCODE
	{
		Pos = MAP_APPFONT ( 241 , 126 ) ;
		Size = MAP_APPFONT ( 50 , 8 ) ;
		Center = TRUE ;
	};
	OKButton BTN_CHAR_OK
	{
		Pos = MAP_APPFONT ( 242 , 6 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		TabStop = TRUE ;
		DefButton = TRUE ;
	};
	CancelButton BTN_CHAR_CANCEL
	{
		Pos = MAP_APPFONT ( 242 , 23 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		TabStop = TRUE ;
	};
	HelpButton BTN_CHAR_HELP
	{
		Pos = MAP_APPFONT ( 242 , 43 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		TabStop = TRUE ;
	};
	PushButton BTN_DELETE
	{
	    HelpID = "cui:PushButton:RID_SVXDLG_CHARMAP:BTN_DELETE";
		Pos = MAP_APPFONT ( 242 , 63 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		Text [ en-US ] = "~Delete";
	};
};

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