/* * 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.Any_type; } 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(); } }