diff --git a/java/java-tests/testSrc/com/intellij/find/FindInEditorMultiCaretTest.java b/java/java-tests/testSrc/com/intellij/find/FindInEditorMultiCaretTest.java index 3cc6c19618a1..1dc0b3fa7b29 100644 --- a/java/java-tests/testSrc/com/intellij/find/FindInEditorMultiCaretTest.java +++ b/java/java-tests/testSrc/com/intellij/find/FindInEditorMultiCaretTest.java @@ -20,7 +20,6 @@ import com.intellij.openapi.actionSystem.ActionPlaces; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.editor.impl.EditorImpl; -import com.intellij.openapi.util.Getter; import com.intellij.testFramework.fixtures.EditorMouseFixture; import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; @@ -140,7 +139,7 @@ public class FindInEditorMultiCaretTest extends LightPlatformCodeInsightFixtureT private void setTextToFind(String text) { EditorSearchComponent editorSearchComponent = getEditorSearchComponent(); assertNotNull(editorSearchComponent); - JTextComponent searchField = editorSearchComponent.getSearchField(); + JTextComponent searchField = editorSearchComponent.getSearchTextComponent(); assertNotNull(searchField); for (int i = 0; i <= text.length(); i++) { searchField.setText(text.substring(0, i)); // emulate typing chars one by one @@ -149,22 +148,12 @@ public class FindInEditorMultiCaretTest extends LightPlatformCodeInsightFixtureT private void nextOccurrence() { final EditorSearchComponent editorSearchComponent = getEditorSearchComponent(); - executeAction(new NextOccurrenceAction(editorSearchComponent, new Getter() { - @Override - public JTextComponent get() { - return editorSearchComponent.getSearchField(); - } - })); + executeAction(new NextOccurrenceAction(editorSearchComponent, editorSearchComponent.getSearchTextComponent())); } private void prevOccurrence() { final EditorSearchComponent editorSearchComponent = getEditorSearchComponent(); - executeAction(new PrevOccurrenceAction(editorSearchComponent, new Getter() { - @Override - public JTextComponent get() { - return editorSearchComponent.getSearchField(); - } - })); + executeAction(new PrevOccurrenceAction(editorSearchComponent, editorSearchComponent.getSearchTextComponent())); } private void addOccurrence() { @@ -201,7 +190,7 @@ public class FindInEditorMultiCaretTest extends LightPlatformCodeInsightFixtureT private void closeFind() { EditorSearchComponent editorSearchComponent = getEditorSearchComponent(); - executeAction(new CloseOnESCAction(editorSearchComponent, editorSearchComponent.getSearchField())); + executeAction(new CloseOnESCAction(editorSearchComponent, editorSearchComponent.getSearchTextComponent())); } private static void executeAction(EditorHeaderAction action) { diff --git a/platform/indexing-api/src/com/intellij/find/FindModel.java b/platform/indexing-api/src/com/intellij/find/FindModel.java index dd9310feb3b8..a073dd244a64 100644 --- a/platform/indexing-api/src/com/intellij/find/FindModel.java +++ b/platform/indexing-api/src/com/intellij/find/FindModel.java @@ -24,7 +24,6 @@ import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; @@ -105,7 +104,6 @@ public class FindModel extends UserDataHolderBase implements Cloneable { if (!multiline) { initStringToFindNoMultiline(this, getStringToFind()); } - isMultiline = multiline; notifyObservers(); } @@ -141,6 +139,7 @@ public class FindModel extends UserDataHolderBase implements Cloneable { * @param model the model to copy settings from. */ public void copyFrom(FindModel model) { + boolean changed = !equals(model); myStringToFind = model.myStringToFind; myStringToReplace = model.myStringToReplace; isReplaceState = model.isReplaceState; @@ -166,10 +165,11 @@ public class FindModel extends UserDataHolderBase implements Cloneable { customScope = model.customScope; isCustomScope = model.isCustomScope; isFindAll = model.isFindAll; - searchContext = model.searchContext; - isMultiline = model.isMultiline; + if (changed) { + notifyObservers(); + } } @Override @@ -946,20 +946,4 @@ public class FindModel extends UserDataHolderBase implements Cloneable { return pattern; } - - public String getStateDescription() { - ArrayList state = new ArrayList(); - if (isCaseSensitive()) state.add("Match Case"); - if (isRegularExpressions()) state.add("Regex"); - if (isWholeWordsOnly()) state.add("Words"); - if (isInCommentsOnly()) state.add("In Comments Only"); - if (isInStringLiteralsOnly()) state.add("In Literals Only"); - if (isExceptComments()) state.add("Except Comments"); - if (isExceptStringLiterals()) state.add("Except Literals"); - if (isExceptCommentsAndStringLiterals()) state.add("Except Comments and Literals"); - if (isPreserveCase()) state.add("Preserve Case"); - if (!isGlobal()) state.add("In Selection"); - String join = StringUtil.join(state, ", "); - return join.isEmpty()? "" : "(" + join+")"; - } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/HighlightUsagesHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/HighlightUsagesHandler.java index 389b8e63ce59..72ea8d142091 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/HighlightUsagesHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/HighlightUsagesHandler.java @@ -197,9 +197,9 @@ public class HighlightUsagesHandler extends HighlightHandlerBase { final EditorSearchComponent oldSearch = (EditorSearchComponent)oldHeader; if (oldSearch.hasMatches()) { String oldText = oldSearch.getTextInField(); - if (!oldSearch.isRegexp()) { + if (!oldSearch.getFindModel().isRegularExpressions()) { oldText = StringUtil.escapeToRegexp(oldText); - oldSearch.setRegexp(true); + oldSearch.getFindModel().setRegularExpressions(true); } String newText = oldText + '|' + StringUtil.escapeToRegexp(text); @@ -209,7 +209,7 @@ public class HighlightUsagesHandler extends HighlightHandlerBase { } final EditorSearchComponent header = new EditorSearchComponent(editor, project); - header.setRegexp(false); + header.getFindModel().setRegularExpressions(false); editor.setHeaderComponent(header); } diff --git a/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java b/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java index 3f0feb1801c5..c78c36a8e48c 100644 --- a/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java +++ b/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java @@ -22,12 +22,9 @@ import com.intellij.find.impl.livePreview.LivePreviewController; import com.intellij.find.impl.livePreview.SearchResults; import com.intellij.icons.AllIcons; import com.intellij.ide.ui.UISettings; -import com.intellij.ide.ui.laf.darcula.DarculaUIUtil; import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.actionSystem.ex.CustomComponentAction; -import com.intellij.openapi.actionSystem.impl.ActionButton; +import com.intellij.openapi.actionSystem.ex.DefaultCustomComponentAction; import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl; -import com.intellij.openapi.actionSystem.impl.InplaceActionButtonLook; import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; @@ -35,17 +32,15 @@ import com.intellij.openapi.editor.event.SelectionEvent; 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.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.ui.*; import com.intellij.ui.components.JBList; -import com.intellij.ui.components.JBScrollPane; import com.intellij.ui.components.labels.LinkLabel; import com.intellij.ui.components.labels.LinkListener; import com.intellij.ui.components.panels.NonOpaquePanel; +import com.intellij.ui.components.panels.Wrapper; import com.intellij.ui.speedSearch.SpeedSearchSupply; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; @@ -56,12 +51,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import javax.swing.event.DocumentListener; +import javax.swing.event.DocumentEvent; import javax.swing.text.JTextComponent; import java.awt.*; import java.awt.event.*; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import java.util.Arrays; import java.util.regex.Pattern; @@ -70,106 +63,89 @@ import java.util.regex.Pattern; */ public class EditorSearchComponent extends EditorHeaderComponent implements DataProvider, SelectionListener, SearchResults.SearchResultsListener { - private JLabel myMatchInfoLabel; - private LinkLabel myClickToHighlightLabel; private final Project myProject; - private ActionToolbar myActionsToolbar; - private JLabel myStateLabel; - @NotNull - public Editor getEditor() { - return myEditor; - } + private JPanel myLeftPanel; + private JTextComponent mySearchTextComponent; + private Wrapper mySearchFieldWrapper; + + private JTextComponent myReplaceTextComponent; + private Wrapper myReplaceFieldWrapper; + + + private JPanel myRightPanel; + private ActionToolbarImpl mySearchActionsToolbar1; + private ActionToolbarImpl mySearchActionsToolbar2; + private JLabel myMatchInfoLabel; + private LinkLabel myClickToHighlightLabel; + + private ActionToolbarImpl myReplaceActionsToolbar1; + private ActionToolbarImpl myReplaceActionsToolbar2; + private JPanel myReplaceToolbarWrapper; @NotNull private final Editor myEditor; - public JTextComponent getSearchField() { - return mySearchField; + public JTextComponent getSearchTextComponent() { + return mySearchTextComponent; } - private final JBSplitter mySplitPane = new JBSplitter(false); - private final JPanel myLeftComponent = new JPanel(new BorderLayout()); - private final JPanel myRightComponent = new JPanel(new BorderLayout()); - - { - mySplitPane.setBorder(IdeBorderFactory.createEmptyBorder(1, 0, 2, 0)); - mySplitPane.setHonorComponentsMinimumSize(true); - mySplitPane.setProportion(0.25f); - mySplitPane.setAndLoadSplitterProportionKey("FindSplitterProportion"); - mySplitPane.setOpaque(false); - mySplitPane.getDivider().setOpaque(false); - myLeftComponent.setOpaque(false); - myRightComponent.setOpaque(false); - - mySplitPane.setFirstComponent(myLeftComponent); - mySplitPane.setSecondComponent(myRightComponent); - add(mySplitPane, BorderLayout.NORTH); + public JTextComponent getReplaceTextComponent() { + return myReplaceTextComponent; } - private JTextComponent mySearchField; - private JComponent mySearchRootComponent; - - public JTextComponent getReplaceField() { - return myReplaceField; - } - - private JTextComponent myReplaceField; - private JComponent myReplaceRootComponent; - - private final Getter mySearchFieldGetter = new Getter() { - @Override - public JTextComponent get() { - return mySearchField; - } - }; - - private final Getter myReplaceFieldGetter = new Getter() { - @Override - public JTextComponent get() { - return myReplaceField; - } - }; - private final Color myDefaultBackground; - private JButton myReplaceButton; - private JButton myReplaceAllButton; - private JButton myExcludeButton; - - private static final Color FOCUS_CATCHER_COLOR = new Color(0x9999ff); - - private JComponent myToolbarComponent; - private final LivePreviewController myLivePreviewController; private final SearchResults mySearchResults; private final FindModel myFindModel; - private JPanel myReplacementPane; - public JComponent getToolbarComponent() { - return myToolbarComponent; + public EditorSearchComponent(@NotNull Editor editor, Project project) { + this(editor, project, createDefaultFindModel(project, editor)); } - private void updateReplaceButton() { - if (myReplaceButton != null) { - myReplaceButton.setEnabled(canReplaceCurrent()); + public EditorSearchComponent(@NotNull final Editor editor, final Project project, FindModel findModel) { + myFindModel = findModel; + + myProject = project; + myEditor = editor; + + mySearchResults = new SearchResults(myEditor, myProject); + myLivePreviewController = new LivePreviewController(mySearchResults, this); + + myDefaultBackground = new JTextField().getBackground(); + initUI(); + + new SwitchToFind(this); + new SwitchToReplace(this, editor); + + myFindModel.addObserver(new FindModel.FindModelObserver() { + @Override + public void findModelChanged(FindModel findModel) { + String stringToFind = myFindModel.getStringToFind(); + if (!wholeWordsApplicable(stringToFind)) { + myFindModel.setWholeWordsOnly(false); + } + updateUIWithFindModel(); + updateResults(true); + syncFindModels(FindManager.getInstance(myProject).getFindInFileModel(), myFindModel); + } + }); + + updateUIWithFindModel(); + + if (ApplicationManager.getApplication().isUnitTestMode()) { + initLivePreview(); } + updateMultiLineStateIfNeed(); } - public void restoreFindModel() { - final FindModel model = FindManager.getInstance(myProject).getPreviousFindModel(); - if (model != null) { - myFindModel.copyFrom(model); - updateUIWithFindModel(); - } - } - - private static FindModel createDefaultFindModel(Project p, Editor e) { + private static FindModel createDefaultFindModel(Project project, Editor editor) { FindModel findModel = new FindModel(); - findModel.copyFrom(FindManager.getInstance(p).getFindInFileModel()); - if (e.getSelectionModel().hasSelection()) { - String selectedText = e.getSelectionModel().getSelectedText(); + findModel.copyFrom(FindManager.getInstance(project).getFindInFileModel()); + if (editor.getSelectionModel().hasSelection()) { + String selectedText = editor.getSelectionModel().getSelectedText(); if (selectedText != null) { findModel.setStringToFind(selectedText); } @@ -178,15 +154,12 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data return findModel; } - public EditorSearchComponent(@NotNull Editor editor, Project project) { - this(editor, project, createDefaultFindModel(project, editor)); - } @Override @Nullable public Object getData(@NonNls final String dataId) { if (SpeedSearchSupply.SPEED_SEARCH_CURRENT_QUERY.is(dataId)) { - return mySearchField.getText(); + return mySearchTextComponent.getText(); } if (CommonDataKeys.EDITOR_EVEN_IF_INACTIVE.is(dataId)) { return myEditor; @@ -196,7 +169,7 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data @Override public void searchResultsUpdated(SearchResults sr) { - if (mySearchField.getText().isEmpty()) { + if (mySearchTextComponent.getText().isEmpty()) { updateUIWithEmptyResults(); } else { int count = sr.getMatchesCount(); @@ -217,93 +190,39 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data setRegularBackground(); } } - - updateExcludeStatus(); + myReplaceActionsToolbar1.updateActionsImmediately(); } @Override public void cursorMoved() { - updateExcludeStatus(); + myReplaceActionsToolbar1.updateActionsImmediately(); } @Override public void updateFinished() { } - public EditorSearchComponent(@NotNull final Editor editor, final Project project, FindModel findModel) { - myFindModel = findModel; - myProject = project; - myEditor = editor; - mySearchResults = new SearchResults(myEditor, myProject); - myLivePreviewController = new LivePreviewController(mySearchResults, this); + private void initUI() { + myLeftPanel = new NonOpaquePanel(new BorderLayout()); + myLeftPanel.add(mySearchFieldWrapper = new Wrapper(), BorderLayout.NORTH); + myLeftPanel.add(myReplaceFieldWrapper = new Wrapper(), BorderLayout.CENTER); - myDefaultBackground = new JTextField().getBackground(); + updateSearchComponent(); + updateReplaceComponent(); + initSearchToolbars(); + initReplaceToolBars(); - configureLeadPanel(); - - new SwitchToFind(this); - new SwitchToReplace(this); - - myFindModel.addObserver(new FindModel.FindModelObserver() { - @Override - public void findModelChanged(FindModel findModel) { - String stringToFind = myFindModel.getStringToFind(); - if (!wholeWordsApplicable(stringToFind)) { - myFindModel.setWholeWordsOnly(false); - } - updateUIWithFindModel(); - updateResults(true); - syncFindModels(FindManager.getInstance(myProject).getFindInFileModel(), myFindModel); - } - }); - - updateUIWithFindModel(); - - if (ApplicationManager.getApplication().isUnitTestMode()) { - initLivePreview(); - } - } - - private void configureLeadPanel() { - final int oldCaretPosition = mySearchField != null ? mySearchField.getCaretPosition() : 0; - JPanel myLeadPanel = new NonOpaquePanel(new BorderLayout()); - myRightComponent.add(myLeadPanel, BorderLayout.WEST); - - Ref ref = Ref.create(); - mySearchField = createTextField(BorderLayout.NORTH, ref, true); - mySearchRootComponent = ref.get(); - - SearchTextField searchTextField = (ref.get() instanceof SearchTextField) ? (SearchTextField)ref.get() : null; - if (searchTextField != null) { - setupHistoryToSearchField(searchTextField, FindSettings.getInstance().getRecentFindStrings()); - } - - UIUtil.addUndoRedoActions(mySearchField); - - setupSearchFieldListener(); - - if (myActionsToolbar == null) { - initToolbar(); - } - - JPanel centerPanel = new JPanel(new BorderLayout()); - centerPanel.setOpaque(false); - centerPanel.add(myToolbarComponent, BorderLayout.CENTER); - - myRightComponent.add(centerPanel, BorderLayout.CENTER); - - if (myToolbarComponent instanceof ActionToolbarImpl) { - new ShowMoreOptions(myToolbarComponent, mySearchField); - } - - JPanel tailPanel = new NonOpaquePanel(new BorderLayout(5, 0)); - JPanel tailContainer = new NonOpaquePanel(new BorderLayout(5, 0)); - tailContainer.add(tailPanel, BorderLayout.EAST); - centerPanel.add(tailContainer, BorderLayout.EAST); - - JLabel closeLabel = new JLabel(" ", AllIcons.Actions.Cross, SwingConstants.RIGHT); + Wrapper searchToolbarWrapper1 = new NonOpaquePanel(new BorderLayout()); + searchToolbarWrapper1.add(mySearchActionsToolbar1, BorderLayout.WEST); + Wrapper searchToolbarWrapper2 = new Wrapper(mySearchActionsToolbar2); + JPanel searchPair = new NonOpaquePanel(new BorderLayout()).setVerticalSizeReferent(mySearchFieldWrapper); + searchPair.add(mySearchActionsToolbar1, BorderLayout.WEST); + searchPair.add(searchToolbarWrapper2, BorderLayout.CENTER); + JLabel closeLabel = new JLabel(null, AllIcons.Actions.Cross, SwingConstants.RIGHT); + closeLabel.setBorder(JBUI.Borders.empty(5, 5, 5, 5)); + closeLabel.setVerticalAlignment(SwingConstants.TOP); closeLabel.addMouseListener(new MouseAdapter() { @Override public void mousePressed(final MouseEvent e) { @@ -312,63 +231,200 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data }); closeLabel.setToolTipText("Close search bar (Escape)"); + searchPair.add(new Wrapper.North(closeLabel), BorderLayout.EAST); - tailPanel.add(closeLabel, BorderLayout.EAST); + Wrapper replaceToolbarWrapper1 = new Wrapper(myReplaceActionsToolbar1).setVerticalSizeReferent(myReplaceFieldWrapper); + Wrapper replaceToolbarWrapper2 = new Wrapper(myReplaceActionsToolbar2).setVerticalSizeReferent(myReplaceFieldWrapper); + myReplaceToolbarWrapper = new NonOpaquePanel(new BorderLayout()); + myReplaceToolbarWrapper.add(replaceToolbarWrapper1, BorderLayout.WEST); + myReplaceToolbarWrapper.add(replaceToolbarWrapper2, BorderLayout.CENTER); - Utils.setSmallerFont(mySearchField); - mySearchField.registerKeyboardAction(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent e) { - if (StringUtil.isEmpty(mySearchField.getText())) { - close(); - } - else { - requestFocus(myEditor.getContentComponent()); - addTextToRecent(EditorSearchComponent.this.mySearchField); - } - } - }, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, SystemInfo.isMac ? InputEvent.META_DOWN_MASK : InputEvent.CTRL_DOWN_MASK), - JComponent.WHEN_FOCUSED); - if (mySearchField instanceof JTextField) { - mySearchField.registerKeyboardAction(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent e) { - myFindModel.setMultiline(true); - } - }, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.ALT_DOWN_MASK), JComponent.WHEN_FOCUSED); + searchToolbarWrapper1.setHorizontalSizeReferent(replaceToolbarWrapper1); + myRightPanel = new NonOpaquePanel(new BorderLayout()); + myRightPanel.add(searchPair, BorderLayout.NORTH); + myRightPanel.add(myReplaceToolbarWrapper, BorderLayout.CENTER); + + OnePixelSplitter splitter = new OnePixelSplitter(false, .25F); + splitter.setFirstComponent(myLeftPanel); + splitter.setSecondComponent(myRightPanel); + splitter.setHonorComponentsMinimumSize(true); + splitter.setAndLoadSplitterProportionKey("FindSplitterProportion"); + splitter.setOpaque(false); + splitter.getDivider().setOpaque(false); + add(splitter, BorderLayout.CENTER); + } + + private void updateSearchComponent() { + final int oldCaretPosition = mySearchTextComponent != null ? mySearchTextComponent.getCaretPosition() : 0; + String oldText = mySearchTextComponent != null ? mySearchTextComponent.getText() : myFindModel.getStringToFind(); + + if (!updateTextComponent(true)) { + return; } - final String initialText = myFindModel.getStringToFind(); + if (oldText != null) { + mySearchTextComponent.setText(oldText); + } + mySearchTextComponent.getDocument().addDocumentListener(new DocumentAdapter() { + @Override + protected void textChanged(DocumentEvent e) { + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + searchFieldDocumentChanged(); + } + }); + } + }); + } + }); + + mySearchTextComponent.registerKeyboardAction(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent e) { + if (StringUtil.isEmpty(mySearchTextComponent.getText())) { + close(); + } + else { + requestFocus(myEditor.getContentComponent()); + addTextToRecent(EditorSearchComponent.this.mySearchTextComponent); + } + } + }, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, SystemInfo.isMac ? InputEvent.META_DOWN_MASK : InputEvent.CTRL_DOWN_MASK), + JComponent.WHEN_FOCUSED); ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { - setInitialText(initialText); - mySearchField.setCaretPosition(oldCaretPosition); + mySearchTextComponent.setCaretPosition(oldCaretPosition); } }); - new RestorePreviousSettingsAction(this, mySearchField); - - new VariantsCompletionAction(this, mySearchFieldGetter); // It registers a shortcut set automatically on construction - Utils.setSmallerFontForChildren(myToolbarComponent); + new RestorePreviousSettingsAction(this, mySearchTextComponent); + new VariantsCompletionAction(mySearchTextComponent); // It registers a shortcut set automatically on construction + } + private void searchFieldDocumentChanged() { + setMatchesLimit(LivePreviewController.MATCHES_LIMIT); + String text = mySearchTextComponent.getText(); + myFindModel.setStringToFind(text); + if (!StringUtil.isEmpty(text)) { + updateResults(true); + } + else { + nothingToSearchFor(); + } + if (mySearchTextComponent instanceof JTextArea) { + adjustRows((JTextArea)mySearchTextComponent); + } + updateMultiLineStateIfNeed(); } - private void setupHistoryToSearchField(SearchTextField field, String[] strings) { + private void updateMultiLineStateIfNeed() { + myFindModel.setMultiline(mySearchTextComponent.getText().contains("\n") || myReplaceTextComponent.getText().contains("\n")); + } + + + private void updateReplaceComponent() { + final int oldCaretPosition = myReplaceTextComponent != null ? myReplaceTextComponent.getCaretPosition() : 0; + String oldText = myReplaceTextComponent != null ? myReplaceTextComponent.getText() : myFindModel.getStringToReplace(); + + if (!updateTextComponent(false)) { + return; + } + if (oldText != null) { + myReplaceTextComponent.setText(oldText); + } + + myReplaceTextComponent.getDocument().addDocumentListener(new DocumentAdapter() { + @Override + protected void textChanged(DocumentEvent e) { + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + replaceFieldDocumentChanged(); + } + }); + } + }); + + if (!getFindModel().isMultiline()) { + new ReplaceOnEnterAction(this, myReplaceTextComponent); + } + + //myReplaceTextComponent.setText(myFindModel.getStringToReplace()); + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + myReplaceTextComponent.setCaretPosition(oldCaretPosition); + } + }); + + new VariantsCompletionAction(myReplaceTextComponent); + new NextOccurrenceAction(this, myReplaceFieldWrapper); + new PrevOccurrenceAction(this, myReplaceFieldWrapper); + myReplaceFieldWrapper.revalidate(); + myReplaceFieldWrapper.repaint(); + } + + private void replaceFieldDocumentChanged() { + setMatchesLimit(LivePreviewController.MATCHES_LIMIT); + myFindModel.setStringToReplace(myReplaceTextComponent.getText()); + if (myReplaceTextComponent instanceof JTextArea) { + adjustRows((JTextArea)myReplaceTextComponent); + } + updateMultiLineStateIfNeed(); + } + + private static void setupHistoryToSearchField(SearchTextField field, String[] strings) { field.setHistorySize(20); field.setHistory(ContainerUtil.reverse(Arrays.asList(strings))); } - private void initToolbar() { - DefaultActionGroup actionGroup = new DefaultActionGroup("search bar", false); - actionGroup.add(new PrevOccurrenceAction(this, mySearchFieldGetter)); - actionGroup.add(new NextOccurrenceAction(this, mySearchFieldGetter)); - actionGroup.add(new AddOccurrenceAction(this)); - actionGroup.add(new RemoveOccurrenceAction(this)); - actionGroup.add(new SelectAllAction(this)); - actionGroup.add(new FindAllAction(this)); - actionGroup.add(new ToggleMultiline(this)); + private void initSearchToolbars() { + DefaultActionGroup actionGroup1 = new DefaultActionGroup("search bar 1", false); + mySearchActionsToolbar1 = (ActionToolbarImpl)ActionManager.getInstance().createActionToolbar(ActionPlaces.EDITOR_TOOLBAR, actionGroup1, true); + mySearchActionsToolbar1.setForceMinimumSize(true); + mySearchActionsToolbar1.setReservePlaceAutoPopupIcon(false); + mySearchActionsToolbar1.setSecondaryButtonPopupStateModifier(new ActionToolbarImpl.PopupStateModifier() { + @Override + public int getModifiedPopupState() { + return ActionButtonComponent.PUSHED; + } + + @Override + public boolean willModify() { + return myFindModel.getSearchContext() != FindModel.SearchContext.ANY; + } + }); + mySearchActionsToolbar1.setSecondaryActionsTooltip("More Options(" + ShowMoreOptions.SHORT_CUT + ")"); + + + actionGroup1.add(new PrevOccurrenceAction(this, mySearchFieldWrapper)); + actionGroup1.add(new NextOccurrenceAction(this, mySearchFieldWrapper)); + actionGroup1.add(new FindAllAction(this)); + actionGroup1.addSeparator(); + actionGroup1.add(new AddOccurrenceAction(this)); + actionGroup1.add(new RemoveOccurrenceAction(this)); + actionGroup1.add(new SelectAllAction(this)); + //actionGroup1.addSeparator(); + //actionGroup1.add(new ToggleMultiline(this));//todo get rid of it! + actionGroup1.addSeparator(); + + actionGroup1.addAction(new ToggleInCommentsAction(this)).setAsSecondary(true); + actionGroup1.addAction(new ToggleInLiteralsOnlyAction(this)).setAsSecondary(true); + actionGroup1.addAction(new ToggleExceptCommentsAction(this)).setAsSecondary(true); + actionGroup1.addAction(new ToggleExceptLiteralsAction(this)).setAsSecondary(true); + actionGroup1.addAction(new ToggleExceptCommentsAndLiteralsAction(this)).setAsSecondary(true); + + DefaultActionGroup actionGroup2 = new DefaultActionGroup("search bar 2", false); + mySearchActionsToolbar2 = (ActionToolbarImpl)ActionManager.getInstance().createActionToolbar(ActionPlaces.EDITOR_TOOLBAR, actionGroup2, true); + actionGroup2.add(new ToggleMatchCase(this)); + actionGroup2.add(new ToggleRegex(this)); + actionGroup2.add(new ToggleWholeWordsOnlyAction(this)); myMatchInfoLabel = new JLabel() { @Override @@ -378,10 +434,9 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data } }; - myStateLabel = new JLabel("", SwingConstants.RIGHT); + myMatchInfoLabel.setBorder(JBUI.Borders.empty(2, 20, 0, 20)); - - myClickToHighlightLabel = new LinkLabel("Click to highlight", null, new LinkListener() { + myClickToHighlightLabel = new LinkLabel("Click to highlight", null, new LinkListener() { @Override public void linkSelected(LinkLabel aSource, Object aLinkData) { setMatchesLimit(Integer.MAX_VALUE); @@ -390,105 +445,99 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data }); myClickToHighlightLabel.setVisible(false); - myActionsToolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.EDITOR_TOOLBAR, actionGroup, true); - myActionsToolbar.setSecondaryActionsTooltip("More Options(" + ShowMoreOptions.SHORT_CUT + ")"); + mySearchActionsToolbar2 = (ActionToolbarImpl)ActionManager.getInstance().createActionToolbar(ActionPlaces.EDITOR_TOOLBAR, actionGroup2, true); + actionGroup2.add(new DefaultCustomComponentAction(myMatchInfoLabel)); + actionGroup2.add(new DefaultCustomComponentAction(myClickToHighlightLabel)); - actionGroup.addAction(new ToggleMatchCase(this)).setAsSecondary(true); - actionGroup.addAction(new ToggleRegex(this)).setAsSecondary(true); - actionGroup.addAction(new ToggleWholeWordsOnlyAction(this)).setAsSecondary(true); + mySearchActionsToolbar1.setLayoutPolicy(ActionToolbar.AUTO_LAYOUT_POLICY); + mySearchActionsToolbar2.setLayoutPolicy(ActionToolbar.AUTO_LAYOUT_POLICY); + mySearchActionsToolbar1.setBorder(null); + mySearchActionsToolbar2.setBorder(null); + mySearchActionsToolbar1.setOpaque(false); + mySearchActionsToolbar2.setOpaque(false); - actionGroup.addAction(new Separator()).setAsSecondary(true); - - actionGroup.addAction(new ToggleInCommentsAction(this)).setAsSecondary(true); - actionGroup.addAction(new ToggleInLiteralsOnlyAction(this)).setAsSecondary(true); - actionGroup.addAction(new ToggleExceptCommentsAction(this)).setAsSecondary(true); - actionGroup.addAction(new ToggleExceptLiteralsAction(this)).setAsSecondary(true); - actionGroup.addAction(new ToggleExceptCommentsAndLiteralsAction(this)).setAsSecondary(true); - - actionGroup.addAction(new Separator()).setAsSecondary(true); - - actionGroup.addAction(new TogglePreserveCaseAction(this)).setAsSecondary(true); - actionGroup.addAction(new ToggleSelectionOnlyAction(this)).setAsSecondary(true); - - class MyCustomComponentDoNothingAction extends AnAction implements CustomComponentAction { - private final JComponent c; - - MyCustomComponentDoNothingAction(JComponent c) { - this.c = c; - c.setBorder(IdeBorderFactory.createEmptyBorder(new Insets(0, 10, 0, 0))); - } - - @Override - public void actionPerformed(AnActionEvent e) { - } - - @Override - public JComponent createCustomComponent(Presentation presentation) { - return c; - } - } - - actionGroup.add(new MyCustomComponentDoNothingAction(myMatchInfoLabel)); - actionGroup.add(new MyCustomComponentDoNothingAction(myClickToHighlightLabel)); - actionGroup.add(new MyCustomComponentDoNothingAction(myStateLabel)); - - myActionsToolbar.setLayoutPolicy(ActionToolbar.AUTO_LAYOUT_POLICY); - myToolbarComponent = myActionsToolbar.getComponent(); - myToolbarComponent.setBorder(null); - myToolbarComponent.setOpaque(false); + new ShowMoreOptions(mySearchActionsToolbar1, mySearchFieldWrapper); + Utils.setSmallerFontForChildren(mySearchActionsToolbar1); + Utils.setSmallerFontForChildren(mySearchActionsToolbar2); } - public void selectAllText() { - mySearchField.selectAll(); - } - - private void setupSearchFieldListener() { - mySearchField.getDocument().addDocumentListener(new DocumentListener() { + private void initReplaceToolBars() { + DefaultActionGroup actionGroup1 = new DefaultActionGroup("replace bar 1", false); + myReplaceActionsToolbar1 = (ActionToolbarImpl)ActionManager.getInstance().createActionToolbar(ActionPlaces.EDITOR_TOOLBAR, actionGroup1, true); + myReplaceActionsToolbar1.setForceMinimumSize(true); + final JButton myReplaceButton = new JButton("Replace"); + myReplaceButton.setFocusable(false); + myReplaceButton.addActionListener(new ActionListener() { @Override - public void insertUpdate(javax.swing.event.DocumentEvent documentEvent) { - searchFieldDocumentChanged(); - } - - @Override - public void removeUpdate(javax.swing.event.DocumentEvent documentEvent) { - searchFieldDocumentChanged(); - } - - @Override - public void changedUpdate(javax.swing.event.DocumentEvent documentEvent) { - searchFieldDocumentChanged(); + public void actionPerformed(ActionEvent actionEvent) { + replaceCurrent(); } }); - } - private void searchFieldDocumentChanged() { - setMatchesLimit(LivePreviewController.MATCHES_LIMIT); - String text = mySearchField.getText(); - myFindModel.setStringToFind(text); - if (!StringUtil.isEmpty(text)) { - updateResults(true); - } - else { - nothingToSearchFor(); - } - if (mySearchField instanceof JTextArea) { - adjustRows((JTextArea)mySearchField); + final JButton myReplaceAllButton = new JButton("Replace all"); + myReplaceAllButton.setFocusable(false); + myReplaceAllButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent actionEvent) { + myLivePreviewController.performReplaceAll(); + } + }); + + final JButton myExcludeButton = new JButton(""); + myExcludeButton.setFocusable(false); + myExcludeButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent actionEvent) { + myLivePreviewController.exclude(); + moveCursor(SearchResults.Direction.DOWN); + } + }); + + if (!UISettings.getInstance().DISABLE_MNEMONICS_IN_CONTROLS) { + myReplaceButton.setMnemonic('p'); + myReplaceAllButton.setMnemonic('a'); + myExcludeButton.setMnemonic('l'); } + + actionGroup1.addAction(new DefaultCustomComponentAction(myReplaceButton){ + @Override + public void update(AnActionEvent e) { + myReplaceButton.setEnabled(canReplaceCurrent()); + } + }); + actionGroup1.addAction(new DefaultCustomComponentAction(myReplaceAllButton) { + @Override + public void update(AnActionEvent e) { + myReplaceAllButton.setEnabled(mySearchResults != null && mySearchResults.hasMatches()); + } + }); + actionGroup1.addAction(new DefaultCustomComponentAction(myExcludeButton) { + @Override + public void update(AnActionEvent e) { + FindResult cursor = mySearchResults != null ? mySearchResults.getCursor() : null; + myExcludeButton.setEnabled(cursor != null); + myExcludeButton.setText(cursor != null && mySearchResults.isExcluded(cursor) ? "Include" : "Exclude"); + } + }); + + myReplaceActionsToolbar1.setLayoutPolicy(ActionToolbar.AUTO_LAYOUT_POLICY); + myReplaceActionsToolbar1.setBorder(null); + myReplaceActionsToolbar1.setOpaque(false); + DefaultActionGroup actionGroup2 = new DefaultActionGroup("replace bar 2", false); + myReplaceActionsToolbar2 = (ActionToolbarImpl)ActionManager.getInstance().createActionToolbar(ActionPlaces.EDITOR_TOOLBAR, actionGroup2, true); + actionGroup2.addAction(new TogglePreserveCaseAction(this)); + actionGroup2.addAction(new ToggleSelectionOnlyAction(this)); + myReplaceActionsToolbar2.setLayoutPolicy(ActionToolbar.AUTO_LAYOUT_POLICY); + myReplaceActionsToolbar2.setBorder(null); + myReplaceActionsToolbar2.setOpaque(false); + Utils.setSmallerFontForChildren(myReplaceActionsToolbar1); + Utils.setSmallerFontForChildren(myReplaceActionsToolbar2); } private static void adjustRows(JTextArea area) { area.setRows(Math.max(2, Math.min(3, StringUtil.countChars(area.getText(),'\n')+1))); } - - public boolean isRegexp() { - return myFindModel.isRegularExpressions(); - } - - public void setRegexp(boolean val) { - myFindModel.setRegularExpressions(val); - } - public FindModel getFindModel() { return myFindModel; } @@ -504,55 +553,39 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data } private void updateUIWithFindModel() { - boolean needToResetFocus = false; - myActionsToolbar.updateActionsImmediately(); - - if ((myFindModel.isMultiline() && mySearchField instanceof JTextField) || (!myFindModel.isMultiline() && mySearchField instanceof JTextArea)) { - needToResetFocus = mySearchField.hasFocus(); - myLeftComponent.removeAll(); - myRightComponent.removeAll(); - myReplaceRootComponent = null; - mySearchRootComponent = null; - configureLeadPanel(); - if (myReplacementPane != null) { - myReplacementPane = null; + boolean needToResetSearchFocus = mySearchTextComponent.hasFocus(); + boolean needToResetReplaceFocus = myReplaceTextComponent.hasFocus(); + updateSearchComponent(); + updateReplaceComponent(); + if (myFindModel.isReplaceState()) { + if (myReplaceFieldWrapper.getParent() == null) { + myLeftPanel.add(myReplaceFieldWrapper, BorderLayout.CENTER); + } + if (myReplaceToolbarWrapper.getParent() == null) { + myRightPanel.add(myReplaceToolbarWrapper, BorderLayout.CENTER); + } + if (needToResetReplaceFocus) { + myReplaceTextComponent.requestFocusInWindow(); + } + } else { + if (myReplaceFieldWrapper.getParent() != null) { + myLeftPanel.remove(myReplaceFieldWrapper); + } + if (myReplaceToolbarWrapper.getParent() != null) { + myRightPanel.remove(myReplaceToolbarWrapper); } } - - String stringToFind = myFindModel.getStringToFind(); - - if (!StringUtil.equals(stringToFind, mySearchField.getText())) { - mySearchField.setText(stringToFind); - } + if (needToResetSearchFocus) mySearchTextComponent.requestFocusInWindow(); + mySearchActionsToolbar1.updateActionsImmediately(); + mySearchActionsToolbar2.updateActionsImmediately(); + myReplaceActionsToolbar1.updateActionsImmediately(); + myReplaceActionsToolbar2.updateActionsImmediately(); + myReplaceToolbarWrapper.revalidate(); + revalidate(); + repaint(); myLivePreviewController.setTrackingSelection(!myFindModel.isGlobal()); - myStateLabel.setText(myFindModel.getStateDescription()); - if (myFindModel.isReplaceState() && myReplacementPane == null) { - configureReplacementPane(); - } else if (!myFindModel.isReplaceState() && myReplacementPane != null) { - - if (myReplaceRootComponent != null) { - myLeftComponent.remove(myReplaceRootComponent); - myReplaceRootComponent = null; - myReplaceField = null; - } - - myRightComponent.remove(myReplacementPane); - myReplacementPane = null; - } - if (myFindModel.isReplaceState()) { - String stringToReplace = myFindModel.getStringToReplace(); - if (!StringUtil.equals(stringToReplace, myReplaceField.getText())) { - myReplaceField.setText(stringToReplace); - } - updateExcludeStatus(); - } - - updateReplaceButton(); - Utils.setSmallerFontForChildren(myToolbarComponent); - revalidate(); - if (needToResetFocus) mySearchField.requestFocusInWindow(); } private static boolean wholeWordsApplicable(String stringToFind) { @@ -566,102 +599,6 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data mySearchResults.setMatchesLimit(value); } - private void configureReplacementPane() { - myReplacementPane = new NonOpaquePanel(new FlowLayout(FlowLayout.LEFT, 5, 0)); - - Ref ref = Ref.create(); - myReplaceField = createTextField(BorderLayout.SOUTH, ref, false); - myReplaceRootComponent = ref.get(); - - SearchTextField searchTextField = ref.get() instanceof SearchTextField ? (SearchTextField)ref.get() : null; - if (searchTextField != null) { - setupHistoryToSearchField(searchTextField, FindSettings.getInstance().getRecentReplaceStrings()); - } - UIUtil.addUndoRedoActions(myReplaceField); - - revalidate(); - - DocumentListener replaceFieldListener = new DocumentListener() { - @Override - public void insertUpdate(javax.swing.event.DocumentEvent documentEvent) { - replaceFieldDocumentChanged(); - } - - @Override - public void removeUpdate(javax.swing.event.DocumentEvent documentEvent) { - replaceFieldDocumentChanged(); - } - - @Override - public void changedUpdate(javax.swing.event.DocumentEvent documentEvent) { - replaceFieldDocumentChanged(); - } - }; - myReplaceField.getDocument().addDocumentListener(replaceFieldListener); - - if (!getFindModel().isMultiline()) { - new ReplaceOnEnterAction(this, myReplaceField); - } - - myReplaceField.setText(myFindModel.getStringToReplace()); - myRightComponent.add(myReplacementPane, BorderLayout.SOUTH); - - myReplaceButton = new JButton("Replace"); - myReplaceButton.setFocusable(false); - myReplaceButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent actionEvent) { - replaceCurrent(); - } - }); - - myReplaceAllButton = new JButton("Replace all"); - myReplaceAllButton.setFocusable(false); - myReplaceAllButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent actionEvent) { - myLivePreviewController.performReplaceAll(); - } - }); - - myExcludeButton = new JButton(""); - myExcludeButton.setFocusable(false); - myExcludeButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent actionEvent) { - myLivePreviewController.exclude(); - moveCursor(SearchResults.Direction.DOWN); - } - }); - - if (!UISettings.getInstance().DISABLE_MNEMONICS_IN_CONTROLS) { - myReplaceButton.setMnemonic('p'); - myReplaceAllButton.setMnemonic('a'); - myExcludeButton.setMnemonic('l'); - } - - myReplacementPane.add(myReplaceButton); - myReplacementPane.add(myReplaceAllButton); - myReplacementPane.add(myExcludeButton); - - setSmallerFontAndOpaque(myReplaceButton); - setSmallerFontAndOpaque(myReplaceAllButton); - setSmallerFontAndOpaque(myExcludeButton); - - Utils.setSmallerFont(myReplaceField); - new VariantsCompletionAction(this, myReplaceFieldGetter); - new NextOccurrenceAction(this, myReplaceFieldGetter); - new PrevOccurrenceAction(this, myReplaceFieldGetter); - } - - private void replaceFieldDocumentChanged() { - setMatchesLimit(LivePreviewController.MATCHES_LIMIT); - myFindModel.setStringToReplace(myReplaceField.getText()); - if (myReplaceField instanceof JTextArea) { - adjustRows((JTextArea)myReplaceField); - } - } - private boolean canReplaceCurrent() { return myLivePreviewController != null && myLivePreviewController.canReplace(); } @@ -672,78 +609,90 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data } } - private void updateExcludeStatus() { - if (myExcludeButton != null && mySearchResults != null) { - FindResult cursor = mySearchResults.getCursor(); - myExcludeButton.setText(cursor == null || !mySearchResults.isExcluded(cursor) ? "Exclude" : "Include"); - myReplaceAllButton.setEnabled(mySearchResults.hasMatches()); - myExcludeButton.setEnabled(cursor != null); - updateReplaceButton(); - } - } - - public void showHistory(final boolean byClickingToolbarButton, JTextComponent textField) { FeatureUsageTracker.getInstance().triggerFeatureUsed("find.recent.search"); FindSettings settings = FindSettings.getInstance(); - String[] recent = textField == mySearchField ? settings.getRecentFindStrings() : settings.getRecentReplaceStrings(); - final boolean toShowAd = textField == mySearchField && textField.getText().isEmpty() && FindManager.getInstance(myProject).getPreviousFindModel() != null; - Utils.showCompletionPopup(byClickingToolbarButton ? myToolbarComponent : null, + String[] recent = textField == mySearchTextComponent ? settings.getRecentFindStrings() : settings.getRecentReplaceStrings(); + final boolean toShowAd = textField == mySearchTextComponent && textField.getText().isEmpty() && FindManager.getInstance(myProject).getPreviousFindModel() != null; + Utils.showCompletionPopup(byClickingToolbarButton ? mySearchActionsToolbar1 : null, new JBList((Object[])ArrayUtil.reverseArray(recent)), - "Recent " + (textField == mySearchField ? "Searches" : "Replaces"), + "Recent " + (textField == mySearchTextComponent ? "Searches" : "Replaces"), textField, toShowAd ? RestorePreviousSettingsAction.getAd() : null); } - private JTextComponent createTextField(Object constraint, Ref componentRef, boolean search) { - final JTextComponent editorTextField; - if (myFindModel.isMultiline()) { - editorTextField = new JTextArea(); - componentRef.set(editorTextField); - ((JTextArea)editorTextField).setColumns(25); - ((JTextArea)editorTextField).setRows(3); - final SearchWrapper wrapper = new SearchWrapper(editorTextField, new ShowHistoryAction(search? mySearchFieldGetter : myReplaceFieldGetter, this)); - myLeftComponent.add(wrapper, constraint); + private boolean updateTextComponent(final boolean search) { + JTextComponent oldComponent = search ? mySearchTextComponent : myReplaceTextComponent; + Color oldBackground = oldComponent != null ? oldComponent.getBackground() : null; + Wrapper wrapper = search ? mySearchFieldWrapper : myReplaceFieldWrapper; + boolean multiline = myFindModel.isMultiline(); + if (multiline && oldComponent instanceof JTextArea) return false; + if (!multiline && oldComponent instanceof JTextField) return false; + + final JTextComponent textComponent; + if (multiline) { + textComponent = new JTextArea(); + ((JTextArea)textComponent).setColumns(25); + ((JTextArea)textComponent).setRows(2); + wrapper.setContent(new SearchWrapper(textComponent, new ShowHistoryAction(textComponent, this))); } else { - SearchTextField stf = new SearchTextField(true); - componentRef.set(stf); - stf.setOpaque(false); - editorTextField = stf.getTextEditor(); + SearchTextField searchTextField = new SearchTextField(true); + searchTextField.setOpaque(false); + textComponent = searchTextField.getTextEditor(); + searchTextField.getTextEditor().setColumns(25); if (UIUtil.isUnderGTKLookAndFeel()) { - editorTextField.setOpaque(false); + textComponent.setOpaque(false); } - myLeftComponent.add(stf, constraint); + setupHistoryToSearchField(searchTextField, search + ? FindSettings.getInstance().getRecentFindStrings() + : FindSettings.getInstance().getRecentReplaceStrings()); + textComponent.registerKeyboardAction(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent e) { + final String text = textComponent.getText(); + myFindModel.setMultiline(true); + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + if (search) { + mySearchTextComponent.setText(text+"\n"); + } else { + myReplaceTextComponent.setText(text+"\n"); + } + } + }); + } + }, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.ALT_DOWN_MASK), JComponent.WHEN_FOCUSED); + wrapper.setContent(searchTextField); } - editorTextField.setMinimumSize(new Dimension(200, -1)); - editorTextField.putClientProperty("AuxEditorComponent", Boolean.TRUE); - editorTextField.addFocusListener(new FocusListener() { + if (search) { + mySearchTextComponent = textComponent; + } else { + myReplaceTextComponent = textComponent; + } + + UIUtil.addUndoRedoActions(textComponent); + Utils.setSmallerFont(textComponent); + + textComponent.putClientProperty("AuxEditorComponent", Boolean.TRUE); + if (oldBackground != null) { + textComponent.setBackground(oldBackground); + } + textComponent.addFocusListener(new FocusListener() { @Override public void focusGained(final FocusEvent e) { - editorTextField.repaint(); + textComponent.repaint(); } @Override public void focusLost(final FocusEvent e) { - editorTextField.repaint(); + textComponent.repaint(); } }); - new CloseOnESCAction(this, editorTextField); - return editorTextField; - } - - - public void setInitialText(final String initialText) { - boolean wasEmpty = getTextInField().isEmpty(); - final String text = initialText != null ? initialText : ""; - if (text.contains("\n")) { - myFindModel.setMultiline(true); - } - setTextInField(text); - if (wasEmpty) { - mySearchField.selectAll(); - } + new CloseOnESCAction(this, textComponent); + return true; } private void requestFocus(Component c) { @@ -752,26 +701,26 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data public void searchBackward() { moveCursor(SearchResults.Direction.UP); - addTextToRecent(mySearchField); + addTextToRecent(mySearchTextComponent); } public void searchForward() { moveCursor(SearchResults.Direction.DOWN); - addTextToRecent(mySearchField); + addTextToRecent(mySearchTextComponent); } public void addTextToRecent(JTextComponent textField) { final String text = textField.getText(); if (text.length() > 0) { - if (textField == mySearchField) { + if (textField == mySearchTextComponent) { FindSettings.getInstance().addStringToFind(text); - if (mySearchRootComponent instanceof SearchTextField) { - ((SearchTextField)mySearchRootComponent).addCurrentTextToHistory(); + if (mySearchFieldWrapper.getTargetComponent() instanceof SearchTextField) { + ((SearchTextField)mySearchFieldWrapper.getTargetComponent()).addCurrentTextToHistory(); } } else { FindSettings.getInstance().addStringToReplace(text); - if (myReplaceRootComponent instanceof SearchTextField) { - ((SearchTextField)myReplaceRootComponent).addCurrentTextToHistory(); + if (myReplaceFieldWrapper.getTargetComponent() instanceof SearchTextField) { + ((SearchTextField)myReplaceFieldWrapper.getTargetComponent()).addCurrentTextToHistory(); } } } @@ -786,16 +735,11 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data myLivePreviewController.moveCursor(direction); } - private static void setSmallerFontAndOpaque(final JComponent component) { - Utils.setSmallerFont(component); - component.setOpaque(false); - } - @Override public void requestFocus() { - mySearchField.setSelectionStart(0); - mySearchField.setSelectionEnd(mySearchField.getText().length()); - requestFocus(mySearchField); + mySearchTextComponent.setSelectionStart(0); + mySearchTextComponent.setSelectionEnd(mySearchTextComponent.getText().length()); + requestFocus(mySearchTextComponent); } public void close() { @@ -828,9 +772,9 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data myLivePreviewController.off(); mySearchResults.removeListener(this); - addTextToRecent(mySearchField); - if (myReplaceField != null) { - addTextToRecent(myReplaceField); + addTextToRecent(mySearchTextComponent); + if (myReplaceTextComponent != null) { + addTextToRecent(myReplaceTextComponent); } } @@ -883,19 +827,19 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data } private void setRegularBackground() { - mySearchField.setBackground(myDefaultBackground); + mySearchTextComponent.setBackground(myDefaultBackground); } private void setNotFoundBackground() { - mySearchField.setBackground(LightColors.RED); + mySearchTextComponent.setBackground(LightColors.RED); } public String getTextInField() { - return mySearchField.getText(); + return mySearchTextComponent.getText(); } public void setTextInField(final String text) { - mySearchField.setText(text); + mySearchTextComponent.setText(text); myFindModel.setStringToFind(text); } @@ -926,81 +870,7 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data } public void clearUndoInTextFields() { - UIUtil.resetUndoRedoActions(mySearchField); - UIUtil.resetUndoRedoActions(myReplaceField); - } - - private static class SearchWrapper extends NonOpaquePanel implements PropertyChangeListener, FocusListener{ - private final JComponent myToWrap; - - public SearchWrapper(JComponent toWrap, AnAction showHistoryAction) { - myToWrap = toWrap; - setBorder(JBUI.Borders.empty(6, 6, 6, 8)); - setLayout(new BorderLayout(JBUI.scale(4), 0)); - myToWrap.addPropertyChangeListener("background", this); - myToWrap.addFocusListener(this); - myToWrap.setBorder(null); - myToWrap.setOpaque(false); - JBScrollPane scrollPane = new JBScrollPane(myToWrap, - ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrollPane.getVerticalScrollBar().setBackground(UIUtil.TRANSPARENT_COLOR); - scrollPane.getViewport().setBorder(null); - scrollPane.getViewport().setOpaque(false); - scrollPane.setBorder(JBUI.Borders.empty(0, 0, 0, 2)); - scrollPane.setOpaque(false); - ActionButton button = - new ActionButton(showHistoryAction, showHistoryAction.getTemplatePresentation(), ActionPlaces.UNKNOWN, new Dimension(JBUI.scale(16), JBUI.scale(16))); - button.setLook(new InplaceActionButtonLook()); - JPanel p = new NonOpaquePanel(new BorderLayout()); - p.add(button, BorderLayout.NORTH); - add(p, BorderLayout.WEST); - add(scrollPane, BorderLayout.CENTER); - } - - @Override - public void propertyChange(PropertyChangeEvent evt) { - repaint(); - } - - @Override - public void focusGained(FocusEvent e) { - repaint(); - } - - @Override - public void focusLost(FocusEvent e) { - repaint(); - } - - @Override - public void paint(Graphics graphics) { - Graphics2D g = (Graphics2D)graphics.create(); - try { - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); - Rectangle r = new Rectangle(getSize()); - r.x += JBUI.scale(4); - r.y += JBUI.scale(3); - r.width -= JBUI.scale(9); - r.height -= JBUI.scale(6); - int arcSize = Math.min(25, r.height - 1) - 6; - g.setColor(myToWrap.getBackground()); - boolean hasFocus = myToWrap.hasFocus(); - g.fillRoundRect(r.x, r.y + 1, r.width, r.height - 2, arcSize, arcSize); - g.setColor(myToWrap.isEnabled() ? Gray._100 : Gray._83); - - if (hasFocus) { - DarculaUIUtil.paintSearchFocusRing(g, r, arcSize + 6); - } - else { - g.drawRoundRect(r.x, r.y, r.width, r.height - 1, arcSize, arcSize); - } - } - finally { - g.dispose(); - } - super.paint(graphics); - } + UIUtil.resetUndoRedoActions(mySearchTextComponent); + UIUtil.resetUndoRedoActions(myReplaceTextComponent); } } diff --git a/platform/lang-impl/src/com/intellij/find/SearchWrapper.java b/platform/lang-impl/src/com/intellij/find/SearchWrapper.java new file mode 100644 index 000000000000..650f02e9579c --- /dev/null +++ b/platform/lang-impl/src/com/intellij/find/SearchWrapper.java @@ -0,0 +1,114 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.find; + +import com.intellij.ide.ui.laf.darcula.DarculaUIUtil; +import com.intellij.openapi.actionSystem.ActionPlaces; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.impl.ActionButton; +import com.intellij.openapi.actionSystem.impl.InplaceActionButtonLook; +import com.intellij.ui.Gray; +import com.intellij.ui.components.JBScrollPane; +import com.intellij.ui.components.panels.NonOpaquePanel; +import com.intellij.util.ui.JBUI; +import com.intellij.util.ui.UIUtil; + +import javax.swing.*; +import javax.swing.text.JTextComponent; +import java.awt.*; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +class SearchWrapper extends NonOpaquePanel implements PropertyChangeListener, FocusListener { + private final JTextComponent myToWrap; + + public SearchWrapper(JTextComponent toWrap, AnAction showHistoryAction) { + myToWrap = toWrap; + setBorder(JBUI.Borders.empty(6, 6, 6, 8)); + setLayout(new BorderLayout(JBUI.scale(4), 0)); + myToWrap.addPropertyChangeListener("background", this); + myToWrap.addFocusListener(this); + myToWrap.setBorder(null); + myToWrap.setOpaque(false); + JBScrollPane scrollPane = new JBScrollPane(myToWrap, + ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrollPane.getVerticalScrollBar().setBackground(UIUtil.TRANSPARENT_COLOR); + scrollPane.getViewport().setBorder(null); + scrollPane.getViewport().setOpaque(false); + scrollPane.setBorder(JBUI.Borders.empty(0, 0, 0, 2)); + scrollPane.setOpaque(false); + ActionButton button = + new ActionButton(showHistoryAction, showHistoryAction.getTemplatePresentation(), ActionPlaces.UNKNOWN, new Dimension(JBUI.scale(16), JBUI.scale(16))); + button.setLook(new InplaceActionButtonLook()); + JPanel p = new NonOpaquePanel(new BorderLayout()); + p.add(button, BorderLayout.NORTH); + add(p, BorderLayout.WEST); + add(scrollPane, BorderLayout.CENTER); + } + + @Override + public Dimension getMinimumSize() { + return getPreferredSize();//myToWrap.getPreferredScrollableViewportSize(); + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + repaint(); + } + + @Override + public void focusGained(FocusEvent e) { + repaint(); + } + + @Override + public void focusLost(FocusEvent e) { + repaint(); + } + + @Override + public void paint(Graphics graphics) { + Graphics2D g = (Graphics2D)graphics.create(); + try { + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); + Rectangle r = new Rectangle(getSize()); + r.x += JBUI.scale(4); + r.y += JBUI.scale(3); + r.width -= JBUI.scale(9); + r.height -= JBUI.scale(6); + int arcSize = Math.min(25, r.height - 1) - 6; + g.setColor(myToWrap.getBackground()); + boolean hasFocus = myToWrap.hasFocus(); + g.fillRoundRect(r.x, r.y + 1, r.width, r.height - 2, arcSize, arcSize); + g.setColor(myToWrap.isEnabled() ? Gray._100 : Gray._83); + + if (hasFocus) { + DarculaUIUtil.paintSearchFocusRing(g, r, arcSize + 6); + } + else { + g.drawRoundRect(r.x, r.y, r.width, r.height - 1, arcSize, arcSize); + } + } + finally { + g.dispose(); + } + super.paint(graphics); + } +} diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/AddOccurrenceAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/AddOccurrenceAction.java index 7996fe05a727..813a549d0318 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/AddOccurrenceAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/AddOccurrenceAction.java @@ -29,18 +29,18 @@ public class AddOccurrenceAction extends EditorHeaderAction implements DumbAware copyFrom(ActionManager.getInstance().getAction(IdeActions.ACTION_SELECT_NEXT_OCCURENCE)); getTemplatePresentation().setIcon(AllIcons.Actions.AddMulticaret); - registerShortcutsForComponent(Arrays.asList(getShortcutSet().getShortcuts()), editorSearchComponent.getSearchField()); + registerShortcutsForComponent(Arrays.asList(getShortcutSet().getShortcuts()), editorSearchComponent.getSearchTextComponent()); } @Override public void actionPerformed(AnActionEvent e) { - getEditorSearchComponent().addNextOccurrence(); + myEditorSearchComponent.addNextOccurrence(); } @Override public void update(AnActionEvent e) { - boolean isFind = !getEditorSearchComponent().getFindModel().isReplaceState(); - boolean hasMatches = getEditorSearchComponent().hasMatches(); + boolean isFind = !myEditorSearchComponent.getFindModel().isReplaceState(); + boolean hasMatches = myEditorSearchComponent.hasMatches(); e.getPresentation().setVisible(isFind); e.getPresentation().setEnabled(isFind && hasMatches); }} diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/CloseOnESCAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/CloseOnESCAction.java index 7b2d3c28b2b8..91837cb8acdb 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/CloseOnESCAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/CloseOnESCAction.java @@ -37,6 +37,6 @@ public class CloseOnESCAction extends EditorHeaderAction implements DumbAware { @Override public void actionPerformed(AnActionEvent e) { - getEditorSearchComponent().close(); + myEditorSearchComponent.close(); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/EditorHeaderAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/EditorHeaderAction.java index 15348730a41d..2e52b79bf659 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/EditorHeaderAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/EditorHeaderAction.java @@ -25,21 +25,16 @@ import javax.swing.*; import java.util.List; public abstract class EditorHeaderAction extends AnAction { - private final EditorSearchComponent myEditorSearchComponent; + protected final EditorSearchComponent myEditorSearchComponent; + + protected EditorHeaderAction(EditorSearchComponent editorSearchComponent) { + myEditorSearchComponent = editorSearchComponent; + } protected void registerShortcutsForComponent(List shortcuts, JComponent component) { registerCustomShortcutSet( new CustomShortcutSet(shortcuts.toArray(new Shortcut[shortcuts.size()])), component); } - - public EditorSearchComponent getEditorSearchComponent() { - return myEditorSearchComponent; - } - - protected EditorHeaderAction(EditorSearchComponent editorSearchComponent) { - - myEditorSearchComponent = editorSearchComponent; - } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/EditorHeaderToggleAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/EditorHeaderToggleAction.java index 8f27f4483f51..d5cb872a1cee 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/EditorHeaderToggleAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/EditorHeaderToggleAction.java @@ -10,15 +10,18 @@ import javax.swing.*; public abstract class EditorHeaderToggleAction extends CheckboxAction implements DumbAware { + protected final EditorSearchComponent myEditorSearchComponent; + + protected EditorHeaderToggleAction(EditorSearchComponent editorSearchComponent, String text) { + super(text); + myEditorSearchComponent = editorSearchComponent; + } + @Override public boolean displayTextInToolbar() { return true; } - public EditorSearchComponent getEditorSearchComponent() { - return myEditorSearchComponent; - } - @Override public void update(AnActionEvent e) { super.update(e); @@ -31,11 +34,4 @@ public abstract class EditorHeaderToggleAction extends CheckboxAction implements customComponent.setOpaque(false); return customComponent; } - - private final EditorSearchComponent myEditorSearchComponent; - - protected EditorHeaderToggleAction(EditorSearchComponent editorSearchComponent, String text) { - super(text); - myEditorSearchComponent = editorSearchComponent; - } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/FindAllAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/FindAllAction.java index 0e1a591f6637..08eefa018b24 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/FindAllAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/FindAllAction.java @@ -20,10 +20,7 @@ import com.intellij.find.FindManager; import com.intellij.find.FindModel; import com.intellij.find.FindUtil; import com.intellij.icons.AllIcons; -import com.intellij.openapi.actionSystem.ActionManager; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.IdeActions; +import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; @@ -56,29 +53,28 @@ public class FindAllAction extends EditorHeaderAction implements DumbAware { final AnAction findUsages = ActionManager.getInstance().getAction(IdeActions.ACTION_FIND_USAGES); if (findUsages != null) { registerCustomShortcutSet(findUsages.getShortcutSet(), - editorSearchComponent.getSearchField()); + editorSearchComponent.getSearchTextComponent()); } } @Override public void update(final AnActionEvent e) { - super.update(e); - Editor editor = getEditorSearchComponent().getEditor(); - Project project = editor.getProject(); + Editor editor = e.getData(CommonDataKeys.EDITOR_EVEN_IF_INACTIVE); + Project project = e.getProject(); if (project != null && !project.isDisposed()) { - e.getPresentation().setEnabled(getEditorSearchComponent().hasMatches() && + e.getPresentation().setEnabled(editor != null && myEditorSearchComponent.hasMatches() && PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()) != null); } } @Override public void actionPerformed(final AnActionEvent e) { - Editor editor = getEditorSearchComponent().getEditor(); - Project project = editor.getProject(); - if (project != null && !project.isDisposed()) { + Editor editor = e.getData(CommonDataKeys.EDITOR_EVEN_IF_INACTIVE); + Project project = e.getProject(); + if (editor != null && project != null && !project.isDisposed()) { final FindModel model = FindManager.getInstance(project).getFindInFileModel(); final FindModel realModel = (FindModel)model.clone(); - String text = getEditorSearchComponent().getTextInField(); + String text = myEditorSearchComponent.getTextInField(); if (StringUtil.isEmpty(text)) return; realModel.setStringToFind(text); FindUtil.findAllAndShow(project, editor, realModel); diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/NextOccurrenceAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/NextOccurrenceAction.java index 0e6e67168521..b024787f9910 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/NextOccurrenceAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/NextOccurrenceAction.java @@ -18,12 +18,9 @@ package com.intellij.find.editorHeaderActions; import com.intellij.find.EditorSearchComponent; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.project.DumbAware; -import com.intellij.openapi.util.Getter; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.containers.ContainerUtil; import javax.swing.*; -import javax.swing.text.JTextComponent; import java.awt.event.KeyEvent; import java.util.ArrayList; @@ -35,11 +32,8 @@ import java.util.ArrayList; * To change this template use File | Settings | File Templates. */ public class NextOccurrenceAction extends EditorHeaderAction implements DumbAware { - private final Getter myTextField; - - public NextOccurrenceAction(EditorSearchComponent editorSearchComponent, Getter editorTextField) { + public NextOccurrenceAction(EditorSearchComponent editorSearchComponent, JComponent shortcutHolder) { super(editorSearchComponent); - myTextField = editorTextField; copyFrom(ActionManager.getInstance().getAction(IdeActions.ACTION_NEXT_OCCURENCE)); ArrayList shortcuts = new ArrayList(); ContainerUtil.addAll(shortcuts, ActionManager.getInstance().getAction(IdeActions.ACTION_FIND_NEXT).getShortcutSet().getShortcuts()); @@ -50,16 +44,16 @@ public class NextOccurrenceAction extends EditorHeaderAction implements DumbAwar shortcuts.add(new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), null)); } - registerShortcutsForComponent(shortcuts, editorTextField.get()); + registerShortcutsForComponent(shortcuts, shortcutHolder); } @Override public void actionPerformed(final AnActionEvent e) { - getEditorSearchComponent().searchForward(); + myEditorSearchComponent.searchForward(); } @Override public void update(final AnActionEvent e) { - e.getPresentation().setEnabled(getEditorSearchComponent().hasMatches() && !StringUtil.isEmpty(myTextField.get().getText())); + e.getPresentation().setEnabled(myEditorSearchComponent.hasMatches()); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/PrevOccurrenceAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/PrevOccurrenceAction.java index 586f90a835d1..864221116ae6 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/PrevOccurrenceAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/PrevOccurrenceAction.java @@ -18,11 +18,9 @@ package com.intellij.find.editorHeaderActions; import com.intellij.find.EditorSearchComponent; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.project.DumbAware; -import com.intellij.openapi.util.Getter; import com.intellij.util.containers.ContainerUtil; import javax.swing.*; -import javax.swing.text.JTextComponent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.util.ArrayList; @@ -36,7 +34,7 @@ import java.util.ArrayList; */ public class PrevOccurrenceAction extends EditorHeaderAction implements DumbAware { - public PrevOccurrenceAction(EditorSearchComponent editorSearchComponent, Getter editorTextField) { + public PrevOccurrenceAction(EditorSearchComponent editorSearchComponent, JComponent shortcutHolder) { super(editorSearchComponent); copyFrom(ActionManager.getInstance().getAction(IdeActions.ACTION_PREVIOUS_OCCURENCE)); @@ -49,16 +47,16 @@ public class PrevOccurrenceAction extends EditorHeaderAction implements DumbAwar shortcuts.add(new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.SHIFT_DOWN_MASK), null)); } - registerShortcutsForComponent(shortcuts, editorTextField.get()); + registerShortcutsForComponent(shortcuts, shortcutHolder); } @Override public void actionPerformed(final AnActionEvent e) { - getEditorSearchComponent().searchBackward(); + myEditorSearchComponent.searchBackward(); } @Override public void update(final AnActionEvent e) { - e.getPresentation().setEnabled(getEditorSearchComponent().hasMatches()); + e.getPresentation().setEnabled(myEditorSearchComponent.hasMatches()); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/RemoveOccurrenceAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/RemoveOccurrenceAction.java index 0d7e9e271631..7d4adb04825f 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/RemoveOccurrenceAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/RemoveOccurrenceAction.java @@ -31,18 +31,18 @@ public class RemoveOccurrenceAction extends EditorHeaderAction implements DumbAw copyFrom(ActionManager.getInstance().getAction(IdeActions.ACTION_UNSELECT_PREVIOUS_OCCURENCE)); getTemplatePresentation().setIcon(AllIcons.Actions.RemoveMulticaret); - registerShortcutsForComponent(Arrays.asList(getShortcutSet().getShortcuts()), editorSearchComponent.getSearchField()); + registerShortcutsForComponent(Arrays.asList(getShortcutSet().getShortcuts()), editorSearchComponent.getSearchTextComponent()); } @Override public void actionPerformed(AnActionEvent e) { - getEditorSearchComponent().removeOccurrence(); + myEditorSearchComponent.removeOccurrence(); } @Override public void update(AnActionEvent e) { - boolean isFind = !getEditorSearchComponent().getFindModel().isReplaceState(); - boolean hasMatches = getEditorSearchComponent().hasMatches(); + boolean isFind = !myEditorSearchComponent.getFindModel().isReplaceState(); + boolean hasMatches = myEditorSearchComponent.hasMatches(); e.getPresentation().setVisible(isFind); e.getPresentation().setEnabled(isFind && hasMatches); } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ReplaceOnEnterAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ReplaceOnEnterAction.java index 242d772977cf..79dff47b8a9a 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ReplaceOnEnterAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ReplaceOnEnterAction.java @@ -11,16 +11,16 @@ import java.awt.event.KeyEvent; import java.util.ArrayList; public class ReplaceOnEnterAction extends EditorHeaderAction { - public ReplaceOnEnterAction(EditorSearchComponent editorSearchComponent, JComponent textField) { + public ReplaceOnEnterAction(EditorSearchComponent editorSearchComponent, JComponent shortcutHolder) { super(editorSearchComponent); ArrayList shortcuts = new ArrayList(); shortcuts.add(new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), null)); - registerCustomShortcutSet(new CustomShortcutSet(shortcuts.toArray(new Shortcut[shortcuts.size()])), textField); + registerCustomShortcutSet(new CustomShortcutSet(shortcuts.toArray(new Shortcut[shortcuts.size()])), shortcutHolder); } @Override public void actionPerformed(AnActionEvent e) { - getEditorSearchComponent().replaceCurrent(); + myEditorSearchComponent.replaceCurrent(); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/RestorePreviousSettingsAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/RestorePreviousSettingsAction.java index 2607ebf0557b..3cbb0520d789 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/RestorePreviousSettingsAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/RestorePreviousSettingsAction.java @@ -16,6 +16,8 @@ package com.intellij.find.editorHeaderActions; import com.intellij.find.EditorSearchComponent; +import com.intellij.find.FindManager; +import com.intellij.find.FindModel; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.project.DumbAware; @@ -44,12 +46,18 @@ public class RestorePreviousSettingsAction extends EditorHeaderAction implements @Override public void actionPerformed(final AnActionEvent e) { - getEditorSearchComponent().restoreFindModel(); + final FindModel model = FindManager.getInstance(e.getProject()).getPreviousFindModel(); + if (model != null) { + myEditorSearchComponent.getFindModel().copyFrom(model); + } } @Override public void update(final AnActionEvent e) { - e.getPresentation().setEnabled(myTextField.getText().isEmpty()); + e.getPresentation().setEnabled( + e.getProject() != null + && myTextField.getText().isEmpty() + && FindManager.getInstance(e.getProject()).getPreviousFindModel() != null); } public static String getAd() { diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SecondaryHeaderAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SecondaryHeaderAction.java deleted file mode 100644 index 1d62c790f92f..000000000000 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SecondaryHeaderAction.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.intellij.find.editorHeaderActions; - -/** - * Created by IntelliJ IDEA. - * User: zajac - * Date: 02.04.11 - * Time: 14:43 - * To change this template use File | Settings | File Templates. - */ -public interface SecondaryHeaderAction { -} diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SelectAllAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SelectAllAction.java index 4d71cce80ddc..0648e8222a36 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SelectAllAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SelectAllAction.java @@ -34,19 +34,19 @@ public class SelectAllAction extends EditorHeaderAction implements DumbAware { List shortcuts = new ArrayList(); ContainerUtil.addAll(shortcuts, getShortcutSet().getShortcuts()); ContainerUtil.addAll(shortcuts, CommonShortcuts.ALT_ENTER.getShortcuts()); - registerShortcutsForComponent(shortcuts, editorSearchComponent.getSearchField()); + registerShortcutsForComponent(shortcuts, editorSearchComponent.getSearchTextComponent()); } @Override public void actionPerformed(AnActionEvent e) { - getEditorSearchComponent().selectAllOccurrences(); - getEditorSearchComponent().close(); + myEditorSearchComponent.selectAllOccurrences(); + myEditorSearchComponent.close(); } @Override public void update(AnActionEvent e) { - boolean isFind = !getEditorSearchComponent().getFindModel().isReplaceState(); - boolean hasMatches = getEditorSearchComponent().hasMatches(); + boolean isFind = !myEditorSearchComponent.getFindModel().isReplaceState(); + boolean hasMatches = myEditorSearchComponent.hasMatches(); e.getPresentation().setVisible(isFind); e.getPresentation().setEnabled(isFind && hasMatches); } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ShowHistoryAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ShowHistoryAction.java index 362fa5ebd859..bd27b7ac1163 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ShowHistoryAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ShowHistoryAction.java @@ -4,7 +4,6 @@ import com.intellij.find.EditorSearchComponent; import com.intellij.ide.ui.laf.darcula.ui.DarculaTextFieldUI; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.project.DumbAware; -import com.intellij.openapi.util.Getter; import com.intellij.openapi.util.IconLoader; import com.intellij.util.containers.ContainerUtil; @@ -15,46 +14,36 @@ import java.awt.event.KeyEvent; import java.util.ArrayList; /** -* Created by IntelliJ IDEA. -* User: zajac -* Date: 05.03.11 -* Time: 10:44 -* To change this template use File | Settings | File Templates. -*/ + * User: zajac + */ public class ShowHistoryAction extends EditorHeaderAction implements DumbAware { - private final Getter myTextField; + private final JTextComponent myTextField; - public JTextComponent getTextField() { - return myTextField.get(); - } - - public ShowHistoryAction(final Getter textField, EditorSearchComponent editorSearchComponent) { + public ShowHistoryAction(final JTextComponent textField, EditorSearchComponent editorSearchComponent) { super(editorSearchComponent); myTextField = textField; getTemplatePresentation().setIcon(IconLoader.findIcon("/com/intellij/ide/ui/laf/icons/search.png", DarculaTextFieldUI.class, true)); - final String s = getTextField() == getEditorSearchComponent().getSearchField() ? "Search" : "Replace"; + final String s = myTextField == myEditorSearchComponent.getSearchTextComponent() ? "Search" : "Replace"; getTemplatePresentation().setDescription(s + " history"); getTemplatePresentation().setText(s + " History"); ArrayList shortcuts = new ArrayList(); - if (getTextField() == getEditorSearchComponent().getSearchField()) { + if (myTextField == myEditorSearchComponent.getSearchTextComponent()) { //ContainerUtil.addAll(shortcuts, ActionManager.getInstance().getAction(IdeActions.ACTION_FIND).getShortcutSet().getShortcuts()); ContainerUtil.addAll(shortcuts, ActionManager.getInstance().getAction("IncrementalSearch").getShortcutSet().getShortcuts()); } shortcuts.add(new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_DOWN_MASK), null)); - registerCustomShortcutSet(new CustomShortcutSet(shortcuts.toArray(new Shortcut[shortcuts.size()])), getTextField()); + registerCustomShortcutSet(new CustomShortcutSet(shortcuts.toArray(new Shortcut[shortcuts.size()])), myTextField); } @Override public void update(AnActionEvent e) { - e.getPresentation().setVisible(getEditorSearchComponent().getFindModel().isMultiline()); + e.getPresentation().setVisible(myEditorSearchComponent.getFindModel().isMultiline()); } @Override public void actionPerformed(final AnActionEvent e) { - getEditorSearchComponent().showHistory(false, getTextField()); + myEditorSearchComponent.showHistory(false, myTextField); } - - } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ShowMoreOptions.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ShowMoreOptions.java index 850f2ed561dc..a4ef20d88ea5 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ShowMoreOptions.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ShowMoreOptions.java @@ -6,7 +6,6 @@ import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl; import com.intellij.openapi.project.DumbAware; import javax.swing.*; -import javax.swing.text.JTextComponent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; @@ -18,17 +17,17 @@ import java.awt.event.KeyEvent; * To change this template use File | Settings | File Templates. */ public class ShowMoreOptions extends AnAction implements DumbAware { - private final JComponent myToolbarComponent; + private final ActionToolbarImpl myToolbarComponent; public static final Shortcut SHORT_CUT = new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, InputEvent.ALT_DOWN_MASK), null); - public ShowMoreOptions(JComponent toolbarComponent, JTextComponent searchField) { + public ShowMoreOptions(ActionToolbarImpl toolbarComponent, JComponent shortcutHolder) { this.myToolbarComponent = toolbarComponent; - registerCustomShortcutSet(new CustomShortcutSet(SHORT_CUT), searchField); + registerCustomShortcutSet(new CustomShortcutSet(SHORT_CUT), shortcutHolder); } @Override public void actionPerformed(AnActionEvent e) { - final ActionButton secondaryActions = ((ActionToolbarImpl)myToolbarComponent).getSecondaryActionsButton(); + final ActionButton secondaryActions = myToolbarComponent.getSecondaryActionsButton(); if (secondaryActions != null) { secondaryActions.click(); } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToFind.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToFind.java index 7e4b555d264c..74db01097118 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToFind.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToFind.java @@ -37,9 +37,8 @@ public class SwitchToFind extends EditorHeaderAction implements DumbAware { return; } - EditorSearchComponent component = getEditorSearchComponent(); - final FindModel findModel = component.getFindModel(); + final FindModel findModel = myEditorSearchComponent.getFindModel(); FindUtil.configureFindModel(false, null, findModel, false); - component.selectAllText(); + myEditorSearchComponent.getSearchTextComponent().selectAll(); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToReplace.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToReplace.java index 2d8b48aad855..bb472c18e03c 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToReplace.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToReplace.java @@ -17,8 +17,11 @@ import com.intellij.openapi.editor.Editor; * To change this template use File | Settings | File Templates. */ public class SwitchToReplace extends EditorHeaderAction { - public SwitchToReplace(EditorSearchComponent editorSearchComponent) { + private final Editor myEditor; + + public SwitchToReplace(EditorSearchComponent editorSearchComponent, Editor editor) { super(editorSearchComponent); + myEditor = editor; AnAction replaceAction = ActionManager.getInstance().getAction("Replace"); if (replaceAction != null) { registerCustomShortcutSet(replaceAction.getShortcutSet(), editorSearchComponent); @@ -27,15 +30,13 @@ public class SwitchToReplace extends EditorHeaderAction { @Override public void update(AnActionEvent e) { - final Editor editor = getEditorSearchComponent().getEditor(); - e.getPresentation().setEnabled(!ConsoleViewUtil.isConsoleViewEditor(editor)); + e.getPresentation().setEnabled(!ConsoleViewUtil.isConsoleViewEditor(myEditor)); } @Override public void actionPerformed(AnActionEvent e) { - EditorSearchComponent component = getEditorSearchComponent(); - final FindModel findModel = component.getFindModel(); + final FindModel findModel = myEditorSearchComponent.getFindModel(); FindUtil.configureFindModel(true, null, findModel, false); - component.selectAllText(); + myEditorSearchComponent.getSearchTextComponent().selectAll(); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleExceptCommentsAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleExceptCommentsAction.java index ae60f31a70b7..8c4e329bc977 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleExceptCommentsAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleExceptCommentsAction.java @@ -19,7 +19,7 @@ import com.intellij.find.EditorSearchComponent; import com.intellij.find.FindModel; import com.intellij.openapi.actionSystem.AnActionEvent; -public class ToggleExceptCommentsAction extends EditorHeaderToggleAction implements SecondaryHeaderAction { +public class ToggleExceptCommentsAction extends EditorHeaderToggleAction { private static final String TEXT = "Except C&omments"; public ToggleExceptCommentsAction(EditorSearchComponent editorSearchComponent) { @@ -28,11 +28,11 @@ public class ToggleExceptCommentsAction extends EditorHeaderToggleAction impleme @Override public boolean isSelected(AnActionEvent e) { - return getEditorSearchComponent().getFindModel().isExceptComments(); + return myEditorSearchComponent.getFindModel().isExceptComments(); } @Override public void setSelected(AnActionEvent e, boolean state) { - getEditorSearchComponent().getFindModel().setSearchContext(state ? FindModel.SearchContext.EXCEPT_COMMENTS : FindModel.SearchContext.ANY); + myEditorSearchComponent.getFindModel().setSearchContext(state ? FindModel.SearchContext.EXCEPT_COMMENTS : FindModel.SearchContext.ANY); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleExceptCommentsAndLiteralsAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleExceptCommentsAndLiteralsAction.java index d3ff1015e610..280bea317854 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleExceptCommentsAndLiteralsAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleExceptCommentsAndLiteralsAction.java @@ -19,7 +19,7 @@ import com.intellij.find.EditorSearchComponent; import com.intellij.find.FindModel; import com.intellij.openapi.actionSystem.AnActionEvent; -public class ToggleExceptCommentsAndLiteralsAction extends EditorHeaderToggleAction implements SecondaryHeaderAction { +public class ToggleExceptCommentsAndLiteralsAction extends EditorHeaderToggleAction { private static final String TEXT = "Except Comments and Li&terals"; public ToggleExceptCommentsAndLiteralsAction(EditorSearchComponent editorSearchComponent) { @@ -28,11 +28,11 @@ public class ToggleExceptCommentsAndLiteralsAction extends EditorHeaderToggleAct @Override public boolean isSelected(AnActionEvent e) { - return getEditorSearchComponent().getFindModel().isExceptCommentsAndStringLiterals(); + return myEditorSearchComponent.getFindModel().isExceptCommentsAndStringLiterals(); } @Override public void setSelected(AnActionEvent e, boolean state) { - getEditorSearchComponent().getFindModel().setSearchContext(state ? FindModel.SearchContext.EXCEPT_COMMENTS_AND_STRING_LITERALS : FindModel.SearchContext.ANY); + myEditorSearchComponent.getFindModel().setSearchContext(state ? FindModel.SearchContext.EXCEPT_COMMENTS_AND_STRING_LITERALS : FindModel.SearchContext.ANY); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleExceptLiteralsAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleExceptLiteralsAction.java index 4b7f09c2b211..3ffcdd9a7c0c 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleExceptLiteralsAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleExceptLiteralsAction.java @@ -19,7 +19,7 @@ import com.intellij.find.EditorSearchComponent; import com.intellij.find.FindModel; import com.intellij.openapi.actionSystem.AnActionEvent; -public class ToggleExceptLiteralsAction extends EditorHeaderToggleAction implements SecondaryHeaderAction { +public class ToggleExceptLiteralsAction extends EditorHeaderToggleAction { private static final String TEXT = "Except L&iterals"; public ToggleExceptLiteralsAction(EditorSearchComponent editorSearchComponent) { @@ -28,11 +28,11 @@ public class ToggleExceptLiteralsAction extends EditorHeaderToggleAction impleme @Override public boolean isSelected(AnActionEvent e) { - return getEditorSearchComponent().getFindModel().isExceptStringLiterals(); + return myEditorSearchComponent.getFindModel().isExceptStringLiterals(); } @Override public void setSelected(AnActionEvent e, boolean state) { - getEditorSearchComponent().getFindModel().setSearchContext(state ? FindModel.SearchContext.EXCEPT_STRING_LITERALS : FindModel.SearchContext.ANY); + myEditorSearchComponent.getFindModel().setSearchContext(state ? FindModel.SearchContext.EXCEPT_STRING_LITERALS : FindModel.SearchContext.ANY); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleInCommentsAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleInCommentsAction.java index 4d9d5ad44cac..50bfd390daa1 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleInCommentsAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleInCommentsAction.java @@ -4,7 +4,7 @@ import com.intellij.find.EditorSearchComponent; import com.intellij.find.FindModel; import com.intellij.openapi.actionSystem.AnActionEvent; -public class ToggleInCommentsAction extends EditorHeaderToggleAction implements SecondaryHeaderAction { +public class ToggleInCommentsAction extends EditorHeaderToggleAction { private static final String TEXT = "In &Comments Only"; public ToggleInCommentsAction(EditorSearchComponent editorSearchComponent) { @@ -13,11 +13,11 @@ public class ToggleInCommentsAction extends EditorHeaderToggleAction implements @Override public boolean isSelected(AnActionEvent e) { - return getEditorSearchComponent().getFindModel().isInCommentsOnly(); + return myEditorSearchComponent.getFindModel().isInCommentsOnly(); } @Override public void setSelected(AnActionEvent e, boolean state) { - getEditorSearchComponent().getFindModel().setSearchContext(state ? FindModel.SearchContext.IN_COMMENTS : FindModel.SearchContext.ANY); + myEditorSearchComponent.getFindModel().setSearchContext(state ? FindModel.SearchContext.IN_COMMENTS : FindModel.SearchContext.ANY); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleInLiteralsOnlyAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleInLiteralsOnlyAction.java index d8fc5d530095..2bfd30b2121e 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleInLiteralsOnlyAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleInLiteralsOnlyAction.java @@ -4,7 +4,7 @@ import com.intellij.find.EditorSearchComponent; import com.intellij.find.FindModel; import com.intellij.openapi.actionSystem.AnActionEvent; -public class ToggleInLiteralsOnlyAction extends EditorHeaderToggleAction implements SecondaryHeaderAction { +public class ToggleInLiteralsOnlyAction extends EditorHeaderToggleAction { private static final String TEXT = "In &Literals Only"; public ToggleInLiteralsOnlyAction(EditorSearchComponent editorSearchComponent) { @@ -13,11 +13,11 @@ public class ToggleInLiteralsOnlyAction extends EditorHeaderToggleAction implem @Override public boolean isSelected(AnActionEvent e) { - return getEditorSearchComponent().getFindModel().isInStringLiteralsOnly(); + return myEditorSearchComponent.getFindModel().isInStringLiteralsOnly(); } @Override public void setSelected(AnActionEvent e, boolean state) { - getEditorSearchComponent().getFindModel().setSearchContext(state ? FindModel.SearchContext.IN_STRING_LITERALS : FindModel.SearchContext.ANY); + myEditorSearchComponent.getFindModel().setSearchContext(state ? FindModel.SearchContext.IN_STRING_LITERALS : FindModel.SearchContext.ANY); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleMatchCase.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleMatchCase.java index 4d49aa213e5e..1c9d615f5130 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleMatchCase.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleMatchCase.java @@ -28,12 +28,12 @@ public class ToggleMatchCase extends EditorHeaderToggleAction { @Override public boolean isSelected(AnActionEvent e) { - return getEditorSearchComponent().getFindModel().isCaseSensitive(); + return myEditorSearchComponent.getFindModel().isCaseSensitive(); } @Override public void setSelected(AnActionEvent e, boolean state) { - getEditorSearchComponent().getFindModel().setCaseSensitive(state); + myEditorSearchComponent.getFindModel().setCaseSensitive(state); FindSettings.getInstance().setLocalCaseSensitive(state); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/TogglePreserveCaseAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/TogglePreserveCaseAction.java index 93c761c2b6f7..28b47941f08e 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/TogglePreserveCaseAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/TogglePreserveCaseAction.java @@ -19,7 +19,7 @@ import com.intellij.find.EditorSearchComponent; import com.intellij.find.FindModel; import com.intellij.openapi.actionSystem.AnActionEvent; -public class TogglePreserveCaseAction extends EditorHeaderToggleAction implements SecondaryHeaderAction { +public class TogglePreserveCaseAction extends EditorHeaderToggleAction { private static final String TEXT = "Pr&eserve Case"; public TogglePreserveCaseAction(EditorSearchComponent editorSearchComponent) { @@ -28,19 +28,18 @@ public class TogglePreserveCaseAction extends EditorHeaderToggleAction implemen @Override public boolean isSelected(AnActionEvent e) { - return getEditorSearchComponent().getFindModel().isPreserveCase(); + return myEditorSearchComponent.getFindModel().isPreserveCase(); } @Override public void update(AnActionEvent e) { super.update(e); - FindModel findModel = getEditorSearchComponent().getFindModel(); - e.getPresentation().setVisible(findModel.isReplaceState() && !findModel.isMultiline()); + FindModel findModel = myEditorSearchComponent.getFindModel(); e.getPresentation().setEnabled(!findModel.isRegularExpressions()); } @Override public void setSelected(AnActionEvent e, boolean state) { - getEditorSearchComponent().getFindModel().setPreserveCase(state); + myEditorSearchComponent.getFindModel().setPreserveCase(state); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleRegex.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleRegex.java index 472517ab336d..fa8c8003a16e 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleRegex.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleRegex.java @@ -26,12 +26,12 @@ public class ToggleRegex extends EditorHeaderToggleAction { @Override public boolean isSelected(AnActionEvent e) { - return getEditorSearchComponent().getFindModel().isRegularExpressions(); + return myEditorSearchComponent.getFindModel().isRegularExpressions(); } @Override public void setSelected(AnActionEvent e, boolean state) { - final FindModel findModel = getEditorSearchComponent().getFindModel(); + final FindModel findModel = myEditorSearchComponent.getFindModel(); findModel.setRegularExpressions(state); if (state) { findModel.setWholeWordsOnly(false); diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleSelectionOnlyAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleSelectionOnlyAction.java index 2a8c6ee8add7..2b92daa25115 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleSelectionOnlyAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleSelectionOnlyAction.java @@ -12,19 +12,19 @@ public class ToggleSelectionOnlyAction extends EditorHeaderToggleAction { @Override public boolean isSelected(AnActionEvent e) { - return !getEditorSearchComponent().getFindModel().isGlobal(); + return !myEditorSearchComponent.getFindModel().isGlobal(); } @Override public void update(AnActionEvent e) { super.update(e); - final boolean replaceState = getEditorSearchComponent().getFindModel().isReplaceState(); + final boolean replaceState = myEditorSearchComponent.getFindModel().isReplaceState(); e.getPresentation().setVisible(replaceState); e.getPresentation().setEnabled(replaceState); } @Override public void setSelected(AnActionEvent e, boolean state) { - getEditorSearchComponent().getFindModel().setGlobal(!state); + myEditorSearchComponent.getFindModel().setGlobal(!state); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleWholeWordsOnlyAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleWholeWordsOnlyAction.java index 0c3a26ac0da0..e3a25c8332a7 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleWholeWordsOnlyAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleWholeWordsOnlyAction.java @@ -13,19 +13,19 @@ public class ToggleWholeWordsOnlyAction extends EditorHeaderToggleAction { @Override public boolean isSelected(AnActionEvent e) { - return getEditorSearchComponent().getFindModel().isWholeWordsOnly(); + return myEditorSearchComponent.getFindModel().isWholeWordsOnly(); } @Override public void update(AnActionEvent e) { super.update(e); - e.getPresentation().setEnabled(!getEditorSearchComponent().getFindModel().isRegularExpressions()); - e.getPresentation().setVisible(!getEditorSearchComponent().getFindModel().isMultiline()); + e.getPresentation().setEnabled(!myEditorSearchComponent.getFindModel().isRegularExpressions()); + e.getPresentation().setVisible(!myEditorSearchComponent.getFindModel().isMultiline()); } @Override public void setSelected(AnActionEvent e, boolean state) { FindSettings.getInstance().setLocalWholeWordsOnly(state); - getEditorSearchComponent().getFindModel().setWholeWordsOnly(state); + myEditorSearchComponent.getFindModel().setWholeWordsOnly(state); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/Utils.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/Utils.java index 03c5c8592feb..cb03f56d512f 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/Utils.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/Utils.java @@ -4,6 +4,7 @@ import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.PopupChooserBuilder; import com.intellij.openapi.util.SystemInfo; +import com.intellij.util.ui.JBUI; import javax.swing.*; import javax.swing.text.JTextComponent; @@ -50,16 +51,10 @@ public class Utils { public static void setSmallerFont(final JComponent component) { if (SystemInfo.isMac) { - Font f = new JLabel(" ").getFont(); - Font font = smaller(f); - component.setFont(font); + component.setFont(JBUI.Fonts.smallFont()); } } - static Font smaller(Font f) { - return f.deriveFont(f.getStyle(), f.getSize() - 2); - } - public static void setSmallerFontForChildren(JComponent component) { for (Component c : component.getComponents()) { if (c instanceof JComponent) { diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/VariantsCompletionAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/VariantsCompletionAction.java index 56ef585040e9..0d57e3e98039 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/VariantsCompletionAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/VariantsCompletionAction.java @@ -16,14 +16,9 @@ package com.intellij.find.editorHeaderActions; import com.intellij.featureStatistics.FeatureUsageTracker; -import com.intellij.find.EditorSearchComponent; -import com.intellij.openapi.actionSystem.ActionManager; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.IdeActions; +import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.colors.EditorFontType; -import com.intellij.openapi.util.Getter; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.codeStyle.NameUtil; import com.intellij.psi.impl.cache.impl.id.IdTableBuilding; @@ -44,29 +39,23 @@ import java.util.HashSet; import java.util.Set; public class VariantsCompletionAction extends AnAction { - private Getter myTextField; - private final EditorSearchComponent myEditorSearchComponent; + private final JTextComponent myTextField; - public EditorSearchComponent getEditorSearchComponent() { - return myEditorSearchComponent; - } - - public VariantsCompletionAction(EditorSearchComponent editorSearchComponent, Getter textField) { - myEditorSearchComponent = editorSearchComponent; + public VariantsCompletionAction(JTextComponent textField) { + myTextField = textField; final AnAction action = ActionManager.getInstance().getAction(IdeActions.ACTION_CODE_COMPLETION); - setTextField(textField); if (action != null) { - registerCustomShortcutSet(action.getShortcutSet(), getTextField()); + registerCustomShortcutSet(action.getShortcutSet(), myTextField); } } @Override public void actionPerformed(final AnActionEvent e) { - final String prefix = getPrefix(); + final Editor editor = e.getData(CommonDataKeys.EDITOR_EVEN_IF_INACTIVE); + if (editor == null) return; + final String prefix = myTextField.getText().substring(0, myTextField.getCaretPosition()); if (StringUtil.isEmpty(prefix)) return; - Editor editor = getEditorSearchComponent().getEditor(); - if (editor != null) { final String[] array = calcWords(prefix, editor); if (array.length == 0) { return; @@ -84,28 +73,8 @@ public class VariantsCompletionAction extends AnAction { list.setFont(editor.getColorsScheme().getFont(EditorFontType.PLAIN)); Utils.showCompletionPopup( - e.getInputEvent() instanceof MouseEvent ? getEditorSearchComponent().getToolbarComponent() : null, - list, null, getTextField(), null); - } - } - - @Nullable - private String getPrefix() { - //Editor editor = myTextField.getEditor(); - //if (editor != null){ - // int offset = editor.getCaretModel().getOffset(); - // return myTextField.getText().substring(0, offset); - //} - int offset = getTextField().getCaretPosition(); - return getTextField().getText().substring(0, offset); - } - - public JTextComponent getTextField() { - return myTextField.get(); - } - - public void setTextField(Getter textField) { - myTextField = textField; + e.getInputEvent() instanceof MouseEvent ? myTextField: null, + list, null, myTextField, null); } private static String[] calcWords(final String prefix, Editor editor) { diff --git a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewController.java b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewController.java index 1db570957a09..f6144b87d459 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewController.java +++ b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewController.java @@ -243,7 +243,7 @@ public class LivePreviewController implements LivePreview.Delegate, FindUtil.Rep mySuppressUpdate = false; } if (myComponent != null) { - myComponent.addTextToRecent(myComponent.getReplaceField()); + myComponent.addTextToRecent(myComponent.getReplaceTextComponent()); myComponent.clearUndoInTextFields(); } } diff --git a/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/DefaultCustomComponentAction.java b/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/DefaultCustomComponentAction.java new file mode 100644 index 000000000000..48fb115caf6d --- /dev/null +++ b/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/DefaultCustomComponentAction.java @@ -0,0 +1,41 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.actionSystem.ex; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.Presentation; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +public class DefaultCustomComponentAction extends AnAction implements CustomComponentAction { + @NotNull private final JComponent myComponent; + + public DefaultCustomComponentAction(@NotNull final JComponent component) { + myComponent = component; + } + + @Override + public void actionPerformed(AnActionEvent e) { + //do nothing + } + + @Override + public JComponent createCustomComponent(Presentation presentation) { + return myComponent; + } +} diff --git a/platform/platform-api/src/com/intellij/ui/components/panels/Wrapper.java b/platform/platform-api/src/com/intellij/ui/components/panels/Wrapper.java index 24eda5427196..1a47b122b875 100644 --- a/platform/platform-api/src/com/intellij/ui/components/panels/Wrapper.java +++ b/platform/platform-api/src/com/intellij/ui/components/panels/Wrapper.java @@ -25,6 +25,9 @@ import java.awt.event.FocusListener; public class Wrapper extends JPanel implements NullableComponent { + private JComponent myVerticalSizeReferent; + private JComponent myHorizontalSizeReferent; + public Wrapper() { setLayout(new BorderLayout()); setOpaque(false); @@ -112,6 +115,27 @@ public class Wrapper extends JPanel implements NullableComponent { } } + public final Wrapper setVerticalSizeReferent(JComponent verticalSizeReferent) { + myVerticalSizeReferent = verticalSizeReferent; + return this; + } + + public final Wrapper setHorizontalSizeReferent(JComponent horizontalSizeReferent) { + myHorizontalSizeReferent = horizontalSizeReferent; + return this; + } + + @Override + public Dimension getPreferredSize() { + Dimension size = super.getPreferredSize(); + if (myHorizontalSizeReferent != null && myHorizontalSizeReferent.isShowing()) { + size.width = Math.max(size.width, myHorizontalSizeReferent.getPreferredSize().width); + } + if (myVerticalSizeReferent != null && myVerticalSizeReferent.isShowing()) { + size.height = Math.max(size.height, myVerticalSizeReferent.getPreferredSize().height); + } + return size; + } public static class FocusHolder extends Wrapper implements FocusListener { @@ -177,6 +201,7 @@ public class Wrapper extends JPanel implements NullableComponent { @Override public void focusLost(final FocusEvent e) { } + } public static class North extends Wrapper { diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java index 3530bf193ca8..b06001955f58 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java @@ -115,6 +115,8 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { private Rectangle myAutoPopupRec; private final DefaultActionGroup mySecondaryActions = new DefaultActionGroup(); + private PopupStateModifier mySecondaryButtonPopupStateModifier = null; + private boolean myForceMinimumSize = false; private boolean myMinimalMode; private boolean myForceUseMacEnhancements; @@ -264,6 +266,10 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { } } + public void setSecondaryButtonPopupStateModifier(PopupStateModifier popupStateModifier) { + mySecondaryButtonPopupStateModifier = popupStateModifier; + } + private void fillToolBar(final List actions, boolean layoutSecondaries) { final List rightAligned = new ArrayList(); if (myAddSeparatorFirst) { @@ -304,7 +310,15 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { } if (mySecondaryActions.getChildrenCount() > 0) { - mySecondaryActionsButton = new ActionButton(mySecondaryActions, myPresentationFactory.getPresentation(mySecondaryActions), myPlace, getMinimumButtonSize()); + mySecondaryActionsButton = new ActionButton(mySecondaryActions, myPresentationFactory.getPresentation(mySecondaryActions), myPlace, getMinimumButtonSize()) { + @Override + @ButtonState + public int getPopState() { + return mySecondaryButtonPopupStateModifier != null && mySecondaryButtonPopupStateModifier.willModify() + ? mySecondaryButtonPopupStateModifier.getModifiedPopupState() + : super.getPopState(); + } + }; mySecondaryActionsButton.setNoIconsInPopup(true); add(mySecondaryActionsButton); } @@ -788,9 +802,15 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { return dimension; } + public void setForceMinimumSize(boolean force) { + myForceMinimumSize = force; + } @Override public Dimension getMinimumSize() { + if (myForceMinimumSize) { + return getPreferredSize(); + } if (myLayoutPolicy == AUTO_LAYOUT_POLICY) { final Insets i = getInsets(); return new Dimension(AllIcons.Ide.Link.getIconWidth() + i.left + i.right, myMinimumButtonSize.height + i.top + i.bottom); @@ -1323,4 +1343,10 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { public Presentation getPresentation(AnAction action) { return myPresentationFactory.getPresentation(action); } + + public interface PopupStateModifier { + @ActionButtonComponent.ButtonState + int getModifiedPopupState(); + boolean willModify(); + } }