ca.phon.phon2csv.wizard.CSVColumnsStep.java Source code

Java tutorial

Introduction

Here is the source code for ca.phon.phon2csv.wizard.CSVColumnsStep.java

Source

/*
 * Phon - An open source tool for research in phonology.
 * Copyright (C) 2008 The Phon Project, Memorial University <http://phon.ling.mun.ca>
 * 
 * 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
 * (at your option) 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 ca.phon.phon2csv.wizard;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.text.html.HTMLEditorKit;

import org.jdesktop.swingx.JXList;

import ca.phon.phon2csv.CSVExportColumn;
import ca.phon.phon2csv.RecordNumberColumn;
import ca.phon.phon2csv.SessionInfoColumn;
import ca.phon.phon2csv.SpeakerInfoColumn;
import ca.phon.phon2csv.TierValueColumn;
import ca.phon.ui.decorations.DialogHeader;
import ca.phon.ui.wizard.WizardStep;
import ca.phon.util.PrefHelper;
import ca.phon.util.icons.IconManager;
import ca.phon.util.icons.IconSize;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

public class CSVColumnsStep extends WizardStep {

    private static final Logger LOGGER = Logger.getLogger(CSVColumnsStep.class.getName());

    private static final String columnHistory = "ca.phon.phon2csv.columnHistory";

    /* Documentation string */
    private static final String columnDocString = "<html><body>"
            + "<p>To add a column to the export type its name in the provided field and press enter."
            + "The following column names are valid:</p>" + "<ul>" + "<li>Record #</li>" + "<li>Session:Date</li>"
            + "<li>Session:Media</li>" + "<li>Session:Name</li>" + "<li>Speaker:Age</li>"
            + "<li>Speaker:Birthday</li>" + "<li>Speaker:Education</li>" + "<li>Speaker:Group</li>"
            + "<li>Speaker:Language</li>" + "<li>Speaker:Name</li>" + "<li>Speaker:Sex</li>"
            + "<li>Tier:&lt;tier name&gt;</li>" + "</ul>" + "</body></html>";

    /* UI */
    private DialogHeader header;

    private JTextField columnEntryField;
    private JTextPane docPane;
    private JXList columnList;

    private JButton addColumnBtn;
    private JButton upColumnBtn;
    private JButton downColumnBtn;
    private JButton removeColumnBtn;

    private JButton resetDefaultBtn;

    private DefaultListModel reportColumnModel;

    /* Actions */
    private ActionListener addColumnListener = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            String colText = columnEntryField.getText();
            //         columnEntryField.setText("");
            addColumn(colText);
        }

    };

    private ActionListener downColumnListener = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int selectedIdx = columnList.getSelectedIndex();
            if (selectedIdx >= 0 && selectedIdx < reportColumnModel.getSize() - 1) {
                moveColumnDown(selectedIdx);
            }
        }

    };

    private ActionListener upColumnListener = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int selectedIdx = columnList.getSelectedIndex();
            if (selectedIdx > 0 && selectedIdx < reportColumnModel.getSize()) {
                moveColumnUp(selectedIdx);
            }
        }

    };

    private ActionListener deleteColumnListener = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int selectedIdx = columnList.getSelectedIndex();
            if (selectedIdx >= 0 && selectedIdx < reportColumnModel.getSize()) {
                removeColumn(selectedIdx);
            }
        }

    };

    private final String defaultColumns = "Session:Name;Record #;Speaker:Name;Tier:Orthography;Tier:IPA Target;Tier:IPA Actual;Tier:Segment;Tier:Notes";

    private ActionListener resetColumnsListener = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            reportColumnModel.clear();
            for (CSVExportColumn col : parseColumnList(defaultColumns)) {
                reportColumnModel.addElement(col);
            }
        }

    };

    public CSVColumnsStep() {
        super();

        init();
    }

    private void init() {
        setLayout(new BorderLayout());

        JPanel centerPanel = new JPanel();
        FormLayout centerLayout = new FormLayout("250px, fill:pref:grow, pref",
                "pref, pref, pref, pref, fill:pref:grow, pref");
        CellConstraints cc = new CellConstraints();
        centerPanel.setLayout(centerLayout);

        docPane = new JTextPane();
        docPane.setEditorKit(new HTMLEditorKit());
        docPane.setText(columnDocString);
        centerPanel.add(new JScrollPane(docPane), cc.xywh(1, 1, 1, 6));

        reportColumnModel = new DefaultListModel();
        for (CSVExportColumn rc : getInitialColumnList())
            reportColumnModel.addElement(rc);
        columnList = new JXList(reportColumnModel);
        columnList.setCellRenderer(new ReportColumnCellRenderer());
        centerPanel.add(new JScrollPane(columnList), cc.xywh(2, 2, 1, 5));

        columnEntryField = new JTextField();
        columnEntryField.addActionListener(addColumnListener);
        centerPanel.add(columnEntryField, cc.xy(2, 1));

        ImageIcon addIcon = IconManager.getInstance().getIcon("actions/list-add", IconSize.SMALL);
        ImageIcon removeIcon = IconManager.getInstance().getIcon("actions/list-remove", IconSize.SMALL);
        ImageIcon upIcon = IconManager.getInstance().getIcon("actions/go-up", IconSize.SMALL);
        ImageIcon downIcon = IconManager.getInstance().getIcon("actions/go-down", IconSize.SMALL);
        ImageIcon resetIcon = IconManager.getInstance().getIcon("actions/reload", IconSize.SMALL);

        addColumnBtn = new JButton(addIcon);
        addColumnBtn.setToolTipText("Add column");
        addColumnBtn.addActionListener(addColumnListener);
        centerPanel.add(addColumnBtn, cc.xy(3, 1));

        upColumnBtn = new JButton(upIcon);
        upColumnBtn.setToolTipText("Move column up");
        upColumnBtn.addActionListener(upColumnListener);
        centerPanel.add(upColumnBtn, cc.xy(3, 3));

        downColumnBtn = new JButton(downIcon);
        downColumnBtn.setToolTipText("Move column down");
        downColumnBtn.addActionListener(downColumnListener);
        centerPanel.add(downColumnBtn, cc.xy(3, 4));

        removeColumnBtn = new JButton(removeIcon);
        removeColumnBtn.setToolTipText("Remove column");
        removeColumnBtn.addActionListener(deleteColumnListener);
        centerPanel.add(removeColumnBtn, cc.xy(3, 2));

        resetDefaultBtn = new JButton(resetIcon);
        resetDefaultBtn.setToolTipText("Reset to default");
        resetDefaultBtn.addActionListener(resetColumnsListener);
        centerPanel.add(resetDefaultBtn, cc.xy(3, 6));

        header = new DialogHeader("Set up Columns", "Set up columns for csv export");

        add(header, BorderLayout.NORTH);
        add(centerPanel, BorderLayout.CENTER);
    }

    /**
     * Turn a string into a ReportColumn
     * 
     * @param column name
     * @return the ReportColumn or null if invalid String
     */
    private CSVExportColumn getReportColumn(String colName) {
        CSVExportColumn retVal = null;

        String columnName = (colName != null ? colName.trim() : "");

        if (columnName.indexOf(':') >= 0) {
            String[] colParts = columnName.split(":");

            String part1 = colParts[0].trim();
            String part2 = (colParts.length == 2 ? colParts[1].trim() : "");

            if (part1.equalsIgnoreCase("Session")) {
                if (part2.equalsIgnoreCase("Name") || part2.length() == 0) {
                    retVal = new SessionInfoColumn();
                } else if (part2.equalsIgnoreCase("Date")) {
                    retVal = new SessionInfoColumn("Date");
                } else if (part2.equalsIgnoreCase("Media")) {
                    retVal = new SessionInfoColumn("Media");
                }
            } else if (part1.equalsIgnoreCase("Speaker")) {
                if (part2.equalsIgnoreCase("Name") || part2.length() == 0) {
                    retVal = new SpeakerInfoColumn("Name");
                } else if (part2.equalsIgnoreCase("Age")) {
                    retVal = new SpeakerInfoColumn("Age");
                } else if (part2.equalsIgnoreCase("Birthday")) {
                    retVal = new SpeakerInfoColumn("Birthday");
                } else if (part2.equalsIgnoreCase("Group")) {
                    retVal = new SpeakerInfoColumn("Group");
                } else if (part2.equalsIgnoreCase("Language")) {
                    retVal = new SpeakerInfoColumn("Language");
                } else if (part2.equalsIgnoreCase("Education")) {
                    retVal = new SpeakerInfoColumn("Education");
                } else if (part2.equalsIgnoreCase("Sex")) {
                    retVal = new SpeakerInfoColumn("Sex");
                }
            } else if (part1.equalsIgnoreCase("Tier")) {
                retVal = new TierValueColumn(part2);
            }
        } else if (columnName.equalsIgnoreCase("Record #")) {
            retVal = new RecordNumberColumn();
        }

        return retVal;
    }

    /**
     * Add a column to the list.
     */
    private void addColumn(String col) {
        CSVExportColumn c = getReportColumn(col);
        if (c == null) {
            LOGGER.warning("Invalid report column '" + col + "'");
            return;
        }
        if (!reportColumnModel.contains(c))
            reportColumnModel.addElement(c);
        columnEntryField.setText("");
    }

    /**
     * Move given column up in the list
     * 
     */
    private void moveColumnUp(int col) {
        CSVExportColumn c = (CSVExportColumn) reportColumnModel.remove(col);
        reportColumnModel.add(col - 1, c);
        columnList.setSelectedIndex(col - 1);
    }

    /**
     * Move given column down in list
     */
    private void moveColumnDown(int col) {
        CSVExportColumn c = (CSVExportColumn) reportColumnModel.remove(col);
        reportColumnModel.add(col + 1, c);
        columnList.setSelectedIndex(col + 1);
    }

    /**
     * Remove column
     */
    private void removeColumn(int col) {
        reportColumnModel.remove(col);
    }

    /**
     * Get the list initial list of columns.
     * Will return the last set of columns used
     * for a report or a default list.
     */
    private CSVExportColumn[] getInitialColumnList() {
        final String storedList = PrefHelper.get(columnHistory, defaultColumns);
        return parseColumnList(storedList);
    }

    /**
     * Create a column list from the given string.
     */
    private CSVExportColumn[] parseColumnList(String colList) {
        String[] fields = colList.split(";");
        List<CSVExportColumn> cols = new ArrayList<CSVExportColumn>();

        for (String f : fields) {
            CSVExportColumn c = getReportColumn(f);
            if (c != null)
                cols.add(c);
            else
                LOGGER.warning("Invalid report column '" + f + "'");
        }

        return cols.toArray(new CSVExportColumn[0]);
    }

    /**
     * Get the configured column list
     */
    public CSVExportColumn[] getColumns() {
        CSVExportColumn[] retVal = new CSVExportColumn[reportColumnModel.getSize()];
        reportColumnModel.copyInto(retVal);
        return retVal;
    }

    /**
     * Report Column renderer
     */
    private class ReportColumnCellRenderer extends DefaultListCellRenderer {

        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
                boolean cellHasFocus) {
            JLabel retVal = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected,
                    cellHasFocus);

            if (value != null) {
                CSVExportColumn c = (CSVExportColumn) value;
                retVal.setText(c.getTitle());
            }

            return retVal;
        }

    }

    @Override
    public boolean validateStep() {
        // save list of columns
        CSVExportColumn[] list = getColumns();
        String propVal = "";
        for (CSVExportColumn rc : list)
            propVal += (propVal.length() > 0 ? ";" : "") + rc.getTitle();
        PrefHelper.getUserPreferences().put(columnHistory, propVal);

        return super.validateStep();
    }

}