/* * Copyright 2007 - 2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.sf.jailer.ui; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.Image; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.Vector; import javax.swing.ComboBoxModel; import javax.swing.DefaultComboBoxModel; import javax.swing.ImageIcon; import javax.swing.JComponent; import net.sf.jailer.datamodel.Table; import net.sf.jailer.extractionmodel.ExtractionModel; import net.sf.jailer.extractionmodel.ExtractionModel.AdditionalSubject; /** * Dialog for additional subjects. * * @author Ralf Wisser */ public class AdditionalSubjectsDialog extends javax.swing.JDialog { private static final long serialVersionUID = -4301921544746428522L; private final ExtractionModel extractionModel; private final List<AdditionalSubject> subjects; private final java.awt.Frame parent; private final String subjectCond; private final Table subject; private Set<Table> remaining = new HashSet<Table>(); @SuppressWarnings("serial") private class AdditionalSubjectListEditor extends ListEditor<AdditionalSubject> { public AdditionalSubjectListEditor() { super(new String[] { "Table", "Condition" }, "Additional Subject", true, false, false); hideUpAndDownButton(); } @Override protected String getDisplayName(AdditionalSubject element) { return extractionModel.dataModel.getDisplayName(element.getSubject()); } @Override protected AdditionalSubject copy(AdditionalSubject element) { return new AdditionalSubject(element.getSubject(), element.getCondition()); } @Override protected AdditionalSubject createNew() { return new AdditionalSubject(null, ""); } @Override protected JComponent createDetailsView(AdditionalSubject element) { detailsComboBox.setModel(subjectListModel(true)); if (element.getSubject() != null) { detailsComboBox.setSelectedItem(extractionModel.dataModel.getDisplayName(element.getSubject())); } else { detailsComboBox.setSelectedItem(""); } detailsCondtition.setText(element.getCondition()); return detailsPanel; } @Override protected void updateFromDetailsView(AdditionalSubject element, JComponent detailsView, List<AdditionalSubject> model, StringBuilder errorMessage) { String cond = detailsCondtition.getText().trim(); Table table = null; Object item = detailsComboBox.getSelectedItem(); if (item != null) { table = extractionModel.dataModel.getTableByDisplayName(item.toString()); } if (table == null) { errorMessage.append("Subject missing"); return; } element.setSubject(table); element.setCondition(cond); } @Override protected Object[] toColumnList(AdditionalSubject element, int index) { return new String[] { getDisplayName(element), element.getCondition().length() > 0? ("Where " + element.getCondition()) : "all rows" }; } @Override protected Color getForegroundColor(AdditionalSubject element, int column) { return null; } /* (non-Javadoc) * @see net.sf.jailer.ui.ListEditor#detailsViewMinSize() */ @Override protected Dimension detailsViewMinSize() { return new Dimension(500, 10); } /* (non-Javadoc) * @see net.sf.jailer.ui.ListEditor#onModelUpdate() */ @Override protected void onModelUpdate() { collectRemaining(); } }; private AdditionalSubjectListEditor additionalSubjectListEditor; /** * Creates new form AdditionalSubjectsDialog */ public AdditionalSubjectsDialog(java.awt.Frame parent, ExtractionModel extractionModel, Table subject, String subjectCond) { super(parent, true); this.parent = parent; this.extractionModel = extractionModel; this.subjectCond = subjectCond; this.subject = subject; subjects = new ArrayList<ExtractionModel.AdditionalSubject>(this.extractionModel.additionalSubjects); additionalSubjectListEditor = new AdditionalSubjectListEditor(); additionalSubjectListEditor.setModel(subjects); initComponents(); GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; subjectsPanel.add(additionalSubjectListEditor, gridBagConstraints); detailsLabel.setIcon(conditionEditorIcon); detailsLabel.setText(null); detailsLabel.setToolTipText("open editor"); final ParameterSelector.ParametersGetter parametersGetter = new ParameterSelector.ParametersGetter() { @Override public Set<String> getParameters() { return AdditionalSubjectsDialog.this.extractionModel.dataModel.getParameters(AdditionalSubjectsDialog.this.subjectCond, subjects); } }; detailsLabel.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { mouseClicked(e); } public void mouseClicked(java.awt.event.MouseEvent evt) { ConditionEditor conditionEditor = new ConditionEditor(AdditionalSubjectsDialog.this.parent, parametersGetter); conditionEditor.setTitle(detailsCondtition.getText().trim()); String cond = conditionEditor.edit(detailsCondtition.getText(), null, null, null, null, null, null, false); if (cond != null) { if (!detailsCondtition.getText().equals(ConditionEditor.toSingleLine(cond))) { detailsCondtition.setText(ConditionEditor.toSingleLine(cond)); } detailsLabel.setIcon(conditionEditorIcon); } } public void mouseEntered(java.awt.event.MouseEvent evt) { detailsLabel.setIcon(conditionEditorSelectedIcon); } public void mouseExited(java.awt.event.MouseEvent evt) { detailsLabel.setIcon(conditionEditorIcon); } }); collectRemaining(); pack(); setSize(Math.max(700, getWidth()), 500); setLocation(parent.getLocation().x + parent.getSize().width / 3 - getWidth() / 2, parent.getLocation().y + parent.getSize().height / 3 - getHeight() / 2); UIUtil.fit(this); UIUtil.initPeer(); } public boolean edit() { ok = false; setVisible(true); synchronized (this) { return ok; } } /** * Gets list model for the subject-combobox. * * @return list model for the subject-combobox */ private ComboBoxModel<String> subjectListModel(boolean withNull) { Vector<String> tableNames = new Vector<String>(); for (Table table: extractionModel.dataModel.getTables()) { tableNames.add(extractionModel.dataModel.getDisplayName(table)); } Collections.sort(tableNames); if (withNull) { tableNames.add(0, ""); } DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>(tableNames); return model; } private void collectRemaining() { remaining.clear(); remaining.addAll(extractionModel.dataModel.getTables()); if (subject != null) { remaining.remove(subject); } for (int i = 0; i < subjects.size(); ++i) { remaining.remove(subjects.get(i).getSubject()); } addAllButton.setEnabled(!remaining.isEmpty()); removeAllButton.setEnabled(!subjects.isEmpty()); } /** * 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() { java.awt.GridBagConstraints gridBagConstraints; detailsPanel = new javax.swing.JPanel(); detailsComboBox = new net.sf.jailer.ui.JComboBox(); detailsLabel = new javax.swing.JLabel(); detailsCondtition = new javax.swing.JTextField(); detailsWhere = new javax.swing.JLabel(); jPanel3 = new javax.swing.JPanel(); okButton = new javax.swing.JButton(); cancelButton = new javax.swing.JButton(); addAllButton = new javax.swing.JButton(); removeAllButton = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); jPanel1 = new javax.swing.JPanel(); subjectsPanel = new javax.swing.JPanel(); detailsPanel.setLayout(new java.awt.GridBagLayout()); detailsComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; detailsPanel.add(detailsComboBox, gridBagConstraints); detailsLabel.setText("jLabel1"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 1; detailsPanel.add(detailsLabel, gridBagConstraints); detailsCondtition.setText("jTextField1"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; detailsPanel.add(detailsCondtition, gridBagConstraints); detailsWhere.setText(" Where "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; detailsPanel.add(detailsWhere, gridBagConstraints); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Additional Subjects"); getContentPane().setLayout(new java.awt.GridBagLayout()); jPanel3.setLayout(new java.awt.GridBagLayout()); okButton.setText(" Ok "); okButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { okButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 0, 2, 2); jPanel3.add(okButton, gridBagConstraints); cancelButton.setText("Cancel"); cancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.insets = new java.awt.Insets(2, 0, 2, 2); jPanel3.add(cancelButton, gridBagConstraints); addAllButton.setText("Add remaining tables"); addAllButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addAllButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.insets = new java.awt.Insets(2, 0, 2, 2); jPanel3.add(addAllButton, gridBagConstraints); removeAllButton.setText("Delete all"); removeAllButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { removeAllButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 0, 2, 2); jPanel3.add(removeAllButton, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; getContentPane().add(jPanel3, gridBagConstraints); jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); jPanel1.setLayout(new java.awt.GridBagLayout()); subjectsPanel.setLayout(new java.awt.GridBagLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; jPanel1.add(subjectsPanel, gridBagConstraints); jScrollPane1.setViewportView(jPanel1); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; getContentPane().add(jScrollPane1, gridBagConstraints); pack(); }// </editor-fold>//GEN-END:initComponents private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed dispose(); }//GEN-LAST:event_cancelButtonActionPerformed private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed sortSubjects(); synchronized (this) { ok = !extractionModel.additionalSubjects.equals(subjects); } extractionModel.additionalSubjects = new ArrayList<ExtractionModel.AdditionalSubject>(subjects); dispose(); }//GEN-LAST:event_okButtonActionPerformed void sortSubjects() { Collections.sort(subjects, new Comparator<ExtractionModel.AdditionalSubject>() { @Override public int compare(AdditionalSubject o1, AdditionalSubject o2) { return extractionModel.dataModel.getDisplayName(o1.getSubject()).compareTo(extractionModel.dataModel.getDisplayName(o2.getSubject())); } }); } private void addAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addAllButtonActionPerformed try { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); List<Table> tables = new ArrayList<Table>(remaining); Collections.sort(tables); for (Table table: tables) { subjects.add(new AdditionalSubject(table, "")); } sortSubjects(); additionalSubjectListEditor.setModel(subjects); collectRemaining(); } finally { setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } }//GEN-LAST:event_addAllButtonActionPerformed private void removeAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeAllButtonActionPerformed subjects.clear(); additionalSubjectListEditor.setModel(subjects); collectRemaining(); }//GEN-LAST:event_removeAllButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addAllButton; private javax.swing.JButton cancelButton; private javax.swing.JComboBox detailsComboBox; private javax.swing.JTextField detailsCondtition; private javax.swing.JLabel detailsLabel; private javax.swing.JPanel detailsPanel; private javax.swing.JLabel detailsWhere; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel3; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JButton okButton; private javax.swing.JButton removeAllButton; private javax.swing.JPanel subjectsPanel; // End of variables declaration//GEN-END:variables private ImageIcon minusImage = null; private ImageIcon conditionEditorIcon = null; private ImageIcon conditionEditorSelectedIcon = null; private boolean ok; { String dir = "/net/sf/jailer/ui/resource"; // load image try { conditionEditorSelectedIcon = new ImageIcon(getClass().getResource(dir + "/edit_s.png")); } catch (Exception e) { e.printStackTrace(); } try { conditionEditorIcon = new ImageIcon(getClass().getResource(dir + "/edit.png")); } catch (Exception e) { e.printStackTrace(); } try { minusImage = new ImageIcon(new ImageIcon(getClass().getResource( dir + "/minus.png")).getImage().getScaledInstance(22, 18, Image.SCALE_SMOOTH)); } catch (Exception e) { e.printStackTrace(); } } }