package org.marketcetera.photon.views;
import java.io.InputStream;
import org.apache.commons.lang.StringUtils;
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.dialogs.PopupDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.marketcetera.client.OrderValidationException;
import org.marketcetera.client.instruments.CurrencyValidationHandler;
import org.marketcetera.core.ClassVersion;
import org.marketcetera.photon.PhotonPlugin;
import org.marketcetera.photon.commons.ui.databinding.DataBindingUtils;
/* $License$ */
/**
* This class implements the view that provides the end user the ability to type
* in--and graphically interact with--currency orders.
*
*/
@ClassVersion("$Id: CurrencyOrderTicketView.java 16901 2014-05-11 16:14:11Z colin $")
public class CurrencyOrderTicketView extends
OrderTicketView<CurrencyOrderTicketModel, ICurrencyOrderTicket> {
public static final String ID = "org.marketcetera.photon.views.CurrencyOrderTicketView"; //$NON-NLS-1$
/**
* Constructor.
*/
public CurrencyOrderTicketView() {
super(ICurrencyOrderTicket.class, PhotonPlugin.getDefault()
.getCurrencyOrderTicketModel());
}
@Override
protected InputStream getXSWTResourceStream() {
return getClass().getResourceAsStream("/currency_order_ticket.xswt"); //$NON-NLS-1$
}
@Override
protected String getNewOrderString() {
return Messages.CURRENCY_ORDER_TICKET_VIEW_NEW__HEADING.getText();
}
@Override
protected String getReplaceOrderString() {
return Messages.CURRENCY_ORDER_TICKET_VIEW_REPLACE__HEADING.getText();
}
@Override
protected void initViewers(ICurrencyOrderTicket ticket) {
super.initViewers(ticket);
}
@Override
protected void customizeWidgets(final ICurrencyOrderTicket ticket) {
super.customizeWidgets(ticket);
/*
* Update size of text fields since default will be small.
*/
updateSize(ticket.getNearTenorText(), 8);
updateSize(ticket.getFarTenorText(), 8);
/*
* Customize text fields to auto select the text on focus to make it
* easy to change the value.
*/
selectOnFocus(ticket.getNearTenorText());
selectOnFocus(ticket.getFarTenorText());
/*
* If the ticket has no errors, enter on these fields will trigger a
* send.
*/
addSendOrderListener(ticket.getNearTenorText());
addSendOrderListener(ticket.getFarTenorText());
ticket.getSelectNearTenorButton().addSelectionListener(
new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
PopupDialog d = new CalendarPopup(getSite().getShell(),ticket.getSelectNearTenorButton(),ticket.getNearTenorText());
d.open();
};
});
ticket.getSelectFarTenorButton().addSelectionListener(
new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
PopupDialog d = new CalendarPopup(getSite().getShell(), ticket.getSelectFarTenorButton(),ticket.getFarTenorText());
d.open();
};
});
}
/**
* Gets the "default" CurrencyOrderTicketView, that is the first one returned
* by {@link IWorkbenchPage#findView(String)}
*
* @return the default CurrencyOrderTicketView
*/
public static CurrencyOrderTicketView getDefault() {
CurrencyOrderTicketView orderTicket = (CurrencyOrderTicketView) PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.findView(CurrencyOrderTicketView.ID);
return orderTicket;
}
@Override
protected void bindMessage() {
super.bindMessage();
final DataBindingContext dbc = getDataBindingContext();
final CurrencyOrderTicketModel model = getModel();
final ICurrencyOrderTicket ticket = getXSWTView();
//Symbol
final IObservableValue symbolTarget = SWTObservables.observeText(ticket.getSymbolText(),SWT.Modify);
MultiValidator currencySymbolValidator = new MultiValidator() {
@Override
protected IStatus validate() {
String symbol = (String)symbolTarget.getValue();
if (symbol == null || symbol.isEmpty()) {
return ValidationStatus.ok();
}
try {
CurrencyValidationHandler.validateCurrencySymbol(symbol);
return ValidationStatus.ok();
} catch (OrderValidationException e) {
return ValidationStatus.error(e.getLocalizedMessage(), e);
}
}
};
DataBindingUtils.initControlDecorationSupportFor(currencySymbolValidator, SWT.BOTTOM | SWT.LEFT);
dbc.addValidationStatusProvider(currencySymbolValidator);
//Near Tenor
final IObservableValue nearTenorTarget = SWTObservables.observeText(ticket
.getNearTenorText(), SWT.Modify);
dbc.bindValue(nearTenorTarget, model.getNearTenor());
MultiValidator nearTenorValidator = new MultiValidator() {
@Override
protected IStatus validate() {
String tenor = (String) nearTenorTarget.getValue();
tenor = StringUtils.trimToNull(tenor);
if (tenor == null || tenor.isEmpty()) {
return ValidationStatus.ok();
}
try {
CurrencyValidationHandler.validateTenor(tenor);
return ValidationStatus.ok();
} catch (OrderValidationException e) {
return ValidationStatus.error(e.getLocalizedMessage(), e);
}
}
};
DataBindingUtils.initControlDecorationSupportFor(nearTenorValidator,
SWT.BOTTOM | SWT.LEFT);
dbc.addValidationStatusProvider(nearTenorValidator);
enableForNewOrderOnly(ticket.getNearTenorText());
enableForNewOrderOnly(ticket.getSelectNearTenorButton());
//Far Tenor
final IObservableValue farTenorTarget = SWTObservables.observeText(ticket
.getFarTenorText(), SWT.Modify);
dbc.bindValue(farTenorTarget, model.getFarTenor());
MultiValidator farTenorValidator = new MultiValidator() {
@Override
protected IStatus validate() {
String tenor = (String) farTenorTarget.getValue();
tenor = StringUtils.trimToNull(tenor);
if (tenor == null || tenor.isEmpty()) {
return ValidationStatus.ok();
}
try {
CurrencyValidationHandler.validateTenor(tenor);
return ValidationStatus.ok();
} catch (OrderValidationException e) {
return ValidationStatus.error(e.getLocalizedMessage(), e);
}
}
};
DataBindingUtils.initControlDecorationSupportFor(farTenorValidator,
SWT.BOTTOM | SWT.LEFT);
dbc.addValidationStatusProvider(farTenorValidator);
final IObservableValue leftCCYTarget = SWTObservables.observeSelection(ticket.getRadioButtonCCY1());
dbc.bindValue(leftCCYTarget, model.getLeftCCY());
final IObservableValue rightCCYTarget = SWTObservables.observeSelection(ticket.getRadioButtonCCY2());
dbc.bindValue(rightCCYTarget, model.getRightCCY());
enableForNewOrderOnly(ticket.getFarTenorText());
enableForNewOrderOnly(ticket.getSelectFarTenorButton());
enableForNewOrderOnly(ticket.getRadioButtonCCY1());
enableForNewOrderOnly(ticket.getRadioButtonCCY2());
}
private class CalendarPopup extends PopupDialog {
Button button;
Text text;
private static final String DATE_FORMAT = "%04d%02d%02d"; //$NON-NLS-1$
public CalendarPopup(Shell shell, Button button, Text text) {
super(shell, SWT.ON_TOP, true, false, false, false, false, null,
null);
this.button = button;
this.text = text;
}
@Override
protected Point getDefaultLocation(Point initialSize) {
Point location = getShell().getDisplay().map(button.getParent(),
null, button.getLocation());
Point size = button.getSize();
return new Point(location.x + size.x, location.y + size.y);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
final DateTime calendar = new DateTime(composite, SWT.CALENDAR);
calendar.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
text.setText(
String.format(DATE_FORMAT, calendar
.getYear(),
calendar.getMonth() + 1, calendar
.getDay()));
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
close();
}
});
return composite;
}
}
}