예제 #1
0
  public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    if (value == null) return null;

    RenderableObject mol_image = (RenderableObject) value;

    Indigo indigo = mol_image.getIndigo();
    IndigoRenderer indigo_renderer = mol_image.getIndigoRenderer();

    // To avoid parallel rendering (maybe will be fixed)
    synchronized (indigo) {
      indigo.setOption("render-output-format", "png");

      if (mol_image == null) return null;

      IndigoObject indigo_obj = mol_image.getRenderableObject();

      int cell_h = table.getRowHeight(row);
      int cell_w = table.getColumnModel().getColumn(column).getWidth();

      if (isSelected) bg_color = table.getSelectionBackground();
      else bg_color = table.getBackground();

      float[] c = bg_color.getComponents(null);
      indigo.setOption("render-background-color", c[0], c[1], c[2]);

      if (indigo_obj == null) {
        image = new BufferedImage(cell_w, cell_h, BufferedImage.TYPE_INT_RGB);
        Graphics2D gc = image.createGraphics();
        gc.setColor(bg_color);
        gc.fillRect(0, 0, cell_w, cell_h);
        gc.setColor(Color.black);
        gc.drawString("Cannot render", 40, (int) (cell_h / 2));
        gc.drawImage(_exclamation_img.getImage(), 5, 10, null);
      } else {
        indigo.setOption("render-image-size", cell_w, cell_h);
        byte[] bytes = null;

        try {
          bytes = indigo_renderer.renderToBuffer(indigo_obj);

          // System.out.print("Render: " + call_count + "\n");
          call_count++;

          ByteArrayInputStream bytes_is = new ByteArrayInputStream(bytes, 0, bytes.length);
          image = ImageIO.read(new MemoryCacheImageInputStream(bytes_is));
        } catch (IOException ex) {
          System.err.println(">>>>" + ex.getMessage());
          ex.printStackTrace();
        }
        if (mol_image.getErrorMessageToRender() != null) {
          // Mark molecule somehow
          Graphics2D gc = image.createGraphics();
          gc.setColor(Color.red);
          gc.drawImage(_exclamation_img.getImage(), 5, 10, null);
          gc.drawString(
              mol_image.getErrorMessageToRender(),
              5 + _exclamation_img.getIconWidth() + 5,
              10 + _exclamation_img.getIconHeight() / 2);
        }
      }

      if (hasFocus) setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
      else setBorder(new EmptyBorder(1, 2, 1, 2));
      return this;
    }
  }