/* * #%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.wizard.add.data; import org.gitools.api.matrix.IMatrixLayers; import org.gitools.heatmap.Heatmap; import org.gitools.matrix.filter.DataIntegrationCriteria; import org.gitools.ui.core.Application; import org.gitools.ui.platform.wizard.AbstractWizardPage; import org.gitools.utils.cutoffcmp.CutoffCmp; import org.gitools.utils.operators.Operator; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import java.awt.*; import java.util.ArrayList; import java.util.List; /** * @noinspection ALL */ public class DataIntegrationPage extends AbstractWizardPage { private static class DataIntegrationCriteriaListCellRender extends JTextArea implements TableCellRenderer { public DataIntegrationCriteriaListCellRender() { setLineWrap(true); setWrapStyleWord(true); //setOpaque(true); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { List<DataIntegrationCriteria> criteriaList = (List<DataIntegrationCriteria>) value; String intend = " "; String rendering = ""; for (DataIntegrationCriteria c : criteriaList) { Operator op = c.getOperator(); intend = (!op.equals(Operator.OR)) ? " " : ""; if (!op.equals(Operator.EMPTY)) { rendering = rendering + intend + op.getLongName().toUpperCase() + "\n"; } rendering = rendering + " " + c.getLayerId() + " " + c.getComparator().getLongName() + " " + Double.toString(c.getCutoffValue()) + "\n"; } setText(rendering); return this; } } private final IMatrixLayers layers; private final DefaultTableModel model; public DataIntegrationPage(Heatmap hm) { initComponents(); setComplete(false); setTitle("Data Dimension Integration"); setMessage("Choose which data dimensions and what cut-offs" + " to integrate"); this.layers = hm.getContents().getLayers(); //this.model = new DefaultTableModel(); model = (DefaultTableModel) table.getModel(); //table.setModel(model); table.getColumnModel().getColumn(0).setMaxWidth(65); table.getColumnModel().getColumn(1).setMaxWidth(100); table.getColumnModel().getColumn(2).setCellRenderer(new DataIntegrationCriteriaListCellRender()); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { updateButtons(); } }); } public double[] getValues() { double values[] = new double[table.getRowCount()]; for (int i = 0; i < table.getRowCount(); i++) { values[i] = Double.parseDouble((String) table.getValueAt(i, 1)); } return values; } public List<ArrayList<DataIntegrationCriteria>> getCriteria() { ArrayList<ArrayList<DataIntegrationCriteria>> criteria = new ArrayList<ArrayList<DataIntegrationCriteria>>(); for (int i = 0; i < table.getRowCount(); i++) { ArrayList<DataIntegrationCriteria> c = (ArrayList<DataIntegrationCriteria>) table.getValueAt(i, 2); criteria.add(c); } return criteria; } private void updateButtons() { int rowNb = table.getRowCount(); removeBtn.setEnabled(rowNb > 0 && table.getSelectedRow() >= 0); upBtn.setEnabled(rowNb > 1 && table.getSelectedRow() >= 0); downBtn.setEnabled(rowNb > 1 && table.getSelectedRow() >= 0); editBtn.setEnabled(rowNb > 0 && table.getSelectedRow() >= 0); setComplete(rowNb > 0); } private void updateRowHeightsAndPriorities() { for (int i = 0; i < table.getRowCount(); i++) { table.setValueAt(i + 1, i, 0); List<DataIntegrationCriteria> criteriaList = (List<DataIntegrationCriteria>) table.getValueAt(i, 2); int lines = criteriaList.size() * 2 - 1; table.setRowHeight(i, table.getRowHeight() * lines); } } /** * This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { applyGroup = new javax.swing.ButtonGroup(); jLabel1 = new javax.swing.JLabel(); tableAddBtn = new javax.swing.JButton(); removeBtn = new javax.swing.JButton(); upBtn = new javax.swing.JButton(); downBtn = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); table = new javax.swing.JTable(); editBtn = new javax.swing.JButton(); jLabel1.setText("Add integration rules according to their priorities"); tableAddBtn.setText("Add"); tableAddBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { tableAddBtnActionPerformed(evt); } }); removeBtn.setText("Remove"); removeBtn.setEnabled(false); removeBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { removeBtnActionPerformed(evt); } }); upBtn.setText("Up"); upBtn.setEnabled(false); upBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { upBtnActionPerformed(evt); } }); downBtn.setText("Down"); downBtn.setEnabled(false); downBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { downBtnActionPerformed(evt); } }); table.setModel(new javax.swing.table.DefaultTableModel(new Object[][]{ }, new String[]{"Priority", "Value", "Criteria"}) { final Class[] types = new Class[]{java.lang.String.class, java.lang.Object.class}; public Class getColumnClass(int columnIndex) { return types[columnIndex]; } public boolean isCellEditable(int row, int column) { return false;//This causes all cells to be not editable } }); table.setColumnSelectionAllowed(true); table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); table.getTableHeader().setReorderingAllowed(false); jScrollPane1.setViewportView(table); table.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION); editBtn.setText("Edit"); editBtn.setEnabled(false); editBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { editBtnActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jLabel1).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 437, Short.MAX_VALUE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false).addComponent(editBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(downBtn, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(upBtn, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(tableAddBtn, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(removeBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))).addContainerGap())); layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(jLabel1).addGap(18, 18, 18).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addComponent(tableAddBtn).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(removeBtn).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(upBtn).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(downBtn).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(editBtn)).addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 417, Short.MAX_VALUE)).addContainerGap())); }// </editor-fold>//GEN-END:initComponents private void tableAddBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tableAddBtnActionPerformed String[] ops = new String[]{Operator.AND.getAbbreviation(), Operator.OR.getAbbreviation()}; final DataIntegrationCriteriaDialog dlg = new DataIntegrationCriteriaDialog(Application.get(), layers, CutoffCmp.comparators, ops, null, "1"); dlg.setVisible(true); if (dlg.getReturnStatus() != DataIntegrationCriteriaDialog.RET_OK) { return; } List<DataIntegrationCriteria> criteriaList = dlg.getCriteriaList(); String setToValue = dlg.getGroupName(); model.addRow(new Object[]{table.getRowCount(), setToValue, criteriaList}); updateRowHeightsAndPriorities(); updateButtons(); }//GEN-LAST:event_tableAddBtnActionPerformed private void removeBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeBtnActionPerformed model.removeRow(table.getSelectedRow()); updateRowHeightsAndPriorities(); updateButtons(); }//GEN-LAST:event_removeBtnActionPerformed private void downBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downBtnActionPerformed int selectedPosition = table.getSelectedRow(); int wantedPosition = (selectedPosition + 1 == table.getRowCount()) ? selectedPosition : selectedPosition + 1; model.moveRow(selectedPosition, selectedPosition, wantedPosition); updateRowHeightsAndPriorities(); table.getSelectionModel().setSelectionInterval(wantedPosition, wantedPosition); }//GEN-LAST:event_downBtnActionPerformed private void upBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_upBtnActionPerformed int selectedPosition = table.getSelectedRow(); int wantedPosition = (selectedPosition == 0) ? selectedPosition : selectedPosition - 1; model.moveRow(selectedPosition, selectedPosition, wantedPosition); updateRowHeightsAndPriorities(); table.getSelectionModel().setSelectionInterval(wantedPosition, wantedPosition); }//GEN-LAST:event_upBtnActionPerformed private void editBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editBtnActionPerformed String[] ops = new String[]{Operator.AND.getAbbreviation(), Operator.OR.getAbbreviation()}; List<DataIntegrationCriteria> criteria = (List<DataIntegrationCriteria>) table.getValueAt(table.getSelectedRow(), 2); String setToValue = (String) table.getValueAt(table.getSelectedRow(), 1); final DataIntegrationCriteriaDialog dlg = new DataIntegrationCriteriaDialog(Application.get(), layers, CutoffCmp.comparators, ops, criteria, setToValue); dlg.setVisible(true); if (dlg.getReturnStatus() != DataIntegrationCriteriaDialog.RET_OK) { return; } int selectedRow = table.getSelectedRow(); List<DataIntegrationCriteria> criteriaList = dlg.getCriteriaList(); setToValue = dlg.getGroupName(); model.removeRow(selectedRow); model.insertRow(selectedRow, new Object[]{selectedRow + 1, setToValue, criteriaList}); updateRowHeightsAndPriorities(); updateButtons(); }//GEN-LAST:event_editBtnActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup applyGroup; private javax.swing.JButton downBtn; private javax.swing.JButton editBtn; private javax.swing.JLabel jLabel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JButton removeBtn; private javax.swing.JTable table; private javax.swing.JButton tableAddBtn; private javax.swing.JButton upBtn; // End of variables declaration//GEN-END:variables }