net.sourceforge.marathon.display.SearchDialog.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.marathon.display.SearchDialog.java

Source

/*******************************************************************************
 *  
 *  Copyright (C) 2010 Jalian Systems Private Ltd.
 *  Copyright (C) 2010 Contributors to Marathon OSS Project
 * 
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Library General Public
 *  License as published by the Free Software Foundation; either
 *  version 2 of the License, or (at your option) any later version.
 * 
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Library General Public License for more details.
 * 
 *  You should have received a copy of the GNU Library General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * 
 *  Project website: http://www.marathontesting.com
 *  Help: Marathon help forum @ http://groups.google.com/group/marathon-testing
 * 
 *******************************************************************************/

package net.sourceforge.marathon.display;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import net.sourceforge.marathon.editor.IEditor;
import net.sourceforge.marathon.editor.ISearchDialog;
import net.sourceforge.marathon.util.EscapeDialog;
import net.sourceforge.marathon.util.UIUtils;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.factories.ButtonBarFactory;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

public class SearchDialog extends EscapeDialog implements ISearchDialog {
    private static final long serialVersionUID = 1L;
    private JComboBox findCombo;
    private JComboBox replaceCombo;
    private JRadioButton forwardDirection;
    private JRadioButton backwardDirection;
    private JRadioButton allLines;
    private JRadioButton selectedLines;
    private JCheckBox caseSensitive;
    private JCheckBox wrapSearch;
    private JCheckBox wholeWord;
    private JCheckBox regularExpressions;
    private JButton close;
    private JButton find;
    private JButton replaceFind;
    private JButton replace;
    private JButton replaceAll;
    private IEditor editor;
    private JLabel messageLabel;

    public static final ImageIcon ERROR_ICON = new ImageIcon(
            SearchDialog.class.getResource("icons/enabled/error.gif"));
    public static final ImageIcon WARN_ICON = new ImageIcon(
            SearchDialog.class.getResource("icons/enabled/warn.gif"));

    public SearchDialog(IEditor editor, JFrame parent) {
        super(parent, "Find/Replace", false);
        this.editor = editor;
        setAlwaysOnTop(true);
        initComponents();
        getContentPane().add(buildPanel());
        pack();
        setLocationRelativeTo(getParent());
        updateButtons();
    }

    @Override
    public void setVisible(boolean b) {
        findCombo.requestFocusInWindow();
        super.setVisible(b);
    }

    private void initComponents() {
        findCombo = new JComboBox();
        findCombo.setEditable(true);
        findCombo.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                updateButtons();
            }
        });
        Component c = findCombo.getEditor().getEditorComponent();
        if (c instanceof JTextField) {
            ((JTextField) c).getDocument().addDocumentListener(new DocumentListener() {
                public void removeUpdate(DocumentEvent e) {
                    updateButtons();
                }

                public void insertUpdate(DocumentEvent e) {
                    updateButtons();
                }

                public void changedUpdate(DocumentEvent e) {
                    updateButtons();
                }
            });
        }
        replaceCombo = new JComboBox();
        replaceCombo.setEditable(true);
        forwardDirection = new JRadioButton("Forward");
        forwardDirection.setMnemonic(KeyEvent.VK_O);
        backwardDirection = new JRadioButton("Backward");
        backwardDirection.setMnemonic(KeyEvent.VK_A);
        forwardDirection.setSelected(true);
        ButtonGroup g = new ButtonGroup();
        g.add(forwardDirection);
        g.add(backwardDirection);
        allLines = new JRadioButton("All");
        allLines.setSelected(true);
        allLines.setMnemonic(KeyEvent.VK_L);
        selectedLines = new JRadioButton("Selected lines");
        selectedLines.setMnemonic(KeyEvent.VK_E);
        g = new ButtonGroup();
        g.add(allLines);
        g.add(selectedLines);
        caseSensitive = new JCheckBox("Case sensitive");
        caseSensitive.setMnemonic(KeyEvent.VK_C);
        wrapSearch = new JCheckBox("Wrap search");
        wrapSearch.setMnemonic(KeyEvent.VK_P);
        wholeWord = new JCheckBox("Whole word");
        wholeWord.setMnemonic(KeyEvent.VK_W);
        regularExpressions = new JCheckBox("Regular expressions");
        regularExpressions.setMnemonic(KeyEvent.VK_R);
        regularExpressions.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                forwardDirection.setEnabled(!regularExpressions.isSelected());
                backwardDirection.setEnabled(!regularExpressions.isSelected());
                caseSensitive.setEnabled(!regularExpressions.isSelected());
                wholeWord.setEnabled(!regularExpressions.isSelected());
            }
        });
        close = UIUtils.createCloseButton();
        close.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                closeSearch();
                setVisible(false);
            }
        });
        find = UIUtils.createFindButton();
        find.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                find();
            }
        });
        replaceFind = UIUtils.createReplaceFindButton();
        replaceFind.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                replaceFind();
            }
        });
        replace = UIUtils.createReplaceButton();
        replace.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                replace();
            }
        });
        replaceAll = UIUtils.createReplaceAllButton();
        replaceAll.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                replaceAll();
            }
        });
        messageLabel = new JLabel();
    }

    protected void updateButtons() {
        String findText = (String) findCombo.getEditor().getItem();
        if (findText == null || findText.length() == 0) {
            setFindButtonsState(false);
        } else {
            setFindButtonsState(true);
        }
    }

    private void setFindButtonsState(boolean b) {
        find.setEnabled(b);
        replaceFind.setEnabled(b);
        replace.setEnabled(b);
        replaceAll.setEnabled(b);
    }

    private Component buildPanel() {
        FormLayout layout = new FormLayout("pref:grow, 3dlu, pref:grow",
                "pref, pref, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref");
        PanelBuilder builder = new PanelBuilder(layout);
        builder.setDefaultDialogBorder();
        CellConstraints cc = new CellConstraints();
        builder.add(buildTextPanel(), cc.xyw(1, 1, 3));
        builder.add(buildDirectionOrScopePanel("Direction", forwardDirection, backwardDirection), cc.xyw(1, 2, 1));
        builder.add(buildDirectionOrScopePanel("Scope", allLines, selectedLines), cc.xyw(3, 2, 1));
        builder.add(buildOptionsPanel(), cc.xyw(1, 3, 3));
        builder.add(buildButtonBar(), cc.xyw(1, 5, 3));
        builder.add(messageLabel, cc.xyw(1, 7, 3));
        builder.add(ButtonBarFactory.buildRightAlignedBar(close), cc.xyw(1, 9, 3));
        return builder.getPanel();
    }

    private Component buildButtonBar() {
        FormLayout layout = new FormLayout("d:grow, d, 3dlu, d", "pref, 3dlu, pref");
        layout.setColumnGroups(new int[][] { { 2, 4 } });
        PanelBuilder builder = new PanelBuilder(layout);
        builder.setDefaultDialogBorder();
        CellConstraints cc = new CellConstraints();
        builder.add(find, cc.xyw(2, 1, 1));
        builder.add(replaceFind, cc.xyw(4, 1, 1));
        builder.add(replace, cc.xyw(2, 3, 1));
        builder.add(replaceAll, cc.xyw(4, 3, 1));
        return builder.getPanel();
    }

    private Component buildTextPanel() {
        FormLayout layout = new FormLayout("left:pref, 3dlu, min:grow");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.setDefaultDialogBorder();
        builder.append("&Find:", findCombo);
        builder.append("&Replace with:", replaceCombo);
        return builder.getPanel();
    }

    private Component buildDirectionOrScopePanel(String text, JRadioButton fd, JRadioButton bd) {
        FormLayout layout = new FormLayout("pref:grow");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.setDefaultDialogBorder();
        builder.appendSeparator(text);
        builder.append(fd);
        builder.append(bd);
        return builder.getPanel();
    }

    private Component buildOptionsPanel() {
        FormLayout layout = new FormLayout("pref, 3dlu, pref:grow", "pref, 3dlu, pref, 3dlu, pref, 3dlu, pref");
        PanelBuilder builder = new PanelBuilder(layout);
        builder.setDefaultDialogBorder();
        CellConstraints cc = new CellConstraints();
        builder.addSeparator("Options", cc.xyw(1, 1, 3));
        builder.add(caseSensitive, cc.xyw(1, 3, 1));
        builder.add(wrapSearch, cc.xyw(3, 3, 1));
        builder.add(wholeWord, cc.xyw(1, 5, 1));
        builder.add(regularExpressions, cc.xyw(3, 5, 1));
        return builder.getPanel();
    }

    protected void closeSearch() {
        editor.closeSearch();
    }

    protected void find() {
        addToCombo(findCombo);
        int b;
        if (regularExpressions.isSelected())
            b = editor.find(findCombo.getSelectedItem().toString(), true, allLines.isSelected(), true,
                    wrapSearch.isSelected(), false, regularExpressions.isSelected());
        else
            b = editor.find(findCombo.getSelectedItem().toString(), forwardDirection.isSelected(),
                    allLines.isSelected(), caseSensitive.isSelected(), wrapSearch.isSelected(),
                    wholeWord.isSelected(), regularExpressions.isSelected());
        updateMessage(b);
        updateButtons();
    }

    private void updateMessage(int b) {
        if (b == IEditor.FIND_SUCCESS) {
            messageLabel.setText("");
            messageLabel.setIcon(null);
        } else if (b == IEditor.FIND_FAILED) {
            messageLabel.setText("Search string not found");
            messageLabel.setIcon(ERROR_ICON);
        } else if (b == IEditor.FIND_WRAPPED) {
            messageLabel.setText("Search wrapped");
            messageLabel.setIcon(WARN_ICON);
        }
    }

    private void addToCombo(JComboBox combo) {
        int n = combo.getItemCount();
        Object selectedItem = combo.getSelectedItem();
        if (selectedItem == null)
            selectedItem = "";
        for (int i = 0; i < n; i++) {
            if (combo.getItemAt(i).equals(selectedItem))
                return;
        }
        combo.addItem(selectedItem);
    }

    protected void replaceFind() {
        addToCombo(findCombo);
        addToCombo(replaceCombo);
        String findText = "";
        if (findCombo.getSelectedItem() != null)
            findText = findCombo.getSelectedItem().toString();
        String replaceText = "";
        if (replaceCombo.getSelectedItem() != null)
            replaceText = replaceCombo.getSelectedItem().toString();
        int b;
        if (regularExpressions.isSelected())
            b = editor.replaceFind(findText, replaceText, true, allLines.isSelected(), true,
                    wrapSearch.isSelected(), false, regularExpressions.isSelected());
        else
            b = editor.replaceFind(findText, replaceText, forwardDirection.isSelected(), allLines.isSelected(),
                    caseSensitive.isSelected(), wrapSearch.isSelected(), wholeWord.isSelected(),
                    regularExpressions.isSelected());
        updateMessage(b);
    }

    protected void replace() {
        addToCombo(findCombo);
        addToCombo(replaceCombo);
        String findText = "";
        if (findCombo.getSelectedItem() != null)
            findText = findCombo.getSelectedItem().toString();
        String replaceText = "";
        if (replaceCombo.getSelectedItem() != null)
            replaceText = replaceCombo.getSelectedItem().toString();
        editor.replace(findText, replaceText, forwardDirection.isSelected(), allLines.isSelected(),
                caseSensitive.isSelected(), wrapSearch.isSelected(), wholeWord.isSelected(),
                regularExpressions.isSelected());
    }

    protected void replaceAll() {
        addToCombo(findCombo);
        addToCombo(replaceCombo);
        if (regularExpressions.isSelected())
            editor.replaceAll(findCombo.getSelectedItem().toString(), replaceCombo.getSelectedItem().toString(),
                    true, false, regularExpressions.isSelected());
        else
            editor.replaceAll(findCombo.getSelectedItem().toString(), replaceCombo.getSelectedItem().toString(),
                    caseSensitive.isSelected(), wholeWord.isSelected(), regularExpressions.isSelected());
    }

    public void setSearchText(String selectedText) {
        findCombo.setSelectedItem(selectedText);
    }

    public void setSelectedLine(boolean b) {
        selectedLines.setSelected(b);
    }

    public void setEditor(IEditor editor) {
        this.editor = editor;
    }

    @Override
    public JButton getOKButton() {
        return find;
    }

    @Override
    public JButton getCloseButton() {
        return close;
    }
}