|
What this is
Other links
The source code
/*
* 06/08/2001 - 23:35:37
*
* FindAllDialog.java - Find all occurences of a pattern in current text area
* Copyright (C) 2000 Romain Guy
* romain.guy@jext.org
* www.jext.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.jext.search;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import java.util.ArrayList;
import gnu.regexp.*;
import org.jext.*;
import org.jext.gui.*;
public class FindAllDialog extends JFrame implements ActionListener
{
private JList results;
private JextFrame parent;
private JComboBox fieldSearch;
private DefaultListModel resultModel;
private JTextField fieldSearchEditor;
private JextHighlightButton find, cancel;
private JCheckBox useRegexp, ignoreCase, highlight;
public FindAllDialog(JextFrame parent)
{
super(Jext.getProperty("find.all.title"));
this.parent = parent;
getContentPane().setLayout(new BorderLayout());
fieldSearch = new JComboBox();
fieldSearch.setRenderer(new ModifiedCellRenderer());
fieldSearch.setEditable(true);
fieldSearchEditor = (JTextField) fieldSearch.getEditor().getEditorComponent();
fieldSearchEditor.addKeyListener(new KeyHandler());
JPanel pane = new JPanel();
pane.add(new JLabel(Jext.getProperty("find.all.label")));
pane.add(fieldSearch);
getContentPane().add(pane, BorderLayout.NORTH);
JPanel pane2 = new JPanel();
pane2.add(ignoreCase = new JCheckBox(Jext.getProperty("find.ignorecase.label"),
Jext.getBooleanProperty("ignorecase.all")));
pane2.add(useRegexp = new JCheckBox(Jext.getProperty("find.useregexp.label"),
Jext.getBooleanProperty("useregexp.all")));
pane2.add(highlight = new JCheckBox(Jext.getProperty("find.all.highlight.label"),
Jext.getBooleanProperty("highlight.all")));
pane2.add(find = new JextHighlightButton(Jext.getProperty("find.all.button")));
find.setMnemonic(Jext.getProperty("find.all.mnemonic").charAt(0));
find.setToolTipText(Jext.getProperty("find.all.tip"));
pane2.add(cancel = new JextHighlightButton(Jext.getProperty("general.cancel.button")));
cancel.setMnemonic(Jext.getProperty("general.cancel.mnemonic").charAt(0));
getContentPane().add(pane2, BorderLayout.CENTER);
resultModel = new DefaultListModel();
results = new JList();
results.setCellRenderer(new ModifiedCellRenderer());
results.setVisibleRowCount(10);
FontMetrics fm = getFontMetrics(results.getFont());
// results.setMaximumSize(new Dimension(40 * fm.charWidth('m'),
// 10 * results.getFixedCellHeight()));
results.addListSelectionListener(new ListHandler());
results.setModel(resultModel);
JScrollPane scroller = new JScrollPane(results, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
// scroller.getViewport().setPreferredSize(results.getMaximumSize());
getContentPane().add(scroller, BorderLayout.SOUTH);
find.addActionListener(this);
cancel.addActionListener(this);
fm = getFontMetrics(fieldSearch.getFont());
fieldSearch.setPreferredSize(new Dimension(30 * fm.charWidth('m'),
(int) fieldSearch.getPreferredSize().height));
String s;
for (int i = 0; i < 25; i++)
{
s = Jext.getProperty("search.all.history." + i);
if (s != null)
fieldSearch.addItem(s);
else
break;
}
JextTextArea textArea = parent.getTextArea();
if (!Jext.getBooleanProperty("use.selection"))
{
s = Jext.getProperty("find.all");
addSearchHistory(s);
fieldSearch.setSelectedItem(s);
} else if (textArea.getSelectedText() != null) {
s = textArea.getSelectedText();
addSearchHistory(s);
fieldSearch.setSelectedItem(s);
}
getRootPane().setDefaultButton(find);
addKeyListener(new AbstractDisposer(this));
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
exit();
}
});
setIconImage(GUIUtilities.getJextIconImage());
pack();
setResizable(false);
org.jext.Utilities.centerComponent(this);
setVisible(true);
}
private void exit()
{
Jext.setProperty("find.all", fieldSearchEditor.getText());
for (int i = 0; i < fieldSearch.getItemCount(); i++)
Jext.setProperty("search.all.history." + i, (String) fieldSearch.getItemAt(i));
for (int i = fieldSearch.getItemCount(); i < 25; i++)
Jext.unsetProperty("search.all.history." + i);
Jext.setProperty("useregexp.all", (useRegexp.isSelected() ? "on" : "off"));
Jext.setProperty("ignorecase.all", (ignoreCase.isSelected() ? "on" : "off"));
Jext.setProperty("highlight.all", (highlight.isSelected() ? "on" : "off"));
JextTextArea[] areas = parent.getTextAreas();
for (int i = 0; i < areas.length; i++)
{
SearchHighlight h = areas[i].getSearchHighlight();
if (h != null)
h.disable();
}
parent.getTextArea().repaint();
dispose();
}
private void addSearchHistory()
{
addSearchHistory(fieldSearchEditor.getText());
}
private void addSearchHistory(String c)
{
if (c == null)
return;
for (int i = 0; i < fieldSearch.getItemCount(); i++)
if (((String) fieldSearch.getItemAt(i)).equals(c)) return;
fieldSearch.insertItemAt(c, 0);
if (fieldSearch.getItemCount() > 25)
{
for (int i = 24; i < fieldSearch.getItemCount(); i++)
fieldSearch.removeItemAt(i);
}
}
public void actionPerformed(ActionEvent evt)
{
Object o = evt.getSource();
if (o == cancel)
exit();
else if (o == find)
findAll();
}
private void findAll()
{
String searchStr = fieldSearchEditor.getText();
if (searchStr == null || searchStr.length() == 0)
return;
org.jext.Utilities.setCursorOnWait(this, true);
addSearchHistory();
resultModel.removeAllElements();
JextTextArea textArea = parent.getTextArea();
ArrayList matches = new ArrayList();
Document doc = textArea.getDocument();
Element map = doc.getDefaultRootElement();
int lines = map.getElementCount();
boolean light = highlight.isSelected();
boolean regexp = useRegexp.isSelected();
LiteralSearchMatcher matcher = null;
if (!regexp)
{
matcher = new LiteralSearchMatcher(searchStr, null, ignoreCase.isSelected());
}
try
{
for (int i = 1; i <= lines; i++)
{
Element lineElement = map.getElement(i - 1);
int start = lineElement.getStartOffset();
String lineString = doc.getText(start, lineElement.getEndOffset() - start - 1);
int[] match;
int index = 0;
do
{
if (regexp)
match = nextMatch(lineString, index);
else
match = matcher.nextMatch(lineString, index);
if (match != null)
{
SearchResult result = new SearchResult(textArea,
doc.createPosition(start + match[0]),
doc.createPosition(start + match[1]));
resultModel.addElement(result);
if (light)
matches.add(result);
index = match[1];
}
} while (match != null);
}
} catch (BadLocationException ble) {
} finally {
org.jext.Utilities.setCursorOnWait(this, false);
}
if (resultModel.isEmpty())
textArea.getToolkit().beep();
results.setModel(resultModel);
if (light)
{
textArea.initSearchHighlight();
SearchHighlight h = textArea.getSearchHighlight();
h.trigger(true);
h.setMatches(matches);
} else {
SearchHighlight h = textArea.getSearchHighlight();
if (h != null)
{
h.trigger(false);
h.setMatches(null);
}
}
pack();
textArea.repaint();
}
private int[] nextMatch(String str, int index)
{
int[] res;
try
{
if (str.equals("") || str == null)
return null;
RE regexp = new RE((String) fieldSearch.getSelectedItem(),
(ignoreCase.isSelected() ? RE.REG_ICASE : 0),
RESyntax.RE_SYNTAX_PERL5);
if (regexp == null)
{
getToolkit().beep();
return null;
}
REMatch match = regexp.getMatch(str, index);
if (match != null)
{
res = new int[2];
res[0] = match.getStartIndex();
res[1] = match.getEndIndex();
return res;
}
} catch(Exception e) { }
return null;
}
class ListHandler implements ListSelectionListener
{
public void valueChanged(ListSelectionEvent evt)
{
if (results.isSelectionEmpty() || evt.getValueIsAdjusting())
return;
SearchResult result = (SearchResult) results.getSelectedValue();
int pos[] = result.getPos();
result.getTextArea().select(pos[0], pos[1]);
}
}
class KeyHandler extends KeyAdapter
{
public void keyPressed(KeyEvent evt)
{
switch (evt.getKeyCode())
{
case KeyEvent.VK_ENTER:
findAll();
break;
case KeyEvent.VK_ESCAPE:
exit();
}
}
}
}
// End of FindAllDialog.java
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.