org.executequery.gui.editor.ManageShortcutsPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.executequery.gui.editor.ManageShortcutsPanel.java

Source

/*
 * ManageShortcutsPanel.java
 *
 * Copyright (C) 2002-2015 Takis Diakoumis
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 */

package org.executequery.gui.editor;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.swing.Action;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import org.apache.commons.lang.StringUtils;
import org.executequery.Constants;
import org.executequery.EventMediator;
import org.executequery.GUIUtilities;
import org.executequery.event.DefaultQueryShortcutEvent;
import org.executequery.event.QueryShortcutEvent;
import org.executequery.gui.ActionContainer;
import org.executequery.gui.DefaultActionButtonsPanel;
import org.executequery.gui.DefaultPanelButton;
import org.executequery.gui.text.SQLTextPane;
import org.executequery.repository.EditorSQLShortcut;
import org.executequery.repository.EditorSQLShortcuts;
import org.executequery.repository.RepositoryException;
import org.executequery.util.StringBundle;
import org.executequery.util.SystemResources;
import org.underworldlabs.swing.DefaultMutableListModel;
import org.underworldlabs.swing.FlatSplitPane;
import org.underworldlabs.swing.MutableValueJList;
import org.underworldlabs.swing.actions.ActionUtilities;
import org.underworldlabs.util.MiscUtils;

/** 
 *
 * @author   Takis Diakoumis
 * @version  $Revision: 1487 $
 * @date     $Date: 2015-08-23 22:21:42 +1000 (Sun, 23 Aug 2015) $
 */
public class ManageShortcutsPanel extends DefaultActionButtonsPanel implements ListSelectionListener {

    public static final String TITLE = "Manage Editor SQL Shortcuts";
    public static final String FRAME_ICON = "Shortcut16.png";

    private static final String SAVE_COMMAND_NAME = "save";
    private static final String CANCEL_COMMAND_NAME = "cancel";

    private JList list;

    private SQLTextPane textPane;

    private StringBundle bundle;

    private int lastSelectedIndex = -1;

    private final ActionContainer parent;

    public ManageShortcutsPanel(ActionContainer parent) {

        this.parent = parent;

        init();
    }

    private void init() {

        createTextPane();
        createList();

        JSplitPane splitPane = createSplitPane();
        splitPane.setLeftComponent(new JScrollPane(list));
        splitPane.setRightComponent(new JScrollPane(textPane));

        JPanel panel = new JPanel(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.gridy = 0;
        gbc.gridx = 1;
        gbc.insets.top = 5;
        gbc.insets.left = 5;
        gbc.insets.right = 5;
        panel.add(labelForKey("shortcuts"), gbc);
        gbc.gridy++;
        gbc.insets.bottom = 5;
        gbc.weighty = 1.0;
        gbc.weightx = 1.0;
        gbc.fill = GridBagConstraints.BOTH;
        panel.add(splitPane, gbc);
        gbc.gridx = 0;
        gbc.weightx = 0;
        gbc.weighty = 0;
        gbc.insets.left = 5;
        gbc.insets.right = 0;
        gbc.fill = GridBagConstraints.NONE;
        panel.add(createMoveButtonsPanel(), gbc);

        addActionButton(createSaveButton());
        addActionButton(createCancelButton());

        addContentPanel(panel);

        setPreferredSize(new Dimension(600, 350));
    }

    private JButton createCancelButton() {

        JButton button = new DefaultPanelButton(bundleString("cancelButton"));

        button.setActionCommand(CANCEL_COMMAND_NAME);
        button.addActionListener(this);

        return button;
    }

    private JButton createSaveButton() {

        JButton button = new DefaultPanelButton(bundleString("okButton"));

        button.setActionCommand(SAVE_COMMAND_NAME);
        button.addActionListener(this);

        return button;
    }

    private void createTextPane() {

        textPane = new SQLTextPane();
        textPane.setPreferredSize(new Dimension(300, 350));
    }

    private void createList() {

        list = new MutableValueJList(createModel());

        list.addListSelectionListener(this);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        if (modelFromList().size() >= 0) {

            list.setSelectedIndex(0);
        }

    }

    public void deleteShortcut() {

        int index = selectedIndex();

        if (index != -1) {

            try {

                list.removeListSelectionListener(this);

                DefaultListModel model = modelFromList();
                model.remove(index);

                lastSelectedIndex = -1;

                int size = model.getSize();
                if (size > 0) {

                    if (index > size - 1) {

                        list.setSelectedIndex(size - 1);

                    } else {

                        list.setSelectedIndex(index);
                    }

                    shortcutSelected();

                } else {

                    textPane.setText("");
                }

            } finally {

                list.addListSelectionListener(this);
            }

        }

    }

    public void addShortcut() {

        EditorSQLShortcut shortcut = new EditorSQLShortcut();
        shortcut.setShortcut(bundleString("newShortcutName"));
        shortcut.setQuery(Constants.EMPTY);

        DefaultListModel model = modelFromList();

        model.addElement(shortcut);
        int index = model.indexOf(shortcut);

        list.setSelectedIndex(index);
        list.scrollRectToVisible(list.getCellBounds(index, index));

        listEditingAction().actionPerformed(actionEventForEdit());
    }

    private Action listEditingAction() {
        return list.getActionMap().get("startEditing");
    }

    private ActionEvent actionEventForEdit() {
        return new ActionEvent(list, ActionEvent.ACTION_FIRST, null);
    }

    public void cancel() {
        parent.finished();
    }

    public void save() {

        try {

            storeQueryForShortcut();
            List<EditorSQLShortcut> shortcuts = shortcutsFromList();
            if (!shortcutsValid(shortcuts)) {

                GUIUtilities.displayErrorMessage(bundleString("invalidShortcuts"));
                return;
            }

            shortcuts().save(shortcuts);
            EventMediator.fireEvent(new DefaultQueryShortcutEvent(this, QueryShortcutEvent.SHORTCUT_ADDED));

            parent.finished();

        } catch (RepositoryException e) {

            GUIUtilities.displayExceptionErrorDialog(bundleString("saveError"), e);
        }
    }

    private boolean shortcutsValid(List<EditorSQLShortcut> shortcuts) {

        char[] whitespaces = { ' ', '\n', '\r', '\t' };
        for (EditorSQLShortcut shortcut : shortcuts) {

            if (nameExists(shortcut, shortcut.getShortcut())
                    || StringUtils.containsAny(shortcut.getShortcut(), whitespaces)
                    || MiscUtils.isNull(shortcut.getQuery())) {

                return false;
            }

        }

        return true;
    }

    public void valueChanged(ListSelectionEvent e) {

        if (lastSelectedIndex != -1) {

            storeQueryForShortcut();
        }

        if (selectedIndex() != -1) {

            shortcutSelected();
        }
    }

    private int selectedIndex() {
        return list.getSelectedIndex();
    }

    private void storeQueryForShortcut() {

        EditorSQLShortcut shortcut = getShortcutAt(lastSelectedIndex);

        if (shortcut != null) {

            shortcut.setQuery(textPane.getText().trim());
        }

    }

    private void shortcutSelected() {

        EditorSQLShortcut shortcut = getSelectedShortcut();
        textPane.setText(shortcut.getQuery().trim());

        lastSelectedIndex = selectedIndex();
    }

    private EditorSQLShortcut getShortcutAt(int index) {

        DefaultListModel model = modelFromList();

        if (index >= model.size()) {

            return null;
        }

        return (EditorSQLShortcut) model.elementAt(index);
    }

    private EditorSQLShortcut getSelectedShortcut() {
        return (EditorSQLShortcut) list.getSelectedValue();
    }

    private EditorSQLShortcuts shortcuts() {
        return EditorSQLShortcuts.getInstance();
    }

    private List<EditorSQLShortcut> shortcutsFromList() {

        Object[] shortcuts = modelFromList().toArray();
        List<EditorSQLShortcut> shortcutList = new ArrayList<EditorSQLShortcut>(shortcuts.length);

        for (Object shortcut : shortcuts) {

            shortcutList.add((EditorSQLShortcut) shortcut);
        }

        return shortcutList;
    }

    private StringBundle bundle() {
        if (bundle == null) {
            bundle = SystemResources.loadBundle(ManageShortcutsPanel.class);
        }
        return bundle;
    }

    private String bundleString(String key) {
        return bundle().getString("ManageShortcutsPanel." + key);
    }

    private DefaultListModel modelFromList() {

        return (DefaultListModel) list.getModel();
    }

    private ListModel createModel() {

        EditorSQLShortcutsListModel model = new EditorSQLShortcutsListModel();

        List<EditorSQLShortcut> shortcuts = shortcuts().getEditorShortcuts();
        for (EditorSQLShortcut shortcut : shortcuts) {

            model.addElement(shortcut);
        }

        return model;
    }

    class EditorSQLShortcutsListModel extends DefaultMutableListModel {

        public void setValueAt(Object value, int index) {

            if (value == null) {

                return;
            }

            String name = value.toString();

            if (MiscUtils.isNull(name)) {

                return;
            }

            EditorSQLShortcut shortcut = (EditorSQLShortcut) modelFromList().get(index);

            if (!nameExists(shortcut, name)) {

                shortcut.setShortcut(name);

            } else {

                GUIUtilities.displayErrorMessage(bundleString("validation.uniqueName"));
            }

        }

    }

    public boolean nameExists(EditorSQLShortcut shortcut, String name) {

        for (Enumeration<?> i = modelFromList().elements(); i.hasMoreElements();) {

            EditorSQLShortcut _shortcut = (EditorSQLShortcut) i.nextElement();

            if (name.equals(_shortcut.getShortcut()) && _shortcut != shortcut) {

                return true;
            }

        }

        return false;
    }

    private JPanel createMoveButtonsPanel() {

        JPanel panel = new JPanel(new GridBagLayout());

        JButton addButton = ActionUtilities.createButton(this, "addShortcut",
                GUIUtilities.loadIcon("ShortcutAdd16.png"), "Add shortcut");

        JButton deleteButton = ActionUtilities.createButton(this, "deleteShortcut",
                GUIUtilities.loadIcon("ShortcutDelete16.png"), "Delete shortcut");

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridy = 0;
        gbc.gridx = 0;
        gbc.insets.top = 0;
        gbc.insets.bottom = 10;
        gbc.fill = GridBagConstraints.NONE;
        gbc.anchor = GridBagConstraints.CENTER;
        panel.add(addButton, gbc);
        gbc.gridy++;
        panel.add(deleteButton, gbc);

        return panel;
    }

    private JLabel labelForKey(String key) {
        return new JLabel(bundleString(key));
    }

    private JSplitPane createSplitPane() {

        JSplitPane splitPane = new FlatSplitPane(JSplitPane.VERTICAL_SPLIT);

        splitPane.setDividerSize(4);
        splitPane.setResizeWeight(0.5);
        splitPane.setDividerLocation(0.5);

        return splitPane;
    }

}