Node.java Source code

Java tutorial

Introduction

Here is the source code for Node.java

Source

/* My attempt to visualize a git-repository. This program uses JGit to interact with the repository.
 * Copyright (C) 2014  grasserik
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.beans.Transient;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

import javax.swing.JComponent;
import javax.swing.JLabel;

import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;

public class Node extends JComponent implements Comparable<Node> {
    private static final long serialVersionUID = 5542054625603014824L;
    String key;
    String author;
    int date;
    String fullMessage;
    String shortMessage;
    ArrayList<Node> children;
    ArrayList<Node> parents;
    static HashMap<String, Node> nodeMap = new HashMap<String, Node>();
    static JLabel renderer = new JLabel();
    int rank = 0;
    static int gap = 6;

    public static void createNode(RevWalk walk, Ref ref, boolean recur) throws IOException {
        Node.createNode(walk, ref.getObjectId(), recur);
    }

    public static Node createNode(RevWalk walk, ObjectId id, boolean recur) throws IOException {
        String key = id.getName();
        RevCommit commit;
        Node node;

        if (nodeMap.containsKey(key)) {
            // commit node was already mapped
            node = nodeMap.get(key);
        } else {
            // create new commit node
            commit = walk.parseCommit(id);
            node = new Node(key, commit.getAuthorIdent().getEmailAddress(), commit.getCommitTime(),
                    commit.getFullMessage(), commit.getShortMessage());
            node.setBackground(new Color(240, 240, 255));
            node.setForeground(new Color(0, 0, 127));

            if (recur) {
                // add parent nodes
                for (ObjectId parentCommit : commit.getParents())
                    node.addParent(Node.createNode(walk, parentCommit, recur));
            }
        }

        return node;
    }

    Node() {
        this.children = new ArrayList<Node>();
        this.parents = new ArrayList<Node>();
    }

    public Node(String key, String author, Integer date, String fullMessage, String shortMessage) {
        // assign fields
        this.key = key;
        this.author = author;
        this.date = date;
        this.fullMessage = fullMessage;
        this.shortMessage = shortMessage;
        this.children = new ArrayList<Node>();
        this.parents = new ArrayList<Node>();

        // put node in map
        nodeMap.put(key, this);

        // set tooltip
        setToolTipText(fullMessage);
    }

    public void addParent(Node parent) {
        // add parent node and set this node as child of parent
        if (parent != null && !parents.contains(parent)) {
            parents.add(parent);
            parent.children.add(this);
        }
    };

    @Override
    public int compareTo(Node other) {
        return this.date - other.date;
    }

    @Override
    @Transient
    public Dimension getMinimumSize() {
        return getPreferredSize();
    }

    @Override
    @Transient
    public Dimension getPreferredSize() {
        Dimension dim = new Dimension(2 * gap, 2 * gap);

        renderer.setText(key);
        Dimension pref = renderer.getPreferredSize();
        dim.height += pref.height + 3;

        renderer.setText(author);
        pref = renderer.getPreferredSize();
        dim.width = Math.max(pref.width + 2 * gap, dim.width);
        dim.height += pref.height + 2;

        Date dat = new Date(date * 1000L);
        renderer.setText(dat.toString());
        pref = renderer.getPreferredSize();
        dim.width = Math.max(pref.width + 2 * gap, dim.width);
        dim.height += pref.height + 3;

        renderer.setText(shortMessage);
        pref = renderer.getPreferredSize();
        dim.height += pref.height;

        return dim;
    }

    @Override
    @Transient
    public Dimension getMaximumSize() {
        return getPreferredSize();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g2.setColor(getBackground());
        g2.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, gap, gap);
        g2.setColor(getForeground());
        g2.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, gap, gap);
        g2.drawRoundRect(1, 1, getWidth() - 3, getHeight() - 3, gap - 2, gap - 2);

        int w = getPreferredSize().width - 2 * gap;

        g2.translate(gap - 1, gap - 1);
        renderer.setText(key);
        renderer.setSize(w, renderer.getPreferredSize().height);
        renderer.paint(g2);

        g2.translate(0, renderer.getHeight() + 2);
        g2.drawLine(0, 0, getWidth() - 2 * gap, 0);

        g2.translate(0, 2);
        renderer.setText(author);
        renderer.setSize(w, renderer.getPreferredSize().height);
        renderer.paint(g2);

        g2.translate(0, renderer.getHeight() + 2);

        if (date > 0) {
            Date dat = new Date(date * 1000L);
            renderer.setText(dat.toString());
        } else {
            renderer.setText(null);
        }

        renderer.setSize(w, renderer.getPreferredSize().height);
        renderer.paint(g2);

        g2.translate(0, renderer.getHeight() + 2);
        g2.drawLine(0, 0, getWidth() - 2 * gap, 0);

        g2.translate(0, 2);
        renderer.setText(shortMessage);
        renderer.setSize(w, renderer.getPreferredSize().height);
        renderer.paint(g2);
        g2.dispose();
    }
}