package org.marketcetera.photon.views; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.text.MessageFormat; import org.apache.commons.lang.Validate; import org.marketcetera.photon.marketdata.IMarketData; import org.marketcetera.photon.marketdata.IMarketDataReference; import org.marketcetera.photon.model.marketdata.MDLatestTick; import org.marketcetera.photon.model.marketdata.MDMarketstat; import org.marketcetera.photon.model.marketdata.MDTopOfBook; import org.marketcetera.photon.ui.ISymbolProvider; import org.marketcetera.trade.Instrument; import org.marketcetera.util.misc.ClassVersion; /* $License$ */ /** * Market data view model object. * * @author <a href="mailto:will@marketcetera.com">Will Horn</a> * @version $Id: MarketDataViewItem.java 16854 2014-03-12 01:54:42Z colin $ * @since 1.0.0 */ @ClassVersion("$Id") public class MarketDataViewItem implements ISymbolProvider { private static final MessageFormat FORMAT = new MessageFormat( "{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}\t{9}\t{10}\t{11}"); //$NON-NLS-1$ private Instrument mInstrument; private IMarketDataReference<MDLatestTick> mLatestTick; private IMarketDataReference<MDTopOfBook> mTopOfBook; private IMarketDataReference<MDMarketstat> mMarketStat; private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); private IMarketData mMarketData; /** * Constructor. Will throw an exception if symbol is null. * * @param inMarketData an <code>IMarketData</code> value * @param inInstrument an <code>Instrument</code> value */ public MarketDataViewItem(IMarketData inMarketData, Instrument inInstrument) { Validate.noNullElements(new Object[] { inMarketData, inInstrument }); mInstrument = inInstrument; mMarketData = inMarketData; init(); } @Override public Instrument getInstrument() { return mInstrument; } public String getSymbol() { return mInstrument.getFullSymbol(); } public MDLatestTick getLatestTick() { return mLatestTick.get(); } public MDTopOfBook getTopOfBook() { return mTopOfBook.get(); } public MDMarketstat getMarketStat(){ return mMarketStat.get(); } /** * Changes the underlying instrument of this item. All data will be reset if * the instrument changes. * * @param instrument * the new instrument, cannot be null */ public void setInstrument(Instrument instrument) { Validate.notNull(instrument); String oldSymbol = getSymbol(); if (!mInstrument.equals(instrument)) { MDLatestTick oldLatestTick = getLatestTick(); MDTopOfBook oldTopOfBook = getTopOfBook(); MDMarketstat oldMarketStat = getMarketStat(); dispose(); mInstrument = instrument; init(); propertyChangeSupport.firePropertyChange("symbol", oldSymbol, getSymbol()); //$NON-NLS-1$ propertyChangeSupport.firePropertyChange("latestTick", oldLatestTick, getLatestTick()); //$NON-NLS-1$ propertyChangeSupport.firePropertyChange("topOfBook", oldTopOfBook, getTopOfBook()); //$NON-NLS-1$ propertyChangeSupport.firePropertyChange("marketStat", oldMarketStat, getMarketStat()); //$NON-NLS-1$ } } public void dispose() { mLatestTick.dispose(); mTopOfBook.dispose(); mMarketStat.dispose(); } private void init() { mLatestTick = mMarketData.getLatestTick(mInstrument); mTopOfBook = mMarketData.getTopOfBook(mInstrument); mMarketStat = mMarketData.getMarketstat(mInstrument); } /** * @see PropertyChangeSupport#addPropertyChangeListener(String, PropertyChangeListener) */ public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(propertyName, listener); } /** * @see PropertyChangeSupport#removePropertyChangeListener(String, PropertyChangeListener) */ public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(propertyName, listener); } /** * This implementation returns a string representation of the item's properties separated by * tabs. */ @Override public String toString() { return FORMAT.format(new Object[] { getInstrument(), getLatestTick().getPrice(), getLatestTick().getSize(), getTopOfBook().getBidSize(), getTopOfBook().getBidPrice(), getTopOfBook().getAskPrice(), getTopOfBook().getAskSize(), getMarketStat().getPreviousClosePrice(), getMarketStat().getPreviousCloseDate(), getMarketStat().getCloseDate(),getMarketStat().getClosePrice(), getMarketStat().getOpenPrice(), getMarketStat().getHighPrice(), getMarketStat().getLowPrice(), getMarketStat().getVolumeTraded()}); } }