@Transaction(context = INewsContext.class)
 @Override
 public JavascriptForward onSave(final ComponentParameter cp) throws Exception {
   final NewsAttachment attachment = getAttachment(cp);
   if (attachment != null) {
     attachment.setTopic(cp.getParameter("ae_topic"));
     attachment.setDescription(cp.getParameter("ae_description"));
     attachment.setAttachtype(cp.getIntParameter("ae_attachtype"));
     attachment.setVideoTime(cp.getIntParameter("ae_videotime"));
     newsContext
         .getAttachmentService()
         .update(new String[] {"topic", "attachtype", "videotime", "description"}, attachment);
   }
   final JavascriptForward js = super.onSave(cp);
   js.append("$Actions['NewsTabAttachPage_tbl']();");
   return js;
 }
 protected String toOpeHTML(final ComponentParameter cp, final NewsAttachment attachment) {
   final Object id = attachment.getId();
   final StringBuilder sb = new StringBuilder();
   sb.append(
       ButtonElement.editBtn()
           .setOnclick("$Actions['NewsFormAttachPage_edit']('beanId=" + id + "');"));
   sb.append(SpanElement.SPACE);
   sb.append(
       ButtonElement.deleteBtn()
           .setOnclick("$Actions['NewsFormAttachPage_delete']('id=" + id + "');"));
   sb.append(AbstractTablePagerSchema.IMG_DOWNMENU);
   return sb.toString();
 }
    @Override
    protected TableRows getTableRows(final PageParameter pp) {
      final InputElement beanId = InputElement.hidden("beanId");
      final InputElement ae_topic = new InputElement("ae_topic");
      final InputElement ae_videotime = new InputElement("ae_videotime");
      final InputElement ae_description = InputElement.textarea("ae_description").setRows(4);

      Option[] opts = null;
      final Class<? extends Enum<?>> eClass = getAttachmentTypeClass();
      if (eClass != null) {
        final Enum<?>[] vals = eClass.getEnumConstants();
        opts = new Option[vals.length];
        for (int i = 0; i < opts.length; i++) {
          opts[i] = new Option(vals[i].ordinal(), vals[i]);
        }
      }

      final NewsAttachment attachment = getAttachment(pp);
      if (attachment != null) {
        beanId.setText(attachment.getId());
        ae_topic.setText(attachment.getTopic());
        ae_videotime.setText(attachment.getVideoTime());
        ae_description.setText(attachment.getDescription());
        if (opts != null) {
          opts[attachment.getAttachtype()].setSelected(true);
        }
      }

      final TableRows rows =
          TableRows.of(new TableRow(new RowField($m("AttachmentEditPage.1"), beanId, ae_topic)));
      if (opts != null) {
        rows.append(
            new TableRow(
                new RowField(
                    $m("AttachmentEditPage.2"),
                    InputElement.select("ae_attachtype").addElements(opts))));
      }

      return rows.append(
          new TableRow(new RowField($m("NewsFormAttachPage.7"), ae_videotime)),
          new TableRow(new RowField($m("Description"), ae_description)));
    }
    @Override
    protected Map<String, Object> getRowData(final ComponentParameter cp, final Object dataObject) {
      final NewsAttachment attachment = (NewsAttachment) dataObject;
      final KVMap kv = new KVMap();
      try {
        final AttachmentFile af =
            newsContext.getAttachmentService().createAttachmentFile(attachment);
        kv.put(
            "topic",
            new LinkElement(attachment.getTopic())
                .setOnclick(JS.loc(DownloadUtils.getDownloadHref(af), true))
                .setTitle(attachment.getDescription()));
      } catch (final IOException e) {
        kv.put("topic", attachment.getTopic());
      }
      kv.put("attachsize", FileUtils.toFileSize(attachment.getAttachsize()));

      final Class<? extends Enum<?>> eClass =
          ((NewsFormAttachPage) get(cp)).getAttachmentTypeClass();
      if (eClass != null) {
        kv.put("attachtype", eClass.getEnumConstants()[attachment.getAttachtype()]);
      }

      if (((INewsWebContext) newsContext).getLogRef() != null) {
        kv.put(
            "downloads",
            LinkElement.style2(attachment.getDownloads())
                .setOnclick(
                    "$Actions['NewsTabAttachPage_logWin']('beanId=" + attachment.getId() + "');"));
      } else {
        kv.put("downloads", attachment.getDownloads());
      }
      kv.put("userId", cp.getUser(attachment.getUserId()));
      kv.put("createDate", attachment.getCreateDate());

      kv.add(TablePagerColumn.OPE, toOpeHTML(cp, attachment));
      return kv;
    }