blob: de12269b5887c971c366ea835fc4a6537bfd2727 [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.ide.customize;
import com.intellij.ide.plugins.PluginManager;
import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.VerticalFlowLayout;
import com.intellij.openapi.util.Pair;
import com.intellij.ui.ColorUtil;
import com.intellij.ui.JBCardLayout;
import com.intellij.ui.JBColor;
import com.intellij.ui.border.CustomLineBorder;
import com.intellij.ui.components.JBScrollPane;
import com.intellij.ui.components.labels.LinkLabel;
import com.intellij.ui.components.labels.LinkListener;
import javax.swing.*;
import javax.swing.border.CompoundBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public class CustomizePluginsStepPanel extends AbstractCustomizeWizardStep implements LinkListener<String> {
private static final String MAIN = "main";
private static final String CUSTOMIZE = "customize";
private static final int COLS = 3;
private static final TextProvider CUSTOMIZE_TEXT_PROVIDER = new TextProvider() {
@Override
public String getText() {
return "Customize...";
}
};
private static final String SWITCH_COMMAND = "Switch";
private static final String CUSTOMIZE_COMMAND = "Customize";
private final JBCardLayout myCardLayout;
private final IdSetPanel myCustomizePanel;
private final PluginGroups myPluginGroups;
public CustomizePluginsStepPanel(PluginGroups pluginGroups) {
myPluginGroups = pluginGroups;
myCardLayout = new JBCardLayout();
setLayout(myCardLayout);
JPanel gridPanel = new JPanel(new GridLayout(0, COLS));
myCustomizePanel = new IdSetPanel();
JBScrollPane scrollPane =
new JBScrollPane(gridPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.getVerticalScrollBar().setUnitIncrement(10);
scrollPane.setBorder(null);
add(scrollPane, MAIN);
add(myCustomizePanel, CUSTOMIZE);
Map<String, Pair<Icon, List<String>>> groups = pluginGroups.getTree();
for (final Map.Entry<String, Pair<Icon, List<String>>> entry : groups.entrySet()) {
final String group = entry.getKey();
if (PluginGroups.CORE.equals(group)) continue;
JPanel groupPanel = new JPanel(new GridBagLayout()) {
@Override
public Color getBackground() {
Color color = UIManager.getColor("Panel.background");
return isGroupEnabled(group)? color : ColorUtil.darker(color, 1);
}
};
gridPanel.setOpaque(true);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
JLabel titleLabel = new JLabel("<html><body><h2 style=\"text-align:left;\">" + group + "</h2></body></html>", SwingConstants.CENTER) {
@Override
public boolean isEnabled() {
return isGroupEnabled(group);
}
};
groupPanel.add(new JLabel(entry.getValue().getFirst()), gbc);
//gbc.insets.bottom = 5;
groupPanel.add(titleLabel, gbc);
JLabel descriptionLabel = new JLabel(pluginGroups.getDescription(group), SwingConstants.CENTER) {
@Override
public Dimension getPreferredSize() {
Dimension size = super.getPreferredSize();
size.width = Math.min(size.width, 200);
return size;
}
@Override
public boolean isEnabled() {
return isGroupEnabled(group);
}
@Override
public Color getForeground() {
return ColorUtil.withAlpha(UIManager.getColor("Label.foreground"), .75);
}
};
groupPanel.add(descriptionLabel, gbc);
gbc.weighty = 1;
groupPanel.add(Box.createVerticalGlue(), gbc);
gbc.weighty = 0;
JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, SMALL_GAP, SMALL_GAP / 2));
buttonsPanel.setOpaque(false);
if (pluginGroups.getSets(group).size() == 1) {
buttonsPanel.add(createLink(SWITCH_COMMAND + ":" + group, getGroupSwitchTextProvider(group)));
}
else {
buttonsPanel.add(createLink(CUSTOMIZE_COMMAND + ":" + group, CUSTOMIZE_TEXT_PROVIDER));
buttonsPanel.add(createLink(SWITCH_COMMAND + ":" + group, getGroupSwitchTextProvider(group)));
}
groupPanel.add(buttonsPanel, gbc);
gridPanel.add(groupPanel);
}
int cursor = 0;
Component[] components = gridPanel.getComponents();
int rowCount = components.length / COLS;
for (Component component : components) {
((JComponent)component).setBorder(
new CompoundBorder(new CustomLineBorder(ColorUtil.withAlpha(JBColor.foreground(), .2), 0, 0, cursor / 3 < rowCount - 1 ? 1 : 0,
cursor % COLS != COLS - 1 ? 1 : 0) {
@Override
protected Color getColor() {
return ColorUtil.withAlpha(JBColor.foreground(), .2);
}
}, BorderFactory.createEmptyBorder(SMALL_GAP, GAP, SMALL_GAP, GAP)));
cursor++;
}
}
@Override
public void linkSelected(LinkLabel linkLabel, String command) {
if (command == null || !command.contains(":")) return;
int semicolonPosition = command.indexOf(":");
String group = command.substring(semicolonPosition + 1);
command = command.substring(0, semicolonPosition);
if (SWITCH_COMMAND.equals(command)) {
boolean enabled = isGroupEnabled(group);
List<IdSet> sets = myPluginGroups.getSets(group);
for (IdSet idSet : sets) {
String[] ids = idSet.getIds();
for (String id : ids) {
myPluginGroups.setPluginEnabledWithDependencies(id, !enabled);
}
}
repaint();
return;
}
if (CUSTOMIZE_COMMAND.equals(command)) {
myCustomizePanel.update(group);
myCardLayout.show(this, CUSTOMIZE);
setButtonsVisible(false);
}
}
private void setButtonsVisible(boolean visible) {
DialogWrapper window = DialogWrapper.findInstance(this);
if (window instanceof CustomizeIDEWizardDialog) {
((CustomizeIDEWizardDialog)window).setButtonsVisible(visible);
}
}
private LinkLabel createLink(String command, final TextProvider provider) {
return new LinkLabel<String>("", null, this, command) {
@Override
public String getText() {
return provider.getText();
}
};
}
TextProvider getGroupSwitchTextProvider(final String group) {
return new TextProvider() {
@Override
public String getText() {
return (isGroupEnabled(group) ? "Disable" : "Enable") +
(myPluginGroups.getSets(group).size() > 1 ? " All" : "");
}
};
}
private boolean isGroupEnabled(String group) {
List<IdSet> sets = myPluginGroups.getSets(group);
for (IdSet idSet : sets) {
String[] ids = idSet.getIds();
for (String id : ids) {
if (myPluginGroups.isPluginEnabled(id)) return true;
}
}
return false;
}
@Override
public String getTitle() {
return "Default plugins";
}
@Override
public String getHTMLHeader() {
return "<html><body><h2>Tune " +
ApplicationNamesInfo.getInstance().getProductName() +
" to your tasks</h2>" +
ApplicationNamesInfo.getInstance().getProductName() +
" has a lot of tools enabled by default. You can set only ones you need or leave them all." +
"</body></html>";
}
@Override
public String getHTMLFooter() {
return null;
}
@Override
public boolean beforeOkAction() {
try {
PluginManager.saveDisabledPlugins(myPluginGroups.getDisabledPluginIds(), false);
}
catch (IOException ignored) {
}
return true;
}
private class IdSetPanel extends JPanel implements LinkListener<String> {
private JLabel myTitleLabel = new JLabel();
private JPanel myContentPanel = new JPanel(new GridLayout(0, 3, 5, 5));
private JButton mySaveButton = new JButton("Save Changes and Go Back");
private String myGroup;
private IdSetPanel() {
setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 0, GAP, true, false));
add(myTitleLabel);
add(myContentPanel);
JPanel buttonPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets.right = 25;
gbc.gridy = 0;
buttonPanel.add(mySaveButton, gbc);
buttonPanel.add(new LinkLabel<String>("Enable All", null, this, "enable"), gbc);
buttonPanel.add(new LinkLabel<String>("Disable All", null, this, "disable"), gbc);
gbc.weightx = 1;
buttonPanel.add(Box.createHorizontalGlue(), gbc);
add(buttonPanel);
mySaveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myCardLayout.show(CustomizePluginsStepPanel.this, MAIN);
setButtonsVisible(true);
}
});
}
@Override
public void linkSelected(LinkLabel aSource, String command) {
if (myGroup == null) return;
boolean enable = "enable".equals(command);
List<IdSet> idSets = myPluginGroups.getSets(myGroup);
for (IdSet set : idSets) {
myPluginGroups.setIdSetEnabled(set, enable);
}
CustomizePluginsStepPanel.this.repaint();
}
void update(String group) {
myGroup = group;
myTitleLabel.setText("<html><body><h2 style=\"text-align:left;\">" + group + "</h2></body></html>");
myContentPanel.removeAll();
List<IdSet> idSets = myPluginGroups.getSets(group);
for (final IdSet set : idSets) {
final JCheckBox checkBox = new JCheckBox(set.getTitle(), myPluginGroups.isIdSetAllEnabled(set));
checkBox.setModel(new JToggleButton.ToggleButtonModel() {
@Override
public boolean isSelected() {
return myPluginGroups.isIdSetAllEnabled(set);
}
});
checkBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myPluginGroups.setIdSetEnabled(set, !checkBox.isSelected());
CustomizePluginsStepPanel.this.repaint();
}
});
myContentPanel.add(checkBox);
}
}
}
private interface TextProvider {
String getText();
}
}