/* * 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.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JSeparator; import net.sf.jailer.datamodel.Column; import net.sf.jailer.datamodel.Table; import net.sf.jailer.ui.scrollmenu.JScrollPopupMenu; /** * Editor for multi-line SQL conditions with parameter support. * * @author Ralf Wisser */ public class ConditionEditor extends javax.swing.JDialog { private boolean ok; private ParameterSelector parameterSelector; /** Creates new form ConditionEditor */ public ConditionEditor(java.awt.Frame parent, ParameterSelector.ParametersGetter parametersGetter) { super(parent, true); initComponents(); setLocation(400, 150); setSize(600, 400); if (parametersGetter != null) { paramsPanel.add(parameterSelector = new ParameterSelector(this, editorPane, parametersGetter)); } else { paramsPanel.setVisible(false); } editorPane.setContentType("text/sql"); table1dropDown.setText(null); table1dropDown.setIcon(dropDownIcon); table2dropDown.setText(null); table2dropDown.setIcon(dropDownIcon); table1dropDown.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { openColumnDropDownBox(table1dropDown, table1alias, table1); } public void mouseEntered(java.awt.event.MouseEvent evt) { table1dropDown.setEnabled(false); } public void mouseExited(java.awt.event.MouseEvent evt) { table1dropDown.setEnabled(true); } }); table2dropDown.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { openColumnDropDownBox(table2dropDown, table2alias, table2); } public void mouseEntered(java.awt.event.MouseEvent evt) { table2dropDown.setEnabled(false); } public void mouseExited(java.awt.event.MouseEvent evt) { table2dropDown.setEnabled(true); } }); } /** * Opens a drop-down box which allows the user to select columns for restriction definitions. */ private void openColumnDropDownBox(JLabel label, String alias, Table table) { JPopupMenu popup = new JScrollPopupMenu(); List<String> columns = new ArrayList<String>(); for (Column c: table.getColumns()) { columns.add(alias + "." + c.name); } if (addPseudoColumns) { columns.add(""); columns.add(alias + ".$IS_SUBJECT"); columns.add(alias + ".$DISTANCE"); columns.add("$IN_DELETE_MODE"); columns.add("NOT $IN_DELETE_MODE"); } for (final String c: columns) { if (c.equals("")) { popup.add(new JSeparator()); continue; } JMenuItem m = new JMenuItem(c); m.addActionListener(new ActionListener () { public void actionPerformed(ActionEvent e) { if (editorPane.isEnabled()) { if (editorPane.isEditable()) { editorPane.replaceSelection(c); } } } }); popup.add(m); } UIUtil.fit(popup); popup.show(label, 0, label.getHeight()); } /** 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="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; jPanel1 = new javax.swing.JPanel(); paramsPanel = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); table1label = new javax.swing.JLabel(); table1name = new javax.swing.JLabel(); table1dropDown = new javax.swing.JLabel(); jLabel1 = new javax.swing.JLabel(); table2label = new javax.swing.JLabel(); table2name = new javax.swing.JLabel(); table2dropDown = new javax.swing.JLabel(); addOnPanel = new javax.swing.JPanel(); jPanel3 = new javax.swing.JPanel(); okButton = new javax.swing.JButton(); cancelButton = new javax.swing.JButton(); jScrollPane2 = new javax.swing.JScrollPane(); editorPane = new javax.swing.JEditorPane(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); getContentPane().setLayout(new java.awt.GridBagLayout()); jPanel1.setLayout(new java.awt.GridBagLayout()); paramsPanel.setMinimumSize(new java.awt.Dimension(150, 0)); paramsPanel.setLayout(new javax.swing.BoxLayout(paramsPanel, javax.swing.BoxLayout.LINE_AXIS)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 20; gridBagConstraints.gridy = 10; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weighty = 1.0; jPanel1.add(paramsPanel, gridBagConstraints); jPanel2.setLayout(new java.awt.GridBagLayout()); table1label.setText(" Table "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 0, 3, 0); jPanel2.add(table1label, gridBagConstraints); table1name.setFont(new java.awt.Font("DejaVu Sans", 0, 12)); // NOI18N table1name.setText("jLabel1"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 0, 3, 0); jPanel2.add(table1name, gridBagConstraints); table1dropDown.setFont(new java.awt.Font("DejaVu Sans", 0, 12)); // NOI18N table1dropDown.setText("jLabel1"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 0, 3, 0); jPanel2.add(table1dropDown, gridBagConstraints); jLabel1.setText(" "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 10; gridBagConstraints.gridy = 1; gridBagConstraints.weightx = 1.0; jPanel2.add(jLabel1, gridBagConstraints); table2label.setText("jLabel2"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 0, 4, 0); jPanel2.add(table2label, gridBagConstraints); table2name.setFont(new java.awt.Font("DejaVu Sans", 0, 12)); // NOI18N table2name.setText("jLabel2"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 0, 4, 0); jPanel2.add(table2name, gridBagConstraints); table2dropDown.setFont(new java.awt.Font("DejaVu Sans", 0, 12)); // NOI18N table2dropDown.setText("jLabel2"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 0, 4, 0); jPanel2.add(table2dropDown, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 12; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; jPanel2.add(addOnPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 10; gridBagConstraints.gridy = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; jPanel1.add(jPanel2, gridBagConstraints); okButton.setText(" Ok "); okButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { okButtonActionPerformed(evt); } }); jPanel3.add(okButton); cancelButton.setText(" Cancel "); cancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelButtonActionPerformed(evt); } }); jPanel3.add(cancelButton); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 10; gridBagConstraints.gridy = 20; gridBagConstraints.gridwidth = 20; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; jPanel1.add(jPanel3, gridBagConstraints); jScrollPane2.setViewportView(editorPane); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 10; gridBagConstraints.gridy = 10; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; jPanel1.add(jScrollPane2, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 10; gridBagConstraints.gridy = 10; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; getContentPane().add(jPanel1, gridBagConstraints); pack(); }// </editor-fold>//GEN-END:initComponents private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed ok = true; setVisible(false); }//GEN-LAST:event_okButtonActionPerformed private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed ok = false; setVisible(false); }//GEN-LAST:event_cancelButtonActionPerformed private Table table1, table2; private String table1alias, table2alias; private boolean addPseudoColumns; /** * Edits a given condition. * * @param condition the condition * @return new condition or <code>null</code>, if user canceled the editor */ public String edit(String condition, String table1label, String table1alias, Table table1, String table2label, String table2alias, Table table2, boolean addPseudoColumns) { condition = toMultiLine(condition); this.table1 = table1; this.table2 = table2; this.table1alias = table1alias; this.table2alias = table2alias; this.addPseudoColumns = addPseudoColumns; if (table1 != null) { this.table1label.setText(" " + table1label + " "); this.table1name.setText(" " + table1.getName()); this.table1label.setVisible(true); this.table1name.setVisible(true); this.table1dropDown.setVisible(true); } else { this.table1label.setVisible(false); this.table1name.setVisible(false); this.table1dropDown.setVisible(false); } if (table2 != null) { this.table2label.setText(" " + table2label + " "); this.table2name.setText(" " + table2.getName()); this.table2label.setVisible(true); this.table2name.setVisible(true); this.table2dropDown.setVisible(true); } else { this.table2label.setVisible(false); this.table2name.setVisible(false); this.table2dropDown.setVisible(false); } ok = false; editorPane.setText(condition); editorPane.setCaretPosition(0); if (parameterSelector != null) { parameterSelector.updateParameters(); } setVisible(true); return ok? editorPane.getText() : null; } /** * Converts multi-line text into single line presentation. */ public static String toSingleLine(String s) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.length(); ++i) { char c = s.charAt(i); if (c == '\\') { sb.append("\\\\"); } else if (c == '\n') { sb.append("\\n"); } else if (c == '\r') { sb.append("\\r"); } else { sb.append(c); } } return sb.toString(); } /** * Converts single line presentation into multi-line text. */ public static String toMultiLine(String s) { StringBuilder sb = new StringBuilder(); boolean esc = false; for (int i = 0; i < s.length(); ++i) { char c = s.charAt(i); if (c == '\\') { if (esc) { esc = false; } else { esc = true; continue; } } if (esc && c == 'n') { c = '\n'; } else if (esc && c == 'r') { c = '\r'; } sb.append(c); esc = false; } return sb.toString(); } // Variables declaration - do not modify//GEN-BEGIN:variables public javax.swing.JPanel addOnPanel; private javax.swing.JButton cancelButton; public javax.swing.JEditorPane editorPane; private javax.swing.JLabel jLabel1; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JButton okButton; private javax.swing.JPanel paramsPanel; protected javax.swing.JLabel table1dropDown; protected javax.swing.JLabel table1label; protected javax.swing.JLabel table1name; private javax.swing.JLabel table2dropDown; private javax.swing.JLabel table2label; private javax.swing.JLabel table2name; // End of variables declaration//GEN-END:variables private Icon dropDownIcon; { String dir = "/net/sf/jailer/ui/resource"; // load images try { dropDownIcon = new ImageIcon(getClass().getResource(dir + "/dropdown.png")); } catch (Exception e) { e.printStackTrace(); } } private static final long serialVersionUID = -5169934807182707970L; }