package org.marketcetera.photon.preferences;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import org.marketcetera.photon.EclipseUtils;
import org.marketcetera.photon.Messages;
import org.marketcetera.photon.PhotonPlugin;
import org.marketcetera.photon.views.AveragePriceView;
import org.marketcetera.photon.views.FIXMessagesView;
import org.marketcetera.photon.views.FillsView;
import org.marketcetera.photon.views.OpenOrdersView;
import org.marketcetera.quickfix.FIXMessageUtil;
/**
*
* @author caroline.leung@softwaregoodness.com
*
*/
public class FIXMessageColumnPreferencePage
extends FieldEditorPreferencePage
implements IWorkbenchPreferencePage, Messages
{
public static final String COLUMN_FILTER_TEXT = "column.filter.text"; //$NON-NLS-1$
public static final String FIX_MESSAGE_DETAIL_PREFERENCE = "fix.message.detail"; //$NON-NLS-1$
public static final String ID = "org.marketcetera.photon.preferences.FIXMessageColumnPreferencePage"; //$NON-NLS-1$
private static final int INVALID_FIELD_ID = -1;
private Combo subPageCombo;
private Text columnFilterText;
private Text customFixFieldIDText;
private Button customFixFieldInputButton;
private SelectionListener selectionListener;
private MouseListener mouseListener;
private ModifyListener modifyListener;
private FIXMessageColumnChooserEditor fixMsgFieldsChooser;
private Button clearFilterButton;
public FIXMessageColumnPreferencePage() {
super(FLAT);
setPreferenceStore(PhotonPlugin.getDefault().getPreferenceStore());
}
public void init(IWorkbench workbench)
{
}
@Override
protected void createFieldEditors() {
createMsgTypesCombo(getFieldEditorParent());
createColumnFilterText(getFieldEditorParent());
String subPageID = FIXMessageColumnPrefsSubPageType.getIDFromName(subPageCombo.getText());
fixMsgFieldsChooser = new FIXMessageColumnChooserEditor(FIX_MESSAGE_DETAIL_PREFERENCE,
FIX_MESSAGE_DETAIL_PREFERENCE_LABEL.getText(),
getFieldEditorParent(),
subPageID);
addField(fixMsgFieldsChooser);
createCustomFixFieldIDText(getFieldEditorParent());
}
private void createMsgTypesCombo(Composite parent) {
parent.setLayout(new FormLayout());
Label viewFixMsgTypeLabel = new Label(parent, SWT.NONE);
viewFixMsgTypeLabel.setText(VIEW_LABEL.getText());
FormData labelFormData = new FormData();
labelFormData.left = new FormAttachment(0);
labelFormData.top = new FormAttachment(0);
viewFixMsgTypeLabel.setLayoutData(labelFormData);
subPageCombo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
String[] msgTypes = getSubPageTypes();
subPageCombo.setItems(msgTypes);
subPageCombo.setText(msgTypes[0]);
FormData comboFormData = new FormData();
comboFormData.left = new FormAttachment(viewFixMsgTypeLabel, 10);
comboFormData.top = new FormAttachment(0);
subPageCombo.setLayoutData(comboFormData);
subPageCombo.addSelectionListener(getSelectionListener());
}
private void createColumnFilterText(Composite parent) {
parent.setLayout(new FormLayout());
Label availableColumnsLabel = new Label(parent, SWT.NONE);
availableColumnsLabel.setText(AVAILABLE_COLUMNS_LABEL.getText());
FormData labelFormData = new FormData();
labelFormData.left = new FormAttachment(0);
labelFormData.top = new FormAttachment(subPageCombo, 20);
availableColumnsLabel.setLayoutData(labelFormData);
Label columnFilterLabel = new Label(parent, SWT.NONE);
columnFilterLabel.setText(COLUMN_FILTER_LABEL.getText());
FormData columnFilterLabelFormData = new FormData();
columnFilterLabelFormData.left = new FormAttachment(0);
columnFilterLabelFormData.top = new FormAttachment(
availableColumnsLabel, 10);
columnFilterLabel.setLayoutData(columnFilterLabelFormData);
columnFilterText = new Text(parent, SWT.BORDER);
FormData filterFormData = new FormData();
filterFormData.left = new FormAttachment(columnFilterLabel);
filterFormData.top = new FormAttachment(availableColumnsLabel, 10);
filterFormData.width = EclipseUtils.getTextAreaSize(columnFilterText,
ACCOUNT_TYPE_LABEL.getText(),
0,
1.0).x;
columnFilterText.setLayoutData(filterFormData);
{
clearFilterButton = new Button(parent, SWT.PUSH);
FormData data = new FormData();
data.left = new FormAttachment(columnFilterText, 5);
data.top = new FormAttachment(availableColumnsLabel, 8);
clearFilterButton.setLayoutData(data);
clearFilterButton.setText(CLEAR_LABEL.getText());
clearFilterButton.pack();
clearFilterButton.setEnabled(false);
}
columnFilterText.addModifyListener(getModifyListener());
addFilterListeners();
}
private void addFilterListeners() {
clearFilterButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent event) {
columnFilterText.setText(""); //$NON-NLS-1$
fixMsgFieldsChooser.resetFilter();
}
});
columnFilterText.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event event) {
fixMsgFieldsChooser.applyFilter(columnFilterText.getText());
}
});
}
private void createCustomFixFieldIDText(Composite parent) {
parent.setLayout(new FormLayout());
Label customFixFieldIDLabel = new Label(parent, SWT.NONE);
customFixFieldIDLabel.setText(CUSTOM_FIX_FIELD_ID_LABEL.getText());
FormData labelFormData = new FormData();
labelFormData.left = new FormAttachment(0);
customFixFieldIDLabel.setLayoutData(labelFormData);
customFixFieldIDText = new Text(parent, SWT.BORDER);
FormData fieldIDFormData = new FormData();
fieldIDFormData.left = new FormAttachment(0);
fieldIDFormData.top = new FormAttachment(customFixFieldIDLabel, 2);
fieldIDFormData.bottom = new FormAttachment(100);
fieldIDFormData.width = EclipseUtils.getTextAreaSize(
customFixFieldIDText, "1000000", 0, 1.0).x; //$NON-NLS-1$
customFixFieldIDText.setLayoutData(fieldIDFormData);
customFixFieldIDText.addModifyListener(getModifyListener());
customFixFieldInputButton = new Button(parent, SWT.PUSH);
customFixFieldInputButton.setText("Add Custom"); //$NON-NLS-1$
FormData buttonFormData = new FormData();
buttonFormData.left = new FormAttachment(
customFixFieldIDText, 5);
buttonFormData.top = new FormAttachment(
customFixFieldIDLabel, 2);
buttonFormData.bottom = new FormAttachment(100);
customFixFieldInputButton.setLayoutData(buttonFormData);
customFixFieldInputButton.addMouseListener(getMouseListener());
customFixFieldInputButton.setEnabled(false);
}
private SelectionListener getSelectionListener() {
if (selectionListener == null) {
createSelectionListener();
}
return selectionListener;
}
private void createSelectionListener() {
selectionListener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
Widget widget = event.widget;
if (widget == subPageCombo) {
String subPageID = FIXMessageColumnPrefsSubPageType.getIDFromName(subPageCombo.getText());
fixMsgFieldsChooser.changeSubPage(subPageID);
}
}
};
}
private ModifyListener getModifyListener() {
if (modifyListener == null) {
createModifyListener();
}
return modifyListener;
}
private void createModifyListener() {
modifyListener = new ModifyListener() {
public void modifyText(ModifyEvent event) {
Widget widget = event.widget;
if (widget == customFixFieldIDText) {
boolean hasText = hasText(customFixFieldIDText);
customFixFieldInputButton.setEnabled(hasText);
} else if (widget == columnFilterText) {
boolean hasText = hasText(columnFilterText);
clearFilterButton.setEnabled(hasText);
}
}
};
}
private boolean hasText(Text textBox) {
String text = textBox.getText();
boolean hasText = (text != null) && (!text.trim().equals("")); //$NON-NLS-1$
return hasText;
}
private MouseListener getMouseListener() {
if (mouseListener == null) {
createMouseListener();
}
return mouseListener;
}
private void createMouseListener() {
mouseListener = new MouseAdapter() {
@Override
public void mouseDown(MouseEvent event) {
Widget widget = event.widget;
if (widget == customFixFieldInputButton) {
createCustomFixField();
}
}
};
}
private void createCustomFixField() {
String idAsText = customFixFieldIDText.getText();
if (idAsText != null && idAsText.length() > 0) {
int fieldID = INVALID_FIELD_ID;
try {
fieldID = Integer.parseInt(idAsText);
} catch (NumberFormatException e) {
PhotonPlugin.getMainConsoleLogger().warn(CUSTOM_FIELD_ID_INVALID.getText(idAsText));
return;
}
if (fieldID < 0) {
PhotonPlugin.getMainConsoleLogger().warn(CUSTOM_FIELD_ID_NEGATIVE.getText(idAsText));
} else if (FIXMessageUtil.isValidField(fieldID)) {
String fixField = PhotonPlugin.getDefault().getFIXDataDictionary().getHumanFieldName(fieldID);
PhotonPlugin.getMainConsoleLogger().warn(CUSTOM_FIELD_CONFLICT.getText(idAsText,
fixField));
return;
} else {
fixMsgFieldsChooser.addCustomFieldToAvailableFieldsList(fieldID);
}
}
customFixFieldIDText.setText(""); //$NON-NLS-1$
}
@Override
public boolean performOk() {
try {
super.performOk();
((ScopedPreferenceStore) getPreferenceStore()).save();
} catch (IOException e) {
// TODO: do something
}
return super.performOk();
}
private String[] getSubPageTypes() {
FIXMessageColumnPrefsSubPageType[] subPageIDs = FIXMessageColumnPrefsSubPageType.values();
List<String> typeNames = new ArrayList<String>();
for (FIXMessageColumnPrefsSubPageType type : subPageIDs)
{
typeNames.add(type.toString());
}
String[] typeArray = new String[typeNames.size()];
return typeNames.toArray(typeArray);
}
public enum FIXMessageColumnPrefsSubPageType
{
AVERAGE_PRICE(AVERAGE_PRICE_LABEL.getText(),
AveragePriceView.ID),
FILLS(FILLS_LABEL.getText(),
FillsView.ID),
FIX_MESSAGES(FIX_MESSAGES_LABEL.getText(),
FIXMessagesView.ID),
OPEN_ORDERS(OPEN_ORDERS_LABEL.getText(),
OpenOrdersView.ID);
private String name;
private String id;
FIXMessageColumnPrefsSubPageType(String name, String id){
this.name = name;
this.id = id;
}
public String toString() {
return name;
}
public String getName() {
return name;
}
public String getID() {
return id;
}
public static String getIDFromName(String name) {
FIXMessageColumnPrefsSubPageType[] prefTypes = FIXMessageColumnPrefsSubPageType.values();
for(FIXMessageColumnPrefsSubPageType prefType : prefTypes) {
if(prefType.getName() != null && prefType.getName().equals(name)) {
return prefType.getID();
}
}
return null;
}
}
}