package com.tibco.as.spacebar.ui.editor.continuous; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors; import org.eclipse.nebula.widgets.nattable.blink.BlinkLayer; import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry; import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor; import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsDataProvider; import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsEventLayer; import org.eclipse.nebula.widgets.nattable.layer.IUniqueIndexLayer; import org.eclipse.swt.widgets.Display; import ca.odell.glazedlists.EventList; import com.tibco.as.space.Metaspace; import com.tibco.as.spacebar.ui.editor.AbstractBrowser; import com.tibco.as.spacebar.ui.editor.AbstractConfiguration; import com.tibco.as.spacebar.ui.editor.StringPropertyAccessor; public class ContinuousBrowser extends AbstractBrowser<ObservableTuple> { private boolean scrollLocked; @Override protected AbstractConfiguration getConfiguration() { return new BlinkConfiguration(); } private void revealAsync(final ObservableTuple tuple) { if (tuple == null) { return; } if (scrollLocked) { return; } Display.getDefault().asyncExec(new Runnable() { @Override public void run() { if (isDisposed()) { return; } getViewportLayer().moveRowPositionIntoViewport( getEventList().indexOf(tuple)); } }); } public void setScrollLocked(boolean checked) { this.scrollLocked = checked; } @Override protected IUniqueIndexLayer getLayer( GlazedListsEventLayer<ObservableTuple> glazedListsEventLayer, GlazedListsDataProvider<ObservableTuple> bodyDataProvider, IConfigRegistry registry) { return new BlinkLayer<ObservableTuple>(glazedListsEventLayer, bodyDataProvider, new TupleRowIdAccessor(), getPropertyAccessor(), registry, false, Executors.newSingleThreadScheduledExecutor()); } private ObservableTuple update(EventList<ObservableTuple> list, ObservableTuple tuple, int index) { ObservableTuple existing = list.get(index); for (String field : getNonKeyFieldNames()) { existing.put(field, tuple.get(field)); } return existing; } @Override public void write(ObservableTuple tuple) { if (isDisposed()) { return; } EventList<ObservableTuple> eventList = getEventList(); int index = eventList.indexOf(tuple); if (index == -1) { super.write(tuple); revealAsync(tuple); } else { revealAsync(update(eventList, tuple, index)); } } @Override public void write(List<ObservableTuple> tuples) { if (isDisposed()) { return; } List<ObservableTuple> adds = new ArrayList<ObservableTuple>(); EventList<ObservableTuple> list = getEventList(); ObservableTuple reveal = null; for (ObservableTuple tuple : tuples) { int index = list.indexOf(tuple); if (index == -1) { adds.add(tuple); reveal = tuple; } else { reveal = update(list, tuple, index); } } super.write(adds); if (reveal != null) { revealAsync(reveal); } } @Override protected IColumnPropertyAccessor<ObservableTuple> getPropertyAccessor() { return new StringPropertyAccessor<ObservableTuple>(getFieldNames()); } @Override protected Exporter getExporter(Metaspace metaspace) { return new Exporter(metaspace, getPropertyChangeListener()); } }