com.mirth.connect.client.ui.browsers.message.MessageBrowserAdvancedFilter.java Source code

Java tutorial

Introduction

Here is the source code for com.mirth.connect.client.ui.browsers.message.MessageBrowserAdvancedFilter.java

Source

/*
 * Copyright (c) Mirth Corporation. All rights reserved.
 * 
 * http://www.mirthcorp.com
 * 
 * The software in this package is published under the terms of the MPL license a copy of which has
 * been included with this distribution in the LICENSE.txt file.
 */

package com.mirth.connect.client.ui.browsers.message;

import java.awt.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.prefs.Preferences;

import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;

import org.apache.commons.lang3.StringUtils;
import org.jdesktop.swingx.decorator.HighlighterFactory;

import com.mirth.connect.client.ui.Frame;
import com.mirth.connect.client.ui.Mirth;
import com.mirth.connect.client.ui.MirthDialog;
import com.mirth.connect.client.ui.UIConstants;
import com.mirth.connect.client.ui.components.ItemSelectionTable;
import com.mirth.connect.client.ui.components.ItemSelectionTableModel;
import com.mirth.connect.client.ui.components.MirthComboBoxTableCellEditor;
import com.mirth.connect.client.ui.components.MirthComboBoxTableCellRenderer;
import com.mirth.connect.client.ui.components.MirthFieldConstraints;
import com.mirth.connect.client.ui.components.MirthTable;
import com.mirth.connect.donkey.model.channel.MetaDataColumn;
import com.mirth.connect.donkey.model.channel.MetaDataColumnException;
import com.mirth.connect.donkey.model.channel.MetaDataColumnType;
import com.mirth.connect.donkey.model.message.ContentType;
import com.mirth.connect.model.filters.MessageFilter;
import com.mirth.connect.model.filters.elements.ContentSearchElement;
import com.mirth.connect.model.filters.elements.MetaDataSearchElement;
import com.mirth.connect.model.filters.elements.MetaDataSearchOperator;

public class MessageBrowserAdvancedFilter extends MirthDialog {
    private Frame parent;
    private static final int CONTENT_TYPE_COLUMN_WIDTH = 120;
    private static final int METADATA_NAME_COLUMN_WIDTH = 140;
    private static final int METADATA_OPERATOR_COLUMN_WIDTH = 140;
    private static final int METADATA_CASE_COLUMN_WIDTH = 75;
    private static Map<String, Object> cachedSettings;
    private static Map<String, MetaDataColumn> cachedMetaDataColumns;

    private MessageBrowser messageBrowser;

    /** Creates new form MessageBrowserAdvancedFilter */
    public MessageBrowserAdvancedFilter(com.mirth.connect.client.ui.Frame parent, MessageBrowser messageBrowser,
            String title, boolean modal, boolean allowSearch) {
        super(parent, title, modal);
        this.parent = parent;
        this.messageBrowser = messageBrowser;
        initComponents();
        initComponentsManual();
        initContentSearchTable();
        connectorTable = new ItemSelectionTable();
        cachedSettings = new HashMap<String, Object>();
        cachedMetaDataColumns = new HashMap<String, MetaDataColumn>();
        jScrollPane6.setViewportView(connectorTable);
    }

    private void initComponentsManual() {
        // restrict the message ID and import ID fields to integer input only
        messageIdLowerField.setDocument(new MirthFieldConstraints(19, false, false, true));
        messageIdUpperField.setDocument(new MirthFieldConstraints(19, false, false, true));
        originalIdLowerField.setDocument(new MirthFieldConstraints(19, false, false, true));
        originalIdUpperField.setDocument(new MirthFieldConstraints(19, false, false, true));
        importIdLowerField.setDocument(new MirthFieldConstraints(19, false, false, true));
        importIdUpperField.setDocument(new MirthFieldConstraints(19, false, false, true));
        sendAttemptsLower.setModel(new SpinnerNumberModel(0, 0, null, 1));
    }

    private void initContentSearchTable() {
        contentSearchTable
                .setModel(new DefaultTableModel(new Object[][] {}, new String[] { "Content Type", "Contains" }) {
                    public boolean isCellEditable(int rowIndex, int columnIndex) {
                        return true;
                    }
                });

        contentSearchTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        contentSearchTable.setDragEnabled(false);
        contentSearchTable.setSortable(false);
        contentSearchTable.getTableHeader().setReorderingAllowed(false);

        contentSearchTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent evt) {
                deleteContentSearchButton.setEnabled(getSelectedRow(contentSearchTable) != -1);
            }
        });

        if (Preferences.userNodeForPackage(Mirth.class).getBoolean("highlightRows", true)) {
            contentSearchTable.setHighlighters(HighlighterFactory
                    .createAlternateStriping(UIConstants.HIGHLIGHTER_COLOR, UIConstants.BACKGROUND_COLOR));
        }

        TableColumn column = contentSearchTable.getColumnModel().getColumn(0);
        column.setCellRenderer(new MirthComboBoxTableCellRenderer(ContentType.getDisplayValues()));
        column.setCellEditor(new MirthComboBoxTableCellEditor(contentSearchTable, ContentType.getDisplayValues(), 1,
                false, null));
        column.setMinWidth(CONTENT_TYPE_COLUMN_WIDTH);
        column.setMaxWidth(CONTENT_TYPE_COLUMN_WIDTH);

        deleteContentSearchButton.setEnabled(false);
    }

    private void initMetaDataSearchTable() {
        metaDataSearchTable.setModel(new DefaultTableModel(new Object[][] {},
                new String[] { "Metadata", "Operator", "Value", "Ignore Case" }) {
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                if (columnIndex == 3 && cachedMetaDataColumns.get(getValueAt(rowIndex, 0))
                        .getType() != MetaDataColumnType.STRING) {
                    return false;
                }

                return true;
            }

            @Override
            public void setValueAt(Object value, int row, int column) {
                int metaDataColumnIndex = findColumn("Metadata");
                int operatorColumnIndex = findColumn("Operator");
                int valueColumnIndex = findColumn("Value");
                int ignoreCaseColumnIndex = findColumn("Ignore Case");

                if (column == valueColumnIndex) {
                    MetaDataColumn metaDataColumn = cachedMetaDataColumns.get(getValueAt(row, metaDataColumnIndex));

                    if (StringUtils.isNotEmpty((String) value)) {
                        try {
                            metaDataColumn.getType().castValue(value);
                        } catch (MetaDataColumnException e) {
                            parent.alertError(parent,
                                    "Invalid value for column type " + metaDataColumn.getType().toString());
                            return;
                        }
                    }
                } else if (column == metaDataColumnIndex) {
                    if (!value.equals(getValueAt(row, metaDataColumnIndex))) {
                        MetaDataSearchOperator operator = MetaDataSearchOperator.EQUAL;

                        super.setValueAt(operator, row, operatorColumnIndex);

                        MetaDataColumn metaDataColumn = cachedMetaDataColumns.get(value);
                        if (metaDataColumn.getType() != MetaDataColumnType.STRING) {
                            super.setValueAt(Boolean.FALSE, row, ignoreCaseColumnIndex);
                        }
                    }

                    super.setValueAt("", row, valueColumnIndex);
                }
                super.setValueAt(value, row, column);
            }
        });

        metaDataSearchTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        metaDataSearchTable.setDragEnabled(false);
        metaDataSearchTable.setSortable(false);
        metaDataSearchTable.getTableHeader().setReorderingAllowed(false);

        addMetaDataSearchButton.setEnabled(!messageBrowser.getMetaDataColumns().isEmpty());

        metaDataSearchTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent evt) {
                deleteMetaDataSearchButton.setEnabled(getSelectedRow(metaDataSearchTable) != -1);
            }
        });

        if (Preferences.userNodeForPackage(Mirth.class).getBoolean("highlightRows", true)) {
            metaDataSearchTable.setHighlighters(HighlighterFactory
                    .createAlternateStriping(UIConstants.HIGHLIGHTER_COLOR, UIConstants.BACKGROUND_COLOR));
        }

        List<MetaDataColumn> metaDataColumns = messageBrowser.getMetaDataColumns();
        cachedMetaDataColumns.clear();

        String[] metaDataNames = new String[metaDataColumns.size()];
        for (int i = 0; i < metaDataColumns.size(); i++) {
            String columnName = metaDataColumns.get(i).getName();
            metaDataNames[i] = columnName;
            cachedMetaDataColumns.put(columnName, metaDataColumns.get(i));
        }

        MirthComboBoxTableCellEditor metaDataEditor = new MirthComboBoxTableCellEditor(metaDataSearchTable,
                metaDataNames, 1, false, null);
        metaDataEditor.getComboBox().setAutoResizeDropdown(true);

        TableColumn metaDataColumn = metaDataSearchTable.getColumnModel().getColumn(0);
        metaDataColumn.setCellRenderer(new MirthComboBoxTableCellRenderer(metaDataNames));
        metaDataColumn.setCellEditor(metaDataEditor);
        metaDataColumn.setMinWidth(METADATA_NAME_COLUMN_WIDTH);
        metaDataColumn.setMaxWidth(METADATA_NAME_COLUMN_WIDTH * 2);
        metaDataColumn.setPreferredWidth(METADATA_NAME_COLUMN_WIDTH);

        // Need to create this custom editor since the combo box values are dynamic based on metadata column type. 
        MirthComboBoxTableCellEditor operatorEditor = new MirthComboBoxTableCellEditor(metaDataSearchTable,
                MetaDataSearchOperator.values(), 1, false, null) {

            public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row,
                    int column) {

                MetaDataColumn metaDataColumn = cachedMetaDataColumns.get(table.getValueAt(row, 0));

                comboBox.setModel(new DefaultComboBoxModel(
                        MetaDataSearchOperator.valuesForColumnType(metaDataColumn.getType())));

                return super.getTableCellEditorComponent(table, value, isSelected, row, column);
            }

        };

        TableColumn operatorColumn = metaDataSearchTable.getColumnModel().getColumn(1);
        operatorColumn.setCellRenderer(new MirthComboBoxTableCellRenderer(MetaDataSearchOperator.values()));
        operatorColumn.setCellEditor(operatorEditor);
        operatorColumn.setMinWidth(METADATA_OPERATOR_COLUMN_WIDTH);
        operatorColumn.setMaxWidth(METADATA_OPERATOR_COLUMN_WIDTH);

        TableColumn caseColumn = metaDataSearchTable.getColumnModel().getColumn(3);
        caseColumn.setMinWidth(METADATA_CASE_COLUMN_WIDTH);
        caseColumn.setMaxWidth(METADATA_CASE_COLUMN_WIDTH);

        deleteMetaDataSearchButton.setEnabled(false);
    }

    public void loadChannel() {
        connectorTable.setModel(new ItemSelectionTableModel<Integer, String>(messageBrowser.getConnectors(), null,
                "Current Connector Name", "Included", "Id"));

        initMetaDataSearchTable();
    }

    public void setSelectedMetaDataIds(List<Integer> selectedMetaDataIds) {
        if (selectedMetaDataIds.get(0) != null) {
            ItemSelectionTableModel<Integer, String> connectorModel = (ItemSelectionTableModel<Integer, String>) connectorTable
                    .getModel();
            connectorModel.unselectAllKeys();
            for (Integer metaDataId : selectedMetaDataIds) {
                connectorModel.selectKey(metaDataId);
            }
        }
    }

    protected void applySelectionsToFilter(MessageFilter messageFilter) {
        List<Integer> selectedMetaDataIds = getMetaDataIds(true);

        // Included and Excluded metadata Ids will both be null if everything is selected.
        if (selectedMetaDataIds != null) {
            if (selectedMetaDataIds.contains(null)) {
                messageFilter.setExcludedMetaDataIds(getMetaDataIds(false));
            } else {
                messageFilter.setIncludedMetaDataIds(selectedMetaDataIds);
            }
        }

        String id = messageIdLowerField.getText();
        if (!StringUtils.isEmpty(id)) {
            messageFilter.setMinMessageId(Long.parseLong(id));
        }

        id = messageIdUpperField.getText();
        if (!StringUtils.isEmpty(id)) {
            messageFilter.setMaxMessageId(Long.parseLong(id));
        }

        id = originalIdLowerField.getText();
        if (!StringUtils.isEmpty(id)) {
            messageFilter.setOriginalIdLower(Long.parseLong(id));
        }

        id = originalIdUpperField.getText();
        if (!StringUtils.isEmpty(id)) {
            messageFilter.setOriginalIdUpper(Long.parseLong(id));
        }

        id = importIdLowerField.getText();
        if (!StringUtils.isEmpty(id)) {
            messageFilter.setImportIdLower(Long.parseLong(id));
        }

        id = importIdUpperField.getText();
        if (!StringUtils.isEmpty(id)) {
            messageFilter.setImportIdUpper(Long.parseLong(id));
        }

        messageFilter.setServerId(getServerId());

        Integer sendAttemptsLower = (Integer) this.sendAttemptsLower.getValue();
        Integer sendAttemptsUpper = this.sendAttemptsUpper.getIntegerValue();

        // There is no need to test this criteria if it is zero or less, because this should be the lowest value allowed.
        if (sendAttemptsLower <= 0) {
            sendAttemptsLower = null;
        }

        if (sendAttemptsLower != null && sendAttemptsUpper != null && sendAttemptsLower > sendAttemptsUpper) {
            sendAttemptsLower = null;
            sendAttemptsUpper = null;
        }

        messageFilter.setAttachment(attachmentCheckBox.isSelected());
        messageFilter.setError(errorCheckBox.isSelected());
        messageFilter.setSendAttemptsLower(sendAttemptsLower);
        messageFilter.setSendAttemptsUpper(sendAttemptsUpper);
        messageFilter.setContentSearch(getContentSearch());

        try {
            messageFilter.setMetaDataSearch(getMetaDataSearch());
        } catch (MetaDataColumnException e) {
            parent.alertError(parent.messageBrowser,
                    "Invalid value for column: " + e.getMetaDataColumn().getName());
        }
    }

    private List<Integer> getMetaDataIds(boolean selected) {
        List<Integer> selectedMetaDataIds = ((ItemSelectionTableModel<Integer, String>) connectorTable.getModel())
                .getKeys(selected);
        if (selectedMetaDataIds.size() == connectorTable.getRowCount()) {
            return null;
        }
        return selectedMetaDataIds;
    }

    private String getServerId() {
        String serverId = serverIdField.getText();
        return (serverId.length() == 0) ? null : serverId;
    }

    private List<ContentSearchElement> getContentSearch() {
        List<ContentSearchElement> contentSearch = new ArrayList<ContentSearchElement>();
        Map<ContentType, List<String>> contentSearchMap = new HashMap<ContentType, List<String>>();
        DefaultTableModel model = ((DefaultTableModel) contentSearchTable.getModel());
        int rowCount = model.getRowCount();

        for (int i = 0; i < rowCount; i++) {
            ContentType contentType = (ContentType) model.getValueAt(i, 0);
            String searchText = (String) model.getValueAt(i, 1);

            if (searchText.length() > 0) {
                List<String> searchList = contentSearchMap.get(contentType);

                if (searchList == null) {
                    searchList = new ArrayList<String>();
                    contentSearchMap.put(contentType, searchList);
                }
                searchList.add(searchText);
            }
        }

        for (ContentType contentType : ContentType.getDisplayValues()) {
            if (contentSearchMap.containsKey(contentType)) {
                contentSearch.add(new ContentSearchElement(contentType.getContentTypeCode(),
                        contentSearchMap.get(contentType)));
            }
        }

        return contentSearch;
    }

    private List<MetaDataSearchElement> getMetaDataSearch() throws MetaDataColumnException {
        List<MetaDataSearchElement> metaDataSearch = new ArrayList<MetaDataSearchElement>();

        DefaultTableModel model = ((DefaultTableModel) metaDataSearchTable.getModel());
        int rowCount = model.getRowCount();

        if (rowCount == 0) {
            return null;
        } else {
            for (int i = 0; i < rowCount; i++) {
                String metaDataName = (String) model.getValueAt(i, 0);
                String operator = ((MetaDataSearchOperator) model.getValueAt(i, 1)).toFullString();
                String searchText = (String) model.getValueAt(i, 2);
                Boolean ignoreCase = (Boolean) model.getValueAt(i, 3);

                if (StringUtils.isNotEmpty(searchText)) {
                    MetaDataColumn column = cachedMetaDataColumns.get(metaDataName);
                    metaDataSearch.add(new MetaDataSearchElement(metaDataName, operator,
                            column.getType().castValue(searchText), ignoreCase));
                }
            }

            return metaDataSearch;
        }
    }

    @Override
    public void setVisible(boolean visible) {
        if (visible) {
            saveSelections();
        }

        super.setVisible(visible);
    }

    public void saveSelections() {
        DefaultTableModel contentSearchModel = ((DefaultTableModel) contentSearchTable.getModel());
        DefaultTableModel metaDataSearchModel = ((DefaultTableModel) metaDataSearchTable.getModel());
        ItemSelectionTableModel<Integer, String> connectorModel = ((ItemSelectionTableModel<Integer, String>) connectorTable
                .getModel());

        cachedSettings.clear();

        cachedSettings.put("messageIdLowerField", messageIdLowerField.getText());
        cachedSettings.put("messageIdUpperField", messageIdUpperField.getText());
        cachedSettings.put("originalIdLowerField", originalIdLowerField.getText());
        cachedSettings.put("originalIdUpperField", originalIdUpperField.getText());
        cachedSettings.put("importIdLowerField", importIdLowerField.getText());
        cachedSettings.put("importIdUpperField", importIdUpperField.getText());
        cachedSettings.put("serverIdField", serverIdField.getText());
        cachedSettings.put("sendAttemptsLower", sendAttemptsLower.getValue());
        cachedSettings.put("sendAttemptsUpper", sendAttemptsUpper.getValue());
        cachedSettings.put("attachment", attachmentCheckBox.isSelected());
        cachedSettings.put("error", errorCheckBox.isSelected());

        Object[][] contentSearchData = new Object[contentSearchModel.getRowCount()][contentSearchModel
                .getColumnCount()];
        for (int row = 0; row < contentSearchModel.getRowCount(); row++) {
            for (int column = 0; column < contentSearchModel.getColumnCount(); column++) {
                contentSearchData[row][column] = contentSearchModel.getValueAt(row, column);
            }
        }
        cachedSettings.put("contentSearchTable", contentSearchData);

        Object[][] metaDataSearchData = new Object[metaDataSearchModel.getRowCount()][metaDataSearchModel
                .getColumnCount()];
        for (int row = 0; row < metaDataSearchModel.getRowCount(); row++) {
            for (int column = 0; column < metaDataSearchModel.getColumnCount(); column++) {
                metaDataSearchData[row][column] = metaDataSearchModel.getValueAt(row, column);
            }
        }
        cachedSettings.put("metaDataSearchTable", metaDataSearchData);

        Boolean[] connectorData = new Boolean[connectorModel.getRowCount()];
        for (int row = 0; row < connectorModel.getRowCount(); row++) {
            connectorData[row] = (Boolean) connectorModel.getValueAt(row, ItemSelectionTableModel.CHECKBOX_COLUMN);
        }

        cachedSettings.put("connectorTable", connectorData);
    }

    public void loadSelections() {
        DefaultTableModel contentSearchModel = ((DefaultTableModel) contentSearchTable.getModel());
        DefaultTableModel metaDataSearchModel = ((DefaultTableModel) metaDataSearchTable.getModel());
        ItemSelectionTableModel<Integer, String> connectorModel = ((ItemSelectionTableModel<Integer, String>) connectorTable
                .getModel());
        messageIdLowerField.setText((String) cachedSettings.get("messageIdLowerField"));
        messageIdUpperField.setText((String) cachedSettings.get("messageIdUpperField"));
        originalIdLowerField.setText((String) cachedSettings.get("originalIdLowerField"));
        originalIdUpperField.setText((String) cachedSettings.get("originalIdUpperField"));
        importIdLowerField.setText((String) cachedSettings.get("importIdLowerField"));
        importIdUpperField.setText((String) cachedSettings.get("importIdUpperField"));
        serverIdField.setText((String) cachedSettings.get("serverIdField"));
        sendAttemptsLower.setValue(cachedSettings.get("sendAttemptsLower"));
        sendAttemptsUpper.setValue(cachedSettings.get("sendAttemptsUpper"));
        attachmentCheckBox.setSelected((Boolean) cachedSettings.get("attachment"));
        errorCheckBox.setSelected((Boolean) cachedSettings.get("error"));

        contentSearchModel.setNumRows(0);
        Object[][] contentSearchData = (Object[][]) cachedSettings.get("contentSearchTable");
        for (int row = 0; row < contentSearchData.length; row++) {
            contentSearchModel.addRow(contentSearchData[row]);
        }

        metaDataSearchModel.setNumRows(0);
        Object[][] metaDataSearchData = (Object[][]) cachedSettings.get("metaDataSearchTable");
        for (int row = 0; row < metaDataSearchData.length; row++) {
            metaDataSearchModel.addRow(metaDataSearchData[row]);
        }

        Boolean[] connectorData = (Boolean[]) cachedSettings.get("connectorTable");
        for (int row = 0; row < connectorModel.getRowCount(); row++) {
            connectorModel.setValueAt(connectorData[row], row, ItemSelectionTableModel.CHECKBOX_COLUMN);
        }

        cachedSettings.clear();
    }

    public void resetSelections() {
        messageIdLowerField.setText("");
        messageIdUpperField.setText("");
        originalIdLowerField.setText("");
        originalIdUpperField.setText("");
        importIdLowerField.setText("");
        importIdUpperField.setText("");
        serverIdField.setText("");
        sendAttemptsLower.setValue(0);
        sendAttemptsUpper.setValue("");
        attachmentCheckBox.setSelected(false);
        errorCheckBox.setSelected(false);
        ((DefaultTableModel) contentSearchTable.getModel()).setNumRows(0);
        ((DefaultTableModel) metaDataSearchTable.getModel()).setNumRows(0);
        ((ItemSelectionTableModel<Integer, String>) connectorTable.getModel()).selectAllKeys();
    }

    public Boolean hasAdvancedCriteria() {
        Boolean hasAdvancedCriteria = false;

        ItemSelectionTableModel<Integer, String> model = ((ItemSelectionTableModel<Integer, String>) connectorTable
                .getModel());

        if (StringUtils.isNotEmpty(messageIdLowerField.getText())
                || StringUtils.isNotEmpty(messageIdUpperField.getText())
                || StringUtils.isNotEmpty(originalIdLowerField.getText())
                || StringUtils.isNotEmpty(originalIdUpperField.getText())
                || StringUtils.isNotEmpty(importIdLowerField.getText())
                || StringUtils.isNotEmpty(importIdUpperField.getText())
                || StringUtils.isNotEmpty(serverIdField.getText()) || !sendAttemptsLower.getValue().equals(0)
                || StringUtils.isNotEmpty(sendAttemptsUpper.getValue().toString())
                || attachmentCheckBox.isSelected() || errorCheckBox.isSelected()
                || ((DefaultTableModel) contentSearchTable.getModel()).getRowCount() != 0
                || ((DefaultTableModel) metaDataSearchTable.getModel()).getRowCount() != 0
                || model.getKeys(true).size() != model.getRowCount()) {
            hasAdvancedCriteria = true;
        }

        return hasAdvancedCriteria;
    }

    private void stopEditing() {
        // if the user had typed in a value in the content search table, close the cell editor so that any value that was entered will be included in the search
        TableCellEditor cellEditor = contentSearchTable.getCellEditor();
        if (cellEditor != null) {
            cellEditor.stopCellEditing();
        }

        cellEditor = metaDataSearchTable.getCellEditor();
        if (cellEditor != null) {
            cellEditor.stopCellEditing();
        }
    }

    @Override
    public void onCloseAction() {
        formWindowClosing(null);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane2 = new javax.swing.JScrollPane();
        mirthTable1 = new com.mirth.connect.client.ui.components.MirthTable();
        jScrollPane3 = new javax.swing.JScrollPane();
        mirthTable2 = new com.mirth.connect.client.ui.components.MirthTable();
        jScrollPane5 = new javax.swing.JScrollPane();
        mirthTable3 = new com.mirth.connect.client.ui.components.MirthTable();
        containerPanel = new javax.swing.JPanel();
        messageIdLabel = new javax.swing.JLabel();
        messageIdLowerField = new com.mirth.connect.client.ui.components.MirthTextField();
        serverIdField = new com.mirth.connect.client.ui.components.MirthTextField();
        serverIdLabel = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jPanel1 = new javax.swing.JPanel();
        jSeparator1 = new javax.swing.JSeparator();
        cancelButton = new javax.swing.JButton();
        okButton1 = new javax.swing.JButton();
        jScrollPane4 = new javax.swing.JScrollPane();
        contentSearchTable = new com.mirth.connect.client.ui.components.MirthTable();
        addContentSearchButton = new com.mirth.connect.client.ui.components.MirthButton();
        deleteContentSearchButton = new com.mirth.connect.client.ui.components.MirthButton();
        sendAttemptsUpper = new com.mirth.connect.client.ui.components.MirthBlankableSpinner(0, null);
        jScrollPane6 = new javax.swing.JScrollPane();
        connectorTable = new com.mirth.connect.client.ui.components.MirthTable();
        connectorSelectAll = new javax.swing.JLabel();
        connectorDeselectAll = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        sendAttemptsLower = new javax.swing.JSpinner();
        addMetaDataSearchButton = new com.mirth.connect.client.ui.components.MirthButton();
        jScrollPane7 = new javax.swing.JScrollPane();
        metaDataSearchTable = new com.mirth.connect.client.ui.components.MirthTable();
        deleteMetaDataSearchButton = new com.mirth.connect.client.ui.components.MirthButton();
        jLabel1 = new javax.swing.JLabel();
        attachmentCheckBox = new com.mirth.connect.client.ui.components.MirthCheckBox();
        importIdLabel = new javax.swing.JLabel();
        importIdLowerField = new com.mirth.connect.client.ui.components.MirthTextField();
        jLabel4 = new javax.swing.JLabel();
        messageIdUpperField = new com.mirth.connect.client.ui.components.MirthTextField();
        jLabel6 = new javax.swing.JLabel();
        importIdUpperField = new com.mirth.connect.client.ui.components.MirthTextField();
        jLabel8 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        errorCheckBox = new com.mirth.connect.client.ui.components.MirthCheckBox();
        originalIdLabel = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        originalIdUpperField = new com.mirth.connect.client.ui.components.MirthTextField();
        originalIdLowerField = new com.mirth.connect.client.ui.components.MirthTextField();

        mirthTable1
                .setModel(new javax.swing.table.DefaultTableModel(
                        new Object[][] { { null, null, null, null }, { null, null, null, null },
                                { null, null, null, null }, { null, null, null, null } },
                        new String[] { "Title 1", "Title 2", "Title 3", "Title 4" }));
        jScrollPane2.setViewportView(mirthTable1);

        mirthTable2
                .setModel(new javax.swing.table.DefaultTableModel(
                        new Object[][] { { null, null, null, null }, { null, null, null, null },
                                { null, null, null, null }, { null, null, null, null } },
                        new String[] { "Title 1", "Title 2", "Title 3", "Title 4" }));
        jScrollPane3.setViewportView(mirthTable2);

        mirthTable3
                .setModel(new javax.swing.table.DefaultTableModel(
                        new Object[][] { { null, null, null, null }, { null, null, null, null },
                                { null, null, null, null }, { null, null, null, null } },
                        new String[] { "Title 1", "Title 2", "Title 3", "Title 4" }));
        jScrollPane5.setViewportView(mirthTable3);

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        containerPanel.setBackground(new java.awt.Color(255, 255, 255));

        messageIdLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        messageIdLabel.setText("Message Id:");

        serverIdField.setToolTipText(
                "<html>The GUID of the message in the Mirth Connect database.<br>This can be retrieved from the Meta Data tab in the Message Browser.</html>");

        serverIdLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        serverIdLabel.setText("Server Id:");

        jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabel5.setText("Send Attempts:");

        jPanel1.setBackground(new java.awt.Color(255, 255, 255));

        cancelButton.setText("Cancel");
        cancelButton.setMargin(new java.awt.Insets(0, 2, 0, 2));
        cancelButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancelButtonActionPerformed(evt);
            }
        });

        okButton1.setText("OK");
        okButton1.setMargin(new java.awt.Insets(0, 2, 0, 2));
        okButton1.setMaximumSize(new java.awt.Dimension(48, 21));
        okButton1.setMinimumSize(new java.awt.Dimension(48, 21));
        okButton1.setPreferredSize(new java.awt.Dimension(48, 21));
        okButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                okButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(jPanel1Layout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jSeparator1)
                .addGroup(jPanel1Layout.createSequentialGroup().addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(okButton1, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cancelButton)));

        jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL,
                new java.awt.Component[] { cancelButton, okButton1 });

        jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                        .addGap(0, 6, Short.MAX_VALUE)
                        .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(8, 8, 8).addGroup(
                                jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                        .addComponent(cancelButton, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(okButton1, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))));

        jPanel1Layout.linkSize(javax.swing.SwingConstants.VERTICAL,
                new java.awt.Component[] { cancelButton, okButton1 });

        contentSearchTable.setToolTipText(
                "<html> \nSearch specific message content. This process could take a long time<br/>\ndepending on the amount of message content currently stored. Any message<br/>\ncontent that was encrypted by this channel will not be searchable. </html>");
        jScrollPane4.setViewportView(contentSearchTable);

        addContentSearchButton.setText("New");
        addContentSearchButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addContentSearchButtonActionPerformed(evt);
            }
        });

        deleteContentSearchButton.setText("Delete");
        deleteContentSearchButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                deleteContentSearchButtonActionPerformed(evt);
            }
        });

        connectorTable.setToolTipText(
                "<html>\nInclude messages from the selected connectors. Connectors that were<br/>\nremoved from this channel are not available to select. Messages for removed<br/>\nconnectors will only be included if all connectors are selected. If a connector's<br/>\nname has changed, messages before the name change will still be included.\n</html>");
        jScrollPane6.setViewportView(connectorTable);

        connectorSelectAll.setForeground(java.awt.Color.blue);
        connectorSelectAll.setText("<html><u>Select All</u></html>");
        connectorSelectAll.setToolTipText("Select all connectors below.");
        connectorSelectAll.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        connectorSelectAll.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                connectorSelectAllMouseReleased(evt);
            }
        });

        connectorDeselectAll.setForeground(java.awt.Color.blue);
        connectorDeselectAll.setText("<html><u>Deselect All</u></html>");
        connectorDeselectAll.setToolTipText("Deselect all connectors below.");
        connectorDeselectAll.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        connectorDeselectAll.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                connectorDeselectAllMouseReleased(evt);
            }
        });

        jLabel7.setFont(new java.awt.Font("Lucida Grande", 0, 12)); // NOI18N
        jLabel7.setText("|");

        addMetaDataSearchButton.setText("New");
        addMetaDataSearchButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addMetaDataSearchButtonActionPerformed(evt);
            }
        });

        metaDataSearchTable.setToolTipText(
                "<html>Search on custom metadata stored for this channel.<br/>Note that if Ignore Case is unchecked, case<br/>sensitivity depends on the database collation.</html>");
        jScrollPane7.setViewportView(metaDataSearchTable);

        deleteMetaDataSearchButton.setText("Delete");
        deleteMetaDataSearchButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                deleteMetaDataSearchButtonActionPerformed(evt);
            }
        });

        jLabel1.setText("Has Attachment:");

        attachmentCheckBox.setBackground(new java.awt.Color(255, 255, 255));
        attachmentCheckBox.setToolTipText("If checked, only messages with attachments will be included.");

        importIdLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        importIdLabel.setText("Import Id:");

        jLabel4.setText("-");

        jLabel6.setText("-");

        jLabel8.setText("-");

        jLabel2.setText("Has Error:");

        errorCheckBox.setBackground(new java.awt.Color(255, 255, 255));
        errorCheckBox.setToolTipText("If checked, only messages with errors will be included.");

        originalIdLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        originalIdLabel.setText("Original Id:");

        jLabel9.setText("-");

        javax.swing.GroupLayout containerPanelLayout = new javax.swing.GroupLayout(containerPanel);
        containerPanel.setLayout(containerPanelLayout);
        containerPanelLayout.setHorizontalGroup(containerPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(containerPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(containerPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(containerPanelLayout.createSequentialGroup().addGroup(containerPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addComponent(jLabel5, javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addComponent(serverIdLabel, javax.swing.GroupLayout.Alignment.TRAILING,
                                                javax.swing.GroupLayout.PREFERRED_SIZE, 52,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(importIdLabel, javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addComponent(originalIdLabel, javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addComponent(messageIdLabel, javax.swing.GroupLayout.Alignment.TRAILING))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addGroup(containerPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(attachmentCheckBox,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(errorCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addGroup(containerPanelLayout
                                                        .createParallelGroup(
                                                                javax.swing.GroupLayout.Alignment.TRAILING, false)
                                                        .addComponent(serverIdField,
                                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                Short.MAX_VALUE)
                                                        .addGroup(containerPanelLayout.createSequentialGroup()
                                                                .addGroup(containerPanelLayout.createParallelGroup(
                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                        .addComponent(messageIdLowerField,
                                                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                                118,
                                                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                        .addComponent(originalIdLowerField,
                                                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                                118,
                                                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                        .addComponent(importIdLowerField,
                                                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                                118,
                                                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                        .addComponent(sendAttemptsLower,
                                                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                                118,
                                                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                                                .addPreferredGap(
                                                                        javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                                .addGroup(containerPanelLayout.createParallelGroup(
                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                        .addGroup(containerPanelLayout
                                                                                .createSequentialGroup()
                                                                                .addComponent(jLabel9)
                                                                                .addPreferredGap(
                                                                                        javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                                                .addComponent(originalIdUpperField,
                                                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                                        118,
                                                                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                                                                        .addGroup(containerPanelLayout
                                                                                .createSequentialGroup()
                                                                                .addComponent(jLabel4)
                                                                                .addPreferredGap(
                                                                                        javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                                                .addComponent(messageIdUpperField,
                                                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                                        118,
                                                                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                                                                        .addGroup(containerPanelLayout
                                                                                .createSequentialGroup()
                                                                                .addComponent(jLabel6)
                                                                                .addPreferredGap(
                                                                                        javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                                                .addComponent(importIdUpperField,
                                                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                                        118,
                                                                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                                                                        .addGroup(containerPanelLayout
                                                                                .createSequentialGroup()
                                                                                .addComponent(jLabel8)
                                                                                .addPreferredGap(
                                                                                        javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                                                .addComponent(sendAttemptsUpper,
                                                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                                        118,
                                                                                        javax.swing.GroupLayout.PREFERRED_SIZE))))))
                                        .addGap(0, 167, Short.MAX_VALUE))
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, containerPanelLayout
                                        .createSequentialGroup().addGap(0, 0, Short.MAX_VALUE)
                                        .addComponent(connectorSelectAll, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(jLabel7)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(connectorDeselectAll, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addGroup(containerPanelLayout.createSequentialGroup()
                                        .addGroup(containerPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(jScrollPane7).addComponent(jScrollPane4))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addGroup(containerPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
                                                        containerPanelLayout
                                                                .createParallelGroup(
                                                                        javax.swing.GroupLayout.Alignment.LEADING,
                                                                        false)
                                                                .addComponent(addContentSearchButton,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        Short.MAX_VALUE)
                                                                .addComponent(deleteContentSearchButton,
                                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
                                                        containerPanelLayout
                                                                .createParallelGroup(
                                                                        javax.swing.GroupLayout.Alignment.LEADING,
                                                                        false)
                                                                .addComponent(addMetaDataSearchButton,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        Short.MAX_VALUE)
                                                                .addComponent(deleteMetaDataSearchButton,
                                                                        javax.swing.GroupLayout.PREFERRED_SIZE, 52,
                                                                        javax.swing.GroupLayout.PREFERRED_SIZE))))
                                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jScrollPane6, javax.swing.GroupLayout.Alignment.TRAILING))
                        .addContainerGap()));
        containerPanelLayout.setVerticalGroup(containerPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(containerPanelLayout.createSequentialGroup().addGap(4, 4, 4).addGroup(containerPanelLayout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(connectorSelectAll, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(connectorDeselectAll, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel7)).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane6, javax.swing.GroupLayout.PREFERRED_SIZE, 140,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(5, 5, 5)
                        .addGroup(containerPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(messageIdLabel)
                                .addComponent(messageIdLowerField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel4).addComponent(messageIdUpperField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(containerPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(containerPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(jLabel9).addComponent(originalIdUpperField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addGroup(containerPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(originalIdLowerField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(originalIdLabel)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(containerPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(containerPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(jLabel6).addComponent(importIdUpperField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addGroup(containerPanelLayout.createSequentialGroup().addGroup(containerPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(importIdLowerField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(importIdLabel)).addGap(5, 5, 5)
                                        .addGroup(containerPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                                .addComponent(serverIdField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(serverIdLabel))))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(
                                containerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(jLabel5)
                                        .addComponent(sendAttemptsLower, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(sendAttemptsUpper, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(jLabel8))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(containerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                                .addComponent(attachmentCheckBox, javax.swing.GroupLayout.Alignment.LEADING,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel1))
                        .addGap(5, 5, 5)
                        .addGroup(containerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                                .addComponent(jLabel2).addComponent(errorCheckBox,
                                        javax.swing.GroupLayout.Alignment.LEADING,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(
                                containerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addGroup(containerPanelLayout.createSequentialGroup()
                                                .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        0, Short.MAX_VALUE)
                                                .addPreferredGap(
                                                        javax.swing.LayoutStyle.ComponentPlacement.RELATED))
                                        .addGroup(containerPanelLayout.createSequentialGroup()
                                                .addComponent(addContentSearchButton,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(deleteContentSearchButton,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addGap(85, 85, 85)))
                        .addGroup(
                                containerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addGroup(containerPanelLayout.createSequentialGroup()
                                                .addComponent(addMetaDataSearchButton,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(deleteMetaDataSearchButton,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addGap(0, 0, Short.MAX_VALUE))
                                        .addComponent(jScrollPane7, javax.swing.GroupLayout.DEFAULT_SIZE, 129,
                                                Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(11, 11, 11)));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(containerPanel, javax.swing.GroupLayout.DEFAULT_SIZE,
                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(
                containerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
                Short.MAX_VALUE));

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void shiftValues(JList source, JList destination) {
        Object[] values = source.getSelectedValues();
        DefaultListModel sourceModel = (DefaultListModel) source.getModel();
        DefaultListModel destinationModel = (DefaultListModel) destination.getModel();

        for (Object value : values) {
            sourceModel.removeElement(value);
            destinationModel.addElement(value);
        }
    }

    private void addContentSearchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addContentSearchButtonActionPerformed
        DefaultTableModel model = ((DefaultTableModel) contentSearchTable.getModel());
        int row = model.getRowCount();

        model.addRow(new Object[] { ContentType.RAW, "" });

        contentSearchTable.setRowSelectionInterval(row, row);
    }//GEN-LAST:event_addContentSearchButtonActionPerformed

    private int getSelectedRow(MirthTable table) {
        if (table.isEditing()) {
            return table.getEditingRow();
        } else {
            return table.getSelectedRow();
        }
    }

    private void deleteContentSearchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteContentSearchButtonActionPerformed
        int selectedRow = getSelectedRow(contentSearchTable);

        if (selectedRow != -1 && !contentSearchTable.isEditing()) {
            ((DefaultTableModel) contentSearchTable.getModel()).removeRow(selectedRow);
        }

        int rowCount = contentSearchTable.getRowCount();

        if (rowCount > 0) {
            if (selectedRow >= rowCount) {
                selectedRow--;
            }

            contentSearchTable.setRowSelectionInterval(selectedRow, selectedRow);
        }
    }//GEN-LAST:event_deleteContentSearchButtonActionPerformed

    private void connectorSelectAllMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_connectorSelectAllMouseReleased
        ((ItemSelectionTableModel<Integer, String>) connectorTable.getModel()).selectAllKeys();
    }//GEN-LAST:event_connectorSelectAllMouseReleased

    private void connectorDeselectAllMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_connectorDeselectAllMouseReleased
        ((ItemSelectionTableModel<Integer, String>) connectorTable.getModel()).unselectAllKeys();
    }//GEN-LAST:event_connectorDeselectAllMouseReleased

    private void addMetaDataSearchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addMetaDataSearchButtonActionPerformed
        DefaultTableModel model = ((DefaultTableModel) metaDataSearchTable.getModel());
        int row = model.getRowCount();

        List<MetaDataColumn> metaDataColumns = messageBrowser.getMetaDataColumns();
        if (metaDataColumns.size() > 0) {
            MetaDataColumn metaDataColumn = metaDataColumns.get(0);
            MetaDataSearchOperator operator = MetaDataSearchOperator.EQUAL;

            model.addRow(new Object[] { metaDataColumn.getName(), operator, "", false });

            metaDataSearchTable.setRowSelectionInterval(row, row);
        }
    }//GEN-LAST:event_addMetaDataSearchButtonActionPerformed

    private void deleteMetaDataSearchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteMetaDataSearchButtonActionPerformed
        int selectedRow = getSelectedRow(metaDataSearchTable);

        if (selectedRow != -1 && !metaDataSearchTable.isEditing()) {
            ((DefaultTableModel) metaDataSearchTable.getModel()).removeRow(selectedRow);
        }

        int rowCount = metaDataSearchTable.getRowCount();

        if (rowCount > 0) {
            if (selectedRow >= rowCount) {
                selectedRow--;
            }

            metaDataSearchTable.setRowSelectionInterval(selectedRow, selectedRow);
        }
    }//GEN-LAST:event_deleteMetaDataSearchButtonActionPerformed

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        stopEditing();
        loadSelections();
    }//GEN-LAST:event_formWindowClosing

    private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
        stopEditing();
        loadSelections();

        setVisible(false);
    }//GEN-LAST:event_cancelButtonActionPerformed

    private void okButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButton1ActionPerformed
        stopEditing();

        setVisible(false);
    }//GEN-LAST:event_okButton1ActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private com.mirth.connect.client.ui.components.MirthButton addContentSearchButton;
    private com.mirth.connect.client.ui.components.MirthButton addMetaDataSearchButton;
    private com.mirth.connect.client.ui.components.MirthCheckBox attachmentCheckBox;
    private javax.swing.JButton cancelButton;
    private javax.swing.JLabel connectorDeselectAll;
    private javax.swing.JLabel connectorSelectAll;
    private com.mirth.connect.client.ui.components.MirthTable connectorTable;
    private javax.swing.JPanel containerPanel;
    private com.mirth.connect.client.ui.components.MirthTable contentSearchTable;
    private com.mirth.connect.client.ui.components.MirthButton deleteContentSearchButton;
    private com.mirth.connect.client.ui.components.MirthButton deleteMetaDataSearchButton;
    private com.mirth.connect.client.ui.components.MirthCheckBox errorCheckBox;
    private javax.swing.JLabel importIdLabel;
    private com.mirth.connect.client.ui.components.MirthTextField importIdLowerField;
    private com.mirth.connect.client.ui.components.MirthTextField importIdUpperField;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JScrollPane jScrollPane5;
    private javax.swing.JScrollPane jScrollPane6;
    private javax.swing.JScrollPane jScrollPane7;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JLabel messageIdLabel;
    private com.mirth.connect.client.ui.components.MirthTextField messageIdLowerField;
    private com.mirth.connect.client.ui.components.MirthTextField messageIdUpperField;
    private com.mirth.connect.client.ui.components.MirthTable metaDataSearchTable;
    private com.mirth.connect.client.ui.components.MirthTable mirthTable1;
    private com.mirth.connect.client.ui.components.MirthTable mirthTable2;
    private com.mirth.connect.client.ui.components.MirthTable mirthTable3;
    private javax.swing.JButton okButton1;
    private javax.swing.JLabel originalIdLabel;
    private com.mirth.connect.client.ui.components.MirthTextField originalIdLowerField;
    private com.mirth.connect.client.ui.components.MirthTextField originalIdUpperField;
    private javax.swing.JSpinner sendAttemptsLower;
    private com.mirth.connect.client.ui.components.MirthBlankableSpinner sendAttemptsUpper;
    private com.mirth.connect.client.ui.components.MirthTextField serverIdField;
    private javax.swing.JLabel serverIdLabel;
    // End of variables declaration//GEN-END:variables
}