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.SelectionEvent;
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.ui.Composite;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.Widget;
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.GenomeDisplayScroller2D;
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 LayerMapView extends Composite implements RequiresResize {
interface LayerMapViewUiBinder extends UiBinder<Widget, LayerMapView> {
}
private static LayerMapViewUiBinder uiBinder = GWT.create(LayerMapViewUiBinder.class);
private final ExpressionQtlTrack expressionQtlTrackX;
private final ExpressionQtlTrack expressionQtlTrackY;
@UiField
LayoutPanel layout;
@UiField
ListBox chromosome;
@UiField
ListBox positionColumnX;
private String selectedPositionColumnX;
@UiField
ListBox positionColumnY;
private String selectedPositionColumnY;
@UiField(provided = true)
final GenomeDisplayScroller scrollerX;
@UiField(provided = true)
final GenomeDisplayScroller scrollerY;
@UiField(provided = true)
final GenomeDisplayScroller2D contents;
public LayerMapView(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" });
selectedPositionColumnX = validNames.get(0);
selectedPositionColumnY = validNames.get(1);
expressionQtlTrackX = new ExpressionQtlTrack("eQTL", dataSetLayerOverview.layerKey, selectedPositionColumnX);
expressionQtlTrackY = new ExpressionQtlTrack("eQTL", dataSetLayerOverview.layerKey, selectedPositionColumnY);
final GenomeDisplayTrack<?>[] tracksX = new GenomeDisplayTrack[] { new BasepairPositionTrack(), new ChromosomeBandTrack(), new ContigTrack(), new TranscriptTrack(), expressionQtlTrackX };
this.scrollerX = new GenomeDisplayScroller(tracksX, chromosomes[0], false, "scrollX");
final GenomeDisplayTrack<?>[] tracksY = new GenomeDisplayTrack[] { new BasepairPositionTrack(), new ChromosomeBandTrack(), new ContigTrack(), new TranscriptTrack(), expressionQtlTrackY };
this.scrollerY = new GenomeDisplayScroller(tracksY, chromosomes[0], true, "scrollY");
contents = new GenomeDisplayScroller2D(dataSetLayerOverview, "scroll2d");
contents.selectedPositionColumnX = selectedPositionColumnX;
contents.selectedPositionColumnY = selectedPositionColumnY;
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)) {
positionColumnX.addItem(columName);
positionColumnY.addItem(columName);
}
}
positionColumnX.setSelectedIndex(0);
positionColumnY.setSelectedIndex(1);
}
@UiHandler("chromosome")
public void onChangeChromosome(ChangeEvent event) {
String chr = chromosome.getValue(chromosome.getSelectedIndex());
scrollerX.changeChromosome(chr);
scrollerY.changeChromosome(chr);
}
@UiHandler("positionColumnX")
public void onChangePositionColumnX(ChangeEvent event) {
selectedPositionColumnX = positionColumnX.getValue(positionColumnX.getSelectedIndex());
contents.selectedPositionColumnX = selectedPositionColumnX;
expressionQtlTrackX.setPositionColumn(selectedPositionColumnX);
// force refresh
onChangeChromosome(null);
}
@UiHandler("positionColumnY")
public void onChangePositionColumnY(ChangeEvent event) {
selectedPositionColumnY = positionColumnX.getValue(positionColumnY.getSelectedIndex());
contents.selectedPositionColumnY = selectedPositionColumnY;
expressionQtlTrackY.setPositionColumn(selectedPositionColumnY);
// force refresh
onChangeChromosome(null);
}
@UiHandler("scrollerX")
public void onScrollX(ValueChangeEvent<GenomeRange> event) {
contents.rangeX.pixelLength = contents.getElement().getClientWidth();
contents.rangeX.update(event.getValue());
}
@UiHandler("scrollerY")
public void onScrollY(ValueChangeEvent<GenomeRange> event) {
contents.rangeY.pixelLength = contents.getElement().getClientHeight();
contents.rangeY.update(event.getValue());
}
@UiHandler("contents")
public void onScroll2D(ValueChangeEvent<Integer[]> event) {
final Integer[] off = event.getValue();
if (off[0] != 0)
scrollerX.scrollRelative(off[0]);
if (off[1] != 0)
scrollerY.scrollRelative(off[1]);
}
@UiHandler("scrollerX")
public void onZoomX(SelectionEvent<Long> event) {
scrollerY.setZoomLevel(event.getSelectedItem());
}
@UiHandler("scrollerY")
public void onZoomY(SelectionEvent<Long> event) {
scrollerX.setZoomLevel(event.getSelectedItem());
}
public void onResize() {
layout.onResize();
}
}