replace JTextField with SearchTextField in Find Bar

This commit is contained in:
andrey.zaytsev
2013-04-04 17:09:55 +04:00
parent b471a0cee9
commit d13b346940
3 changed files with 51 additions and 25 deletions
@@ -36,12 +36,14 @@ import com.intellij.openapi.editor.event.SelectionListener;
import com.intellij.openapi.editor.impl.EditorHeaderComponent;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Getter;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.LightColors;
import com.intellij.ui.SearchTextField;
import com.intellij.ui.TextComponentUndoProvider;
import com.intellij.ui.components.JBList;
import com.intellij.ui.components.JBScrollPane;
@@ -50,6 +52,7 @@ import com.intellij.ui.components.labels.LinkListener;
import com.intellij.ui.components.panels.NonOpaquePanel;
import com.intellij.ui.speedSearch.SpeedSearchSupply;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
@@ -59,6 +62,7 @@ import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;
import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;
import java.util.regex.Pattern;
/**
@@ -93,6 +97,7 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data
{
mySplitPane.setOpaque(false);
mySplitPane.setBorder(IdeBorderFactory.createEmptyBorder(1, 0, 2, 0));
mySplitPane.setContinuousLayout(true);
myLeftComponent.setOpaque(false);
myRightComponent.setOpaque(false);
@@ -102,7 +107,11 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data
}
private JTextComponent mySearchField;
private SearchTextField mySearchSearchTextField;
private JTextComponent myReplaceField;
private SearchTextField myReplaceSearchTextField;
private MyUndoProvider mySearchUndo;
private MyUndoProvider myReplaceUndo;
@@ -295,7 +304,14 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data
if (mySearchUndo != null) {
mySearchUndo.dispose();
}
mySearchField = createTextField(BorderLayout.NORTH);
Ref<SearchTextField> ref = Ref.create();
mySearchField = createTextField(BorderLayout.NORTH, ref);
mySearchSearchTextField = ref.get();
if (mySearchSearchTextField != null) {
setupHistoryToSearchField(mySearchSearchTextField, FindSettings.getInstance().getRecentFindStrings());
}
mySearchUndo = new MyUndoProvider(mySearchField);
setupSearchFieldListener();
@@ -364,6 +380,11 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data
Utils.setSmallerFontForChildren(myToolbarComponent);
}
private void setupHistoryToSearchField(SearchTextField field, String[] strings) {
field.setHistorySize(strings.length);
field.setHistory(ContainerUtil.reverse(Arrays.asList(strings)));
}
private void initToolbar() {
DefaultActionGroup actionGroup = new DefaultActionGroup("search bar", false);
actionGroup.add(new ShowHistoryAction(mySearchFieldGetter, this));
@@ -540,10 +561,16 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data
if (myReplaceUndo != null) {
myReplaceUndo.dispose();
}
myReplaceField = createTextField(BorderLayout.SOUTH);
Ref<SearchTextField> ref = Ref.create();
myReplaceField = createTextField(BorderLayout.SOUTH, ref);
myReplaceSearchTextField = ref.get();
if (myReplaceSearchTextField != null) {
setupHistoryToSearchField(myReplaceSearchTextField, FindSettings.getInstance().getRecentReplaceStrings());
}
myReplaceUndo = new MyUndoProvider(myReplaceField);
revalidate();
myReplaceUndo = new MyUndoProvider(myReplaceField);
DocumentListener replaceFieldListener = new DocumentListener() {
@Override
@@ -692,7 +719,7 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data
}
}
private JTextComponent createTextField(Object constraint) {
private JTextComponent createTextField(Object constraint, Ref<SearchTextField> searchTextField) {
final JTextComponent editorTextField;
if (myFindModel.isMultiline()) {
editorTextField = new JTextArea("") {
@@ -710,18 +737,14 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data
myLeftComponent.add(scrollPane, constraint);
}
else {
editorTextField = new JTextField("") {
@Override
protected void paintBorder(final Graphics g) {
super.paintBorder(g);
paintBorderOfTextField(g);
}
};
((JTextField)editorTextField).setColumns(25);
SearchTextField stf = new SearchTextField(true);
stf.setOpaque(false);
editorTextField = stf.getTextEditor();
if (UIUtil.isUnderGTKLookAndFeel()) {
editorTextField.setOpaque(false);
}
myLeftComponent.add(editorTextField, constraint);
myLeftComponent.add(stf, constraint);
searchTextField.set(stf);
}
editorTextField.setMinimumSize(new Dimension(200, -1));
editorTextField.putClientProperty("AuxEditorComponent", Boolean.TRUE);
@@ -770,8 +793,14 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data
if (text.length() > 0) {
if (textField == mySearchField) {
FindSettings.getInstance().addStringToFind(text);
if (mySearchSearchTextField != null) {
mySearchSearchTextField.addCurrentTextToHistory();
}
} else {
FindSettings.getInstance().addStringToReplace(text);
if (myReplaceSearchTextField != null) {
myReplaceSearchTextField.addCurrentTextToHistory();
}
}
}
}
@@ -42,16 +42,11 @@ public class ShowHistoryAction extends EditorHeaderAction implements DumbAware {
shortcuts.add(new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_DOWN_MASK), null));
registerCustomShortcutSet(new CustomShortcutSet(shortcuts.toArray(new Shortcut[shortcuts.size()])), getTextField());
if (!editorSearchComponent.getFindModel().isMultiline()) {
getTextField().registerKeyboardAction(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
if (getTextField().getText().isEmpty()) {
getEditorSearchComponent().showHistory(false, getTextField());
}
}
}, KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), JComponent.WHEN_FOCUSED);
}
}
@Override
public void update(AnActionEvent e) {
e.getPresentation().setVisible(getEditorSearchComponent().getFindModel().isMultiline());
}
@Override
@@ -100,7 +100,9 @@ public class SearchTextField extends JPanel {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
if (myPopup == null || !myPopup.isVisible()) {
if (hasNativeLeopardSearchControl()) {
myNativeSearchPopup.show(myTextField, 5, myTextField.getHeight());
} else if (myPopup == null || !myPopup.isVisible()) {
showPopup();
}
}
@@ -372,7 +374,7 @@ public class SearchTextField extends JPanel {
}
protected void showPopup() {
if (myPopup == null) {
if (myPopup == null || !myPopup.isVisible()) {
final JList list = new JBList(myModel);
final Runnable chooseRunnable = createItemChosenCallback(list);
myPopup = JBPopupFactory.getInstance().createListPopupBuilder(list)