source: trunk/www/views/experiments/bioassaysets/analysis_tree.jsp @ 5952

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

References #1655: GUI improvements

List page in the View menu

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 32.9 KB
Line 
1<%-- $Id: analysis_tree.jsp 5952 2012-02-10 12:27:27Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell, Jari Häkkinen, Nicklas Nordborg
5
6  This file is part of BASE - BioArray Software Environment.
7  Available at http://base.thep.lu.se/
8
9  BASE is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License
11  as published by the Free Software Foundation; either version 3
12  of the License, or (at your option) any later version.
13
14  BASE is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with BASE. If not, see <http://www.gnu.org/licenses/>.
21  ------------------------------------------------------------------
22
23  @author Nicklas
24  @version 2.0
25--%>
26<%@ page pageEncoding="UTF-8" session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.Item"
30  import="net.sf.basedb.core.ItemContext"
31  import="net.sf.basedb.core.BasicItem"
32  import="net.sf.basedb.core.Experiment"
33  import="net.sf.basedb.core.BioAssaySet"
34  import="net.sf.basedb.core.Transformation"
35  import="net.sf.basedb.core.ExtraValue"
36  import="net.sf.basedb.core.ExtraValueType"
37  import="net.sf.basedb.core.AnnotationSet"
38  import="net.sf.basedb.core.AnnotationType"
39  import="net.sf.basedb.core.Annotation"
40  import="net.sf.basedb.core.Job"
41  import="net.sf.basedb.core.ItemQuery"
42  import="net.sf.basedb.core.Nameable"
43  import="net.sf.basedb.core.ItemResultIterator"
44  import="net.sf.basedb.core.ItemResultList"
45  import="net.sf.basedb.core.Permission"
46  import="net.sf.basedb.core.PluginDefinition"
47  import="net.sf.basedb.core.PermissionDeniedException"
48  import="net.sf.basedb.core.query.Restrictions"
49  import="net.sf.basedb.core.query.Expressions"
50  import="net.sf.basedb.core.query.Orders"
51  import="net.sf.basedb.core.query.Hql"
52  import="net.sf.basedb.core.query.Restrictions"
53  import="net.sf.basedb.core.plugin.GuiContext"
54  import="net.sf.basedb.core.plugin.Plugin"
55  import="net.sf.basedb.util.Tree"
56  import="net.sf.basedb.util.Enumeration"
57  import="net.sf.basedb.clients.web.Base"
58  import="net.sf.basedb.clients.web.ModeInfo"
59  import="net.sf.basedb.clients.web.util.HTML"
60  import="net.sf.basedb.util.Values"
61  import="net.sf.basedb.util.formatter.Formatter"
62  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
63  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
64  import="net.sf.basedb.clients.web.extensions.toolbar.ButtonAction"
65  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
66  import="net.sf.basedb.clients.web.extensions.JspContext"
67  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
68  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
69  import="net.sf.basedb.util.extensions.Renderer"
70  import="java.util.Date"
71  import="java.util.List"
72  import="java.util.ArrayList"
73  import="java.util.LinkedList"
74  import="java.util.Map"
75  import="java.util.HashMap"
76  import="java.util.Iterator"
77  import="java.util.Collection"
78%>
79<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
80<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
81<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
82<%!
83  private static final Item itemType = Item.BIOASSAYSET;
84  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
85%>
86<%!
87
88private static void addToTree(Tree<BasicItem> tree, BioAssaySet bas)
89{
90  if (!tree.contains(bas))
91  {
92    Transformation transformation = bas.getTransformation();
93    Tree.Entry<BasicItem> parent = tree.getEntry(transformation);
94    if (parent == null) 
95    {
96      addToTree(tree, transformation);
97      parent = tree.getEntry(transformation);
98    }
99    Tree.Entry<BasicItem> basEntry = parent.addChild(bas);
100    for (ExtraValue xv : bas.getExtraValues().list(bas.getDbControl())) 
101    {
102      basEntry.addChild(xv);
103    }
104  }
105}
106
107private static void addToTree(Tree<BasicItem> tree, Transformation transformation)
108{
109  if (!tree.contains(transformation))
110  {
111    BioAssaySet source = transformation.getSource();
112    Tree.Entry<BasicItem> parent = tree.getEntry(source);
113    if (parent == null) 
114    {
115      addToTree(tree, source);
116      parent = tree.getEntry(source);
117    }
118    parent.addChild(transformation);
119  }
120}
121
122private static Tree<BasicItem> getAnalysisTree(DbControl dc, ItemQuery<BioAssaySet> bioAssaySetQuery, ItemQuery<Transformation> transformationQuery)
123{
124  Tree<BasicItem> tree = new Tree<BasicItem>(null);
125  ItemResultList<BioAssaySet> allBioAssaySets = bioAssaySetQuery.list(dc);
126  List<Integer> ids = new ArrayList<Integer>(allBioAssaySets.size());
127 
128  for (BioAssaySet bas : allBioAssaySets)
129  {
130    addToTree(tree, bas);
131    ids.add(bas.getId());
132  }
133 
134  transformationQuery.restrict(
135    Restrictions.in(
136      Hql.property("source.id"), 
137      Expressions.parameter("bioAssaySets", ids)
138    )
139  );
140  ItemResultList<Transformation> allTransformations = transformationQuery.list(dc);
141  for (Transformation t: allTransformations)
142  {
143    addToTree(tree, t);
144  }
145  return tree;
146}
147String generateTree(Tree<BasicItem> tree, BasicItem root, BasicItem parentItem, Collection<String> closed)
148{
149  StringBuilder sb = new StringBuilder();
150  Tree.Entry<BasicItem> parentEntry = tree.getEntry(parentItem);
151  if (parentEntry == null) return "";
152 
153  if (root != null && root == parentItem)
154  {
155    appendNode(sb, root, null, true);
156  }
157 
158  List<Tree.Entry<BasicItem>> children = parentEntry.getChildren();
159  if (children != null)
160  {
161    for (Tree.Entry<BasicItem> child : children)
162    {
163      BasicItem node = child.getNode();
164      String var = node.getType().name() + "_" + node.getId();
165      appendNode(sb, node, parentItem, (closed == null || !closed.contains(var)) && child.getNumChildren() > 0);
166      sb.append(generateTree(tree, root, node, closed));
167    }
168  }
169  return sb.toString();
170}
171
172void appendNode(StringBuilder sb, BasicItem node, BasicItem parentItem, boolean open)
173{
174  int id = node.getId();
175  String var = node.getType().name() + "_" + id;
176  String name = "";
177 
178  Item nodeType = node.getType();
179  String folderIcon = "";
180  if (nodeType == Item.BIOASSAYSET)
181  {
182    folderIcon = "BioAssaySet";
183    name = ((BioAssaySet)node).getName();
184  } 
185  else if (nodeType == Item.TRANSFORMATION)
186  {
187    Transformation t = (Transformation)node;
188    folderIcon = "Transformation";
189    try
190    {
191      if (t.getJob().getPluginDefinition().supports("net.sf.basedb.core.plugin.AnalysisFilterPlugin"))
192      {
193        folderIcon = "Filter";
194      }
195    }
196    catch (Throwable tt)
197    {}
198    name = t.getName();
199  } 
200  else if (nodeType == Item.EXTRAVALUE) 
201  {
202    folderIcon = "ExtraValue";
203    try
204    {
205      name = ((ExtraValue)node).getExtraValueType().getName();
206    }
207    catch (PermissionDeniedException ex)
208    {
209      name = ((ExtraValue)node).getValueType().toString();
210    }
211  }
212  sb.append("var ").append(var);
213  if (parentItem == null)
214  {
215    sb.append(" = JoustMenu.addMenuItem(-1");
216  }
217  else
218  {
219    String rootVar = parentItem.getType().name() + "_" + parentItem.getId();
220    sb.append(" = JoustMenu.addChildItem(").append(rootVar); 
221  }
222  sb.append(",'").append(folderIcon).append("'");
223  sb.append(",'").append(HTML.javaScriptEncode(name)).append("'");
224  sb.append(", null, '', '").append(var).append("');\n");
225  if (open)
226  {
227    sb.append("JoustMenu.menuItems[").append(var).append("].isOpen = true;\n");
228  }
229}
230%>
231<%
232final int experimentId = Values.getInt(request.getParameter("experiment_id"));
233final int bioAssaySetId = Values.getInt(request.getParameter("item_id"));
234final int transformationId = Values.getInt(request.getParameter("transformation_id"));
235final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
236final String ID = sc.getId();
237final String rootPath = request.getContextPath()+"/";
238final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
239final ItemContext tc = sc.getCurrentContext(Item.TRANSFORMATION);
240final ItemContext xvc = sc.getCurrentContext(Item.EXTRAVALUE);
241
242final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
243final String callback = request.getParameter("callback");
244final String title = mode.generateTitle("bioassay set", "bioassay sets");
245final DbControl dc = sc.newDbControl();
246Tree<BasicItem> analysisTree = null;
247ItemResultList<AnnotationType> annotationTypes = null;
248try
249{
250  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
251  final ItemQuery<AnnotationType> annotationTypeQuery = Base.getAnnotationTypesQuery(itemType);
252  final Experiment experiment = Experiment.getById(dc, experimentId);
253  final BasicItem root = transformationId == 0 ? 
254      (bioAssaySetId == 0 ? null : BioAssaySet.getById(dc, bioAssaySetId))
255      : Transformation.getById(dc, transformationId);
256  final boolean createPermission = experiment.hasPermission(Permission.USE);
257  final boolean deletePermission = createPermission;
258  final boolean writePermission = createPermission;
259
260  final ItemQuery<Transformation> transformationQuery = experiment.getTransformations();
261  transformationQuery.include(cc.getInclude());
262  transformationQuery.setFirstResult(0);
263  transformationQuery.setMaxResults(-1);
264  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
265  annotationTypes = annotationTypeQuery.list(dc);
266  try
267  {
268    final ItemQuery<BioAssaySet> query = Base.getConfiguredQuery(dc, cc, true, experiment.getBioAssaySets(), mode);
269    query.setFirstResult(0);
270    query.setMaxResults(-1);
271    analysisTree = getAnalysisTree(dc, query, transformationQuery);
272  }
273  catch (Throwable t)
274  {
275    cc.setMessage(t.getMessage());
276    t.printStackTrace();
277  }
278  // Contains the ID:s of the bioassaysets that are closed in the tree
279  Collection<String> closed = (Collection<String>)cc.getObject("closed");
280  int numListed = 0;
281 
282  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, 
283    guiContext, root == null ? experiment : root);
284  ExtensionsInvoker toolsInvoker = ExtensionsControl.useExtensions(jspContext, 
285      "net.sf.basedb.clients.web.bioassayset.list.tools");
286  ExtensionsInvoker toolbarInvoker = ToolbarUtil.useExtensions(jspContext);
287  %>
288  <base:page type="include">
289  <base:body>
290    <ext:scripts context="<%=jspContext%>" />
291    <ext:stylesheets context="<%=jspContext%>" />
292    <script language="JavaScript">
293    var submitPage = '<%=transformationId != 0 ? "../bioassaysets/index.jsp" : "index.jsp"%>';
294    var formId = 'bioAssaySets';
295    function newItem()
296    {
297      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=NewItem&experiment_id=<%=experimentId%>', 'NewBioAssaySet', 750, 500);
298    }
299    function editBioAssaySet(itemId)
300    {
301      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, true);
302    }
303    function viewBioAssaySet(itemId)
304    {
305      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, false);
306    }
307    function bioAssaySetOnClick(evt, itemId)
308    {
309      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewBioAssaySet, editBioAssaySet, returnSelected);
310    }
311    function viewTransformation(itemId)
312    {
313      Main.viewOrEditItem('<%=ID%>', 'TRANSFORMATION', itemId, false);
314    }
315    function editTransformation(itemId)
316    {
317      Main.viewOrEditItem('<%=ID%>', 'TRANSFORMATION', itemId, true);
318    }
319    function transformationOnClick(evt, itemId)
320    {
321      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewTransformation, editTransformation, returnSelected);
322    }
323    function viewExtraValue(itemId)
324    {
325      Main.viewOrEditItem('<%=ID%>', 'EXTRAVALUE', itemId, false);
326    }
327    function editExtraValue(itemId)
328    {
329      Main.viewOrEditItem('<%=ID%>', 'EXTRAVALUE', itemId, true);
330    }
331    function extraValueOnClick(evt, itemId)
332    {
333      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewExtraValue, editExtraValue, returnSelected);
334    }
335    function deleteItems()
336    {
337      var frm = document.forms[formId];
338      if (Forms.numChecked(frm) == 0)
339      {
340        alert('Please select at least one item in the list');
341        return;
342      }
343      if (Forms.numChecked(frm, /^X:/) > 0)
344      {
345        if (!confirm('Extra values are deleted immediately and cannot be restored. Do you want to continue?'))
346        {
347          return;
348        }
349      }
350      frm.action = submitPage;
351      frm.cmd.value = 'DeleteItems';
352      frm.submit();
353    }
354    function restoreItems()
355    {
356      var frm = document.forms[formId];
357      if (Forms.numChecked(frm) == 0)
358      {
359        alert('Please select at least one item in the list');
360        return;
361      }
362      frm.action = submitPage;
363      frm.cmd.value = 'RestoreItems';
364      frm.submit();
365    }
366    function deleteItemPermanently(itemType, itemId)
367    {
368      Main.deleteItemPermanently('<%=ID%>', true, itemType, itemId);
369    }
370    function configureColumns()
371    {
372      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
373    }
374    function runPlugin(cmd)
375    {
376      Table.submitToPopup(formId, cmd, 750, 500);
377    }
378    function filter(itemId)
379    {
380      Main.openPopup('../bioassaysets/index.jsp?ID=<%=ID%>&cmd=NewFilteredBioAssaySet&experiment_id=<%=experimentId%>&item_id='+itemId, 'FilterBioAssaySet', 750, 500);
381    }
382    function openPlotTool(itemId)
383    {
384      Main.openPopup('../plotter/index.jsp?ID=<%=ID%>&bioassayset_id='+itemId, 'Plotter', 1050, 700);
385    }
386    function openExperimentExplorer(itemId)
387    {
388      location.href = '../explorer/view/index.jsp?ID=<%=ID%>&bioassayset_id='+itemId;
389    }
390    function runAnalysisPlugin(itemId)
391    {
392      Main.openPopup('../bioassaysets/index.jsp?ID=<%=ID%>&cmd=RunAnalysisPlugin&experiment_id=<%=experimentId%>&item_id='+itemId, 'RunPlugin', 750, 500);
393    }
394    function runExportPlugin(itemId)
395    {
396      Main.openPopup('../bioassaysets/index.jsp?ID=<%=ID%>&cmd=ExportItem&experiment_id=<%=experimentId%>&item_id='+itemId, 'Export', 750, 500);
397    }
398    function copyJob(jobId)
399    {
400      var url = '../../../common/plugin/index.jsp?ID=<%=ID%>';
401      url += '&cmd=CopyJob&job_id='+jobId;
402      url += '&item_type=BIOASSAYSET&context_type=LIST'
403      Main.openPopup(url, 'CopyJob', 750, 500);
404    }
405    function returnSelected()
406    {
407      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
408      window.close();
409    }
410    function presetOnChange()
411    {
412      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
413    }
414   
415    function sendClosedWithAjax()
416    {
417      var request = Main.getAjaxRequest();
418      if (request != null)
419      {
420        var frm = document.forms[formId];
421        var url = '../bioassaysets/index.jsp?ID=<%=ID%>&cmd=SetClosedWithAjax';
422        request.open("POST", url, true);
423        var postdata = 'closed=' + frm.closed.value;
424        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
425        request.setRequestHeader("Content-length", postdata.length);
426        request.setRequestHeader("Connection", "close");
427        request.send(postdata);
428      }
429    }
430   
431    function initTree()
432    {
433      var bigDir = getRoot()+'images/joust/big/';
434      IconStore.init(bigDir, 18, 22);
435      IconStore.addIcon('BioAssaySet', bigDir + 'bioassayset.gif', 18, 22);
436      IconStore.addIcon('Transformation', bigDir + 'transformation.gif', 18, 22);
437      IconStore.addIcon('Filter', bigDir + 'filter.png', 18, 22);
438      IconStore.addIcon('ExtraValue', bigDir + 'extravalue.gif', 18, 22);
439
440      JoustMenu.toggle = function(menuItemIndex)
441      {
442        var menuItem = this.menuItems[menuItemIndex];
443        if (!menuItem) return;
444        // Switch the open/closed status and hide or show the children
445        menuItem.isOpen = !menuItem.isOpen;
446        if (menuItem.isOpen)
447        {
448          this.showChildren(menuItemIndex);
449          var frm = document.forms[formId];
450          frm.closed.value = frm.closed.value.replace(','+menuItem.externalId+',', ',');
451        }
452        else
453        {
454          this.hideChildren(menuItemIndex);
455          var frm = document.forms[formId];
456          frm.closed.value += menuItem.externalId+',';
457        }
458        sendClosedWithAjax();
459        // alert(document.forms[formId].closed.value);
460        this.updateIconsAndText(menuItemIndex);
461      }
462     
463      JoustMenu.drawMenuItems = function(firstIndex, indentString)
464      {
465        var menuItem = this.menuItems[firstIndex];
466        while (menuItem)
467        {
468          var html = menuItem.draw(indentString);
469          var padIcon = IconStore.getIcon(menuItem.noOutlineIcon == true ? null : menuItem.nextItemIndex == -1 ? 'iconBlank' : 'iconLine');
470          var padHtml = padIcon == null ? '' : padIcon.getImgTag();
471         
472          var menuDiv = document.getElementById('tree.'+menuItem.externalId);
473          menuDiv.innerHTML = html;
474         
475          if (menuItem.firstChildIndex != -1)
476          {
477            this.drawMenuItems(menuItem.firstChildIndex, indentString+padHtml);
478          }
479          if (!menuItem.isOpen)
480          {
481            this.hideChildren(menuItem.index);
482          }
483          menuItem = this.menuItems[menuItem.nextItemIndex];
484        }
485        return '';
486      }
487
488      JoustMenu.hideChildren = function(menuItemIndex)
489      {
490        var menuItem = this.menuItems[menuItemIndex];
491        if (menuItem)
492        {
493          var firstChildIndex = menuItem.firstChildIndex;
494          var child = this.menuItems[firstChildIndex];
495          while (child)
496          {
497            var e = document.getElementById('row.'+child.externalId);
498            e.style.display = 'none';
499            this.hideChildren(child.index);
500            child = this.menuItems[child.nextItemIndex];
501          }
502        }
503      }
504     
505      JoustMenu.showChildren = function(menuItemIndex)
506      {
507        var menuItem = this.menuItems[menuItemIndex];
508        if (menuItem)
509        {
510          var firstChildIndex = menuItem.firstChildIndex;
511          var child = this.menuItems[firstChildIndex];
512          while (child)
513          {
514            var e = document.getElementById('row.'+child.externalId);
515            e.style.display = Browser.isIE ? 'block' : 'table-row';
516            if (child.isOpen)
517            {
518              this.showChildren(child.index);
519            }
520            child = this.menuItems[child.nextItemIndex];
521          }
522        }
523      }
524
525      <%=analysisTree == null ? "" : generateTree(analysisTree, root, root, closed)%>
526      JoustMenu.draw('joust');
527     
528    }
529    </script>
530    <tbl:table 
531      id="bioAssaySets" 
532      columns="<%=cc.getSetting("columns")%>"
533      sortby="<%=cc.getSortProperty()%>" 
534      direction="<%=cc.getSortDirection()%>"
535      action="<%=transformationId != 0 ? "../bioassaysets/index.jsp" : "index.jsp"%>"
536      sc="<%=sc%>"
537      item="<%=itemType%>"
538      subclass="<%=root == null ? "fulltable" : "" %>"
539      >
540      <tbl:hidden 
541        name="mode" 
542        value="<%=mode.getName()%>" 
543      />
544      <tbl:hidden 
545        name="experiment_id" 
546        value="<%=String.valueOf(experimentId)%>" 
547      />
548      <tbl:hidden 
549        name="item_id" 
550        value="<%=String.valueOf(bioAssaySetId)%>"
551        skip="<%=bioAssaySetId == 0%>"
552      />
553      <tbl:hidden 
554        name="transformation_id" 
555        value="<%=String.valueOf(transformationId)%>"
556        skip="<%=transformationId == 0%>"
557      />
558      <tbl:hidden 
559        name="callback" 
560        value="<%=callback%>" 
561        skip="<%=callback == null%>" 
562      />
563      <tbl:hidden
564        name="closed"
565        value="<%=closed == null ? "," : ","+Values.getString(closed, ",", true)+","%>"
566      />
567      <tbl:columndef 
568        id="name"
569        property="name"
570        datatype="string"
571        title="Name"
572        sortable="true" 
573        filterable="true"
574        exportable="true"
575        show="always" 
576      />
577      <tbl:columndef 
578        id="spots"
579        property="numSpots"
580        datatype="int"
581        title="Spots/Values in db"
582        sortable="true" 
583        filterable="true"
584        exportable="true"
585      />
586      <tbl:columndef 
587        id="reporters"
588        property="numReporters"
589        datatype="int"
590        title="Reporters in db"
591        sortable="true" 
592        filterable="true"
593        exportable="true"
594      />
595      <tbl:columndef 
596        id="fileSpots"
597        property="numFileSpots"
598        datatype="int"
599        title="Spots/Values in file"
600        sortable="true" 
601        filterable="true"
602        exportable="true"
603      />
604      <tbl:columndef 
605        id="fileReporters"
606        property="numFileReporters"
607        datatype="int"
608        title="Reporters in file"
609        sortable="true" 
610        filterable="true"
611        exportable="true"
612      />
613      <tbl:columndef 
614        id="date"
615        property="transformation.job.ended"
616        datatype="string"
617        title="Date"
618        sortable="true" 
619        filterable="true"
620        exportable="true"
621      />
622      <tbl:columndef 
623        id="plugin"
624        property="transformation.job.pluginDefinition.name"
625        datatype="string"
626        title="Plugin"
627        sortable="true" 
628        filterable="true"
629        exportable="true"
630      />
631      <tbl:columndef 
632        id="description"
633        property="description"
634        datatype="string"
635        title="Description" 
636        sortable="true" 
637        filterable="true" 
638        exportable="true"
639      />
640      <%
641      for (AnnotationType at : annotationTypes)
642      {
643        Enumeration<String, String> annotationEnum = null;
644        Formatter formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
645        if (at.isEnumeration())
646        {
647          annotationEnum = new Enumeration<String, String>();
648          List<?> values = at.getValues();
649          for (Object value : values)
650          {
651            String encoded = formatter.format(value);
652            annotationEnum.add(encoded, encoded);
653          }
654        }
655        %>
656        <tbl:columndef 
657          id="<%="at"+at.getId()%>"
658          title="<%=HTML.encodeTags(at.getName())+" [A]"%>" 
659          property="<%="#"+at.getId()%>"
660          annotation="true"
661          datatype="<%=at.getValueType().getStringValue()%>"
662          enumeration="<%=annotationEnum%>"
663          smartenum="<%=at.getDisplayAsList() %>"
664          sortable="false" 
665          filterable="true" 
666          exportable="true"
667          formatter="<%=formatter%>"
668          unit="<%=at.getDefaultUnit()%>"
669        />
670        <%
671      }
672      %>
673      <tbl:columndef 
674        id="tools"
675        title="Tools" 
676      />
677
678      <div class="panelgroup">
679      <tbl:toolbar
680        visible="<%=mode.hasToolbar()%>"
681        subclass="<%=root == null ? "bottomborder" : "topborder leftborder rightborder" %>"
682        >
683        <tbl:button 
684          disabled="<%=!createPermission%>" 
685          image="new.png" 
686          onclick="newItem()" 
687          title="New root bioassay set&hellip;" 
688          tooltip="<%=createPermission ? "Create a new root bioassay set" : "You do not have permission to create bioassay sets"%>" 
689          visible="<%=root == null && pluginCount.containsKey(Plugin.MainType.INTENSITY)%>"
690        />
691        <tbl:button 
692          disabled="<%=!deletePermission%>" 
693          image="delete.png" 
694          title="Delete"
695          onclick="deleteItems()" 
696          tooltip="<%=deletePermission ? "Delete the selected items" : "You do not have permission to delete items"%>" 
697        />
698        <tbl:button 
699          disabled="<%=!writePermission%>" 
700          image="restore.png" 
701          onclick="restoreItems()" 
702          title="Restore"
703          tooltip="<%=writePermission ? "Restore the selected (deleted) items" : "You do not have permission to restore items"%>" 
704        />
705        <tbl:button 
706          image="columns.png" 
707          onclick="configureColumns()" 
708          title="Columns&hellip;" 
709          tooltip="Show, hide and re-order columns" 
710        />
711        <tbl:button 
712          image="import.png" 
713          onclick="runPlugin('ImportItems')" 
714          title="Import&hellip;" 
715          tooltip="Import data" 
716          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
717        />
718        <tbl:button 
719          image="export.png" 
720          onclick="runPlugin('ExportItems')" 
721          title="Export&hellip;" 
722          tooltip="Export data" 
723          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
724        />
725        <tbl:button 
726          image="runplugin.png" 
727          onclick="runPlugin('RunListPlugin')" 
728          title="Run plugin&hellip;" 
729          tooltip="Run a plugin" 
730          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
731        />
732        <ext:render extensions="<%=toolbarInvoker%>" context="<%=jspContext%>" 
733          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
734      </tbl:toolbar>
735      </div>
736      <tbl:data style="<%=root == null ? "top: 1.75em;" : "" %>">
737        <tbl:headers>
738          <tbl:headerrow>
739            <tbl:header colspan="3">
740              <tbl:presetselector 
741                onchange="presetOnChange()"
742                style="border-right: 0px;"
743              />
744            </tbl:header>
745            <tbl:columnheaders />
746          </tbl:headerrow>
747          <tbl:headerrow>
748            <tbl:header subclass="index" />
749            <tbl:header 
750              subclass="check" 
751              visible="<%=mode.hasCheck()%>"
752              ><base:icon 
753                image="check_uncheck.png" 
754                tooltip="Check/uncheck all" 
755                onclick="Forms.checkUncheck(document.forms[formId])" 
756              /></tbl:header>
757            <tbl:header 
758              subclass="check" 
759              visible="<%=mode.hasRadio()%>"
760              />
761            <tbl:header 
762              subclass="icons" 
763              visible="<%=mode.hasIcons()%>"
764              />
765            <tbl:propertyfilter />
766          </tbl:headerrow>
767        </tbl:headers>
768        <tbl:rows>
769          <%
770          if (cc.getMessage() != null)
771          {
772            %>
773            <tbl:panel clazz="messagepanel">
774              <div class="messagecontainer error"><%=cc.getMessage()%></div>
775            </tbl:panel>
776            <%
777            cc.setMessage(null);
778          }
779          int index = cc.getPage()*cc.getRowsPerPage();
780          int selectedItemId = cc.getId();
781          if (analysisTree != null)
782          {           
783            Iterator<Tree.Entry<BasicItem>> baas = analysisTree.entryIterator(root);
784            while (baas.hasNext())
785            {
786              Tree.Entry<BasicItem> entry = baas.next();
787              BasicItem item = entry.getNode();
788              if (item != null)
789              {
790                int level = entry.getDepth() - 1;
791                int itemId = item.getId();
792                String joustId = item.getType().name() + "_" + itemId;
793                String name = "";
794                String description = "";
795                String tooltip = mode.isSelectionMode() ?
796                    "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
797                String deletePermanently = "deleteItemPermanently('" + item.getType().name() + "', "+itemId+")";
798                boolean removed = false;
799                Transformation t = null;
800                BioAssaySet bas = null;
801                ExtraValue xv = null;
802                PluginDefinition plugin = null;
803                Job job = null;
804                String prefix = "";
805                ItemContext ccc = null;
806                String view = "";
807                String onClick = "";
808                Item itemType = item.getType();
809                if (itemType == Item.TRANSFORMATION)
810                {
811                  t = (Transformation)item;
812                  removed = t.isRemoved();
813                  prefix = "T:";
814                  ccc = tc;
815                  onClick = "transformationOnClick";
816                  name = HTML.encodeTags(t.getName());
817                  description = HTML.encodeTags(t.getDescription());
818                  try
819                  {
820                    job = t.getJob();
821                    plugin = job.getPluginDefinition();
822                  }
823                  catch (Throwable ex)
824                  {}
825                }
826                else if (itemType == Item.BIOASSAYSET)
827                {
828                  bas = (BioAssaySet)item;
829                  removed = bas.isRemoved();
830                  ccc = cc;
831                  onClick = "bioAssaySetOnClick";
832                  name = HTML.encodeTags(bas.getName());
833                  description = HTML.encodeTags(bas.getDescription());
834                }
835                else if (itemType == Item.EXTRAVALUE)
836                {
837                  xv = (ExtraValue)item;
838                  prefix = "X:";
839                  removed = false;
840                  ccc = xvc;
841                  onClick = "extraValueOnClick";
842                  try
843                  {
844                    ExtraValueType xvType = xv.getExtraValueType();
845                    name = HTML.encodeTags(xvType.getName());
846                    description = HTML.encodeTags(xvType.getDescription());
847                  }
848                  catch (PermissionDeniedException ex)
849                  {
850                    name = xv.getValueType().toString();
851                    description = "";
852                  }
853                  try
854                  {
855                    job = xv.getJob();
856                    plugin = job.getPluginDefinition();
857                  }
858                  catch (Throwable ex)
859                  {}
860                }
861               
862                index++;
863                numListed++;
864
865                %>
866                <tbl:row
867                  id="<%="row."+joustId%>"
868                  >
869                  <tbl:header 
870                    clazz="index"
871                    ><%=index%></tbl:header>
872                  <tbl:header 
873                    clazz="check" 
874                    visible="<%=mode.hasCheck()%>"
875                    ><input 
876                        type="checkbox" 
877                        name="<%=prefix+itemId%>" 
878                        value="<%=itemId%>" 
879                        title="<%=name%>" 
880                        <%=ccc.getSelected().contains(itemId) ? "checked" : ""%>
881                      ></tbl:header>
882                  <tbl:header 
883                    clazz="check" 
884                    visible="<%=mode.hasRadio()%>"
885                    ><input 
886                        type="radio" 
887                        name="item_id" 
888                        value="<%=itemId%>" 
889                        title="<%=name%>" 
890                        <%=selectedItemId == itemId ? "checked" : ""%>
891                      ></tbl:header>
892                  <tbl:header 
893                    clazz="icons" 
894                    visible="<%=mode.hasIcons()%>"
895                    ><base:icon 
896                      image="deleted.png"
897                      onclick="<%=deletePermission ? deletePermanently : null%>"
898                      tooltip="This item has been scheduled for deletion" 
899                      visible="<%=removed%>"
900                    />&nbsp;</tbl:header>
901                 
902                  <tbl:cell clazz="cell joustcell" column="name">
903                    <div id="tree.<%=joustId%>" class="link" 
904                      onclick="<%=onClick%>(<%=writePermission ? "event" : null%>, <%=itemId%>)" 
905                      title="<%=tooltip%>"><%=name%>
906                    </div>
907                  </tbl:cell>
908                  <%
909                  if (t != null)
910                  {
911                    %>
912                    <tbl:cell column="spots">&nbsp;</tbl:cell>
913                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
914                    <tbl:cell column="fileSpots">&nbsp;</tbl:cell>
915                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
916                    <tbl:cell column="tools">
917                      <nobr>
918                      <%
919                      if (createPermission && job != null && plugin != null && plugin.isInteractive())
920                      {
921                        %>
922                        <a href="javascript:copyJob(<%=job.getId()%>)" 
923                          title="Copy this transformation"><img 
924                          src="../../../images/copy.png" border="0"></a>
925                        <%
926                      }
927                      %>
928                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
929                      </nobr>
930                    </tbl:cell>
931                    <%
932                  }
933                  if (bas != null)
934                  {
935                    %>
936                    <tbl:cell column="spots"><%=bas.getNumSpots()%></tbl:cell>
937                    <tbl:cell column="reporters"><%=bas.getNumReporters()%></tbl:cell>
938                    <tbl:cell column="fileSpots"><%=bas.getNumFileSpots()%></tbl:cell>
939                    <tbl:cell column="fileReporters"><%=bas.getNumFileReporters()%></tbl:cell>
940                    <tbl:cell column="date">&nbsp;</tbl:cell>
941                    <tbl:cell column="plugin">&nbsp;</tbl:cell>
942                    <%
943                    AnnotationSet as = bas.isAnnotated() ? bas.getAnnotationSet() : null;
944                    if (as != null)
945                    {
946                      for (AnnotationType at : annotationTypes)
947                      {
948                        if (as.hasAnnotation(at))
949                        {
950                          Annotation a = as.getAnnotation(at);
951                          String suffix = a.getUnitSymbol(null);
952                          if (suffix != null) suffix = "&nbsp;" + suffix;
953                          %>
954                          <tbl:cell 
955                            column="<%="at"+at.getId()%>"
956                            ><tbl:cellvalue 
957                              list="<%=a.getValues(null)%>"
958                              suffix="<%=suffix%>"
959                          /></tbl:cell>
960                          <%
961                        }
962                      }
963                    }
964                    %>
965                    <tbl:cell column="tools">
966                      <nobr>
967                      <%
968                      if (bas.getNumSpots() > 0)
969                      {
970                        %>
971                        <a href="javascript:openPlotTool(<%=itemId%>)" 
972                          title="A simple plot tool"><img 
973                          src="../../../images/plotter.png" border="0"></a>
974                        <a href="javascript:openExperimentExplorer(<%=itemId%>)"
975                          title="Experiment explorer"><img
976                          src="../../../images/explorer.png" border="0"></a>
977                        <%
978                      }
979                      %>
980                      <a href="javascript:runExportPlugin(<%=itemId%>)"
981                        title="Export data"><img 
982                        src="../../../images/export.png" border="0"></a>
983                       
984                      <%
985                      if (createPermission)
986                      {
987                        %>
988                        <a href="javascript:filter(<%=itemId%>)" 
989                          title="Create a filtered bioassay set"><img 
990                          src="../../../images/filter.png" border="0"></a>
991                        <a href="javascript:runAnalysisPlugin(<%=itemId%>)" title="Run an analysis plugin"><img 
992                          src="../../../images/runplugin.png" border="0"></a>
993                        <%
994                      }
995                      %>
996                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
997                      </nobr>
998                    </tbl:cell>
999                    <%
1000                  }
1001                  if (xv != null)
1002                  {
1003                    %>
1004                    <tbl:cell column="spots"><%=xv.getNumValues()%></tbl:cell>
1005                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
1006                    <tbl:cell column="fileSpots"><%=xv.getNumFileValues()%></tbl:cell>
1007                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
1008                    <tbl:cell column="tools">
1009                      <nobr>
1010                      <%
1011                      if (createPermission && job != null && plugin != null && plugin.isInteractive())
1012                      {
1013                        %>
1014                        <a href="javascript:copyJob(<%=job.getId()%>)" 
1015                          title="Copy this extra value"><img 
1016                          src="../../../images/copy.png" border="0"></a>
1017                        <%
1018                      }
1019                      %>
1020                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />                           
1021                      </nobr>
1022                    </tbl:cell>
1023                    <%
1024                  }
1025                  %>
1026                  <tbl:cell column="date"><%=job == null ? "" : dateTimeFormatter.format(job.getEnded())%></tbl:cell>
1027                  <tbl:cell column="plugin"><%=plugin == null ? "" : Base.getLinkedName(ID, plugin, false, true)%></tbl:cell>
1028                  <tbl:cell column="description"><%=description%></tbl:cell>
1029                </tbl:row>
1030                <%
1031              }
1032            }
1033          }
1034          if (numListed == 0)
1035          {
1036            %>
1037            <tbl:panel clazz="messagepanel">
1038              <div class="messagecontainer note">
1039              No bioassay sets or transformations were found.
1040              </div>
1041            </tbl:panel>
1042            <%
1043          }
1044          %>
1045        </tbl:rows>
1046      </tbl:data>
1047    </tbl:table>
1048
1049    <script language="JavaScript">
1050    initTree();
1051    </script>
1052  </base:body>
1053  </base:page>
1054  <%
1055}
1056finally
1057{
1058  if (dc != null) dc.close();
1059}
1060%>
Note: See TracBrowser for help on using the repository browser.