package org.marketcetera.photon.internal.positions.ui; import java.util.ArrayList; import java.util.List; import net.miginfocom.swt.MigLayout; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IMemento; import org.marketcetera.core.position.Grouping; import org.marketcetera.core.position.PositionEngine; import org.marketcetera.core.position.PositionRow; import org.marketcetera.core.position.PositionEngine.PositionData; import org.marketcetera.photon.commons.ui.workbench.ColumnState; import org.marketcetera.photon.core.InstrumentPrettyPrinter; import org.marketcetera.photon.internal.positions.ui.glazed.EventTreeModel; import org.marketcetera.photon.internal.positions.ui.glazed.EventTreeViewer; import org.marketcetera.photon.internal.positions.ui.glazed.TreeComparatorChooser; import org.marketcetera.photon.internal.positions.ui.glazed.TreeItemConfigurer; import org.marketcetera.util.misc.ClassVersion; import ca.odell.glazedlists.EventList; import ca.odell.glazedlists.SortedList; import ca.odell.glazedlists.TextFilterator; /* $License$ */ /** * Hierarchical tree based positions view page. * * @author <a href="mailto:will@marketcetera.com">Will Horn</a> * @version $Id: PositionsViewTreePage.java 16154 2012-07-14 16:34:05Z colin $ * @since 1.5.0 */ @ClassVersion("$Id: PositionsViewTreePage.java 16154 2012-07-14 16:34:05Z colin $") public class PositionsViewTreePage extends PositionsViewPage { private static final String TREE_SORT_STATE_KEY = "treeSortState"; //$NON-NLS-1$ private static final String[] COLUMN_NAMES = new String[] { Messages.POSITIONS_TABLE_GROUPING_COLUMN__HEADING .getText() }; private static final class PositionRowConfigurer implements TreeItemConfigurer<PositionRow> { @Override public void configure(final TreeItem item, final PositionRow rowValue, Object columnValue, int row, int column) { String text; if (column == 0) { text = formatKey((String) columnValue); } else { text = formatValue(columnValue); } item.setText(column, text); } } private final class PositionTreeFormat extends BasePositionRowFormat { public PositionTreeFormat() { super(COLUMN_NAMES.length); } @Override public int getColumnCount() { return super.getColumnCount() + COLUMN_NAMES.length; } @Override public String getColumnName(int column) { if (column < COLUMN_NAMES.length) { return COLUMN_NAMES[column]; } else { return super.getColumnName(column); } } @Override public Object getColumnValue(PositionRow baseObject, int column) { switch (column) { case 0: return getGroupingValue(baseObject); case 1: case 2: case 3: case 4: case 5: if (baseObject.getGrouping() != null) { // summary row return ""; //$NON-NLS-1$ } default: return super.getColumnValue(baseObject, column); } } private Object getGroupingValue(PositionRow baseObject) { Grouping[] grouping = baseObject.getGrouping(); if (grouping != null) { Grouping current = grouping[grouping.length - 1]; String value = current.get(baseObject); return current == Grouping.Trader ? getTraderName(value) : value; } else { /* * This is a non-summary (bottom level) row, so show a value * that describes the position. */ return InstrumentPrettyPrinter.print(baseObject.getInstrument()); } } } private static final class TreeSelectionProvider extends PositionSelectionProvider { public TreeSelectionProvider(Tree tree) { super(tree); } @Override public Tree getControl() { return (Tree) super.getControl(); } @Override protected List<PositionRow> getSelectionFromWidget() { List<PositionRow> selected = new ArrayList<PositionRow>(); Tree tree = getControl(); for (TreeItem item : tree.getSelection()) { selected.add((PositionRow) item.getData()); } return selected; } } private EventTreeViewer<PositionRow> mViewer; private Tree mTree; private TreeComparatorChooser<PositionRow> mChooser; /** * Constructor. * * @param view * the view this page is part of, cannot be null * @param memento * the saved page state * @throws IllegalArgumentException * if view is null */ public PositionsViewTreePage(PositionsView view, IMemento memento) { super(view, memento); } @Override protected Control doCreateControl(Composite parent, IMemento memento) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new MigLayout("fill, ins 0")); //$NON-NLS-1$ mTree = new Tree(composite, SWT.MULTI | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.VIRTUAL); mTree.setLayoutData("dock center, hmin 100, wmin 100"); //$NON-NLS-1$ EventList<PositionRow> positions = getPositions(); SortedList<PositionRow> sorted = new SortedList<PositionRow>(positions, null); mViewer = new EventTreeViewer<PositionRow>(sorted, mTree, new PositionTreeFormat(), new EventTreeModel<PositionRow>() { @Override public EventList<PositionRow> getChildren(PositionRow item) { return item.getChildren(); } }, new PositionRowConfigurer()); // make grouping unrealized PL a bit wider mTree.getColumn(0).setWidth(150); mTree.getColumn(6).setWidth(90); mChooser = TreeComparatorChooser.install(mViewer, sorted, false); if (memento != null) { ColumnState.restore(mTree, memento); String sortState = memento.getString(TREE_SORT_STATE_KEY); if (sortState != null) { mChooser.fromString(sortState); } } for (int i = 1; i < mTree.getColumnCount(); i++) { TreeColumn column = mTree.getColumn(i); column.setMoveable(true); if (column.getWidth() == 0) { column.setResizable(false); } } getSite().setSelectionProvider(new TreeSelectionProvider(mTree)); return composite; } @Override public Control getColumnWidget() { return mTree; } @Override protected void controlDisposed() { mViewer.dispose(); } @Override protected PositionData getPositionData() { PositionEngine engine = (PositionEngine) Activator.getDefault() .getPositionEngine().getValue(); return engine.getGroupedData(getView().getGrouping()); } @Override protected TextFilterator<? super PositionRow> getFilterator() { return new TextFilterator<PositionRow>() { @Override public void getFilterStrings(List<String> baseList, PositionRow element) { baseList.add(getView().getGrouping()[0].get(element)); } }; } @Override public void saveState(IMemento memento) { ColumnState.save(mTree, memento); memento.putString(TREE_SORT_STATE_KEY, mChooser.toString()); } }