/*
* #%L
* org.gitools.ui.app
* %%
* Copyright (C) 2013 - 2014 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.app.heatmap.panel.details.boxes;
import org.apache.commons.lang.StringUtils;
import org.gitools.heatmap.Heatmap;
import org.gitools.heatmap.HeatmapDimension;
import org.gitools.heatmap.decorator.DetailsDecoration;
import org.gitools.heatmap.header.HeatmapHeader;
import org.gitools.heatmap.header.HierarchicalClusterHeatmapHeader;
import org.gitools.ui.app.actions.edit.AddHeaderAction;
import org.gitools.ui.app.actions.edit.AnnotationAction;
import org.gitools.ui.app.actions.edit.EditHeaderAction;
import org.gitools.ui.app.heatmap.panel.details.boxes.actions.DimensionHeaderHighlightAction;
import org.gitools.ui.app.heatmap.panel.details.boxes.actions.SelectHeaderAction;
import org.gitools.ui.core.actions.ActionSet;
import org.gitools.ui.core.actions.dynamicactions.DynamicActionsManager;
import org.gitools.ui.core.actions.dynamicactions.IHeatmapHeaderAction;
import org.gitools.ui.core.components.boxes.DetailsBox;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import static org.gitools.heatmap.HeatmapDimension.*;
import static org.gitools.heatmap.header.HierarchicalClusterHeatmapHeader.PROPERTY_INTERACTION_LEVEL;
import static org.gitools.ui.core.interaction.Interaction.highlighting;
import static org.gitools.ui.core.interaction.Interaction.movingSelected;
import static org.gitools.ui.core.interaction.InteractionStatus.isInteracting;
import static org.gitools.utils.events.EventUtils.isAny;
public class DimensionBox extends DetailsBox {
private final HeatmapDimension dimension;
private MouseAdapter bottomActionMouseAdapter;
/**
* @param title Optional title of the details table
* @param actions
* @param dimension
*/
public DimensionBox(String title, ActionSet actions, Heatmap heatmap, HeatmapDimension dimension) {
super(dimension.getId().name(),
title,
actions,
new ActionSet(new AnnotationAction(dimension.getId()), new AddHeaderAction(dimension.getId()), actions),
heatmap);
this.dimension = dimension;
}
@Override
public void registerListeners() {
dimension.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ((isAny(evt, HeatmapDimension.class,
PROPERTY_FOCUS,
PROPERTY_HEADERS,
PROPERTY_SELECTED,
PROPERTY_SELECTED_HEADER,
PROPERTY_VISIBLE)) ||
isAny(evt, HierarchicalClusterHeatmapHeader.class,
PROPERTY_INTERACTION_LEVEL)) {
update();
}
}
});
}
@Override
public void update() {
update(false);
}
private void update(boolean force) {
if (!force && isInteracting(movingSelected, highlighting)) {
return;
}
String lead = dimension.getFocus();
String label = StringUtils.capitalize(dimension.getId().getLabel());
if (lead != null) {
this.setTitle(label + ": " + lead + " [" + (dimension.indexOf(lead) + 1) + "]");
} else {
this.setTitle(label);
}
List<DetailsDecoration> details = new ArrayList<>();
dimension.populateDetails(details);
this.draw(details);
}
@Override
public boolean isVisible() {
return true;
}
@Override
protected void onMouseSingleClick(DetailsDecoration propertyItem) {
Object reference = propertyItem.getReference();
if (reference instanceof HeatmapHeader) {
HeatmapHeader header = (HeatmapHeader) reference;
dimension.setSelectedHeader(header);
new SelectHeaderAction(dimension, header).actionPerformed(null);
new DimensionHeaderHighlightAction(dimension, header).actionPerformed(null);
update(true);
}
}
@Override
protected void onMouseDoubleClick(DetailsDecoration detail) {
Object reference = detail.getReference();
if (reference instanceof HeatmapHeader) {
new EditHeaderAction((HeatmapHeader) reference).actionPerformed(null);
}
}
@Override
protected void onMouseRightClick(DetailsDecoration propertyItem, MouseEvent e) {
if (propertyItem.getReference() instanceof HeatmapHeader) {
DynamicActionsManager.updatePopupMenu(popupMenu, IHeatmapHeaderAction.class, (HeatmapHeader) propertyItem.getReference(), null);
popupMenu.show(e.getComponent(), e.getX(), e.getY());
}
}
@Override
public MouseListener getBottomActionMouseAdapter() {
if (bottomActionMouseAdapter == null) {
bottomActionMouseAdapter = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
DynamicActionsManager.updateDynamicActionSet(bottomActionSet, IHeatmapHeaderAction.class, dimension.getSelectedHeader(), null);
}
@Override
public void mouseReleased(MouseEvent e) {
DynamicActionsManager.updateDynamicActionSet(bottomActionSet, IHeatmapHeaderAction.class, dimension.getSelectedHeader(), null);
}
};
}
return bottomActionMouseAdapter;
}
}