diff options
Diffstat (limited to 'platform/lang-impl/src/com/intellij/profile/codeInspection/ui/AdvancedSettingsAction.java')
-rw-r--r-- | platform/lang-impl/src/com/intellij/profile/codeInspection/ui/AdvancedSettingsAction.java | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/AdvancedSettingsAction.java b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/AdvancedSettingsAction.java new file mode 100644 index 000000000000..b0746769d83c --- /dev/null +++ b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/AdvancedSettingsAction.java @@ -0,0 +1,209 @@ +/* + * 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.profile.codeInspection.ui; + +import com.intellij.codeInspection.ex.InspectionProfileImpl; +import com.intellij.icons.AllIcons; +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.application.ApplicationNamesInfo; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.ui.popup.PopupStep; +import com.intellij.openapi.ui.popup.util.BaseListPopupStep; +import com.intellij.profile.codeInspection.ui.inspectionsTree.InspectionConfigTreeNode; +import com.intellij.ui.LayeredIcon; +import com.intellij.ui.awt.RelativePoint; +import com.intellij.ui.components.JBLabel; +import com.intellij.ui.popup.list.ListPopupImpl; +import com.intellij.util.Consumer; +import com.intellij.util.PlatformIcons; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.ui.EmptyIcon; +import com.intellij.util.ui.UIUtil; + +import javax.swing.*; +import java.awt.*; + +/** + * @author Dmitry Batkovich + */ +public abstract class AdvancedSettingsAction extends AnAction { + private final int myCheckBoxIndent; + private Project myProject; + private InspectionConfigTreeNode myRoot; + + public AdvancedSettingsAction(final Project project, InspectionConfigTreeNode root) { + super("Advanced Settings"); + getTemplatePresentation().setIcon(AllIcons.General.Gear); + myProject = project; + myRoot = root; + myCheckBoxIndent = calculateCheckBoxIndent(); + } + + @Override + public void update(AnActionEvent e) { + super.update(e); + final InspectionProfileImpl inspectionProfile = getInspectionProfile(); + final Icon icon = AllIcons.General.Gear; + e.getPresentation().setIcon( + (inspectionProfile != null && inspectionProfile.isProfileLocked()) ? LayeredIcon.create(icon, PlatformIcons.LOCKED_ICON) : icon); + } + + @Override + public void actionPerformed(AnActionEvent e) { + final ListPopupImpl actionGroupPopup = (ListPopupImpl)JBPopupFactory.getInstance().createListPopup( + new BaseListPopupStep<MyAction>(null, ContainerUtil.list(new MyDisableNewInspectionsAction(), new MyResetAction())) { + @Override + public PopupStep onChosen(MyAction selectedValue, boolean finalChoice) { + if (selectedValue.enabled()) { + selectedValue.actionPerformed(); + } + return FINAL_CHOICE; + } + }); + actionGroupPopup.getList().setCellRenderer(new ListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + return ((MyAction)value).createCustomComponent(isSelected); + } + }); + final Component component = e.getInputEvent().getComponent(); + actionGroupPopup.show(new RelativePoint(component, new Point(component.getWidth() - 1, 0))); + } + + private JLabel installLeftIndentToLabel(final JLabel label) { + label.setBorder(BorderFactory.createEmptyBorder(0, myCheckBoxIndent, 0, 0)); + return label; + } + + private class MyResetAction extends MyAction { + + protected MyResetAction() { + super("All your changes will be lost"); + } + + @Override + protected JComponent createBaseComponent() { + return installLeftIndentToLabel(new JLabel("Reset to Defaults Settings")); + } + + @Override + public void actionPerformed() { + final InspectionProfileImpl inspectionProfile = getInspectionProfile(); + if (inspectionProfile == null) { + return; + } + inspectionProfile.resetToBase(myProject); + postProcessModification(); + } + + @Override + protected boolean enabled() { + return myRoot.isProperSetting(); + } + } + + private class MyDisableNewInspectionsAction extends MyAction { + public MyDisableNewInspectionsAction() { + super("New inspections may appear when " + ApplicationNamesInfo.getInstance().getFullProductName() + " is updated"); + } + + @Override + protected JComponent createBaseComponent() { + final JCheckBox checkBox = new JCheckBox("Disable new inspections by default"); + final InspectionProfileImpl profile = getInspectionProfile(); + checkBox.setEnabled(profile != null); + if (profile != null) { + checkBox.setSelected(profile.isProfileLocked()); + } + checkBox.setOpaque(false); + return checkBox; + } + + @Override + public void actionPerformed() { + final InspectionProfileImpl profile = getInspectionProfile(); + if (profile != null) { + profile.lockProfile(!profile.isProfileLocked()); + } + } + + + @Override + protected boolean enabled() { + return true; + } + } + + private abstract class MyAction { + private final String myDescription; + + protected MyAction(String description) { + myDescription = description; + } + + protected abstract JComponent createBaseComponent(); + + protected abstract void actionPerformed(); + + protected abstract boolean enabled(); + + public JComponent createCustomComponent(final boolean selected) { + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); + panel.add(createBaseComponent()); + panel.add(installLeftIndentToLabel(new JBLabel(myDescription, UIUtil.ComponentStyle.MINI))); + panel.setBackground(selected ? UIUtil.getListSelectionBackground() : UIUtil.getListBackground()); + panel.setForeground(selected ? UIUtil.getListSelectionForeground() : UIUtil.getListForeground()); + UIUtil.setEnabled(panel, enabled(), true); + return panel; + } + } + + protected abstract InspectionProfileImpl getInspectionProfile(); + + protected abstract void postProcessModification(); + + private static int calculateCheckBoxIndent() { + JCheckBox checkBox = new JCheckBox(); + Icon icon = checkBox.getIcon(); + int indent = 0; + if (icon == null) { + icon = UIManager.getIcon("CheckBox.icon"); + } + if (UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF()) { + icon = EmptyIcon.create(20, 18); + } + if (icon != null) { + final Insets i = checkBox.getInsets(); + final Rectangle r = checkBox.getBounds(); + final Rectangle r1 = new Rectangle(); + r1.x = i.left; + r1.y = i.top; + r1.width = r.width - (i.right + r1.x); + r1.height = r.height - (i.bottom + r1.y); + final Rectangle iconRect = new Rectangle(); + SwingUtilities.layoutCompoundLabel( + checkBox, checkBox.getFontMetrics(checkBox.getFont()), checkBox.getText(), icon, + checkBox.getVerticalAlignment(), checkBox.getHorizontalAlignment(), + checkBox.getVerticalTextPosition(), checkBox.getHorizontalTextPosition(), + r1, new Rectangle(), iconRect, + checkBox.getText() == null ? 0 : checkBox.getIconTextGap()); + indent = iconRect.x; + } + return indent + checkBox.getIconTextGap(); + } +} |