/**************************************************************
 * 
 * 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 "dlg_DataEditor.hrc"
#include "SchSlotIds.hxx"
#include "HelpIds.hrc"

// Mask Color for standard images
#define IMAGE_BUTTON_STD_MASK_COLOR Color { Red = 0xff00; Green = 0x0000; Blue = 0xff00; }
// Mask Color for high-contrast images
#define IMAGE_BUTTON_HC_MASK_COLOR  IMAGE_BUTTON_STD_MASK_COLOR

#define ADDITIONAL_SPACE_ABOVE_TABLE 17

ModalDialog DLG_DIAGRAM_DATA
{
	HelpID = HID_DIAGRAM_DATA ;
	OutputSize = TRUE ;
	Hide = TRUE ;
	SVLook = TRUE ;
	Pos = MAP_APPFONT ( 0 , 0 ) ;
	Size = MAP_APPFONT ( 244 , 152 ) ;

	Text [ en-US ] = "Data Table";

	Moveable = TRUE ;
	Closeable = TRUE ;
    Sizeable = TRUE ;
	Control CTL_DATA
	{
		HelpID = HID_SCH_CTL_DATA ;
		Border = TRUE ;
		Pos = MAP_APPFONT ( 6 , 24 + ADDITIONAL_SPACE_ABOVE_TABLE ) ;
		Size = MAP_APPFONT ( 232 , 121 - ADDITIONAL_SPACE_ABOVE_TABLE ) ;
		TabStop = TRUE ;
	};
	ToolBox TBX_DATA
	{
		HelpID = HID_SCH_TBX_DATA ;
		SVLook = TRUE ;
		TabStop = TRUE ;
 		Pos = MAP_APPFONT ( 4 , 2 ) ;
		ItemList =
		{
			ToolBoxItem
			{
				HelpID = HID_SCH_TBI_DATA_INSERT_ROW ;
				Identifier = TBI_DATA_INSERT_ROW ;
				Text [ en-US ] = "Insert Row" ;
			};
			ToolBoxItem
			{
				HelpID = HID_SCH_TBI_DATA_INSERT_COL ;
				Identifier = TBI_DATA_INSERT_COL ;
				Text [ en-US ] = "Insert Series" ;
			};
			ToolBoxItem
			{
				HelpID = HID_SCH_TBI_DATA_INSERT_TEXT_COL ;
				Identifier = TBI_DATA_INSERT_TEXT_COL ;
				Text [ en-US ] = "Insert Text Column" ;
			};
			ToolBoxItem
			{
				HelpID = HID_SCH_TBI_DATA_DELETE_ROW ;
				Identifier = TBI_DATA_DELETE_ROW ;
				Text [ en-US ] = "Delete Row" ;
			};
			ToolBoxItem
			{
				HelpID = HID_SCH_TBI_DATA_DELETE_COL ;
				Identifier = TBI_DATA_DELETE_COL ;
				Text [ en-US ] = "Delete Series" ;
			};
			ToolBoxItem
			{
				Type = TOOLBOXITEM_SEPARATOR ;
			};
			ToolBoxItem
			{
				HelpID = HID_SCH_TBI_DATA_SWAP_COL ;
				Identifier = TBI_DATA_SWAP_COL ;
				Text [ en-US ] = "Move Series Right" ;
			};
			ToolBoxItem
			{
				HelpID = HID_SCH_TBI_DATA_SWAP_ROW ;
				Identifier = TBI_DATA_SWAP_ROW ;
				Text [ en-US ] = "Move Row Down" ;
			};
			ToolBoxItem
			{
				Type = TOOLBOXITEM_SEPARATOR ;
			};
		};
	};

#define IMAGE_ID_LIST                \
    IdList =                         \
    {                                \
        TBI_DATA_INSERT_ROW;         \
        TBI_DATA_INSERT_COL;         \
        TBI_DATA_INSERT_TEXT_COL;    \
        TBI_DATA_DELETE_ROW;         \
        TBI_DATA_DELETE_COL;         \
        TBI_DATA_SWAP_COL;           \
        TBI_DATA_SWAP_ROW;           \
    };                               \
    IdCount = { 7; }

    ImageList IL_DIAGRAM_DATA
    {
        Prefix = "dataeditor_icon";
        MaskColor = IMAGE_BUTTON_STD_MASK_COLOR;
        IMAGE_ID_LIST;
    };

    ImageList IL_HC_DIAGRAM_DATA
    {
        Prefix = "dataeditor_icon_h";
        MaskColor = IMAGE_BUTTON_HC_MASK_COLOR;
        IMAGE_ID_LIST;
    };
};
