package org.marketcetera.photon.views.providers;
import java.util.Set;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.marketcetera.algo.BrokerAlgoTag;
import org.marketcetera.algo.BrokerAlgoTagSpec;
/**
* Editor support for BrokerAlgoTags table.
* TextBox (options == null) or comboBox (options != null).
*
* @author Milos Djuric
*
*/
public class AlgoTableColumnEdditorSupport extends EditingSupport {
CellEditor mEditor = null;
public AlgoTableColumnEdditorSupport(ColumnViewer viewer) {
super(viewer);
}
/**
* Return appropriate cell editor for BrokerAlgoTags element from table
*/
@Override
protected CellEditor getCellEditor(Object element) {
if(element instanceof BrokerAlgoTag){
BrokerAlgoTag brokerAlgoTag = (BrokerAlgoTag)element;
if(brokerAlgoTag.getTagSpec().getOptions() != null){
mEditor = createComboBoxCellEditor(brokerAlgoTag);
}else{
mEditor = createTextBoxCellEditor(brokerAlgoTag);
}
return mEditor;
}
return null;
}
/**
* Create and populate comboBox cell editor (with empty value for non mandatory fields).
*/
private CellEditor createComboBoxCellEditor(BrokerAlgoTag brokerAlgoTag) {
BrokerAlgoTagSpec brokerAlgoTagSpec = brokerAlgoTag.getTagSpec();
Set<String> keys = brokerAlgoTagSpec.getOptions().keySet();
String[] values = new String[keys.size() + (brokerAlgoTagSpec.getIsMandatory()? 1 : 0)];
String selectedValue = brokerAlgoTag.getValue();
String selectedKey = null;
int index = 0;
if(brokerAlgoTagSpec.getIsMandatory()){
values[index++] = "";
}
for(String key:keys){
values[index++] = key;
if(selectedValue != null && !selectedValue.equals("") && selectedValue.equals(brokerAlgoTagSpec.getOptions().get(key))){
selectedKey = key;
}
}
ComboBoxViewerCellEditor editor = new ComboBoxViewerCellEditor((Composite)(getViewer().getControl()), SWT.READ_ONLY);
editor.setLabelProvider(new LabelProvider());
editor.setContenProvider(new ArrayContentProvider());
editor.setInput(values);
if(selectedKey != null){
editor.setValue(selectedKey);
}
return editor;
}
/**
* Create textBox cell editor
*/
private CellEditor createTextBoxCellEditor(BrokerAlgoTag brokerAlgoTag) {
return new TextCellEditor((Composite)(getViewer().getControl()));
}
@Override
protected boolean canEdit(Object element) {
if(element instanceof BrokerAlgoTag){
return true;
}
return false;
}
@Override
protected Object getValue(Object element) {
if(element instanceof BrokerAlgoTag){
BrokerAlgoTag brokerAlgoTag = (BrokerAlgoTag)element;
return brokerAlgoTag.getValue() != null ? brokerAlgoTag.getValue() : "";
}
return "";
}
@Override
protected void setValue(Object element, Object value) {
if(value == null)
return;
if(element instanceof BrokerAlgoTag){
String newValue = (value == null)?"": value.toString();
BrokerAlgoTag brokerAlgoTag = (BrokerAlgoTag)element;
if(brokerAlgoTag.getTagSpec().getOptions() != null){
newValue = (brokerAlgoTag.getTagSpec().getOptions().get(value));
if(newValue == null)
newValue = "";
}
brokerAlgoTag.setValue(newValue);
getViewer().refresh();
}
}
}