blob: b0746769d83cb65ac36f830aedd3f8883fbeabf1 [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.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();
}
}