diff --git a/java/java-impl/src/com/intellij/codeInspection/sameParameterValue/SameParameterValueInspection.java b/java/java-impl/src/com/intellij/codeInspection/sameParameterValue/SameParameterValueInspection.java index ed9b38668a05..0643e66efe0a 100644 --- a/java/java-impl/src/com/intellij/codeInspection/sameParameterValue/SameParameterValueInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/sameParameterValue/SameParameterValueInspection.java @@ -18,9 +18,11 @@ package com.intellij.codeInspection.sameParameterValue; import com.intellij.codeInspection.InspectionsBundle; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.codeInspection.unusedSymbol.VisibilityModifierChooser; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.LabeledComponent; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; @@ -35,8 +37,12 @@ import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.InlineUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.MultiMap; +import com.intellij.util.ui.JBUI; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import javax.swing.*; +import java.awt.*; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -45,7 +51,22 @@ import java.util.List; * @author max */ public class SameParameterValueInspection extends SameParameterValueInspectionBase { - private static final Logger LOG = Logger.getInstance("#" + SameParameterValueInspectionBase.class.getName()); + private static final Logger LOG = Logger.getInstance(SameParameterValueInspectionBase.class); + + @Nullable + @Override + public JComponent createOptionsPanel() { + LabeledComponent component = LabeledComponent.create(new VisibilityModifierChooser(() -> true, + highestModifier, + (newModifier) -> highestModifier = newModifier), + "Methods to report:", + BorderLayout.WEST); + + JPanel panel = new JPanel(new GridBagLayout()); + panel.add(component, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NORTHEAST, JBUI.emptyInsets(), 0, 0)); + return panel; + } + protected LocalQuickFix createFix(String paramName, String value) { return new InlineParameterValueFix(paramName, value); diff --git a/java/java-impl/src/com/intellij/codeInspection/unusedSymbol/UnusedSymbolLocalInspection.java b/java/java-impl/src/com/intellij/codeInspection/unusedSymbol/UnusedSymbolLocalInspection.java index 83385f4687cb..f4d2557abaff 100644 --- a/java/java-impl/src/com/intellij/codeInspection/unusedSymbol/UnusedSymbolLocalInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/unusedSymbol/UnusedSymbolLocalInspection.java @@ -16,37 +16,13 @@ package com.intellij.codeInspection.unusedSymbol; -import com.intellij.icons.AllIcons; -import com.intellij.openapi.ui.popup.JBPopup; -import com.intellij.openapi.ui.popup.JBPopupAdapter; -import com.intellij.openapi.ui.popup.JBPopupFactory; -import com.intellij.openapi.ui.popup.LightweightWindowEvent; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiModifier; -import com.intellij.ui.ClickListener; -import com.intellij.ui.UI; -import com.intellij.ui.UserActivityProviderComponent; -import com.intellij.ui.awt.RelativePoint; -import com.intellij.util.ArrayUtil; -import com.intellij.util.Consumer; -import com.intellij.util.Producer; -import com.intellij.util.VisibilityUtil; -import com.intellij.util.containers.HashSet; -import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; -import java.util.Hashtable; -import java.util.Set; -import java.util.function.Supplier; /** * User: anna @@ -107,13 +83,7 @@ public class UnusedSymbolLocalInspection extends UnusedSymbolLocalInspectionBase myCheckParametersCheckBox.addActionListener(listener); myInnerClassesCheckBox.addActionListener(listener); myAccessors.addActionListener(listener); - - ((MyLabel)myClassVisibilityCb).setupVisibilityLabel(() -> myClassVisibility, modifier -> setClassVisibility(modifier), new String[]{PsiModifier.PACKAGE_LOCAL, PsiModifier.PUBLIC}); - ((MyLabel)myInnerClassVisibilityCb).setupVisibilityLabel(() -> myInnerClassVisibility, modifier -> setInnerClassVisibility(modifier)); - ((MyLabel)myFieldVisibilityCb).setupVisibilityLabel(() -> myFieldVisibility, modifier -> setFieldVisibility(modifier)); - ((MyLabel)myMethodVisibilityCb).setupVisibilityLabel(() -> myMethodVisibility, modifier -> setMethodVisibility(modifier)); - ((MyLabel)myMethodParameterVisibilityCb).setupVisibilityLabel(() -> myParameterVisibility, modifier -> setParameterVisibility(modifier)); - } + } private void updateEnableState() { UIUtil.setEnabled(myClassVisibilityCb, CLASS, true); @@ -129,11 +99,27 @@ public class UnusedSymbolLocalInspection extends UnusedSymbolLocalInspectionBase } private void createUIComponents() { - myClassVisibilityCb = new MyLabel(() -> CLASS); - myInnerClassVisibilityCb = new MyLabel(() -> INNER_CLASS); - myFieldVisibilityCb = new MyLabel(() -> FIELD); - myMethodVisibilityCb = new MyLabel(() -> METHOD); - myMethodParameterVisibilityCb = new MyLabel(() -> PARAMETER); + myClassVisibilityCb = new VisibilityModifierChooser(() -> CLASS, + myClassVisibility, + modifier -> setClassVisibility(modifier), + new String[]{PsiModifier.PACKAGE_LOCAL, PsiModifier.PUBLIC}); + + myInnerClassVisibilityCb = new VisibilityModifierChooser(() -> INNER_CLASS, + myInnerClassVisibility, + modifier -> setInnerClassVisibility(modifier)); + + myFieldVisibilityCb = new VisibilityModifierChooser(() -> FIELD, + myFieldVisibility, + modifier -> setFieldVisibility(modifier)); + + myMethodVisibilityCb = new VisibilityModifierChooser(() -> METHOD, + myMethodVisibility, + modifier -> setMethodVisibility(modifier)); + + myMethodParameterVisibilityCb = new VisibilityModifierChooser(() -> PARAMETER, + myParameterVisibility, + modifier -> setParameterVisibility(modifier)); + myAccessors = new JCheckBox() { @Override public void setEnabled(boolean b) { @@ -143,94 +129,6 @@ public class UnusedSymbolLocalInspection extends UnusedSymbolLocalInspectionBase } } - private static class MyLabel extends JLabel implements UserActivityProviderComponent { - - @PsiModifier.ModifierConstant private static final String[] MODIFIERS = - new String[]{PsiModifier.PRIVATE, PsiModifier.PACKAGE_LOCAL, PsiModifier.PROTECTED, PsiModifier.PUBLIC}; - private final Supplier myCanBeEnabled; - - private Set myListeners = new HashSet<>(); - - public MyLabel(Supplier canBeEnabled) { - myCanBeEnabled = canBeEnabled; - setIcon(AllIcons.General.Combo2); - setDisabledIcon(AllIcons.General.Combo2); - setIconTextGap(0); - setHorizontalTextPosition(SwingConstants.LEFT); - } - - private void fireStateChanged() { - for (ChangeListener listener : myListeners) { - listener.stateChanged(new ChangeEvent(this)); - } - } - - private static String getPresentableText(String modifier) { - return StringUtil.capitalize(VisibilityUtil.toPresentableText(modifier)); - } - - private void setupVisibilityLabel(Producer visibilityProducer, Consumer setter) { - setupVisibilityLabel(visibilityProducer, setter, MODIFIERS); - } - - private void setupVisibilityLabel(Producer visibilityProducer, Consumer setter, final String[] modifiers) { - setText(getPresentableText(visibilityProducer.produce())); - new ClickListener() { - @Override - public boolean onClick(@NotNull MouseEvent e, int clickCount) { - if (!isEnabled()) return true; - @SuppressWarnings("UseOfObsoleteCollectionType") - Hashtable sliderLabels = new Hashtable<>(); - for (int i = 0; i < modifiers.length; i++) { - sliderLabels.put(i + 1, new JLabel(getPresentableText(modifiers[i]))); - } - - JSlider slider = new JSlider(SwingConstants.VERTICAL, 1, modifiers.length, 1); - slider.addChangeListener(val -> { - final String modifier = modifiers[slider.getValue() - 1]; - setter.consume(modifier); - setText(getPresentableText(modifier)); - fireStateChanged(); - }); - slider.setLabelTable(sliderLabels); - slider.putClientProperty(UIUtil.JSLIDER_ISFILLED, Boolean.TRUE); - slider.setPreferredSize(JBUI.size(150, modifiers.length * 25)); - slider.setPaintLabels(true); - slider.setSnapToTicks(true); - slider.setValue(ArrayUtil.find(modifiers, visibilityProducer.produce()) + 1); - final JBPopup popup = JBPopupFactory.getInstance() - .createComponentPopupBuilder(slider, null) - .setTitle("Effective Visibility") - .setCancelOnClickOutside(true) - .setMovable(true) - .createPopup(); - popup.show(new RelativePoint(MyLabel.this, new Point(getWidth(), 0))); - return true; - } - }.installOn(this); - } - - @Override - public void setForeground(Color fg) { - super.setForeground(isEnabled() ? UI.getColor("link.foreground") : fg); - } - - @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled && myCanBeEnabled.get()); - } - - @Override - public void addChangeListener(ChangeListener changeListener) { - myListeners.add(changeListener); - } - - @Override - public void removeChangeListener(ChangeListener changeListener) { - myListeners.remove(changeListener); - } - } - @Override @Nullable public JComponent createOptionsPanel() { diff --git a/java/java-impl/src/com/intellij/codeInspection/unusedSymbol/VisibilityModifierChooser.java b/java/java-impl/src/com/intellij/codeInspection/unusedSymbol/VisibilityModifierChooser.java new file mode 100644 index 000000000000..b64097fe159a --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInspection/unusedSymbol/VisibilityModifierChooser.java @@ -0,0 +1,143 @@ +/* + * Copyright 2000-2017 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.codeInspection.unusedSymbol; + +import com.intellij.icons.AllIcons; +import com.intellij.openapi.ui.popup.JBPopup; +import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiModifier; +import com.intellij.ui.ClickListener; +import com.intellij.ui.UI; +import com.intellij.ui.UserActivityProviderComponent; +import com.intellij.ui.awt.RelativePoint; +import com.intellij.util.ArrayUtil; +import com.intellij.util.Consumer; +import com.intellij.util.VisibilityUtil; +import com.intellij.util.containers.HashSet; +import com.intellij.util.ui.JBUI; +import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.util.Hashtable; +import java.util.Set; +import java.util.function.Supplier; + +public class VisibilityModifierChooser extends JLabel implements UserActivityProviderComponent { + + @PsiModifier.ModifierConstant private static final String[] MODIFIERS = + new String[]{PsiModifier.PRIVATE, PsiModifier.PACKAGE_LOCAL, PsiModifier.PROTECTED, PsiModifier.PUBLIC}; + private final Supplier myCanBeEnabled; + + private final Set myListeners = new HashSet<>(); + private String myCurrentModifier; + + public VisibilityModifierChooser(@NotNull Supplier canBeEnabled, + @NotNull String modifier, + @NotNull Consumer modifierChangedConsumer) { + this(canBeEnabled, modifier, modifierChangedConsumer, MODIFIERS); + } + + + @Override + public void setText(String text) { + super.setText(text); + } + + public VisibilityModifierChooser(@NotNull Supplier canBeEnabled, + @NotNull String modifier, + @NotNull Consumer modifierChangedConsumer, + @NotNull String[] modifiers) { + myCanBeEnabled = canBeEnabled; + setIcon(AllIcons.General.Combo2); + setDisabledIcon(AllIcons.General.Combo2); + setIconTextGap(0); + setHorizontalTextPosition(SwingConstants.LEFT); + myCurrentModifier = modifier; + setText(getPresentableText(myCurrentModifier)); + new ClickListener() { + @Override + public boolean onClick(@NotNull MouseEvent e, int clickCount) { + if (!isEnabled()) return true; + @SuppressWarnings("UseOfObsoleteCollectionType") + Hashtable sliderLabels = new Hashtable<>(); + for (int i = 0; i < modifiers.length; i++) { + sliderLabels.put(i + 1, new JLabel(getPresentableText(modifiers[i]))); + } + + JSlider slider = new JSlider(SwingConstants.VERTICAL, 1, modifiers.length, 1); + slider.addChangeListener(val -> { + final String modifier = modifiers[slider.getValue() - 1]; + if (myCurrentModifier != modifier) { + myCurrentModifier = modifier; + modifierChangedConsumer.consume(modifier); + setText(getPresentableText(modifier)); + fireStateChanged(); + } + }); + slider.setLabelTable(sliderLabels); + slider.putClientProperty(UIUtil.JSLIDER_ISFILLED, Boolean.TRUE); + slider.setPreferredSize(JBUI.size(150, modifiers.length * 25)); + slider.setPaintLabels(true); + slider.setSnapToTicks(true); + slider.setValue(ArrayUtil.find(modifiers, myCurrentModifier) + 1); + final JBPopup popup = JBPopupFactory.getInstance() + .createComponentPopupBuilder(slider, null) + .setTitle("Effective Visibility") + .setCancelOnClickOutside(true) + .setMovable(true) + .createPopup(); + popup.show(new RelativePoint(VisibilityModifierChooser.this, new Point(getWidth(), 0))); + return true; + } + }.installOn(this); + } + + private void fireStateChanged() { + for (ChangeListener listener : myListeners) { + listener.stateChanged(new ChangeEvent(this)); + } + } + + private static String getPresentableText(String modifier) { + return StringUtil.capitalize(VisibilityUtil.toPresentableText(modifier)); + } + + @Override + public void setForeground(Color fg) { + super.setForeground(isEnabled() ? UI.getColor("link.foreground") : fg); + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled && myCanBeEnabled.get()); + } + + @Override + public void addChangeListener(ChangeListener changeListener) { + myListeners.add(changeListener); + } + + @Override + public void removeChangeListener(ChangeListener changeListener) { + myListeners.remove(changeListener); + } +}