www/views/experiments/explorer/view/plotter.jsp

Code
Comments
Other
Rev Date Author Line
5114 02 Oct 09 nicklas 1 <%-- $Id$
5114 02 Oct 09 nicklas 2   ------------------------------------------------------------------
5114 02 Oct 09 nicklas 3   BioArray Software Environment (BASE) - http:// base.thep.lu.se/
5114 02 Oct 09 nicklas 4
5114 02 Oct 09 nicklas 5   This file is part of BASE - BioArray Software Environment.
5114 02 Oct 09 nicklas 6   Available at http://base.thep.lu.se/
5114 02 Oct 09 nicklas 7
5114 02 Oct 09 nicklas 8   BASE is free software; you can redistribute it and/or
5114 02 Oct 09 nicklas 9   modify it under the terms of the GNU General Public License
5114 02 Oct 09 nicklas 10   as published by the Free Software Foundation; either version 3
5114 02 Oct 09 nicklas 11   of the License, or (at your option) any later version.
5114 02 Oct 09 nicklas 12
5114 02 Oct 09 nicklas 13   BASE is distributed in the hope that it will be useful,
5114 02 Oct 09 nicklas 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
5114 02 Oct 09 nicklas 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5114 02 Oct 09 nicklas 16   GNU General Public License for more details.
5114 02 Oct 09 nicklas 17
5114 02 Oct 09 nicklas 18   You should have received a copy of the GNU General Public License
5114 02 Oct 09 nicklas 19   along with BASE. If not, see <http://www.gnu.org/licenses/>.
5114 02 Oct 09 nicklas 20   ------------------------------------------------------------------
5114 02 Oct 09 nicklas 21
5114 02 Oct 09 nicklas 22   @author Nicklas
5114 02 Oct 09 nicklas 23   @version 2.0
5114 02 Oct 09 nicklas 24 --%>
5426 24 Sep 10 nicklas 25 <%@ page pageEncoding="UTF-8" session="false"
5114 02 Oct 09 nicklas 26   import="net.sf.basedb.core.SessionControl"
5114 02 Oct 09 nicklas 27   import="net.sf.basedb.core.DbControl"
5114 02 Oct 09 nicklas 28   import="net.sf.basedb.core.Experiment"
5114 02 Oct 09 nicklas 29   import="net.sf.basedb.core.BioAssaySet"
5114 02 Oct 09 nicklas 30   import="net.sf.basedb.core.BioAssay"
5114 02 Oct 09 nicklas 31   import="net.sf.basedb.core.RawDataType"
5114 02 Oct 09 nicklas 32   import="net.sf.basedb.core.RawDataProperty"
5114 02 Oct 09 nicklas 33   import="net.sf.basedb.core.Formula"
5114 02 Oct 09 nicklas 34   import="net.sf.basedb.core.IntensityTransform"
5114 02 Oct 09 nicklas 35   import="net.sf.basedb.core.AnnotationType"
5114 02 Oct 09 nicklas 36   import="net.sf.basedb.core.ItemQuery"
5114 02 Oct 09 nicklas 37   import="net.sf.basedb.core.ItemResultList"
5114 02 Oct 09 nicklas 38   import="net.sf.basedb.core.Include"
5114 02 Oct 09 nicklas 39   import="net.sf.basedb.core.Permission"
5114 02 Oct 09 nicklas 40   import="net.sf.basedb.core.Item"
5142 19 Oct 09 nicklas 41   import="net.sf.basedb.core.data.ReporterData"
5114 02 Oct 09 nicklas 42   import="net.sf.basedb.core.query.Orders"
5114 02 Oct 09 nicklas 43   import="net.sf.basedb.core.query.Hql"
5114 02 Oct 09 nicklas 44   import="net.sf.basedb.core.query.Restrictions"
5114 02 Oct 09 nicklas 45   import="net.sf.basedb.core.query.Restriction"
5114 02 Oct 09 nicklas 46   import="net.sf.basedb.core.query.Expressions"
5114 02 Oct 09 nicklas 47   import="net.sf.basedb.clients.web.ExperimentExplorer"
5114 02 Oct 09 nicklas 48   import="net.sf.basedb.clients.web.Base"
5114 02 Oct 09 nicklas 49   import="net.sf.basedb.clients.web.DynamicUtil"
5114 02 Oct 09 nicklas 50   import="net.sf.basedb.clients.web.util.HTML"
5114 02 Oct 09 nicklas 51   import="net.sf.basedb.util.Values"
5114 02 Oct 09 nicklas 52   import="net.sf.basedb.clients.web.WebException"
5114 02 Oct 09 nicklas 53   import="net.sf.basedb.clients.web.taglib.table.TableColumn"
5114 02 Oct 09 nicklas 54   import="java.util.List"
5114 02 Oct 09 nicklas 55   import="java.util.LinkedList"
5114 02 Oct 09 nicklas 56 %>
5114 02 Oct 09 nicklas 57 <%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
5114 02 Oct 09 nicklas 58 <%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
5114 02 Oct 09 nicklas 59 <%!
6315 06 Sep 13 nicklas 60 private static void addFormulaOption(StringBuilder options, String formula, String title, String description, Formula.AverageMethod avgMethod)
5114 02 Oct 09 nicklas 61 {
5114 02 Oct 09 nicklas 62   options.append("<option value=\"").append(HTML.encodeTags(formula)).append("\"");
5114 02 Oct 09 nicklas 63   options.append(" title=\"").append(HTML.encodeTags(description)).append("\"");
6315 06 Sep 13 nicklas 64   options.append(" data-average-method=\"").append(avgMethod.name()).append("\"");
5114 02 Oct 09 nicklas 65   options.append(">").append(HTML.encodeTags(title)).append("\n");
5114 02 Oct 09 nicklas 66 }
5114 02 Oct 09 nicklas 67 %>
5114 02 Oct 09 nicklas 68 <%
5114 02 Oct 09 nicklas 69 final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
5114 02 Oct 09 nicklas 70 final float scale = Base.getScale(sc);
5114 02 Oct 09 nicklas 71 final String ID = sc.getId();
7954 12 May 21 nicklas 72 final DbControl dc = sc.newDbControl(":Experiment explorer - Plotter");
5114 02 Oct 09 nicklas 73 try
5114 02 Oct 09 nicklas 74 {
5114 02 Oct 09 nicklas 75   final int bioAssaySetId = Values.getInt(request.getParameter("bioAssaySetId"));
5114 02 Oct 09 nicklas 76   final int reporterIndex = Values.getInt(request.getParameter("reporterIndex"));
5114 02 Oct 09 nicklas 77   final int positionIndex = Values.getInt(request.getParameter("positionIndex"));
5149 20 Oct 09 nicklas 78   final String plotType = Values.getString(request.getParameter("type"), "assay");
5138 16 Oct 09 nicklas 79   final int annotationTypeId = Values.getInt(request.getParameter("annotationTypeId"));
5114 02 Oct 09 nicklas 80   final boolean needAverageMethod = positionIndex == ExperimentExplorer.SPOT_AVG;
5114 02 Oct 09 nicklas 81   
5138 16 Oct 09 nicklas 82   final BioAssaySet bas = BioAssaySet.getById(dc, bioAssaySetId);
5138 16 Oct 09 nicklas 83   final RawDataType rdt = bas.getRawDataType();
5138 16 Oct 09 nicklas 84   final Experiment experiment = bas.getExperiment();
5138 16 Oct 09 nicklas 85   final int maxRawMappings = bas.getMaxRawMappingsForSpot();
5138 16 Oct 09 nicklas 86   final IntensityTransform transform = bas.getIntensityTransform();
5138 16 Oct 09 nicklas 87   final ExperimentExplorer explorer = ExperimentExplorer.getExplorer(bas);
5142 19 Oct 09 nicklas 88   final ReporterData reporter = explorer.getReporter(dc, reporterIndex);
5138 16 Oct 09 nicklas 89   final List<AnnotationType> annotationTypes = explorer.getAnnotationTypes(dc, true);
5114 02 Oct 09 nicklas 90   
5114 02 Oct 09 nicklas 91   List<TableColumn> formulas = new LinkedList<TableColumn>();
5114 02 Oct 09 nicklas 92   DynamicUtil.addSpotColumns(formulas, dc, rdt.getChannels(), transform);
5114 02 Oct 09 nicklas 93   DynamicUtil.addFormulaColumns(formulas, dc, rdt, Formula.Type.COLUMN_EXPRESSION, 
5114 02 Oct 09 nicklas 94       transform, "", "", maxRawMappings == 1);
5114 02 Oct 09 nicklas 95   DynamicUtil.addExtraColumns(formulas, dc, bas, "ev", "#", "[Xtra] ");
5114 02 Oct 09 nicklas 96   if (maxRawMappings == 1)
5114 02 Oct 09 nicklas 97   {
5114 02 Oct 09 nicklas 98     DynamicUtil.addRawDataColumns(formulas, dc, rdt, "", "", "[Raw] ");
5114 02 Oct 09 nicklas 99   }
5114 02 Oct 09 nicklas 100   
5114 02 Oct 09 nicklas 101   StringBuilder formulaOptions = new StringBuilder();
5114 02 Oct 09 nicklas 102   for (TableColumn tc : formulas)
5114 02 Oct 09 nicklas 103   {
5114 02 Oct 09 nicklas 104     if (tc.getJepExpression() != null && tc.getDatatype().isNumerical())
5114 02 Oct 09 nicklas 105     {
5114 02 Oct 09 nicklas 106       if (!needAverageMethod || tc.getAverageMethod() != Formula.AverageMethod.NONE)
5114 02 Oct 09 nicklas 107       {
5114 02 Oct 09 nicklas 108         String jepExpression = tc.getJepExpression();
6315 06 Sep 13 nicklas 109         addFormulaOption(formulaOptions, jepExpression, tc.getTitle(), tc.getDescription(), tc.getAverageMethod());
5114 02 Oct 09 nicklas 110       }
5114 02 Oct 09 nicklas 111     }
5114 02 Oct 09 nicklas 112   }
5114 02 Oct 09 nicklas 113   
5114 02 Oct 09 nicklas 114   String title = HTML.encodeTags("Plot " + bas.getName());
5114 02 Oct 09 nicklas 115   final boolean hasCreateFilePermission = sc.hasPermission(Permission.CREATE, Item.FILE);
5114 02 Oct 09 nicklas 116   %>
5114 02 Oct 09 nicklas 117   <base:page type="popup" title="<%=title%>">
6315 06 Sep 13 nicklas 118   <base:head scripts="tabcontrol-2.js,~plotter.js" styles="tabcontrol.css" />
6315 06 Sep 13 nicklas 119   <base:body>
5924 13 Jan 12 nicklas 120   <h1><%=title%> <base:help helpid="explorer.plotter" /></h1>
6315 06 Sep 13 nicklas 121   <div id="page-data" class="datacontainer"
6315 06 Sep 13 nicklas 122     data-bioassayset="<%=bioAssaySetId %>"
6315 06 Sep 13 nicklas 123     data-reporter-index="<%=reporterIndex %>"
6315 06 Sep 13 nicklas 124     data-position-index="<%=positionIndex %>"
6315 06 Sep 13 nicklas 125   ></div>
5924 13 Jan 12 nicklas 126   <form name="plot">
5924 13 Jan 12 nicklas 127   <div class="content bottomborder">
5924 13 Jan 12 nicklas 128     <div class="absolutefull rightborder" style="right: 550px;">
5114 02 Oct 09 nicklas 129   
5924 13 Jan 12 nicklas 130       <table class="fullform input100 smaller">
5924 13 Jan 12 nicklas 131       <tbody>
5114 02 Oct 09 nicklas 132       <tr>
5924 13 Jan 12 nicklas 133         <th>Plot title</th>
5924 13 Jan 12 nicklas 134         <td colspan="2"><input type="text" class="text" maxlength="255" name="title" 
5924 13 Jan 12 nicklas 135           value="<%=HTML.encodeTags(bas.getName())%>"></td>
5149 20 Oct 09 nicklas 136       </tr>
5149 20 Oct 09 nicklas 137       <tr>
5924 13 Jan 12 nicklas 138         <th class="subprompt">Subtitle</th>
5924 13 Jan 12 nicklas 139         <td colspan="2"><input type="text" class="text" maxlength="255" name="subTitle" 
5924 13 Jan 12 nicklas 140           value="<%=HTML.encodeTags(reporter.getName())%>"></td>
5114 02 Oct 09 nicklas 141       </tr>
5114 02 Oct 09 nicklas 142         <tr>
5924 13 Jan 12 nicklas 143           <th>Width</th>
6315 06 Sep 13 nicklas 144           <td colspan="2"><input type="text" class="text" 
6315 06 Sep 13 nicklas 145             name="width" id="width"
6315 06 Sep 13 nicklas 146             style="width: 10em;" maxlength="10" value="900"
6315 06 Sep 13 nicklas 147             > (not used by preview)</td>
5924 13 Jan 12 nicklas 148         </tr>
5924 13 Jan 12 nicklas 149         <tr>
5924 13 Jan 12 nicklas 150           <th>Height</th>
6315 06 Sep 13 nicklas 151           <td colspan="2"><input type="text" class="text" 
6315 06 Sep 13 nicklas 152             name="height" id="height"
6315 06 Sep 13 nicklas 153             style="width: 10em;" maxlength="10" value="600"></td>
5924 13 Jan 12 nicklas 154         </tr>
5924 13 Jan 12 nicklas 155         <tr>
5924 13 Jan 12 nicklas 156           <th class="subprompt"></th>
5924 13 Jan 12 nicklas 157           <td colspan="2"></td>
5924 13 Jan 12 nicklas 158         </tr>
5924 13 Jan 12 nicklas 159       </tbody>
5924 13 Jan 12 nicklas 160       
5924 13 Jan 12 nicklas 161       <tbody class="simplesection">
5924 13 Jan 12 nicklas 162         <tr>
5924 13 Jan 12 nicklas 163           <th>Y-axis</th>
5114 02 Oct 09 nicklas 164           <td>
6315 06 Sep 13 nicklas 165           <select name="yPresets" id="yPresets" style="width: 25em;"
6315 06 Sep 13 nicklas 166             data-formula-id="yFormula"
6315 06 Sep 13 nicklas 167             data-label-id="yLabel"
5924 13 Jan 12 nicklas 168             >
5924 13 Jan 12 nicklas 169             <option value="">- select from list or enter formula below -
5924 13 Jan 12 nicklas 170             <%=formulaOptions.toString()%>
5924 13 Jan 12 nicklas 171           </select>
5924 13 Jan 12 nicklas 172           </td>
5924 13 Jan 12 nicklas 173           <td></td>
5924 13 Jan 12 nicklas 174         </tr>
5924 13 Jan 12 nicklas 175         <tr>
5924 13 Jan 12 nicklas 176           <th class="subprompt">Expression</th>
6315 06 Sep 13 nicklas 177           <td><input type="text" class="text required" maxlength="255" name="yFormula" id="yFormula"></td>
5924 13 Jan 12 nicklas 178           <td>
5924 13 Jan 12 nicklas 179             <base:icon
6315 06 Sep 13 nicklas 180               id="btnExpressionBuilderY"
6315 06 Sep 13 nicklas 181               data-formula-id="yFormula"
6315 06 Sep 13 nicklas 182               data-title="Y-axis expression"
6315 06 Sep 13 nicklas 183               data-formula-type="COLUMN_EXPRESSION"
6315 06 Sep 13 nicklas 184               data-raw-data-type="<%=rdt.getId() %>"
6315 06 Sep 13 nicklas 185               data-channels="<%=rdt.getChannels() %>"
6315 06 Sep 13 nicklas 186               data-bioassayset="<%=bioAssaySetId %>"
5946 03 Feb 12 nicklas 187               image="expression_builder.png"
5924 13 Jan 12 nicklas 188               tooltip="Use the Expression builder"
5924 13 Jan 12 nicklas 189             />
5924 13 Jan 12 nicklas 190           </td>
5924 13 Jan 12 nicklas 191         </tr>
5924 13 Jan 12 nicklas 192         <tr>
5924 13 Jan 12 nicklas 193           <th class="subprompt">Label</th>
6315 06 Sep 13 nicklas 194           <td><input type="text" class="text" maxlength="255" name="yLabel" id="yLabel"></td>
5924 13 Jan 12 nicklas 195           <td></td>
5924 13 Jan 12 nicklas 196         </tr>
5924 13 Jan 12 nicklas 197         <tr>
5924 13 Jan 12 nicklas 198           <th class="subprompt"><label for="yLog">Log scale</label></th>
5924 13 Jan 12 nicklas 199           <td><input type="checkbox" name="yLog" id="yLog" value="1"></td>
5924 13 Jan 12 nicklas 200           <td></td>
5924 13 Jan 12 nicklas 201         </tr>
5924 13 Jan 12 nicklas 202         <%
5924 13 Jan 12 nicklas 203         if (positionIndex == ExperimentExplorer.SPOT_AVG)
5924 13 Jan 12 nicklas 204         {
5924 13 Jan 12 nicklas 205           %>
5924 13 Jan 12 nicklas 206           <tr>
6143 20 Sep 12 nicklas 207             <th class="subprompt">Average method</th>
5924 13 Jan 12 nicklas 208             <td>
5924 13 Jan 12 nicklas 209               <select name="averageMethod">
5924 13 Jan 12 nicklas 210               <%
5924 13 Jan 12 nicklas 211               for (Formula.AverageMethod method : Formula.AverageMethod.values())
5114 02 Oct 09 nicklas 212               {
5924 13 Jan 12 nicklas 213                 if (method != Formula.AverageMethod.NONE)
5924 13 Jan 12 nicklas 214                 {
5924 13 Jan 12 nicklas 215                   %>
5924 13 Jan 12 nicklas 216                   <option value="<%=method.name()%>"><%=method.toString()%></option>
5924 13 Jan 12 nicklas 217                   <%
5924 13 Jan 12 nicklas 218                 }
5114 02 Oct 09 nicklas 219               }
5924 13 Jan 12 nicklas 220               %>
5924 13 Jan 12 nicklas 221               </select>
5924 13 Jan 12 nicklas 222             </td>
5924 13 Jan 12 nicklas 223             <td></td>
5924 13 Jan 12 nicklas 224           </tr>
5924 13 Jan 12 nicklas 225           <%  
5924 13 Jan 12 nicklas 226         }
5138 16 Oct 09 nicklas 227         %>
5138 16 Oct 09 nicklas 228         <tr>
5924 13 Jan 12 nicklas 229           <th>X-axis</th>
5138 16 Oct 09 nicklas 230           <td>
6315 06 Sep 13 nicklas 231             <input type="radio" name="plotType" value="assay" 
5924 13 Jan 12 nicklas 232               id="plotTypeAssay" <%=plotType.equals("assay") ? "checked" : ""%>
5924 13 Jan 12 nicklas 233               ><label for="plotTypeAssay"
5924 13 Jan 12 nicklas 234               title="Creates a line/bar plot with bioassays along the x axis">Bioassays</label>
6315 06 Sep 13 nicklas 235             <input type="radio" name="plotType" value="annotation" 
5924 13 Jan 12 nicklas 236               id="plotTypeAnnotation" <%=plotType.equals("annotation") ? "checked" : ""%>
5924 13 Jan 12 nicklas 237               ><label for="plotTypeAnnotation" 
5924 13 Jan 12 nicklas 238               title="Creates a box plot with annotation values along the x axis">Annotation</label>
5924 13 Jan 12 nicklas 239           </td>
5924 13 Jan 12 nicklas 240           <td></td>
5924 13 Jan 12 nicklas 241         </tr>
5924 13 Jan 12 nicklas 242         <tr>
6143 20 Sep 12 nicklas 243           <th class="subprompt">Annotation</th>
5924 13 Jan 12 nicklas 244           <td>
5924 13 Jan 12 nicklas 245             <select name="annotationTypeId" class="selectionlist">
5138 16 Oct 09 nicklas 246             <%
5924 13 Jan 12 nicklas 247             for (AnnotationType at : annotationTypes)
5138 16 Oct 09 nicklas 248             {
5924 13 Jan 12 nicklas 249               String selected = at.getId() == annotationTypeId ? "selected" : "";
5924 13 Jan 12 nicklas 250               %>
5924 13 Jan 12 nicklas 251               <option value="<%=at.getId()%>" <%=selected%>><%=HTML.encodeTags(at.getName())%>
5924 13 Jan 12 nicklas 252               <%
5138 16 Oct 09 nicklas 253             }
5138 16 Oct 09 nicklas 254             %>
5138 16 Oct 09 nicklas 255             </select>
5138 16 Oct 09 nicklas 256           </td>
5924 13 Jan 12 nicklas 257           <td></td>
5924 13 Jan 12 nicklas 258         </tr>
5924 13 Jan 12 nicklas 259         <tr>
5924 13 Jan 12 nicklas 260           <th class="subprompt"><label for="hideXLabels">No labels</label></th>
5924 13 Jan 12 nicklas 261           <td><input type="checkbox" name="hideXLabels" id="hideXLabels" value="1"></td>
5924 13 Jan 12 nicklas 262           <td></td>
5924 13 Jan 12 nicklas 263         </tr>
5924 13 Jan 12 nicklas 264         <tr>
5924 13 Jan 12 nicklas 265           <th>Plot type</th>
5924 13 Jan 12 nicklas 266           <td>
5924 13 Jan 12 nicklas 267             <select name="subtype">
5924 13 Jan 12 nicklas 268             <option value="line">Line plot</option>
5924 13 Jan 12 nicklas 269             <option value="bar">Bar plot</option>
5924 13 Jan 12 nicklas 270             </select>
5924 13 Jan 12 nicklas 271           <td></td>
5924 13 Jan 12 nicklas 272         </tr>
5924 13 Jan 12 nicklas 273       </tbody>
5924 13 Jan 12 nicklas 274
5924 13 Jan 12 nicklas 275       <tr class="dynamic">
5924 13 Jan 12 nicklas 276         <th></th>
5924 13 Jan 12 nicklas 277         <td colspan="2"></td>
5138 16 Oct 09 nicklas 278       </tr>
5138 16 Oct 09 nicklas 279       </table>
5924 13 Jan 12 nicklas 280
5114 02 Oct 09 nicklas 281     </div>
6612 21 Nov 14 nicklas 282     <div class="absolutefull bg-filled-50" style="width: 550px; left: auto;">
5924 13 Jan 12 nicklas 283       <img src="../../../../images/plot_empty.png" id="preview" 
6143 20 Sep 12 nicklas 284         style="position: absolute; top: 5px; z-index: 1;" alt="">
5924 13 Jan 12 nicklas 285       <img src="../../../../images/plot_select.png" id="overlay" 
6143 20 Sep 12 nicklas 286         style="position: absolute; top: 5px; z-index: 2;" alt="">
5924 13 Jan 12 nicklas 287     </div>
5114 02 Oct 09 nicklas 288   
5924 13 Jan 12 nicklas 289   </div>
5924 13 Jan 12 nicklas 290   </form>
5924 13 Jan 12 nicklas 291   
5924 13 Jan 12 nicklas 292   <base:buttongroup subclass="dialogbuttons">
6315 06 Sep 13 nicklas 293     <base:button 
6315 06 Sep 13 nicklas 294       id="btnPreviewPlot"
6315 06 Sep 13 nicklas 295       title="Preview" 
6315 06 Sep 13 nicklas 296       image="plotter_preview.png"
6315 06 Sep 13 nicklas 297       tooltip="Generate a preview of the plot" 
5924 13 Jan 12 nicklas 298     />
6315 06 Sep 13 nicklas 299     <base:button 
6315 06 Sep 13 nicklas 300       id="btnViewPlot"
6315 06 Sep 13 nicklas 301       title="View&hellip;" 
6315 06 Sep 13 nicklas 302       image="plotter.png" 
6315 06 Sep 13 nicklas 303       tooltip="View a fullsized version of the plot (in a popup)" 
5924 13 Jan 12 nicklas 304     />
6315 06 Sep 13 nicklas 305     <base:button 
6315 06 Sep 13 nicklas 306       id="btnDownloadPlot"
6315 06 Sep 13 nicklas 307       title="Download&hellip;"
5946 03 Feb 12 nicklas 308       image="download.png"
5924 13 Jan 12 nicklas 309       tooltip="Downlad a fullsized version of the plot to your computer" 
5924 13 Jan 12 nicklas 310     />
6315 06 Sep 13 nicklas 311     <base:button 
6315 06 Sep 13 nicklas 312       id="btnSavePlot"
6315 06 Sep 13 nicklas 313       title="Save as&hellip;"
5946 03 Feb 12 nicklas 314       image="saveas.png"
5924 13 Jan 12 nicklas 315       disabled="<%=!hasCreateFilePermission%>"
5924 13 Jan 12 nicklas 316       tooltip="<%=hasCreateFilePermission ? 
5924 13 Jan 12 nicklas 317         "Save a fullsized version of the plot on the BASE server" :
5924 13 Jan 12 nicklas 318         "You don't have permission to create files" %>" 
5924 13 Jan 12 nicklas 319     />
6315 06 Sep 13 nicklas 320     <base:button id="close" title="Close" />
5924 13 Jan 12 nicklas 321   </base:buttongroup>
5924 13 Jan 12 nicklas 322   
5114 02 Oct 09 nicklas 323   </base:body>
5114 02 Oct 09 nicklas 324   </base:page>
5114 02 Oct 09 nicklas 325   <%
5114 02 Oct 09 nicklas 326 }
5114 02 Oct 09 nicklas 327 finally
5114 02 Oct 09 nicklas 328 {
5114 02 Oct 09 nicklas 329   if (dc != null) dc.close();
5114 02 Oct 09 nicklas 330 }
5114 02 Oct 09 nicklas 331 %>