/*******************************************************************************
* Copyright (c) 2013 Luigi Sgro. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Luigi Sgro - initial API and implementation
******************************************************************************/
package com.quantcomponents.ui.marketdata;
import java.util.Currency;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Text;
import com.quantcomponents.core.model.BareDate;
import com.quantcomponents.core.model.IdentifierType;
import com.quantcomponents.core.model.OptionRight;
import com.quantcomponents.core.model.SecurityType;
import com.quantcomponents.core.model.beans.ContractBean;
public class NewHistoricalDataPage1 extends WizardPage {
private ContractBean contractCriteria;
// Contract specification container
private TabFolder contractSpecFolder;
private TabItem tab1;
private TabItem tab2;
// Contract specification 1 (description)
private Text tickerEdit;
private Combo typeEdit;
private DateCombo expiryEdit;
private Combo currencyEdit;
private Text exchangeEdit;
private Combo rightEdit;
private Text multiplierEdit;
private Text strikeEdit;
// Contract specification 2 (ID)
private Combo idTypeEdit;
private Text idEdit;
public NewHistoricalDataPage1(ContractBean contractCriteria) {
super("New historical data");
this.contractCriteria = contractCriteria;
setPageComplete(false);
}
@Override
public void createControl(Composite parent) {
// root container
Composite rootContainer = new Composite(parent, SWT.NULL);
GridLayout rootLayout = new GridLayout();
rootLayout.verticalSpacing = 15;
rootLayout.numColumns = 1;
rootContainer.setLayout(rootLayout);
// top container: folder
Composite topContainer = new Composite(rootContainer, SWT.NULL);
GridData topContainerLayoutData = new GridData(GridData.FILL_HORIZONTAL);
topContainer.setLayoutData(topContainerLayoutData);
GridLayout topContainerLayout = new GridLayout();
topContainerLayout.numColumns = 3;
topContainer.setLayout(topContainerLayout);
// contract specification container
contractSpecFolder = new TabFolder(rootContainer, SWT.NULL);
tab1 = new TabItem(contractSpecFolder, SWT.NULL);
tab1.setText("Description");
tab2 = new TabItem(contractSpecFolder, SWT.NULL);
tab2.setText("Identifier");
// tab 1: contract description
Composite tab1Container = new Composite(contractSpecFolder, SWT.NULL);
tab1Container.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
GridLayout tab1Layout = new GridLayout();
tab1Layout.numColumns = 2;
tab1Container.setLayout(tab1Layout);
tab1.setControl(tab1Container);
Label typeLabel = new Label(tab1Container, SWT.NULL);
typeLabel.setText("Security Type");
typeEdit = new Combo(tab1Container, SWT.READ_ONLY);
String[] securityTypes = new String[SecurityType.values().length];
for (int i = 0; i < SecurityType.values().length; i++) {
securityTypes[i] = SecurityType.values()[i].name();
}
typeEdit.setItems(securityTypes);
typeEdit.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
update();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}});
Label rightLabel = new Label(tab1Container, SWT.NULL);
rightLabel.setText("Right");
rightEdit = new Combo(tab1Container, SWT.READ_ONLY);
rightEdit.setItems(new String[] {OptionRight.CALL.name(),OptionRight.PUT.name()});
rightEdit.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
update();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}});
Label tickerLabel = new Label(tab1Container, SWT.NULL);
tickerLabel.setText("Ticker");
tickerEdit = new Text(tab1Container, SWT.NULL);
tickerEdit.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
update();
}});
Label expiryLabel = new Label(tab1Container, SWT.NULL);
expiryLabel.setText("Expiry");
expiryEdit = new DateCombo(tab1Container, SWT.DROP_DOWN);
expiryEdit.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
update();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}});
Label currencyLabel = new Label(tab1Container, SWT.NULL);
currencyLabel.setText("Currency");
currencyEdit = new Combo(tab1Container, SWT.READ_ONLY);
currencyEdit.setItems(new String[] {"USD","EUR","CHF","JPY","AUD","GBP"}); // TODO: add preferences for currency setup - or writable combo + state store
currencyEdit.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
update();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}});
Label strikeLabel = new Label(tab1Container, SWT.NULL);
strikeLabel.setText("Strike");
strikeEdit = new Text(tab1Container, SWT.NULL);
strikeEdit.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
update();
}});
Label exchangeLabel = new Label(tab1Container, SWT.NULL);
exchangeLabel.setText("Exchange");
exchangeEdit = new Text(tab1Container, SWT.NULL);
exchangeEdit.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
update();
}});
Label multiplierLabel = new Label(tab1Container, SWT.NULL);
multiplierLabel.setText("Multiplier");
multiplierEdit = new Text(tab1Container, SWT.NULL);
multiplierEdit.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
update();
}});
// tab 2: contract ID
Composite tab2Container = new Composite(contractSpecFolder, SWT.NULL);
tab2Container.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
GridLayout tab2Layout = new GridLayout();
tab2Layout.numColumns = 2;
tab2Container.setLayout(tab2Layout);
Label idTypeLabel = new Label(tab2Container, SWT.NULL);
idTypeLabel.setText("Contract ID Type");
idTypeEdit = new Combo(tab2Container, SWT.READ_ONLY);
String[] idTypes = new String[IdentifierType.values().length];
for (int i = 0; i < IdentifierType.values().length; i++) {
idTypes[i] = IdentifierType.values()[i].name();
}
idTypeEdit.setItems(idTypes);
idTypeEdit.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
update();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}});
Label idLabel = new Label(tab2Container, SWT.NULL);
idLabel.setText("Contract ID");
idEdit = new Text(tab2Container, SWT.NULL);
GridData idEditLayoutData = new GridData(GridData.FILL_HORIZONTAL);
idEdit.setLayoutData(idEditLayoutData);
idEdit.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
update();
}});
tab2.setControl(tab2Container);
initialize();
setControl(rootContainer);
}
public boolean isExactContractSpec() {
return tab2 == contractSpecFolder.getSelection()[0];
}
public SecurityType getSecurityType() {
String str = typeEdit.getText();
if (str == null || str.trim().length() == 0) {
return null;
} else {
return SecurityType.valueOf(str);
}
}
public String getTicker() {
return tickerEdit.getText();
}
public Currency getCurrency() {
String str = currencyEdit.getText();
if (str == null || str.trim().length() == 0) {
return null;
} else {
return Currency.getInstance(str);
}
}
public String getExchange() {
return exchangeEdit.getText();
}
public OptionRight getOptionRight() {
String str = rightEdit.getText();
if (str == null || str.trim().length() == 0) {
return null;
} else {
return OptionRight.valueOf(str);
}
}
public double getOptionStrike() {
if (strikeEdit.getText().length() > 0)
return Double.valueOf(strikeEdit.getText());
else
return 0.0;
}
public int getExpiryDay() {
return expiryEdit.getDay();
}
public int getExpiryMonth() {
return expiryEdit.getMonth();
}
public int getExpiryYear() {
return expiryEdit.getYear();
}
public BareDate getExpiry() {
if (getExpiryDay() > 0 && getExpiryYear() > 0) {
return new BareDate(getExpiryYear(), getExpiryMonth(), getExpiryDay());
} else {
return null;
}
}
public Integer getMultiplier() {
String str = multiplierEdit.getText();
if (str == null || str.trim().length() == 0) {
return null;
} else {
return new Integer(multiplierEdit.getText());
}
}
public IdentifierType getIdentifierType() {
String str = idTypeEdit.getText();
if (str == null || str.trim().length() == 0) {
return null;
} else {
return IdentifierType.valueOf(str);
}
}
public String getIdentifier() {
return idEdit.getText();
}
private boolean isExpiryEnabled() {
String type = typeEdit.getText();
if ("OPT".equals(type) || "FUT".equals(type))
return true;
else
return false;
}
private boolean isOption() {
return SecurityType.OPT.equals(getSecurityType());
}
private boolean isFuture() {
return SecurityType.FUT.equals(getSecurityType());
}
private boolean isMultiplierEnabled() {
return isOption() || isFuture();
}
private void initialize() {
typeEdit.select(0);
rightEdit.select(0);
currencyEdit.select(0);
idTypeEdit.select(0);
}
private boolean checkPageComplete() {
if (isExactContractSpec())
return getIdentifierType() != null && getIdentifier().length() > 0;
else
return getSecurityType() != null && getTicker().length() > 0;
}
private void update() {
expiryEdit.setEnabled(isExpiryEnabled());
rightEdit.setEnabled(isOption());
multiplierEdit.setEnabled(isMultiplierEnabled());
strikeEdit.setEnabled(isOption());
if (isExactContractSpec()) {
// reset descriptive criteria
contractCriteria.setSecurityType(null);
contractCriteria.setSymbol(null);
contractCriteria.setExchange(null);
contractCriteria.setCurrency(null);
contractCriteria.setOptionRight(null);
contractCriteria.setMultiplier(null);
contractCriteria.setStrike(null);
contractCriteria.setExpiryDate(null);
// set security ID
contractCriteria.setIdentifierType(getIdentifierType());
contractCriteria.setIdentifier(getIdentifier());
} else {
// reset security ID
contractCriteria.setIdentifierType(null);
contractCriteria.setIdentifier(null);
// reset descriptive criteria
contractCriteria.setSecurityType(getSecurityType());
contractCriteria.setSymbol(getTicker());
contractCriteria.setExchange(getExchange());
contractCriteria.setCurrency(getCurrency());
if (isOption()) {
contractCriteria.setOptionRight(getOptionRight());
contractCriteria.setStrike(getOptionStrike());
} else {
contractCriteria.setOptionRight(null);
contractCriteria.setStrike(null);
}
if (isOption() || isFuture()) {
contractCriteria.setMultiplier(getMultiplier());
contractCriteria.setExpiryDate(getExpiry());
} else {
contractCriteria.setMultiplier(null);
contractCriteria.setExpiryDate(null);
}
}
getWizard().getContainer().updateButtons();
setPageComplete(canFlipToNextPage());
}
@Override
public boolean isPageComplete() {
return checkPageComplete();
}
}