/**************************************************************
 *
 * 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 "sc.hrc"
#include "submenu.hrc"
#include <svx/globlmn.hrc>
//
// Defines -------------------------------------------------------------------------------
//
#define MN_RESET\
	MenuItem\
	{\
		Identifier = SID_TEXT_STANDARD ; \
		HelpID = CMD_SID_TEXT_STANDARD ; \
		Text [ en-US ] = "~Default" ; \
	};

// Font (SID_ATTR_CHAR_FONT) und Groesse (SID_ATTR_CHAR_FONTHEIGHT) duerfen nicht im
// Formatmenue auftauchen, weil die Controller im ExeEnv sonst im Container angelegt werden
#define MN_TEXT_ATTR\
	MenuItem\
	{\
		Identifier = RID_MN_FORMAT_STYLE ; \
		HelpID = HID_MN_FORMAT_STYLE ; \
		Text [ en-US ] = "~Style" ; \
		SubMenu = Menu\
		{\
			ItemList = \
			{\
				MenuItem\
				{\
					ITEM_FORMAT_ATTR_CHAR_WEIGHT\
				};\
				MenuItem\
				{\
					ITEM_FORMAT_ATTR_CHAR_POSTURE\
				};\
				MenuItem\
				{\
					ITEM_FORMAT_ATTR_CHAR_OVERLINE\
				};\
				MenuItem\
				{\
					ITEM_FORMAT_ATTR_CHAR_UNDERLINE\
				};\
				MenuItem\
				{\
					ITEM_FORMAT_ATTR_CHAR_STRIKEOUT\
				};\
				MenuItem\
				{\
					ITEM_FORMAT_ATTR_CHAR_SHADOWED\
				};\
				MenuItem\
				{\
					ITEM_FORMAT_ATTR_CHAR_CONTOUR\
				};\
				MenuItem\
				{\
					Separator = TRUE ; \
				};\
				MenuItem\
				{\
					Identifier = SID_SET_SUPER_SCRIPT ; \
					HelpID = CMD_SID_SET_SUPER_SCRIPT ; \
					Text [ en-US ] = "~Superscript" ; \
				};\
				MenuItem\
				{\
					Identifier = SID_SET_SUB_SCRIPT ; \
					HelpID = CMD_SID_SET_SUB_SCRIPT ; \
					Text [ en-US ] = "S~ubscript" ; \
				};\
			};\
		};\
	};\
	MenuItem\
	{\
		Identifier = RID_MN_FORMAT_ALGN ; \
		HelpID = HID_MN_FORMAT_ALGN ; \
		Text [ en-US ] = "~Alignment" ; \
		RadioCheck = TRUE ; \
		SubMenu = Menu\
		{\
			ItemList = \
			{\
				MenuItem\
				{\
					Identifier = SID_ALIGNLEFT ; \
					HelpID = CMD_SID_ATTR_PARA_ADJUST_LEFT ; \
					RadioCheck = TRUE ; \
					Text [ en-US ] = "~Left" ;\
				};\
				MenuItem\
				{\
					Identifier = SID_ALIGNRIGHT ; \
					HelpID = CMD_SID_ATTR_PARA_ADJUST_RIGHT ; \
					RadioCheck = TRUE ; \
					Text [ en-US ] = "~Right" ;\
				};\
				MenuItem\
				{\
					Identifier = SID_ALIGNCENTERHOR ; \
					HelpID = CMD_SID_ATTR_PARA_ADJUST_CENTER ; \
					RadioCheck = TRUE ; \
					Text [ en-US ] = "~Centered" ;\
				};\
				MenuItem\
				{\
					Identifier = SID_ALIGNBLOCK ; \
					HelpID = CMD_SID_ATTR_PARA_ADJUST_BLOCK ; \
					RadioCheck = TRUE ; \
					Text [ en-US ] = "~Justified" ; \
				};\
			};\
		};\
	};\
	MenuItem\
	{\
		Identifier = RID_MN_FORMAT_LINESPACE ; \
		HelpID = HID_MN_FORMAT_LINESPACE ; \
		Text [ en-US ] = "~Line Spacing" ; \
		_MenuItemFlags = MIB_RADIOCHECK ; \
		SubMenu = Menu\
		{\
			ItemList = \
			{\
				MenuItem\
				{\
					ITEM_FORMAT_PARA_LINESPACE_10\
					RadioCheck = TRUE ; \
				};\
				MenuItem\
				{\
					ITEM_FORMAT_PARA_LINESPACE_15\
					RadioCheck = TRUE ; \
				};\
				MenuItem\
				{\
					ITEM_FORMAT_PARA_LINESPACE_20\
					RadioCheck = TRUE ; \
				};\
			};\
		};\
	};

#define MN_DRWTXT \
	MenuItem\
	{\
		ITEM_FORMAT_CHAR_DLG\
	};\
	MenuItem\
	{\
		ITEM_FORMAT_PARA_DLG\
	};

#ifdef ISSUE66550_HLINK_FOR_SHAPES
#define MN_EDITLNK \
	MenuItem\
	{\
		Identifier = SID_DRAW_HLINK_EDIT ; \
		HelpID = CMD_SID_DRAW_HLINK_EDIT ; \
		Text [ en-US ] = "~Hyperlink..." ; \
	};

#define MN_DELLNK \
	MenuItem\
	{\
		Identifier = SID_DRAW_HLINK_DELETE ; \
		HelpID = CMD_SID_DRAW_HLINK_DELETE ; \
		Text [ en-US ] = "~Remove Hyperlink" ; \
	};
#endif

#define MN_DRWTXTATTR \
	MenuItem\
	{\
		Identifier = SID_DRAWTEXT_ATTR_DLG ; \
		HelpID = CMD_SID_DRAWTEXT_ATTR_DLG ; \
		Text [ en-US ] = "Te~xt..." ; \
	};

#define MN_ASSIGNMACRO \
	 MenuItem\
	 {\
		 Identifier = SID_ASSIGNMACRO ; \
		 HelpID = CMD_SID_ASSIGNMACRO ; \
		 Text [ en-US ] = "Assig~n Macro..." ; \
 	};

#define MN_ORIGINALSIZE \
	MenuItem\
	{\
		Identifier = SID_ORIGINALSIZE ; \
		HelpId = CMD_SID_ORIGINALSIZE ; \
		Text [ en-US ] = "~Original Size" ; \
	};

#define MN_RENAME_OBJECT \
	MenuItem\
	{\
		Identifier = SID_RENAME_OBJECT ; \
		HelpId = CMD_SID_RENAME_OBJECT ; \
		Text [ en-US ] = "Name..." ;\
	};

// #i68101#
#define MN_TITLE_DESCRIPTION_OBJECT \
	MenuItem\
	{\
		Identifier = SID_TITLE_DESCRIPTION_OBJECT ; \
		HelpId = CMD_SID_TITLE_DESCRIPTION_OBJECT ; \
		Text [ en-US ] = "Description..." ;\
	};

#define MN_MIRRORSUB \
	MenuItem\
	{\
		Identifier = SUBMENU_OBJMIRROR ; \
		HelpID = HID_SCMENU_OBJMIRROR ; \
		Text [ en-US ] = "~Flip" ; \
		SubMenu = Menu\
		{\
			ItemList = \
			{\
				MenuItem\
				{\
					Identifier = SID_MIRROR_VERTICAL ; \
					HelpId = CMD_SID_MIRROR_VERTICAL ; \
					Text [ en-US ] = "~Vertically" ; \
				};\
				MenuItem\
				{\
					Identifier = SID_MIRROR_HORIZONTAL ; \
					HelpId = CMD_SID_MIRROR_HORIZONTAL ; \
					Text [ en-US ] = "~Horizontal" ; \
				};\
			};\
		};\
	};

#define MN_ARRANGESUB \
	MenuItem\
	{\
		Identifier = SUBMENU_OBJARRANGE ; \
		HelpID = HID_SCMENU_OBJARRANGE ; \
		Text [ en-US ] = "~Arrange" ; \
		SubMenu = Menu\
		{\
			ItemList = \
			{\
				MenuItem\
				{\
					ITEM_FORMAT_FRAME_TO_TOP\
				};\
				MenuItem\
				{\
					Identifier = SID_FRAME_UP ; \
					HelpId = CMD_SID_FRAME_UP ; \
					Text [ en-US ] = "Bring ~Forward" ; \
				};\
				MenuItem\
				{\
					Identifier = SID_FRAME_DOWN ; \
					HelpId = CMD_SID_FRAME_DOWN ; \
					Text [ en-US ] = "Send Back~ward" ; \
				};\
				MenuItem\
				{\
					ITEM_FORMAT_FRAME_TO_BOTTOM\
				};\
				MenuItem { Separator = TRUE ; }; \
				MenuItem\
				{\
					ITEM_FORMAT_OBJECT_HEAVEN\
				};\
				MenuItem\
				{\
					ITEM_FORMAT_OBJECT_HELL\
				};\
			};\
		};\
	};

#define MN_ANCHORSUB \
	MenuItem\
	{\
		Identifier = SUBMENU_ANCHOR ; \
		HelpID = HID_SCMENU_ANCHOR ; \
		Text [ en-US ] = "An~chor" ; \
		SubMenu = Menu\
		{\
			ItemList = \
			{\
				MenuItem\
				{\
					RadioCheck = TRUE ; \
					Identifier = SID_ANCHOR_PAGE ; \
					HelpId = CMD_SID_ANCHOR_PAGE ; \
					Text [ en-US ] = "To P~age" ; \
				};\
				MenuItem\
				{\
					RadioCheck = TRUE ; \
					Identifier = SID_ANCHOR_CELL ; \
					HelpId = CMD_SID_ANCHOR_CELL ; \
					Text [ en-US ] = "To ~Cell" ; \
				};\
			};\
		};\
	};

#define MN_ALIGNSUB \
	MenuItem\
	{\
		Identifier = SID_OBJECT_ALIGN ; \
		HelpId = CMD_SID_OBJECT_ALIGN ; \
		Text [ en-US ] = "A~lignment" ; \
		SubMenu = Menu\
		{\
			ItemList = \
			{\
				MenuItem\
				{\
					ITEM_FORMAT_OBJECT_ALIGN_LEFT\
				};\
				MenuItem\
				{\
					ITEM_FORMAT_OBJECT_ALIGN_CENTER\
				};\
				MenuItem\
				{\
					ITEM_FORMAT_OBJECT_ALIGN_RIGHT\
				};\
				MenuItem\
				{\
					Separator = TRUE ; \
				};\
				MenuItem\
				{\
					ITEM_FORMAT_OBJECT_ALIGN_UP\
				};\
				MenuItem\
				{\
					ITEM_FORMAT_OBJECT_ALIGN_MIDDLE\
				};\
				MenuItem\
				{\
					ITEM_FORMAT_OBJECT_ALIGN_DOWN\
				};\
			};\
		};\
	};

//
// ------------------------------------------------------------------------------
//
//
// Objekt-Bars
//
String RID_DRAW_OBJECTBAR
{
	Text [ en-US ] = "Drawing Object Bar" ;
};
//
// Text-Toolbox
//
String RID_TEXT_TOOLBOX
{
	Text [ en-US ] = "Text Object Bar" ;
};
//
//	Graphics toolbox
//
String RID_GRAPHIC_OBJECTBAR
{
	Text [ en-US ] = "Graphics Object Bar" ;
};
//
// Popup-Menus ----------------------------------------------------------------------
//
String RID_POPUP_DRAW
{
	Text [ en-US ] = "Pop-up menu for drawing objects" ;
};
//
// Popup-Menu for (general) drawing objects
//
Menu RID_POPUP_DRAW
{
	ItemList =
	{
		MenuItem { ITEM_FORMAT_ATTRIBUTES_LINE };
		MenuItem { ITEM_FORMAT_ATTRIBUTES_AREA };
		MN_DRWTXTATTR// Text...
		MenuItem { ITEM_FORMAT_ATTR_TRANSFORM };

		//-#i68101#----------------------
		MenuItem { Separator = TRUE ; };
		MN_TITLE_DESCRIPTION_OBJECT
		MN_RENAME_OBJECT
		//-#i68101#----------------------

		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		MN_MIRRORSUB
		MN_ARRANGESUB
		MN_ALIGNSUB
		MN_ANCHORSUB
		MN_ASSIGNMACRO
		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		MenuItem
		{
			ITEM_FORMAT_BEZIER_EDIT
			RadioCheck = FALSE ;
			AutoCheck = TRUE ;
		};
		MenuItem
		{
			ITEM_FORMAT_FONTWORK
		};
		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		ITEM_GROUP_MENU
#ifdef ISSUE66550_HLINK_FOR_SHAPES
		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		MN_EDITLNK
		MN_DELLNK
		MenuItem { ITEM_OPEN_HYPERLINK };
#endif
	};
};

//
// Popup-Menu for (Uno-) Controls
//

Menu RID_POPUP_CONTROL
{
	ItemList =
	{
		MenuItem { ITEM_FORMAT_ATTR_TRANSFORM };

		//-#i68101#----------------------
		MenuItem { Separator = TRUE ; };
		MN_TITLE_DESCRIPTION_OBJECT
		MN_RENAME_OBJECT
		//-#i68101#----------------------

		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		MenuItem { ITEM_FORM_CONTROL_PROPERTIES };
		MenuItem { ITEM_FORM_PROPERTIES };
		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		MN_ARRANGESUB
		MN_ALIGNSUB
		MN_ANCHORSUB
		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		ITEM_GROUP_MENU
	};
};

//
// Graphic
//

Menu RID_POPUP_GRAPHIC
{
	ItemList =
	{
		MenuItem { ITEM_FORMAT_ATTRIBUTES_LINE };// #i25616#
		MenuItem { ITEM_FORMAT_ATTRIBUTES_AREA };// #i25616#
		MN_DRWTXTATTR
		MenuItem { ITEM_FORMAT_ATTR_TRANSFORM };
		MN_ORIGINALSIZE

		//-#i68101#----------------------
		MenuItem { Separator = TRUE ; };
		MN_TITLE_DESCRIPTION_OBJECT
		MN_RENAME_OBJECT
		//-#i68101#----------------------

		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		MN_MIRRORSUB
		MN_ARRANGESUB
		MN_ALIGNSUB
		MN_ANCHORSUB
		MN_ASSIGNMACRO
		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		ITEM_GROUP_MENU
#ifdef ISSUE66550_HLINK_FOR_SHAPES
		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		MN_EDITLNK
		MN_DELLNK
		MenuItem { ITEM_OPEN_HYPERLINK };
#endif
	};
};

//
// Media
//

Menu RID_POPUP_MEDIA
{
	ItemList =
	{
		MenuItem { ITEM_FORMAT_ATTR_TRANSFORM };

		//-#i68101#----------------------
		MenuItem { Separator = TRUE ; };
		MN_TITLE_DESCRIPTION_OBJECT
		MN_RENAME_OBJECT
		//-#i68101#----------------------

		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		MN_MIRRORSUB
		MN_ARRANGESUB
		MN_ALIGNSUB
		MN_ANCHORSUB
		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		ITEM_GROUP_MENU
		};
};

//
// Ole-Object
//

Menu RID_POPUP_OLE
{
	ItemList =
	{
		// -#i118485# Added support for Line, Area and Text
		MenuItem { ITEM_FORMAT_ATTRIBUTES_LINE };
		MenuItem { ITEM_FORMAT_ATTRIBUTES_AREA };
		MN_DRWTXTATTR
		//-#i118485#----------------------

		MenuItem { ITEM_FORMAT_ATTR_TRANSFORM };
		MN_ORIGINALSIZE

		//-#i68101#----------------------
		MenuItem { Separator = TRUE ; };
		MN_TITLE_DESCRIPTION_OBJECT
		MN_RENAME_OBJECT
		//-#i68101#----------------------

		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		MN_ARRANGESUB
		MN_ALIGNSUB
		MN_ANCHORSUB
		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		ITEM_GROUP_MENU
	};
};

//
// Charts
//

Menu RID_POPUP_CHART
{
	ItemList =
	{
		// -#i118485# Added support for Line, Area and Text
		MenuItem { ITEM_FORMAT_ATTRIBUTES_LINE };
		MenuItem { ITEM_FORMAT_ATTRIBUTES_AREA };
		MN_DRWTXTATTR
		//-#i118485#----------------------

		MenuItem { ITEM_FORMAT_ATTR_TRANSFORM };
		MN_ORIGINALSIZE

		//-#i68101#----------------------
		MenuItem { Separator = TRUE ; };
		MN_TITLE_DESCRIPTION_OBJECT
		MN_RENAME_OBJECT
		//-#i68101#----------------------

		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		MN_ARRANGESUB
		MN_ALIGNSUB
		MN_ANCHORSUB
		//------------------------------
		MenuItem { Separator = TRUE ; };
		//------------------------------
		ITEM_GROUP_MENU
	};
};

//
// PopUpDraw Text
//

String RID_POPUP_DRAWTEXT
{
	Text [ en-US ] = "Pop-up menu for text objects" ;
};

Menu RID_POPUP_DRAWTEXT
{
	ItemList =
	{
		MN_RESET
		MenuItem { Separator = TRUE ; };
		MN_DRWTXTATTR
		MenuItem { Separator = TRUE ; };
		MenuItem
		{
			ITEM_FORMAT_ATTR_CHAR_FONT
		};
		MenuItem
		{
			ITEM_FORMAT_ATTR_CHAR_FONTHEIGHT
		};
		// Stil, Ausrichtung, Zeilenabstand
		MN_TEXT_ATTR
		MenuItem { Separator = TRUE ; };
		// Zeichen, Absatz
		MN_DRWTXT
		MenuItem { Separator = TRUE ; };
		MenuItem
		{
			ITEM_OPEN_HYPERLINK
		};
	};
};

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