blob: 5507d8ba5dfca65da21f7e8876946e4484e82e6f [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.core.commands.common.NotDefinedException;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.util.Util;
/**
* <p>
* A logical grouping of menu items and widgets. This grouping can also take on
* a physical appearance in the form of separators.
* </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 SGroup extends MenuContainer {
/**
* The property for a property change event indicating that whether the
* separators are visible for this group has changed.
*/
public static final String PROPERTY_SEPARATORS_VISIBLE = "SEPARATORS_VISIBLE"; //$NON-NLS-1$
/**
* Whether separators should be drawn before and after this group, as
* appropriate.
*/
public boolean separatorsVisible = true;
/**
* Constructs a new instance of <code>SGroup</code>.
*
* @param id
* The identifier of the group to create; must not be
* <code>null</code>
*/
SGroup(final String id) {
super(id);
}
/**
* <p>
* Defines this group by indicating whether the separators are visible. The
* location is optional. The defined property automatically becomes
* <code>true</code>.
* </p>
*
* @param separatorsVisible
* Whether separators should be drawn before and after this
* group, as appropriate.
* @param location
* The location in which this group will appear; may be
* <code>null</code>.
*/
public final void define(final boolean separatorsVisible,
final SLocation location) {
define(separatorsVisible, location, null);
}
/**
* <p>
* Defines this group by indicating whether the separators are visible. The
* location and dynamic menu are optional. The defined property
* automatically becomes <code>true</code>.
* </p>
*
* @param separatorsVisible
* Whether separators should be drawn before and after this
* group, as appropriate.
* @param location
* The location in which this group will appear; may be
* <code>null</code>.
* @param dynamic
* The class providing dynamic menu elements to this group; may
* be <code>null</code>.
*/
public final void define(final boolean separatorsVisible,
final SLocation location, final IDynamicMenu dynamic) {
final SLocation[] locations;
if (location == null) {
locations = null;
} else {
locations = new SLocation[] { location };
}
define(separatorsVisible, locations, dynamic);
}
/**
* <p>
* Defines this group by indicating whether the separators are visible. The
* locations and dynamic menu are optional. The defined property
* automatically becomes <code>true</code>.
* </p>
*
* @param separatorsVisible
* Whether separators should be drawn before and after this
* group, as appropriate.
* @param locations
* The locations in which this group will appear; may be
* <code>null</code> or empty.
* @param dynamic
* The class providing dynamic menu elements to this group; may
* be <code>null</code>.
*/
public final void define(final boolean separatorsVisible,
SLocation[] locations, final IDynamicMenu dynamic) {
if ((locations != null) && (locations.length == 0)) {
locations = null;
}
setDefined(true);
setDynamic(dynamic);
setLocations(locations);
setSeparatorsVisible(separatorsVisible);
}
/**
* Sets whether separators should be displayed around this group. This will
* fire a property change event if anyone cares.
*
* @param separatorsVisible
* Whether the separators should be visible.
*/
protected final void setSeparatorsVisible(final boolean separatorsVisible) {
if (this.defined != defined) {
PropertyChangeEvent event = null;
if (isListenerAttached()) {
event = new PropertyChangeEvent(this,
PROPERTY_SEPARATORS_VISIBLE,
(this.separatorsVisible ? Boolean.TRUE : Boolean.FALSE),
(separatorsVisible ? Boolean.TRUE : Boolean.FALSE));
}
this.separatorsVisible = separatorsVisible;
firePropertyChangeEvent(event);
}
}
/**
* <p>
* Defines this group by indicating with only a location is optional. The
* separators are assumed to be visible. The defined property automatically
* becomes <code>true</code>.
* </p>
*
* @param location
* The location in which this group will appear; may be
* <code>null</code>.
*/
public final void define(final SLocation location) {
define(true, location, null);
}
/**
* Whether separators should be drawn around the group.
*
* @return <code>true</code> if the separators should be drawn;
* <code>false</code> otherwise.
* @throws NotDefinedException
* If the handle is not currently defined.
*/
public final boolean isSeparatorsVisible() throws NotDefinedException {
if (!isDefined()) {
throw new NotDefinedException(
"Cannot get whether the separators are visible from an undefined group"); //$NON-NLS-1$
}
return separatorsVisible;
}
/**
* The string representation of this group -- for debugging purposes only.
* This string should not be shown to an end user.
*
* @return The string representation; never <code>null</code>.
*/
public final String toString() {
if (string == null) {
final StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("SGroup("); //$NON-NLS-1$
stringBuffer.append(id);
stringBuffer.append(',');
stringBuffer.append(separatorsVisible);
stringBuffer.append(',');
stringBuffer.append(Util.toString(locations));
stringBuffer.append(',');
try {
stringBuffer.append(dynamic);
} catch (final Exception e) {
// A bogus toString() in third-party code. Ignore.
stringBuffer.append(e.getClass().getName());
}
stringBuffer.append(',');
stringBuffer.append(defined);
stringBuffer.append(')');
string = stringBuffer.toString();
}
return string;
}
/**
* Makes this group become undefined. This has the side effect of changing
* the locations and dynamic class to <code>null</code>. Notification is
* sent to all listeners.
*/
public final void undefine() {
string = null;
setSeparatorsVisible(false);
setDynamic(null);
setLocations(null);
setDefined(false);
}
}