Package com.mxgraph.examples.swing.editor

Source Code of com.mxgraph.examples.swing.editor.JTableRenderer

/*
* $Id: JTableRenderer.java,v 1.4 2010-05-28 13:57:32 gaudenz Exp $
* Copyright (c) 2001-2005, Gaudenz Alder
*
* All rights reserved.
*
* See LICENSE file for license details. If you are unable to locate
* this file please contact info (at) jgraph (dot) com.
*/
package com.mxgraph.examples.swing.editor;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Point;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.ActionEvent;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;
import javax.swing.border.BevelBorder;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;

import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.swing.handler.mxCellHandler;
import com.mxgraph.swing.handler.mxGraphTransferHandler;
import com.mxgraph.swing.util.mxGraphTransferable;
import com.mxgraph.view.mxGraph;

/**
* @author Administrator
*
*/
public class JTableRenderer extends JComponent
{

  /**
   *
   */
  private static final long serialVersionUID = 2106746763664760745L;

  /**
   *
   */
  public static final String IMAGE_PATH = "/com/mxgraph/examples/swing/images/";

  /**
   *
   */
  protected static JTableRenderer dragSource = null;

  /**
   *
   */
  protected static int sourceRow = 0;

  /**
   *
   */
  protected Object cell;

  /**
   *
   */
  protected mxGraphComponent graphContainer;

  /**
   *
   */
  protected mxGraph graph;

  /**
   *
   */
  public JTable table;

  /**
   *
   */
  @SuppressWarnings("serial")
  public JTableRenderer(final Object cell,
      final mxGraphComponent graphContainer)
  {
    this.cell = cell;
    this.graphContainer = graphContainer;
    this.graph = graphContainer.getGraph();
    setLayout(new BorderLayout());
    setBorder(BorderFactory.createCompoundBorder(ShadowBorder
        .getSharedInstance(), BorderFactory
        .createBevelBorder(BevelBorder.RAISED)));

    JPanel title = new JPanel();
    title.setBackground(new Color(149, 173, 239));
    title.setOpaque(true);
    title.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 1));
    title.setLayout(new BorderLayout());

    JLabel icon = new JLabel(new ImageIcon(JTableRenderer.class
        .getResource(IMAGE_PATH + "preferences.gif")));
    icon.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 1));
    title.add(icon, BorderLayout.WEST);

    JLabel label = new JLabel(String.valueOf(graph.getLabel(cell)));
    label.setForeground(Color.WHITE);
    label.setFont(title.getFont().deriveFont(Font.BOLD, 11));
    label.setBorder(BorderFactory.createEmptyBorder(0, 1, 0, 2));
    title.add(label, BorderLayout.CENTER);

    JPanel toolBar2 = new JPanel();
    toolBar2.setLayout(new FlowLayout(FlowLayout.LEFT, 1, 2));
    toolBar2.setOpaque(false);
    JButton button = new JButton(new AbstractAction("", new ImageIcon(
        JTableRenderer.class.getResource(IMAGE_PATH + "minimize.gif")))
    {

      public void actionPerformed(ActionEvent e)
      {
        graph.foldCells(graph.isCellCollapsed(cell), false,
            new Object[] { cell });
        ((JButton) e.getSource())
            .setIcon(new ImageIcon(
                JTableRenderer.class
                    .getResource(IMAGE_PATH
                        + ((graph.isCellCollapsed(cell)) ? "maximize.gif"
                            : "minimize.gif"))));
      }
    });
    button.setPreferredSize(new Dimension(16, 16));
    button.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    button.setToolTipText("Collapse/Expand");
    button.setOpaque(false);
    toolBar2.add(button);

    title.add(toolBar2, BorderLayout.EAST);
    add(title, BorderLayout.NORTH);

    // CellStyle style =
    // graph.getStylesheet().getCellStyle(graph.getModel(),
    // cell);
    // if (style.getStyleClass() == null) {
    table = new MyTable();
    JScrollPane scrollPane = new JScrollPane(table);
    scrollPane.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

    if (graph.getModel().getChildCount(cell) == 0)
    {
      scrollPane.getViewport().setBackground(Color.WHITE);
      setOpaque(true);
      add(scrollPane, BorderLayout.CENTER);
    }

    scrollPane.getVerticalScrollBar().addAdjustmentListener(
        new AdjustmentListener()
        {

          public void adjustmentValueChanged(AdjustmentEvent e)
          {
            graphContainer.refresh();
          }

        });

    label = new JLabel(new ImageIcon(JTableRenderer.class
        .getResource(IMAGE_PATH + "resize.gif")));
    label.setCursor(new Cursor(Cursor.NW_RESIZE_CURSOR));

    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.add(label, BorderLayout.EAST);

    add(panel, BorderLayout.SOUTH);

    ResizeHandler resizeHandler = new ResizeHandler();
    label.addMouseListener(resizeHandler);
    label.addMouseMotionListener(resizeHandler);

    setMinimumSize(new Dimension(20, 30));
  }

  /**
   * Implements an event redirector for the specified handle index, where 0
   * is the top right, and 1-7 are the top center, rop right, middle left,
   * middle right, bottom left, bottom center and bottom right, respectively.
   * Default index is 7 (bottom right).
   */
  public class ResizeHandler implements MouseListener, MouseMotionListener
  {

    protected int index;

    public ResizeHandler()
    {
      this(7);
    }

    public ResizeHandler(int index)
    {
      this.index = index;
    }

    public void mouseClicked(MouseEvent e)
    {
      // ignore
    }

    public void mouseEntered(MouseEvent e)
    {
      // ignore
    }

    public void mouseExited(MouseEvent e)
    {
      // ignore
    }

    public void mousePressed(MouseEvent e)
    {
      // Selects to create a handler for resizing
      if (!graph.isCellSelected(cell))
      {
        graphContainer.selectCellForEvent(cell, e);
      }

      // Initiates a resize event in the handler
      mxCellHandler handler = graphContainer.getSelectionCellsHandler().getHandler(
          cell);

      if (handler != null)
      {
        // Starts the resize at index 7 (bottom right)
        handler.start(SwingUtilities.convertMouseEvent((Component) e
            .getSource(), e, graphContainer.getGraphControl()),
            index);
        e.consume();
      }
    }

    public void mouseReleased(MouseEvent e)
    {
      graphContainer.getGraphControl().dispatchEvent(
          SwingUtilities.convertMouseEvent((Component) e.getSource(),
              e, graphContainer.getGraphControl()));
    }

    public void mouseDragged(MouseEvent e)
    {
      graphContainer.getGraphControl().dispatchEvent(
          SwingUtilities.convertMouseEvent((Component) e.getSource(),
              e, graphContainer.getGraphControl()));
    }

    public void mouseMoved(MouseEvent e)
    {
      // ignore
    }
  }

  /**
   *
   */
  public class MyTable extends JTable implements DropTargetListener
  {

    /**
     *
     */
    private static final long serialVersionUID = 5841175227984561071L;

    Object[][] data;

    String[] colNames = new String[] { "A", "B", "C", "D", "E" };

    @SuppressWarnings("serial")
    public MyTable()
    {
      data = new Object[30][5];
      for (int i = 0; i < 30; i++)
      {
        data[i][0] = new Boolean(false);
        data[i][1] = "Column " + i;
        data[i][2] = (Math.random() > 0.5) ? new ImageIcon(
            JTableRenderer.class.getResource(IMAGE_PATH
                + "preferences.gif")) : null;
        data[i][3] = (Math.random() > 0.5) ? new ImageIcon(
            JTableRenderer.class.getResource(IMAGE_PATH
                + "preferences.gif")) : null;
        data[i][4] = (Math.random() > 0.5) ? new ImageIcon(
            JTableRenderer.class.getResource(IMAGE_PATH
                + "preferences.gif")) : null;
      }
      setModel(createModel());
      setTableHeader(null);
      setAutoscrolls(true);
      setGridColor(Color.WHITE);
      TableColumn column = getColumnModel().getColumn(0);
      column.setMaxWidth(20);
      column = getColumnModel().getColumn(2);
      column.setMaxWidth(12);
      column = getColumnModel().getColumn(3);
      column.setMaxWidth(12);
      column = getColumnModel().getColumn(4);
      column.setMaxWidth(12);

      setTransferHandler(new TransferHandler()
      {

        /* (non-Javadoc)
         * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent)
         */
        @Override
        public int getSourceActions(JComponent c)
        {
          return COPY_OR_MOVE;
        }

        /*
         * (non-Javadoc)
         *
         * @see javax.swing.TransferHandler#createTransferable(javax.swing.JComponent)
         */
        protected Transferable createTransferable(JComponent c)
        {
          sourceRow = getSelectedRow();
          dragSource = JTableRenderer.this;
          //mxRectangle bounds = new mxRectangle(0, 0, MyTable.this
          //    .getWidth(), 20);
          return new mxGraphTransferable(null, null, null);
        }

      });

      setDragEnabled(true);
      setDropTarget(new DropTarget(this, // component
          DnDConstants.ACTION_COPY_OR_MOVE, // actions
          this));
      setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }

    /**
     *
     */
    public DropTarget getDropTarget()
    {
      if (!((mxGraphTransferHandler) graphContainer.getTransferHandler())
          .isLocalDrag())
      {
        return super.getDropTarget();
      }

      return null;
    }

    /*
     * (non-Javadoc)
     *
     * @see java.awt.dnd.DropTargetListener#dragEnter(java.awt.dnd.DropTargetDragEvent)
     */
    public void dragEnter(DropTargetDragEvent e)
    {

    }

    /*
     * (non-Javadoc)
     *
     * @see java.awt.dnd.DropTargetListener#dragOver(java.awt.dnd.DropTargetDragEvent)
     */
    public void dragOver(DropTargetDragEvent e)
    {
      if (!((mxGraphTransferHandler) graphContainer.getTransferHandler())
          .isLocalDrag()
          && JTableRenderer.this != dragSource)
      {
        Point p = e.getLocation();
        int row = rowAtPoint(p);
        getSelectionModel().setSelectionInterval(row, row);
      }
    }

    /*
     * (non-Javadoc)
     *
     * @see java.awt.dnd.DropTargetListener#dropActionChanged(java.awt.dnd.DropTargetDragEvent)
     */
    public void dropActionChanged(DropTargetDragEvent dtde)
    {
      // TODO Auto-generated method stub

    }

    /*
     * (non-Javadoc)
     *
     * @see java.awt.dnd.DropTargetListener#drop(java.awt.dnd.DropTargetDropEvent)
     */
    public void drop(DropTargetDropEvent e)
    {
      if (dragSource != null)
      {
        e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
        Point p = e.getLocation();
        int targetRow = rowAtPoint(p);

        Object edge = graph.insertEdge(null, null, null,
            dragSource.cell, JTableRenderer.this.cell, "sourceRow="
                + sourceRow + ";targetRow=" + targetRow);
        graph.setSelectionCell(edge);

        // System.out.println("clearing drag source");
        dragSource = null;
        e.dropComplete(true);
      }
      else
      {
        e.rejectDrop();
      }
    }

    /*
     * (non-Javadoc)
     *
     * @see java.awt.dnd.DropTargetListener#dragExit(java.awt.dnd.DropTargetEvent)
     */
    public void dragExit(DropTargetEvent dte)
    {
      // TODO Auto-generated method stub

    }

    /**
     *
     * @return the created table model
     */
    public TableModel createModel()
    {
      return new AbstractTableModel()
      {

        /**
         *
         */
        private static final long serialVersionUID = -3642207266816170738L;

        public int getColumnCount()
        {
          return colNames.length;
        }

        public int getRowCount()
        {
          return data.length;
        }

        public String getColumnName(int col)
        {
          return colNames[col];
        }

        public Object getValueAt(int row, int col)
        {
          return data[row][col];
        }

        @SuppressWarnings("unchecked")
        public Class getColumnClass(int c)
        {
          Object value = getValueAt(0, c);
          return (value != null) ? value.getClass() : ImageIcon.class;
        }

        /*
         * Don't need to implement this method unless your table's
         * editable.
         */
        public boolean isCellEditable(int row, int col)
        {
          return col == 0;
        }

        /*
         * Don't need to implement this method unless your table's data
         * can change.
         */
        public void setValueAt(Object value, int row, int col)
        {
          data[row][col] = value;
          fireTableCellUpdated(row, col);
        }
      };

    }

  }

  /**
   *
   */
  public static JTableRenderer getVertex(Component component)
  {
    while (component != null)
    {
      if (component instanceof JTableRenderer)
      {
        return (JTableRenderer) component;
      }
      component = component.getParent();
    }

    return null;
  }

}
TOP

Related Classes of com.mxgraph.examples.swing.editor.JTableRenderer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.