/* * #%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.gitools.heatmap.Heatmap; import org.gitools.heatmap.HeatmapDimension; import org.gitools.heatmap.decorator.DetailsDecoration; import org.gitools.heatmap.header.HeatmapHeader; import org.gitools.resource.Property; import org.gitools.ui.app.actions.edit.EditHeaderAction; import org.gitools.ui.app.actions.edit.HeatmapSettingsAction; import org.gitools.ui.app.actions.help.SettingsAction; import org.gitools.ui.app.actions.help.ShortcutsAction; import org.gitools.ui.core.Application; 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.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; import static org.apache.commons.lang.StringUtils.capitalize; import static org.gitools.heatmap.HeatmapDimension.PROPERTY_HEADERS; import static org.gitools.heatmap.HeatmapDimension.PROPERTY_VISIBLE; 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 HeatmapInfoBox extends DetailsBox { public static final String ID = "HEATMAP_INFO"; public HeatmapInfoBox(Heatmap heatmap) { super(ID, capitalize(heatmap.getTitle()), null, createBottomActions(), heatmap); } private static ActionSet createBottomActions() { return new ActionSet(new HeatmapSettingsAction(), new SettingsAction(), new ShortcutsAction()); } @Override public void registerListeners() { PropertyChangeListener dimensionListener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ((isAny(evt, HeatmapDimension.class, PROPERTY_HEADERS, PROPERTY_VISIBLE))) { update(); } } }; getHeatmap().addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { update(); } }); getHeatmap().getRows().addPropertyChangeListener(dimensionListener); getHeatmap().getColumns().addPropertyChangeListener(dimensionListener); } @Override public void update() { if (this.isCollapsed() || isInteracting(movingSelected, highlighting)) { return; } Heatmap heatmap = getHeatmap(); List<DetailsDecoration> details = new ArrayList<>(); if (heatmap.getGitoolsVersion().isNewerThan(Application.getGitoolsVersion())) { //TODO: WARNING /* String warningText = "You may be loosing data because " + "this heatmap has been created with a newer version (" + heatmap.getGitoolsVersion().toString() + ") " + "than you are currently using."; DetailsDecoration warningDetail = new DetailsDecoration("WARNING", warningText, null, "Using old version: " + warningText, "http://www.gitools.org/downlaod"); details.add(warningDetail); */ } if (heatmap.getDescription() != null && heatmap.getDescription().length() > 0) { details.add(new DetailsDecoration("Description", heatmap.getDescription())); } int rows = heatmap.getRows().size(); int allRows = heatmap.getContents().getRows().size(); int columns = heatmap.getColumns().size(); int allColumns = heatmap.getContents().getColumns().size(); boolean showShownData = (rows != allRows || columns != allColumns); DetailsDecoration alldata = new DetailsDecoration("Size (all data)", allRows + " x " + allColumns); int rowsPct = (int) Math.round(((double) rows) / ((double) allRows) * 100.0); int colsPct = (int) Math.round(((double) columns) / ((double) allColumns) * 100.0); if (showShownData) { this.setTitle("<html>" + heatmap.getTitle() + " (" + rowsPct + "% x " + colsPct + "%)</html>"); DetailsDecoration shown = new DetailsDecoration("Size (shown)", rows + " x " + columns); shown.setSelected(true); details.add(shown); } else { this.setTitle("<html>" + heatmap.getTitle() + "</html>"); alldata.setSelected(true); } details.add(alldata); if (heatmap.getLastSaved() != null) { details.add(new DetailsDecoration("Last saved", heatmap.getLastSaved().toString())); } if (heatmap.getAuthorName() != null && !heatmap.getAuthorName().equals("")) { String authorName = heatmap.getAuthorName(); String authorEmail = heatmap.getAuthorEmail(); details.add(new DetailsDecoration("Author", "Last saved by this author", authorEmail, authorName, null)); } for (Property property : heatmap.getProperties()) { details.add(new DetailsDecoration(property.getName(), property.getValue())); } this.draw(details); } @Override public boolean isVisible() { return true; } @Override protected void onMouseSingleClick(DetailsDecoration propertyItem) { } @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()); } } }