/******************************************************************************* * 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 element that is used to select a specific part within the * application. In the Eclipse workbench, this correspond with the concept of a * part. Within JFace, this can refer to any similar ideas or can just be * ignored. * </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 SPart implements LocationElement {	/**	 * The constant used to indicate that the <code>part</code> is a class.	 */	public static final int TYPE_CLASS = 0;	/**	 * The constant used to indicate that the <code>part</code> is an	 * identifier.	 */	public static final int TYPE_ID = 1;	/**	 * The location within the part to place the menu element.	 */	private final LeafLocationElement location;	/**	 * The identifier of the part to which this instance refers, or the class	 * (i.e., class, super class, interface or super interface) of the part.	 * This value must not be <code>null</code>.	 */	private final String part;	/**	 * The type of information carried in <code>part</code>.	 */	private final int type;	/**	 * Constructs a new instance of <code>SPart</code>.	 * 	 * @param part	 *            The part to which this refers. Either its identifier or its	 *            class. Must not be <code>null</code>.	 * @param type	 *            The type of data carried in <code>part</code>.	 * @param location	 *            The location within this part that the menu element should be	 *            placed. Must not be <code>null</code>.	 */	public SPart(final String part, final int type,			final LeafLocationElement location) {		if (part == null) {			throw new NullPointerException("A part needs a class or id"); //$NON-NLS-1$		}		if ((type < TYPE_CLASS) || (type > TYPE_ID)) {			throw new IllegalArgumentException(					"The part must be either a class or an identifier"); //$NON-NLS-1$		}		if (location == null) {			throw new NullPointerException(					"A part needs a location for the menu element to appear"); //$NON-NLS-1$		}				this.part = part;		this.type = type;		this.location = location;	}	/**	 * Returns the location within this part that the menu element should be	 * placed. Must not be <code>null</code>.	 * 	 * @return The location in which the menu element should be placed; never	 *         <code>null</code>.	 */	public final LeafLocationElement getLocation() {		return location;	}	/**	 * Returns either the class name to which this part refers or the identifier	 * of the part. The type is indicated by a call to {@link SPart#getType()}	 * 	 * @return The class name or identifier; never <code>null</code>.	 */	public final String getPart() {		return part;	}	/**	 * Returns the type of this part. This indicates whether this part refers to	 * an identifier or to a class.	 * 	 * @return Either <code>TYPE_CLASS</code> or <code>TYPE_ID</code>.	 */	public final int getType() {		return type;	}	public final String toString() {		final StringBuffer buffer = new StringBuffer();		buffer.append("SPart("); //$NON-NLS-1$		switch (type) {		case TYPE_CLASS:			buffer.append("class"); //$NON-NLS-1$			break;		case TYPE_ID:			buffer.append("id"); //$NON-NLS-1$			break;		default:			buffer.append("unknown"); //$NON-NLS-1$		}		buffer.append(',');		buffer.append(part);		buffer.append(',');		buffer.append(location);		buffer.append(')');		return buffer.toString();	}}