package org.juxtapose.fxtradingclient; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.juxtapose.fxtradingclient.tools.ImageConstants; import org.juxtapose.streamline.producer.ISTMEntryKey; import org.juxtapose.streamline.tools.CollectionMethods; import org.juxtapose.streamline.tools.DataConstants; import org.juxtapose.streamline.util.ISTMContainerListener; import org.juxtapose.streamline.util.ISTMEntry; import org.juxtapose.streamline.util.data.DataType; import org.juxtapose.streamline.util.data.DataTypeArrayList; import org.juxtapose.streamline.util.data.DataTypeLong; import org.juxtapose.streamline.util.data.DataTypeString; import com.trifork.clj_ds.IPersistentMap; import com.trifork.clj_ds.PersistentHashMap; /** * @author Pontus J�rgne * 1 jun 2013 * Copyright (c) Pontus J�rgne. All rights reserved */ public class DataViewer extends Composite implements ISTMContainerListener { String typeKey; String serviceKey; TableViewer viewer; MetaDataControl metaDataControl; IPersistentMap<String, DataType<?>> metaData; Set<ViewDataObject> viewObjects = new HashSet<ViewDataObject>(); public DataViewer( String inServiceKey, Composite parent, int style, IPersistentMap<String, DataType<?>> inData, String inTypeKey, MetaDataControl inMetaDataControl ) { super( parent, style ); typeKey = inTypeKey; serviceKey = inServiceKey; metaDataControl = inMetaDataControl; metaData = inData; setLayout( new FillLayout() ); createViewer( this, inData ); ContainerSubscriber containerSub = metaDataControl.getContainerSubscriber( typeKey ); containerSub.addContainerListener( this ); } private void createViewer(Composite parent, IPersistentMap<String, DataType<?>> inData ) { viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); createColumns(parent, viewer, inData); final Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); viewer.setContentProvider(ArrayContentProvider.getInstance()); // Get the content for the viewer, setInput will call getElements in the // contentProvider // viewer.setInput(ModelProvider.INSTANCE.getPersons()); // Make the selection available to other views // Set the sorter for the table // Layout the viewer // GridData gridData = new GridData(); // gridData.verticalAlignment = GridData.FILL; // gridData.horizontalSpan = 2; // gridData.grabExcessHorizontalSpace = true; // gridData.grabExcessVerticalSpace = true; // gridData.horizontalAlignment = GridData.FILL; // viewer.getControl().setLayoutData(gridData); } public TableViewer getViewer() { return viewer; } public void setInput( ViewDataObject[] inData ) { viewer.setInput( inData ); } public ViewDataObject[] getObjects() { ViewDataObject[] objects = new ViewDataObject[viewer.getTable().getItemCount()]; for( int i = 0; i < viewer.getTable().getItemCount(); i++) { objects[i] = (ViewDataObject)viewer.getElementAt( i ); } return objects; } public void addEntry() { ViewDataObject viewObject = new ViewDataObject( serviceKey, typeKey, PersistentHashMap.EMPTY, metaData ); viewer.add( viewObject ); viewObjects.add( viewObject ); } /** * @param parent * @param viewer * @param inData */ private void createColumns(final Composite parent, final TableViewer viewer, IPersistentMap<String, DataType<?>> inData) { DataTypeArrayList keyList = (DataTypeArrayList)inData.valAt( DataConstants.FIELD_KEYS ); Iterator<Map.Entry<String, DataType<?>>> iter = inData.iterator(); int i = 0; while( iter.hasNext() ) { Map.Entry<String, DataType<?>> entry = iter.next(); final String key = entry.getKey(); if( DataConstants.FIELD_KEYS.equals(key) ) { } else if( !DataConstants.FIELD_STATUS.equals(key) ) { DataType<?> val = entry.getValue(); TableViewerColumn col = createTableViewerColumn(key, 100, i); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { ViewDataObject viewObj = (ViewDataObject)element; IPersistentMap<String, DataType<?>> map = viewObj.getData(); DataType<?> data = map.valAt( key ); if( data == null ) return ""; return data.get().toString(); } }); if( val instanceof DataTypeString ) { String valStr = ((DataTypeString)val).get(); if( valStr.isEmpty() ) { col.setEditingSupport( new DataEditingSupport( viewer, key, CollectionMethods.contains( keyList, new DataTypeString(key) ) ) ); } else { //value is a predefined type InputContainer input = metaDataControl.getInputContainer( valStr ); col.setEditingSupport( new DataEditingSupportEnum( viewer, key, input, parent.getDisplay(), CollectionMethods.contains( keyList, new DataTypeString(key) ) ) ); } } else if( val instanceof DataTypeLong ) { col.setEditingSupport( new DataEditingSupportLong( viewer, key, CollectionMethods.contains( keyList, new DataTypeString(key) ) ) ); } else if( val instanceof DataTypeArrayList ) { InputContainer input = metaDataControl.getInputContainer( key ); col.setEditingSupport( new DataEditingSupportEnum( viewer, key, input, parent.getDisplay(), CollectionMethods.contains( keyList, new DataTypeString(key) ) ) ); } } i++; } TableViewerColumn col = createTableViewerColumn("", 100, i); col.setLabelProvider(new ColumnLabelProvider() { @Override public Image getImage( Object inElement ) { Image im = ImageConstants.getImage( ImageConstants.TEST ); return im; } public String getText( Object inElement ) { if( inElement instanceof ViewDataObject ) { ViewDataObject obj = (ViewDataObject)inElement; String validate = obj.validate(); if( validate != null ) return validate; } return ""; } }); } private TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber) { final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); final TableColumn column = viewerColumn.getColumn(); column.setText(title); column.setWidth(bound); column.setResizable(true); column.setMoveable(true); return viewerColumn; } @Override public void onContainerRefAdded( final ISTMEntryKey inKey, final ISTMEntry inEntry ) { getDisplay().asyncExec( new Runnable(){ @Override public void run() { ViewDataObject viewObject = new ViewDataObject( serviceKey, typeKey, inEntry.getDataMap(), metaData, inKey ); for( ViewDataObject existingObject : viewObjects ) { if( existingObject.getKey() != null && inKey.equals( existingObject.getKey() ) ) { existingObject.setData( inEntry.getDataMap() ); viewer.update( existingObject, new String[]{"NAME"} ); return; } } viewer.add( viewObject ); viewObjects.add( viewObject ); } }); } public String getType() { return typeKey; } @Override public void onContainerRefUpdated( ISTMEntryKey inKey, ISTMEntry inEntry ) { // TODO Auto-generated method stub } @Override public void onContainerRefRemoved( ISTMEntryKey inKey, ISTMEntry inEntry ) { // TODO Auto-generated method stub } }