org.marketcetera.photon.views.CurrencyOrderTicketView.java Source code

Java tutorial

Introduction

Here is the source code for org.marketcetera.photon.views.CurrencyOrderTicketView.java

Source

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 16492 2013-03-08 09:21:37Z sameer.patil $")
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;
        }
    }
}