All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fcrepo.client.search.Search Maven / Gradle / Ivy

There is a newer version: 3.8.1
Show newest version
/* The contents of this file are subject to the license and copyright terms
 * detailed in the license directory at the root of the source tree (also
 * available online at http://fedora-commons.org/license/).
 */
package org.fcrepo.client.search;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;

import org.fcrepo.client.Administrator;
import org.fcrepo.server.types.gen.ComparisonOperator;
import org.fcrepo.server.types.gen.Condition;
import org.fcrepo.server.types.gen.FieldSearchQuery;
import org.fcrepo.server.types.gen.ObjectFactory;



/**
 * @author Chris Wilper
 */
public class Search
        extends JInternalFrame {

    private static final long serialVersionUID = 1L;

    private final List m_displayFields;

    private final JTextField m_simpleQueryField;

    private final ConditionsTableModel m_model;

    private final JTabbedPane m_tabbedPane;

    protected static String[] s_fieldArray =
            {"pid", "label", "state",
                    "ownerId", "cDate", "mDate", "dcmDate", "title", "creator",
                    "subject", "description", "publisher", "contributor",
                    "date", "type", "format", "identifier", "source",
                    "language", "relation", "coverage", "rights"};

    protected static String[] s_operatorArray =
            {"contains", "equals", "is less than", "is less than or equal to",
                    "is greater than", "is greater than or equal to"};

    protected static String[] s_operatorActuals =
            {"has", "eq", "lt", "le", "gt", "ge"};

    public Search() {
        super("Search Repository", true, //resizable
              true, //closable
              true, //maximizable
              true);//iconifiable

        m_displayFields = new ArrayList();
        m_displayFields.add("pid");
        m_displayFields.add("cDate");
        m_displayFields.add("title");

        // NORTH: fieldsPanel(selectedFieldsLabel, modifySelectedFieldsButtonPanel)

        // CENTER: selectedFieldsLabel
        JLabel selectedFieldsLabel = new JLabel();
        StringBuffer text = new StringBuffer();
        text.append("");
        for (int i = 0; i < m_displayFields.size(); i++) {
            if (i > 0) {
                text.append(", ");
            }
            text.append(m_displayFields.get(i));
        }
        text.append("");
        selectedFieldsLabel.setText(text.toString());

        // EAST: modifySelectedFieldsButton
        JButton modifySelectedFieldsButton = new JButton("Change..");
        ChangeFieldsButtonListener cfbl =
                new ChangeFieldsButtonListener(selectedFieldsLabel,
                                               m_displayFields);
        modifySelectedFieldsButton.addActionListener(cfbl);

        JPanel fieldsPanel = new JPanel();
        fieldsPanel.setLayout(new BorderLayout());
        fieldsPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory
                .createTitledBorder(BorderFactory.createEtchedBorder(),
                                    "Fields to Display"), BorderFactory
                .createEmptyBorder(0, 6, 6, 6)));
        fieldsPanel.add(selectedFieldsLabel, BorderLayout.CENTER);
        fieldsPanel.add(modifySelectedFieldsButton, BorderLayout.EAST);

        // CENTER: tabbedPaneContainer(m_tabbedPane)

        // CENTER: m_tabbedPane(simpleSearchPanel, advancedSearchPanel)

        // PANE 1: simpleSearchPanel(simplePromptPanel, simpleInstructionsLabel)

        // NORTH: simplePromptPanel(promptLabel, m_simpleQueryField)

        // FLOW: promptLabel

        JLabel promptLabel = new JLabel("Search all fields for ");

        // FLOW: m_simpleQueryField

        m_simpleQueryField = new JTextField("*", 15);

        JPanel simplePromptPanel = new JPanel();
        simplePromptPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        simplePromptPanel.add(promptLabel);
        simplePromptPanel.add(m_simpleQueryField);

        // SOUTH: simpleInstructionsLabel

        JLabel simpleInstructionsLabel =
                new JLabel("Note: You may use the ? and * wildcards.  '?' means any one character, and '*' means any number of any characters. Searches are case-insensitive.");

        JPanel simpleSearchPanel = new JPanel();
        simpleSearchPanel.setLayout(new BorderLayout());
        simpleSearchPanel
                .setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
        simpleSearchPanel.add(simplePromptPanel, BorderLayout.NORTH);
        simpleSearchPanel.add(simpleInstructionsLabel, BorderLayout.CENTER);

        // PANE 2: advancedSearchPanel(innerConditionsPanel, modifyConditionsOuterPanel)

        // CENTER: innerConditionsPanel(conditionsScrollPane)

        // CENTER: conditionsScrollPane(conditionsTable)

        // WRAPS: conditionsTable
        m_model = new ConditionsTableModel();
        JTable conditionsTable = new JTable(m_model);

        JScrollPane conditionsScrollPane = new JScrollPane(conditionsTable);
        conditionsScrollPane.setBorder(BorderFactory.createEmptyBorder(0,
                                                                       0,
                                                                       6,
                                                                       6));

        JPanel innerConditionsPanel = new JPanel();
        innerConditionsPanel.setLayout(new BorderLayout());
        innerConditionsPanel.add(conditionsScrollPane, BorderLayout.CENTER);

        // EAST: modifyConditionsOuterPanel(modifyConditionsInnerPanel)

        // NORTH: modifyConditionsInnerPanel

        // GRID: addConditionButton
        JButton addConditionButton = new JButton("Add..");

        // GRID: modifyConditionButton
        JButton modifyConditionButton = new JButton("Change..");

        // GRID: deleteConditionButton
        JButton deleteConditionButton = new JButton("Delete");

        // Now that buttons are available, register the
        // list selection listener that sets their enabled state.
        conditionsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        ConditionSelectionListener sListener =
                new ConditionSelectionListener(modifyConditionButton,
                                               deleteConditionButton,
                                               -1);
        conditionsTable.getSelectionModel().addListSelectionListener(sListener);
        // ..and add listeners to the buttons

        addConditionButton
                .addActionListener(new AddConditionButtonListener(m_model));
        modifyConditionButton
                .addActionListener(new ChangeConditionButtonListener(m_model,
                                                                     sListener));
        deleteConditionButton
                .addActionListener(new DeleteConditionButtonListener(m_model,
                                                                     sListener));

        JPanel modifyConditionsInnerPanel = new JPanel();
        modifyConditionsInnerPanel.setLayout(new GridLayout(3, 1));
        modifyConditionsInnerPanel.add(addConditionButton);
        modifyConditionsInnerPanel.add(modifyConditionButton);
        modifyConditionsInnerPanel.add(deleteConditionButton);

        JPanel modifyConditionsOuterPanel = new JPanel();
        modifyConditionsOuterPanel.setLayout(new BorderLayout());
        modifyConditionsOuterPanel.add(modifyConditionsInnerPanel,
                                       BorderLayout.NORTH);

        JPanel advancedSearchPanel = new JPanel();
        advancedSearchPanel.setLayout(new BorderLayout());
        advancedSearchPanel.setBorder(BorderFactory.createEmptyBorder(6,
                                                                      6,
                                                                      6,
                                                                      6));
        advancedSearchPanel.add(innerConditionsPanel, BorderLayout.CENTER);
        advancedSearchPanel.add(modifyConditionsOuterPanel, BorderLayout.EAST);

        m_tabbedPane = new JTabbedPane();
        m_tabbedPane.addTab("Simple", simpleSearchPanel);
        m_tabbedPane.setSelectedIndex(0);
        m_tabbedPane.addTab("Advanced", advancedSearchPanel);

        JPanel tabbedPaneContainer = new JPanel();
        tabbedPaneContainer.setLayout(new BorderLayout());
        tabbedPaneContainer
                .setBorder(BorderFactory
                        .createCompoundBorder(BorderFactory
                                                      .createEmptyBorder(6,
                                                                         0,
                                                                         6,
                                                                         0),
                                              BorderFactory
                                                      .createCompoundBorder(BorderFactory
                                                                                    .createTitledBorder(BorderFactory
                                                                                                                .createEtchedBorder(),
                                                                                                        "Query"),
                                                                            BorderFactory
                                                                                    .createEmptyBorder(0,
                                                                                                       6,
                                                                                                       6,
                                                                                                       6))));
        tabbedPaneContainer.add(m_tabbedPane, BorderLayout.CENTER);

        // SOUTH: finishButtonsPanel

        // FLOW: searchButton
        JButton searchButton = new JButton("Search");
        searchButton.addActionListener(new SearchButtonListener(cfbl, m_model));

        // FLOW: cancelButton
        JButton cancelButton = new JButton("Cancel");
        cancelButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                doDefaultCloseAction();
            }
        });

        JPanel finishButtonsPanel = new JPanel();
        finishButtonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
        finishButtonsPanel.add(searchButton);
        finishButtonsPanel.add(cancelButton);

        JPanel outerPane = new JPanel();
        outerPane.setLayout(new BorderLayout());
        outerPane.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
        outerPane.add(fieldsPanel, BorderLayout.NORTH);
        outerPane.add(tabbedPaneContainer, BorderLayout.CENTER);
        outerPane.add(finishButtonsPanel, BorderLayout.SOUTH);

        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(outerPane, BorderLayout.CENTER);

        ImageIcon searchIcon =
            new ImageIcon(ClassLoader.
                          getSystemResource("images/client/standard/general/Search16.gif"));
        setFrameIcon(searchIcon);

        setSize(400, 400);
    }

    public class ConditionSelectionListener
            implements ListSelectionListener {

        private int m_selectedRow;

        private final JButton m_modifyButton;

        private final JButton m_deleteButton;

        public ConditionSelectionListener(JButton modifyButton,
                                          JButton deleteButton,
                                          int selectedRow) {
            m_selectedRow = selectedRow;
            m_modifyButton = modifyButton;
            m_deleteButton = deleteButton;
            updateButtons();
        }

        @Override
        public void valueChanged(ListSelectionEvent e) {
            //Ignore extra messages.
            if (e.getValueIsAdjusting()) {
                return;
            }

            ListSelectionModel lsm = (ListSelectionModel) e.getSource();
            if (lsm.isSelectionEmpty()) {
                m_selectedRow = -1;
            } else {
                m_selectedRow = lsm.getMinSelectionIndex();
            }
            updateButtons();
        }

        public int getSelectedRow() {
            return m_selectedRow;
        }

        private void updateButtons() {
            if (getSelectedRow() == -1) {
                m_modifyButton.setEnabled(false);
                m_deleteButton.setEnabled(false);
            } else {
                m_modifyButton.setEnabled(true);
                m_deleteButton.setEnabled(true);
            }
        }
    }

    public class SelectFieldsDialog
            extends JDialog {

        private static final long serialVersionUID = 1L;

        private List m_selectedFields;

        private final JCheckBox pidBox, typeBox, labelBox,
                formatBox, titleBox, identifierBox,
                creatorBox, sourceBox, stateBox, subjectBox, languageBox,
                ownerIdBox, descriptionBox, relationBox, cDateBox,
                publisherBox, coverageBox, mDateBox, contributorBox, rightsBox,
                dcmDateBox, dateBox;

        public SelectFieldsDialog(List fieldList) {
            super(Administrator.getInstance(), "Select Fields to Display", true);

            // mainPanel(northPanel, noteLabel, southPanel)

            // NORTH: northPanel(bunch of JCheckBoxes)

            pidBox = new JCheckBox("pid", fieldList.contains("pid"));
            pidBox.setToolTipText("a globally unique id");
            typeBox = new JCheckBox("type", fieldList.contains("type"));
            typeBox
                    .setToolTipText("a list of dc:type values, indicating nature or genre");
            labelBox = new JCheckBox("label", fieldList.contains("label"));
            labelBox.setToolTipText("a human-readable name");
            formatBox = new JCheckBox("format", fieldList.contains("format"));
            formatBox
                    .setToolTipText("a list of dc:format values, indicating physical or digital forms");

            titleBox = new JCheckBox("title", fieldList.contains("title"));
            titleBox.setToolTipText("a list of dc:title values (names)");
            identifierBox =
                    new JCheckBox("identifier", fieldList
                            .contains("identifier"));
            identifierBox
                    .setToolTipText("a list of dc:identifier values, providing unambiguous ids in certain contexts");
            creatorBox =
                    new JCheckBox("creator", fieldList.contains("creator"));
            creatorBox
                    .setToolTipText("a list of dc:creator values, identifying primary maker(s) of the content");
            sourceBox = new JCheckBox("source", fieldList.contains("source"));
            sourceBox
                    .setToolTipText("a list of dc:source values, identifying resources from which this resource is derived");
            stateBox = new JCheckBox("state", fieldList.contains("state"));
            stateBox.setToolTipText("the state of the object, A for active");
            subjectBox =
                    new JCheckBox("subject", fieldList.contains("subject"));
            subjectBox
                    .setToolTipText("a list of dc:subject values, indicating the topic of the resource");
            languageBox =
                    new JCheckBox("language", fieldList.contains("language"));
            languageBox
                    .setToolTipText("a list of dc:language values, language(s) of the intellectual content");
            ownerIdBox =
                    new JCheckBox("ownerId", fieldList.contains("ownerId"));
            ownerIdBox
                    .setToolTipText("owner id, the identity of the repository user who owns the object");
            descriptionBox =
                    new JCheckBox("description", fieldList
                            .contains("description"));
            descriptionBox
                    .setToolTipText("a list of description values; accounts of the content of the resouces");
            relationBox =
                    new JCheckBox("relation", fieldList.contains("relation"));
            relationBox
                    .setToolTipText("a list of dc:relation values, identifying related resources");
            cDateBox = new JCheckBox("cDate", fieldList.contains("cDate"));
            cDateBox
                    .setToolTipText("creation date, the date the object was first created in the repository");
            publisherBox =
                    new JCheckBox("publisher", fieldList.contains("publisher"));
            publisherBox
                    .setToolTipText("a list of dc:publisher values, entities responsible for making the resouce available");
            coverageBox =
                    new JCheckBox("coverage", fieldList.contains("coverage"));
            coverageBox
                    .setToolTipText("a list of dc:coverage values, indicating the extent or scope of the content");
            mDateBox = new JCheckBox("mDate", fieldList.contains("mDate"));
            mDateBox
                    .setToolTipText("modified date, the last date the object was changed");
            contributorBox =
                    new JCheckBox("contributor", fieldList
                            .contains("contributor"));
            contributorBox
                    .setToolTipText("a list of dc:contributor values, identifying content-contributing entities");
            rightsBox = new JCheckBox("rights", fieldList.contains("rights"));
            rightsBox
                    .setToolTipText("a list of dc:rights values, regarding rights held in and over the resource");
            dcmDateBox =
                    new JCheckBox("dcmDate", fieldList.contains("dcmDate"));
            dcmDateBox
                    .setToolTipText("dublin core modified date, the date of the last change to the DC record");
            dateBox = new JCheckBox("date", fieldList.contains("date"));
            dateBox
                    .setToolTipText("a list of dc:date values, identifying significant events in the resource's lifecycle");

            JPanel northPanel = new JPanel();
            northPanel.setLayout(new GridLayout(9, 3));
            northPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
            northPanel.add(pidBox);
            northPanel.add(typeBox);
            northPanel.add(labelBox);
            northPanel.add(formatBox);
            northPanel.add(titleBox);
            northPanel.add(identifierBox);
            northPanel.add(creatorBox);
            northPanel.add(sourceBox);
            northPanel.add(stateBox);
            northPanel.add(subjectBox);
            northPanel.add(languageBox);
            northPanel.add(ownerIdBox);
            northPanel.add(descriptionBox);
            northPanel.add(relationBox);
            northPanel.add(cDateBox);
            northPanel.add(publisherBox);
            northPanel.add(coverageBox);
            northPanel.add(mDateBox);
            northPanel.add(contributorBox);
            northPanel.add(rightsBox);
            northPanel.add(dcmDateBox);
            northPanel.add(dateBox);

            // CENTER: noteLabel

            JLabel noteLabel =
                    new JLabel(" Note: Hold your mouse over a field's name to see a brief description.");

            // SOUTH: southPanel(cancelButton, okButton)

            JButton okButton = new JButton("OK");
            okButton.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    updateSelectedFields();
                    setVisible(false);
                }
            });

            JButton cancelButton = new JButton("Cancel");
            cancelButton.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    setVisible(false);
                }
            });

            JPanel southPanel = new JPanel();
            southPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
            southPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
            southPanel.add(okButton);
            southPanel.add(cancelButton);

            getContentPane().setLayout(new BorderLayout());
            getContentPane().add(northPanel, BorderLayout.NORTH);
            getContentPane().add(noteLabel, BorderLayout.CENTER);
            getContentPane().add(southPanel, BorderLayout.SOUTH);
            pack();
            setLocation(Administrator.getInstance()
                    .getCenteredPos(getSize().width, getSize().height));
        }

        public void updateSelectedFields() {
            m_selectedFields = new ArrayList();
            if (pidBox.isSelected()) {
                m_selectedFields.add("pid");
            }
            if (labelBox.isSelected()) {
                m_selectedFields.add("label");
            }
            if (stateBox.isSelected()) {
                m_selectedFields.add("state");
            }
            if (ownerIdBox.isSelected()) {
                m_selectedFields.add("ownerId");
            }
            if (cDateBox.isSelected()) {
                m_selectedFields.add("cDate");
            }
            if (mDateBox.isSelected()) {
                m_selectedFields.add("mDate");
            }
            if (dcmDateBox.isSelected()) {
                m_selectedFields.add("dcmDate");
            }
            if (titleBox.isSelected()) {
                m_selectedFields.add("title");
            }
            if (creatorBox.isSelected()) {
                m_selectedFields.add("creator");
            }
            if (subjectBox.isSelected()) {
                m_selectedFields.add("subject");
            }
            if (descriptionBox.isSelected()) {
                m_selectedFields.add("description");
            }
            if (publisherBox.isSelected()) {
                m_selectedFields.add("publisher");
            }
            if (contributorBox.isSelected()) {
                m_selectedFields.add("contributor");
            }
            if (dateBox.isSelected()) {
                m_selectedFields.add("date");
            }
            if (typeBox.isSelected()) {
                m_selectedFields.add("type");
            }
            if (formatBox.isSelected()) {
                m_selectedFields.add("format");
            }
            if (identifierBox.isSelected()) {
                m_selectedFields.add("identifier");
            }
            if (sourceBox.isSelected()) {
                m_selectedFields.add("source");
            }
            if (languageBox.isSelected()) {
                m_selectedFields.add("language");
            }
            if (relationBox.isSelected()) {
                m_selectedFields.add("relation");
            }
            if (coverageBox.isSelected()) {
                m_selectedFields.add("coverage");
            }
            if (rightsBox.isSelected()) {
                m_selectedFields.add("rights");
            }
        }

        public List getSelectedFields() {
            return m_selectedFields;
        }

    }

    public class AddConditionButtonListener
            implements ActionListener {

        private final ConditionsTableModel m_model;

        public AddConditionButtonListener(ConditionsTableModel model) {
            m_model = model;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            ModConditionDialog dialog = new ModConditionDialog(m_model, -1);
            dialog.setVisible(true);
        }
    }

    public class ChangeConditionButtonListener
            implements ActionListener {

        private final ConditionsTableModel m_model;

        private final ConditionSelectionListener m_sListener;

        public ChangeConditionButtonListener(ConditionsTableModel model,
                                             ConditionSelectionListener sListener) {
            m_model = model;
            m_sListener = sListener;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // will only be invoked if an existing row is selected
            ModConditionDialog dialog =
                    new ModConditionDialog(m_model, m_sListener
                            .getSelectedRow());
            dialog.setVisible(true);
        }
    }

    public class DeleteConditionButtonListener
            implements ActionListener {

        private final ConditionsTableModel m_model;

        private final ConditionSelectionListener m_sListener;

        public DeleteConditionButtonListener(ConditionsTableModel model,
                                             ConditionSelectionListener sListener) {
            m_model = model;
            m_sListener = sListener;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // will only be invoked if an existing row is selected
            int r = m_sListener.getSelectedRow();
            m_model.getConditions().remove(r);
            m_model.fireTableRowsDeleted(r, r);
        }
    }

    public class ModConditionDialog
            extends JDialog {

        private static final long serialVersionUID = 1L;

        private final ConditionsTableModel m_model;

        private final int m_rowNum;

        private final JComboBox m_fieldBox;

        private final JComboBox m_operatorBox;

        private final JTextField m_valueField;

        public ModConditionDialog(ConditionsTableModel model, int rowNum) {
            super(Administrator.getInstance(), "Enter Condition", true);
            m_model = model;
            m_rowNum = rowNum;

            // mainPanel(northPanel, southPanel)

            // NORTH: northPanel(fieldBox,operatorBox,valueField)

            m_fieldBox = new JComboBox(s_fieldArray);
            m_operatorBox = new JComboBox(s_operatorArray);
            m_valueField = new JTextField(10);
            if (rowNum != -1) {
                // if this is an edit, start with current values
                m_fieldBox.setSelectedIndex(indexOf((String) m_model
                        .getValueAt(rowNum, 0)));
                m_operatorBox.setSelectedIndex(indexOf((String) m_model
                        .getValueAt(rowNum, 1)));
                m_valueField.setText((String) m_model.getValueAt(rowNum, 2));
            }

            JPanel northPanel = new JPanel();
            northPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
            northPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
            northPanel.add(m_fieldBox);
            northPanel.add(m_operatorBox);
            northPanel.add(m_valueField);

            // SOUTH: southPanel(cancelButton, okButton)

            JButton okButton = new JButton("OK");
            okButton.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    updateModelAndNotify();
                    setVisible(false);
                }
            });

            JButton cancelButton = new JButton("Cancel");
            cancelButton.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    setVisible(false);
                }
            });

            JPanel southPanel = new JPanel();
            southPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
            southPanel.add(okButton);
            southPanel.add(cancelButton);

            getContentPane().setLayout(new BorderLayout());
            getContentPane().add(northPanel, BorderLayout.NORTH);
            getContentPane().add(southPanel, BorderLayout.SOUTH);
            pack();
            setLocation(Administrator.getInstance()
                    .getCenteredPos(getSize().width, getSize().height));
        }

        private int indexOf(String s) {
            for (int i = 0; i < s_fieldArray.length; i++) {
                if (s_fieldArray[i].equals(s)) {
                    return i;
                }
            }
            for (int i = 0; i < s_operatorArray.length; i++) {
                if (s_operatorArray[i].equals(s)) {
                    return i;
                }
            }
            return -1;
        }

        public void updateModelAndNotify() {
            // create a Condition given the current values
            Condition cond = new Condition();
            cond.setProperty(s_fieldArray[m_fieldBox.getSelectedIndex()]);
            cond.setOperator(ComparisonOperator
                    .fromValue(s_operatorActuals[m_operatorBox
                            .getSelectedIndex()]));
            cond.setValue(m_valueField.getText());
            // if rowNum is -1, add it
            if (m_rowNum == -1) {
                // if it wasn't there before, add it
                m_model.getConditions().add(cond);
            } else {
                // else replace existing condition
                m_model.getConditions().set(m_rowNum, cond);
            }
            m_model.fireTableDataChanged();
        }

    }

    public class SearchButtonListener
            implements ActionListener {

        private final ChangeFieldsButtonListener m_fieldSelector;

        private final ConditionsTableModel m_model;

        public SearchButtonListener(ChangeFieldsButtonListener fieldSelector,
                                    ConditionsTableModel model) {
            m_fieldSelector = fieldSelector;
            m_model = model;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            List fields = m_fieldSelector.getFieldList();
            String[] displayFields = new String[fields.size()];
            ObjectFactory factory = new ObjectFactory();
            for (int i = 0; i < fields.size(); i++) {
                displayFields[i] = (String) fields.get(i);
            }
            FieldSearchQuery query = new FieldSearchQuery();
            if (m_tabbedPane.getSelectedIndex() == 0) {
                query.setTerms(factory.createFieldSearchQueryTerms(m_simpleQueryField.getText()));
            } else {
                List conditions = m_model.getConditions();
                Condition[] cond = new Condition[conditions.size()];
                for (int i = 0; i < conditions.size(); i++) {
                    cond[i] = conditions.get(i);
                }
                FieldSearchQuery.Conditions conds = new FieldSearchQuery.Conditions();
                conds.getCondition().addAll(conditions);
                query.setConditions(factory.createFieldSearchQueryConditions(conds));
            }
            ResultFrame frame =
                    new ResultFrame("Search Results", displayFields, 100, query);
            frame.setVisible(true);
            Administrator.getDesktop().add(frame);
            try {
                frame.setSelected(true);
            } catch (java.beans.PropertyVetoException pve) {
            }
        }
    }

    public class ChangeFieldsButtonListener
            implements ActionListener {

        private final JLabel m_fieldLabel;

        private List m_fieldList;

        public ChangeFieldsButtonListener(JLabel fieldLabel, List fieldList) {
            m_fieldLabel = fieldLabel;
            m_fieldList = fieldList;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // launch an editor for the fields to search on,
            // and put the values in
            // - the label (with html and italics)
            // - the fieldList

            // first, construct the dialog with the values from fieldList
            SelectFieldsDialog dialog = new SelectFieldsDialog(m_fieldList);
            dialog.setVisible(true);
            if (dialog.getSelectedFields() != null) {
                m_fieldList = dialog.getSelectedFields();
                // if they clicked cancel, just exit.
                // otherwise, set the values in m_fieldList,
                // then set the text of m_fieldLabel based on those.
                StringBuffer text = new StringBuffer();
                text.append("");
                for (int i = 0; i < m_fieldList.size(); i++) {
                    if (i > 0) {
                        text.append(", ");
                    }
                    text.append((String) m_fieldList.get(i));
                }
                text.append("");
                m_fieldLabel.setText(text.toString());
            }
        }

        public List getFieldList() {
            return m_fieldList;
        }
    }

    public class ConditionsTableModel
            extends AbstractTableModel {

        private static final long serialVersionUID = 1L;

        List m_conditions;

        public ConditionsTableModel() {
            m_conditions = new ArrayList();
        }

        public ConditionsTableModel(List conditions) {
            m_conditions = conditions;
        }

        public List getConditions() {
            return m_conditions;
        }

        @Override
        public String getColumnName(int col) {
            if (col == 0) {
                return "Field";
            } else if (col == 1) {
                return "Operator";
            } else {
                return "Value";
            }
        }

        @Override
        public int getRowCount() {
            return m_conditions.size();
        }

        @Override
        public int getColumnCount() {
            return 3;
        }

        @Override
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        @Override
        public Object getValueAt(int row, int col) {
            Condition cond = m_conditions.get(row);
            if (col == 0) {
                return cond.getProperty();
            } else if (col == 1) {
                return getNiceName(cond.getOperator().toString());
            } else {
                return cond.getValue();
            }
        }

        private String getNiceName(String operString) {
            if (operString.equals("has")) {
                return "contains";
            }
            if (operString.equals("eq")) {
                return "equals";
            }
            if (operString.equals("lt")) {
                return "is less than";
            }
            if (operString.equals("le")) {
                return "is less than or equal to";
            }
            if (operString.equals("gt")) {
                return "is greater than";
            }
            return "is greater than or equal to";
        }

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy