📄 searchdialog.java
字号:
/* * YALE - Yet Another Learning Environment * Copyright (C) 2002, 2003 * Simon Fischer, Ralf Klinkenberg, Ingo Mierswa, * Katharina Morik, Oliver Ritthoff * Artificial Intelligence Unit * Computer Science Department * University of Dortmund * 44221 Dortmund, Germany * email: yale@ls8.cs.uni-dortmund.de * 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 + -