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

Last change on this file since 2993 was 2993, checked in by Nicklas Nordborg, 17 years ago

Fixes #215: Incorrect use of DynamicSpotQuery? in table view, plot function, filter function, etc.

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