blob: 30e154a28d73265f527e00093730317828d82e53 [file] [log] [blame]
/*
* Copyright 2000-2011 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.errorTreeView;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.changes.issueLinks.ClickableTreeCellRenderer;
import com.intellij.openapi.vcs.changes.issueLinks.TreeNodePartListener;
import com.intellij.ui.CustomizeColoredTreeCellRenderer;
import com.intellij.ui.MultilineTreeCellRenderer;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeCellRenderer;
import java.awt.*;
public class NewErrorTreeRenderer extends MultilineTreeCellRenderer {
private final MyWrapperRenderer myWrapperRenderer;
private final CallingBackColoredTreeCellRenderer myColoredTreeCellRenderer;
private final MyNotSelectedColoredTreeCellRenderer myRightCellRenderer;
private NewErrorTreeRenderer() {
myColoredTreeCellRenderer = new CallingBackColoredTreeCellRenderer();
myRightCellRenderer = new MyNotSelectedColoredTreeCellRenderer();
myWrapperRenderer = new MyWrapperRenderer(myColoredTreeCellRenderer, myRightCellRenderer);
}
public static JScrollPane install(JTree tree) {
final NewErrorTreeRenderer renderer = new NewErrorTreeRenderer();
//new TreeLinkMouseListener(renderer.myColoredTreeCellRenderer).install(tree);
new TreeNodePartListener(renderer.myRightCellRenderer).installOn(tree);
return MultilineTreeCellRenderer.installRenderer(tree, renderer);
}
@Override
public Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean selected,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
final ErrorTreeElement element = getElement(value);
if (element != null) {
final CustomizeColoredTreeCellRenderer leftSelfRenderer = element.getLeftSelfRenderer();
final CustomizeColoredTreeCellRenderer rightSelfRenderer = element.getRightSelfRenderer();
if (leftSelfRenderer != null || rightSelfRenderer != null) {
myColoredTreeCellRenderer.setCurrentCallback(leftSelfRenderer);
myRightCellRenderer.setCurrentCallback(rightSelfRenderer);
return myWrapperRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
}
}
return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
}
private static class MyNotSelectedColoredTreeCellRenderer extends SimpleColoredComponent implements ClickableTreeCellRenderer {
private CustomizeColoredTreeCellRenderer myCurrentCallback;
public Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean selected,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
if (myCurrentCallback instanceof CustomizeColoredTreeCellRendererReplacement) {
return ((CustomizeColoredTreeCellRendererReplacement)myCurrentCallback)
.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
}
clear();
setBackground(UIUtil.getBgFillColor(tree));
if (myCurrentCallback != null) {
myCurrentCallback.customizeCellRenderer(this, tree, value, selected, expanded, leaf, row, hasFocus);
}
if (getFont() == null) {
setFont(tree.getFont());
}
return this;
}
@Nullable
public Object getTag() {
return myCurrentCallback == null? null : myCurrentCallback.getTag();
}
public void setCurrentCallback(final CustomizeColoredTreeCellRenderer currentCallback) {
myCurrentCallback = currentCallback;
}
}
private static class MyWrapperRenderer implements TreeCellRenderer {
private final TreeCellRenderer myLeft;
private final TreeCellRenderer myRight;
private final JPanel myPanel;
public TreeCellRenderer getLeft() {
return myLeft;
}
public TreeCellRenderer getRight() {
return myRight;
}
public MyWrapperRenderer(final TreeCellRenderer left, final TreeCellRenderer right) {
myLeft = left;
myRight = right;
myPanel = new JPanel(new BorderLayout());
}
public Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean selected,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
myPanel.removeAll();
myPanel.setBackground(tree.getBackground());
myPanel.add(myLeft.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus), BorderLayout.WEST);
myPanel.add(myRight.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus), BorderLayout.EAST);
return myPanel;
}
}
@NotNull
public static String calcPrefix(@Nullable ErrorTreeElement element) {
if(element instanceof SimpleMessageElement || element instanceof NavigatableMessageElement) {
String prefix = element.getKind().getPresentableText();
if (element instanceof NavigatableMessageElement) {
String rendPrefix = ((NavigatableMessageElement)element).getRendererTextPrefix();
if (!StringUtil.isEmpty(rendPrefix)) prefix += rendPrefix + " ";
}
return prefix;
}
return "";
}
protected void initComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
final ErrorTreeElement element = getElement(value);
if(element instanceof GroupingElement) {
setFont(getFont().deriveFont(Font.BOLD));
}
String prefix = calcPrefix(element);
if (element != null) {
String[] text = element.getText();
if (text == null) {
text = ArrayUtil.EMPTY_STRING_ARRAY;
}
if(text.length > 0 && text[0] == null) {
text[0] = "";
}
setText(text, prefix);
}
Icon icon = null;
if (element instanceof GroupingElement) {
final GroupingElement groupingElement = (GroupingElement)element;
icon = groupingElement.getFile() != null ? groupingElement.getFile().getFileType().getIcon() : AllIcons.FileTypes.Java;
}
else if (element instanceof SimpleMessageElement || element instanceof NavigatableMessageElement) {
ErrorTreeElementKind kind = element.getKind();
if (ErrorTreeElementKind.ERROR.equals(kind)) {
icon = AllIcons.General.Error;
}
else if (ErrorTreeElementKind.WARNING.equals(kind) || ErrorTreeElementKind.NOTE.equals(kind)) {
icon = AllIcons.General.Warning;
}
else if (ErrorTreeElementKind.INFO.equals(kind)) {
icon = AllIcons.General.Information;
}
}
setIcon(icon);
}
private static ErrorTreeElement getElement(Object value) {
if (!(value instanceof DefaultMutableTreeNode)) {
return null;
}
final Object userObject = ((DefaultMutableTreeNode)value).getUserObject();
if (!(userObject instanceof ErrorTreeNodeDescriptor)) {
return null;
}
return ((ErrorTreeNodeDescriptor)userObject).getElement();
}
}