/* * 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.Component; import java.util.Collection; import java.util.List; import java.util.Set; import java.util.TreeSet; import javax.swing.ComboBoxModel; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListCellRenderer; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.ListCellRenderer; import net.sf.jailer.datamodel.Association; import net.sf.jailer.util.CsvFile.Line; /** * Editor for single tables. Part of {@link DataModelEditor}. * * @author Ralf Wisser */ public class AssociationEditor extends javax.swing.JDialog { /** * All tables (as csv-lines). */ private Collection<Line> tables; /** * All associations (as csv-lines). */ private Collection<Line> associations; /** * Creates new form TableEditor * * @param tables all tables (as csv-lines) * @param associations all associations (as csv-line) */ public AssociationEditor(java.awt.Dialog parent, Collection<Line> tables, List<Line> associations) { super(parent, true); this.tables = tables; this.associations = associations; initComponents(); type.setRenderer(createTypeRenderer()); pack(); setLocation(parent.getLocation().x + parent.getSize().width/2 - getPreferredSize().width/2, parent.getLocation().y + parent.getSize().height/2 - getPreferredSize().height/2); UIUtil.initPeer(); } /** 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. */ // <editor-fold defaultstate="collapsed" desc=" Erzeugter Quelltext ">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; jPanel2 = new javax.swing.JPanel(); source = new net.sf.jailer.ui.JComboBox(); type = new net.sf.jailer.ui.JComboBox(); destination = new net.sf.jailer.ui.JComboBox(); cardinality = new net.sf.jailer.ui.JComboBox(); jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); joinCondition = new javax.swing.JTextField(); jLabel5 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); jLabel7 = new javax.swing.JLabel(); jLabel8 = new javax.swing.JLabel(); nameField = new javax.swing.JTextField(); jLabel9 = new javax.swing.JLabel(); jPanel1 = new javax.swing.JPanel(); jButton1 = new javax.swing.JButton(); jLabel3 = new javax.swing.JLabel(); jButton2 = new javax.swing.JButton(); jLabel4 = new javax.swing.JLabel(); jLabel10 = new javax.swing.JLabel(); getContentPane().setLayout(new java.awt.GridBagLayout()); setTitle("Association"); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; getContentPane().add(jPanel2, gridBagConstraints); source.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); source.setMaximumRowCount(20); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 0, 2, 0); getContentPane().add(source, gridBagConstraints); type.setModel(createTypeModel()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 0, 2, 0); getContentPane().add(type, gridBagConstraints); destination.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); destination.setMaximumRowCount(20); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 0, 2, 0); getContentPane().add(destination, gridBagConstraints); cardinality.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "", "1:n", "n:1", "1:1", "n:m" })); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 6; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 0, 2, 0); getContentPane().add(cardinality, gridBagConstraints); jLabel1.setText(" Name "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 10; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; getContentPane().add(jLabel1, gridBagConstraints); jLabel2.setText(" Join condition* "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 9; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; getContentPane().add(jLabel2, gridBagConstraints); joinCondition.setText("jTextField2"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 9; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; getContentPane().add(joinCondition, gridBagConstraints); jLabel5.setText(" "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; getContentPane().add(jLabel5, gridBagConstraints); jLabel6.setText(" From "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; getContentPane().add(jLabel6, gridBagConstraints); jLabel7.setText(" To"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 5; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; getContentPane().add(jLabel7, gridBagConstraints); jLabel8.setText(" Type"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; getContentPane().add(jLabel8, gridBagConstraints); nameField.setText("jTextField1"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 10; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; getContentPane().add(nameField, gridBagConstraints); jLabel9.setText(" Cardinality "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 6; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; getContentPane().add(jLabel9, gridBagConstraints); jPanel1.setLayout(new java.awt.GridBagLayout()); jButton1.setText("Ok"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.gridheight = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTH; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 0); jPanel1.add(jButton1, gridBagConstraints); jLabel3.setFont(new java.awt.Font("Dialog", 0, 12)); jLabel3.setText(" *use 'A' as alias for From, use 'B' as alias for To. "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(8, 0, 0, 0); jPanel1.add(jLabel3, gridBagConstraints); jButton2.setText("Cancel"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); jButton2.addComponentListener(new java.awt.event.ComponentAdapter() { public void componentResized(java.awt.event.ComponentEvent evt) { jButton2ComponentResized(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.gridheight = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTH; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 0); jPanel1.add(jButton2, gridBagConstraints); jLabel4.setFont(new java.awt.Font("Dialog", 0, 12)); jLabel4.setText(" Upper case, no space between A/B and dot!"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; jPanel1.add(jLabel4, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 40; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; getContentPane().add(jPanel1, gridBagConstraints); jLabel10.setText(" "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 20; gridBagConstraints.gridy = 0; getContentPane().add(jLabel10, gridBagConstraints); pack(); }// </editor-fold>//GEN-END:initComponents private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed setVisible(false); }//GEN-LAST:event_jButton2ActionPerformed /** * On OK. */ private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed String msg = null; if (nameField.getText().trim().length() == 0) { msg = "No association name"; } else { for (Line l: associations) { if (l != currentAssociation && l.cells.get(5).equalsIgnoreCase(nameField.getText().trim())) { msg = "Association with same name exists"; break; } } } if (joinCondition.getText().trim().length() == 0) { msg = "No join condition"; }if (msg != null) { JOptionPane.showMessageDialog(this, msg, "Error", JOptionPane.ERROR_MESSAGE); } else { isOk = true; setVisible(false); } }//GEN-LAST:event_jButton1ActionPerformed private void jButton2ComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_jButton2ComponentResized }//GEN-LAST:event_jButton2ComponentResized /** * Creates model for {@link AssociationEditor#type}. * * @return model for {@link AssociationEditor#type} */ private ComboBoxModel createTypeModel() { DefaultComboBoxModel model = new DefaultComboBoxModel(); model.addElement(""); model.addElement("A"); model.addElement("B"); return model; } /** * Creates renderer for {@link AssociationEditor#type}. * * @return renderer for {@link AssociationEditor#type} */ private ListCellRenderer createTypeRenderer() { DefaultListCellRenderer renderer = new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if ("".equals(value)) { value = "associates"; } else if ("A".equals(value)) { value = "has dependent (has child)"; } else if ("B".equals(value)) { value = "depends on (has parent)"; } return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } private static final long serialVersionUID = 1992399605806444015L; }; return renderer; } /** * Set to <code>true</code> if ok-button is clicked. */ private boolean isOk; /** * Currently edited {@link Association}. */ private Line currentAssociation; /** * Edits an association (as csv-line). * * @param association the association-line * @return <code>true</code> if association was modified */ public boolean edit(Line association) { currentAssociation = association; nameField.setText(association.cells.get(5)); DefaultComboBoxModel tablesModel1 = new DefaultComboBoxModel(); DefaultComboBoxModel tablesModel2 = new DefaultComboBoxModel(); Set<String> sortedTableNames = new TreeSet<String>(); for (Line table: tables) { sortedTableNames.add(table.cells.get(0)); } sortedTableNames.add(association.cells.get(0)); sortedTableNames.add(association.cells.get(1)); for (String tableName: sortedTableNames) { tablesModel1.addElement(tableName); tablesModel2.addElement(tableName); } source.setModel(tablesModel1); destination.setModel(tablesModel2); source.setSelectedItem(association.cells.get(0)); destination.setSelectedItem(association.cells.get(1)); type.setSelectedItem(association.cells.get(2)); joinCondition.setText(association.cells.get(4)); String cardinality = association.cells.get(3); this.cardinality.setSelectedItem(cardinality); nameField.setText(association.cells.get(5)); Object origSource = source.getSelectedItem(); Object origDestination = destination.getSelectedItem(); Object origType = type.getSelectedItem(); Object origCardinality = this.cardinality.getSelectedItem(); String origJoinCondition = joinCondition.getText(); String origName = nameField.getText(); isOk = false; setVisible(true); if (isOk && !(origName.equals(nameField.getText()) && origSource.equals(source.getSelectedItem()) && origDestination.equals(destination.getSelectedItem()) && origType.equals(type.getSelectedItem()) && origCardinality.equals(this.cardinality.getSelectedItem()) && origJoinCondition.equals(joinCondition.getText()))) { association.cells.set(0, (String) source.getSelectedItem()); association.cells.set(1, (String) destination.getSelectedItem()); association.cells.set(2, (String) type.getSelectedItem()); association.cells.set(3, (String) this.cardinality.getSelectedItem()); association.cells.set(4, joinCondition.getText()); association.cells.set(5, nameField.getText()); association.cells.set(6, "Data Model Editor"); association.length = 6; return true; } return false; } // Variablendeklaration - nicht modifizieren//GEN-BEGIN:variables private net.sf.jailer.ui.JComboBox cardinality; private net.sf.jailer.ui.JComboBox destination; private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JLabel jLabel9; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JTextField joinCondition; private javax.swing.JTextField nameField; private net.sf.jailer.ui.JComboBox source; private net.sf.jailer.ui.JComboBox type; // Ende der Variablendeklaration//GEN-END:variables private static final long serialVersionUID = 603961628104674406L; }