/* * #%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 com.alee.laf.label.WebLabel; import com.jgoodies.binding.adapter.ComboBoxAdapter; import com.jgoodies.binding.beans.PropertyAdapter; import com.jgoodies.binding.list.SelectionInList; import org.gitools.heatmap.Heatmap; import org.gitools.heatmap.HeatmapDimension; import org.gitools.heatmap.HeatmapLayer; import org.gitools.heatmap.HeatmapLayers; import org.gitools.heatmap.decorator.Decoration; import org.gitools.heatmap.decorator.Decorator; import org.gitools.heatmap.decorator.DetailsDecoration; import org.gitools.ui.app.actions.edit.AddNewLayerFromDataTransformation; import org.gitools.ui.app.actions.edit.AddNewLayersFromFileAction; import org.gitools.ui.app.actions.edit.EditLayerAction; import org.gitools.ui.app.actions.edit.SetLayerAction; import org.gitools.ui.core.actions.ActionSet; import org.gitools.ui.core.actions.dynamicactions.DynamicActionsManager; import org.gitools.ui.core.actions.dynamicactions.IHeatmapLayerAction; import org.gitools.ui.core.components.boxes.DetailsBox; import org.jdesktop.swingx.HorizontalLayout; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; 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.Collections; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import static org.gitools.heatmap.AbstractMatrixViewDimension.*; import static org.gitools.heatmap.HeatmapLayer.*; import static org.gitools.heatmap.HeatmapLayers.*; import static org.gitools.ui.core.interaction.Interaction.movingSelected; import static org.gitools.ui.core.interaction.InteractionStatus.getInteractionStatus; import static org.gitools.utils.events.EventUtils.isAny; public class LayerValuesBox extends DetailsBox { private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); public static final String ID = "LAYER_VALUES"; private MouseListener bottomActionMouseAdapter; /** * @param title Optional title of the details table * @param actions */ public LayerValuesBox(String title, ActionSet actions, Heatmap heatmap) { super(ID, title, actions, new ActionSet(new AddNewLayersFromFileAction(), new AddNewLayerFromDataTransformation(), actions), heatmap); addGroupSelector(); } private void addGroupSelector() { HeatmapLayers layers = getHeatmap().getLayers(); if (layers.getGroups().size() < 2) { return; } JPanel groupsSelectorPanel = new JPanel(new HorizontalLayout(2), true); groupsSelectorPanel.setBackground(Color.white); JComboBox<Object> groupsSelector = new JComboBox<>(); List<String> groups = new ArrayList<>(layers.getGroups()); Collections.sort(groups); groupsSelector.setModel( new ComboBoxAdapter<>( new SelectionInList<>( groups, new PropertyAdapter<>(layers, PROPERTY_SELECTED_GROUP) ) ) ); groupsSelectorPanel.add(new WebLabel("Data listed: ")); groupsSelectorPanel.add(groupsSelector); bottomPanels.add(groupsSelectorPanel); } @Override public void registerListeners() { Heatmap heatmap = getHeatmap(); PropertyChangeListener updateLayers = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ((getInteractionStatus() != movingSelected) && (isAny(evt, HeatmapDimension.class, PROPERTY_FOCUS, PROPERTY_SELECTED, PROPERTY_VISIBLE) || isAny(evt, HeatmapLayer.class, PROPERTY_DECORATOR, PROPERTY_SHORT_FORMATTER, PROPERTY_LONG_FORMATTER, PROPERTY_NAME, PROPERTY_DESCRIPTION, PROPERTY_DESCRIPTION_URL, PROPERTY_VALUE_URL ) || isAny(evt, HeatmapLayers.class, PROPERTY_TOP_LAYER, PROPERTY_LAYERS, PROPERTY_SELECTED_GROUP)) ) { update(); } } }; heatmap.getRows().addPropertyChangeListener(updateLayers); heatmap.getColumns().addPropertyChangeListener(updateLayers); heatmap.getLayers().addPropertyChangeListener(updateLayers); heatmap.getLayers().getTopLayer().addPropertyChangeListener(updateLayers); } @Override public void update() { Heatmap heatmap = getHeatmap(); String col = heatmap.getColumns().getFocus(); String row = heatmap.getRows().getFocus(); if (col != null && row != null) { Decorator decorator = heatmap.getLayers().getTopLayer().getDecorator(); Decoration decoration = new Decoration(); boolean showValue = decorator.isShowValue(); decorator.setShowValue(true, true); decoration.reset(); HeatmapLayer layer = heatmap.getLayers().getTopLayer(); decorator.decorate(decoration, layer.getLongFormatter(), heatmap, layer, row, col); decorator.setShowValue(showValue, true); this.setTitle("Values: " + decoration.getFormatedValue()); } else { this.setTitle("Values"); } List<DetailsDecoration> layersDetails = new ArrayList<>(); heatmap.getLayers().populateDetails(layersDetails, heatmap, heatmap.getRows().getFocus(), heatmap.getColumns().getFocus()); this.draw(layersDetails); } @Override public boolean isVisible() { return true; } @Override public MouseListener getBottomActionMouseAdapter() { if (bottomActionMouseAdapter == null) { bottomActionMouseAdapter = new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { HeatmapLayer topLayer = getHeatmap().getLayers().getTopLayer(); DynamicActionsManager.updateDynamicActionSet(bottomActionSet, IHeatmapLayerAction.class, topLayer, null); } @Override public void mouseReleased(MouseEvent e) { HeatmapLayer topLayer = getHeatmap().getLayers().getTopLayer(); DynamicActionsManager.updateDynamicActionSet(bottomActionSet, IHeatmapLayerAction.class, topLayer, null); } }; } return bottomActionMouseAdapter; } @Override protected void onMouseSingleClick(DetailsDecoration detail) { final HeatmapLayer layer = getHeatmap().getLayers().get(detail.getIndex()); Runnable task = new Runnable() { @Override public void run() { new SetLayerAction(layer).actionPerformed(new ActionEvent(this, 0, null)); } }; worker.schedule(task, 10, TimeUnit.MILLISECONDS); } @Override protected void onMouseDoubleClick(DetailsDecoration detail) { Object reference = detail.getReference(); if (reference instanceof HeatmapLayer) { new EditLayerAction((HeatmapLayer) reference).actionPerformed(null); } } @Override protected void onMouseRightClick(DetailsDecoration propertyItem, MouseEvent e) { if (propertyItem.getReference() instanceof HeatmapLayer) { DynamicActionsManager.updatePopupMenu(popupMenu, IHeatmapLayerAction.class, (HeatmapLayer) propertyItem.getReference(), null); popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } }