Commit 4b54f06c authored by Sabrina Orálková's avatar Sabrina Orálková Committed by Radek Ošlejšek
Browse files

Batch heatmap table visualization refactoring

parent 77fd986e
Loading
Loading
Loading
Loading
+1 −13
Original line number Diff line number Diff line
package cz.fidentis.analyst.gui.elements.dendrogram;

import cz.fidentis.analyst.engines.face.batch.clustering.dto.ClusterNode;
import cz.fidentis.analyst.engines.face.batch.clustering.dto.Distance;

import javax.swing.JPanel;
import java.awt.Color;
@@ -165,19 +164,8 @@ public class Dendrogram extends JPanel {
    }

    private int getDistance(DrawingNode leftSubTree, DrawingNode rightSubtree) {
        Distance leftDistance = leftSubTree.getClusterNode().getDistance();
        Distance rightDistance = rightSubtree.getClusterNode().getDistance();
        double left = 0;
        double right = 0;
        if (leftDistance != null) {
            left = leftDistance.getDistance();
        }
        if (rightDistance != null) {
            right = rightDistance.getDistance();
        }
        int distance = (int) Math.abs(left - right) + ySpacing;
        int zeroLine = Math.max(leftSubTree.getPoint().y(), rightSubtree.getPoint().y());
        return zeroLine + distance;
        return zeroLine + ySpacing;
    }

    private void highlightPath(ClusterNode clusterNodeA, ClusterNode clusterNodeB) {
+102 −18
Original line number Diff line number Diff line
@@ -31,7 +31,11 @@ import javax.swing.table.TableColumnModel;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -74,23 +78,25 @@ public class Heatmap extends JPanel{
    private int clickedHeader = OUT_OF_RANGE_INDEX;
    private ClusterNode rootNode;
    private boolean isDendrogramVisible;
    private boolean areHeadersVisible;

    private final Color whiteColor = Color.white;
    private final Color borderColor = Color.LIGHT_GRAY;


    private final int headerColumnIndex = 0;
    private final int additionalColumn = 1;
    private final int additionalRow = 1;
    private final int additionalBorderPixels = 2;
    private final int cellSize = 30;
    private final int initialDendrogramWidth = 300;
    private final int pixelsPerOneCharacter = 7;

    private final DefaultTableModel defaultTableModel;
    private final ProjectService projectService;
    private final FaceService faceService;
    private final TaskService taskService;
    private final HumanFacesEventBusService humanFacesEventBusService;
    private final BatchDistanceHeatmapPanel distanceHeatmapPanel;
    /**
     * Constructor
     *
@@ -109,6 +115,7 @@ public class Heatmap extends JPanel{
                   TaskService taskService,
                   HumanFacesEventBusService humanFacesEventBusService,
                   BatchDistanceHeatmapPanel distanceHeatmapPanel) {
        this.distanceHeatmapPanel = distanceHeatmapPanel;
        this.task = task;
        this.panelHeight = (int) panelHeight;
        this.panelWidth = (int) panelWidth;
@@ -156,6 +163,31 @@ public class Heatmap extends JPanel{
        rowHeader.getMouseRowHandler().setMouseRowHeaderListener(distanceHeatmapPanel);
    }

    /**
     * Gets number of pixels the longest cluster short nam takes
     *
     * @return number of pixels the longest cluster short nam takes
     */
    public int getLongestNameLengthInPx() {
        return faceNodeInfoList.stream()
                .map(FaceNodeInfo::getClusterNameShort)
                .map(String::length)
                .max(Integer::compareTo)
                .orElse(-1) * pixelsPerOneCharacter;
    }

    /**
     * Checks if heatmap headers are visible
     *
     * @return headers are visible
     */
    public boolean areHeadersVisible() {
        return areHeadersVisible;
    }

    public int getCellSize() {
        return cellSize;
    }
    /**
     * Gets mouse column handler
     *
@@ -304,6 +336,34 @@ public class Heatmap extends JPanel{
        this.distances = distances;
    }

    /**
     * Sets text in headers visible
     */
    public void setTextInHeadersVisible() {
        setTextInHeadersVisibility(true);
    }

    /**
     * Sets text in headers invisible
     */
    public void setTextInHeadersInvisible() {
        setTextInHeadersVisibility(false);
    }

    private void setTextInHeadersVisibility(boolean visible) {
        if (areHeadersVisible == visible) {
            return;
        }
        areHeadersVisible = visible;
        setRowHeaderHeight(visible);
        setTableHeaderSize(visible);
        setTableSize();
        rowHeader.setRowHeaderBackground(whiteColor, visible);
        distanceHeatmapPanel.shift(visible);
        this.revalidate();
        this.repaint();
    }

    /**
     * Sets node data
     *
@@ -381,8 +441,9 @@ public class Heatmap extends JPanel{
     * scroll panes activate
     */
    public void setTableSize() {
        int heatmapHeight = cellSize * (table.getRowCount() + additionalRow) + additionalBorderPixels;
        int heatmapWidth = cellSize * (table.getColumnCount() + additionalColumn) + additionalBorderPixels;
        var additionalHeaderSize = areHeadersVisible ? getLongestNameLengthInPx() - cellSize : 0;
        int heatmapHeight = cellSize * (table.getRowCount() + additionalRow) + additionalBorderPixels + additionalHeaderSize;
        int heatmapWidth = cellSize * (table.getColumnCount() + additionalColumn) + additionalBorderPixels + additionalHeaderSize;
        int sliderWidth = (int) heatmapScrollPanel.getVerticalScrollBar().getPreferredSize().getWidth();
        int heatmapSliderWidth = heatmapWidth + sliderWidth;
        int scrollPaneHeight = heatmapHeight + additionalBorderPixels;
@@ -500,7 +561,7 @@ public class Heatmap extends JPanel{
    public void initializeTable(boolean createRowHeader) {
        setRowColumnCount();
        setTableSize();
        setTableHeaderSize();
        setTableHeaderSize(areHeadersVisible);

        if (createRowHeader) {
            createRowHeader();
@@ -509,7 +570,7 @@ public class Heatmap extends JPanel{
        setHeaderText();
        setHeadersToVisible();

        setRowHeaderHeight();
        setRowHeaderHeight(areHeadersVisible);
        setRowHeaderWidth();
        setCellHeight();
        setCellWidth();
@@ -550,7 +611,7 @@ public class Heatmap extends JPanel{
     * @return True if the heatmap is visible, false otherwise
     */
    public boolean isHeatmapVisible() {
        return heatmapScrollPanel.isVisible();
        return scrollPane.isVisible();
    }

    /**
@@ -679,8 +740,9 @@ public class Heatmap extends JPanel{
        }
    }

    private void setRowHeaderHeight() {
        rowHeader.setRowHeaderWidth(cellSize);
    private void setRowHeaderHeight(boolean isLarge) {
        var value = isLarge ? getLongestNameLengthInPx() : cellSize;
        rowHeader.setRowHeaderWidth(value);
    }

    private void setRowHeaderWidth() {
@@ -697,8 +759,9 @@ public class Heatmap extends JPanel{
        }
    }

    private void setTableHeaderSize() {
        table.getTableHeader().setPreferredSize(new Dimension(table.getWidth(), cellSize));
    private void setTableHeaderSize(boolean isLarge) {
        var value = isLarge ? getLongestNameLengthInPx() : cellSize;
        table.getTableHeader().setPreferredSize(new Dimension(table.getWidth(), value));
    }

    private DefaultTableCellRenderer setDefaultTableCellRenderer(){
@@ -755,6 +818,27 @@ public class Heatmap extends JPanel{

    private DefaultTableCellRenderer setTableHeaderRenderer() {
        return new DefaultTableCellRenderer() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);

                Graphics2D g2 = (Graphics2D) g;
                AffineTransform old = g2.getTransform();
                FontMetrics fm = g2.getFontMetrics();

                g2.setClip(0, 0, getWidth(), getHeight());
                g2.setColor(areHeadersVisible ? Color.BLACK : whiteColor);
                g2.setFont(rowHeader.getRowHeaderTable().getFont());
                g2.setBackground(whiteColor);
                AffineTransform at = new AffineTransform();
                at.translate(getWidth(), getHeight());
                g2.transform(at);
                g2.rotate(Math.toRadians(-90));

                g2.drawString(getText(), 0,  Math.round((float) (fm.getAscent() - cellSize) /2));
                g2.setTransform(old);
            }

            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                                                           boolean hasFocus, int row, int column) {
@@ -818,7 +902,7 @@ public class Heatmap extends JPanel{
    private void createRowHeader() {
        rowHeader = new RowHeader(defaultTableModel, heatmapScrollPanel);
        rowHeaderTable = getRowHeaderTable();
        rowHeader.setRowHeaderBackground(whiteColor);
        rowHeader.setRowHeaderBackground(whiteColor, areHeadersVisible);
    }

    private void createMouseColumnHandler() {
+0 −2
Original line number Diff line number Diff line
@@ -54,8 +54,6 @@ public class PopupMenu {
        boolean isNotDiagonalCell = heatmap.getRowHeaderTable().getValueAt(clickedRow, 0)
                != heatmap.getTable().getColumnModel().getColumn(clickedCol).getHeaderValue();
        if (isNotDiagonalCell) {
            addOpenSingleRowFaceOption();
            addOpenSingleColFaceOption();
            addOpenPairFaceOption();
            addRemoveBothFaceOption();
        } else {
+2 −2
Original line number Diff line number Diff line
@@ -104,9 +104,9 @@ public class RowHeader {
     *
     * @param color chosen color for setting background and foreground for row header
     */
    public void setRowHeaderBackground(Color color) {
    public void setRowHeaderBackground(Color color, boolean headerVisible) {
        rowHeader.setBackground(color);
        rowHeader.setForeground(color);
        rowHeader.setForeground(headerVisible ? Color.BLACK : color);
    }

    /**
+2 −1
Original line number Diff line number Diff line
@@ -106,7 +106,8 @@ public class BatchDistanceAction extends ControlPanelAction<BatchDistancePanel>
    }

    /**
     * Shows the face
     * Shows the selected face.
     * The face is shown in the scene and the listener is notified.
     */
    public void showFace() {
        showSelectedFace();
Loading