blob: a0a26332ca9400b67c239516b50845d5dd2f7ce0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2006 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.ui.internal.menus;
import org.eclipse.jface.util.Util;
import org.eclipse.ui.internal.misc.Policy;
/**
* <p>
* A location element referring to a specific path within within the menu bar,
* tool bar or status line.
* </p>
* <p>
* Clients may instantiate this class, but must not extend.
* </p>
* <p>
* <strong>PROVISIONAL</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>
* <p>
* This class will eventually exist in <code>org.eclipse.jface.menus</code>.
* </p>
*
* @since 3.2
*/
public final class SBar extends LeafLocationElement {
/**
* The constant used for a menu bar.
*/
public static final String TYPE_MENU = "menu"; //$NON-NLS-1$
/**
* The constant used for the tool bar.
*/
public static final String TYPE_TRIM = "trim"; //$NON-NLS-1$
/**
* The type of bar this is making reference to.
*/
private final String type;
/**
* Constructs a new instance of <code>SBar</code>. This bar will refer to
* the menu type. It will contribute the item to top-most node in the menu
* hierarchy.
*/
public SBar() {
this(TYPE_MENU, null);
}
/**
* Constructs a new instance of <code>SBar</code>. This bar will refer to
* the menu type.
*
* @param path
* The path to the final location. If this value is
* <code>null</code>, it means that it should be inserted at
* the top-level of the bar.
* @see #TYPE_MENU
*/
public SBar(final String path) {
this(TYPE_MENU, path);
}
/**
* Constructs a new instance of <code>SBar</code>.
*
* @param type
* The type of bar this is making reference to.
* @param path
* The path to the final location. If this value is
* <code>null</code>, it means that it should be inserted at
* the top-level of the bar.
* @see #TYPE_MENU
* @see #TYPE_STATUS
* @see #TYPE_TRIM
*/
public SBar(final String type, final String path) {
super(path);
this.type = type;
}
public final LocationElement createChild(final String id) {
final String parentPath = getPath();
final String path;
if (parentPath == null) {
path = id;
} else {
path = parentPath + PATH_SEPARATOR + id;
}
return new SBar(getType(), path);
}
public final ILocationElementTokenizer getTokenizer() {
if (Policy.EXPERIMENTAL_MENU && getPath() != null
&& getPath().indexOf(LeafLocationElement.BREAKPOINT_PATH) > -1) {
System.err.println("getTokenizer: " + getPath()); //$NON-NLS-1$
}
return new ILocationElementTokenizer() {
String remainingPath = getPath();
String parsedPath = null;
public final LocationElementToken nextToken() {
final SLocation location = new SLocation(new SBar(getType(),
parsedPath));
final int separator = remainingPath
.indexOf(LeafLocationElement.PATH_SEPARATOR);
final String id;
if (separator == -1) {
id = remainingPath;
remainingPath = null;
} else {
id = remainingPath.substring(0, separator);
remainingPath = remainingPath.substring(separator + 1);
if (remainingPath.length()==0) {
remainingPath = null;
}
}
if (parsedPath==null) {
parsedPath = id;
} else {
parsedPath = parsedPath + '/' + id;
}
return new LocationElementToken(location, id);
}
public final boolean hasMoreTokens() {
return remainingPath != null;
}
};
}
/**
* Returns the type for this bar.
*
* @return The type for this bar.
*/
public final String getType() {
return type;
}
public final String toString() {
final StringBuffer buffer = new StringBuffer();
buffer.append("SBar("); //$NON-NLS-1$
buffer.append(type);
buffer.append(',');
buffer.append(getPath());
buffer.append(')');
return buffer.toString();
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.menus.LeafLocationElement#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
if (this==obj) {
return true;
}
if (obj instanceof SBar) {
SBar bar = (SBar) obj;
return Util.equals(type, bar.type) && super.equals(obj);
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.menus.LeafLocationElement#hashCode()
*/
public int hashCode() {
return Util.hashCode(type) + super.hashCode();
}
}