blob: bfa1e14ec88ef0526d1bf45e0e15454055422bb2 [file] [log] [blame]
package com.intellij.ui.tabs;
import com.intellij.notification.impl.ui.StickyButton;
import com.intellij.notification.impl.ui.StickyButtonUI;
import com.intellij.ui.ColorChooser;
import com.intellij.ui.ColorUtil;
import com.intellij.ui.FileColorManager;
import com.intellij.ui.JBColor;
import com.intellij.util.ObjectUtils;
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 javax.swing.plaf.ButtonUI;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author gregsh
*/
public class ColorSelectionComponent extends JPanel {
private static final String CUSTOM_COLOR_NAME = "Custom";
private Map<String, ColorButton> myColorToButtonMap = new LinkedHashMap<String, ColorButton>();
private final ButtonGroup myButtonGroup = new ButtonGroup();
private final JPanel myInnerPanel;
private ChangeListener myChangeListener;
public ColorSelectionComponent() {
setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
myInnerPanel = new JPanel();
myInnerPanel.setLayout(new BoxLayout(myInnerPanel, BoxLayout.X_AXIS));
myInnerPanel.setBorder(
BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1), BorderFactory.createEmptyBorder(5, 5, 5, 5)));
if (!UIUtil.isUnderDarcula()) {
myInnerPanel.setBackground(Color.WHITE);
}
add(myInnerPanel, BorderLayout.CENTER);
}
public void setChangeListener(ChangeListener changeListener) {
myChangeListener = changeListener;
}
public void setSelectedColor(String colorName) {
AbstractButton button = myColorToButtonMap.get(colorName);
if (button != null) {
button.setSelected(true);
}
}
@NotNull
public Collection<String> getColorNames() {
return myColorToButtonMap.keySet();
}
@Nullable
public String getColorName(@Nullable Color color) {
if (color == null) return null;
for (String name : myColorToButtonMap.keySet()) {
if (color.getRGB() == myColorToButtonMap.get(name).getColor().getRGB()) {
return name;
}
}
return null;
}
public void addCustomColorButton() {
CustomColorButton customButton = new CustomColorButton();
myButtonGroup.add(customButton);
myInnerPanel.add(customButton);
myColorToButtonMap.put(customButton.getText(), customButton);
myInnerPanel.add(Box.createHorizontalStrut(5));
}
public void addColorButton(@NotNull String name, @NotNull Color color) {
ColorButton colorButton = new ColorButton(name, color);
myButtonGroup.add(colorButton);
myInnerPanel.add(colorButton);
myColorToButtonMap.put(name, colorButton);
myInnerPanel.add(Box.createHorizontalStrut(5));
}
public void setCustomButtonColor(@NotNull Color color) {
CustomColorButton button = (CustomColorButton)myColorToButtonMap.get(CUSTOM_COLOR_NAME);
button.setColor(color);
button.setSelected(true);
button.repaint();
}
@Nullable
public String getSelectedColorName() {
for (String name : myColorToButtonMap.keySet()) {
ColorButton button = myColorToButtonMap.get(name);
if (!button.isSelected()) continue;
if (button instanceof CustomColorButton) return ColorUtil.toHex(button.getColor());
return name;
}
return null;
}
@Nullable
public Color getSelectedColor() {
for (String name : myColorToButtonMap.keySet()) {
ColorButton button = myColorToButtonMap.get(name);
if (!button.isSelected()) continue;
return button.getColor();
}
return null;
}
public void initDefault(@NotNull FileColorManager manager, @Nullable String selectedColorName) {
for (String name : manager.getColorNames()) {
addColorButton(name, ObjectUtils.assertNotNull(manager.getColor(name)));
}
addCustomColorButton();
setSelectedColor(selectedColorName);
}
private class ColorButton extends StickyButton {
protected Color myColor;
protected ColorButton(final String text, final Color color) {
super(FileColorManagerImpl.getAlias(text));
setUI(new ColorButtonUI());
myColor = color;
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doPerformAction(e);
}
});
setBackground(new JBColor(Color.WHITE, UIUtil.getControlColor()));
setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
}
protected void doPerformAction(ActionEvent e) {
stateChanged();
}
Color getColor() {
return myColor;
}
public void setColor(Color color) {
myColor = color;
}
@Override
public Color getForeground() {
if (getModel().isSelected()) {
return JBColor.foreground();
}
else if (getModel().isRollover()) {
return JBColor.GRAY;
}
else {
return getColor();
}
}
@Override
protected ButtonUI createUI() {
return new ColorButtonUI();
}
}
public void stateChanged() {
if (myChangeListener != null) {
myChangeListener.stateChanged(new ChangeEvent(this));
}
}
private class CustomColorButton extends ColorButton {
private CustomColorButton() {
super(CUSTOM_COLOR_NAME, Color.WHITE);
myColor = null;
}
@Override
protected void doPerformAction(ActionEvent e) {
final Color color = ColorChooser.chooseColor(this, "Choose Color", myColor);
if (color != null) {
myColor = color;
}
setSelected(myColor != null);
stateChanged();
}
@Override
public Color getForeground() {
return getModel().isSelected() ? Color.BLACK : JBColor.GRAY;
}
@Override
Color getColor() {
return myColor == null ? Color.WHITE : myColor;
}
}
private class ColorButtonUI extends StickyButtonUI<ColorButton> {
@Override
protected Color getBackgroundColor(final ColorButton button) {
return button.getColor();
}
@Override
protected Color getFocusColor(ColorButton button) {
return button.getColor().darker();
}
@Override
protected Color getSelectionColor(ColorButton button) {
return button.getColor();
}
@Override
protected Color getRolloverColor(ColorButton button) {
return button.getColor();
}
@Override
protected int getArcSize() {
return 20;
}
}
}