Loading GUI/src/main/java/cz/fidentis/analyst/gui/elements/dendrogram/Dendrogram.java +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; Loading Loading @@ -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) { Loading GUI/src/main/java/cz/fidentis/analyst/gui/elements/heatmaptable/Heatmap.java +102 −18 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 * Loading @@ -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; Loading Loading @@ -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 * Loading Loading @@ -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 * Loading Loading @@ -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; Loading Loading @@ -500,7 +561,7 @@ public class Heatmap extends JPanel{ public void initializeTable(boolean createRowHeader) { setRowColumnCount(); setTableSize(); setTableHeaderSize(); setTableHeaderSize(areHeadersVisible); if (createRowHeader) { createRowHeader(); Loading @@ -509,7 +570,7 @@ public class Heatmap extends JPanel{ setHeaderText(); setHeadersToVisible(); setRowHeaderHeight(); setRowHeaderHeight(areHeadersVisible); setRowHeaderWidth(); setCellHeight(); setCellWidth(); Loading Loading @@ -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(); } /** Loading Loading @@ -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() { Loading @@ -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(){ Loading Loading @@ -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) { Loading Loading @@ -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() { Loading GUI/src/main/java/cz/fidentis/analyst/gui/elements/heatmaptable/PopupMenu.java +0 −2 Original line number Diff line number Diff line Loading @@ -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 { Loading GUI/src/main/java/cz/fidentis/analyst/gui/elements/heatmaptable/RowHeader.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); } /** Loading GUI/src/main/java/cz/fidentis/analyst/gui/task/batch/distance/BatchDistanceAction.java +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
GUI/src/main/java/cz/fidentis/analyst/gui/elements/dendrogram/Dendrogram.java +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; Loading Loading @@ -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) { Loading
GUI/src/main/java/cz/fidentis/analyst/gui/elements/heatmaptable/Heatmap.java +102 −18 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 * Loading @@ -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; Loading Loading @@ -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 * Loading Loading @@ -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 * Loading Loading @@ -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; Loading Loading @@ -500,7 +561,7 @@ public class Heatmap extends JPanel{ public void initializeTable(boolean createRowHeader) { setRowColumnCount(); setTableSize(); setTableHeaderSize(); setTableHeaderSize(areHeadersVisible); if (createRowHeader) { createRowHeader(); Loading @@ -509,7 +570,7 @@ public class Heatmap extends JPanel{ setHeaderText(); setHeadersToVisible(); setRowHeaderHeight(); setRowHeaderHeight(areHeadersVisible); setRowHeaderWidth(); setCellHeight(); setCellWidth(); Loading Loading @@ -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(); } /** Loading Loading @@ -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() { Loading @@ -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(){ Loading Loading @@ -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) { Loading Loading @@ -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() { Loading
GUI/src/main/java/cz/fidentis/analyst/gui/elements/heatmaptable/PopupMenu.java +0 −2 Original line number Diff line number Diff line Loading @@ -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 { Loading
GUI/src/main/java/cz/fidentis/analyst/gui/elements/heatmaptable/RowHeader.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); } /** Loading
GUI/src/main/java/cz/fidentis/analyst/gui/task/batch/distance/BatchDistanceAction.java +2 −1 Original line number Diff line number Diff line Loading @@ -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