Commit 59311cb3 authored by Radek Ošlejšek's avatar Radek Ošlejšek
Browse files

Merge branch '371-Fix-opening-pair-analysis-from-batch-processing' into 'master'

Remove opeTask option for average face

Closes #371

See merge request grp-fidentis/analyst2!427
parents 4ef49eed 1f3a1679
Loading
Loading
Loading
Loading
+21 −27
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -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;
@@ -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
     *
@@ -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();

@@ -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;
    }

    /**
@@ -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){
+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
@@ -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;
@@ -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) {
@@ -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();
@@ -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() {
+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;
@@ -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;

@@ -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());
@@ -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();
    }