Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
GraphWindow.java 4.24 KiB
package fucoin.gui.gephi;

import org.gephi.graph.api.Node;
import org.gephi.preview.api.*;
import org.gephi.preview.types.DependantOriginalColor;
import org.gephi.project.api.Workspace;
import org.openide.util.Lookup;

import javax.swing.*;
import java.awt.*;
import java.lang.reflect.Field;
import java.util.*;
import java.util.List;

public class GraphWindow extends JFrame implements NodeMouseListener {

    protected List<NodeClickHandler> clickHandlers = new ArrayList<>();
    private final PreviewController previewController;
    private final PreviewSketch previewSketch;

    private JLabel infobarText;

    public GraphWindow() {
        super();

        setTitle("Network Overlay Graph");

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        previewController = Lookup.getDefault().lookup(PreviewController.class);
        PreviewModel previewModel = previewController.getModel();
        previewModel.getProperties().putValue(PreviewProperty.SHOW_NODE_LABELS, Boolean.TRUE);
        previewModel.getProperties().putValue(PreviewProperty.NODE_LABEL_COLOR, new DependantOriginalColor(Color.BLACK));

        Font labelFont = new Font("Verdana", Font.PLAIN, 5);
        previewModel.getProperties().putValue(PreviewProperty.NODE_LABEL_FONT, labelFont);
        previewModel.getProperties().putValue(PreviewProperty.EDGE_CURVED, Boolean.FALSE);
        previewModel.getProperties().putValue(PreviewProperty.EDGE_OPACITY, 50);
        previewModel.getProperties().putValue(PreviewProperty.EDGE_RADIUS, 10f);
        previewModel.getProperties().putValue("graphWindow.mouse.handler", this);

        G2DTarget target = (G2DTarget) previewController.getRenderTarget(RenderTarget.G2D_TARGET);
        previewSketch = new PreviewSketch(target, isRetina());

        infobarText = new JLabel("Click on a node to see further information.", SwingConstants.LEFT);

        this.add(previewSketch, BorderLayout.CENTER);

        JPanel infobar = new JPanel(new BorderLayout());
        infobar.add(infobarText, BorderLayout.WEST);

        JPanel zoomOptions = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 2));
        zoomOptions.add(new JLabel("Zoom: "));

        Dimension zoomBtnSize = new Dimension(20, 20);

        JButton minusButton = new JButton("-");
        minusButton.setPreferredSize(zoomBtnSize);
        minusButton.addActionListener(e -> previewSketch.zoomMinus());
        zoomOptions.add(minusButton);

        JButton resetButton = new JButton("0");
        resetButton.setPreferredSize(zoomBtnSize);
        resetButton.addActionListener(e -> previewSketch.resetZoom());
        zoomOptions.add(resetButton);

        JButton plusButton = new JButton("+");
        plusButton.setPreferredSize(zoomBtnSize);
        plusButton.addActionListener(e -> previewSketch.zoomPlus());
        zoomOptions.add(plusButton);

        infobar.add(zoomOptions, BorderLayout.EAST);
        this.add(infobar, BorderLayout.SOUTH);

        previewController.refreshPreview();
        previewSketch.resetZoom();


        this.setSize(800, 600);
    }

    public static boolean isRetina() {
        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        final GraphicsDevice device = env.getDefaultScreenDevice();

        try {
            Field field = device.getClass().getDeclaredField("scale");

            if (field != null) {
                field.setAccessible(true);
                Object scale = field.get(device);

                if (scale instanceof Integer && (Integer) scale == 2) {
                    return true;
                }
            }
        } catch (Exception ignore) {
        }
        return false;
    }

    @Override
    public void mouseClicked(Node node, PreviewMouseEvent event, PreviewProperties properties, Workspace workspace) {
        clickHandlers.stream().forEach(nodeClickHandler -> nodeClickHandler.accept(node, event));
    }

    public void addNodeClickHandler(NodeClickHandler handler) {
        clickHandlers.add(handler);
    }

    @Override
    public void setVisible(boolean b) {
        super.setVisible(b);

        previewController.refreshPreview();
        previewSketch.refreshSketch();
    }

    public void setInfobarText(String text) {
        SwingUtilities.invokeLater(() -> infobarText.setText(text));
    }
}