/* * #%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.utils.DocumentChangeListener; import org.gitools.utils.cutoffcmp.CutoffCmp; import org.gitools.utils.operators.Operator; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableColumnModel; import java.awt.*; import java.util.List; /** * @noinspection ALL */ public class DataIntegrationCriteriaDialog extends javax.swing.JDialog { /** * A return status code - returned if Cancel button has been pressed */ private static final int RET_CANCEL = 0; /** * A return status code - returned if OK button has been pressed */ public static final int RET_OK = 1; private boolean noValue; private Heatmap heatmap; private static class OperatorCellRenderer extends DefaultTableCellRenderer { public OperatorCellRenderer() { super(); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Operator op = (Operator) value; String opString = op.getAbbreviation(); if (op.equals(Operator.AND)) { opString = " " + op.getAbbreviation(); } return super.getTableCellRendererComponent(table, opString, isSelected, hasFocus, row, column); } } private static class ComboBoxCellEditor extends DefaultCellEditor { public ComboBoxCellEditor(Object[] values) { super(new JComboBox(values)); } } private final IMatrixLayers layers; private final CutoffCmp[] comparators; private final String[] operators; private final DataIntegrationCriteriaTableModel criteriaModel; /** * Creates new form FilterDialog * * @noinspection UnusedDeclaration */ public DataIntegrationCriteriaDialog(Frame parent, IMatrixLayers layers, CutoffCmp[] comparators, String[] operators, List<DataIntegrationCriteria> initialCriteriaList, String groupName) { super(parent, true); this.layers = layers; this.comparators = comparators; this.operators = operators; this.criteriaModel = new DataIntegrationCriteriaTableModel(layers); initComponents(); if (groupName == null) { this.noValue = true; } else { noValue = false; this.groupNameTextArea.setText(groupName); } this.groupNameTextArea.setVisible(!noValue); this.groupNameTextArea.setEnabled(!noValue); table.setModel(criteriaModel); table.setRowHeight(30); criteriaModel.addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { tableRemoveBtn.setEnabled(criteriaModel.getList().size() > 0); } }); if (initialCriteriaList != null) { criteriaModel.addAllCriteria(initialCriteriaList); } TableColumnModel columnModel = table.getColumnModel(); columnModel.getColumn(0).setCellEditor(new ComboBoxCellEditor(operators)); columnModel.getColumn(0).setCellRenderer(new OperatorCellRenderer()); columnModel.getColumn(0).setMaxWidth(70); columnModel.getColumn(1).setCellEditor(new ComboBoxCellEditor(layers.getIds())); columnModel.getColumn(1).setMinWidth(200); columnModel.getColumn(2).setCellEditor(new ComboBoxCellEditor(comparators)); columnModel.getColumn(3).setCellEditor(new DefaultCellEditor(new JTextField())); columnModel.getColumn(4).setCellEditor(new DefaultCellEditor(new JTextField())); if (initialCriteriaList == null) { addCriteria(true); } groupNameTextArea.getDocument().addDocumentListener(new DocumentChangeListener() { @Override protected void update(DocumentEvent e) { groupNameChanged(e); } }); } /** * @return the return status of this dialog - one of RET_OK or RET_CANCEL */ public boolean isCancelled() { return returnStatus != RET_OK; } /** * @return the return status of this dialog - one of RET_OK or RET_CANCEL */ public int getReturnStatus() { return returnStatus; } private void addCriteria(boolean first) { if (first) { criteriaModel.addCriteria(new DataIntegrationCriteria(layers.get(layers.getIds()[0]), CutoffCmp.EQ, 1.0, null, Operator.EMPTY)); } else { criteriaModel.addCriteria(new DataIntegrationCriteria(layers.get(layers.getIds()[0]), CutoffCmp.EQ, 1.0, null, Operator.AND)); } } /** * 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() { applyToGroup = new javax.swing.ButtonGroup(); okButton = new javax.swing.JButton(); cancelButton = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); table = new javax.swing.JTable(); tableAddBtn = new javax.swing.JButton(); tableRemoveBtn = new javax.swing.JButton(); jSeparator1 = new javax.swing.JSeparator(); jLabel2 = new javax.swing.JLabel(); groupNameTextArea = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); setTitle("Criteria creation"); setLocationByPlatform(true); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { closeDialog(evt); } }); okButton.setText("OK"); okButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { okButtonActionPerformed(evt); } }); cancelButton.setText("Cancel"); cancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelButtonActionPerformed(evt); } }); table.setModel(new javax.swing.table.DefaultTableModel( new Object[][]{ }, new String[]{ "Operator", "Attribute", "Condition", "Value", "Convert empty" } ) { Class[] types = new Class[]{ java.lang.Object.class, java.lang.String.class, java.lang.Object.class, java.lang.Double.class, java.lang.Object.class }; public Class getColumnClass(int columnIndex) { return types[columnIndex]; } }); table.setColumnSelectionAllowed(true); jScrollPane1.setViewportView(table); table.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION); tableAddBtn.setText("Add"); tableAddBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { tableAddBtnActionPerformed(evt); } }); tableRemoveBtn.setText("Remove"); tableRemoveBtn.setEnabled(false); tableRemoveBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { tableRemoveBtnActionPerformed(evt); } }); jLabel2.setText("Group Name:"); groupNameTextArea.setText("0"); jLabel1.setText("Select columns or rows according to the specified criteria below. "); jLabel3.setText("<html><b>Operator</b> lets you combine critera by AND (both criteria fulfilled) and OR (one critera fulfilled).</html>"); jLabel4.setText("<html><b>Layer</b>, <b>Condition</b> and <b>Value</b> define the criteria</html>"); jLabel5.setText("<html>Specify a <b>Convert empty</b> value if empty cells for the specified layer are equivalent to a numeric value.</html>"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(cancelButton)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(jScrollPane1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(tableAddBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(tableRemoveBtn)) .addGap(6, 6, 6)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jLabel2) .addGap(18, 18, 18) .addComponent(groupNameTextArea, javax.swing.GroupLayout.PREFERRED_SIZE, 103, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(jLabel1) .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[]{cancelButton, okButton}); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(10, 10, 10) .addComponent(jLabel1) .addGap(18, 18, 18) .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 34, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(groupNameTextArea, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 247, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(tableAddBtn) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(tableRemoveBtn) .addGap(165, 165, 165))) .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(cancelButton) .addComponent(okButton)) .addContainerGap()) ); pack(); }// </editor-fold>//GEN-END:initComponents private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed doClose(RET_OK); }//GEN-LAST:event_okButtonActionPerformed private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed doClose(RET_CANCEL); }//GEN-LAST:event_cancelButtonActionPerformed /** * Closes the dialog */ private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_closeDialog doClose(RET_CANCEL); }//GEN-LAST:event_closeDialog private void tableAddBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tableAddBtnActionPerformed boolean first = table.getRowCount() == 0; addCriteria(first); }//GEN-LAST:event_tableAddBtnActionPerformed private void tableRemoveBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tableRemoveBtnActionPerformed criteriaModel.removeCriteria(table.getSelectedRows()); }//GEN-LAST:event_tableRemoveBtnActionPerformed private void groupNameChanged(DocumentEvent evt) { if (groupNameTextArea.getText().isEmpty()) { okButton.setEnabled(false); } else { okButton.setEnabled(true); } } private void doClose(int retStatus) { returnStatus = retStatus; try { if (retStatus == RET_OK) { TableColumnModel columnModel = table.getColumnModel(); boolean b; b = columnModel.getColumn(0).getCellEditor().stopCellEditing(); b = columnModel.getColumn(1).getCellEditor().stopCellEditing(); b = columnModel.getColumn(2).getCellEditor().stopCellEditing(); b = columnModel.getColumn(3).getCellEditor().stopCellEditing(); b = columnModel.getColumn(4).getCellEditor().stopCellEditing(); } setVisible(false); dispose(); } catch (Exception e) { e.getMessage(); } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup applyToGroup; private javax.swing.JButton cancelButton; private javax.swing.JTextField groupNameTextArea; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JSeparator jSeparator1; private javax.swing.JButton okButton; private javax.swing.JTable table; private javax.swing.JButton tableAddBtn; private javax.swing.JButton tableRemoveBtn; // End of variables declaration//GEN-END:variables private int returnStatus = RET_CANCEL; public List<DataIntegrationCriteria> getCriteriaList() { return criteriaModel.getList(); } public String getGroupName() { return groupNameTextArea.getText(); } }