blob: abe085cca4579de96f18ef12ac119be79796e2fa [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.openapi.roots.ui.configuration;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.ui.GraphicsConfig;
import com.intellij.openapi.ui.popup.ListItemDescriptor;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.*;
import com.intellij.ui.components.JBList;
import com.intellij.ui.components.panels.NonOpaquePanel;
import com.intellij.ui.navigation.History;
import com.intellij.ui.navigation.Place;
import com.intellij.ui.popup.list.GroupedItemsListRenderer;
import com.intellij.util.ui.EmptyIcon;
import com.intellij.util.ui.GraphicsUtil;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import static javax.swing.SwingConstants.CENTER;
import static javax.swing.SwingConstants.LEFT;
public class SidePanel extends JPanel {
private final JList myList;
private final DefaultListModel myModel;
private final Place.Navigator myNavigator;
private final ArrayList<Place> myPlaces = new ArrayList<Place>();
private final Map<Integer, String> myIndex2Separator = new HashMap<Integer, String>();
private final Map<Place, Presentation> myPlace2Presentation = new HashMap<Place, Presentation>();
private final History myHistory;
public SidePanel(Place.Navigator navigator, History history) {
myHistory = history;
myNavigator = navigator;
setLayout(new BorderLayout());
myModel = new DefaultListModel();
myList = new JBList(myModel);
if (Registry.is("ide.new.project.settings")) {
myList.setBackground(UIUtil.getSidePanelColor());
myList.setBorder(new EmptyBorder(5, 0, 0, 0));
}
final ListItemDescriptor descriptor = new ListItemDescriptor() {
@Override
public String getTextFor(final Object value) {
return myPlace2Presentation.get(value).getText();
}
@Override
public String getTooltipFor(final Object value) {
return getTextFor(value);
}
@Override
public Icon getIconFor(final Object value) {
return Registry.is("ide.new.project.settings") ? EmptyIcon.create(16, 20) : null;
//return myPlace2Presentation.get(value).getIcon();
}
@Override
public boolean hasSeparatorAboveOf(final Object value) {
final int index = myPlaces.indexOf(value);
return myIndex2Separator.get(index) != null;
}
@Override
public String getCaptionAboveOf(final Object value) {
return myIndex2Separator.get(myPlaces.indexOf(value));
}
};
myList.setCellRenderer(new GroupedItemsListRenderer(descriptor) {
JPanel myExtraPanel;
CountLabel myCountLabel;
{
mySeparatorComponent.setCaptionCentered(false);
}
@Override
protected Color getForeground() {
return Registry.is("ide.new.project.settings") ? new JBColor(Gray._60, Gray._140) : super.getForeground();
}
@Override
protected SeparatorWithText createSeparator() {
return new SeparatorWithText() {
@Override
protected void paintComponent(Graphics g) {
if (Registry.is("ide.new.project.settings")) {
final JBColor separatorColor = new JBColor(POPUP_SEPARATOR_FOREGROUND, Gray._80);
g.setColor(separatorColor);
if ("--".equals(getCaption())) {
final GraphicsConfig config = GraphicsUtil.setupAAPainting(g);
final int h = getHeight() / 2;
g.drawLine(30, h, getWidth() - 30, h);
((Graphics2D)g).setPaint(new GradientPaint(5, h, ColorUtil.toAlpha(separatorColor, 0), 30, h, separatorColor));
g.drawLine(5, h, 30, h);
((Graphics2D)g).setPaint(
new GradientPaint(getWidth() - 5, h, ColorUtil.toAlpha(separatorColor, 0), getWidth() - 30, h, separatorColor));
g.drawLine(getWidth() - 5, h, getWidth() - 30, h);
config.restore();
return;
}
Rectangle viewR = new Rectangle(0, getVgap(), getWidth() - 1, getHeight() - getVgap() - 1);
Rectangle iconR = new Rectangle();
Rectangle textR = new Rectangle();
String s = SwingUtilities
.layoutCompoundLabel(g.getFontMetrics(), getCaption(), null, CENTER,
LEFT,
CENTER,
LEFT,
viewR, iconR, textR, 0);
GraphicsUtil.setupAAPainting(g);
g.setColor(new JBColor(Gray._255.withAlpha(80), Gray._0.withAlpha(80)));
g.drawString(s, textR.x + 10, textR.y + 1 + g.getFontMetrics().getAscent());
g.setColor(new JBColor(new Color(0x5F6D7B), Gray._120));
g.drawString(s, textR.x + 10, textR.y + g.getFontMetrics().getAscent());
}
else {
super.paintComponent(g);
}
}
};
}
@Override
protected void layout() {
if (Registry.is("ide.new.project.settings")) {
myRendererComponent.add(mySeparatorComponent, BorderLayout.NORTH);
myExtraPanel.add(myComponent, BorderLayout.CENTER);
myExtraPanel.add(myCountLabel, BorderLayout.EAST);
myRendererComponent.add(myExtraPanel, BorderLayout.CENTER);
} else {
super.layout();
}
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
myCountLabel.setText("");
final Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if ("Problems".equals(descriptor.getTextFor(value))) {
final ErrorPaneConfigurable errorPane = (ErrorPaneConfigurable)((Place)value).getPath("category");
if (errorPane != null && errorPane.getErrorsCount() > 0) {
myCountLabel.setSelected(isSelected);
myCountLabel.setText(String.valueOf(errorPane.getErrorsCount()));
}
}
return component;
}
@Override
protected JComponent createItemComponent() {
myExtraPanel = new NonOpaquePanel(new BorderLayout());
myCountLabel = new CountLabel();
final JComponent component = super.createItemComponent();
if (Registry.is("ide.new.project.settings")) {
myTextLabel.setForeground(Gray._240);
myTextLabel.setOpaque(true);
}
return component;
}
@Override
protected Color getBackground() {
return Registry.is("ide.new.project.settings") ? UIUtil.getSidePanelColor() : super.getBackground();
}
});
add(ScrollPaneFactory.createScrollPane(myList, Registry.is("ide.new.project.settings")), BorderLayout.CENTER);
myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
myList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(final ListSelectionEvent e) {
if (e.getValueIsAdjusting()) return;
final Object value = myList.getSelectedValue();
if (value != null) {
myNavigator.navigateTo(((Place)value), false);
}
}
});
}
public JList getList() {
return myList;
}
public void addPlace(Place place, @NotNull Presentation presentation) {
myModel.addElement(place);
myPlaces.add(place);
myPlace2Presentation.put(place, presentation);
revalidate();
repaint();
}
public void addSeparator(String text) {
myIndex2Separator.put(myPlaces.size(), text);
}
public Collection<Place> getPlaces() {
return myPlaces;
}
public void select(final Place place) {
myList.setSelectedValue(place, true);
}
private static class CountLabel extends JLabel {
private boolean mySelected;
public CountLabel() {
super();
setBorder(new Border() {
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
}
@Override
public Insets getBorderInsets(Component c) {
return StringUtil.isEmpty(getText()) ? new Insets(0,0,0,0) : new Insets(2, 6, 2, 6 + 6);
}
@Override
public boolean isBorderOpaque() {
return false;
}
});
setFont(UIUtil.getListFont().deriveFont(Font.BOLD));
}
public boolean isSelected() {
return mySelected;
}
public void setSelected(boolean selected) {
mySelected = selected;
}
@Override
protected void paintComponent(Graphics g) {
g.setColor(isSelected() ? UIUtil.getListSelectionBackground() : UIUtil.getSidePanelColor());
g.fillRect(0, 0, getWidth(), getHeight());
if (StringUtil.isEmpty(getText())) return;
final JBColor deepBlue = new JBColor(new Color(0x97A4B2), new Color(92, 98, 113));
g.setColor(isSelected() ? Gray._255.withAlpha(UIUtil.isUnderDarcula() ? 100 : 220) : deepBlue);
final GraphicsConfig config = GraphicsUtil.setupAAPainting(g);
g.fillRoundRect(0, 3, getWidth() - 6 -1, getHeight()-6 , (getHeight() - 6), (getHeight() - 6));
config.restore();
setForeground(isSelected() ? deepBlue.darker() : UIUtil.getListForeground(true));
super.paintComponent(g);
}
}
}