/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.ui.support; import com.eviware.soapui.support.UISupport; import com.jgoodies.forms.builder.ButtonBarBuilder; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.fife.ui.rtextarea.SearchContext; import org.fife.ui.rtextarea.SearchEngine; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.Window; import java.awt.event.ActionEvent; public class FindAndReplaceDialogView extends AbstractAction { private JDialog dialog; private JCheckBox caseCheck; private JRadioButton allButton; private JRadioButton selectedLinesButton; private JRadioButton forwardButton; private JRadioButton backwardButton; private JCheckBox wholeWordCheck; private JButton findButton; private JButton replaceButton; private JButton replaceAllButton; private JComboBox findCombo; private JComboBox replaceCombo; private RSyntaxTextArea editArea; public FindAndReplaceDialogView(RSyntaxTextArea editArea) { super("Find / Replace"); if (UISupport.isMac()) { putValue(Action.ACCELERATOR_KEY, UISupport.getKeyStroke("meta F")); } else { putValue(Action.ACCELERATOR_KEY, UISupport.getKeyStroke("control F")); } this.editArea = editArea; } @Override public void actionPerformed(ActionEvent arg0) { show(); } public void show() { if (dialog == null) { buildDialog(); } editArea.requestFocusInWindow(); replaceCombo.setEnabled(editArea.isEditable()); replaceAllButton.setEnabled(editArea.isEditable()); replaceButton.setEnabled(editArea.isEditable()); UISupport.showDialog(dialog); findCombo.getEditor().selectAll(); findCombo.requestFocus(); } private void buildDialog() { Window window = SwingUtilities.windowForComponent(editArea); dialog = new JDialog(window, "Find / Replace"); dialog.setModal(false); JPanel panel = new JPanel(new BorderLayout()); findCombo = new JComboBox(); findCombo.setEditable(true); replaceCombo = new JComboBox(); replaceCombo.setEditable(true); // create inputs GridLayout gridLayout = new GridLayout(2, 2); gridLayout.setVgap(5); JPanel inputPanel = new JPanel(gridLayout); inputPanel.add(new JLabel("Find:")); inputPanel.add(findCombo); inputPanel.add(new JLabel("Replace with:")); inputPanel.add(replaceCombo); inputPanel.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); // create direction panel ButtonGroup directionGroup = new ButtonGroup(); forwardButton = new JRadioButton("Forward", true); forwardButton.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); directionGroup.add(forwardButton); backwardButton = new JRadioButton("Backward"); backwardButton.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); directionGroup.add(backwardButton); JPanel directionPanel = new JPanel(new GridLayout(2, 1)); directionPanel.add(forwardButton); directionPanel.add(backwardButton); directionPanel.setBorder(BorderFactory.createTitledBorder("Direction")); // create scope panel ButtonGroup scopeGroup = new ButtonGroup(); allButton = new JRadioButton("All", true); allButton.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); selectedLinesButton = new JRadioButton("Selected Lines"); selectedLinesButton.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); scopeGroup.add(allButton); scopeGroup.add(selectedLinesButton); JPanel scopePanel = new JPanel(new GridLayout(2, 1)); scopePanel.add(allButton); scopePanel.add(selectedLinesButton); scopePanel.setBorder(BorderFactory.createTitledBorder("Scope")); // create options caseCheck = new JCheckBox("Case Sensitive"); caseCheck.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); wholeWordCheck = new JCheckBox("Whole Word"); wholeWordCheck.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); JPanel optionsPanel = new JPanel(new GridLayout(2, 1)); optionsPanel.add(caseCheck); optionsPanel.add(wholeWordCheck); optionsPanel.setBorder(BorderFactory.createTitledBorder("Options")); // create panel with options JPanel options = new JPanel(new GridLayout(1, 2)); JPanel radios = new JPanel(new GridLayout(2, 1)); radios.add(directionPanel); radios.add(scopePanel); options.add(optionsPanel); options.add(radios); options.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8)); // create buttons ButtonBarBuilder builder = new ButtonBarBuilder(); findButton = new JButton(new FindAction(findCombo)); builder.addFixed(findButton); builder.addRelatedGap(); replaceButton = new JButton(new ReplaceAction()); builder.addFixed(replaceButton); builder.addRelatedGap(); replaceAllButton = new JButton(new ReplaceAllAction()); builder.addFixed(replaceAllButton); builder.addUnrelatedGap(); builder.addFixed(new JButton(new CloseAction(dialog))); builder.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); // tie it up! panel.add(inputPanel, BorderLayout.NORTH); panel.add(options, BorderLayout.CENTER); panel.add(builder.getPanel(), BorderLayout.SOUTH); dialog.getContentPane().add(panel); dialog.pack(); UISupport.initDialogActions(dialog, null, findButton); } protected SearchContext createSearchAndReplaceContext() { if (findCombo.getSelectedItem() == null) { return null; } if (replaceCombo.getSelectedItem() == null) { return null; } String searchExpression = findCombo.getSelectedItem().toString(); String replacement = replaceCombo.getSelectedItem().toString(); SearchContext context = new SearchContext(); context.setSearchFor(searchExpression); context.setReplaceWith(replacement); context.setRegularExpression(false); context.setSearchForward(forwardButton.isSelected()); context.setWholeWord(wholeWordCheck.isSelected()); context.setMatchCase(caseCheck.isSelected()); return context; } protected SearchContext createSearchContext() { if (findCombo.getSelectedItem() == null) { return null; } String searchExpression = findCombo.getSelectedItem().toString(); SearchContext context = new SearchContext(); context.setSearchFor(searchExpression); context.setRegularExpression(false); context.setSearchForward(forwardButton.isSelected()); context.setWholeWord(wholeWordCheck.isSelected()); context.setMatchCase(caseCheck.isSelected()); return context; } private class FindAction extends AbstractAction { public FindAction(JComboBox findCombo) { super("Find/Find Next"); } @Override public void actionPerformed(ActionEvent e) { SearchContext context = createSearchContext(); if (context == null) { return; } boolean found = SearchEngine.find(editArea, context); if (!found) { UISupport.showErrorMessage("String [" + context.getSearchFor() + "] not found"); } } } private class ReplaceAction extends AbstractAction { public ReplaceAction() { super("Replace/Replace Next"); } @Override public void actionPerformed(ActionEvent e) { SearchContext context = createSearchAndReplaceContext(); if (context == null) { return; } boolean found = SearchEngine.replace(editArea, context); if (!found) { UISupport.showErrorMessage("String [" + context.getSearchFor() + "] not found"); } } } private class ReplaceAllAction extends AbstractAction { public ReplaceAllAction() { super("Replace All"); } @Override public void actionPerformed(ActionEvent e) { SearchContext context = createSearchAndReplaceContext(); if (context == null) { return; } int replaceCount = SearchEngine.replaceAll(editArea, context); if (replaceCount <= 0) { UISupport.showErrorMessage("String [" + context.getSearchFor() + "] not found"); } } } private class CloseAction extends AbstractAction { final JDialog dialog; public CloseAction(JDialog d) { super("Close"); dialog = d; } public void actionPerformed(ActionEvent e) { dialog.setVisible(false); } } }