All Downloads are FREE. Search and download functionalities are using the official Maven repository.

src.com.ibm.as400.vaccess.SQLQueryWherePane Maven / Gradle / Ivy

There is a newer version: 11.1
Show newest version
///////////////////////////////////////////////////////////////////////////////
//                                                                             
// JTOpen (IBM Toolbox for Java - OSS version)                              
//                                                                             
// Filename: SQLQueryWherePane.java
//                                                                             
// The source code contained herein is licensed under the IBM Public License   
// Version 1.0, which has been approved by the Open Source Initiative.         
// Copyright (C) 1997-2000 International Business Machines Corporation and     
// others. All rights reserved.                                                
//                                                                             
///////////////////////////////////////////////////////////////////////////////

package com.ibm.as400.vaccess;
                          
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Types;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;


/**
The SQLQueryWherePane class represents a panel which allows a
user to dynamically build the SELECT portion of an SQL query.
This panel is used for a page of the SQLQueryBuilderPane notebook.
**/
class SQLQueryWherePane
extends SQLQueryFieldsPane
{
  private static final String copyright = "Copyright (C) 1997-2000 International Business Machines Corporation and others.";

// The variables and methods which have private commented out
// had to be made package scope since currently Internet Explorer
// does not allow inner class to access private items in their
// containing class.

// GUI components
/*private*/ DoubleClickList notList_;
/*private*/ DoubleClickList functionList_;
/*private*/ DoubleClickList testList_;
/*private*/ DoubleClickList otherList_;
/*private*/ SQLQueryClause clause_;

// Constants for SQL syntax.  Because these strings represent
// SQL syntax, they are not translated.
// Constants for functions.
private static final String FCN_CAST_ = "CAST";
private static final String FCN_CHAR_ = "CHAR";
private static final String FCN_CURRENT_ = "CURRENT";
private static final String FCN_DATE_ = "DATE";
private static final String FCN_DAY_ = "DAY";
private static final String FCN_HOUR_ = "HOUR";
private static final String FCN_LENGTH_ = "LENGTH";
private static final String FCN_MINUTE_ = "MINUTE";
private static final String FCN_MONTH_ = "MONTH";
private static final String FCN_SECOND_ = "SECOND";
private static final String FCN_SUBSTR_ = "SUBSTRING";
private static final String FCN_TIME_ = "TIME";
private static final String FCN_TIMESTAMP_ = "TIMESTAMP";
private static final String FCN_UPPER_ = "UPPER";
private static final String FCN_YEAR_ = "YEAR";
// Constants for tests.
private static final String TEST_BETWEEN_ = "BETWEEN";
private static final String TEST_IN_ = "IN";
private static final String TEST_NOT_NULL_ = "IS NOT NULL";
private static final String TEST_NULL_ = "IS NULL";
private static final String TEST_LIKE_ = "LIKE";

// Is NOT in affect for this expression.
private boolean notInEffect_ = false;

// Private variables used by internal methods.  These are
// instance variables because they are used in several places.
/*private*/ JDialog dialog;
/*private*/ boolean pane1Active;
/*private*/ JComboBox list1, list2, list3;
/*private*/ JTextField textField1, textField2;

private static final String [] notChoices = {"NOT"};
private static final String [] functionChoices = {FCN_CAST_, FCN_CHAR_, FCN_CURRENT_, FCN_DATE_,
      FCN_DAY_, FCN_HOUR_, FCN_LENGTH_, FCN_MINUTE_, FCN_MONTH_, FCN_SECOND_,
      FCN_SUBSTR_, FCN_TIME_, FCN_TIMESTAMP_, FCN_UPPER_, FCN_YEAR_};
private static final String [] testChoices = {"=", "<>", "<", ">", "<=", ">=",
        TEST_BETWEEN_, TEST_IN_, TEST_NOT_NULL_, TEST_NULL_, TEST_LIKE_};
private static final String [] otherChoices = {"AND", "OR"};

/**
Constructs a SQLQueryWherePane object.
Note init must be called to build the GUI contents.

@param parent The parent of this panel.
**/
public SQLQueryWherePane (SQLQueryBuilderPane parent)
{
    super(parent);
}


/**
Enables the appropriate controls after a function is chosen.
**/
void functionComplete()
{
    // Make appropriate controls available.
    fields_.setEnabled(false);
    notList_.setEnabled(false);
    functionList_.setEnabled(false);
    testList_.setEnabled(true);
}


/**
Called when an item in the function list is double-clicked on.
The request is processed, requesting additional information
from the user if needed, and the completed item is added
to the clause.

@param item The item that was chosen.
**/
/*private*/ void functionPicked(String item)
{
    // Variables used when putting up an additional dialog.
    String[] choices;    // choices for the user
    Object choice;       // what the user selected

    // -------------------------
    //   FCN_CURRENT_
    // -------------------------
    // Current requires a second value for date, time or timestamp.
    if (item.equals(FCN_CURRENT_))
    {
        choices = new String[]{"DATE", "TIME", "TIMESTAMP"};
        choice = JOptionPane.showInputDialog(this, // parent
            item, // message
            item, // title
            JOptionPane.QUESTION_MESSAGE,   // message type
            null, // icon
            choices,  // choices
            choices[0]);  // initial choice
        if (choice == null)  // null means they cancelled
            return;
        String text = "(CURRENT " + choice ;
        clause_.appendText(text);
        functionComplete();
    }

    // -------------------------
    //   FCN_CAST_
    // -------------------------
    // On AS400, cast is only valid at V4R2 or later.
    // Cast requires a field name and an SQL type.
    else if (item.equals(FCN_CAST_))
    {
        choices = getFieldNames();
        if (choices.length ==0)
        {
            // put up error message and return
            noFields(item);
            return;
        }
        list1 = new JComboBox();
        for (int i=0; i< choices.length; ++i)
            list1.addItem(choices[i]);
        JLabel asLabel = new JLabel("AS");
        list2 = new JComboBox();
        list2.setEditable(true); // allow users to change type - ie CHAR(10)
        list2.addItem("CHARACTER()");
        list2.addItem("DATE");
        list2.addItem("DECIMAL(,)");
        list2.addItem("DOUBLE");
        list2.addItem("FLOAT()");
        list2.addItem("GRAPHIC()");
        list2.addItem("INTEGER");
        list2.addItem("NUMERIC(,)");
        list2.addItem("REAL");
        list2.addItem("SMALLINT");
        list2.addItem("TIME");
        list2.addItem("TIMESTAMP");
        list2.addItem("VARCHAR()");
        list2.addItem("VARGRAPHIC()");
        JPanel choicePanel = new JPanel();
        choicePanel.add(list1);
        choicePanel.add(asLabel);
        choicePanel.add(list2);

        // Create buttons
        JButton okButton = new JButton(ResourceLoader.getQueryText("DBQUERY_BUTTON_OK"));
        final String fitem = item;
        okButton.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent ev)
                {
                    String choice1 = (String)list1.getSelectedItem();
                    String choice2 = (String)list2.getSelectedItem();
                    if (choice2 == null || choice2.equals(""))
                    {
                        // put up error message and return (leave dialog up)
                        JOptionPane.showMessageDialog(parent_, // parent
                            ResourceLoader.getQueryText("DBQUERY_MESSAGE_VALUE_MISSING") + " AS", // message
                            fitem + "() " + ResourceLoader.getQueryText("DBQUERY_TITLE_ERROR"), // title
                            JOptionPane.ERROR_MESSAGE ); // message type
                        return;
                    }
                    if (choice2.endsWith("()"))
                    {
                        // Create dialog for getting one length
                        String type = choice2.substring(0,choice2.length()-2);
                        boolean required = type.startsWith("VAR");
                        String prompt2;
                        if (required)
                            prompt2 = ResourceLoader.getQueryText("DBQUERY_TEXT_LENGTH_REQ");
                        else
                            prompt2 = ResourceLoader.getQueryText("DBQUERY_TEXT_LENGTH");
                        boolean error = true;
                        while (error)
                        {
                            String result = JOptionPane.showInputDialog(parent_, // parent
                                prompt2, // message
                                type + " " + ResourceLoader.getQueryText("DBQUERY_TITLE_LENGTH"), // title
                                JOptionPane.QUESTION_MESSAGE ); // message type
                            if (result.equals(""))
                            {
                                if (required)
                                {
                                    // put up error message
                                    JOptionPane.showMessageDialog(parent_, // parent
                                        ResourceLoader.getQueryText("DBQUERY_MESSAGE_INVALID_INT_VALUE3"), // message
                                        fitem + "() " + ResourceLoader.getQueryText("DBQUERY_TITLE_ERROR"), // title
                                        JOptionPane.ERROR_MESSAGE ); // message type
                                }
                                else
                                {
                                    choice2 = type;  // use default length, remove parens
                                    error = false;
                                }
                            }
                            else
                            {
                                // verify input is a number
                                try
                                {
                                    int i = Integer.parseInt(result);
                                    if (i > 0) error = false;
                                }
                                catch(NumberFormatException e) {}
                                if (error)
                                {
                                    // put up error message
                                    JOptionPane.showMessageDialog(parent_, // parent
                                        ResourceLoader.getQueryText("DBQUERY_MESSAGE_INVALID_INT_VALUE3"), // message
                                        fitem + "() " + ResourceLoader.getQueryText("DBQUERY_TITLE_ERROR"), // title
                                        JOptionPane.ERROR_MESSAGE ); // message type
                                }
                                else
                                    choice2 = type + "(" + result + ")"; // add length
                            }
                        }
                    }
                    else if (choice2.endsWith("(,)"))
                    {
                        // Create dialog for getting the total length (precision).
                        String type = choice2.substring(0,choice2.length()-3);
                        boolean error = true;
                        while (error)
                        {
                            String result = JOptionPane.showInputDialog(parent_, // parent
                                ResourceLoader.getQueryText("DBQUERY_TEXT_LENGTH_TOTAL"), // message
                                type + " " + ResourceLoader.getQueryText("DBQUERY_TITLE_LENGTH"), // title
                                JOptionPane.QUESTION_MESSAGE ); // message type
                            if (result.equals(""))
                            {
                                choice2 = type;  // use default length, remove parens
                                error = false;
                            }
                            else
                            {
                                // verify input is a number
                                try
                                {
                                    int i = Integer.parseInt(result);
                                    if (i >= 0) error = false;
                                }
                                catch(NumberFormatException e) {}
                                if (error)
                                {
                                    // put up error message
                                    JOptionPane.showMessageDialog(parent_, // parent
                                        ResourceLoader.getQueryText("DBQUERY_MESSAGE_INVALID_INT_VALUE3"), // message
                                        fitem + "() " + ResourceLoader.getQueryText("DBQUERY_TITLE_ERROR"), // title
                                        JOptionPane.ERROR_MESSAGE ); // message type
                                }
                                else
                                {
                                    choice2 = type + "(" + result + ")"; // add length

                                    // Put up second dialog asking for scale (decimal positions)
                                    error = true;
                                    while (error)
                                    {
                                        String result2 = JOptionPane.showInputDialog(parent_, // parent
                                            ResourceLoader.getQueryText("DBQUERY_TEXT_LENGTH_DECIMAL"), // message
                                            type + " " + ResourceLoader.getQueryText("DBQUERY_TITLE_LENGTH"), // title
                                            JOptionPane.QUESTION_MESSAGE ); // message type
                                        if (result2 == null)
                                        {
                                            choice2 = type + "(" + result + ")"; // add one length
                                            error = false;
                                        }                                          
                                        else if (result2.equals(""))
                                        {
                                            choice2 = type + "(" + result + ")"; // add one length
                                            error = false;
                                        }
                                        else
                                        {
                                            // verify input is a number
                                            try
                                            {
                                                int i = Integer.parseInt(result2);
                                                if (i >= 0) error = false;
                                            }
                                            catch(NumberFormatException e) {}
                                            if (error)
                                            {
                                                // put up error message
                                                JOptionPane.showMessageDialog(parent_, // parent
                                                    ResourceLoader.getQueryText("DBQUERY_MESSAGE_INVALID_INT_VALUE3"), // message
                                                    fitem + "() " + ResourceLoader.getQueryText("DBQUERY_TITLE_ERROR"), // title
                                                    JOptionPane.ERROR_MESSAGE ); // message type
                                            }
                                            else
                                                choice2 = type + "(" + result + "," + result2 + ")"; // add two lengths
                                        }
                                    }
                                }
                            }
                        }
                    }
                    String text;
                    /*if (choice2.indexOf("GRAPHIC") == 0 ||
                        choice2.indexOf("VARGRAPHIC") == 0)
                        // cast to graphic requires CCSID 13488
                        text = "(" + fitem + "(" + choice1 + " AS " + choice2 + " CCSID 13488)";
                    else*/
                        text = "(" + fitem + "(" + choice1 + " AS " + choice2 + ")";
                    clause_.appendText(text);
                    dialog.dispose();
                    functionComplete();
                }
            }  // end of ActionListenerAdapter
        );
        JButton cancelButton = new JButton(ResourceLoader.getQueryText("DBQUERY_BUTTON_CANCEL"));
        cancelButton.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent ev)
                {
                    dialog.dispose();
                }
            }
        );
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(okButton);
        buttonPanel.add(cancelButton);

        dialog = new JDialog(VUtilities.getFrame(this), item, true);
        dialog.getContentPane().setLayout(new BorderLayout());

        dialog.getContentPane().add("Center",new LabelledComponent(ResourceLoader.getQueryText("DBQUERY_TEXT_CHOOSE2") + " " + item + "()", choicePanel, false));
        dialog.getContentPane().add("South", buttonPanel);
        dialog.addWindowListener(
            new WindowAdapter() {
                public void windowClosing(WindowEvent ev)
                {
                    dialog.dispose();
                }
            }
        );
        dialog.pack();
        dialog.setLocationRelativeTo(this);
        dialog.setVisible(true);
    }

    // -------------------------
    //   FCN_CHAR_
    // -------------------------
    // Char requires a date, time or timestamp field, and then an
    // optional SQL datetime format.
    else if (item.equals(FCN_CHAR_))
    {
        choices = getDateTimeFieldNames();
        if (choices.length ==0)
        {
            // put up error message and return
            noFields(item);
            return;
        }
        list1 = new JComboBox();
        for (int i=0; i< choices.length; ++i)
            list1.addItem(choices[i]);
        list2 = new JComboBox();
        list2.addItem(" ");  // Blank for no choice
        list2.addItem("ISO");
        list2.addItem("USA");
        list2.addItem("EUR");
        list2.addItem("JIS");

        // Create buttons
        JButton okButton = new JButton(ResourceLoader.getQueryText("DBQUERY_BUTTON_OK"));
        final String fitem = item;
        okButton.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent ev)
                {
                    String choice1 = (String)list1.getSelectedItem();
                    String choice2 = (String)list2.getSelectedItem();
                    String text;
                    if (choice2.equals(" "))
                        text = "(" + fitem + "(" + choice1 + ")";
                    else
                        text = "(" + fitem + "(" + choice1 + ", " + choice2 +  ")";
                    clause_.appendText(text);
                    dialog.dispose();
                    functionComplete();
                }
            }  // end of ActionListenerAdapter
        );
        JButton cancelButton = new JButton(ResourceLoader.getQueryText("DBQUERY_BUTTON_CANCEL"));
        cancelButton.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent ev)
                {
                    dialog.dispose();
                }
            }
        );
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(okButton);
        buttonPanel.add(cancelButton);

        dialog = new JDialog(VUtilities.getFrame(this), item, true);
        dialog.getContentPane().setLayout(new BorderLayout());
        JPanel listPanel = new JPanel();
        listPanel.add(list1);
        listPanel.add(list2);
        dialog.getContentPane().add("Center", new LabelledComponent(ResourceLoader.getQueryText("DBQUERY_TEXT_CHOOSE2") + " " + item + "()", listPanel, false));
        dialog.getContentPane().add("South", buttonPanel);
        dialog.addWindowListener(
            new WindowAdapter() {
                public void windowClosing(WindowEvent ev)
                {dialog.dispose();}
            }
        );
        dialog.pack();
        dialog.setLocationRelativeTo(this);
        dialog.setVisible(true);
    }

    // -------------------------
    //   FCN_SUBSTR_
    // -------------------------
    // Substring requires a character field name, start index, and stop index.
    else if (item.equals(FCN_SUBSTR_))
    {
        // Substring requires a character field name and then two numbers
        // for the start and end.  We use the FROM/FOR syntax, so it
        // looks like this:  "SUBSTRING( FROM 2 FOR 6)
        // The FOR part is optional.
        choices = getCharacterFieldNames();
        if (choices.length ==0)
        {
            // put up error message and return
            noFields(item);
            return;
        }
        list1 = new JComboBox();
        for (int i=0; i< choices.length; ++i)
            list1.addItem(choices[i]);
        final String fieldFROM = "FROM";
        final String fieldFOR = "FOR";
        JLabel fromLabel = new JLabel(fieldFROM);
        JLabel forLabel = new JLabel(fieldFOR);
        textField1 = new JTextField("1", 3);
        textField2 = new JTextField(3);
        JPanel choicePanel = new JPanel();
        choicePanel.add(list1);
        choicePanel.add(fromLabel);
        choicePanel.add(textField1);
        choicePanel.add(forLabel);
        choicePanel.add(textField2);

        // Create buttons
        JButton okButton = new JButton(ResourceLoader.getQueryText("DBQUERY_BUTTON_OK"));
        final String fitem = item;
        okButton.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent ev)
                {
                    String choice1 = (String)list1.getSelectedItem();
                    String choice2 = textField1.getText().trim();
                    String choice3 = textField2.getText().trim();
                    String text;
                    if (choice2.equals(""))
                    {
                        // put up error message and return (leave dialog up)
                        JOptionPane.showMessageDialog(parent_, // parent
                            ResourceLoader.getQueryText("DBQUERY_MESSAGE_VALUE_MISSING") + " " + fieldFROM, // message
                            fitem + "() " + ResourceLoader.getQueryText("DBQUERY_TITLE_ERROR"), // title
                            JOptionPane.ERROR_MESSAGE ); // message type
                        return;
                    }
                    else
                    {
                        // verify input is a number
                        boolean error = false;
                        try
                        {
                            int i = Integer.parseInt(choice2);
                            if (i<1) error = true;
                        }
                        catch(NumberFormatException e) {error = true;}
                        if (error)
                        {
                            // put up error message and return (leave dialog up)
                            JOptionPane.showMessageDialog(parent_, // parent
                                fieldFROM + " " + ResourceLoader.getQueryText("DBQUERY_MESSAGE_INVALID_INT_VALUE2"), // message
                                fitem + "() " + ResourceLoader.getQueryText("DBQUERY_TITLE_ERROR"), // title
                                JOptionPane.ERROR_MESSAGE ); // message type
                            return;
                        }
                    }
                    if (choice3.equals(""))
                        text = fitem + "(" + choice1 + " FROM " + choice2 + ")";
                    else
                    {
                        // verify input is a number
                        boolean error = false;
                        try
                        {
                            int i = Integer.parseInt(choice3);
                            if (i<0) error = true;
                        }
                        catch(NumberFormatException e) {error = true;}
                        if (error)
                        {
                            // put up error message and return (leave dialog up)
                            JOptionPane.showMessageDialog(parent_, // parent
                                fieldFOR + " " + ResourceLoader.getQueryText("DBQUERY_MESSAGE_INVALID_INT_VALUE"), // message
                                fitem + "() " + ResourceLoader.getQueryText("DBQUERY_TITLE_ERROR"), // title
                                JOptionPane.ERROR_MESSAGE ); // message type
                            return;
                        }
                        text = fitem + "(" + choice1 + " FROM " + choice2 + " FOR " + choice3 + ")";
                    }
                    clause_.appendText("(" + text);
                    dialog.dispose();
                    functionComplete();
                }
            }  // end of ActionListenerAdapter
        );
        JButton cancelButton = new JButton(ResourceLoader.getQueryText("DBQUERY_BUTTON_CANCEL"));
        cancelButton.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent ev)
                {
                    dialog.dispose();
                }
            }
        );
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(okButton);
        buttonPanel.add(cancelButton);

        dialog = new JDialog(VUtilities.getFrame(this), item, true);
        dialog.getContentPane().setLayout(new BorderLayout());
        dialog.getContentPane().add("Center",new LabelledComponent(ResourceLoader.getQueryText("DBQUERY_TEXT_CHOOSE2") + " " + item + "()",
                                                                   choicePanel, false));
        dialog.getContentPane().add("South", buttonPanel);
        dialog.addWindowListener(
            new WindowAdapter() {
                public void windowClosing(WindowEvent ev)
                {dialog.dispose();}
            }
        );
        dialog.pack();
        dialog.setLocationRelativeTo(this);
        dialog.setVisible(true);
    }

    // -------------------------
    //   FCN_TIMESTAMP_
    // -------------------------
    // Timestamp requires either a timestamp field or a date field and
    // a time field.
    else if (item.equals(FCN_TIMESTAMP_))
    {
        // Make two panels, one for choosing a 1 date and 1 time field,
        // the other for choosing a timestamp field.  Have radio
        // buttons to switch between the panes.  Disable the pane and
        // button if the appropriate fields do not exist.

        // Get fields for each list.
        String[] dateFields = getFieldNamesOfType(Types.DATE);
        String[] timeFields = getFieldNamesOfType(Types.TIME);
        String[] timestampFields = getFieldNamesOfType(Types.TIMESTAMP);
        // Verify there are fields appropriate for this function
        boolean pane1valid = !(dateFields.length == 0 || timeFields.length == 0);
        boolean pane2valid = !(timestampFields.length == 0);
        if (!pane1valid && !pane2valid)
        {
            // put up error message and return
            noFields(item);
            return;
        }

        dialog = new JDialog(VUtilities.getFrame(this), item, true);
        dialog.getContentPane().setLayout(new BorderLayout());
        JPanel choicePane = new JPanel(new BorderLayout());
        pane1Active = pane1valid;  // switch for which pane active;
        JRadioButton pane1Button=null, pane2Button;
        // Make first panel for date and time fields
        if (pane1valid)
        {
            JPanel pane1 = new JPanel(new BorderLayout());
            pane1.setBorder(new CompoundBorder(
                new EmptyBorder(10,10,10,10),
                new CompoundBorder(LineBorder.createBlackLineBorder(),
                    new EmptyBorder(10,10,10,10))));
            if (pane2valid)  // need buttons only if both panes valid
            {
                pane1Button = new JRadioButton(
                    ResourceLoader.getQueryText("DBQUERY_BUTTON_TIMESTAMP_2_FIELDS"), true);
                pane1Button.setBorder(new EmptyBorder(0,10,10,10));
                pane1Button.addActionListener(
                    new ActionListener() {
                        public void actionPerformed(ActionEvent ev)
                        {
                            list1.setEnabled(true);
                            list2.setEnabled(true);
                            list3.setEnabled(false);
                            pane1Active = true;
                        }
                    }
                );
                pane1.add("North", pane1Button);
            }
            list1 = new JComboBox();
            for (int i=0; i




© 2015 - 2024 Weber Informatics LLC | Privacy Policy