/******************************************************************************* * Copyright (c) 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: *     IBM Corporation - initial API and implementation ******************************************************************************/package org.eclipse.jface.menus;/** * <p> * A location for a menu element. A location carries with it information about * the group in which is should appear. The location can also specify a style of * image to associate with the menu element and a mnemonic. * </p> * <p> * Clients may instantiate this class, but must not extend. * </p> * <p> * <strong>EXPERIMENTAL</strong>. This class or interface has been added as * part of a work in progress. There is a guarantee neither that this API will * work nor that it will remain the same. Please do not use this API without * consulting with the Platform/UI team. * </p> *  * @since 3.2 */public final class SLocation {	/**	 * The constant to use if there is no mnemonic for this location.	 */	public static final char MNEMONIC_NONE = 0;	/**	 * The mnemonic to use in this location. This value may be <code>null</code>.	 */	private final char mnemonic;	/**	 * The style of image to use in this location. This value may be	 * <code>null</code> if the default image style should be used.	 */	private final String imageStyle;	/**	 * The ordering constraints for this menu element with respect to other menu	 * elements. This value may be <code>null</code>.	 */	private final SOrder[] orderings;	/**	 * The location element specifying the path for this location. This	 * indicates which menu or tool bar this location indicates.	 */	private final LocationElement path;	/**	 * Constructs a new instance of <code>SLocation</code>.	 * 	 * @param mnemonic	 *            The mnemonic to use in this particular location. The mnemonic	 *            should be translated. If there is no mnemonic, then send	 *            <code>MNEMONIC_NONE</code>	 * @param imageStyle	 *            The style of image to use in this location. If this value is	 *            <code>null</code>, then the default image style is used.	 * @param orderings	 *            The ordering constraints for this menu element with respect to	 *            other menu elements. This value may be <code>null</code>.	 * @param path	 *            The location element specifying the path for this location;	 *            must not be null.	 */	public SLocation(char mnemonic, String imageStyle,			final SOrder[] orderings, final LocationElement path) {		if ((imageStyle != null) && (imageStyle.length() == 0)) {			imageStyle = null;		}		if (path == null) {			throw new NullPointerException(					"The path for a location must not be null"); //$NON-NLS-1$		}		this.mnemonic = mnemonic;		this.imageStyle = imageStyle;		this.orderings = orderings;		this.path = path;	}	/**	 * Returns the image style for this location.	 * 	 * @return The image style. If the default image style, then	 *         <code>null</code>.	 */	public final String getImageStyle() {		return imageStyle;	}	/**	 * Returns the mnemonic for this location. The mnemonic should be	 * translated.	 * 	 * @return The mnemonic. If no mnemonic, then <code>MNEMONIC_NONE</code>.	 */	public final char getMnemonic() {		return mnemonic;	}	/**	 * Returns the ordering for this location. This copies the internal data	 * structure.	 * 	 * @return The ordering. If no ordering, then <code>null</code>.	 */	public final SOrder[] getOrderings() {		if (orderings == null) {			return null;		}		final int length = orderings.length;		final SOrder[] copy = new SOrder[length];		System.arraycopy(orderings, 0, copy, 0, length);		return copy;	}	/**	 * Returns the path for this location element.	 * 	 * @return The path; never <code>null</code>.	 */	public final LocationElement getPath() {		return path;	}	public final String toString() {		final StringBuffer buffer = new StringBuffer();		buffer.append("SLocation("); //$NON-NLS-1$		buffer.append(path);		buffer.append(',');		buffer.append(mnemonic);		buffer.append(',');		buffer.append(imageStyle);		buffer.append(',');		buffer.append(orderings);		buffer.append(')');		return buffer.toString();	}}