Loading GUI/src/main/java/cz/fidentis/analyst/gui/elements/heatmaptable/Heatmap.java +21 −27 Original line number Diff line number Diff line Loading @@ -2,15 +2,13 @@ package cz.fidentis.analyst.gui.elements.heatmaptable; import cz.fidentis.analyst.engines.face.batch.clustering.dto.ClusterNode; import cz.fidentis.analyst.gui.elements.dendrogram.Dendrogram; import cz.fidentis.analyst.gui.project.ProjectWindow; import cz.fidentis.analyst.gui.task.batch.distanceheatmap.BatchDistanceHeatmapPanel; import cz.fidentis.analyst.data.face.FaceReference; import cz.fidentis.analyst.data.face.FaceService; import cz.fidentis.analyst.data.face.HumanFacesEventBusService; import cz.fidentis.analyst.gui.project.ProjectPanel; import cz.fidentis.analyst.gui.task.batch.distanceheatmap.FaceNodeInfo; import cz.fidentis.analyst.project.ProjectService; import cz.fidentis.analyst.project.Task; import cz.fidentis.analyst.project.TaskService; import org.openide.windows.WindowManager; import javax.swing.BorderFactory; import javax.swing.Box; Loading @@ -36,13 +34,7 @@ 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; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; import java.util.*; /** * A colored interactive heatmap table Loading @@ -62,7 +54,7 @@ public class Heatmap extends JPanel{ private final List<FaceNodeInfo> originalNodeData = new ArrayList<>(); private final Set<Integer> removedIndexes = new HashSet<>(); private final Set<Integer> removedClusteringIndexes = new HashSet<>(); private final PopupMenu popupMenu = new PopupMenu(this); private final PopupMenu popupMenu; private MouseColumnHandler mouseColumnHandler; private double[][] distances; Loading Loading @@ -92,11 +84,9 @@ public class Heatmap extends JPanel{ 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; private Integer getLongestNameLengthInPx = null; /** * Constructor * Loading @@ -110,21 +100,16 @@ public class Heatmap extends JPanel{ double panelWidth, Task task, List<FaceNodeInfo> faceNodeInfoList, ProjectService projectService, FaceService faceService, TaskService taskService, HumanFacesEventBusService humanFacesEventBusService, BatchDistanceHeatmapPanel distanceHeatmapPanel) { this.distanceHeatmapPanel = distanceHeatmapPanel; this.task = task; this.panelHeight = (int) panelHeight; this.panelWidth = (int) panelWidth; this.projectService = projectService; this.faceService = faceService; this.taskService = taskService; this.humanFacesEventBusService = humanFacesEventBusService; this.faceNodeInfoList = faceNodeInfoList; this.popupMenu = new PopupMenu(this, task); this.defaultTableModel = setTableModel(); this.table = new JTable(); Loading Loading @@ -169,11 +154,17 @@ public class Heatmap extends JPanel{ * @return number of pixels the longest cluster short nam takes */ public int getLongestNameLengthInPx() { return faceNodeInfoList.stream() if (getLongestNameLengthInPx != null) { return getLongestNameLengthInPx; } getLongestNameLengthInPx = faceNodeInfoList.stream() .filter(x->x.getClusteredFaceName() != null) .map(FaceNodeInfo::getClusterNameShort) .map(String::length) .max(Integer::compareTo) .orElse(-1) * pixelsPerOneCharacter; .filter(Objects::nonNull) .mapToInt(String::length) .max() .orElse(0) * pixelsPerOneCharacter; return getLongestNameLengthInPx; } /** Loading Loading @@ -945,8 +936,11 @@ public class Heatmap extends JPanel{ } Task newTask = taskService.createTask(faces); ProjectPanel newPanel = new ProjectPanel(projectService, faceService, taskService, humanFacesEventBusService); newPanel.openTaskTab(newTask); ProjectWindow win = (ProjectWindow) WindowManager.getDefault().findTopComponent("ProjectWindow"); if (win == null) { throw new NoSuchElementException("ProjectWindow is null"); } win.getProjectPanel().openTaskTab(newTask); } private void fixColumn(int index){ Loading GUI/src/main/java/cz/fidentis/analyst/gui/elements/heatmaptable/PopupMenu.java +27 −5 Original line number Diff line number Diff line package cz.fidentis.analyst.gui.elements.heatmaptable; import cz.fidentis.analyst.data.face.FaceReference; import cz.fidentis.analyst.gui.task.batch.distanceheatmap.FaceNodeInfo; import cz.fidentis.analyst.project.Task; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; import java.awt.Component; import java.awt.Point; import java.util.List; /** * @author Sabrina Oralkova Loading @@ -14,6 +17,7 @@ import java.awt.Point; public class PopupMenu { private final JPopupMenu popupMenu; private final Heatmap heatmap; private final Task task; private int clickedRow = -1; private int clickedCol = -1; Loading @@ -25,8 +29,9 @@ public class PopupMenu { * * @param heatmap heatmap table */ public PopupMenu(Heatmap heatmap) { public PopupMenu(Heatmap heatmap, Task task) { this.heatmap = heatmap; this.task = task; popupMenu = new JPopupMenu(){ @Override public void show(Component invoker, int x, int y) { Loading @@ -34,9 +39,10 @@ public class PopupMenu { Point pt = SwingUtilities.convertPoint(invoker, x, y, heatmap.getTable()); clickedRow = heatmap.getTable().rowAtPoint(pt); clickedCol = heatmap.getTable().columnAtPoint(pt); boolean isAverageFaceSelected = isAverageFaceSelected(clickedRow, clickedCol); boolean isInsideTableBody = clickedRow >= 0 && clickedCol >= 0 && !isClickedColHeader; if (isInsideTableBody) { setBodyPopupMenu(heatmap); setBodyPopupMenu(heatmap, isAverageFaceSelected); } else if (isClickedColHeader) { isClickedColHeader = false; addRemoveColFaceOption(); Loading @@ -50,16 +56,32 @@ public class PopupMenu { } private void setBodyPopupMenu(Heatmap heatmap) { private void setBodyPopupMenu(Heatmap heatmap, boolean isAverageFaceSelected) { boolean isNotDiagonalCell = heatmap.getRowHeaderTable().getValueAt(clickedRow, 0) != heatmap.getTable().getColumnModel().getColumn(clickedCol).getHeaderValue(); if (isNotDiagonalCell) { if (!isAverageFaceSelected) { addOpenPairFaceOption(); } addRemoveBothFaceOption(); } else { addRemoveDiagonalFaceOption(); if (!isAverageFaceSelected) { addOpenSingleDiagonalFaceOption(); } addRemoveDiagonalFaceOption(); } } private boolean isAverageFaceSelected(int clickedRow, int clickedCol) { String rowFace = ((FaceNodeInfo) heatmap.getRowHeaderTable().getValueAt(clickedRow, 0)).getClusteredFaceName(); List<FaceReference> firstFace = task.getFaces().stream().filter(x -> x.getName().equals(rowFace)).toList(); if (firstFace.getFirst().isAverageFace()) { return true; } String columnFace = ((FaceNodeInfo) heatmap.getTable().getColumnModel().getColumn(clickedCol).getHeaderValue()).getClusteredFaceName(); List<FaceReference> secondFace = task.getFaces().stream().filter(x -> x.getName().equals(columnFace)).toList(); return secondFace.getFirst().isAverageFace(); } public JPopupMenu getPopupMenu() { Loading GUI/src/main/java/cz/fidentis/analyst/gui/task/batch/distanceheatmap/BatchDistanceHeatmapPanel.java +3 −7 Original line number Diff line number Diff line package cz.fidentis.analyst.gui.task.batch.distanceheatmap; import cz.fidentis.analyst.data.face.FaceService; import cz.fidentis.analyst.data.face.HumanFacesEventBusService; import cz.fidentis.analyst.data.face.StoredHumanFace; import cz.fidentis.analyst.engines.face.batch.clustering.dto.ClusterNode; import cz.fidentis.analyst.gui.elements.colorscalepanel.ColorScalePanel; Loading @@ -11,7 +9,6 @@ import cz.fidentis.analyst.gui.elements.heatmaptable.MouseRowHeaderListener; import cz.fidentis.analyst.gui.elements.heatmaptable.RemoveFaceFromHeatmapListener; import cz.fidentis.analyst.gui.task.ControlPanel; import cz.fidentis.analyst.gui.task.batch.distance.BatchControlPanel; import cz.fidentis.analyst.project.ProjectService; import cz.fidentis.analyst.project.Task; import cz.fidentis.analyst.project.TaskService; Loading Loading @@ -94,8 +91,7 @@ public class BatchDistanceHeatmapPanel extends ControlPanel implements BatchCont disableComponents(); this.heatmap = new Heatmap(jPanel7.getPreferredSize().getHeight(), jPanel7.getPreferredSize().getWidth(), task, nodeData, ProjectService.INSTANCE, FaceService.INSTANCE, TaskService.INSTANCE, HumanFacesEventBusService.INSTANCE, this); nodeData, TaskService.INSTANCE, this); this.heatmapTable = heatmap.getTable(); heatmapTable.addMouseMotionListener(addMouseMotionListenerToTable()); Loading Loading @@ -176,8 +172,8 @@ public class BatchDistanceHeatmapPanel extends ControlPanel implements BatchCont public void shift(boolean shift) { int maximumSize = (int) (jPanel7.getPreferredSize().getWidth() - colorScalePanel.getPreferredSize().getWidth() - 10); int variable = shift ? Math.min(heatmap.getLongestNameLengthInPx(), maximumSize) - heatmap.getCellSize() : 0; spacing.setBorder(BorderFactory.createEmptyBorder(0, variable, 0, 0)); int leftBorder = shift ? Math.min(heatmap.getLongestNameLengthInPx(), maximumSize) - heatmap.getCellSize() : 0; spacing.setBorder(BorderFactory.createEmptyBorder(0, leftBorder, 0, 0)); jPanel7.revalidate(); jPanel7.repaint(); } Loading Loading
GUI/src/main/java/cz/fidentis/analyst/gui/elements/heatmaptable/Heatmap.java +21 −27 Original line number Diff line number Diff line Loading @@ -2,15 +2,13 @@ package cz.fidentis.analyst.gui.elements.heatmaptable; import cz.fidentis.analyst.engines.face.batch.clustering.dto.ClusterNode; import cz.fidentis.analyst.gui.elements.dendrogram.Dendrogram; import cz.fidentis.analyst.gui.project.ProjectWindow; import cz.fidentis.analyst.gui.task.batch.distanceheatmap.BatchDistanceHeatmapPanel; import cz.fidentis.analyst.data.face.FaceReference; import cz.fidentis.analyst.data.face.FaceService; import cz.fidentis.analyst.data.face.HumanFacesEventBusService; import cz.fidentis.analyst.gui.project.ProjectPanel; import cz.fidentis.analyst.gui.task.batch.distanceheatmap.FaceNodeInfo; import cz.fidentis.analyst.project.ProjectService; import cz.fidentis.analyst.project.Task; import cz.fidentis.analyst.project.TaskService; import org.openide.windows.WindowManager; import javax.swing.BorderFactory; import javax.swing.Box; Loading @@ -36,13 +34,7 @@ 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; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; import java.util.*; /** * A colored interactive heatmap table Loading @@ -62,7 +54,7 @@ public class Heatmap extends JPanel{ private final List<FaceNodeInfo> originalNodeData = new ArrayList<>(); private final Set<Integer> removedIndexes = new HashSet<>(); private final Set<Integer> removedClusteringIndexes = new HashSet<>(); private final PopupMenu popupMenu = new PopupMenu(this); private final PopupMenu popupMenu; private MouseColumnHandler mouseColumnHandler; private double[][] distances; Loading Loading @@ -92,11 +84,9 @@ public class Heatmap extends JPanel{ 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; private Integer getLongestNameLengthInPx = null; /** * Constructor * Loading @@ -110,21 +100,16 @@ public class Heatmap extends JPanel{ double panelWidth, Task task, List<FaceNodeInfo> faceNodeInfoList, ProjectService projectService, FaceService faceService, TaskService taskService, HumanFacesEventBusService humanFacesEventBusService, BatchDistanceHeatmapPanel distanceHeatmapPanel) { this.distanceHeatmapPanel = distanceHeatmapPanel; this.task = task; this.panelHeight = (int) panelHeight; this.panelWidth = (int) panelWidth; this.projectService = projectService; this.faceService = faceService; this.taskService = taskService; this.humanFacesEventBusService = humanFacesEventBusService; this.faceNodeInfoList = faceNodeInfoList; this.popupMenu = new PopupMenu(this, task); this.defaultTableModel = setTableModel(); this.table = new JTable(); Loading Loading @@ -169,11 +154,17 @@ public class Heatmap extends JPanel{ * @return number of pixels the longest cluster short nam takes */ public int getLongestNameLengthInPx() { return faceNodeInfoList.stream() if (getLongestNameLengthInPx != null) { return getLongestNameLengthInPx; } getLongestNameLengthInPx = faceNodeInfoList.stream() .filter(x->x.getClusteredFaceName() != null) .map(FaceNodeInfo::getClusterNameShort) .map(String::length) .max(Integer::compareTo) .orElse(-1) * pixelsPerOneCharacter; .filter(Objects::nonNull) .mapToInt(String::length) .max() .orElse(0) * pixelsPerOneCharacter; return getLongestNameLengthInPx; } /** Loading Loading @@ -945,8 +936,11 @@ public class Heatmap extends JPanel{ } Task newTask = taskService.createTask(faces); ProjectPanel newPanel = new ProjectPanel(projectService, faceService, taskService, humanFacesEventBusService); newPanel.openTaskTab(newTask); ProjectWindow win = (ProjectWindow) WindowManager.getDefault().findTopComponent("ProjectWindow"); if (win == null) { throw new NoSuchElementException("ProjectWindow is null"); } win.getProjectPanel().openTaskTab(newTask); } private void fixColumn(int index){ Loading
GUI/src/main/java/cz/fidentis/analyst/gui/elements/heatmaptable/PopupMenu.java +27 −5 Original line number Diff line number Diff line package cz.fidentis.analyst.gui.elements.heatmaptable; import cz.fidentis.analyst.data.face.FaceReference; import cz.fidentis.analyst.gui.task.batch.distanceheatmap.FaceNodeInfo; import cz.fidentis.analyst.project.Task; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; import java.awt.Component; import java.awt.Point; import java.util.List; /** * @author Sabrina Oralkova Loading @@ -14,6 +17,7 @@ import java.awt.Point; public class PopupMenu { private final JPopupMenu popupMenu; private final Heatmap heatmap; private final Task task; private int clickedRow = -1; private int clickedCol = -1; Loading @@ -25,8 +29,9 @@ public class PopupMenu { * * @param heatmap heatmap table */ public PopupMenu(Heatmap heatmap) { public PopupMenu(Heatmap heatmap, Task task) { this.heatmap = heatmap; this.task = task; popupMenu = new JPopupMenu(){ @Override public void show(Component invoker, int x, int y) { Loading @@ -34,9 +39,10 @@ public class PopupMenu { Point pt = SwingUtilities.convertPoint(invoker, x, y, heatmap.getTable()); clickedRow = heatmap.getTable().rowAtPoint(pt); clickedCol = heatmap.getTable().columnAtPoint(pt); boolean isAverageFaceSelected = isAverageFaceSelected(clickedRow, clickedCol); boolean isInsideTableBody = clickedRow >= 0 && clickedCol >= 0 && !isClickedColHeader; if (isInsideTableBody) { setBodyPopupMenu(heatmap); setBodyPopupMenu(heatmap, isAverageFaceSelected); } else if (isClickedColHeader) { isClickedColHeader = false; addRemoveColFaceOption(); Loading @@ -50,16 +56,32 @@ public class PopupMenu { } private void setBodyPopupMenu(Heatmap heatmap) { private void setBodyPopupMenu(Heatmap heatmap, boolean isAverageFaceSelected) { boolean isNotDiagonalCell = heatmap.getRowHeaderTable().getValueAt(clickedRow, 0) != heatmap.getTable().getColumnModel().getColumn(clickedCol).getHeaderValue(); if (isNotDiagonalCell) { if (!isAverageFaceSelected) { addOpenPairFaceOption(); } addRemoveBothFaceOption(); } else { addRemoveDiagonalFaceOption(); if (!isAverageFaceSelected) { addOpenSingleDiagonalFaceOption(); } addRemoveDiagonalFaceOption(); } } private boolean isAverageFaceSelected(int clickedRow, int clickedCol) { String rowFace = ((FaceNodeInfo) heatmap.getRowHeaderTable().getValueAt(clickedRow, 0)).getClusteredFaceName(); List<FaceReference> firstFace = task.getFaces().stream().filter(x -> x.getName().equals(rowFace)).toList(); if (firstFace.getFirst().isAverageFace()) { return true; } String columnFace = ((FaceNodeInfo) heatmap.getTable().getColumnModel().getColumn(clickedCol).getHeaderValue()).getClusteredFaceName(); List<FaceReference> secondFace = task.getFaces().stream().filter(x -> x.getName().equals(columnFace)).toList(); return secondFace.getFirst().isAverageFace(); } public JPopupMenu getPopupMenu() { Loading
GUI/src/main/java/cz/fidentis/analyst/gui/task/batch/distanceheatmap/BatchDistanceHeatmapPanel.java +3 −7 Original line number Diff line number Diff line package cz.fidentis.analyst.gui.task.batch.distanceheatmap; import cz.fidentis.analyst.data.face.FaceService; import cz.fidentis.analyst.data.face.HumanFacesEventBusService; import cz.fidentis.analyst.data.face.StoredHumanFace; import cz.fidentis.analyst.engines.face.batch.clustering.dto.ClusterNode; import cz.fidentis.analyst.gui.elements.colorscalepanel.ColorScalePanel; Loading @@ -11,7 +9,6 @@ import cz.fidentis.analyst.gui.elements.heatmaptable.MouseRowHeaderListener; import cz.fidentis.analyst.gui.elements.heatmaptable.RemoveFaceFromHeatmapListener; import cz.fidentis.analyst.gui.task.ControlPanel; import cz.fidentis.analyst.gui.task.batch.distance.BatchControlPanel; import cz.fidentis.analyst.project.ProjectService; import cz.fidentis.analyst.project.Task; import cz.fidentis.analyst.project.TaskService; Loading Loading @@ -94,8 +91,7 @@ public class BatchDistanceHeatmapPanel extends ControlPanel implements BatchCont disableComponents(); this.heatmap = new Heatmap(jPanel7.getPreferredSize().getHeight(), jPanel7.getPreferredSize().getWidth(), task, nodeData, ProjectService.INSTANCE, FaceService.INSTANCE, TaskService.INSTANCE, HumanFacesEventBusService.INSTANCE, this); nodeData, TaskService.INSTANCE, this); this.heatmapTable = heatmap.getTable(); heatmapTable.addMouseMotionListener(addMouseMotionListenerToTable()); Loading Loading @@ -176,8 +172,8 @@ public class BatchDistanceHeatmapPanel extends ControlPanel implements BatchCont public void shift(boolean shift) { int maximumSize = (int) (jPanel7.getPreferredSize().getWidth() - colorScalePanel.getPreferredSize().getWidth() - 10); int variable = shift ? Math.min(heatmap.getLongestNameLengthInPx(), maximumSize) - heatmap.getCellSize() : 0; spacing.setBorder(BorderFactory.createEmptyBorder(0, variable, 0, 0)); int leftBorder = shift ? Math.min(heatmap.getLongestNameLengthInPx(), maximumSize) - heatmap.getCellSize() : 0; spacing.setBorder(BorderFactory.createEmptyBorder(0, leftBorder, 0, 0)); jPanel7.revalidate(); jPanel7.repaint(); } Loading