package de.uni_luebeck.inb.krabbenhoeft.eQTL.client;
import java.util.Arrays;
import java.util.List;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Widget;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.gwt.DataRetrieval;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.gwt.DataRetrievalAsync;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.gwt.DataSetLayerOverview;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.gwt.GenomeRange;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.client.scroller.GenomeDisplayScroller;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.client.scroller.GenomeDisplayTrack;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.client.tracks.BasepairPositionTrack;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.client.tracks.ChromosomeBandTrack;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.client.tracks.ContigTrack;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.client.tracks.ExpressionQtlTrack;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.client.tracks.TranscriptTrack;
public class LayerGaugeView extends Composite {
interface LayerGaugeViewUiBinder extends UiBinder<Widget, LayerGaugeView> {
}
private static LayerGaugeViewUiBinder uiBinder = GWT.create(LayerGaugeViewUiBinder.class);
private final DataRetrievalAsync dataRetrievalService = GWT.create(DataRetrieval.class);
private final DataSetLayerOverview dataSetLayerOverview;
private final ExpressionQtlTrack expressionQtlTrack;
@UiField
ListBox chromosome;
@UiField
ListBox positionColumn;
private String selectedPositionColumn;
@UiField(provided = true)
final GenomeDisplayScroller scroller;
@UiField
Grid table;
static int itemsPerPage = 25;
public LayerGaugeView(DataSetLayerOverview dataSetLayerOverview) {
this.dataSetLayerOverview = dataSetLayerOverview;
String[] chromosomes = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "X" };
List<String> validNames = Arrays.asList(new String[] { "positionPeakBP", "geneStartBP" });
selectedPositionColumn = validNames.get(0);
expressionQtlTrack = new ExpressionQtlTrack("eQTL", dataSetLayerOverview.layerKey, selectedPositionColumn);
final GenomeDisplayTrack<?>[] tracks = new GenomeDisplayTrack[] { new BasepairPositionTrack(), new ChromosomeBandTrack(), new ContigTrack(), new TranscriptTrack(), expressionQtlTrack };
this.scroller = new GenomeDisplayScroller(tracks, chromosomes[0], false, "gauge");
initWidget(uiBinder.createAndBindUi(this));
for (String string : chromosomes) {
if (string.equals("X"))
chromosome.addItem("X Chromosome", string);
else
chromosome.addItem("Chromosome " + string, string);
}
for (String columName : dataSetLayerOverview.columns) {
if (validNames.contains(columName))
positionColumn.addItem(columName);
}
table.resize(1, dataSetLayerOverview.columns.length);
for (int i = 0; i < dataSetLayerOverview.columns.length; i++) {
table.setText(0, i, dataSetLayerOverview.columns[i]);
}
table.getRowFormatter().addStyleName(0, "tableHeader");
}
@UiHandler("chromosome")
public void onChangeChromosome(ChangeEvent event) {
String chr = chromosome.getValue(chromosome.getSelectedIndex());
scroller.changeChromosome(chr);
table.setVisible(false);
}
@UiHandler("positionColumn")
public void onChangePositionColumn(ChangeEvent event) {
selectedPositionColumn = positionColumn.getValue(positionColumn.getSelectedIndex());
expressionQtlTrack.setPositionColumn(selectedPositionColumn);
// force refresh
onChangeChromosome(null);
}
private GenomeRange tableRange = null;
private Timer updateOnTimeout = new Timer() {
public void run() {
reloadTable();
}
};
@UiHandler("scroller")
public void onScroll(ValueChangeEvent<GenomeRange> event) {
table.setVisible(false);
updateOnTimeout.cancel();
tableRange = event.getValue();
updateOnTimeout.schedule(100);
}
public void reloadTable() {
table.setVisible(false);
new AutoRetry<String[][]>() {
public void success(String[][] result) {
table.resizeRows(1 + result.length);
for (int i = 0; i < result.length; i++) {
for (int j = 0; j < result[i].length; j++) {
table.setText(1 + i, j, result[i][j]);
}
}
table.setVisible(true);
}
public void invoke(AsyncCallback<String[][]> callback) {
dataRetrievalService.getTopRowsForRange(dataSetLayerOverview.layerKey, selectedPositionColumn, tableRange, callback);
}
}.run();
}
}