📄 searchdialog.java
字号:
/*
* YALE - Yet Another Learning Environment
* Copyright (C) 2001-2004
* Simon Fischer, Ralf Klinkenberg, Ingo Mierswa,
* Katharina Morik, Oliver Ritthoff
* Artificial Intelligence Unit
* Computer Science Department
* University of Dortmund
* 44221 Dortmund, Germany
* email: yale-team@lists.sourceforge.net
* web: http://yale.cs.uni-dortmund.de/
*
* 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 (at your option) 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 edu.udo.cs.yale.gui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.JRadioButton;
import javax.swing.JOptionPane;
import javax.swing.text.JTextComponent;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SearchDialog extends JDialog {
private class Result {
private int start, end;
private Result(int start, int end) {
this.start = start;
this.end = end;
}
}
private JTextField patternField = new JTextField(20);
private JCheckBox caseSensitive = new JCheckBox("Case sensitive");
private JCheckBox regExp = new JCheckBox("Regular expression");
private JRadioButton up = new JRadioButton("Up");
private JRadioButton down = new JRadioButton("Down");
private JTextComponent textComponent;
public SearchDialog(Component owner, JTextComponent textComponent) {
super();
this.textComponent = textComponent;
setTitle("Find");
setModal(false);
getContentPane().setLayout(new BorderLayout());
Box mainBox = new Box(BoxLayout.Y_AXIS);
mainBox.setBorder(BorderFactory.createEmptyBorder(11,11,11,5));
JPanel searchPanel = new JPanel();
searchPanel.add(new JLabel("Find:"));
searchPanel.add(patternField);
mainBox.add(searchPanel);
Box optionBox = new Box(BoxLayout.X_AXIS);
JPanel directionPanel = new JPanel();
directionPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(11,0,0,11),
BorderFactory.createTitledBorder("Direction")));
ButtonGroup directionGroup = new ButtonGroup();
up.setMnemonic(KeyEvent.VK_U);
directionGroup.add(up);
directionPanel.add(up);
down.setMnemonic(KeyEvent.VK_D);
directionGroup.add(down);
down.setSelected(true);
directionPanel.add(down);
directionPanel.setAlignmentY(0.5f);
optionBox.add(directionPanel);
Box checkBoxBox = new Box(BoxLayout.Y_AXIS);
checkBoxBox.add(caseSensitive);
checkBoxBox.add(regExp);
checkBoxBox.setAlignmentY(0.5f);
optionBox.add(checkBoxBox);
mainBox.add(optionBox);
getContentPane().add(mainBox, BorderLayout.CENTER);
Box buttonBox = new Box(BoxLayout.Y_AXIS);
buttonBox.setBorder(BorderFactory.createEmptyBorder(11,6,11,11));
JButton find = new JButton("Find");
getRootPane().setDefaultButton(find);
find.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
find();
}
});
buttonBox.add(find);
JButton cancel = new JButton("Close");
//cancel.setMnemonic(KeyEvent.VK_ESCAPE);
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
buttonBox.add(cancel);
getContentPane().add(buttonBox, BorderLayout.EAST);
pack();
setLocationRelativeTo(owner);
}
private void find() {
String pattern = patternField.getText().trim();
if (pattern.length() == 0) return;
int startPos = textComponent.getCaretPosition();
String text = textComponent.getText();
if (startPos == text.length()) startPos = 0;
if (down.isSelected()) {
Result result = search(startPos, pattern, text);
if (result == null) {
noMoreHits();
return;
} else {
textComponent.setCaretPosition(result.start);
textComponent.moveCaretPosition(result.end);
}
} else {
Result lastResult = null;
int pos = 0;
while (true) {
Result result = search(pos, pattern, text);
if (result != null) {
if (result.end < startPos) {
pos = result.start+1;
lastResult = result;
} else {
break;
}
} else {
break;
}
}
if (lastResult == null) {
noMoreHits();
} else {
textComponent.setCaretPosition(lastResult.start);
textComponent.moveCaretPosition(lastResult.end);
}
}
}
private Result search(int start, String pattern, String text) {
if (regExp.isSelected()) {
Matcher matcher =
Pattern.compile(pattern,
caseSensitive.isSelected() ?
0 : Pattern.CASE_INSENSITIVE).matcher(text.subSequence(start, text.length()));
if (matcher.find()) {
return new Result(start + matcher.start(), start + matcher.end());
} else {
return null;
}
} else {
if (!caseSensitive.isSelected()) {
text = text.toLowerCase();
pattern = pattern.toLowerCase();
}
int result = text.indexOf(pattern, start);
if (result == -1) {
return null;
} else {
return new Result(result, result+pattern.length());
}
}
}
private void noMoreHits() {
String restartAt = up.isSelected() ? "end" : "beginning";
switch (JOptionPane.showConfirmDialog(this, "Search string not found. Search from "+restartAt+"?",
"String not found", JOptionPane.YES_NO_OPTION)) {
case JOptionPane.YES_OPTION:
textComponent.setCaretPosition(up.isSelected() ?
textComponent.getText().length()-1 : 0);
find();
break;
case JOptionPane.NO_OPTION:
default:
return;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -