/**************************************************************
 * 
 * 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 "docvw.hrc"
#include "cmdid.h"
#include "helpid.h"
#define SEPARATOR MenuItem { Separator = TRUE; };
Menu MN_READONLY_POPUP
{
	ItemList =
	{
		MenuItem
		{
			Identifier = MN_READONLY_OPENURL ;
			HelpId = CMD_SID_OPENDOC ;
			Text [ en-US ] = "~Open" ;
		};
		MenuItem
		{
			Identifier = MN_READONLY_OPENURLNEW ;
			HelpId = CMD_SID_OPENDOC ;
			Text [ en-US ] = "Open in New Window" ;
		};
		MenuItem
		{
			Identifier = MN_READONLY_EDITDOC ;
			HelpId = CMD_SID_EDITDOC ;
			Text [ en-US ] = "~Edit" ;
		};
        MenuItem
		{
            Identifier = MN_READONLY_SELECTION_MODE ;
            HelpId = CMD_FN_READONLY_SELECTION_MODE ;
        	Text [ en-US ] = "Select Text";
		};
		MenuItem
		{
			Identifier = MN_READONLY_RELOAD;
			HelpId = CMD_SID_RELOAD;
			Text [ en-US ] = "Re~load";
		};
		MenuItem
		{
			Identifier = MN_READONLY_RELOAD_FRAME;
			HelpId = CMD_SID_RELOAD;
			Text [ en-US ] = "Reload Frame";
		};
		MenuItem
		{
			Identifier = MN_READONLY_SOURCEVIEW ;
			HelpId = HID_SOURCEVIEW ;
			Text [ en-US ] = "HT~ML Source" ;
		};
		SEPARATOR
		MenuItem
		{
			Identifier = MN_READONLY_BROWSE_BACKWARD ;
			HelpId = CMD_SID_BROWSE_BACKWARD ;
			Text [ en-US ] = "Backwards" ;
		};
		MenuItem
		{
			Identifier = MN_READONLY_BROWSE_FORWARD ;
			HelpId = CMD_SID_BROWSE_FORWARD ;
			Text [ en-US ] = "~Forward" ;
		};
		SEPARATOR
		MenuItem
		{
			Identifier = MN_READONLY_SAVEGRAPHIC ;
			HelpID = HID_MN_READONLY_SAVEGRAPHIC ;
			Text [ en-US ] = "Save Graphics..." ;
		};
		MenuItem
		{
			Identifier = MN_READONLY_GRAPHICTOGALLERY ;
			HelpID = HID_MN_READONLY_GRAPHICTOGALLERY ;
			SubMenu = Menu
			{
				ItemList =
				{
					MenuItem
					{
						Identifier = MN_READONLY_TOGALLERYLINK ;
						HelpID = HID_MN_READONLY_TOGALLERYLINK ;
						Text [ en-US ] = "As Link" ;
					};
					MenuItem
					{
						Identifier = MN_READONLY_TOGALLERYCOPY ;
						HelpID = HID_MN_READONLY_TOGALLERYCOPY ;
						Text [ en-US ] = "Copy" ;
					};
					SEPARATOR
				};
			};
			Text [ en-US ] = "Add Graphics" ;
		};
		MenuItem
		{
			Identifier = MN_READONLY_SAVEBACKGROUND ;
			HelpID = HID_MN_READONLY_SAVEBACKGROUND ;
			Text [ en-US ] = "Save Background..." ;
		};
		MenuItem
		{
			Identifier = MN_READONLY_BACKGROUNDTOGALLERY ;
			HelpID = HID_MN_READONLY_BACKGROUNDTOGALLERY ;
			SubMenu = Menu
			{
				ItemList =
				{
					MenuItem
					{
						Identifier = MN_READONLY_TOGALLERYLINK ;
						HelpID = HID_MN_READONLY_TOGALLERYLINK ;
						Text [ en-US ] = "As Link" ;
					};
					MenuItem
					{
						Identifier = MN_READONLY_TOGALLERYCOPY ;
						HelpID = HID_MN_READONLY_TOGALLERYCOPY ;
						Text [ en-US ] = "Copy" ;
					};
					SEPARATOR
				};
			};
			Text [ en-US ] = "Add Background" ;
		};
		SEPARATOR
		MenuItem
		{
			Identifier = MN_READONLY_COPYLINK ;
			HelpID = HID_MN_READONLY_COPYLINK ;
			Text [ en-US ] = "Copy ~Link" ;
		};
		MenuItem
		{
			Identifier = MN_READONLY_COPYGRAPHIC ;
			HelpID = HID_MN_READONLY_COPYGRAPHIC ;
			/* ### ACHTUNG: Neuer Text in Resource? Grafik ~kopieren : ~Grafik kopieren */
			/* ### ACHTUNG: Neuer Text in Resource? Grafik ~kopieren : ~Grafik kopieren */
			/* ### ACHTUNG: Neuer Text in Resource? Grafik ~kopieren : ~Grafik kopieren */
			Text [ en-US ] = "Copy ~Graphics" ;
		};
		SEPARATOR
		MenuItem
		{
			Identifier = MN_READONLY_LOADGRAPHIC ;
			HelpID = HID_MN_READONLY_LOADGRAPHIC ;
			Text [ en-US ] = "Load Graphics" ;
		};
		MenuItem
		{
			Identifier = MN_READONLY_GRAPHICOFF ;
			HelpID = HID_MN_READONLY_GRAPHICOFF ;
			Text [ en-US ] = "Graphics Off" ;
		};
		MenuItem
		{
			Identifier = MN_READONLY_PLUGINOFF ;
			HelpID = HID_MN_READONLY_PLUGINOFF ;
			Text [ en-US ] = "Plug-ins Off" ;
		};
        SEPARATOR
        MenuItem
        {
            Identifier = SID_WIN_FULLSCREEN;
            HelpId = CMD_SID_WIN_FULLSCREEN;
            Text [ en-US ] = "Leave Full-Screen Mode" ;
		};
        SEPARATOR
        MenuItem
        {
            Identifier = MN_READONLY_COPY ;
            HelpId = CMD_SID_COPY;
            Text [ en-US ] = "~Copy" ;
        };
    };
};
String STR_EXPORT_GRAFIK_TITLE
{
	Text [ en-US ] = "Graphics Export" ;
};
String STR_CHAIN_OK
{
	Text [ en-US ] = "Click the left mouse button to link the frames." ;
};
String STR_CHAIN_NOT_EMPTY
{
	Text [ en-US ] = "Target frame not empty." ;
};
String STR_CHAIN_IS_IN_CHAIN
{
	Text [ en-US ] = "Target frame is already linked." ;
};
String STR_CHAIN_WRONG_AREA
{
	Text [ en-US ] = "The target frame for the link is in an invalid area." ;
};
String STR_CHAIN_NOT_FOUND
{
	Text [ en-US ] = "Target frame not found at current position." ;
};
String STR_CHAIN_SOURCE_CHAINED
{
	Text [ en-US ] = "The source frame is already the source of a link." ;
};
String STR_CHAIN_SELF
{
	Text [ en-US ] = "A closed link is not possible." ;
};
String STR_REDLINE_INSERT
{
	Text [ en-US ] = "Inserted" ;
};
String STR_REDLINE_DELETE
{
	Text [ en-US ] = "Deleted" ;
};
String STR_REDLINE_FORMAT
{
	Text [ en-US ] = "Formatted" ;
};
String STR_REDLINE_TABLE
{
	Text [ en-US ] = "Table changed" ;
};
String STR_REDLINE_FMTCOLL
{
	Text [ en-US ] = "Applied Paragraph Styles";
};
String STR_ENDNOTE
{
	Text [ en-US ] = "Endnote: " ;
};
String STR_FTNNOTE
{
	Text [ en-US ] = "Footnote: " ;
};

InfoBox MSG_READONLY_CONTENT
{
	Message [ en-US ] = "Readonly content cannot be changed.\nNo modifications will be accepted";
};

String STR_TABLE_COL_ADJUST
{
    Text [ en-US ] = "Adjust table column" ;
};
String STR_TABLE_ROW_ADJUST
{
    Text [ en-US ] = "Adjust table row" ;
};
String STR_TABLE_SELECT_ALL
{
    Text [ en-US ] = "Select whole table" ;
};
String STR_TABLE_SELECT_ROW
{
    Text [ en-US ] = "Select table row" ;
};
String STR_TABLE_SELECT_COL
{
    Text [ en-US ] = "Select table column" ;
};

String STR_SMARTTAG_CLICK
{
    Text [ en-US ] = "%s-click to open Smart Tag menu" ;
};

