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

Last change on this file since 3712 was 3679, checked in by Jari Häkkinen, 14 years ago

Changing the pesky "a (ä) character to a.

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