source: trunk/www/views/experiments/plotter/index.jsp @ 5924

Last change on this file since 5924 was 5924, checked in by Nicklas Nordborg, 10 years ago

References #1655: GUI improvements

Plot functions for spot data and in experiment explorer.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 23.4 KB
Line 
1<%-- $Id: index.jsp 5924 2012-01-13 13:10:52Z nicklas $
2  ------------------------------------------------------------------
3  BioArray Software Environment (BASE) - http:// base.thep.lu.se/
4
5  This file is part of BASE - BioArray Software Environment.
6  Available at http://base.thep.lu.se/
7
8  BASE is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License
10  as published by the Free Software Foundation; either version 3
11  of the License, or (at your option) any later version.
12
13  BASE is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with BASE. If not, see <http://www.gnu.org/licenses/>.
20  ------------------------------------------------------------------
21
22  @author Nicklas
23  @version 2.0
24--%>
25<%@ page pageEncoding="UTF-8" session="false"
26  import="net.sf.basedb.core.SessionControl"
27  import="net.sf.basedb.core.DbControl"
28  import="net.sf.basedb.core.Experiment"
29  import="net.sf.basedb.core.BioAssaySet"
30  import="net.sf.basedb.core.BioAssay"
31  import="net.sf.basedb.core.RawDataType"
32  import="net.sf.basedb.core.RawDataProperty"
33  import="net.sf.basedb.core.Formula"
34  import="net.sf.basedb.core.IntensityTransform"
35  import="net.sf.basedb.core.AnnotationType"
36  import="net.sf.basedb.core.ItemQuery"
37  import="net.sf.basedb.core.ItemResultList"
38  import="net.sf.basedb.core.Include"
39  import="net.sf.basedb.core.Permission"
40  import="net.sf.basedb.core.Item"
41  import="net.sf.basedb.core.query.Orders"
42  import="net.sf.basedb.core.query.Hql"
43  import="net.sf.basedb.core.query.Restrictions"
44  import="net.sf.basedb.core.query.Restriction"
45  import="net.sf.basedb.core.query.Expressions"
46  import="net.sf.basedb.clients.web.Base"
47  import="net.sf.basedb.clients.web.DynamicUtil"
48  import="net.sf.basedb.clients.web.util.HTML"
49  import="net.sf.basedb.util.Values"
50  import="net.sf.basedb.clients.web.WebException"
51  import="net.sf.basedb.clients.web.taglib.table.TableColumn"
52  import="java.util.List"
53  import="java.util.LinkedList"
54%>
55<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
56<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
57<%!
58private static void addFormulaOption(StringBuilder options, String formula, String title, String description)
59{
60  options.append("<option value=\"").append(HTML.encodeTags(formula)).append("\"");
61  options.append(" title=\"").append(HTML.encodeTags(description)).append("\"");
62  options.append(">").append(HTML.encodeTags(title)).append("\n");
63}
64
65%>
66<%
67final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
68final float scale = Base.getScale(sc);
69final String ID = sc.getId();
70final DbControl dc = sc.newDbControl();
71try
72{
73  int bioAssaySetId = Values.getInt(request.getParameter("bioassayset_id"));
74  int bioAssayId = Values.getInt(request.getParameter("bioassay_id"));
75  BioAssay ba = bioAssayId == 0 ? null : BioAssay.getById(dc, bioAssayId);
76  BioAssaySet bas = ba == null ? BioAssaySet.getById(dc, bioAssaySetId) : ba.getBioAssaySet();
77  RawDataType rdt = bas.getRawDataType();
78  Experiment experiment = bas.getExperiment();
79  int maxRawMappings = bas.getMaxRawMappingsForSpot();
80  IntensityTransform transform = bas.getIntensityTransform();
81 
82  List<TableColumn> formulas = new LinkedList<TableColumn>();
83  DynamicUtil.addSpotColumns(formulas, dc, rdt.getChannels(), transform);
84  DynamicUtil.addFormulaColumns(formulas, dc, rdt, Formula.Type.COLUMN_EXPRESSION, 
85      transform, "", "", maxRawMappings == 1);
86  DynamicUtil.addExtraColumns(formulas, dc, bas, "ev", "#", "[Xtra] ");
87  if (maxRawMappings == 1)
88  {
89    DynamicUtil.addRawDataColumns(formulas, dc, rdt, "", "", "[Raw] ");
90  }
91 
92  StringBuilder formulaOptions = new StringBuilder();
93  for (TableColumn tc : formulas)
94  {
95    if (tc.getJepExpression() != null && tc.getDatatype().isNumerical())
96    {
97      String jepExpression = tc.getJepExpression();
98      addFormulaOption(formulaOptions, jepExpression, tc.getTitle(), tc.getDescription());
99    }
100  }
101 
102  StringBuilder filterOptions = new StringBuilder();
103  ItemQuery<Formula> formulaQuery = Formula.getQuery(Formula.Type.COLUMN_RESTRICTION, rdt, transform);
104  formulaQuery.order(Orders.asc(Hql.property("name")));
105  formulaQuery.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
106  for (Formula formula : formulaQuery.list(dc))
107  {
108    String f = formula.getFormulas().get(0);
109    if (maxRawMappings == 1 || !f.contains("raw("))
110    {
111      addFormulaOption(filterOptions, f, 
112        formula.getName(), formula.getDescription());
113    }
114  }
115 
116  // Annnotations -- experimental factors and bioassay annotations
117  final ItemQuery<AnnotationType> query = AnnotationType.getQuery(null);
118  query.join(Hql.leftJoin("experiments", Item.EXPERIMENT.getAlias()));
119  query.join(Hql.innerJoin("itemTypes", "itemType"));
120  Restriction ef = Restrictions.eq(
121    Hql.alias(Item.EXPERIMENT.getAlias()), 
122    Hql.entity(experiment)
123  );
124  Restriction baa = Restrictions.eq(
125    Hql.alias("itemType"),
126    Expressions.integer(Item.BIOASSAY.getValue())
127  );
128  query.restrict(Restrictions.or(ef, baa));
129  query.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
130  query.order(Orders.asc(Hql.property("name")));
131  List<AnnotationType> experimentalFactors = query.list(dc);
132 
133  String title = HTML.encodeTags("Plot " + (ba == null ? bas.getName() : ba.getName()));
134 
135  final boolean hasCreateFilePermission = sc.hasPermission(Permission.CREATE, Item.FILE);
136  %>
137  <base:page type="popup" title="<%=title%>">
138  <base:head styles="tabcontrol.css" scripts="tabcontrol.js">
139  <script language="JavaScript">
140
141  function validate()
142  {
143    var plotType = getPlotType();
144    if (plotType == 'scatter')
145    {
146      return validateScatterPlot();
147    }
148    else if (plotType == 'histogram')
149    {
150      return validateHistogramPlot();
151    }
152    return false;
153  }
154  function validateScatterPlot()
155  {
156    var frm = document.forms['plot'];
157    if (Main.trimString(frm.yFormulaScatter.value) == '')
158    {
159      alert("You must enter an expression for the Y axis");
160      frm.yFormulaScatter.focus();
161      return false;
162    }
163    else if (Main.trimString(frm.xFormulaScatter.value) == '')
164    {
165      alert("You must enter an expression for the X axis");
166      frm.xFormulaScatter.focus();
167      return false;
168    }
169    return true;
170  }
171  function validateHistogramPlot()
172  {
173    var frm = document.forms['plot'];
174    var yAggregate = Forms.getCheckedRadio(frm.yAggregate).value;
175    if (Main.trimString(frm.xFormulaHistogram.value) == '')
176    {
177      alert("You must enter an expression for the X axis");
178      frm.xFormulaHistogram.focus();
179      return false;
180    }
181    else if (yAggregate != 'count' && Main.trimString(frm.yFormulaHistogram.value) == '')
182    {
183      alert("You must enter an expression for the Y axis");
184      frm.yFormulaHistogram.focus();
185      return false;
186    }
187    return true;
188  }
189
190  function getPlotType()
191  {
192    var frm = document.forms['plot'];
193    return Forms.getCheckedRadio(frm.plotType).value;
194  }
195
196  function plotTypeOnChange()
197  {
198    var isScatter = getPlotType() == 'scatter';
199    Main.showHide('scatterSection', isScatter);
200    Main.showHide('histogramSection', !isScatter);
201  }
202
203  function presetOnChange(list, formula, label)
204  {
205    var index = list.selectedIndex;
206    formula.value = list[index].value;
207    if (label && list[index].value != '') label.value = list[index].text;
208    list.selectedIndex = 0;
209  }
210 
211  function aggregateOnChange()
212  {
213    var frm = document.forms['plot'];
214    var selected = Forms.getCheckedRadio(frm.yAggregate);
215    var isCount = selected.value == 'count';
216    frm.yFormulaHistogram.disabled = isCount;
217    frm.yPresetsHistogram.disabled = isCount;
218    frm.yLogHistogram.disabled = isCount;
219    for (var i = 0; i < frm.hiloAggregate.length; i++)
220    {
221      frm.hiloAggregate[i].disabled = isCount;
222    }
223    if (isCount)
224    {
225      Main.removeClass(frm.yFormulaHistogram, 'required');
226      frm.yLabelHistogram.value = 'Count';
227    }
228    else
229    {
230      Main.addClass(frm.yFormulaHistogram, 'required');
231      var yPreset = frm.yPresetsHistogram[frm.yPresetsHistogram.selectedIndex];
232      if (yPreset.value != '') frm.yLabelHistogram.value = yPresetHistogram.text;
233    }
234  }
235 
236  function annotationOnChange(list)
237  {
238    var frm = document.forms['plot'];
239    var selected = list[list.selectedIndex];
240    var value = selected.value && selected.value != '$' ? selected.text : '';
241    value = value.replace('\[A\] ', '');
242    frm.subTitle.value = value;
243   
244    if (selected.value.substring(0, 1) == '$')
245    {
246      frm.annotationExp.disabled = true;
247    }
248    else
249    {
250      if (selected.value)
251      {
252        frm.annotationExp.value = selected.value;
253      }
254      frm.annotationExp.disabled = false;
255      frm.annotationExp.focus();
256    }
257  }
258 
259  function annotationExpressionOnChange()
260  {
261    var frm = document.forms['plot'];
262    frm.annotationPresets.selectedIndex = annotationFrm.annotationPresets.length-1;
263  }
264 
265  function generatePlotUrl(fullSize)
266  {
267    if (validate())
268    {
269      var frm = document.forms['plot'];
270      var url = 'plot?ID=<%=ID%>&bioassayset_id=<%=bioAssaySetId%>&bioassay_id=<%=bioAssayId%>';
271      url += '&title='+Main.encodeURI(frm.title.value);
272      url += '&subTitle='+Main.encodeURI(frm.subTitle.value);
273      if (fullSize)
274      {
275        url += '&width='+frm.width.value;
276        url += '&height='+frm.height.value;
277      }
278     
279      if (frm.filter.value != '')
280      {
281        url += '&filter='+Main.encodeURI(frm.filter.value);
282      }
283     
284      var annotation = '';
285      if (!frm.annotationExp.disabled)
286      {
287        if (frm.annotationExp.value)
288        {
289          annotation = '=' + frm.annotationExp.value;
290        }
291      }
292      else
293      {
294        annotation = frm.annotationPresets[frm.annotationPresets.selectedIndex].value.substring(1);
295      }
296      if (annotation)
297      {
298        url += '&annotation='+Main.encodeURI(annotation);
299      }
300
301      var plotType = getPlotType();
302      if (plotType == 'scatter')
303      {
304        url += '&type=scatter';
305        url += '&x='+Main.encodeURI(frm.xFormulaScatter.value);
306        url += '&xLabel='+Main.encodeURI(frm.xLabelScatter.value);
307        url += '&xLog='+(frm.xLogScatter.checked ? 1 : 0);
308        url += '&y='+Main.encodeURI(frm.yFormulaScatter.value);
309        url += '&yLabel='+Main.encodeURI(frm.yLabelScatter.value);
310        url += '&yLog='+(frm.yLogScatter.checked ? 1 : 0);
311      }
312      else
313      {
314        var yAggregate = Forms.getCheckedRadio(frm.yAggregate).value;
315        url += '&type=histogram';
316        url += '&x='+Main.encodeURI(frm.xFormulaHistogram.value);
317        url += '&xLabel='+Main.encodeURI(frm.xLabelHistogram.value);
318        url += '&xLog='+(frm.xLogHistogram.checked ? 1 : 0);
319        url += '&binSize='+Main.encodeURI(frm.binSize.value);
320        url += '&yAggregate='+yAggregate;
321        url += '&yLabel='+Main.encodeURI(frm.yLabelHistogram.value);
322        if (yAggregate != 'count')
323        {
324          url += '&y='+Main.encodeURI(frm.yFormulaHistogram.value);
325          url += '&yLog='+(frm.yLogHistogram.checked ? 1 : 0);
326          url += '&hiloAggregate='+Forms.getCheckedRadio(frm.hiloAggregate).value
327        }
328      }
329      return url;
330    }
331  }
332 
333  function openExpressionBuilder(title, frmName, inputName, formulaType)
334  {
335    if (!document.forms[frmName][inputName].disabled)
336    {
337      var restrictions = formulaType == '<%=Formula.Type.COLUMN_RESTRICTION.name()%>';
338      Main.expressionBuilder('<%=ID%>', title, frmName, inputName, formulaType, '<%=rdt.getId()%>', <%=rdt.getChannels()%>, restrictions, <%=bas.getId()%>);
339    }
340  }
341 
342  function previewPlot()
343  {
344    var url = generatePlotUrl(false);
345    if (url)
346    {
347      url += '&width=540&height=360';
348
349      var overlayImg = document.getElementById('overlay');
350      overlayImg.src = getRoot()+'images/plot_generating.gif';
351     
352      var previewImg = document.getElementById('preview');
353      previewImg.realImg = new Image();
354      previewImg.realImg.onload = changePreviewImage;
355      previewImg.realImg.src = url;
356    }
357  }
358 
359  function changePreviewImage()
360  {
361    var previewImg = document.getElementById('preview');
362    previewImg.src = previewImg.realImg.src;
363    previewImg.realImg = null;
364    var overlayImg = document.getElementById('overlay');
365    overlayImg.src = getRoot() + 'images/blankbutton.gif';
366  }
367 
368  function viewPlot()
369  {
370    var url = generatePlotUrl(true);
371    if (url)
372    {
373      var frm = document.forms['plot'];
374      var width = parseInt(frm.width.value);
375      var height = parseInt(frm.height.value);
376      if (!width || width < 600) width = 600;
377      if (!height || height < 400) height = 400;
378      Main.openPopup('view.jsp?ID=<%=ID%>&title='+Main.encodeURI(frm.title.value), 'ViewPlot', width+150, height+100);
379    }
380  }
381 
382  function downloadPlot()
383  {
384    var url = generatePlotUrl(true);
385    if (url)
386    {
387      Main.openPopup('download.jsp?ID=<%=ID%>', 'DownloadPlot', 300, 200);
388    }
389  }
390 
391  function savePlotAs()
392  {
393    var url = generatePlotUrl(true);
394    if (url)
395    {
396      Main.openPopup('save_as.jsp?ID=<%=ID%>', 'SavePlotAs', 450, 300);
397    }
398  }
399 
400  function init()
401  {
402  }
403  </script>
404  </base:head>
405  <base:body onload="init()">
406  <h1><%=title%> <base:help helpid="plotter" /></h1>
407  <form name="plot">
408  <div class="content bottomborder">
409    <div class="absolutefull rightborder" style="right: 550px;">
410      <table class="fullform input100 smaller">
411      <tbody>
412        <tr>
413          <th>Plot title</th>
414          <td colspan="2"><input type="text" class="text" size="30" maxlength="255" name="title" 
415            value="<%=HTML.encodeTags(ba == null ? bas.getName() : ba.getName())%>"></td>
416        </tr>
417        <tr>
418          <th class="subprompt">Subtitle</th>
419          <td colspan="2"><input type="text" class="text" maxlength="255" name="subTitle" 
420            value=""></td>
421        </tr>
422        <tr>
423          <th>Width</th>
424          <td colspan="2"><input type="text" class="text" style="width: 10em;" maxlength="10" name="width" 
425            value="900" onkeypress="return Numbers.integerOnly(event)"> (not used by preview)</td>
426        </tr>
427        <tr>
428          <th>Height</th>
429          <td colspan="2"><input type="text" class="text" style="width: 10em;" maxlength="10" name="height" 
430            value="600" onkeypress="return Numbers.integerOnly(event)"></td>
431        </tr>
432        <tr>
433          <th class="subprompt"></th>
434          <td colspan="2"></td>
435        </tr>
436      </tbody>
437      <tbody class="sectionheader">
438        <tr>
439          <th>Plot type</th>
440          <td colspan="2">
441            <input type="radio" name="plotType" value="scatter" onchange="plotTypeOnChange()"
442              id="plotTypeScatter" checked><label for="plotTypeScatter">Scatter</label>
443            <input type="radio" name="plotType" value="histogram" onchange="plotTypeOnChange()"
444              id="plotTypeHistogram"><label for="plotTypeHistogram">Histogram</label>
445          </td>
446        </tr>
447      </tbody>
448      <tbody id="scatterSection">
449        <tr>
450          <th>Y-axis</th>
451          <td>
452          <select name="yPresetsScatter" style="width: 25em;"
453            onchange="presetOnChange(this, this.form.yFormulaScatter, this.form.yLabelScatter)" 
454            >
455            <option value="">- select from list or enter formula below -
456            <%=formulaOptions.toString()%>
457          </select>
458          </td>
459          <td></td>
460        </tr>
461        <tr>
462          <th class="subprompt">Expression</th>
463          <td><input type="text" class="text required" maxlength="255" name="yFormulaScatter"></td>
464          <td>
465            <base:icon
466              image="expression_builder.gif"
467              tooltip="Use the Expression builder"
468              onclick="openExpressionBuilder('Y-axis expression', 'plot', 'yFormulaScatter', 'COLUMN_EXPRESSION')"
469            />
470          </td>
471        </tr>
472        <tr>
473          <th class="subprompt">Y label</th>
474          <td><input type="text" class="text" maxlength="255" name="yLabelScatter" value=""></td>
475          <td></td>
476        </tr>
477        <tr>
478          <th class="subprompt"><label for="yLogScatter">Log scale</label></th>
479          <td><input type="checkbox" name="yLogScatter" id="yLogScatter" value="1"></td>
480          <td></td>
481        </tr>
482        <tr>
483          <th>X-axis</th>
484          <td>
485          <select name="xPresetsScatter" style="width: 25em;"
486            onchange="presetOnChange(this, this.form.xFormulaScatter, this.form.xLabelScatter)" 
487            >
488            <option value="">- select from list or enter formula below -
489            <%=formulaOptions.toString()%>
490          </select>
491          </td>
492          <td></td>
493        </tr>
494        <tr>
495          <th class="subprompt">Expression</th>
496          <td><input type="text" class="text required" maxlength="255" name="xFormulaScatter"></td>
497          <td>
498            <base:icon
499              image="expression_builder.gif"
500              tooltip="Use the Expression builder"
501              onclick="openExpressionBuilder('X-axis expression', 'plot', 'xFormulaScatter', 'COLUMN_EXPRESSION')"
502            />
503          </td>
504        </tr>
505        <tr>
506          <th class="subprompt">X label</th>
507          <td><input type="text" class="text" maxlength="255" name="xLabelScatter" value=""></td>
508          <td></td>
509        </tr>
510        <tr>
511          <th class="subprompt"><label for="xLogScatter">Log scale</label></th>
512          <td><input type="checkbox" name="xLogScatter" id="xLogScatter" value="1"></td>
513          <td></td>
514        </tr>
515      </tbody>
516     
517      <tbody id="histogramSection" style="display: none;">
518        <tr>
519          <th>Y-axis</th>
520          <td>
521            <input type="radio" name="yAggregate" id="yAggregateCount" value="count" checked 
522              onchange="aggregateOnChange()"><label for="yAggregateCount">Count</label>
523            <input type="radio" name="yAggregate" id="yAggregateMean" value="mean"
524              onchange="aggregateOnChange()"><label for="yAggregateMean">Mean</label>
525          </td>
526          <td></td>
527        </tr>
528        <tr>
529          <th class="subprompt">Hi-lo</th>
530          <td>
531            <input type="radio" name="hiloAggregate" id="hiloAggregateNone" value="" checked
532              ><label for="hiloAggregateNone">None</label>
533            <input type="radio" name="hiloAggregate" id="hiloAggregateMinMax" value="hilomaxmin"
534              ><label for="hiloAggregateMinMax">Min/Max</label>
535            <input type="radio" name="hiloAggregate" id="hiloAggregateStdev" value="hilostdev"
536              ><label for="hiloAggregateStdev">Stdev</label>
537          </td>
538          <td></td>
539        </tr>
540        <tr>
541          <th class="subprompt">Presets</th>
542          <td>
543          <select name="yPresetsHistogram" style="width: 25em;"
544            onchange="presetOnChange(this, this.form.yFormulaHistogram, this.form.yLabelHistogram)" 
545            disabled
546            >
547            <option value="">- select from list or enter formula below -
548            <%=formulaOptions.toString()%>
549          </select>
550          </td>
551          <td></td>
552        </tr>
553        <tr>
554          <th class="subprompt">Expression</th>
555          <td><input type="text" class="text" maxlength="255" name="yFormulaHistogram" disabled></td>
556          <td>
557            <base:icon
558              image="expression_builder.gif"
559              tooltip="Use the Expression builder"
560              onclick="openExpressionBuilder('Y-axis expression', 'plot', 'yFormulaHistogram', 'COLUMN_EXPRESSION')"
561            />
562          </td>
563        </tr>
564        <tr>
565          <th class="subprompt">Y label</th>
566          <td><input type="text" class="text" maxlength="255" name="yLabelHistogram" value="Count"></td>
567          <td></td>
568        </tr>
569        <tr>
570          <th class="subprompt"><label for="yLogHistogram">Log scale</label></th>
571          <td><input type="checkbox" name="yLogHistogram" id="yLogHistogram" value="1"></td>
572          <td></td>
573        </tr>
574        <tr>
575          <th>X-axis</th>
576          <td>
577          <select name="xPresetsHistogram"  style="width: 25em;"
578            onchange="presetOnChange(this, this.form.xFormulaHistogram, this.form.xLabelHistogram)" 
579            >
580            <option value="">- select from list or enter formula below -
581            <%=formulaOptions.toString()%>
582          </select>
583          </td>
584          <td></td>
585        </tr>
586        <tr>
587          <th class="subprompt">Expression</th>
588          <td><input type="text" class="text required" maxlength="255" name="xFormulaHistogram"></td>
589          <td>
590            <base:icon
591              image="expression_builder.gif"
592              tooltip="Use the Expression builder"
593              onclick="openExpressionBuilder('X-axis expression', 'plot', 'xFormulaHistogram', 'COLUMN_EXPRESSION')"
594            />
595          </td>
596        </tr>
597        <tr>
598          <th class="subprompt">X label</th>
599          <td><input type="text" class="text" maxlength="255" name="xLabelHistogram" value=""></td>
600          <td></td>
601        </tr>
602        <tr>
603          <th class="subprompt"><label for="xLogHistogram">Log scale</label></th>
604          <td><input type="checkbox" name="xLogHistogram" id="xLogHistogram" value="1"></td>
605          <td></td>
606        </tr>
607        <tr>
608          <th class="subprompt">Bin size</th>
609          <td><input type="text" class="text" name="binSize" value="1" style="width: 10em;"></td>
610          <td></td>
611        </tr>
612      </tbody>
613      <tbody>
614        <tr>
615          <th class="subprompt"></th>
616          <td colspan="2"></td>
617        </tr>
618      </tbody>
619      <tbody class="sectionheader">
620        <tr>
621          <th colspan="3">Filter &amp; annotations</th>
622        </tr>
623      </tbody>
624      <tbody>
625        <tr>
626          <th>Filter</th>
627          <td colspan="2">
628            <select name="filterPresets" style="width: 25em;"
629              onchange="presetOnChange(this, this.form.filter, null)" 
630              >
631              <option value="">- select from list or enter formula below -
632              <%=filterOptions.toString()%>
633            </select>
634          </td>
635        </tr>
636        <tr>
637          <th class="subprompt"></th>
638          <td><input type="text" class="text" maxlength="255" name="filter" placeholder="leave empty to plot all values"></td>
639          <td>
640            <base:icon
641              image="expression_builder.gif"
642              tooltip="Use the Expression builder"
643              onclick="openExpressionBuilder('Filter expression', 'plot', 'filter', 'COLUMN_RESTRICTION')"
644            />
645          </td>
646        </tr>
647        <tr>
648          <th>Annotation</th>
649          <td colspan="2">
650            <select name="annotationPresets" onchange="annotationOnChange(this)" style="width: 25em;">
651              <option value="$">- none -
652              <%
653              if (ba == null)
654              {
655                %>
656                <option value="$bioassay">Bioassay
657                <option value="$spots">Spots
658                <option value="$arrayDesign.name">Array design
659                <option value="$software.name">Software
660                <option value="$protocol.name">Protocol
661                <option value="$scan.scanner.name">Scanner
662                <option value="$scan.protocol.name">Scanning protocol
663                <option value="$scan.hybridization.protocol.name">Hybridization protocol
664                <option value="$scan.hybridization.creationEvent.eventDate">Hybridization date
665                <option value="" disabled>- annotations -
666                <%
667                for (AnnotationType at : experimentalFactors)
668                {
669                  %>
670                  <option value="$<%=at.getId()%>">[A] <%=HTML.encodeTags(at.getName())%>
671                  <%
672                }
673              }
674              %>
675              <option value="" disabled>- expressions -
676              <%=filterOptions.toString()%>
677              <option value="">Other...
678            </select>
679          </td>
680        </tr>
681        <tr>
682          <th class="subprompt"></th>
683          <td><input type="text" class="text" maxlength="255" name="annotationExp"
684            onchange="annotationExpressionOnChange()" disabled></td>
685          <td>
686            <base:icon
687              image="expression_builder.gif"
688              tooltip="Use the Expression builder"
689              onclick="openExpressionBuilder('Annotation filter', 'plot', 'annotationExp', 'COLUMN_RESTRICTION')"
690            />
691          </td>
692        </tr>
693      </tbody>
694      <tr class="dynamic">
695        <th></th>
696        <td colspan="2"></td>
697      </tr>
698      </table>
699    </div>
700   
701    <div class="absolutefull filled" style="width: 550px; left: auto;">
702       
703          <img src="../../../images/plot_empty.png" id="preview" 
704            style="position: absolute; top: 5px; z-index: 1;">
705          <img src="../../../images/plot_select.png" id="overlay" 
706            style="position: absolute; top: 5px; z-index: 2;">
707    </div>
708  </div>
709  </form>
710 
711  <base:buttongroup subclass="dialogbuttons">
712    <base:button title="Preview" onclick="previewPlot()" 
713      image="plotter_preview.gif" tooltip="Generate a preview of the plot" 
714    />
715    <base:button title="View&hellip;" onclick="viewPlot()" 
716      image="plotter.gif" tooltip="View a fullsized version of the plot (in a popup)" 
717    />
718    <base:button title="Download&hellip;" onclick="downloadPlot()" 
719      image="download.gif"
720      tooltip="Downlad a fullsized version of the plot to your computer" 
721    />
722    <base:button title="Save as&hellip;" onclick="savePlotAs()" 
723      image="saveas.gif"
724      disabled="<%=!hasCreateFilePermission%>"
725      tooltip="<%=hasCreateFilePermission ? 
726        "Save a fullsized version of the plot on the BASE server" :
727        "You don't have permission to create files" %>" 
728    />
729    <base:button onclick="window.close()" title="Close" />
730  </base:buttongroup>
731 
732  </base:body>
733  </base:page>
734  <%
735}
736finally
737{
738  if (dc != null) dc.close();
739}
740%>
Note: See TracBrowser for help on using the repository browser.