/**************************************************************
 *
 * 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 "dstribut.hrc"
#include "helpid.hrc"
#include <svx/dialogs.hrc>

// RID_SVXPAGE_DISTRIBUTE ------------------------------------------------
TabPage RID_SVXPAGE_DISTRIBUTE
{
	HelpId = HID_PAGE_DISTRIBUTE ;
	Hide = TRUE ;
	Size = MAP_APPFONT ( 260, 81 ) ;
	Text [ en-US ] = "Distribution" ;

	FixedLine FL_HORIZONTAL
	{
		Pos = MAP_APPFONT ( 6, 3 ) ;
		Size = MAP_APPFONT ( 248, 8 ) ;
		Text [ en-US ] = "Horizontal" ;
	};

	RadioButton BTN_HOR_NONE
	{
		HelpID = "cui:RadioButton:RID_SVXPAGE_DISTRIBUTE:BTN_HOR_NONE" ;
		Pos = MAP_APPFONT ( 12, 26 ) ;
		Size = MAP_APPFONT ( 48, 10 ) ;
		Text [ en-US ] = "~None" ;
	};

	RadioButton BTN_HOR_LEFT
	{
		HelpID = "cui:RadioButton:RID_SVXPAGE_DISTRIBUTE:BTN_HOR_LEFT" ;
		Pos = MAP_APPFONT ( 56, 26 ) ;
		Size = MAP_APPFONT ( 45, 10 ) ;
		Text [ en-US ] = "~Left" ;
	};

	RadioButton BTN_HOR_CENTER
	{
		HelpID = "cui:RadioButton:RID_SVXPAGE_DISTRIBUTE:BTN_HOR_CENTER" ;
		Pos = MAP_APPFONT ( 105, 26 ) ;
		Size = MAP_APPFONT ( 45, 10 ) ;
		Text [ en-US ] = "~Center" ;
	};

	RadioButton BTN_HOR_DISTANCE
	{
		HelpID = "cui:RadioButton:RID_SVXPAGE_DISTRIBUTE:BTN_HOR_DISTANCE" ;
		Pos = MAP_APPFONT ( 154, 26 ) ;
		Size = MAP_APPFONT ( 45, 10 ) ;
		Text [ en-US ] = "~Spacing" ;
	};

	RadioButton BTN_HOR_RIGHT
	{
		HelpID = "cui:RadioButton:RID_SVXPAGE_DISTRIBUTE:BTN_HOR_RIGHT" ;
		Pos = MAP_APPFONT ( 203, 26 ) ;
		Size = MAP_APPFONT ( 45, 10 ) ;
		Text [ en-US ] = "~Right" ;
	};

	FixedImage IMG_HOR_LOW {
		Pos = MAP_APPFONT ( 65, 10 ) ;
		Size = MAP_APPFONT ( 15, 16 ) ;
		Hide = FALSE ;
		Fixed = Image {
			ImageBitmap = Bitmap {File = "dsth_low.png" ;} ;
		};
	};

	FixedImage IMG_HOR_CENTER {
		Pos = MAP_APPFONT ( 114, 10 ) ;
		Size = MAP_APPFONT ( 15, 16 ) ;
		Hide = FALSE ;
		Fixed = Image {
			ImageBitmap = Bitmap {File = "dsth_cen.png" ;} ;
		};
	};

	FixedImage IMG_HOR_DISTANCE {
		Pos = MAP_APPFONT ( 163, 10 ) ;
		Size = MAP_APPFONT ( 15, 16 ) ;
		Hide = FALSE ;
		Fixed = Image {
			ImageBitmap = Bitmap {File = "dsth_dst.png" ;} ;
		};
	};

	FixedImage IMG_HOR_HIGH {
		Pos = MAP_APPFONT ( 212, 10 ) ;
		Size = MAP_APPFONT ( 15, 16 ) ;
		Hide = FALSE ;
		Fixed = Image {
			ImageBitmap = Bitmap {File = "dsth_hig.png" ;} ;
		};
	};

	FixedLine FL_VERTICAL
	{
		Pos = MAP_APPFONT ( 6, 42 ) ;
		Size = MAP_APPFONT ( 248, 8 ) ;
		Text [ en-US ] = "Vertical" ;
	};

	RadioButton BTN_VER_NONE
	{
		HelpID = "cui:RadioButton:RID_SVXPAGE_DISTRIBUTE:BTN_VER_NONE" ;
		Pos = MAP_APPFONT ( 12, 65 ) ;
		Size = MAP_APPFONT ( 46, 10 ) ;
		Text [ en-US ] = "N~one" ;
	};

	RadioButton BTN_VER_TOP
	{
		HelpID = "cui:RadioButton:RID_SVXPAGE_DISTRIBUTE:BTN_VER_TOP" ;
		Pos = MAP_APPFONT ( 56, 65 ) ;
		Size = MAP_APPFONT ( 45, 10 ) ;
		Text [ en-US ] = "~Top" ;
	};

	RadioButton BTN_VER_CENTER
	{
		HelpID = "cui:RadioButton:RID_SVXPAGE_DISTRIBUTE:BTN_VER_CENTER" ;
		Pos = MAP_APPFONT ( 105, 65 ) ;
		Size = MAP_APPFONT ( 45, 10 ) ;
		Text [ en-US ] = "C~enter" ;
	};

	RadioButton BTN_VER_DISTANCE
	{
		HelpID = "cui:RadioButton:RID_SVXPAGE_DISTRIBUTE:BTN_VER_DISTANCE" ;
		Pos = MAP_APPFONT ( 154, 65 ) ;
		Size = MAP_APPFONT ( 45, 10 ) ;
		Text [ en-US ] = "S~pacing" ;
	};

	RadioButton BTN_VER_BOTTOM
	{
		HelpID = "cui:RadioButton:RID_SVXPAGE_DISTRIBUTE:BTN_VER_BOTTOM" ;
		Pos = MAP_APPFONT ( 203, 65 ) ;
		Size = MAP_APPFONT ( 45, 10 ) ;
		Text [ en-US ] = "~Bottom" ;
	};

	FixedImage IMG_VER_HIGH {
		Pos = MAP_APPFONT ( 65, 49 ) ;
		Size = MAP_APPFONT ( 15, 16 ) ;
		Hide = FALSE ;
		Fixed = Image {
			ImageBitmap = Bitmap {File = "dstv_hig.png" ;} ;
		};
	};

	FixedImage IMG_VER_CENTER {
		Pos = MAP_APPFONT ( 114, 49 ) ;
		Size = MAP_APPFONT ( 15, 16 ) ;
		Hide = FALSE ;
		Fixed = Image {
			ImageBitmap = Bitmap {File = "dstv_cen.png" ;} ;
		};
	};

	FixedImage IMG_VER_DISTANCE {
		Pos = MAP_APPFONT ( 163, 49 ) ;
		Size = MAP_APPFONT ( 15, 16 ) ;
		Hide = FALSE ;
		Fixed = Image {
			ImageBitmap = Bitmap {File = "dstv_dst.png" ;} ;
		};
	};

	FixedImage IMG_VER_LOW {
		Pos = MAP_APPFONT ( 212, 49 ) ;
		Size = MAP_APPFONT ( 15, 16 ) ;
		Hide = FALSE ;
		Fixed = Image {
			ImageBitmap = Bitmap {File = "dstv_low.png" ;} ;
		};
	};


	Image IMG_HOR_LOW_H
	{
		ImageBitmap = Bitmap {File = "dsth_low_h.png" ;} ;
	};

	Image IMG_HOR_DISTANCE_H
	{
		ImageBitmap = Bitmap {File = "dsth_dst_h.png" ;} ;
	};

	Image IMG_HOR_CENTER_H
	{
		ImageBitmap = Bitmap {File = "dsth_cen_h.png" ;} ;
	};

	Image IMG_HOR_HIGH_H
	{
		ImageBitmap = Bitmap {File = "dsth_hig_h.png" ;} ;
	};

	Image IMG_VER_HIGH_H
	{
		ImageBitmap = Bitmap {File = "dstv_hig_h.png" ;} ;
	};

	Image IMG_VER_CENTER_H
	{
		ImageBitmap = Bitmap {File = "dstv_cen_h.png" ;} ;
	};

	Image IMG_VER_DISTANCE_H
	{
		ImageBitmap = Bitmap {File = "dstv_dst_h.png" ;} ;
	};

	Image IMG_VER_LOW_H
	{
		ImageBitmap = Bitmap {File = "dstv_low_h.png" ;} ;
	};
};

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