package org.marketcetera.photon.views;
import java.io.InputStream;
import java.util.EnumSet;
import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.validation.MultiValidator;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.swt.SWT;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.marketcetera.client.OrderValidationException;
import org.marketcetera.client.instruments.FutureValidationHandler;
import org.marketcetera.core.ClassVersion;
import org.marketcetera.photon.PhotonPlugin;
import org.marketcetera.photon.commons.ui.databinding.DataBindingUtils;
import org.marketcetera.trade.FutureExpirationMonth;
/* $License$ */
/**
* Provides an order ticket view for the Futures asset class.
*
* @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a>
* @version $Id: FutureOrderTicketView.java 16154 2012-07-14 16:34:05Z colin $
* @since 2.1.0
*/
@ClassVersion("$Id: FutureOrderTicketView.java 16154 2012-07-14 16:34:05Z colin $")
public class FutureOrderTicketView
extends OrderTicketView<FutureOrderTicketModel, IFutureOrderTicket>
{
/**
* Gets the "default" FutureOrderTicketView, that is the first one returned
* by {@link IWorkbenchPage#findView(String)}.
*
* @return the default FutureOrderTicketView
*/
public static FutureOrderTicketView getDefault()
{
return (FutureOrderTicketView)PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(FutureOrderTicketView.ID);
}
/**
* Create a new FutureOrderTicketView instance.
*/
public FutureOrderTicketView()
{
super(IFutureOrderTicket.class,
PhotonPlugin.getDefault().getFutureOrderTicketModel());
}
/* (non-Javadoc)
* @see org.marketcetera.photon.views.OrderTicketView#bindMessage()
*/
@Override
protected void bindMessage()
{
super.bindMessage();
final DataBindingContext dbc = getDataBindingContext();
final FutureOrderTicketModel model = getModel();
final IFutureOrderTicket ticket = getXSWTView();
/*
* Expiration year
*/
final IObservableValue target = SWTObservables.observeText(ticket.getExpirationYearText(),
SWT.Modify);
Binding binding = dbc.bindValue(target,
model.getFutureExpirationYear());
setRequired(binding,
Messages.FUTURE_ORDER_TICKET_VIEW_EXPIRATION_YEAR__LABEL.getText());
MultiValidator expirationYearValidator = new MultiValidator() {
@Override
protected IStatus validate() {
String expirationYear = (String)target.getValue();
if (expirationYear == null ||
expirationYear.isEmpty()) {
/*
* Let required field support kick in.
*/
return ValidationStatus.ok();
}
try {
FutureValidationHandler.validateExpirationYear(expirationYear);
return ValidationStatus.ok();
} catch (OrderValidationException e) {
return ValidationStatus.error(e.getLocalizedMessage(),
e);
}
}
};
DataBindingUtils.initControlDecorationSupportFor(expirationYearValidator,
SWT.BOTTOM | SWT.LEFT);
dbc.addValidationStatusProvider(expirationYearValidator);
enableForNewOrderOnly(ticket.getExpirationYearText());
/*
* expiration month
*/
bindRequiredCombo(expirationMonthComboViewer,
model.getFutureExpirationMonth(),
Messages.FUTURE_ORDER_TICKET_VIEW_EXPIRATION_MONTH__LABEL.getText());
enableForNewOrderOnly(ticket.getExpirationMonthCombo());
}
/* (non-Javadoc)
* @see org.marketcetera.photon.views.OrderTicketView#initViewers(org.marketcetera.photon.views.IOrderTicket)
*/
@Override
protected void initViewers(IFutureOrderTicket inTicket)
{
super.initViewers(inTicket);
// set up the combo viewer for the expiration month
expirationMonthComboViewer = new ComboViewer(inTicket.getExpirationMonthCombo());
expirationMonthComboViewer.setContentProvider(new ArrayContentProvider());
expirationMonthComboViewer.setInput(EnumSet.allOf(FutureExpirationMonth.class).toArray());
}
/* (non-Javadoc)
* @see org.marketcetera.photon.views.OrderTicketView#getNewOrderString()
*/
@Override
protected String getNewOrderString()
{
return Messages.FUTURE_ORDER_TICKET_VIEW_NEW__HEADING.getText();
}
/* (non-Javadoc)
* @see org.marketcetera.photon.views.OrderTicketView#getReplaceOrderString()
*/
@Override
protected String getReplaceOrderString()
{
return Messages.FUTURE_ORDER_TICKET_VIEW_REPLACE__HEADING.getText();
}
/* (non-Javadoc)
* @see org.marketcetera.photon.views.XSWTView#getXSWTResourceStream()
*/
@Override
protected InputStream getXSWTResourceStream()
{
return getClass().getResourceAsStream("/future_order_ticket.xswt"); //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.marketcetera.photon.views.OrderTicketView#customizeWidgets(org.marketcetera.photon.views.IOrderTicket)
*/
@Override
protected void customizeWidgets(IFutureOrderTicket inTicket)
{
super.customizeWidgets(inTicket);
// the default size is wrong, set it manually
updateSize(inTicket.getExpirationYearText(),
20);
// selects the text in the widget upon focus to facilitate easy editing
selectOnFocus(inTicket.getExpirationYearText());
// enter in either of these fields will send the order (assuming there are no errors)
addSendOrderListener(inTicket.getExpirationMonthCombo());
addSendOrderListener(inTicket.getExpirationYearText());
}
public static final String ID = "org.marketcetera.photon.views.FutureOrderTicketView"; //$NON-NLS-1$
/**
* the expiration month combo dropdown
*/
private ComboViewer expirationMonthComboViewer;
}