class MergeNodes extends BasicNodesManipulator {

    public static final String DELETE_MERGED_NODES_SAVED_PREFERENCES = "MergeNodes_DeleteMergedNodes";
    private Node[] nodes;
    private Node selectedNode;
    private Column[] columns;
    private AttributeRowsMergeStrategy[] mergeStrategies;
    private boolean deleteMergedNodes;

    @Override
    public void setup(Node[] nodes, Node clickedNode) {<FILL_FUNCTION_BODY>}

    @Override
    public void execute() {
        Graph graph = Lookup.getDefault().lookup(GraphController.class).getGraphModel().getGraph();

        GraphElementsController gec = Lookup.getDefault().lookup(GraphElementsController.class);
        Node newNode = gec.mergeNodes(graph, nodes, selectedNode, columns, mergeStrategies, deleteMergedNodes);
        Lookup.getDefault().lookup(DataTablesController.class).setNodeTableSelection(new Node[] {newNode});
        NbPreferences.forModule(MergeNodes.class).putBoolean(DELETE_MERGED_NODES_SAVED_PREFERENCES, deleteMergedNodes);
    }

    @Override
    public String getName() {
        return NbBundle.getMessage(MergeNodes.class, "MergeNodes.name");
    }

    @Override
    public String getDescription() {
        return NbBundle.getMessage(MergeNodes.class, "MergeNodes.description");
    }

    @Override
    public boolean canExecute() {
        return nodes.length > 1;
    }

    @Override
    public ManipulatorUI getUI() {
        return new MergeNodesUI();
    }

    @Override
    public int getType() {
        return 500;
    }

    @Override
    public int getPosition() {
        return 0;
    }

    @Override
    public Icon getIcon() {
        return ImageUtilities.loadImageIcon("DataLaboratoryPlugin/merge.png", false);
    }

    public boolean isDeleteMergedNodes() {
        return deleteMergedNodes;
    }

    public void setDeleteMergedNodes(boolean deleteMergedNodes) {
        this.deleteMergedNodes = deleteMergedNodes;
    }

    public Node[] getNodes() {
        return nodes;
    }

    public Node getSelectedNode() {
        return selectedNode;
    }

    public void setSelectedNode(Node selectedNode) {
        this.selectedNode = selectedNode;
    }

    public Column[] getColumns() {
        return columns;
    }

    public AttributeRowsMergeStrategy[] getMergeStrategies() {
        return mergeStrategies;
    }

    public void setMergeStrategies(AttributeRowsMergeStrategy[] mergeStrategies) {
        this.mergeStrategies = mergeStrategies;
    }
}

        this.nodes = nodes;
        selectedNode = clickedNode != null ? clickedNode : nodes[0];

        Table nodeTable = Lookup.getDefault().lookup(GraphController.class).getGraphModel().getNodeTable();
        List<Column> columnsList = new ArrayList<>();
        for (Column column : nodeTable) {
            if (!column.isReadOnly()) {
                columnsList.add(column);
            }
        }

        columns = columnsList.toArray(new Column[0]);

        mergeStrategies = new AttributeRowsMergeStrategy[columns.length];
        deleteMergedNodes =
            NbPreferences.forModule(MergeNodes.class).getBoolean(DELETE_MERGED_NODES_SAVED_PREFERENCES, true);
    
<methods>public non-sealed void <init>() ,public java.lang.Integer getMnemonicKey() ,public org.gephi.datalab.spi.ContextMenuItemManipulator[] getSubItems() ,public boolean isAvailable() <variables>