summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/AdvancedSettingsAction.java
diff options
context:
space:
mode:
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.java209
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();
+ }
+}