Skip to content

Commit d2db965

Browse files
author
Uemit Seren
committed
Support for custom tracks added
1 parent 8dd1773 commit d2db965

14 files changed

+526
-93
lines changed

src/main/java/at/gmi/nordborglab/widgets/geneviewer/client/GeneViewer.java

+222-58
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,118 @@
11
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
22
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
3-
xmlns:g="urn:import:com.google.gwt.user.client.ui"
4-
xmlns:dyg="urn:import:org.danvk.dygraphs.client"
3+
xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:dyg="urn:import:org.danvk.dygraphs.client"
54
xmlns:pjs="urn:import:at.gmi.nordborglab.processingjs.client">
65

7-
<ui:with field="mainRes" type="at.gmi.nordborglab.widgets.geneviewer.client.resources.MyResources" />
8-
6+
<ui:with field="mainRes"
7+
type="at.gmi.nordborglab.widgets.geneviewer.client.resources.MyResources" />
8+
9+
<ui:style>
10+
.uploadAnchor {
11+
color: #06C !important;
12+
}
13+
.uploadPanel {
14+
padding:10px;
15+
16+
}
17+
.uploadErrorMessage {
18+
color:red;
19+
font-weight:bold;
20+
}
21+
.uploadPanel ul,.uploadPanel li {
22+
border: 0;
23+
margin: 0;
24+
padding: 0;
25+
list-style: none;
26+
}
27+
28+
.uploadPanel li {
29+
clear: both;
30+
list-style: none;
31+
padding-bottom: 10px;
32+
}
33+
34+
.uploadPanel input {
35+
float: left;
36+
}
37+
38+
.uploadPanel label {
39+
width: 140px;
40+
float: left;
41+
}
42+
</ui:style>
43+
944
<g:FlowPanel ui:field="container">
10-
<g:ToggleButton ui:field="settings_btn" addStyleNames="{mainRes.style.settingsButton}" />
45+
<g:ToggleButton ui:field="settings_btn"
46+
addStyleNames="{mainRes.style.settingsButton}" />
1147
<pjs:Processing ui:field="processing" addStyleNames="{mainRes.style.geneviewer}"></pjs:Processing>
1248
<dyg:Dygraphs ui:field="genomeStatChart"></dyg:Dygraphs>
13-
<g:PopupPanel ui:field="settings_popup" animationEnabled="true" addStyleNames="{mainRes.style.settingsPopup}">
14-
<g:HTMLPanel addStyleNames="{mainRes.style.settingsContent}">
15-
<div class="{mainRes.style.settingsContentTitle}">Overview Tracks:</div>
16-
<g:HTMLPanel ui:field="track_container" />
17-
</g:HTMLPanel>
49+
<g:PopupPanel ui:field="settings_popup" animationEnabled="true"
50+
addStyleNames="{mainRes.style.settingsPopup}">
51+
<g:FlowPanel>
52+
<g:HTMLPanel addStyleNames="{mainRes.style.settingsContent}"
53+
ui:field="trackContent">
54+
<div class="{mainRes.style.settingsContentTitle}">
55+
Overview Tracks:
56+
</div>
57+
<g:HTMLPanel ui:field="track_container" />
58+
<hr />
59+
<div class="{mainRes.style.settingsContentTitle}">
60+
Custom Tracks (
61+
<g:Anchor addStyleNames="{style.uploadAnchor}" ui:field="addCustomTrackBtn">Upload</g:Anchor>
62+
):
63+
</div>
64+
<g:HTMLPanel ui:field="custom_track_container" width="100%"/>
65+
</g:HTMLPanel>
66+
<g:HTMLPanel ui:field="uploadContainer" visible="false">
67+
<g:FormPanel ui:field="uploadFormPanel" encoding="multipart/form-data" method="POST">
68+
<g:HTMLPanel addStyleNames="{style.uploadPanel}">
69+
<h2>Upload custom tracks</h2>
70+
<span ui:field="uploadErrorMessage" class="{style.uploadErrorMessage}"/>
71+
<ul>
72+
<li>
73+
<label for="nameTb">Name</label>
74+
<g:TextBox name="genomestats_name" ui:field="nameTb" />
75+
</li>
76+
<li>
77+
<label for="fileBox">File</label>
78+
<g:FileUpload name="genomestats_file" ui:field="fileBox" />
79+
</li>
80+
<li>
81+
<g:Button ui:field="formSubmitBtn" text="Upload"></g:Button>
82+
<g:Button ui:field="cancelUploadBtn" text="Cancel"></g:Button>
83+
</li>
84+
</ul>
85+
</g:HTMLPanel>
86+
</g:FormPanel>
87+
</g:HTMLPanel>
88+
</g:FlowPanel>
1889
</g:PopupPanel>
19-
20-
<g:PopupPanel ui:field = "description_popup" animationEnabled = "true" addStyleNames='{mainRes.style.popupPanel}'>
21-
<g:HTMLPanel>
22-
<table cellspacing="1" cellpadding="2" width="100%" colspan="2" >
23-
<tr colspan="2" >
24-
<td colspan="2" align="left" class="{mainRes.style.popupNameRow}" >
25-
Gene Model: <span ui:field="name_label" ></span>
26-
</td>
27-
</tr>
28-
<tr class="{mainRes.style.popupRowEven}">
29-
<th align="left">Position:</th>
30-
<td>
31-
<g:Label ui:field="position_label"></g:Label>
32-
</td>
33-
</tr>
34-
<tr >
35-
<th align="left" valign="top">Description:</th>
36-
<td><g:Label ui:field="description_label"></g:Label></td>
37-
</tr>
38-
</table>
39-
</g:HTMLPanel>
90+
91+
<g:PopupPanel ui:field="description_popup"
92+
animationEnabled="true" addStyleNames='{mainRes.style.popupPanel}'>
93+
<g:HTMLPanel>
94+
<table cellspacing="1" cellpadding="2" width="100%" colspan="2">
95+
<tr colspan="2">
96+
<td colspan="2" align="left" class="{mainRes.style.popupNameRow}">
97+
Gene Model:
98+
<span ui:field="name_label"></span>
99+
</td>
100+
</tr>
101+
<tr class="{mainRes.style.popupRowEven}">
102+
<th align="left">Position:</th>
103+
<td>
104+
<g:Label ui:field="position_label"></g:Label>
105+
</td>
106+
</tr>
107+
<tr>
108+
<th align="left" valign="top">Description:</th>
109+
<td>
110+
<g:Label ui:field="description_label"></g:Label>
111+
</td>
112+
</tr>
113+
</table>
114+
</g:HTMLPanel>
40115
</g:PopupPanel>
41116
</g:FlowPanel>
42-
117+
43118
</ui:UiBinder>

src/main/java/at/gmi/nordborglab/widgets/geneviewer/client/datasource/AbstractHttpDataSource.java

+4
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@ public abstract class AbstractHttpDataSource implements DataSource{
88
public AbstractHttpDataSource(String url) {
99
this.url = url;
1010
}
11+
12+
public String getUrl() {
13+
return url;
14+
}
1115
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package at.gmi.nordborglab.widgets.geneviewer.client.datasource;
2+
3+
import com.google.gwt.core.client.JavaScriptObject;
4+
5+
public class BackendResult extends JavaScriptObject {
6+
7+
protected BackendResult() {
8+
}
9+
10+
public final native String getStatus() /*-{
11+
return this.status;
12+
}-*/;
13+
14+
public final native String getStatusText() /*-{
15+
return this.statustext;
16+
}-*/;
17+
}

src/main/java/at/gmi/nordborglab/widgets/geneviewer/client/datasource/DataSource.java

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.List;
44

55

6+
67
public interface DataSource {
78

89
public void fetchGenes(String chr, int start, int end, boolean getFeatures, DataSourceCallback callback);
@@ -11,4 +12,7 @@ public interface DataSource {
1112
public void fetchGeneDescription(String name,FetchGeneDescriptionCallback callback);
1213
public void fetchGenomeStatsData(List<GenomeStat> genomeStats,String chr,FetchGenomeStatsDataCallback callback);
1314
public void fetchGenomeStatsList(FetchGenomeStatsListCallback callback);
15+
public void fetchCustomGenomeStatsList(FetchGenomeStatsListCallback fetchGenomeStatsListCallback,String urlParameters);
16+
public void fetchCustomGenomeStatsData(List<GenomeStat> genomeStats,String chr, String urlParameters,FetchGenomeStatsDataCallback callback);
17+
public void deleteCustomGenomeStats(String urlParameters, String track, DeleteCustomGenomeStatsCallback callback);
1418
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package at.gmi.nordborglab.widgets.geneviewer.client.datasource;
2+
3+
public interface DeleteCustomGenomeStatsCallback {
4+
public void onDeleteCustomGenomeStats(BackendResult result);
5+
}

src/main/java/at/gmi/nordborglab/widgets/geneviewer/client/datasource/GenomeStat.java

+8
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ public final native boolean isStepPlot() /*-{
4747
return false;
4848
}-*/;
4949

50+
public final native boolean isCustom() /*-{
51+
if (typeof this.isCustom != 'undefined') {
52+
return this.isCustom;
53+
}
54+
return false;
55+
}-*/;
56+
57+
5058
public static GenomeStat getFromName(List<GenomeStat> stats,String name) {
5159
for (GenomeStat stat: stats) {
5260
if (stat != null && stat.getName().equals(name)){
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package at.gmi.nordborglab.widgets.geneviewer.client.datasource;
2+
3+
import com.google.gwt.core.client.JsonUtils;
4+
import com.google.gwt.visualization.client.DataTable;
5+
6+
public class GenomeStatData extends BackendResult {
7+
8+
protected GenomeStatData() {}
9+
10+
private final native String getData() /*-{
11+
return this.data;
12+
}-*/;
13+
14+
public final DataTable getDataTable() {
15+
return DataTable.create(JsonUtils.safeEval(getData()).cast());
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package at.gmi.nordborglab.widgets.geneviewer.client.datasource;
2+
3+
import com.google.gwt.core.client.JsArray;
4+
5+
public class GenomeStatsList extends BackendResult{
6+
7+
protected GenomeStatsList() {}
8+
9+
10+
11+
public final native JsArray<GenomeStat> getGenomeStats() /*-{
12+
return this.stats;
13+
}-*/;
14+
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package at.gmi.nordborglab.widgets.geneviewer.client.datasource;
2+
3+
4+
public class UploadGenomeStatResult extends BackendResult {
5+
6+
protected UploadGenomeStatResult() {
7+
}
8+
9+
public final native GenomeStat getData() /*-{
10+
return this.data;
11+
}-*/;
12+
13+
}

src/main/java/at/gmi/nordborglab/widgets/geneviewer/client/datasource/impl/JBrowseDataSourceImpl.java

+103-1
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@
55
import java.util.List;
66

77
import at.gmi.nordborglab.widgets.geneviewer.client.datasource.AbstractHttpDataSource;
8+
import at.gmi.nordborglab.widgets.geneviewer.client.datasource.BackendResult;
89
import at.gmi.nordborglab.widgets.geneviewer.client.datasource.DataSourceCallback;
10+
import at.gmi.nordborglab.widgets.geneviewer.client.datasource.DeleteCustomGenomeStatsCallback;
911
import at.gmi.nordborglab.widgets.geneviewer.client.datasource.FetchGeneDescriptionCallback;
1012
import at.gmi.nordborglab.widgets.geneviewer.client.datasource.FetchGenesFromQueryCallback;
1113
import at.gmi.nordborglab.widgets.geneviewer.client.datasource.FetchGenomeStatsDataCallback;
1214
import at.gmi.nordborglab.widgets.geneviewer.client.datasource.FetchGenomeStatsListCallback;
1315
import at.gmi.nordborglab.widgets.geneviewer.client.datasource.Gene;
1416
import at.gmi.nordborglab.widgets.geneviewer.client.datasource.GenomeStat;
17+
import at.gmi.nordborglab.widgets.geneviewer.client.datasource.GenomeStatData;
18+
import at.gmi.nordborglab.widgets.geneviewer.client.datasource.GenomeStatsList;
1519
import at.gmi.nordborglab.widgets.geneviewer.client.datasource.SearchGeneCallback;
1620

1721
import com.google.gwt.core.client.JsArray;
@@ -25,7 +29,6 @@
2529
import com.google.gwt.json.client.JSONObject;
2630
import com.google.gwt.json.client.JSONParser;
2731
import com.google.gwt.json.client.JSONValue;
28-
import com.google.gwt.user.client.Window;
2932
import com.google.gwt.visualization.client.DataTable;
3033

3134
public class JBrowseDataSourceImpl extends AbstractHttpDataSource{
@@ -252,4 +255,103 @@ public void onError(Request request, Throwable exception) {
252255
}
253256

254257
}
258+
259+
@Override
260+
public void fetchCustomGenomeStatsList(
261+
final FetchGenomeStatsListCallback callback,String urlParameters) {
262+
RequestBuilder request = new RequestBuilder(RequestBuilder.GET,url+"getCustomGenomeStatsList?"+urlParameters);
263+
request.setCallback(new RequestCallback() {
264+
265+
@Override
266+
public void onResponseReceived(Request request, Response response) {
267+
if (response.getStatusCode() != 200)
268+
return;
269+
List<GenomeStat> genomeStats = new ArrayList<GenomeStat>();
270+
GenomeStatsList result = JsonUtils.safeEval(response.getText());
271+
if (result.getStatus().equals("OK"))
272+
{
273+
JsArray<GenomeStat> array = result.getGenomeStats();
274+
for (int i =0;i<array.length();i++) {
275+
genomeStats.add(array.get(i));
276+
}
277+
callback.onFetchGenomeStatsList(genomeStats);
278+
}
279+
}
280+
281+
@Override
282+
public void onError(Request request, Throwable exception) {
283+
// TODO Auto-generated method stub
284+
}
285+
});
286+
try
287+
{
288+
request.send();
289+
}
290+
catch (Exception e) {
291+
292+
}
293+
294+
}
295+
296+
@Override
297+
public void deleteCustomGenomeStats(String urlParameters, String track,
298+
final DeleteCustomGenomeStatsCallback callback) {
299+
RequestBuilder request = new RequestBuilder(RequestBuilder.GET,url+"deleteCustomGenomeStats?"+urlParameters+"&stat="+track);
300+
request.setCallback(new RequestCallback() {
301+
302+
@Override
303+
public void onResponseReceived(Request request, Response response) {
304+
if (response.getStatusCode() != 200)
305+
return;
306+
BackendResult result = JsonUtils.safeEval(response.getText());
307+
callback.onDeleteCustomGenomeStats(result);
308+
}
309+
310+
@Override
311+
public void onError(Request request, Throwable exception) {
312+
// TODO Auto-generated method stub
313+
}
314+
});
315+
try
316+
{
317+
request.send();
318+
}
319+
catch (Exception e) {
320+
321+
}
322+
323+
}
324+
325+
@Override
326+
public void fetchCustomGenomeStatsData(List<GenomeStat> genomeStats,
327+
String chr, String urlParameters,
328+
final FetchGenomeStatsDataCallback callback) {
329+
String stats = getStatUrl(genomeStats);
330+
RequestBuilder request = new RequestBuilder(RequestBuilder.GET,url+"getCustomGenomeStatsData?"+urlParameters+"&stats="+stats+"&chr="+chr);
331+
request.setCallback(new RequestCallback() {
332+
333+
@Override
334+
public void onResponseReceived(Request request, Response response) {
335+
GenomeStatData result = JsonUtils.safeEval(response.getText());
336+
if (result.getStatus().equals("OK"))
337+
{
338+
DataTable dataTable = result.getDataTable();
339+
callback.onFetchGenomeStats(dataTable);
340+
}
341+
}
342+
343+
@Override
344+
public void onError(Request request, Throwable exception) {
345+
// TODO Auto-generated method stub
346+
}
347+
});
348+
try
349+
{
350+
request.send();
351+
}
352+
catch (Exception e) {
353+
354+
}
355+
356+
}
255357
}

0 commit comments

Comments
 (0)