/* * #%L * gitools-ui-app * %% * Copyright (C) 2013 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.header.wizard.heatmapheader; import com.jgoodies.binding.adapter.ComboBoxAdapter; import com.jgoodies.binding.list.SelectionInList; import org.gitools.api.analysis.IAggregator; import org.gitools.api.matrix.IMatrixPosition; import org.gitools.api.matrix.TransformFunction; import org.gitools.heatmap.Heatmap; import org.gitools.heatmap.HeatmapDimension; import org.gitools.ui.platform.wizard.AbstractWizardPage; import org.gitools.utils.aggregation.AggregatorFactory; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; public class DataAggregationPage extends AbstractWizardPage { private final IAggregator[] aggregatorsArray; private final HeatmapDimension headerDimension; private final HeatmapDimension aggregationDimension; private final Heatmap heatmap; public DataAggregationPage(HeatmapDimension headerDimension, HeatmapDimension aggregationDimension, final Heatmap heatmap) { this.headerDimension = headerDimension; this.aggregationDimension = aggregationDimension; this.heatmap = heatmap; //public DataAggregationPage(HeatmapDimension headerDimension, HeatmapDimension aggregationDimension, List<String> layerNames, int selectedLayer) { List<String> layerNames = heatmap.getLayers().getLayerNames(); int selectedLayer = heatmap.getLayers().getTopLayerIndex(); this.aggregatorsArray = AggregatorFactory.getAggregatorsArray(); String[] aggregatorNames = new String[aggregatorsArray.length]; for (int i = 0; i < aggregatorsArray.length; i++) aggregatorNames[i] = aggregatorsArray[i].toString(); initComponents(); updateModel(); boolean hasAnnotation = headerDimension.getAnnotations() != null; separateAggregationCb.setEnabled(hasAnnotation); valueCb.setModel(new DefaultComboBoxModel(layerNames.toArray())); valueCb.setSelectedIndex(selectedLayer); valueCb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setTransformFunctions(heatmap); updateControls(); } }); aggregatorCb.setModel(new DefaultComboBoxModel(aggregatorNames)); aggregatorCb.setSelectedItem("Mean"); aggregatorCb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateControls(); } }); setTransformFunctions(heatmap); transformationCb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateControls(); } }); useAllRb.setText("Use values from all " + aggregationDimension.getId()); useSelectedRb.setText("Use values from " + aggregationDimension.getSelected().size() + " selected " + aggregationDimension.getId()); separateAggregationCb.setText("aggregate by " + aggregationDimension.getId() + " annotations groups"); setTitle("Choose the data to aggregate"); } @Override public Container getParent() { return rootPanel; } private void setTransformFunctions(Heatmap heatmap) { List<TransformFunction> transformFunctions = new ArrayList<>(); transformFunctions.add(new TransformFunction("") { @Override public String getDescription() { return "No transformation of values"; } @Override public Double apply(Double value, IMatrixPosition position) { return value; } }); transformFunctions.addAll(heatmap.getLayers().getTopLayer().getDecorator().getEventFunctionAlternatives()); transformationCb.setModel( new ComboBoxAdapter<>( new SelectionInList<>( transformFunctions ) ) ); transformationCb.setSelectedIndex(0); functionDescription.setText(((TransformFunction) transformationCb.getSelectedItem()).getDescription()); } public IAggregator getAggregator() { return aggregatorsArray[aggregatorCb.getSelectedIndex()]; } public TransformFunction getTransformFunction() { return (TransformFunction) transformationCb.getSelectedItem(); } public int getAggregationLayer() { return valueCb.getSelectedIndex(); } public String getSelectedDataValueName() { return valueCb.getSelectedItem().toString(); } public boolean useAllColumnsOrRows() { return useAllRb.isSelected(); } private void updateCompleted() { boolean completed = aggregatorCb.getSelectedIndex() > -1 && valueCb.getSelectedIndex() > -1; setComplete(completed); } public boolean aggregateAnnotationsSeparately() { return separateAggregationCb.isEnabled() && separateAggregationCb.isSelected(); } @Override public void updateControls() { functionDescription.setText(((TransformFunction) transformationCb.getSelectedItem()).getDescription()); useAllRb.setEnabled(!separateAggregationCb.isSelected()); useSelectedRb.setEnabled(!separateAggregationCb.isSelected() && aggregationDimension.getSelected().size() > 0); updateCompleted(); } @SuppressWarnings("unchecked") private void initComponents() { allOrSelected = new ButtonGroup(); aggregatorCb.setModel(new DefaultComboBoxModel(new String[]{"Item 1", "Item 2", "Item 3", "Item 4"})); allOrSelected.add(useAllRb); useAllRb.setSelected(true); useAllRb.setText("use all"); useAllRb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { useAllRbActionPerformed(evt); } }); allOrSelected.add(useSelectedRb); useSelectedRb.setText("use selected"); useSelectedRb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { useSelectedRbActionPerformed(evt); } }); separateAggregationCb.setText("aggregate sperately for annotation groups"); separateAggregationCb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { separateAggregationCbActionPerformed(evt); } }); } private void useAllRbActionPerformed(ActionEvent evt) { } private void useSelectedRbActionPerformed(ActionEvent evt) { } private void separateAggregationCbActionPerformed(java.awt.event.ActionEvent evt) { updateControls(); } private JComboBox aggregatorCb; private ButtonGroup allOrSelected; private JCheckBox separateAggregationCb; private JRadioButton useAllRb; private JRadioButton useSelectedRb; private JComboBox valueCb; private JPanel rootPanel; private JComboBox transformationCb; private JLabel functionDescription; @Override public JComponent createControls() { return rootPanel; } }