source: trunk/www/admin/plugindefinitions/list_plugins.jsp @ 3190

Last change on this file since 3190 was 3190, checked in by Johan Enell, 15 years ago

Merged log:branches/2.2.2#3116:3186 to trunk.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 20.8 KB
Line 
1<%-- $Id: list_plugins.jsp 3190 2007-03-13 10:05:42Z enell $
2  ------------------------------------------------------------------
3  Copyright (C) Authors contributing to this file.
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.Item"
31  import="net.sf.basedb.core.PluginDefinition"
32  import="net.sf.basedb.core.PluginConfiguration"
33  import="net.sf.basedb.core.ItemQuery"
34  import="net.sf.basedb.core.Include"
35  import="net.sf.basedb.core.Type"
36  import="net.sf.basedb.core.ItemResultIterator"
37  import="net.sf.basedb.core.ItemResultList"
38  import="net.sf.basedb.core.ItemContext"
39  import="net.sf.basedb.core.Permission"
40  import="net.sf.basedb.core.PluginDefinition"
41  import="net.sf.basedb.core.query.Orders"
42  import="net.sf.basedb.core.query.Hql"
43  import="net.sf.basedb.core.query.Expressions"
44  import="net.sf.basedb.core.query.Restrictions"
45  import="net.sf.basedb.core.plugin.GuiContext"
46  import="net.sf.basedb.core.plugin.Plugin"
47  import="net.sf.basedb.util.Enumeration"
48  import="net.sf.basedb.util.JarClassLoader"
49  import="net.sf.basedb.util.ToStringComparator"
50  import="net.sf.basedb.clients.web.Base"
51  import="net.sf.basedb.clients.web.ModeInfo"
52  import="net.sf.basedb.clients.web.PermissionUtil"
53  import="net.sf.basedb.clients.web.util.HTML"
54  import="net.sf.basedb.util.Values"
55  import="java.util.List"
56  import="java.util.Map"
57  import="java.util.Set"
58  import="java.util.EnumSet"
59  import="java.util.TreeSet"
60%>
61<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
62<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
63<%!
64  private static final Item itemType = Item.PLUGINDEFINITION;
65  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
66  private static final Enumeration<String, String> itemTypes = new Enumeration<String, String>();
67  private static final Enumeration<String, String> mainTypes = new Enumeration<String, String>();
68
69  static
70  {
71    Set<Item> temp = new TreeSet<Item>(new ToStringComparator<Item>(false));
72    temp.addAll(EnumSet.complementOf(EnumSet.of(Item.SYSTEM)));
73    for (Item item : temp)
74    {
75      itemTypes.add(Integer.toString(item.getValue()), item.toString());
76    }
77    for (Plugin.MainType v : Plugin.MainType.values())
78    {
79      mainTypes.add(Integer.toString(v.getValue()), v.toString());
80    }
81  }
82%>
83<%
84final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
85final String ID = sc.getId();
86final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
87final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
88
89final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
90final String callback = request.getParameter("callback");
91final String title = mode.generateTitle("plugin", "plugins");
92final DbControl dc = sc.newDbControl();
93ItemResultIterator<PluginDefinition> plugins = null;
94try
95{
96  // Query for plugins relatated to the current type
97  final ItemQuery<PluginConfiguration> configQuery = PluginConfiguration.getQuery();
98  configQuery.include(cc.getInclude());
99  configQuery.restrict(Restrictions.eq(Hql.property("pluginDefinition"), Expressions.parameter("plugin")));
100  configQuery.order(Orders.asc(Hql.property("name"))); 
101  final boolean createConfigurationPermission = sc.hasPermission(Permission.CREATE, Item.PLUGINCONFIGURATION); 
102
103  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
104  try
105  {
106    final ItemQuery<PluginDefinition> query = Base.getConfiguredQuery(cc, false, PluginDefinition.getQuery(), mode);
107    plugins = query.iterate(dc);
108  }
109  catch (Throwable t)
110  {
111    cc.setMessage(t.getMessage());
112  }
113  int numListed = 0;
114  %>
115  <base:page title="<%=title==null ? "Plugins" : title%>" type="<%=mode.getPageType()%>">
116  <base:head scripts="menu.js,table.js" styles="menu.css,table.css">
117    <script language="JavaScript">
118    var submitPage = 'index.jsp';
119    var formId = 'plugins';
120    function newItem()
121    {
122      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', 0, true);
123    }
124    function editItem(itemId)
125    {
126      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, true);
127    }
128    function viewItem(itemId)
129    {
130      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, false);
131    }
132    function itemOnClick(evt, itemId)
133    {
134      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewItem, editItem, returnSelected);
135    }
136    function deleteItems()
137    {
138      var frm = document.forms[formId];
139      if (Forms.numChecked(frm) == 0)
140      {
141        alert('Please select at least one item in the list');
142        return;
143      }
144      frm.action = submitPage;
145      frm.cmd.value = 'DeleteItems';
146      frm.submit();
147    }
148    function restoreItems()
149    {
150      var frm = document.forms[formId];
151      if (Forms.numChecked(frm) == 0)
152      {
153        alert('Please select at least one item in the list');
154        return;
155      }
156      frm.action = submitPage;
157      frm.cmd.value = 'RestoreItems';
158      frm.submit();
159    }
160    function takeOwnership()
161    {
162      var frm = document.forms[formId];
163      if (Forms.numChecked(frm) == 0)
164      {
165        alert('Please select at least one item in the list');
166        return;
167      }
168      if (confirm('Are you sure that you want to take ownership of the selected items? It can\'t be undone.'))
169      {
170        frm.action = submitPage;
171        frm.cmd.value = 'TakeOwnershipOfItems';
172        frm.submit();
173      }
174    }
175    function unloadItems()
176    {
177      var frm = document.forms[formId];
178      if (Forms.numChecked(frm) == 0)
179      {
180        alert('Please select at least one item in the list');
181        return;
182      }
183      frm.action = submitPage;
184      frm.cmd.value = 'UnloadItems';
185      frm.submit();
186    }
187    function shareItem(itemId)
188    {
189      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ShareItem&item_id='+itemId, 'SharePlugins', 500, 400);
190    }
191    function shareItems()
192    {
193      Table.shareItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'ShareItems');
194    }
195    function configureColumns()
196    {
197      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
198    }
199    function runPlugin(cmd)
200    {
201      Table.submitToPopup(formId, cmd, 740, 540);
202    }
203    function returnSelected()
204    {
205      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
206      window.close();
207    }
208    function presetOnChange()
209    {
210      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
211    }
212    function newConfiguration(pluginId)
213    {
214      Main.viewOrEditItem('<%=ID%>', 'PLUGINCONFIGURATION', 0, true, '&plugindefinition_id='+pluginId);
215    }
216    </script>
217  </base:head>
218 
219  <base:body>
220    <%
221    if (cc.getMessage() != null)
222    {
223      %>
224      <div class="error"><%=cc.getMessage()%></div>
225      <%
226      cc.setMessage(null);
227    }
228    %>
229    <tbl:table 
230      id="plugins" 
231      clazz="itemlist" 
232      columns="<%=cc.getSetting("columns")%>"
233      sortby="<%=cc.getSortProperty()%>" 
234      direction="<%=cc.getSortDirection()%>"
235      title="<%=title%>"
236      action="index.jsp"
237      sc="<%=sc%>"
238      item="<%=itemType%>"
239      >
240      <tbl:hidden 
241        name="mode" 
242        value="<%=mode.getName()%>" 
243      />
244      <tbl:hidden 
245        name="callback" 
246        value="<%=callback%>" 
247        skip="<%=callback == null%>" 
248      />
249      <tbl:columndef 
250        id="name"
251        property="name"
252        datatype="string"
253        title="Name"
254        sortable="true" 
255        filterable="true"
256        exportable="true"
257        show="always" 
258      />
259      <tbl:columndef 
260        id="pluginType"
261        property="mainType"
262        datatype="int"
263        enumeration="<%=mainTypes%>"
264        title="Type"
265        sortable="true" 
266        filterable="true"
267        exportable="true"
268      />
269      <tbl:columndef 
270        id="className"
271        property="className"
272        datatype="string"
273        title="Class"
274        sortable="true" 
275        filterable="true"
276        exportable="true"
277      />
278      <tbl:columndef 
279        id="jarPath"
280        property="jarPath"
281        datatype="string"
282        title="Path"
283        sortable="true" 
284        filterable="true"
285        exportable="true"
286      />
287      <tbl:columndef 
288        id="version"
289        property="versionString"
290        datatype="string"
291        title="Version"
292        sortable="true" 
293        filterable="true"
294        exportable="true"
295      />
296      <tbl:columndef 
297        id="configurations"
298        title="Configurations"
299      />
300      <tbl:columndef 
301        id="contact"
302        property="contact"
303        datatype="string"
304        title="Contact"
305        sortable="true" 
306        filterable="true"
307        exportable="true"
308      />
309      <tbl:columndef 
310        id="copyright"
311        property="copyright"
312        datatype="string"
313        title="Copyright"
314        sortable="true" 
315        filterable="true"
316        exportable="true"
317      />
318      <tbl:columndef 
319        id="email"
320        property="email"
321        datatype="string"
322        title="Email"
323        sortable="true" 
324        filterable="true"
325        exportable="true"
326      />
327      <tbl:columndef 
328        id="url"
329        property="url"
330        datatype="string"
331        title="URL"
332        sortable="true" 
333        filterable="true"
334        exportable="true"
335      />
336      <tbl:columndef 
337        id="interactive"
338        property="interactive"
339        datatype="boolean"
340        title="Is interactive"
341        sortable="true" 
342        filterable="true"
343        exportable="true"
344      />
345      <tbl:columndef 
346        id="supportsConfigurations"
347        property="supportsConfigurations"
348        datatype="boolean"
349        title="Support config"
350        sortable="true" 
351        filterable="true"
352        exportable="true"
353      />
354      <tbl:columndef 
355        id="requiresConfiguration"
356        property="requiresConfiguration"
357        datatype="boolean"
358        title="Requires config"
359        sortable="true" 
360        filterable="true"
361        exportable="true"
362      />
363      <tbl:columndef 
364        id="usePermissions"
365        property="usePermissions"
366        datatype="boolean"
367        title="Uses permissions"
368        sortable="true" 
369        filterable="true"
370        exportable="true"
371      />
372      <tbl:columndef 
373        id="allowImmediateExecution"
374        property="allowImmediateExecution"
375        datatype="boolean"
376        title="Immediate execution"
377        sortable="true" 
378        filterable="true"
379        exportable="true"
380      />
381      <tbl:columndef 
382        id="contexts"
383        property="guiContexts.itemType"
384        datatype="int"
385        enumeration="<%=itemTypes%>"
386        title="Items"
387        sortable="false" 
388        filterable="true"
389        exportable="true"
390      />
391      <tbl:columndef 
392        id="maxMemory"
393        property="maxMemory"
394        datatype="long"
395        title="Max memory"
396        sortable="true" 
397        filterable="true"
398        exportable="true"
399      />
400      <tbl:columndef 
401        id="trusted"
402        property="trusted"
403        datatype="boolean"
404        title="Trusted"
405        sortable="true" 
406        filterable="true"
407        exportable="true"
408      />
409      <tbl:columndef 
410        id="owner"
411        property="owner.name"
412        datatype="string"
413        title="Owner"
414        sortable="true" 
415        filterable="true"
416        exportable="true"
417      />
418      <tbl:columndef 
419        id="description"
420        property="description"
421        datatype="string"
422        title="Description" 
423        sortable="true" 
424        filterable="true" 
425        exportable="true"
426      />
427      <tbl:columndef
428        id="loaded"
429        title="Loaded"
430      />
431      <tbl:columndef
432        id="permission"
433        title="Permission"
434      />
435      <tbl:toolbar
436        visible="<%=mode.hasToolbar()%>"
437        >
438        <tbl:button 
439          disabled="<%=createPermission ? false : true%>" 
440          image="<%=createPermission ? "new.gif" : "new_disabled.gif"%>" 
441          onclick="newItem()" 
442          title="New&hellip;" 
443          tooltip="<%=createPermission ? "Create new plugin" : "You do not have permission to create plugins"%>" 
444        />
445        <tbl:button 
446          image="delete.gif"
447          onclick="deleteItems()" 
448          title="Delete" 
449          tooltip="Delete the selected items" 
450        />
451        <tbl:button 
452          image="restore.gif"
453          onclick="restoreItems()" 
454          title="Restore" 
455          tooltip="Restore the selected (deleted) items"
456        />
457        <tbl:button 
458          image="share.gif"
459          onclick="shareItems()" 
460          title="Share&hellip;" 
461          tooltip="Share the selected items"
462        />
463        <tbl:button 
464          image="take_ownership.png"
465          onclick="takeOwnership()" 
466          title="Take ownership&hellip;"
467          tooltip="Take ownership of the selected items"
468        />
469        <tbl:button 
470          image="columns.gif" 
471          onclick="configureColumns()" 
472          title="Columns&hellip;" 
473          tooltip="Show, hide and re-order columns" 
474        />
475        <tbl:button 
476          image="import.gif" 
477          onclick="runPlugin('ImportItems')" 
478          title="Import&hellip;" 
479          tooltip="Import data" 
480          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
481        />
482        <tbl:button 
483          image="export.gif" 
484          onclick="runPlugin('ExportItems')" 
485          title="Export&hellip;" 
486          tooltip="Export data" 
487          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
488        />
489        <tbl:button 
490          image="runplugin.gif" 
491          onclick="runPlugin('RunListPlugin')" 
492          title="Run plugin&hellip;" 
493          tooltip="Run a plugin" 
494          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
495        />
496        <tbl:button 
497          onclick="unloadItems()" 
498          title="Unload" 
499          tooltip="Unload plugins" 
500        />
501        </tbl:toolbar>
502      <tbl:navigator
503        page="<%=cc.getPage()%>" 
504        rowsperpage="<%=cc.getRowsPerPage()%>" 
505        totalrows="<%=plugins == null ? 0 : plugins.getTotalCount()%>" 
506        visible="<%=mode.hasNavigator()%>"
507      />
508      <tbl:data>
509        <tbl:columns>
510        <tbl:presetselector 
511          clazz="columnheader"
512          colspan="3"
513          onchange="presetOnChange()"
514        />
515        </tbl:columns>
516
517        <tr>
518          <tbl:header 
519            clazz="index"
520            >&nbsp;</tbl:header>
521          <tbl:header 
522            clazz="check" 
523            visible="<%=mode.hasCheck()%>"
524            ><base:icon 
525              image="check_uncheck.gif" 
526              tooltip="Check/uncheck all" 
527              onclick="Forms.checkUncheck(document.forms[formId])" style="align: left;"
528            /></tbl:header>
529          <tbl:header 
530            clazz="check" 
531            visible="<%=mode.hasRadio()%>"
532            >&nbsp;</tbl:header>
533          <tbl:header 
534            clazz="icons" 
535            visible="<%=mode.hasIcons()%>"
536            >&nbsp;</tbl:header>
537          <tbl:propertyfilter />
538        </tr>
539         
540          <tbl:rows>
541          <%
542          int index = cc.getPage()*cc.getRowsPerPage();
543          int selectedItemId = cc.getId();
544          Set<GuiContext> contexts = new TreeSet<GuiContext>(new ToStringComparator<GuiContext>(false));
545          if (plugins != null)
546          {
547            while (plugins.hasNext())
548            {
549              PluginDefinition item = plugins.next();
550              int itemId = item.getId();
551              String openSharePopup = "shareItem("+itemId+")";
552              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
553              String name = HTML.encodeTags(item.getName());
554              boolean usePermission = item.hasPermission(Permission.USE);
555              boolean writePermission = item.hasPermission(Permission.WRITE);
556              String tooltip = mode.isSelectionMode() ? 
557                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
558              index++;
559              numListed++;
560              %>
561              <tbl:row>
562                <tbl:header 
563                  clazz="index"
564                  ><%=index%></tbl:header>
565                <tbl:header 
566                  clazz="check" 
567                  visible="<%=mode.hasCheck()%>"
568                  ><input 
569                    type="checkbox" 
570                    name="<%=itemId%>" 
571                    value="<%=itemId%>" 
572                    title="<%=name%>" 
573                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
574                  ></tbl:header>
575                <tbl:header 
576                  clazz="check" 
577                  visible="<%=mode.hasRadio()%>"
578                  ><input 
579                    type="radio" 
580                    name="item_id" 
581                    value="<%=itemId%>" 
582                    title="<%=name%>" 
583                    <%=selectedItemId == itemId ? "checked" : ""%>
584                  ></tbl:header>
585                <tbl:header 
586                  clazz="icons" 
587                  visible="<%=mode.hasIcons()%>"
588                  ><base:icon 
589                    image="deleted.gif" 
590                    tooltip="This item has been scheduled for deletion" 
591                    visible="<%=item.isRemoved()%>"
592                  /><base:icon 
593                    image="<%=sharePermission ? "shared.gif" : "shared_disabled.gif"%>" 
594                    onclick="<%=sharePermission ? openSharePopup : null%>"
595                    tooltip="This item is shared to other users, groups and/or projects" 
596                    visible="<%=item.isShared()%>"
597                  />&nbsp;</tbl:header>
598                <tbl:cell column="name"><div class="link" 
599                  onclick="itemOnClick(<%=writePermission ? "event" : null%>, <%=itemId%>)" 
600                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
601                <tbl:cell column="pluginType"><%=item.getMainType()%></tbl:cell>
602                <tbl:cell column="className"><%=item.getClassName()%></tbl:cell>
603                <tbl:cell column="jarPath"><%=Values.getString(item.getJarPath(), "<i>-&nbsp;internal&nbsp;-</i>")%></tbl:cell>
604                <tbl:cell column="version"><%=HTML.encodeTags(item.getVersionString())%></tbl:cell>
605                <tbl:cell column="configurations">
606                  <%
607                  configQuery.setParameter("plugin", itemId, Type.INT);
608                  try
609                  {
610                    String separator = "";
611                    for (PluginConfiguration p : configQuery.list(dc))
612                    {
613                      out.write(separator);
614                      if (mode.hasPropertyLink())
615                      {
616                        out.write(Base.getLinkedName(ID, p, false, mode.hasEditLink()));
617                      }
618                      else
619                      {
620                        out.write(HTML.encodeTags(p.getName()));
621                      }
622                      separator = ", ";
623                    }
624                  }
625                  catch (Throwable t)
626                  {
627                    %>
628                    <div class="error"><%=t.getMessage()%></div>
629                    <%
630                  }
631                  %>
632                  <base:icon
633                    image="add.png" 
634                    onclick="<%="newConfiguration("+itemId+")"%>" 
635                    tooltip="Create new configuration" 
636                    visible="<%=mode.hasEditLink() && createConfigurationPermission && usePermission && item.supportsConfigurations() %>"
637                  />
638                </tbl:cell>
639                <tbl:cell column="contact"><%=HTML.encodeTags(item.getContact())%></tbl:cell>
640                <tbl:cell column="copyright"><%=HTML.encodeTags(item.getCopyright())%></tbl:cell>
641                <tbl:cell column="email"><%=HTML.encodeTags(item.getEmail())%></tbl:cell>
642                <tbl:cell column="url"><%=HTML.encodeTags(item.getUrl())%></tbl:cell>
643                <tbl:cell column="interactive"><%=item.isInteractive()%></tbl:cell>
644                <tbl:cell column="supportsConfigurations"><%=item.supportsConfigurations() ? "yes" : "no"%></tbl:cell>
645                <tbl:cell column="requiresConfiguration"><%=item.requiresConfiguration() ? "yes" : "no"%></tbl:cell>
646                <tbl:cell column="usePermissions"><%=item.getUsePermissions() ? "yes" : "no"%></tbl:cell>
647                <tbl:cell column="contexts">
648                  <%
649                  contexts.clear();
650                  contexts.addAll(item.getGuiContexts());
651                  %>
652                  <%=contexts.isEmpty() ? "<i>- none -</i>" : Values.getString(contexts, ", ", true)%>
653                </tbl:cell>
654                <tbl:cell column="loaded"><%=item.getJarPath() == null || JarClassLoader.exists(item.getJarPath()) ? "Yes" : "No"%></tbl:cell>
655                <tbl:cell column="maxMemory"><%=Values.formatBytes(item.getMaxMemory())%></tbl:cell>
656                <tbl:cell column="trusted"><%=item.isTrusted() ? "yes" : "no"%></tbl:cell>
657                <tbl:cell column="allowImmediateExecution"><%=item.getAllowImmediateExecution() ? "yes" : "no"%></tbl:cell>
658                <tbl:cell column="owner"
659                  ><base:propertyvalue 
660                    item="<%=item%>" 
661                    property="owner"
662                    enableEditLink="<%=mode.hasEditLink()%>" 
663                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
664                  /></tbl:cell>
665                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
666                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
667              </tbl:row>
668              <%
669              }
670            }
671          %>
672          </tbl:rows>
673      </tbl:data>
674      <%
675      if (numListed == 0)
676      {
677        %>
678        <tbl:panel><%=plugins == null || plugins.getTotalCount() == 0 ? "No plugins were found" : "No plugins on this page. Please select another page!" %></tbl:panel>
679        <%
680      }
681      else
682      {
683        %>
684        <tbl:navigator
685          page="<%=cc.getPage()%>" 
686          rowsperpage="<%=cc.getRowsPerPage()%>" 
687          totalrows="<%=plugins == null ? 0 : plugins.getTotalCount()%>" 
688          visible="<%=mode.hasNavigator()%>"
689          locked="true"
690        />
691        <%
692      }
693      %>
694    </tbl:table>
695    <base:buttongroup align="center" clazz="fixedatbottom">
696      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
697      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
698      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
699    </base:buttongroup>
700    <br><br><br>
701  </base:body>
702  </base:page>
703  <%
704}
705finally
706{
707  if (plugins != null) plugins.close();
708  if (dc != null) dc.close();
709}
710%>
Note: See TracBrowser for help on using the repository browser.