package org.marketcetera.photon.ui.databinding; import org.apache.commons.lang.StringUtils; import org.marketcetera.photon.commons.databinding.ITypedObservableValue; import org.marketcetera.photon.commons.databinding.TypedObservableValueDecorator; import org.marketcetera.trade.Currency; import org.marketcetera.trade.Instrument; import org.marketcetera.util.misc.ClassVersion; import com.google.common.collect.ImmutableList; /* $License$ */ /** * Observes an instrument as a currency and provides child observables for the * currency components. * */ @ClassVersion("$Id: CurrencyObservable.java 16901 2014-05-11 16:14:11Z colin $") public class CurrencyObservable extends CompoundObservableManager<ITypedObservableValue<Instrument>> { /** * Create a new CurrencyObservable instance. * * @param inParent an <code>ITypedObservableValue<Instrument></code> value */ public CurrencyObservable(ITypedObservableValue<Instrument> inParent) { super(inParent); mSymbol = TypedObservableValueDecorator.create(String.class); mNearTenor = TypedObservableValueDecorator.create(String.class); mFarTenor = TypedObservableValueDecorator.create(String.class); mLeftCCY = TypedObservableValueDecorator.create(Boolean.class); mRightCCY = TypedObservableValueDecorator.create(Boolean.class); init(ImmutableList.of(mSymbol,mNearTenor,mFarTenor,mLeftCCY,mRightCCY)); } /** * Observes the currency symbol. * * @return an <code>ITypedObservableValue<String></code> value */ public ITypedObservableValue<String> observeSymbol() { return mSymbol; } /** * Observes the currency near tenor. * * @return an <code>ITypedObservableValue<String></code> value */ public ITypedObservableValue<String> observeNearTenor() { return mNearTenor; } /** * Observes the currency far tenor. * * @return an <code>ITypedObservableValue<String></code> value */ public ITypedObservableValue<String> observeFarTenor() { return mFarTenor; } /** * Observes the left currency. * * @return an <code>ITypedObservableValue<Boolean></code> value */ public ITypedObservableValue<Boolean> observeLeftCCY() { return mLeftCCY; } /** * Observes the right currency. * * @return an <code>ITypedObservableValue<Boolean></code> value */ public ITypedObservableValue<Boolean> observeRightCCY() { return mRightCCY; } /* (non-Javadoc) * @see org.marketcetera.photon.ui.databinding.CompoundObservableManager#updateParent() */ @Override protected void updateParent() { String symbol = mSymbol.getTypedValue(); String[] currencyPair = null; if(symbol!=null) { currencyPair = symbol.split("/"); } String nearTenor = mNearTenor.getTypedValue(); String farTenor = mFarTenor.getTypedValue(); Currency newValue = null; if(currencyPair!=null && currencyPair.length==2 && StringUtils.isNotBlank(currencyPair[0]) && StringUtils.isNotBlank(currencyPair[1])) { boolean baseCCYSelector = mLeftCCY.getTypedValue(); try { String baseCCY; if(baseCCYSelector){ baseCCY = currencyPair[0]; }else{ baseCCY = currencyPair[1]; } newValue = new Currency(currencyPair[0],currencyPair[1],nearTenor,farTenor,baseCCY); } catch (Exception ignored) { } } ITypedObservableValue<Instrument> instrument = getParent(); setIfChanged(instrument, newValue); } /* (non-Javadoc) * @see org.marketcetera.photon.ui.databinding.CompoundObservableManager#updateChildren() */ @Override protected void updateChildren() { Instrument instrument = getParent().getTypedValue(); if (instrument instanceof Currency) { Currency currency = (Currency)instrument; setIfChanged(mSymbol,currency.getSymbol()); setIfChanged(mNearTenor,currency.getNearTenor()); setIfChanged(mFarTenor,currency.getFarTenor()); boolean baseCCY = currency.getLeftCCY().equals(currency.getTradedCCY()); setIfChanged(mLeftCCY,baseCCY); setIfChanged(mRightCCY,!baseCCY); } else { setIfChanged(mSymbol, null); setIfChanged(mNearTenor, null); setIfChanged(mFarTenor, null); setIfChanged(mLeftCCY, true); setIfChanged(mRightCCY, false); } } /** * observes the currency symbol */ private final ITypedObservableValue<String> mSymbol; /** * observes the currency near tenor */ private final ITypedObservableValue<String> mNearTenor; /** * observes the currency far tenor */ private final ITypedObservableValue<String> mFarTenor; /** * observes the left currency */ private final ITypedObservableValue<Boolean> mLeftCCY; /** * observes the right currency */ private final ITypedObservableValue<Boolean> mRightCCY; }