/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 ro.nextreports.designer.querybuilder; import ro.nextreports.engine.queryexec.QueryParameter; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import org.jdesktop.swingx.JXErrorPane; import org.jdesktop.swingx.error.ErrorInfo; import ro.nextreports.designer.Globals; import ro.nextreports.designer.ReportLayoutUtil; import ro.nextreports.designer.ui.sqleditor.EditorPanel; import ro.nextreports.designer.util.I18NSupport; import ro.nextreports.designer.util.ImageUtil; import ro.nextreports.designer.util.Show; import ro.nextreports.designer.util.SwingUtil; /** * Created by IntelliJ IDEA. * User: mihai.panaitescu * Date: Feb 11, 2008 * Time: 5:01:17 PM */ public class SourceDialog extends JDialog { private Dimension dim = new Dimension(400, 200); private Dimension buttonDim = new Dimension(20,20); private EditorPanel editorPanel; private JButton btnOk = new JButton(); private JButton btnCancel = new JButton(); private boolean okPressed = false; private List<String> types; private byte orderBy; public SourceDialog(String select, byte orderBy, boolean showTemplate) throws HeadlessException { super(Globals.getMainFrame(), "", true); this.orderBy = orderBy; this.setTitle(I18NSupport.getString("source.dialog.select")); this.setLayout(new GridBagLayout()); editorPanel = new EditorPanel(); JScrollPane scr = new JScrollPane(editorPanel); scr.setPreferredSize(dim); final JComboBox orderByCombo = new JComboBox(); createOrderByModel(orderByCombo); orderByCombo.setSelectedIndex(orderBy); orderByCombo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { SourceDialog.this.orderBy = (byte) orderByCombo.getSelectedIndex(); } }); btnOk.setText(I18NSupport.getString("source.dialog.ok")); btnCancel.setText(I18NSupport.getString("source.dialog.cancel")); btnOk.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ok(); } }); btnCancel.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { cancel(); } }); JPanel buttonPanel2 = new JPanel(); buttonPanel2.setLayout(new BoxLayout(buttonPanel2, BoxLayout.X_AXIS)); buttonPanel2.add(Box.createHorizontalGlue()); buttonPanel2.add(btnOk); buttonPanel2.add(Box.createRigidArea(new Dimension(5, 5))); buttonPanel2.add(btnCancel); buttonPanel2.add(Box.createHorizontalGlue()); SwingUtil.equalizeButtonSizes(buttonPanel2); JButton dateButton = new JButton(ImageUtil.getImageIcon("calendar")); dateButton.setToolTipText(I18NSupport.getString("source.dialog.date")); dateButton.setPreferredSize(buttonDim); dateButton.setMinimumSize(buttonDim); dateButton.setMaximumSize(buttonDim); dateButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { currentDate(); } }); if (showTemplate) { this.add(dateButton, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 10, 0, 10), 0, 0)); } this.add(scr, new GridBagConstraints(0, 1, 2, 1, 1.0, 1.0 , GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(10, 10, 5, 10), 0, 0)); if (QueryParameter.NO_ORDER != orderBy) { this.add(new JLabel(I18NSupport.getString("parameter.orderby")), new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 10, 10, 0), 0, 0)); this.add(orderByCombo, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 10, 10), 0, 0)); } this.add(buttonPanel2, new GridBagConstraints(0, 3, 2, 1, 1.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 10, 10, 10), 0, 0)); if (select != null) { editorPanel.setText(select); } pack(); } // the order is done by QueryParameter ORDER_BY_SELECT , ORDER_BY_NAME, ORDER_BY_ID values private void createOrderByModel(JComboBox orderByCombo) { orderByCombo.addItem(I18NSupport.getString("parameter.orderby.none")); orderByCombo.addItem(I18NSupport.getString("parameter.orderby.name")); orderByCombo.addItem(I18NSupport.getString("parameter.orderby.id")); } public String getSource() { return editorPanel.getText(); } public byte getOrderBy() { return orderBy; } private void ok() { if (editorPanel.getText().trim().equals("")) { Show.info(I18NSupport.getString("source.dialog.enter.select")); } else { // if (!testSelect(editorPanel.getText())) { // String m = I18NSupport.getString("source.dialog.valid"); // Show.info(m + " : \"select <exp1> , <exp2> from ...\""); // } else { try { types = ReportLayoutUtil.getAllColumnTypesForReport(editorPanel.getText()); if (types.size() > 2) { String m = I18NSupport.getString("source.dialog.valid"); Show.info(m + " : \"select <exp1> , <exp2> from ...\""); } else { okPressed = true; setVisible(false); } } catch (Exception e) { JXErrorPane.showDialog(this, new ErrorInfo(I18NSupport.getString("source.dialog.execute"), I18NSupport.getString("source.dialog.execute"), null, null, e, null, null)); okPressed = false; } // } } } private void cancel() { okPressed = false; setVisible(false); } private void currentDate() { try { editorPanel.setText(Globals.getDialect().getCurrentDateSelect()); } catch (Exception e) { e.printStackTrace(); } } public boolean okPressed() { return okPressed; } public List<String> getTypes() { return types; } // sql must be of form : "select <a> , <b> from ..." // where <a> is the expression for jasper parameter value // and <b> is the expression for rendered parameter value private boolean testSelect(String sql) { try { // text between "select " and " from " // can throw IndexOutOfBoundsException String fields = sql.substring(7, sql.toLowerCase().indexOf(" from ")).trim(); //must have at least one comma //this condition is not enough for a valid sql //(may contain the comma inside a function) // if (fields.indexOf(',') == -1) { // return false; // } } catch (IndexOutOfBoundsException ex) { // sql is not of the form ("select ... from ....") return false; } return true; } }