ca.sqlpower.swingui.db.NewDataSourceTypePanel.java Source code

Java tutorial

Introduction

Here is the source code for ca.sqlpower.swingui.db.NewDataSourceTypePanel.java

Source

/*
 * Copyright (c) 2008, SQL Power Group Inc.
 *
 * This file is part of SQL Power Library.
 *
 * SQL Power Library 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
 * (at your option) any later version.
 *
 * SQL Power Library 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 ca.sqlpower.swingui.db;

import java.awt.Component;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;

import ca.sqlpower.sql.DataSourceCollection;
import ca.sqlpower.sql.JDBCDataSourceType;
import ca.sqlpower.swingui.DataEntryPanel;
import ca.sqlpower.swingui.Messages;

/**
 * This panel will appear when a user is creating a new data source type
 * to allow the user to choose which data source type to copy properties
 * from if they want to start with non-empty fields.
 */
public class NewDataSourceTypePanel implements DataEntryPanel {

    /**
     * The new type that the properties will be copied into if the user
     * selected a data source type to copy from.
     */
    private final JDBCDataSourceType dsType;

    /**
     * A combo box for users to choose which DS type to copy from.
     */
    private final JComboBox existingDSTypes;

    /**
     * The editor the new data source type created will be added to
     * to allow further customization by the user.
     */
    private final DataSourceTypeEditor editor;

    private final JPanel panel;

    /**
     * The radio button to indicate that the user wants to create a
     * new data source type that has no properties set.
     */
    private JRadioButton blankOption;

    /**
     * The radio button that indicates the user wants to create a copy
     * of an existing data source type.
     */
    private JRadioButton copyOption;

    public NewDataSourceTypePanel(DataSourceTypeEditor editor, DataSourceCollection collection) {
        this.editor = editor;
        this.dsType = new JDBCDataSourceType();
        dsType.setName(Messages.getString("DataSourceTypeEditor.defaultDataSourceName")); //$NON-NLS-1$

        existingDSTypes = new JComboBox(collection.getDataSourceTypes().toArray());
        existingDSTypes.setRenderer(new DefaultListCellRenderer() {
            @Override
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
                    boolean cellHasFocus) {
                Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if (c instanceof JLabel && value != null) {
                    ((JLabel) c).setText(((JDBCDataSourceType) value).getName());
                }
                return c;
            }
        });

        blankOption = new JRadioButton(new AbstractAction("Blank") {
            public void actionPerformed(ActionEvent e) {
                existingDSTypes.setEnabled(false);
            }
        });
        copyOption = new JRadioButton(new AbstractAction("Copy defaults from..") {
            public void actionPerformed(ActionEvent e) {
                existingDSTypes.setEnabled(true);
            }
        });
        ButtonGroup optionGroup = new ButtonGroup();
        optionGroup.add(blankOption);
        optionGroup.add(copyOption);
        blankOption.setSelected(true);
        existingDSTypes.setEnabled(false);

        panel = buildUI();
    }

    private JPanel buildUI() {
        DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout("pref"));
        builder.setDefaultDialogBorder();

        builder.append("New Data Source Type");
        builder.append(blankOption);
        builder.append(copyOption);
        builder.append(existingDSTypes);

        return builder.getPanel();
    }

    public boolean applyChanges() {
        if (copyOption.isSelected()) {
            JDBCDataSourceType defaultDSType = (JDBCDataSourceType) existingDSTypes.getSelectedItem();
            if (defaultDSType != null && defaultDSType != dsType) {
                for (String key : defaultDSType.getPropertyNames()) {
                    if (JDBCDataSourceType.TYPE_NAME.equals(key)) {
                        continue;
                    }
                    dsType.putProperty(key, defaultDSType.getProperty(key));
                }
            }
        }

        editor.addDsType(dsType);
        return true;
    }

    public void discardChanges() {
        //Do nothing
    }

    public JComponent getPanel() {
        return panel;
    }

    public boolean hasUnsavedChanges() {
        return true;
    }

    /**
     * Package private method for testing to change the radio buttons.
     */
    void setBlankOptionSelected(boolean selected) {
        blankOption.setSelected(selected);
        copyOption.setSelected(!selected);
    }

    /**
     * Package private method for testing to define which dsType will
     * be selected in the existingDSTypes combo box.
     * @param copyType
     */
    void setCopyDSType(JDBCDataSourceType copyType) {
        existingDSTypes.setSelectedItem(copyType);
    }

}