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

Last change on this file since 4511 was 4511, checked in by Jari Häkkinen, 13 years ago

Addresses #1106. Missed to change reference wherefrom retrive GPLv3 license text. And some other changes.

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