blob: ee76d0ee4cc284190270dffa3a68c8c9c63c57b2 [file] [log] [blame]
/*
* Copyright 2000-2014 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.findUsages;
import com.intellij.find.FindBundle;
import com.intellij.find.FindSettings;
import com.intellij.ide.util.scopeChooser.ScopeChooserCombo;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.Disposer;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.SeparatorFactory;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.StateRestoringCheckBox;
import com.intellij.usageView.UsageViewManager;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @author peter
*/
public abstract class AbstractFindUsagesDialog extends DialogWrapper {
private final Project myProject;
protected final FindUsagesOptions myFindUsagesOptions;
private final boolean myToShowInNewTab;
private final boolean myIsShowInNewTabEnabled;
private final boolean myIsShowInNewTabVisible;
private final boolean mySearchForTextOccurrencesAvailable;
private final boolean mySearchInLibrariesAvailable;
private JCheckBox myCbToOpenInNewTab;
protected StateRestoringCheckBox myCbToSearchForTextOccurrences;
protected JCheckBox myCbToSkipResultsWhenOneUsage;
private final ActionListener myUpdateAction;
private ScopeChooserCombo myScopeCombo;
protected AbstractFindUsagesDialog(@NotNull Project project,
@NotNull FindUsagesOptions findUsagesOptions,
boolean toShowInNewTab,
boolean mustOpenInNewTab,
boolean isSingleFile,
boolean searchForTextOccurrencesAvailable,
boolean searchInLibrariesAvailable) {
super(project, true);
myProject = project;
myFindUsagesOptions = findUsagesOptions;
myToShowInNewTab = toShowInNewTab;
myIsShowInNewTabEnabled = !mustOpenInNewTab && UsageViewManager.getInstance(myProject).getReusableContentsCount() > 0;
myIsShowInNewTabVisible = !isSingleFile;
mySearchForTextOccurrencesAvailable = searchForTextOccurrencesAvailable;
mySearchInLibrariesAvailable = searchInLibrariesAvailable;
myUpdateAction = new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
update();
}
};
setButtonsMargin(null);
setOKButtonText(FindBundle.message("find.dialog.find.button"));
setTitle(isSingleFile ? FindBundle.message("find.usages.in.file.dialog.title") : FindBundle.message("find.usages.dialog.title"));
}
@NotNull
@Override
protected Action[] createActions() {
return new Action[]{getOKAction(), getCancelAction(), getHelpAction()};
}
protected boolean isInFileOnly() {
return !myIsShowInNewTabVisible;
}
@Override
protected JComponent createNorthPanel() {
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbConstraints = new GridBagConstraints();
gbConstraints.insets = new Insets(0, 0, UIUtil.DEFAULT_VGAP, 0);
gbConstraints.fill = GridBagConstraints.NONE;
gbConstraints.weightx = 1;
gbConstraints.weighty = 1;
gbConstraints.anchor = GridBagConstraints.WEST;
final SimpleColoredComponent coloredComponent = new SimpleColoredComponent();
coloredComponent.setIpad(new Insets(0,0,0,0));
coloredComponent.setMyBorder(null);
configureLabelComponent(coloredComponent);
panel.add(coloredComponent, gbConstraints);
return panel;
}
public abstract void configureLabelComponent(@NotNull SimpleColoredComponent coloredComponent);
@Override
protected JComponent createCenterPanel() {
JPanel panel = new JPanel(new GridBagLayout());
JPanel _panel = new JPanel(new BorderLayout());
panel.add(_panel, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
new Insets(0, 0, 0, 0), 0, 0));
if (myIsShowInNewTabVisible) {
myCbToOpenInNewTab = new JCheckBox(FindBundle.message("find.open.in.new.tab.checkbox"));
myCbToOpenInNewTab.setSelected(myToShowInNewTab);
myCbToOpenInNewTab.setEnabled(myIsShowInNewTabEnabled);
_panel.add(myCbToOpenInNewTab, BorderLayout.EAST);
}
JPanel allOptionsPanel = createAllOptionsPanel();
if (allOptionsPanel != null) {
panel.add(allOptionsPanel, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
}
return panel;
}
@NotNull
public final FindUsagesOptions calcFindUsagesOptions() {
calcFindUsagesOptions(myFindUsagesOptions);
return myFindUsagesOptions;
}
@Override
protected void init() {
super.init();
update();
}
public void calcFindUsagesOptions(FindUsagesOptions options) {
options.searchScope = myScopeCombo == null ? GlobalSearchScope.allScope(myProject) : myScopeCombo.getSelectedScope();
options.isSearchForTextOccurrences = isToChange(myCbToSearchForTextOccurrences) && isSelected(myCbToSearchForTextOccurrences);
}
protected void update() {
}
public boolean isShowInSeparateWindow() {
return myCbToOpenInNewTab != null && myCbToOpenInNewTab.isSelected();
}
public boolean isSkipResultsWhenOneUsage() {
return myCbToSkipResultsWhenOneUsage != null && myCbToSkipResultsWhenOneUsage.isSelected();
}
@Override
protected void doOKAction() {
if (!shouldDoOkAction()) return;
FindSettings settings = FindSettings.getInstance();
if (myScopeCombo != null) {
settings.setDefaultScopeName(myScopeCombo.getSelectedScopeName());
}
if (mySearchForTextOccurrencesAvailable && myCbToSearchForTextOccurrences != null && myCbToSearchForTextOccurrences.isEnabled()) {
myFindUsagesOptions.isSearchForTextOccurrences = myCbToSearchForTextOccurrences.isSelected();
}
if (myCbToSkipResultsWhenOneUsage != null) {
settings.setSkipResultsWithOneUsage(isSkipResultsWhenOneUsage());
}
super.doOKAction();
}
protected boolean shouldDoOkAction() {
return myScopeCombo == null || myScopeCombo.getSelectedScope() != null;
}
protected static boolean isToChange(JCheckBox cb) {
return cb != null && cb.getParent() != null;
}
protected static boolean isSelected(JCheckBox cb) {
return cb != null && cb.getParent() != null && cb.isSelected();
}
protected StateRestoringCheckBox addCheckboxToPanel(String name, boolean toSelect, JPanel panel, boolean toUpdate) {
StateRestoringCheckBox cb = new StateRestoringCheckBox(name);
cb.setSelected(toSelect);
panel.add(cb);
if (toUpdate) {
cb.addActionListener(myUpdateAction);
}
return cb;
}
protected JPanel createAllOptionsPanel() {
JPanel allOptionsPanel = new JPanel();
JPanel findWhatPanel = createFindWhatPanel();
JPanel usagesOptionsPanel = createUsagesOptionsPanel();
int grids = 0;
if (findWhatPanel != null) {
grids++;
}
if (usagesOptionsPanel != null) {
grids++;
}
if (grids != 0) {
allOptionsPanel.setLayout(new GridLayout(1, grids, 8, 0));
if (findWhatPanel != null) {
allOptionsPanel.add(findWhatPanel);
}
if (usagesOptionsPanel != null) {
allOptionsPanel.add(usagesOptionsPanel);
}
}
JComponent scopePanel = createSearchScopePanel();
if (scopePanel != null) {
JPanel panel = new JPanel(new BorderLayout());
panel.add(allOptionsPanel, BorderLayout.NORTH);
panel.add(scopePanel, BorderLayout.SOUTH);
return panel;
}
return allOptionsPanel;
}
@Nullable
protected abstract JPanel createFindWhatPanel();
protected void addUsagesOptions(JPanel optionsPanel) {
if (mySearchForTextOccurrencesAvailable) {
myCbToSearchForTextOccurrences = addCheckboxToPanel(FindBundle.message("find.options.search.for.text.occurences.checkbox"),
myFindUsagesOptions.isSearchForTextOccurrences, optionsPanel, false);
}
if (myIsShowInNewTabVisible) {
myCbToSkipResultsWhenOneUsage = addCheckboxToPanel(FindBundle.message("find.options.skip.results.tab.with.one.usage.checkbox"),
FindSettings.getInstance().isSkipResultsWithOneUsage(), optionsPanel, false);
}
}
@Nullable
protected JPanel createUsagesOptionsPanel() {
JPanel optionsPanel = new JPanel();
optionsPanel.setBorder(IdeBorderFactory.createTitledBorder(FindBundle.message("find.options.group"), true));
optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.Y_AXIS));
addUsagesOptions(optionsPanel);
return optionsPanel.getComponents().length == 0 ? null : optionsPanel;
}
@Nullable
private JComponent createSearchScopePanel() {
if (isInFileOnly()) return null;
JPanel optionsPanel = new JPanel(new BorderLayout());
String scope = myFindUsagesOptions.searchScope.getDisplayName();
myScopeCombo = new ScopeChooserCombo(myProject, mySearchInLibrariesAvailable, true, scope);
Disposer.register(myDisposable, myScopeCombo);
optionsPanel.add(myScopeCombo, BorderLayout.CENTER);
JComponent separator = SeparatorFactory.createSeparator(FindBundle.message("find.scope.label"), myScopeCombo.getComboBox());
optionsPanel.add(separator, BorderLayout.NORTH);
return optionsPanel;
}
@Nullable
protected JComponent getPreferredFocusedControl() {
return null;
}
@Override
public JComponent getPreferredFocusedComponent() {
if (myScopeCombo != null) {
return myScopeCombo.getComboBox();
}
return getPreferredFocusedControl();
}
}