package org.marketcetera.photon.internal.positions.ui;
import java.util.Arrays;
import java.util.EnumMap;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.actions.CompoundContributionItem;
import org.marketcetera.core.position.Grouping;
import org.marketcetera.util.misc.ClassVersion;
/* $License$ */
/**
* Menu contribution that provides radio buttons to control the tree grouping of
* {@link PositionsView}.
*
* @see PositionsView#showHierarchicalPage(Grouping[])
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: GroupingContributionItem.java 16154 2012-07-14 16:34:05Z colin $
* @since 1.5.0
*/
@ClassVersion("$Id: GroupingContributionItem.java 16154 2012-07-14 16:34:05Z colin $")
public class GroupingContributionItem extends CompoundContributionItem {
private static final EnumMap<Grouping, String> labels;
static {
// labels must be updated if grouping options change
assert Grouping.values().length == 3;
labels = new EnumMap<Grouping, String>(Grouping.class);
labels.put(Grouping.Account, Messages.GROUPING_CONTRIBUTION_ITEM_ACCOUNT__LABEL.getText());
labels.put(Grouping.Underlying, Messages.GROUPING_CONTRIBUTION_ITEM_UNDERLYING__LABEL.getText());
labels.put(Grouping.Trader, Messages.GROUPING_CONTRIBUTION_ITEM_TRADER__LABEL.getText());
}
private final static class GroupingOption {
final Grouping[] grouping;
final String label;
GroupingOption(Grouping... grouping) {
Assert.isLegal(grouping != null && grouping.length > 0);
this.grouping = grouping;
this.label = createLabel();
}
String createLabel() {
StringBuilder buf = new StringBuilder();
int last = grouping.length - 1;
for (int i = 0; i < last; i++) {
buf.append(labels.get(grouping[i]));
buf.append(", "); //$NON-NLS-1$
}
buf.append(labels.get(grouping[last]));
return buf.toString();
}
IContributionItem createContributionItem() {
return new ContributionItem() {
@Override
public void fill(Menu menu, int index) {
MenuItem item = new MenuItem(menu, SWT.RADIO);
item.setText(label);
PositionsView view = PositionsView.getView();
item.addListener(SWT.Selection, getMenuItemListener(view));
if (view != null) {
item.setSelection(Arrays.equals(grouping, view.getGrouping()));
}
}
private Listener getMenuItemListener(final PositionsView view) {
return new Listener() {
@Override
public void handleEvent(Event event) {
if (Activator.getDefault().getPositionEngine().getValue() == null) {
event.doit = false;
return;
}
MenuItem item = (MenuItem) event.widget;
if (item.getSelection() && view != null) {
view.showHierarchicalPage(grouping);
}
}
};
}
};
}
}
@Override
protected IContributionItem[] getContributionItems() {
GroupingOption[] groupings = getGroupingOptions();
IContributionItem[] items = new IContributionItem[groupings.length];
int i = 0;
for (GroupingOption grouping : groupings) {
items[i++] = grouping.createContributionItem();
}
return items;
}
private GroupingOption[] getGroupingOptions() {
/*
* Maybe customize at some point, e.g. don't include trader unless
* current user is superuser.
*/
return new GroupingOption[] { new GroupingOption(Grouping.Underlying, Grouping.Account),
new GroupingOption(Grouping.Underlying, Grouping.Trader),
new GroupingOption(Grouping.Account, Grouping.Underlying),
new GroupingOption(Grouping.Account, Grouping.Trader),
new GroupingOption(Grouping.Trader, Grouping.Underlying),
new GroupingOption(Grouping.Trader, Grouping.Account) };
}
}