/**************************************************************
 *
 * 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 "testtool.hrc"
#include <svl/solar.hrc>


#define Control_Control	5
#define Control_Border	7
#define Button_Button	Control_Control
#define ButtonWidth		40


ToolBox DisplayHidToolBox {
	SVLook = TRUE ;
	ItemList = {
	ToolBoxItem  {
			Type = TOOLBOXITEM_BUTTON;
			_ToolBoxItemFlags = TIB_AUTOCHECK ;

/*
class FlagToolBoxState
{
	TIB_CHECKABLE, TIB_AUTOCHECK, TIB_RADIOCHECK, TIB_LEFT,
	TIB_AUTOSIZE, TIB_DROPDOWN,
};*/
			Identifier = TT_SHOW;
			ItemBitmap = Bitmap  {
				File = "ttshow.png";
			};
			Text[ en-US ] = "Display IDs";
		};
	ToolBoxItem  {
			Type = TOOLBOXITEM_SEPARATOR;
		};
	ToolBoxItem  {
			_ToolBoxItemFlags = TIB_AUTOSIZE;
			Identifier = TT_OUTPUT;
			Text[ en-US ] = "This is the input window";
		};
	ToolBoxItem  {
			Type = TOOLBOXITEM_SEPARATOR;
		};
	ToolBoxItem  {
			Identifier = TT_SEND_DATA;
			ItemBitmap = Bitmap  {
				File = "ttremote.png";
			};
			Text[ en-US ] = "Transfer to TestTool";
		};
	ToolBoxItem  {
			Type = TOOLBOXITEM_SEPARATOR;
		};
	ToolBoxItem  {
			Identifier = TT_ALLWIN;
			ItemBitmap = Bitmap  {
				File = "ttall.png";
			};
			Text[ en-US ] = "Show all windows";
		};
	ToolBoxItem  {
			Identifier = TT_KURZNAME;
			ItemBitmap = Bitmap  {
				File = "ttdef.png";
			};
			Text[ en-US ] = "Show short names (if available)";
		};
	ToolBoxItem  {
			Identifier = TT_LANGNAME;
			ItemBitmap = Bitmap  {
				File = "tthid.png";
			};
			Text[ en-US ] = "Always show long-name";
		};
	};
	Text[ en-US ] = "DisplayHID";
};

Bitmap TT_SHOW2 {
	File = "ttshow2.png";
};

WorkWindow TT_INLINE_TRANSLATION {
    HelpID = "svtools:WorkWindow:TT_INLINE_TRANSLATION";
	SVLook = TRUE;
	Size = MAP_APPFONT( 2*Control_Border + 4*ButtonWidth + 3*Button_Button, 120 );
	Moveable = TRUE;
	Sizeable = TRUE;
	Closeable = TRUE;
	Border = TRUE;
	GroupBox TT_GB_TRANSLATION {
			Pos = MAP_APPFONT( 2, 3 );
			Size = MAP_APPFONT( 173, 44 );
		Text[ en-US ] = "Translation";
	};
	Edit TT_E_NEW {
	    HelpID = "svtools:Edit:TT_INLINE_TRANSLATION:TT_E_NEW";
			Disable = TRUE;
			Border = TRUE;
			Pos = MAP_APPFONT( 7, 16 );
			Size = MAP_APPFONT( 162, 12 );
			TabStop = TRUE;
		Text[ en-US ] = "~Edit";
	};
	FixedText TT_FT_OLD {
			Pos = MAP_APPFONT( 7, 33 );
			Size = MAP_APPFONT( 162, 10 );
		Text[ en-US ] = "Original Text";
	};
	GroupBox TT_GB_COMMENT {
			Pos = MAP_APPFONT( 2, 52 );
			Size = MAP_APPFONT( 173, 32 );
		Text[ en-US ] = "Comment";
	};
	Edit TT_E_COMMENT {
	    HelpID = "svtools:Edit:TT_INLINE_TRANSLATION:TT_E_COMMENT";
			Disable = TRUE;
			Border = TRUE;
			Pos = MAP_APPFONT( 7, 64 );
			Size = MAP_APPFONT( 162, 12 );
			TabStop = TRUE;
		Text[ en-US ] = "~Comment";
	};
	PushButton TT_PB_SELECT {
	    HelpID = "svtools:PushButton:TT_INLINE_TRANSLATION:TT_PB_SELECT";
			Pos = MAP_APPFONT( Control_Border, 89 );
			Size = MAP_APPFONT( ButtonWidth, 12 );
			TabStop = TRUE;
		Text[ en-US ] = "~Select";
	};
	PushButton TT_PB_RESTORE {
	    HelpID = "svtools:PushButton:TT_INLINE_TRANSLATION:TT_PB_RESTORE";
			Disable = TRUE;
			Pos = MAP_APPFONT( Control_Border + ButtonWidth + Button_Button, 89 );
			Size = MAP_APPFONT( ButtonWidth, 12 );
			TabStop = TRUE;
		Text[ en-US ] = "~Restore";
	};
	PushButton TT_PB_ACCEPT {
	    HelpID = "svtools:PushButton:TT_INLINE_TRANSLATION:TT_PB_ACCEPT";
			Disable = TRUE;
			Pos = MAP_APPFONT( Control_Border + 2*(ButtonWidth + Button_Button), 89 );
			Size = MAP_APPFONT( ButtonWidth, 12 );
			TabStop = TRUE;
		Text[ en-US ] = "~Accept";
	};
	PushButton TT_PB_NEXT {
	    HelpID = "svtools:PushButton:TT_INLINE_TRANSLATION:TT_PB_NEXT";
			Pos = MAP_APPFONT( Control_Border + 3*(ButtonWidth + Button_Button), 89 );
			Size = MAP_APPFONT( ButtonWidth, 12 );
			TabStop = TRUE;
		Text[ en-US ] = "~Next";
	};
	Text[ en-US ] = "Inplace Translation";
};

MessBox TT_DISCARD_CHANGED_DATA {
	Buttons = WB_YES_NO;
	DefButton = WB_DEF_YES;
	Message[ en-US ] = "The Translation will be lost. Proceed anyway?";
};

ErrorBox TT_NO_CONTROL {
	Buttons = WB_OK;
	DefButton = WB_DEF_OK;
	Message[ en-US ] = "The Control is no longer valid. The Translation cannot be saved.";
};

String TT_GPF
{
	Text[ en-US ] = "GPF occurred";
};

String TT_ALTERNATE_CAPTION
{
	Text[ en-US ] = "HelpID does not match UniqueID: ";
};
