class EdgesDataTable extends AbstractElementsDataTable<Edge> {

    private final PropertyDataColumn<Edge> TYPE_COLUMN =
        new PropertyDataColumn<Edge>(NbBundle.getMessage(EdgesDataTable.class, "EdgeDataTable.type.column.text")) {

            @Override
            public Class getColumnClass() {
                return String.class;
            }

            @Override
            public Object getValueFor(Edge edge) {
                if (edge.isDirected()) {
                    return NbBundle.getMessage(EdgesDataTable.class, "EdgeDataTable.type.column.directed");
                } else {
                    return NbBundle.getMessage(EdgesDataTable.class, "EdgeDataTable.type.column.undirected");
                }
            }
        };
    private final PropertyDataColumn<Edge> KIND_COLUMN =
        new PropertyDataColumn<Edge>(NbBundle.getMessage(EdgesDataTable.class, "EdgeDataTable.kind.column.text")) {

            @Override
            public Class getColumnClass() {
                return String.class;
            }

            @Override
            public Object getValueFor(Edge edge) {
                return edge.getTypeLabel() != null ? edge.getTypeLabel().toString() : null;
            }

            @Override
            public void setValueFor(Edge element, Object value) {
                final String strValue = value != null ? value.toString() : null;

                if (strValue != null && !strValue.trim().isEmpty()) {

                    int edgeType = element.getTable().getGraph().getModel().addEdgeType(strValue);
                    element.setType(edgeType);
                } else {
                    // Type 0 is a special type for "no type defined"
                    element.setType(0);
                }

            }

            @Override
            public boolean isEditable() {
                return true;
            }


        };
    private boolean showEdgesNodesLabels = false;
    private final PropertyDataColumn<Edge> SOURCE_COLUMN =
        new PropertyDataColumn<Edge>(NbBundle.getMessage(EdgesDataTable.class, "EdgeDataTable.source.column.text")) {

            @Override
            public Class getColumnClass() {
                return String.class;
            }

            @Override
            public Object getValueFor(Edge edge) {
                if (showEdgesNodesLabels) {
                    return edge.getSource().getId() + " - " + edge.getSource().getLabel();
                } else {
                    return edge.getSource().getId();
                }
            }
        };
    private final PropertyDataColumn<Edge> TARGET_COLUMN =
        new PropertyDataColumn<Edge>(NbBundle.getMessage(EdgesDataTable.class, "EdgeDataTable.target.column.text")) {

            @Override
            public Class getColumnClass() {
                return String.class;
            }

            @Override
            public Object getValueFor(Edge edge) {
                if (showEdgesNodesLabels) {
                    return edge.getTarget().getId() + " - " + edge.getTarget().getLabel();
                } else {
                    return edge.getTarget().getId();
                }
            }
        };

    public EdgesDataTable() {
        super();

        //Add listener of table selection to refresh edit window when the selection changes (and if the table is not being refreshed):
        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (!isRefreshingTable()) {
                    EditWindowController edc = Lookup.getDefault().lookup(EditWindowController.class);
                    if (edc != null && edc.isOpen()) {
                        if (table.getSelectedRow() != -1) {
                            edc.editEdges(getElementsFromSelectedRows().toArray(new Edge[0]));
                        } else {
                            edc.disableEdit();
                        }
                    }
                }
            }
        });

        table.addMouseListener(new EdgesPopupAdapter(this));
        table.addKeyListener(new KeyAdapter() {

            @Override
            public void keyReleased(KeyEvent e) {<FILL_FUNCTION_BODY>}
        });
    }

    @Override
    public List<? extends ElementDataColumn<Edge>> getFakeDataColumns(GraphModel graphModel,
                                                                      DataTablesModel dataTablesModel) {
        ArrayList<PropertyDataColumn<Edge>> propertiesColumns = new ArrayList<>();

        propertiesColumns.add(SOURCE_COLUMN);
        propertiesColumns.add(TARGET_COLUMN);
        propertiesColumns.add(TYPE_COLUMN);
        if (graphModel.isMultiGraph()) {
            propertiesColumns.add(KIND_COLUMN);
        }

        return propertiesColumns;
    }

    public boolean isShowEdgesNodesLabels() {
        return showEdgesNodesLabels;
    }

    public void setShowEdgesNodesLabels(boolean showEdgesNodesLabels) {
        this.showEdgesNodesLabels = showEdgesNodesLabels;
    }
}

                if (e.getKeyCode() == KeyEvent.VK_DELETE) {
                    DataLaboratoryHelper dlh = DataLaboratoryHelper.getDefault();
                    List<Edge> selectedEdges = getElementsFromSelectedRows();
                    if (!selectedEdges.isEmpty()) {
                        EdgesManipulator del = dlh.getEdgesManipulatorByName("DeleteEdges");
                        if (del != null) {
                            del.setup(selectedEdges.toArray(new Edge[0]), null);
                            if (del.canExecute()) {
                                dlh.executeManipulator(del);
                            }
                        }
                    }
                }
            
<methods>public void <init>() ,public Column getColumnAtIndex(int) ,public Edge getElementFromRow(int) ,public List<Edge> getElementsFromSelectedRows() ,public abstract List<? extends ElementDataColumn<Edge>> getFakeDataColumns(GraphModel, org.gephi.desktop.datalab.DataTablesModel) ,public GraphModel getGraphModel() ,public java.lang.String getPattern() ,public JXTable getTable() ,public boolean hasData() ,public boolean isDrawTimeIntervalGraphics() ,public boolean isRefreshingTable() ,public void refreshModel(Edge[], Column[], GraphModel, org.gephi.desktop.datalab.DataTablesModel) ,public void scrollToFirstElementSelected() ,public void scrollToTop() ,public void setDrawSparklines(boolean) ,public void setDrawTimeIntervalGraphics(boolean) ,public void setElementsSelection(List<Edge>) ,public void setElementsSelection(Edge[]) ,public boolean setFilterPattern(java.lang.String, int) <variables>private final DefaultTableRenderer arrayRenderer,private final non-sealed DefaultTableRenderer arraySparklinesGraphicsRenderer,protected final non-sealed org.gephi.datalab.api.AttributeColumnsController attributeColumnsController,private final DefaultTableRenderer defaultStringRepresentationRenderer,private final DefaultTableRenderer doubleRenderer,private boolean drawSparklines,private boolean drawTimeIntervalGraphics,protected java.lang.String filterPattern,protected GraphModel graphModel,private final non-sealed DefaultTableRenderer intervalMapSparklinesGraphicsRenderer,private final non-sealed org.gephi.desktop.datalab.utils.componentproviders.IntervalSetGraphicsComponentProvider intervalSetGraphicsComponentProvider,private final non-sealed DefaultTableRenderer intervalSetGraphicsRenderer,protected ElementsDataTableModel<Edge> model,protected boolean refreshingTable,protected List<Edge> selectedElements,protected Column[] showingColumns,protected final non-sealed JXTable table,private final non-sealed DefaultTableRenderer timeMapRenderer,private final non-sealed DefaultTableRenderer timeSetRenderer,private final non-sealed DefaultTableRenderer timestampMapSparklinesGraphicsRenderer,private final non-sealed org.gephi.desktop.datalab.utils.componentproviders.TimestampSetGraphicsComponentProvider timestampSetGraphicsComponentProvider,private final non-sealed DefaultTableRenderer timestampSetGraphicsRenderer