com.microsoft.intellij.forms.TablesQueryDesigner.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.intellij.forms.TablesQueryDesigner.java

Source

/**
 * Copyright (c) Microsoft Corporation
 * <p/>
 * All rights reserved.
 * <p/>
 * MIT License
 * <p/>
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
 * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
 * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 * <p/>
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of
 * the Software.
 * <p/>
 * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
 * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.microsoft.intellij.forms;

import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComboBoxTableRenderer;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.ui.table.JBTable;
import com.intellij.util.ui.table.ComboBoxTableCellEditor;
import com.microsoft.intellij.helpers.DatePickerCellEditor;
import com.microsoft.intellij.helpers.UIHelperImpl;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TablesQueryDesigner extends DialogWrapper {
    private JPanel contentPane;
    private JButton addClauseButton;
    private JTextArea queryTextArea;
    private JTable queryTable;
    private Runnable onFinish;

    public TablesQueryDesigner(Project project) {
        super(project, true);

        setModal(true);
        setTitle("Query Builder");

        DefaultTableModel model = new DefaultTableModel() {

            @Override
            public boolean isCellEditable(int row, int col) {
                return true;
            }
        };

        model.setColumnIdentifiers(new String[] { "", "And/Or", "Property Name", "Operation", "Value" });

        model.addTableModelListener(new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent tableModelEvent) {
                updateQueryText();
            }
        });

        queryTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        queryTable.setModel(model);

        queryTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

        JTableHeader tableHeader = queryTable.getTableHeader();
        tableHeader.setReorderingAllowed(false);
        tableHeader.setResizingAllowed(false);

        queryTable.getColumn("").setCellRenderer(new DeleteButtonRenderer());
        queryTable.getColumn("And/Or").setCellRenderer(new ComboBoxTableRenderer(LogicalOperator.values()));
        queryTable.getColumn("And/Or").setCellEditor(new ComboBoxTableCellEditor());
        queryTable.getColumn("Property Name").setCellRenderer(new ComboBoxTableRenderer(QueryField.values()));
        queryTable.getColumn("Property Name").setCellEditor(new ComboBoxTableCellEditor());
        queryTable.getColumn("Operation").setCellRenderer(new ComboBoxTableRenderer(Operator.values()));
        queryTable.getColumn("Operation").setCellEditor(new ComboBoxTableCellEditor());
        queryTable.getColumn("Value").setCellEditor(new DatePickerCellEditor() {
            @Override
            protected boolean isCellDate(JTable jTable, int row, int col) {
                return jTable.getValueAt(row, 2) == QueryField.Timestamp;
            }
        });

        queryTable.getColumn("").setPreferredWidth(30);
        queryTable.getColumn("And/Or").setPreferredWidth(30);
        queryTable.getColumn("Property Name").setPreferredWidth(100);

        addClauseButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                addClause();
            }
        });

        queryTable.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent mouseEvent) {
                int row = queryTable.rowAtPoint(mouseEvent.getPoint());
                int col = queryTable.columnAtPoint(mouseEvent.getPoint());
                if (col == 0) {
                    ((DefaultTableModel) queryTable.getModel()).removeRow(row);
                }
            }
        });

        addClause();

        init();
    }

    @Nullable
    @Override
    protected JComponent createCenterPanel() {
        return contentPane;
    }

    private void updateQueryText() {
        String query = "";

        DefaultTableModel model = (DefaultTableModel) queryTable.getModel();
        for (int i = 0; i != model.getRowCount(); i++) {
            LogicalOperator logicalOperator = (LogicalOperator) model.getValueAt(i, 1);
            QueryField queryField = (QueryField) model.getValueAt(i, 2);
            Operator operator = (Operator) model.getValueAt(i, 3);
            String value = model.getValueAt(i, 4).toString();

            if (queryField == QueryField.Timestamp) {
                try {
                    Date date = new SimpleDateFormat().parse(value);
                    value = "datetime'" + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(date) + "'";
                } catch (ParseException ignored) {
                }
            } else {
                value = "'" + value + "'";
            }

            query = query + String.format("%s %s %s %s ", (i == 0) ? "" : logicalOperator.toString().toLowerCase(),
                    queryField.toString(), getOperatorWCF(operator), value);
        }

        queryTextArea.setText(query);
    }

    private void addClause() {
        DefaultTableModel model = (DefaultTableModel) queryTable.getModel();
        model.addRow(new Object[] { "", LogicalOperator.And, QueryField.PartitionKey, Operator.EqualsTo, "" });
    }

    @Override
    protected void doOKAction() {
        onFinish.run();
        close(DialogWrapper.OK_EXIT_CODE, true);
    }

    private String getOperatorWCF(Operator op) {
        switch (op) {
        case EqualsTo:
            return "eq";
        case GreaterThan:
            return "gt";
        case GreaterThanOrEqualsTo:
            return "ge";
        case LessThan:
            return "lt";
        case LessThanOrEqualsTo:
            return "le";
        case NotEqualsTo:
            return "ne";
        }

        return null;
    }

    public String getQueryText() {
        return queryTextArea.getText();
    }

    public void setOnFinish(Runnable onFinish) {
        this.onFinish = onFinish;
    }

    private void createUIComponents() {
        queryTable = new JBTable();
    }

    private enum LogicalOperator {
        And, Or
    }

    private enum QueryField {
        PartitionKey, RowKey, Timestamp
    }

    private enum Operator {
        EqualsTo, GreaterThan, GreaterThanOrEqualsTo, LessThan, LessThanOrEqualsTo, NotEqualsTo;

        @Override
        public String toString() {
            switch (this) {
            case EqualsTo:
                return "Equals To";
            case GreaterThan:
                return "Greater Than";
            case GreaterThanOrEqualsTo:
                return "Greater Than Or Equals To";
            case LessThan:
                return "Less Than";
            case LessThanOrEqualsTo:
                return "Less Than Or Equals To";
            case NotEqualsTo:
                return "Not Equals To";
            }

            return super.toString();
        }
    }

    private class DeleteButtonRenderer extends DefaultTableCellRenderer {
        JButton deleteButton;

        public DeleteButtonRenderer() {
            deleteButton = new JButton();
            deleteButton.setIcon(UIHelperImpl.loadIcon("storagedelete.png"));
            deleteButton.setBorderPainted(false);
        }

        @Override
        public Component getTableCellRendererComponent(JTable jTable, Object o, boolean b, boolean b1, int row,
                int i1) {
            return deleteButton;
        }
    }
}