package org.juxtapose.fxtradingclient; import static org.juxtapose.streamline.tools.STMUtil.isServiceStatusUpdatedToOk; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Layout; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import org.juxtapose.fxtradingsystem.constants.FXDataConstants; import org.juxtapose.fxtradingsystem.constants.FXProducerServiceConstants; import org.juxtapose.streamline.producer.ISTMEntryKey; import org.juxtapose.streamline.stm.ISTM; import org.juxtapose.streamline.tools.DataConstants; import org.juxtapose.streamline.tools.KeyConstants; import org.juxtapose.streamline.tools.STMEntryKey; import org.juxtapose.streamline.tools.STMUtil; import org.juxtapose.streamline.util.ISTMEntry; import org.juxtapose.streamline.util.ISTMEntryRequestSubscriber; import org.juxtapose.streamline.util.ISTMRequestor; import org.juxtapose.streamline.util.PersistentArrayList; import org.juxtapose.streamline.util.Status; import org.juxtapose.streamline.util.data.DataType; import org.juxtapose.streamline.util.data.DataTypeArrayList; import org.juxtapose.streamline.util.data.DataTypeHashMap; import org.juxtapose.streamline.util.data.DataTypeLong; import org.juxtapose.streamline.util.data.DataTypeRef; import org.juxtapose.streamline.util.data.DataTypeString; import com.trifork.clj_ds.IPersistentMap; import com.trifork.clj_ds.PersistentHashMap; public class EditView extends ViewPart implements ISTMEntryRequestSubscriber, ISTMRequestor { public static final String ID = "org.juxtapose.fxtradingclient.editview"; private HashMap<String, DataViewer> typeToViewer = new HashMap<String, DataViewer>(); private Composite parent; ISTM stm; private ISTMEntryKey configMetaKey; boolean subscribedMetaData = false; TabFolder tabFolder; /** * The content provider class is responsible for providing objects to the * view. It can wrap existing objects in adapters or simply return objects * as-is. These objects may be sensitive to the current input of the view, * or ignore it and always show the same content (like Task List, for * example). */ class ViewContentProvider implements IStructuredContentProvider { public void inputChanged(Viewer v, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object parent) { if (parent instanceof Object[]) { return (Object[]) parent; } return new Object[0]; } } class ViewLabelProvider extends LabelProvider implements ITableLabelProvider { public String getColumnText(Object obj, int index) { return getText(obj); } public Image getColumnImage(Object obj, int index) { return getImage(obj); } public Image getImage(Object obj) { return PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_OBJ_ELEMENT); } } private void createMenu( Composite inComp ) { Composite menuComp = new Composite( inComp, SWT.NONE ); menuComp.setLayout( new RowLayout() ); Button syncButt = new Button( parent, SWT.PUSH ); syncButt.setText( "Synch" ); syncButt.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent sev ) { uploadRecord(); } }); Button newButt = new Button(parent, SWT.PUSH); newButt.addSelectionListener( new SelectionAdapter(){ public void widgetSelected( SelectionEvent sev ) { TabItem[] items = tabFolder.getSelection(); if( items != null && items.length != 0 ) { DataViewer viewer = (DataViewer)items[0].getControl(); viewer.addEntry(); } // } }); newButt.setText( "New Entry" ); } /** * This is a callback that will allow us to create the viewer and initialize * it. */ public void createPartControl(Composite parent) { // viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); // viewer.setContentProvider(new ViewContentProvider()); // viewer.setLabelProvider(new ViewLabelProvider()); // Provide the input to the ContentProvider this.parent = parent; stm = STMStatic.getSTM(); parent.setLayout( new GridLayout(1, false) ); createMenu( parent ); tabFolder = new TabFolder(parent, SWT.NONE); GridData tabData = new GridData(); tabData.grabExcessHorizontalSpace = true; tabData.grabExcessVerticalSpace = true; tabData.horizontalAlignment = GridData.FILL; tabData.verticalAlignment = GridData.FILL; tabFolder.setLayoutData(tabData); stm.subscribeToData( KeyConstants.PRODUCER_SERVICE_KEY, this); } private void uploadRecord() { TabItem[] selectedItems = tabFolder.getSelection(); if( selectedItems == null || selectedItems.length == 0 ) return; TabItem selected = selectedItems[0]; DataViewer viewer = (DataViewer)selected.getControl(); ViewDataObject[] objects = viewer.getObjects(); if( objects == null ) return; for( ViewDataObject obj : objects ) { if( obj.getState() == ViewDataObjectState.CREATED ) { IPersistentMap<String, DataType<?>> data = obj.getData(); stm.request( FXProducerServiceConstants.CONFIG, 1, DataConstants.REQUEST_TYPE_CREATE, this, viewer.getType(), data ); } else if( obj.getState() == ViewDataObjectState.UPDATED ) { IPersistentMap<String, DataType<?>> data = obj.getUpdateData(); data = data.assoc( DataConstants.FIELD_KEYS, new DataTypeRef( obj.getKey() ) ); stm.request( FXProducerServiceConstants.CONFIG, 1, DataConstants.REQUEST_TYPE_UPDATE, this, viewer.getType(), data ); } } } /** * Passing the focus request to the viewer's control. */ public void setFocus() { // viewer.getControl().setFocus(); } @Override public void updateData( final ISTMEntryKey inKey, final ISTMEntry inData, final boolean inFullUpdate ) { if( inKey.equals( KeyConstants.PRODUCER_SERVICE_KEY ) && !subscribedMetaData ) { if( isServiceStatusUpdatedToOk( FXProducerServiceConstants.CONFIG, inData )) { stm.logInfo( "requesting key for config metadata" ); HashMap<String, String> queryMap = new HashMap<String, String>(); queryMap.put( DataConstants.FIELD_QUERY_KEY, DataConstants.STATE_TYPE_META ); stm.getDataKey( FXProducerServiceConstants.CONFIG, this, FXProducerServiceConstants.CONFIG, queryMap ); } else if( isServiceStatusUpdatedToOk( FXProducerServiceConstants.PRICE_ENGINE, inData )) { // PriceSubscriber ps = new PriceSubscriber( stm ); } DataType<?> peVal = inData.getUpdatedValue( FXProducerServiceConstants.PRICE_ENGINE ); } } public void metaDataRecieved( final ISTMEntry inData, final boolean inFullUpdate ) { } @Override public int getPriority() { return 0; } @Override public void deliverKey( ISTMEntryKey inDataKey, Object inTag ) { configMetaKey = inDataKey; MetaDataControl metaDataControl = new MetaDataControl( this ); metaDataControl.initialize( stm, configMetaKey ); } public void addViewer( final String inFieldKey, final IPersistentMap<String, DataType<?>> inData, final MetaDataControl inMetaDataControl ) { parent.getDisplay().asyncExec( new Runnable() { @Override public void run() { TabItem viewTabItem = new TabItem(tabFolder, SWT.NONE); // Button b = new Button(parent, SWT.PUSH); final DataViewer viewer = new DataViewer( FXProducerServiceConstants.CONFIG, tabFolder, SWT.NONE, inData, inFieldKey, inMetaDataControl ); typeToViewer.put( inFieldKey, viewer ); // b.addSelectionListener( new SelectionAdapter(){ // public void widgetSelected( SelectionEvent sev ) // { // viewer.addEntry(); // } // }); viewTabItem.setControl(viewer); viewTabItem.setText(inFieldKey); parent.layout(); parent.update(); } }); } @Override public void queryNotAvailible( Object inTag ) { stm.logInfo( "config metadata not availible" ); } @Override public void reply( int inTag, long inType, String inMessage, IPersistentMap<String, DataType<?>> inData ) { // TODO Auto-generated method stub } }