/* Copyright 2008-2010 Gephi Authors : Eduardo Ramos <eduramiba@gmail.com> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.datalab.plugin.manipulators.general.ui; import java.awt.Color; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import javax.swing.JOptionPane; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.gephi.data.attributes.api.AttributeColumn; import org.gephi.data.attributes.api.AttributeController; import org.gephi.data.attributes.api.AttributeTable; import org.gephi.datalab.api.DataTablesController; import org.gephi.datalab.api.SearchReplaceController; import org.gephi.datalab.api.SearchReplaceController.SearchOptions; import org.gephi.datalab.api.SearchReplaceController.SearchResult; import org.gephi.graph.api.Edge; import org.gephi.graph.api.GraphController; import org.gephi.graph.api.Node; import org.gephi.utils.HTMLEscape; import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.openide.util.lookup.ServiceProvider; /** * Special UI for SearchReplace GeneralActionsManipulator * @author Eduardo Ramos <eduramiba@gmail.com> */ @ServiceProvider(service = SearchReplaceUI.class) public final class SearchReplaceUI extends javax.swing.JPanel { public enum Mode { NODES_TABLE, EDGES_TABLE } private static final Color invalidRegexColor = new Color(254, 150, 150); private Mode mode = Mode.NODES_TABLE; private SearchReplaceController searchReplaceController; private DataTablesController dataTablesController; private SearchOptions searchOptions; private SearchResult searchResult = null; private Pattern regexPattern; private boolean active = false; /** Creates new form SearchReplaceUI */ public SearchReplaceUI() { initComponents(); searchReplaceController = Lookup.getDefault().lookup(SearchReplaceController.class); dataTablesController = Lookup.getDefault().lookup(DataTablesController.class); createSearchOptions(); refreshSearchOptions(); searchText.getDocument().addDocumentListener(new DocumentListener() { public void insertUpdate(DocumentEvent e) { refreshSearchOptions(); } public void removeUpdate(DocumentEvent e) { refreshSearchOptions(); } public void changedUpdate(DocumentEvent e) { refreshSearchOptions(); } }); } public Mode getMode() { return mode; } public void setMode(Mode mode) { this.mode = mode; createSearchOptions(); resultText.setText(""); refreshSearchOptions(); } public void refreshSearchOptions() { refreshRegexPattern(); searchOptions.setOnlyMatchWholeAttributeValue(matchWholeValueCheckBox.isSelected()); searchOptions.setUseRegexReplaceMode(regexReplaceCheckBox.isEnabled() && regexReplaceCheckBox.isSelected()); if (columnsToSearchComboBox.getSelectedIndex() <= 0) { searchOptions.setColumnsToSearch(new int[0]); } else { searchOptions.setColumnsToSearch(new int[]{((ColumnWrapper) columnsToSearchComboBox.getSelectedItem()).column.getIndex()}); } refreshControls(); } private void createSearchOptions() { boolean onlyVisibleElements = Lookup.getDefault().lookup(DataTablesController.class).isShowOnlyVisible(); searchResult = null; columnsToSearchComboBox.removeAllItems(); AttributeTable table; if (mode == Mode.NODES_TABLE) { Node[] nodes; if (onlyVisibleElements) { //Search on visible nodes: nodes = Lookup.getDefault().lookup(GraphController.class).getModel().getHierarchicalGraphVisible().getNodesTree().toArray(); } else { nodes = new Node[0];//Search on all nodes } searchOptions = new SearchOptions(nodes, null); table = Lookup.getDefault().lookup(AttributeController.class).getModel().getNodeTable(); } else { Edge[] edges; if (onlyVisibleElements) { //Search on visible edges: edges = Lookup.getDefault().lookup(GraphController.class).getModel().getHierarchicalGraphVisible().getEdges().toArray(); } else { edges = new Edge[0];//Search on all edges } searchOptions = new SearchOptions(edges, null); table = Lookup.getDefault().lookup(AttributeController.class).getModel().getEdgeTable(); } //Fill possible columns to search (first value is all columns): columnsToSearchComboBox.addItem(NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.allColumns")); for (AttributeColumn c : table.getColumns()) { columnsToSearchComboBox.addItem(new ColumnWrapper(c)); } } private void refreshRegexPattern() { try { String text = searchText.getText(); if (normalSearchModeRadioButton.isSelected()) { text = Pattern.quote(text);//Normal search, make regex for literal string regexReplaceCheckBox.setEnabled(false); regexReplaceCheckBox.setSelected(false); } else { regexReplaceCheckBox.setEnabled(true); } if (!caseSensitiveCheckBox.isSelected()) { regexPattern = Pattern.compile(text, Pattern.CASE_INSENSITIVE); } else { regexPattern = Pattern.compile(text); } searchOptions.setRegexPattern(regexPattern); searchText.setBackground(Color.WHITE); } catch (PatternSyntaxException ex) { searchText.setBackground(invalidRegexColor); regexPattern = null; } } private void refreshControls() { if (searchResult == null) { replaceButton.setEnabled(false); replaceAllButton.setEnabled(false); } else { boolean canReplace = searchReplaceController.canReplace(searchResult); replaceButton.setEnabled(canReplace); replaceAllButton.setEnabled(columnsToSearchComboBox.getSelectedIndex() > 0 ? canReplace : true);//Disable replace all when the current search result cannot be replaced and } if (regexPattern == null) { findNextButton.setEnabled(false); replaceButton.setEnabled(false); replaceAllButton.setEnabled(false); } else { findNextButton.setEnabled(true); } } private void showSearchResult() { if (searchResult != null) { Object value; if (mode == Mode.NODES_TABLE) { Node node = searchResult.getFoundNode(); dataTablesController.setNodeTableSelection(new Node[]{node}); if (!dataTablesController.isNodeTableMode()) { dataTablesController.selectNodesTable(); } value = node.getNodeData().getAttributes().getValue(searchResult.getFoundColumnIndex()); } else { Edge edge = searchResult.getFoundEdge(); dataTablesController.setEdgeTableSelection(new Edge[]{edge}); if (!dataTablesController.isEdgeTableMode()) { dataTablesController.selectEdgesTable(); } value = edge.getEdgeData().getAttributes().getValue(searchResult.getFoundColumnIndex()); } String columnName; if (mode == Mode.NODES_TABLE) { columnName = Lookup.getDefault().lookup(AttributeController.class).getModel().getNodeTable().getColumn(searchResult.getFoundColumnIndex()).getTitle(); } else { columnName = Lookup.getDefault().lookup(AttributeController.class).getModel().getEdgeTable().getColumn(searchResult.getFoundColumnIndex()).getTitle(); } StringBuilder sb = new StringBuilder(); sb.append("<html>"); sb.append(NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.column", HTMLEscape.stringToHTMLString(columnName))); sb.append("<br>"); if (value != null) { String text = value.toString(); sb.append(HTMLEscape.stringToHTMLString(text.substring(0, searchResult.getStart()))); sb.append("<font color='blue'>"); sb.append(HTMLEscape.stringToHTMLString(text.substring(searchResult.getStart(), searchResult.getEnd()))); sb.append("</font>"); sb.append(HTMLEscape.stringToHTMLString(text.substring(searchResult.getEnd()))); } else { sb.append("<font color='blue'>null</font>"); } sb.append("</html>"); resultText.setText(sb.toString()); } else { JOptionPane.showMessageDialog(null, NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.not.found", searchText.getText())); resultText.setText(""); } } private void showRegexReplaceError() { JOptionPane.showMessageDialog(null, NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.regexReplacementError"), NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.dialog.title.error"), JOptionPane.ERROR_MESSAGE); } public boolean isActive() { return active; } public void setActive(boolean active) { this.active = active; } class ColumnWrapper { AttributeColumn column; public ColumnWrapper(AttributeColumn column) { this.column = column; } @Override public String toString() { return column.getTitle(); } } /** 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. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { searchModeButtonGroup = new javax.swing.ButtonGroup(); searchLabel = new javax.swing.JLabel(); replaceLabel = new javax.swing.JLabel(); matchWholeValueCheckBox = new javax.swing.JCheckBox(); normalSearchModeRadioButton = new javax.swing.JRadioButton(); regexSearchModeRadioButton = new javax.swing.JRadioButton(); caseSensitiveCheckBox = new javax.swing.JCheckBox(); findNextButton = new javax.swing.JButton(); replaceButton = new javax.swing.JButton(); replaceAllButton = new javax.swing.JButton(); searchText = new javax.swing.JTextField(); replaceText = new javax.swing.JTextField(); scroll = new javax.swing.JScrollPane(); resultText = new javax.swing.JTextPane(); resultLabel = new javax.swing.JLabel(); jSeparator1 = new javax.swing.JSeparator(); regexReplaceCheckBox = new javax.swing.JCheckBox(); columnsToSearchLabel = new javax.swing.JLabel(); columnsToSearchComboBox = new javax.swing.JComboBox(); searchLabel.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.searchLabel.text")); // NOI18N replaceLabel.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.replaceLabel.text")); // NOI18N matchWholeValueCheckBox.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.matchWholeValueCheckBox.text")); // NOI18N matchWholeValueCheckBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { matchWholeValueCheckBoxItemStateChanged(evt); } }); searchModeButtonGroup.add(normalSearchModeRadioButton); normalSearchModeRadioButton.setSelected(true); normalSearchModeRadioButton.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.normalSearchModeRadioButton.text")); // NOI18N normalSearchModeRadioButton.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { normalSearchModeRadioButtonItemStateChanged(evt); } }); searchModeButtonGroup.add(regexSearchModeRadioButton); regexSearchModeRadioButton.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.regexSearchModeRadioButton.text")); // NOI18N regexSearchModeRadioButton.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { regexSearchModeRadioButtonItemStateChanged(evt); } }); caseSensitiveCheckBox.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.caseSensitiveCheckBox.text")); // NOI18N caseSensitiveCheckBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { caseSensitiveCheckBoxItemStateChanged(evt); } }); findNextButton.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.findNextButton.text")); // NOI18N findNextButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { findNextButtonActionPerformed(evt); } }); replaceButton.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.replaceButton.text")); // NOI18N replaceButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { replaceButtonActionPerformed(evt); } }); replaceAllButton.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.replaceAllButton.text")); // NOI18N replaceAllButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { replaceAllButtonActionPerformed(evt); } }); searchText.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.searchText.text")); // NOI18N replaceText.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.replaceText.text")); // NOI18N resultText.setContentType(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.resultText.contentType")); // NOI18N resultText.setEditable(false); scroll.setViewportView(resultText); resultLabel.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.resultLabel.text")); // NOI18N regexReplaceCheckBox.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.regexReplaceCheckBox.text")); // NOI18N regexReplaceCheckBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { regexReplaceCheckBoxItemStateChanged(evt); } }); columnsToSearchLabel.setText(org.openide.util.NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.columnsToSearchLabel.text")); // NOI18N columnsToSearchComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { columnsToSearchComboBoxItemStateChanged(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(matchWholeValueCheckBox) .addGroup(layout.createSequentialGroup() .addComponent(normalSearchModeRadioButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(regexSearchModeRadioButton)) .addGroup(layout.createSequentialGroup() .addComponent(caseSensitiveCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(regexReplaceCheckBox)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(searchLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(replaceLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 71, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(searchText, javax.swing.GroupLayout.DEFAULT_SIZE, 160, Short.MAX_VALUE) .addComponent(replaceText, javax.swing.GroupLayout.DEFAULT_SIZE, 160, Short.MAX_VALUE)) .addGap(41, 41, 41))) .addGap(0, 0, 0) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(replaceAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(replaceButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(findNextButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addComponent(scroll, javax.swing.GroupLayout.DEFAULT_SIZE, 359, Short.MAX_VALUE) .addComponent(resultLabel)) .addContainerGap()) .addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 379, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(columnsToSearchLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(columnsToSearchComboBox, 0, 185, Short.MAX_VALUE) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(findNextButton) .addGap(35, 35, 35) .addComponent(replaceButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(replaceAllButton)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(searchText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(searchLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(replaceText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(replaceLabel)) .addGap(18, 18, 18) .addComponent(matchWholeValueCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(normalSearchModeRadioButton) .addComponent(regexSearchModeRadioButton)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(caseSensitiveCheckBox) .addComponent(regexReplaceCheckBox)))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(columnsToSearchLabel) .addComponent(columnsToSearchComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(resultLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(scroll, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); }// </editor-fold>//GEN-END:initComponents private void normalSearchModeRadioButtonItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_normalSearchModeRadioButtonItemStateChanged refreshSearchOptions(); }//GEN-LAST:event_normalSearchModeRadioButtonItemStateChanged private void regexSearchModeRadioButtonItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_regexSearchModeRadioButtonItemStateChanged refreshSearchOptions(); }//GEN-LAST:event_regexSearchModeRadioButtonItemStateChanged private void matchWholeValueCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_matchWholeValueCheckBoxItemStateChanged refreshSearchOptions(); }//GEN-LAST:event_matchWholeValueCheckBoxItemStateChanged private void caseSensitiveCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_caseSensitiveCheckBoxItemStateChanged refreshSearchOptions(); }//GEN-LAST:event_caseSensitiveCheckBoxItemStateChanged private void findNextButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_findNextButtonActionPerformed searchResult = searchReplaceController.findNext(searchOptions); refreshSearchOptions(); showSearchResult(); }//GEN-LAST:event_findNextButtonActionPerformed private void replaceButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_replaceButtonActionPerformed try { searchResult = searchReplaceController.replace(searchResult, replaceText.getText()); refreshSearchOptions(); dataTablesController.refreshCurrentTable(); showSearchResult(); } catch (Exception ex) { showRegexReplaceError(); } }//GEN-LAST:event_replaceButtonActionPerformed private void replaceAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_replaceAllButtonActionPerformed try { int replacementsCount = searchReplaceController.replaceAll(searchOptions, replaceText.getText()); searchResult = null; refreshSearchOptions(); dataTablesController.refreshCurrentTable(); JOptionPane.showMessageDialog(null, NbBundle.getMessage(SearchReplaceUI.class, "SearchReplaceUI.replacements.count.message", replacementsCount)); resultText.setText(""); } catch (Exception ex) { showRegexReplaceError(); } }//GEN-LAST:event_replaceAllButtonActionPerformed private void regexReplaceCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_regexReplaceCheckBoxItemStateChanged refreshSearchOptions(); }//GEN-LAST:event_regexReplaceCheckBoxItemStateChanged private void columnsToSearchComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_columnsToSearchComboBoxItemStateChanged refreshSearchOptions(); }//GEN-LAST:event_columnsToSearchComboBoxItemStateChanged // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox caseSensitiveCheckBox; private javax.swing.JComboBox columnsToSearchComboBox; private javax.swing.JLabel columnsToSearchLabel; private javax.swing.JButton findNextButton; private javax.swing.JSeparator jSeparator1; private javax.swing.JCheckBox matchWholeValueCheckBox; private javax.swing.JRadioButton normalSearchModeRadioButton; private javax.swing.JCheckBox regexReplaceCheckBox; private javax.swing.JRadioButton regexSearchModeRadioButton; private javax.swing.JButton replaceAllButton; private javax.swing.JButton replaceButton; private javax.swing.JLabel replaceLabel; private javax.swing.JTextField replaceText; private javax.swing.JLabel resultLabel; private javax.swing.JTextPane resultText; private javax.swing.JScrollPane scroll; private javax.swing.JLabel searchLabel; private javax.swing.ButtonGroup searchModeButtonGroup; private javax.swing.JTextField searchText; // End of variables declaration//GEN-END:variables }