/*
* Copyright (c) 2004-2011 Marco Maccaferri and others.
* 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:
* Marco Maccaferri - initial API and implementation
*/
package org.eclipsetrader.ui.internal.securities;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IFontProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipsetrader.core.feed.FeedProperties;
public class FeedPropertiesControl {
private Composite container;
private TreeViewer viewer;
private FeedProperties properties;
public class PropertiesLabelProvider extends LabelProvider implements ITableLabelProvider, IFontProvider {
private Font containerFont;
public PropertiesLabelProvider() {
FontData[] fontData = Display.getDefault().getSystemFont().getFontData();
if (fontData != null && fontData.length != 0) {
containerFont = new Font(Display.getDefault(), fontData[0].getName(), fontData[0].getHeight(), SWT.BOLD);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
*/
@Override
public void dispose() {
if (containerFont != null) {
containerFont.dispose();
}
super.dispose();
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
return getColumnText(element, 0);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
*/
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
*/
@Override
public String getColumnText(Object element, int columnIndex) {
switch (columnIndex) {
case 0:
return element.toString();
case 1: {
if (element instanceof PropertyElement) {
String value = ((PropertyElement) element).getValue();
return value != null ? value : "<default>";
}
break;
}
}
return "";
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
*/
@Override
public Font getFont(Object element) {
if (element instanceof PropertyElementContainer) {
return containerFont;
}
return null;
}
}
public class PropertiesContentProvider implements ITreeContentProvider {
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
@Override
public void dispose() {
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof PropertyElementContainer) {
return ((PropertyElementContainer) parentElement).getChilds();
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
@Override
public Object getParent(Object element) {
if (element instanceof PropertyElement) {
return ((PropertyElement) element).getParent();
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/
@Override
public boolean hasChildren(Object element) {
return element instanceof PropertyElementContainer;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
@Override
public Object[] getElements(Object inputElement) {
return (Object[]) inputElement;
}
}
public FeedPropertiesControl(Composite parent) {
container = new Composite(parent, SWT.NONE);
TreeColumnLayout tableLayout = new TreeColumnLayout();
container.setLayout(tableLayout);
viewer = new TreeViewer(container, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
TreeColumn treeColumn = new TreeColumn(viewer.getTree(), SWT.NONE);
treeColumn.setText("Property");
tableLayout.setColumnData(treeColumn, new ColumnWeightData(35));
treeColumn = new TreeColumn(viewer.getTree(), SWT.NONE);
treeColumn.setText("Value");
tableLayout.setColumnData(treeColumn, new ColumnWeightData(65));
viewer.setLabelProvider(new PropertiesLabelProvider());
viewer.setContentProvider(new PropertiesContentProvider());
viewer.setSorter(new ViewerSorter());
viewer.setColumnProperties(new String[] {
null, "value"
});
viewer.setCellEditors(new CellEditor[] {
null, new TextCellEditor(viewer.getTree())
});
viewer.setCellModifier(new ICellModifier() {
@Override
public boolean canModify(Object element, String property) {
return element instanceof PropertyElement && "value".equals(property);
}
@Override
public Object getValue(Object element, String property) {
if (element instanceof PropertyElement && "value".equals(property)) {
return ((PropertyElement) element).getValue() != null ? ((PropertyElement) element).getValue() : "";
}
return null;
}
@Override
public void modify(Object object, String property, Object value) {
PropertyElement element = (PropertyElement) (object instanceof TreeItem ? ((TreeItem) object).getData() : object);
element.setValue("".equals(value) ? null : value.toString());
viewer.update(element, new String[] {
property
});
}
});
viewer.setInput(buildInput());
viewer.expandAll();
}
public Control getControl() {
return container;
}
public Tree getTree() {
return viewer.getTree();
}
public Object getLayoutData() {
return container.getLayoutData();
}
public void setLayoutData(Object layoutData) {
container.setLayoutData(layoutData);
}
public class PropertyElementContainer {
private String name;
private Map<String, PropertyElement> childs = new HashMap<String, PropertyElement>();
public PropertyElementContainer(String name) {
this.name = name;
}
public String getName() {
return name;
}
public PropertyElement[] getChilds() {
Collection<PropertyElement> c = childs.values();
return c.toArray(new PropertyElement[c.size()]);
}
public PropertyElement createChild(String id, String name) {
PropertyElement element = childs.get(id);
if (element == null) {
element = new PropertyElement(id, name, this);
childs.put(id, element);
}
return element;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return name;
}
}
public class PropertyElement {
private String id;
private String name;
private String value;
private PropertyElementContainer parent;
public PropertyElement(String id, String name, PropertyElementContainer parent) {
this.id = id;
this.name = name;
this.parent = parent;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public PropertyElementContainer getParent() {
return parent;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return name;
}
}
protected PropertyElementContainer[] buildInput() {
Map<String, PropertyElementContainer> containers = new HashMap<String, PropertyElementContainer>();
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint("org.eclipsetrader.core.connectors");
if (extensionPoint != null) {
IConfigurationElement[] configElements = extensionPoint.getConfigurationElements();
for (int j = 0; j < configElements.length; j++) {
String name = configElements[j].getDeclaringExtension().getLabel();
if (name == null || name.equals("")) {
name = configElements[j].getDeclaringExtension().getContributor().getName();
}
if ("property".equals(configElements[j].getName())) {
PropertyElementContainer container = containers.get(name);
if (container == null) {
container = new PropertyElementContainer(name);
containers.put(name, container);
}
container.createChild(configElements[j].getAttribute("id"), configElements[j].getAttribute("name"));
}
}
}
return containers.values().toArray(new PropertyElementContainer[containers.values().size()]);
}
public void setProperties(FeedProperties properties) {
this.properties = properties;
PropertyElementContainer[] input = (PropertyElementContainer[]) viewer.getInput();
for (PropertyElementContainer container : input) {
for (PropertyElement element : container.getChilds()) {
element.setValue(properties != null ? properties.getProperty(element.getId()) : null);
}
}
viewer.refresh();
}
public FeedProperties getProperties() {
if (properties == null) {
properties = new FeedProperties();
}
if (properties != null) {
PropertyElementContainer[] input = (PropertyElementContainer[]) viewer.getInput();
for (PropertyElementContainer container : input) {
for (PropertyElement element : container.getChilds()) {
properties.setProperty(element.getId(), element.getValue());
}
}
}
return properties.getPropertyIDs().length != 0 ? properties : null;
}
}