org.archiviststoolkit.dialog.SubjectTermLookup.java Source code

Java tutorial

Introduction

Here is the source code for org.archiviststoolkit.dialog.SubjectTermLookup.java

Source

/**
 * Archivists' Toolkit(TM) Copyright  2005-2007 Regents of the University of California, New York University, & Five Colleges, Inc.
 * All rights reserved.
 *
 * This software is free. You can redistribute it and / or modify it under the terms of the Educational Community License (ECL)
 * version 1.0 (http://www.opensource.org/licenses/ecl1.php)
 *
 * This software 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 ECL license for more details about permissions and limitations.
 *
 *
 * Archivists' Toolkit(TM)
 * http://www.archiviststoolkit.org
 * info@archiviststoolkit.org
 *
 * Created by JFormDesigner on Thu Sep 29 11:19:45 EDT 2005
 */

package org.archiviststoolkit.dialog;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import com.jgoodies.forms.factories.*;
import com.jgoodies.forms.layout.*;
import org.archiviststoolkit.editor.SubjectEditor;
import org.archiviststoolkit.editor.SubjectEnabledEditorFields;
import org.archiviststoolkit.mydomain.*;
import org.archiviststoolkit.model.Subjects;
import org.archiviststoolkit.model.SubjectEnabledModel;
import org.archiviststoolkit.exceptions.DuplicateLinkException;
import org.archiviststoolkit.swing.StandardEditor;
import org.archiviststoolkit.swing.WorkSurfaceContainer;
import org.archiviststoolkit.ApplicationFrame;
import org.hibernate.exception.ConstraintViolationException;
import ca.odell.glazedlists.SortedList;
import ca.odell.glazedlists.FilterList;
import ca.odell.glazedlists.swing.TextComponentMatcherEditor;
import ca.odell.glazedlists.swing.EventTableModel;
import ca.odell.glazedlists.swing.TableComparatorChooser;

/**
 * @author Lee Mandell
 */
public class SubjectTermLookup extends JDialog {

    /**
     * Constructor used when linking names to archDescription records
      * @param owner - the owning dialog box
     * @param parentEditorFields - the domain editor fields to link to
     */
    public SubjectTermLookup(Dialog owner, SubjectEnabledEditorFields parentEditorFields) {
        super(owner);
        this.parentEditorFields = parentEditorFields;
        initComponents();
        selectPanel.setVisible(false);
        dialogForLinking = true;
        this.getRootPane().setDefaultButton(this.linkSubjectButton);
    }

    /**
     * Constructor used when simply selecting a subject
     * @param owner - the owning dialog box
     */
    public SubjectTermLookup(Dialog owner) {
        super(owner);
        initComponents();
        linkingPanel.setVisible(false);
        dialogForLinking = false;
        this.getRootPane().setDefaultButton(this.selectButton);
    }

    /**
     * Constructor used when simply selecting a subject
     */
    public SubjectTermLookup(SubjectEnabledEditorFields parentEditorFields) {
        super();
        this.parentEditorFields = parentEditorFields;
        initComponents();
        selectPanel.setVisible(false);
        dialogForLinking = true;
        this.getRootPane().setDefaultButton(this.linkSubjectButton);
    }

    public void setMainHeaderByClass(Class clazz) {
        StandardEditor.setMainHeaderColorAndTextByClass(clazz, mainHeaderPanel, mainHeaderLabel);
    }

    private void createSubjectButtonActionPerformed() {
        SubjectEnabledEditorFields parentEditorFields = this.parentEditorFields;
        SubjectEnabledModel subjectEnabledModel = (SubjectEnabledModel) parentEditorFields.getSubjectEnabledModel();

        DomainEditor dialog = new SubjectEditor(this);
        dialog.setButtonListeners();
        Subjects instance = new Subjects();
        dialog.setModel(instance, null);
        dialog.disableNavigationButtons();
        if (dialog.showDialog() == javax.swing.JOptionPane.OK_OPTION) {
            try {
                DomainAccessObject access = DomainAccessObjectFactory.getInstance()
                        .getDomainAccessObject(Subjects.class);
                access.add(instance);
                DomainObject link = subjectEnabledModel.addSubject(instance);
                parentEditorFields.getSubjectsTable().addDomainObject(link);
                Subjects.addSubjectToLookupList(instance);
                WorkSurfaceContainer.getWorkSurfaceByClass(Subjects.class).addToResultSet(instance);
                initLookup();
                resetSelection();
            } catch (ConstraintViolationException persistenceException) {
                JOptionPane.showMessageDialog(this, "Can't save, Duplicate record:" + instance);
            } catch (PersistenceException persistenceException) {
                if (persistenceException.getCause() instanceof ConstraintViolationException) {
                    JOptionPane.showMessageDialog(this, "Can't save, Duplicate record:" + instance);
                    return;
                }
                new ErrorDialog(this, "Error saving new record.", persistenceException).showDialog();
            } catch (DuplicateLinkException e1) {
                JOptionPane.showMessageDialog(this, e1.getMessage() + " is already linked to this record");
            }
        }
    }

    private void subjectLookupTableMouseClicked(MouseEvent e) {
        if (e.getClickCount() == 2) {
            if (dialogForLinking) {
                addSelectedSubjects();
            } else {
                status = javax.swing.JOptionPane.OK_OPTION;
                this.setVisible(false);
            }
        }
    }

    private void linkSubjectButtonActionPerformed() {
        if (getSubjectLookupTable().getSelectedRow() == -1) {
            JOptionPane.showMessageDialog(this, "You must select a subject to link");
        } else {
            addSelectedSubjects();
        }
    }

    public JButton getLinkSubjectButton() {
        return linkSubjectButton;
    }

    private void selectButtonActionPerformed() {
        if (getSubjectLookupTable().getSelectedRow() == -1) {
            JOptionPane.showMessageDialog(this, "You must select a subject");
        } else {
            status = javax.swing.JOptionPane.OK_OPTION;
            this.setVisible(false);
        }
    }

    public Subjects getSelectedSubject() {
        return (Subjects) subjectsTableModel.getElementAt(getSubjectLookupTable().getSelectedRow());
    }

    public JButton getSelectButton() {
        return selectButton;
    }

    private void doneButtonActionPerformed() {
        status = javax.swing.JOptionPane.CANCEL_OPTION;
        this.setVisible(false);
    }

    private void subjectLookupTableKeyTyped(KeyEvent e) {
        if (e.getKeyChar() == KeyEvent.VK_ENTER) {
            // check to see if we have multiple row selection. If not, we need to reset the selection
            // to fix ART-1705
            if (getSubjectLookupTable().getSelectedRowCount() == 1) {
                int row = getSubjectLookupTable().getSelectedRow();
                if (row == 0) { // must have selected last item is list so set rwo to the number of items in the list
                    row = getSubjectLookupTable().getRowCount();
                }
                row--; // go back one row and set that has the selected row
                getSubjectLookupTable().setRowSelectionInterval(row, row);
            }

            linkSubjectButtonActionPerformed();
        }

    }

    private void initComponents() {
        // JFormDesigner - Component initialization - DO NOT MODIFY  //GEN-BEGIN:initComponents
        // Generated using JFormDesigner non-commercial license
        dialogPane = new JPanel();
        HeaderPanel = new JPanel();
        mainHeaderPanel = new JPanel();
        mainHeaderLabel = new JLabel();
        panel3 = new JPanel();
        subHeaderLabel = new JLabel();
        contentPane = new JPanel();
        label1 = new JLabel();
        subjectLookup = new JTextField();
        scrollPane1 = new JScrollPane();
        subjectLookupTable = new DomainSortableTable(Subjects.class, subjectLookup);
        linkingPanel = new JPanel();
        label3 = new JLabel();
        label4 = new JLabel();
        buttonBar = new JPanel();
        linkSubjectButton = new JButton();
        createSubjectButton = new JButton();
        doneButton = new JButton();
        selectPanel = new JPanel();
        buttonBar2 = new JPanel();
        selectButton = new JButton();
        cancelButton = new JButton();
        CellConstraints cc = new CellConstraints();

        //======== this ========
        setModal(true);
        Container contentPane2 = getContentPane();
        contentPane2.setLayout(new BorderLayout());

        //======== dialogPane ========
        {
            dialogPane.setBorder(null);
            dialogPane.setBackground(new Color(200, 205, 232));
            dialogPane.setLayout(new BorderLayout());

            //======== HeaderPanel ========
            {
                HeaderPanel.setBackground(new Color(80, 69, 57));
                HeaderPanel.setOpaque(false);
                HeaderPanel.setFont(new Font("Trebuchet MS", Font.PLAIN, 13));
                HeaderPanel
                        .setLayout(new FormLayout(
                                new ColumnSpec[] {
                                        new ColumnSpec(
                                                Sizes.bounded(Sizes.MINIMUM, Sizes.dluX(100), Sizes.dluX(200))),
                                        new ColumnSpec(ColumnSpec.FILL, Sizes.DEFAULT, FormSpec.DEFAULT_GROW) },
                                RowSpec.decodeSpecs("default")));

                //======== mainHeaderPanel ========
                {
                    mainHeaderPanel.setBackground(new Color(80, 69, 57));
                    mainHeaderPanel.setFont(new Font("Trebuchet MS", Font.PLAIN, 13));
                    mainHeaderPanel
                            .setLayout(
                                    new FormLayout(
                                            new ColumnSpec[] { FormFactory.RELATED_GAP_COLSPEC,
                                                    new ColumnSpec(ColumnSpec.FILL, Sizes.DEFAULT,
                                                            FormSpec.DEFAULT_GROW) },
                                            new RowSpec[] { FormFactory.RELATED_GAP_ROWSPEC,
                                                    FormFactory.DEFAULT_ROWSPEC,
                                                    FormFactory.RELATED_GAP_ROWSPEC }));

                    //---- mainHeaderLabel ----
                    mainHeaderLabel.setText("Main Header");
                    mainHeaderLabel.setFont(new Font("Trebuchet MS", Font.PLAIN, 18));
                    mainHeaderLabel.setForeground(Color.white);
                    mainHeaderPanel.add(mainHeaderLabel, cc.xy(2, 2));
                }
                HeaderPanel.add(mainHeaderPanel, cc.xy(1, 1));

                //======== panel3 ========
                {
                    panel3.setBackground(new Color(66, 60, 111));
                    panel3.setFont(new Font("Trebuchet MS", Font.PLAIN, 13));
                    panel3.setLayout(new FormLayout(
                            new ColumnSpec[] { FormFactory.RELATED_GAP_COLSPEC,
                                    new ColumnSpec(ColumnSpec.FILL, Sizes.DEFAULT, FormSpec.DEFAULT_GROW) },
                            new RowSpec[] { FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
                                    FormFactory.RELATED_GAP_ROWSPEC }));

                    //---- subHeaderLabel ----
                    subHeaderLabel.setText("Subject Term Lookup");
                    subHeaderLabel.setFont(new Font("Trebuchet MS", Font.PLAIN, 18));
                    subHeaderLabel.setForeground(Color.white);
                    panel3.add(subHeaderLabel, cc.xy(2, 2));
                }
                HeaderPanel.add(panel3, cc.xy(2, 1));
            }
            dialogPane.add(HeaderPanel, BorderLayout.NORTH);

            //======== contentPane ========
            {
                contentPane.setOpaque(false);
                contentPane
                        .setLayout(
                                new FormLayout(
                                        new ColumnSpec[] { FormFactory.UNRELATED_GAP_COLSPEC,
                                                FormFactory.DEFAULT_COLSPEC,
                                                FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
                                                new ColumnSpec(ColumnSpec.FILL, Sizes.DEFAULT,
                                                        FormSpec.DEFAULT_GROW),
                                                FormFactory.DEFAULT_COLSPEC },
                                        new RowSpec[] { FormFactory.UNRELATED_GAP_ROWSPEC,
                                                FormFactory.DEFAULT_ROWSPEC, FormFactory.LINE_GAP_ROWSPEC,
                                                new RowSpec(RowSpec.FILL, Sizes.DEFAULT, FormSpec.DEFAULT_GROW),
                                                FormFactory.LINE_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
                                                FormFactory.LINE_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC }));

                //---- label1 ----
                label1.setText("Filter:");
                contentPane.add(label1, cc.xy(2, 2));
                contentPane.add(subjectLookup, cc.xy(4, 2));

                //======== scrollPane1 ========
                {
                    scrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

                    //---- subjectLookupTable ----
                    subjectLookupTable.setPreferredScrollableViewportSize(new Dimension(450, 300));
                    subjectLookupTable.addMouseListener(new MouseAdapter() {
                        @Override
                        public void mouseClicked(MouseEvent e) {
                            subjectLookupTableMouseClicked(e);
                        }
                    });
                    subjectLookupTable.addKeyListener(new KeyAdapter() {
                        @Override
                        public void keyTyped(KeyEvent e) {
                            subjectLookupTableKeyTyped(e);
                        }
                    });
                    scrollPane1.setViewportView(subjectLookupTable);
                }
                contentPane.add(scrollPane1, cc.xywh(2, 4, 3, 1));

                //======== linkingPanel ========
                {
                    linkingPanel.setOpaque(false);
                    linkingPanel.setLayout(new FormLayout(ColumnSpec.decodeSpecs("default:grow"),
                            new RowSpec[] { FormFactory.DEFAULT_ROWSPEC, FormFactory.LINE_GAP_ROWSPEC,
                                    FormFactory.DEFAULT_ROWSPEC, FormFactory.LINE_GAP_ROWSPEC,
                                    FormFactory.DEFAULT_ROWSPEC }));

                    //---- label3 ----
                    label3.setText("Double click on a Subject Term to add it to the record.");
                    linkingPanel.add(label3, cc.xy(1, 1));

                    //---- label4 ----
                    label4.setText("Or hit enter if a Term is highlighted.");
                    linkingPanel.add(label4, cc.xy(1, 3));

                    //======== buttonBar ========
                    {
                        buttonBar.setBorder(Borders.BUTTON_BAR_GAP_BORDER);
                        buttonBar.setBackground(new Color(231, 188, 251));
                        buttonBar.setOpaque(false);
                        buttonBar.setLayout(new FormLayout(
                                new ColumnSpec[] { FormFactory.DEFAULT_COLSPEC,
                                        FormFactory.LABEL_COMPONENT_GAP_COLSPEC, FormFactory.BUTTON_COLSPEC,
                                        FormFactory.RELATED_GAP_COLSPEC, FormFactory.BUTTON_COLSPEC },
                                RowSpec.decodeSpecs("pref")));

                        //---- linkSubjectButton ----
                        linkSubjectButton.setText("Link");
                        linkSubjectButton.setOpaque(false);
                        linkSubjectButton.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                linkSubjectButtonActionPerformed();
                            }
                        });
                        buttonBar.add(linkSubjectButton, cc.xy(1, 1));

                        //---- createSubjectButton ----
                        createSubjectButton.setText("Create Subject");
                        createSubjectButton.setOpaque(false);
                        createSubjectButton.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                createSubjectButtonActionPerformed();
                            }
                        });
                        buttonBar.add(createSubjectButton, cc.xy(3, 1));

                        //---- doneButton ----
                        doneButton.setText("Close Window");
                        doneButton.setOpaque(false);
                        doneButton.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                doneButtonActionPerformed();
                            }
                        });
                        buttonBar.add(doneButton, cc.xy(5, 1));
                    }
                    linkingPanel.add(buttonBar,
                            cc.xywh(1, 5, 1, 1, CellConstraints.RIGHT, CellConstraints.DEFAULT));
                }
                contentPane.add(linkingPanel, cc.xywh(2, 6, 3, 1));

                //======== selectPanel ========
                {
                    selectPanel.setOpaque(false);
                    selectPanel.setLayout(new FormLayout("default:grow", "default"));

                    //======== buttonBar2 ========
                    {
                        buttonBar2.setBorder(Borders.BUTTON_BAR_GAP_BORDER);
                        buttonBar2.setBackground(new Color(231, 188, 251));
                        buttonBar2.setOpaque(false);
                        buttonBar2
                                .setLayout(new FormLayout(
                                        new ColumnSpec[] { FormFactory.BUTTON_COLSPEC,
                                                FormFactory.RELATED_GAP_COLSPEC, FormFactory.BUTTON_COLSPEC },
                                        RowSpec.decodeSpecs("pref")));

                        //---- selectButton ----
                        selectButton.setText("Select");
                        selectButton.setOpaque(false);
                        selectButton.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                selectButtonActionPerformed();
                            }
                        });
                        buttonBar2.add(selectButton, cc.xy(1, 1));

                        //---- cancelButton ----
                        cancelButton.setText("Cancel");
                        cancelButton.setOpaque(false);
                        cancelButton.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                doneButtonActionPerformed();
                            }
                        });
                        buttonBar2.add(cancelButton, cc.xy(3, 1));
                    }
                    selectPanel.add(buttonBar2,
                            cc.xywh(1, 1, 1, 1, CellConstraints.RIGHT, CellConstraints.DEFAULT));
                }
                contentPane.add(selectPanel, cc.xywh(2, 8, 3, 1));
            }
            dialogPane.add(contentPane, BorderLayout.CENTER);
        }
        contentPane2.add(dialogPane, BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(getOwner());
        // JFormDesigner - End of component initialization  //GEN-END:initComponents

    }

    public JButton getCreateSubjectButton() {
        return createSubjectButton;
    }

    // JFormDesigner - Variables declaration - DO NOT MODIFY  //GEN-BEGIN:variables
    // Generated using JFormDesigner non-commercial license
    private JPanel dialogPane;
    private JPanel HeaderPanel;
    private JPanel mainHeaderPanel;
    private JLabel mainHeaderLabel;
    private JPanel panel3;
    private JLabel subHeaderLabel;
    private JPanel contentPane;
    private JLabel label1;
    private JTextField subjectLookup;
    private JScrollPane scrollPane1;
    private DomainSortableTable subjectLookupTable;
    private JPanel linkingPanel;
    private JLabel label3;
    private JLabel label4;
    private JPanel buttonBar;
    private JButton linkSubjectButton;
    private JButton createSubjectButton;
    private JButton doneButton;
    private JPanel selectPanel;
    private JPanel buttonBar2;
    private JButton selectButton;
    private JButton cancelButton;
    // JFormDesigner - End of variables declaration  //GEN-END:variables

    /**
     * The status of the editor.
     */
    protected int status = 0;
    private SubjectEnabledEditorFields parentEditorFields;
    FilterList textFilteredIssues;
    EventTableModel subjectsTableModel;
    boolean dialogForLinking;

    public final int showDialog() {

        this.pack();
        initLookup();
        setLocationRelativeTo(this.getOwner());
        subjectLookup.setText("");
        this.setVisible(true);

        return (status);
    }

    private void initLookup() {
        SortedList sortedSubjects = Subjects.getSubjectsGlazedList();
        textFilteredIssues = new FilterList(sortedSubjects,
                new TextComponentMatcherEditor(subjectLookup, new SubjectsFilterator()));
        subjectsTableModel = new EventTableModel(textFilteredIssues, new DomainTableFormat(Subjects.class));
        getSubjectLookupTable().setModel(subjectsTableModel);
        TableComparatorChooser tableSorter = new TableComparatorChooser(getSubjectLookupTable(), sortedSubjects,
                true);
        subjectLookup.requestFocusInWindow();
    }

    public JTable getSubjectLookupTable() {
        return subjectLookupTable;
    }

    public JTextField getSubjectLookup() {
        return subjectLookup;
    }

    public void setSubjectLookup(JTextField subjectLookup) {
        this.subjectLookup = subjectLookup;
    }

    private void addSelectedSubjects() {

        for (int selectedRow : getSubjectLookupTable().getSelectedRows()) {
            //            Subjects subject = (Subjects) subjectsTableModel.getElementAt(selectedRow);
            Subjects subject = (Subjects) textFilteredIssues.get(selectedRow);
            try {
                SubjectEnabledModel subjectEnabledModel = (SubjectEnabledModel) parentEditorFields
                        .getSubjectEnabledModel();
                DomainObject link = subjectEnabledModel.addSubject(subject);
                if (link != null) {
                    parentEditorFields.getSubjectsTable().addDomainObject(link);
                }
                //set the record to dirty
                ApplicationFrame.getInstance().setRecordDirty();
            } catch (DuplicateLinkException e) {
                JOptionPane.showMessageDialog(this, e.getMessage() + " is already linked to this record");
            }
        }
        resetSelection();
    }

    private void resetSelection() {
        subjectLookup.setText("");
        subjectLookup.requestFocusInWindow();
        subjectLookupTable.clearSelection();
    }

}