blob: a8cc1658ab3fe23c968c66b234945d9039c39668 [file] [log] [blame]
/*
* Copyright 2000-2012 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.util;
import com.intellij.ide.ui.UISettings;
import com.intellij.ide.util.treeView.NodeRenderer;
import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.NavigationItem;
import com.intellij.navigation.NavigationItemFileStatus;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataProvider;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.markup.EffectType;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.FileStatus;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.problems.WolfTheProblemSolver;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.ui.ColoredListCellRenderer;
import com.intellij.ui.FileColorManager;
import com.intellij.ui.JBColor;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.ui.components.panels.NonOpaquePanel;
import com.intellij.ui.components.panels.OpaquePanel;
import com.intellij.ui.speedSearch.SpeedSearchUtil;
import com.intellij.util.IconUtil;
import com.intellij.util.text.Matcher;
import com.intellij.util.text.MatcherHolder;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
public class NavigationItemListCellRenderer extends OpaquePanel implements ListCellRenderer, MatcherHolder {
private Matcher myMatcher;
public NavigationItemListCellRenderer() {
super(new BorderLayout());
}
@Override
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme();
Font editorFont = new Font(scheme.getEditorFontName(), Font.PLAIN, scheme.getEditorFontSize());
setFont(editorFont);
removeAll();
final boolean hasRightRenderer = UISettings.getInstance().SHOW_ICONS_IN_QUICK_NAVIGATION;
final ModuleRendererFactory factory = ModuleRendererFactory.findInstance(value);
final LeftRenderer left = new LeftRenderer(!hasRightRenderer || !factory.rendersLocationString(), myMatcher);
final Component leftCellRendererComponent = left.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
final Color listBg = leftCellRendererComponent.getBackground();
add(leftCellRendererComponent, BorderLayout.WEST);
setBackground(isSelected ? UIUtil.getListSelectionBackground() : listBg);
if (hasRightRenderer){
final DefaultListCellRenderer moduleRenderer = factory.getModuleRenderer();
final Component rightCellRendererComponent =
moduleRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
((JComponent)rightCellRendererComponent).setOpaque(false);
rightCellRendererComponent.setBackground(listBg);
add(rightCellRendererComponent, BorderLayout.EAST);
final JPanel spacer = new NonOpaquePanel();
final Dimension size = rightCellRendererComponent.getSize();
spacer.setSize(new Dimension((int)(size.width * 0.015 + leftCellRendererComponent.getSize().width * 0.015), size.height));
spacer.setBackground(isSelected ? UIUtil.getListSelectionBackground() : listBg);
add(spacer, BorderLayout.CENTER);
}
return this;
}
@Override
public void setPatternMatcher(final Matcher matcher) {
myMatcher = matcher;
}
protected static Color getBackgroundColor(@Nullable Object value) {
if (value instanceof PsiElement || value instanceof DataProvider) {
final PsiElement psiElement = value instanceof PsiElement
? (PsiElement)value
: CommonDataKeys.PSI_ELEMENT.getData((DataProvider) value);
if (psiElement != null && psiElement.isValid()) {
final FileColorManager fileColorManager = FileColorManager.getInstance(psiElement.getProject());
final Color fileColor = fileColorManager.getRendererBackground(psiElement.getContainingFile());
if (fileColor != null) {
return fileColor;
}
}
}
return UIUtil.getListBackground();
}
private static class LeftRenderer extends ColoredListCellRenderer {
public final boolean myRenderLocation;
private final Matcher myMatcher;
public LeftRenderer(boolean renderLocation, Matcher matcher) {
myRenderLocation = renderLocation;
myMatcher = matcher;
}
@Override
protected void customizeCellRenderer(
JList list,
Object value,
int index,
boolean selected,
boolean hasFocus
) {
Color bgColor = UIUtil.getListBackground();
if (value instanceof PsiElement && !((PsiElement)value).isValid()) {
setIcon(IconUtil.getEmptyIcon(false));
append("Invalid", SimpleTextAttributes.ERROR_ATTRIBUTES);
}
else if (value instanceof NavigationItem) {
NavigationItem element = (NavigationItem)value;
ItemPresentation presentation = element.getPresentation();
assert presentation != null: "PSI elements displayed in choose by name lists must return a non-null value from getPresentation(): element " +
element.toString() + ", class " + element.getClass().getName();
String name = presentation.getPresentableText();
assert name != null: "PSI elements displayed in choose by name lists must return a non-null value from getPresentation().getPresentableName: element " +
element.toString() + ", class " + element.getClass().getName();
Color color = list.getForeground();
boolean isProblemFile = element instanceof PsiElement
&& WolfTheProblemSolver.getInstance(((PsiElement)element).getProject())
.isProblemFile(PsiUtilCore.getVirtualFile((PsiElement)element));
if (element instanceof PsiElement || element instanceof DataProvider) {
final PsiElement psiElement = element instanceof PsiElement
? (PsiElement)element
: CommonDataKeys.PSI_ELEMENT.getData((DataProvider) element);
if (psiElement != null) {
final Project project = psiElement.getProject();
final VirtualFile virtualFile = PsiUtilCore.getVirtualFile(psiElement);
isProblemFile = WolfTheProblemSolver.getInstance(project).isProblemFile(virtualFile);
final FileColorManager fileColorManager = FileColorManager.getInstance(project);
final Color fileColor = fileColorManager.getRendererBackground(psiElement.getContainingFile());
if (fileColor != null) {
bgColor = fileColor;
}
}
}
FileStatus status = NavigationItemFileStatus.get(element);
if (status != FileStatus.NOT_CHANGED) {
color = status.getColor();
}
final TextAttributes textAttributes = NodeRenderer.getSimpleTextAttributes(presentation).toTextAttributes();
if (isProblemFile) {
textAttributes.setEffectType(EffectType.WAVE_UNDERSCORE);
textAttributes.setEffectColor(Color.red);
}
textAttributes.setForegroundColor(color);
SimpleTextAttributes nameAttributes = SimpleTextAttributes.fromTextAttributes(textAttributes);
SpeedSearchUtil.appendColoredFragmentForMatcher(name, this, nameAttributes, myMatcher, bgColor, selected);
setIcon(presentation.getIcon(false));
if (myRenderLocation) {
String containerText = presentation.getLocationString();
if (containerText != null && containerText.length() > 0) {
append(" " + containerText, new SimpleTextAttributes(Font.PLAIN, JBColor.GRAY));
}
}
}
else {
setIcon(IconUtil.getEmptyIcon(false));
append(value == null ? "" : value.toString(), new SimpleTextAttributes(Font.PLAIN, list.getForeground()));
}
setPaintFocusBorder(false);
setBackground(selected ? UIUtil.getListSelectionBackground() : bgColor);
}
}
}