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

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

References #1655: GUI improvements

  • Use relative font sizes (em and %) instead of pixel values. This should make it possible to use relative values for everything and we don't have to split up into size_*.css


  • Removed "valign" attribute from lots of tables.


  • Removed "wrap" attribute from lots of texarea fields.


  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 23.8 KB
Line 
1<%-- $Id: index.jsp 5905 2011-12-12 08:42:09Z 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['scatter'];
157    if (Main.trimString(frm.yFormula.value) == '')
158    {
159      alert("You must enter an expression for the Y axis");
160      frm.yFormula.focus();
161      return false;
162    }
163    else if (Main.trimString(frm.xFormula.value) == '')
164    {
165      alert("You must enter an expression for the X axis");
166      frm.xFormula.focus();
167      return false;
168    }
169    return true;
170  }
171  function validateHistogramPlot()
172  {
173    var frm = document.forms['histogram'];
174    var yAggregate = Forms.getCheckedRadio(frm.yAggregate).value;
175    if (Main.trimString(frm.xFormula.value) == '')
176    {
177      alert("You must enter an expression for the X axis");
178      frm.xFormula.focus();
179      return false;
180    }
181    else if (yAggregate != 'count' && Main.trimString(frm.yFormula.value) == '')
182    {
183      alert("You must enter an expression for the Y axis");
184      frm.yFormula.focus();
185      return false;
186    }
187    return true;
188  }
189
190  var plotType = 'scatter';
191  function getPlotType()
192  {
193    return plotType;
194  }
195
196  function switchTab(tabControlId, tabId)
197  {
198    if (tabId == 'scatter' || tabId == 'histogram')
199    {
200      plotType = tabId;
201    }
202    TabControl.setActiveTab(tabControlId, tabId);
203  }
204
205  function presetOnChange(list, formula, label)
206  {
207    var index = list.selectedIndex;
208    formula.value = list[index].value;
209    if (label && list[index].value != '') label.value = list[index].text;
210    list.selectedIndex = 0;
211  }
212 
213  function aggregateOnChange()
214  {
215    var frm = document.forms['histogram'];
216    var selected = Forms.getCheckedRadio(frm.yAggregate);
217    var isCount = selected.value == 'count';
218    frm.yFormula.disabled = isCount;
219    frm.yPresets.disabled = isCount;
220    frm.yLog.disabled = isCount;
221    for (var i = 0; i < frm.hiloAggregate.length; i++)
222    {
223      frm.hiloAggregate[i].disabled = isCount;
224    }
225    if (isCount)
226    {
227      Main.removeClass(frm.yFormula, 'required');
228      frm.yLabel.value = 'Count';
229    }
230    else
231    {
232      Main.addClass(frm.yFormula, 'required');
233      var yPreset = frm.yPresets[frm.yPresets.selectedIndex];
234      if (yPreset.value != '') frm.yLabel.value = yPreset.text;
235    }
236  }
237 
238  function annotationOnChange(list)
239  {
240    var frm = document.forms['plot'];
241    var selected = list[list.selectedIndex];
242    var value = selected.value && selected.value != '$' ? selected.text : '';
243    value = value.replace('\[A\] ', '');
244    frm.subTitle.value = value;
245   
246    var annotationFrm = document.forms['annotation'];
247    if (selected.value.substring(0, 1) == '$')
248    {
249      annotationFrm.annotationExp.disabled = true;
250    }
251    else
252    {
253      if (selected.value)
254      {
255        annotationFrm.annotationExp.value = selected.value;
256      }
257      annotationFrm.annotationExp.disabled = false;
258      annotationFrm.annotationExp.focus();
259    }
260  }
261 
262  function annotationExpressionOnChange()
263  {
264    var annotationFrm = document.forms['annotation'];
265    annotationFrm.annotationPresets.selectedIndex = annotationFrm.annotationPresets.length-1;
266  }
267 
268  function generatePlotUrl(fullSize)
269  {
270    if (validate())
271    {
272      var plotFrm = document.forms['plot'];
273      var url = 'plot?ID=<%=ID%>&bioassayset_id=<%=bioAssaySetId%>&bioassay_id=<%=bioAssayId%>';
274      url += '&title='+Main.encodeURI(plotFrm.title.value);
275      url += '&subTitle='+Main.encodeURI(plotFrm.subTitle.value);
276      if (fullSize)
277      {
278        url += '&width='+plotFrm.width.value;
279        url += '&height='+plotFrm.height.value;
280      }
281     
282      var filterFrm = document.forms['filter'];
283      if (filterFrm.filter.value != '')
284      {
285        url += '&filter='+Main.encodeURI(filterFrm.filter.value);
286      }
287     
288      var annotationFrm = document.forms['annotation'];
289      var annotation = '';
290      if (!annotationFrm.annotationExp.disabled)
291      {
292        if (annotationFrm.annotationExp.value)
293        {
294          annotation = '=' + annotationFrm.annotationExp.value;
295        }
296      }
297      else
298      {
299        annotation = annotationFrm.annotationPresets[annotationFrm.annotationPresets.selectedIndex].value.substring(1);
300      }
301      if (annotation)
302      {
303        url += '&annotation='+Main.encodeURI(annotation);
304      }
305
306      var plotType = getPlotType();
307      if (plotType == 'scatter')
308      {
309        var frm = document.forms['scatter'];
310        url += '&type=scatter';
311        url += '&x='+Main.encodeURI(frm.xFormula.value);
312        url += '&xLog='+(frm.xLog.checked ? 1 : 0);
313        url += '&xLabel='+Main.encodeURI(frm.xLabel.value);
314        url += '&y='+Main.encodeURI(frm.yFormula.value);
315        url += '&yLog='+(frm.yLog.checked ? 1 : 0);
316        url += '&yLabel='+Main.encodeURI(frm.yLabel.value);
317      }
318      else
319      {
320        var frm = document.forms['histogram'];
321        var yAggregate = Forms.getCheckedRadio(frm.yAggregate).value;
322        url += '&type=histogram';
323        url += '&x='+Main.encodeURI(frm.xFormula.value);
324        url += '&xLog='+(frm.xLog.checked ? 1 : 0);
325        url += '&xLabel='+Main.encodeURI(frm.xLabel.value);
326        url += '&binSize='+Main.encodeURI(frm.binSize.value);
327        url += '&yAggregate='+yAggregate;
328        if (yAggregate != 'count')
329        {
330          url += '&y='+Main.encodeURI(frm.yFormula.value);
331          url += '&yLog='+(frm.yLog.checked ? 1 : 0);
332          url += '&hiloAggregate='+Forms.getCheckedRadio(frm.hiloAggregate).value
333        }
334        url += '&yLabel='+Main.encodeURI(frm.yLabel.value);
335      }
336      return url;
337    }
338  }
339 
340  function openExpressionBuilder(title, frmName, inputName, formulaType)
341  {
342    if (!document.forms[frmName][inputName].disabled)
343    {
344      var restrictions = formulaType == '<%=Formula.Type.COLUMN_RESTRICTION.name()%>';
345      Main.expressionBuilder('<%=ID%>', title, frmName, inputName, formulaType, '<%=rdt.getId()%>', <%=rdt.getChannels()%>, restrictions, <%=bas.getId()%>);
346    }
347  }
348 
349  function previewPlot()
350  {
351    var url = generatePlotUrl(false);
352    if (url)
353    {
354      url += '&width=600&height=400';
355      var image = document.getElementById('preview');
356      if (image.src.indexOf('plot_select') == -1)
357      {
358        var background = document.getElementById('background');
359        background.src = image.src;
360      }
361      image.src = getRoot()+'images/plot_generating.gif';
362      // Otherwise, the browser refuses to display the 'plot_generating.gif' while we are waiting.
363      //setTimeout('changePreviewImage()', 100);
364      image.realImg = new Image();
365      image.realImg.onload = changePreviewImage;
366      image.realImg.src = url;
367    }
368  }
369 
370  function changePreviewImage()
371  {
372    var image = document.getElementById('preview');
373    image.src = image.realImg.src;
374    image.realImg = null;
375  }
376 
377  function viewPlot()
378  {
379    var url = generatePlotUrl(true);
380    if (url)
381    {
382      var frm = document.forms['plot'];
383      var width = parseInt(frm.width.value);
384      var height = parseInt(frm.height.value);
385      if (!width || width < 600) width = 600;
386      if (!height || height < 400) height = 400;
387      Main.openPopup('view.jsp?ID=<%=ID%>&title='+Main.encodeURI(frm.title.value), 'ViewPlot', width+50, height+100);
388    }
389  }
390 
391  function downloadPlot()
392  {
393    var url = generatePlotUrl(true);
394    if (url)
395    {
396      Main.openPopup('download.jsp?ID=<%=ID%>', 'DownloadPlot', 500, 260);
397    }
398  }
399 
400  function savePlotAs()
401  {
402    var url = generatePlotUrl(true);
403    if (url)
404    {
405      Main.openPopup('save_as.jsp?ID=<%=ID%>', 'SavePlotAs', 500, 260);
406    }
407  }
408 
409  function init()
410  {
411    aggregateOnChange();
412  }
413  </script>
414  </base:head>
415  <base:body onload="init()">
416 
417  <h3 class="docked"><%=title%> <base:help tabcontrol="plotType" /></h3>
418  <div class="boxed">
419 
420  <table border="0" cellspacing="0" cellpadding="2" width="100%">
421  <tr >
422    <td>
423    <form name="plot">
424    <table class="form">
425    <tr>
426      <td class="prompt">Plot title</td>
427      <td colspan="2"><input type="text" class="text" size="30" maxlength="255" name="title" 
428        value="<%=HTML.encodeTags(ba == null ? bas.getName() : ba.getName())%>"></td>
429    </tr>
430    <tr>
431      <td class="prompt">Subtitle</td>
432      <td colspan="2"><input type="text" class="text" size="30" maxlength="255" name="subTitle" 
433        value=""></td>
434    </tr>
435    <tr>
436      <td class="prompt">Width</td>
437      <td><input type="text" class="text" size="12" maxlength="10" name="width" 
438        value="800" onkeypress="return Numbers.integerOnly(event)"></td>
439      <td rowspan="2">(not used by preview)</td>
440    </tr>
441    <tr>
442      <td class="prompt">Height</td>
443      <td><input type="text" class="text" size="12" maxlength="10" name="height" 
444        value="600" onkeypress="return Numbers.integerOnly(event)"></td>
445    </tr>
446    </table>
447    </form>
448    <p>
449
450    <t:tabcontrol id="plotType" style="<%="width: "+(int)(scale*340)+"px;"%>" contentstyle="<%="height: "+(int)(scale*340)+"px;"%>"
451      switch="switchTab">
452    <t:tab id="scatter" title="Scatter plot" helpid="plotter.scatterplot"
453      tooltip="Create a scatter plot">
454      <form name="scatter">
455      <table border="0" cellspacing="0" cellpadding="2" class="form">
456      <tr>
457        <td class="prompt" colspan="3">Y-axis</td>
458      </tr>
459      <tr>
460        <td>&nbsp;Presets</td>
461        <td colspan="2">
462        <select name="yPresets" style="width: 20em;"
463          onchange="presetOnChange(this, this.form.yFormula, this.form.yLabel)" 
464          >
465          <option value="">- select from list or enter formula below -
466          <%=formulaOptions.toString()%>
467        </select>
468        </td>
469      </tr>
470      <tr>
471        <td>&nbsp;Expression</td>
472        <td><input type="text" class="text required" size="30" maxlength="255" name="yFormula"></td>
473        <td>
474          <base:button
475            title=""
476            image="expression_builder.gif"
477            tooltip="Use the Expression builder"
478            onclick="openExpressionBuilder('Y-axis expression', 'scatter', 'yFormula', 'COLUMN_EXPRESSION')"
479          />
480        </td>
481      </tr>
482      <tr>
483        <td>&nbsp;Label</td>
484        <td colspan="2"><input type="text" class="text" size="30" maxlength="255" name="yLabel"></td>
485      </tr>
486      <tr>
487        <td>&nbsp;<label for="yLogScatter">Log scale</label></td>
488        <td colspan="2"><input type="checkbox" name="yLog" id="yLogScatter" value="1"></td>
489      </tr>
490      <tr>
491        <td class="prompt" colspan="3">X-axis</td>
492      </tr>
493      <tr>
494        <td>Presets</td>
495        <td colspan="2">
496        <select name="xPresets" style="width: 20em;"
497          onchange="presetOnChange(this, this.form.xFormula, this.form.xLabel)" 
498          >
499          <option value="">- select from list or enter formula below -
500          <%=formulaOptions.toString()%>
501        </select>
502        </td>
503      </tr>
504      <tr>
505        <td>Expression</td>
506        <td><input type="text" class="text required" size="30" maxlength="255" name="xFormula"></td>
507        <td>
508          <base:button
509            title=""
510            image="expression_builder.gif"
511            tooltip="Use the Expression builder"
512            onclick="openExpressionBuilder('X-axis expression', 'scatter', 'xFormula', 'COLUMN_EXPRESSION')"
513          />
514        </td>
515      </tr>
516      <tr>
517        <td>Label</td>
518        <td colspan="2"><input type="text" class="text" size="30" maxlength="255" name="xLabel"></td>
519      </tr>
520      <tr>
521        <td><label for="xLogScatter">Log scale</label></td>
522        <td colspan="2"><input type="checkbox" name="xLog" id="xLogScatter" value="1"></td>
523      </tr>
524      </table>
525      </form>
526    </t:tab>
527
528    <t:tab id="histogram" title="Histogram plot" helpid="plotter.histogram"
529      tooltip="Create a histogram plot">
530      <form name="histogram">
531      <table border="0" cellspacing="0" cellpadding="2" class="form">
532      <tr>
533        <td class="prompt" >Y-axis</td>
534        <td colspan="2">
535          <input type="radio" name="yAggregate" id="yAggregateCount" value="count" checked 
536            onchange="aggregateOnChange()"><label for="yAggregateCount">Count</label>
537          <input type="radio" name="yAggregate" id="yAggregateMean" value="mean"
538            onchange="aggregateOnChange()"><label for="yAggregateMean">Mean</label>
539        </td>
540      </tr>
541      <tr>
542        <td>&nbsp;Hi-lo</td>
543        <td colspan="2">
544          <input type="radio" name="hiloAggregate" id="hiloAggregateNone" value="" checked
545            ><label for="hiloAggregateNone">None</label>
546          <input type="radio" name="hiloAggregate" id="hiloAggregateMinMax" value="hilomaxmin"
547            ><label for="hiloAggregateMinMax">Min/Max</label>
548          <input type="radio" name="hiloAggregate" id="hiloAggregateStdev" value="hilostdev"
549            ><label for="hiloAggregateStdev">Stdev</label>
550        </td>
551      </tr>
552      <tr>
553        <td>&nbsp;Presets</td>
554        <td colspan="2">
555        <select name="yPresets" style="width: 20em;"
556          onchange="presetOnChange(this, this.form.yFormula, this.form.yLabel)" 
557          disabled
558          >
559          <option value="">- select from list or enter formula below -
560          <%=formulaOptions.toString()%>
561        </select>
562        </td>
563      </tr>
564      <tr>
565        <td>&nbsp;Expression</td>
566        <td><input type="text" class="text" size="30" maxlength="255" name="yFormula" disabled></td>
567        <td>
568          <base:button
569            title=""
570            image="expression_builder.gif"
571            tooltip="Use the Expression builder"
572            onclick="openExpressionBuilder('Y-axis expression', 'histogram', 'yFormula', 'COLUMN_EXPRESSION')"
573          />
574        </td>
575      </tr>
576
577      <tr>
578        <td>&nbsp;Label</td>
579        <td colspan="2"><input type="text" class="text" size="30" maxlength="255" 
580          name="yLabel" value="Count"></td>
581      </tr>
582      <tr>
583        <td>&nbsp;<label for="yLogHist">Log scale</label></td>
584        <td colspan="2"><input type="checkbox" name="yLog" id="yLogHist" value="1"></td>
585      </tr>
586      <tr>
587        <td class="prompt" colspan="3">X-axis</td>
588      </tr>
589      <tr>
590        <td>Presets</td>
591        <td colspan="2">
592        <select name="xPresets"  style="width: 20em;"
593          onchange="presetOnChange(this, this.form.xFormula, this.form.xLabel)" 
594          >
595          <option value="">- select from list or enter formula below -
596          <%=formulaOptions.toString()%>
597        </select>
598        </td>
599      </tr>
600      <tr>
601        <td>Expression</td>
602        <td><input type="text" class="text required" size="30" 
603          maxlength="255" name="xFormula"></td>
604        <td>
605          <base:button
606            title=""
607            image="expression_builder.gif"
608            tooltip="Use the Expression builder"
609            onclick="openExpressionBuilder('X-axis expression', 'histogram', 'xFormula', 'COLUMN_EXPRESSION')"
610          />
611        </td>
612      </tr>
613      <tr>
614        <td>Label</td>
615        <td colspan="2"><input type="text" class="text" size="30" maxlength="255" name="xLabel"></td>
616      </tr>
617      <tr>
618        <td><label for="xLogHist">Log scale</label></td>
619        <td colspan="2"><input type="checkbox" name="xLog" id="xLogHist" value="1"></td>
620      </tr>
621      <tr>
622        <td>Bin size</td>
623        <td colspan="2"><input type="text" class="text" name="binSize" value="1"></td>
624      </tr>
625      </table>
626      </form>
627    </t:tab>
628   
629    <t:tab id="filter" title="Filter" helpid="plotter.filter"
630      tooltip="Specify a filter for spots that should be included in the plot">
631      <form name="filter">
632      <table border="0" cellspacing="0" cellpadding="2" class="form">
633      <tr>
634        <td class="prompt" colspan="2">Filter</td>
635      </tr>
636      <tr>
637        <td>&nbsp;Presets</td>
638        <td colspan="2">
639        <select name="filterPresets" style="width: 20em;"
640          onchange="presetOnChange(this, this.form.filter, null)" 
641          >
642          <option value="">- select from list or enter formula below -
643          <%=filterOptions.toString()%>
644        </select>
645        </td>
646      </tr>
647      <tr>
648        <td>&nbsp;Expression</td>
649        <td><input type="text" class="text" size="30" maxlength="255" name="filter"></td>
650        <td>
651          <base:button
652            title=""
653            image="expression_builder.gif"
654            tooltip="Use the Expression builder"
655            onclick="openExpressionBuilder('Filter expression', 'filter', 'filter', 'COLUMN_RESTRICTION')"
656          />
657        </td>
658      </tr>
659      </table>
660      </form>
661    </t:tab>
662   
663    <t:tab id="annotation" title="Annotation" helpid="plotter.annotation"
664      tooltip="Specify a property or expression for sub-grouping the plotted values">
665      <form name="annotation">
666     
667      <table border="0" cellspacing="0" cellpadding="2" class="form">
668      <tr>
669        <td class="prompt" colspan="2">Annotation</td>
670      </tr>
671      <tr>
672        <td>&nbsp;Presets</td>
673        <td colspan="2">
674        <select name="annotationPresets" onchange="annotationOnChange(this)">
675          <option value="$">- none -
676          <%
677          if (ba == null)
678          {
679            %>
680            <option value="$bioassay">Bioassay
681            <option value="$spots">Spots
682            <option value="$arrayDesign.name">Array design
683            <option value="$software.name">Software
684            <option value="$protocol.name">Protocol
685            <option value="$scan.scanner.name">Scanner
686            <option value="$scan.protocol.name">Scanning protocol
687            <option value="$scan.hybridization.protocol.name">Hybridization protocol
688            <option value="$scan.hybridization.creationEvent.eventDate">Hybridization date
689            <option value="" disabled>- annotations -
690            <%
691            for (AnnotationType at : experimentalFactors)
692            {
693              %>
694              <option value="$<%=at.getId()%>">[A] <%=HTML.encodeTags(at.getName())%>
695              <%
696            }
697          }
698          %>
699          <option value="" disabled>- expressions -
700          <%=filterOptions.toString()%>
701          <option value="">Other...
702        </select>
703        </td>
704      </tr>
705      <tr>
706        <td>&nbsp;Expression</td>
707        <td><input type="text" class="text" size="30" maxlength="255" name="annotationExp"
708          onchange="annotationExpressionOnChange()" disabled></td>
709        <td>
710          <base:button
711            title=""
712            image="expression_builder.gif"
713            tooltip="Use the Expression builder"
714            onclick="openExpressionBuilder('Annotation filter', 'annotation', 'annotationExp', 'COLUMN_RESTRICTION')"
715          />
716        </td>
717      </tr>
718      </table>
719      </form>
720    </t:tab> 
721   
722    </t:tabcontrol>
723    </td>
724    <td xstyle="width: 600px;">
725      <div style="position: relative; top: 0px; left: 0px; width: 600px; height: 400px; padding-bottom: 2px;">
726      <img src="../../../images/plot_empty.png" id="background" 
727        style="position: absolute; top: 0px; left: 0px; z-index: 1; border: 1px solid #999999;">
728      <img src="../../../images/plot_select.gif" id="preview" 
729        style="position: relative; top: 0px; left: 0px; z-index: 2; border: 1px solid #999999;">
730      </div>
731    </td>
732  </tr>
733  </table>
734  </div>
735    <p>
736    <div align="center">
737    <base:buttongroup>
738      <base:button title="Preview" onclick="previewPlot()" 
739        image="plotter_preview.gif" tooltip="Generate a preview of the plot" 
740      />
741      <base:button title="View&hellip;" onclick="viewPlot()" 
742        image="plotter.gif" tooltip="View a fullsized version of the plot (in a popup)" 
743      />
744      <base:button title="Download&hellip;" onclick="downloadPlot()" 
745        image="download.gif"
746        tooltip="Downlad a fullsized version of the plot to you computer" 
747      />
748      <base:button title="Save as&hellip;" onclick="savePlotAs()" 
749        image="<%=hasCreateFilePermission ? "saveas.gif" : "saveas_disabled.gif"%>"
750        disabled="<%=!hasCreateFilePermission%>"
751        tooltip="<%=hasCreateFilePermission ? 
752          "Save a fullsized version of the plot on the BASE server" :
753          "You don't have permission to create files" %>" 
754      />
755      <base:button onclick="window.close()" title="Close" />
756    </base:buttongroup>
757    </div>
758 
759  </base:body>
760  </base:page>
761  <%
762}
763finally
764{
765  if (dc != null) dc.close();
766}
767%>
Note: See TracBrowser for help on using the repository browser.