From 9d7d4af3bba455241d1849c8a224e8fd4f1905d7 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 25 Apr 2012 01:29:50 +0200 Subject: [PATCH] move file color functionality to Tree --- .../ide/projectView/impl/ProjectViewTree.java | 79 ++++++------------- .../com/intellij/ui/treeStructure/Tree.java | 30 +++++++ 2 files changed, 56 insertions(+), 53 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewTree.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewTree.java index 98de9e954a42..8ee8f9278ae1 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewTree.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewTree.java @@ -17,21 +17,20 @@ package com.intellij.ide.projectView.impl; import com.intellij.ide.dnd.aware.DnDAwareTree; -import com.intellij.ide.projectView.impl.nodes.BasePsiNode; +import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.ide.util.treeView.NodeRenderer; import com.intellij.openapi.project.Project; -import com.intellij.openapi.wm.impl.content.GraphicsConfig; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiDirectoryContainer; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.ui.FileColorManager; import com.intellij.ui.tabs.FileColorManagerImpl; +import org.jetbrains.annotations.Nullable; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeModel; -import javax.swing.tree.TreePath; import java.awt.*; /** @@ -65,66 +64,40 @@ public abstract class ProjectViewTree extends DnDAwareTree { return super.getToggleClickCount(); } - @Override - protected void paintComponent(Graphics g) { - g.setColor(getBackground()); - g.fillRect(0, 0, getWidth(), getHeight()); - if (isFileColorsEnabled()) { - paintFileColorGutter(g); - } - - super.paintComponent(g); - } - @Override public boolean isFileColorsEnabled() { return FileColorManagerImpl._isEnabled() && FileColorManagerImpl._isEnabledForProjectView(); } - protected void paintFileColorGutter(final Graphics g) { - final GraphicsConfig config = new GraphicsConfig(g); - final Rectangle rect = getVisibleRect(); - final int firstVisibleRow = getClosestRowForLocation(rect.x, rect.y); - final int lastVisibleRow = getClosestRowForLocation(rect.x, rect.y + rect.height); + @Nullable + @Override + protected Color getFileColorFor(Object object) { + Color color = null; + if (object instanceof AbstractTreeNode) { + final Object element = ((AbstractTreeNode)object).getValue(); + if (element instanceof PsiElement) { + final PsiElement psi = (PsiElement)element; + final Project project = psi.getProject(); + final PsiFile file = psi.getContainingFile(); - for (int row = firstVisibleRow; row <= lastVisibleRow; row++) { - final TreePath path = getPathForRow(row); - final Rectangle bounds = getRowBounds(row); - final Object component = path.getLastPathComponent(); - final Object object = ((DefaultMutableTreeNode)component).getUserObject(); - - if (object instanceof BasePsiNode) { - final Object element = ((BasePsiNode)object).getValue(); - Color color = null; - if (element instanceof PsiElement) { - final PsiElement psi = (PsiElement)element; - final Project project = psi.getProject(); - final PsiFile file = psi.getContainingFile(); - - if (file != null) { - color = FileColorManager.getInstance(project).getFileColor(file); - } else if (psi instanceof PsiDirectory) { - color = FileColorManager.getInstance(project).getFileColor(((PsiDirectory)psi).getVirtualFile()); - } else if (psi instanceof PsiDirectoryContainer) { - final PsiDirectory[] dirs = ((PsiDirectoryContainer)psi).getDirectories(); - for (PsiDirectory dir : dirs) { - Color c = FileColorManager.getInstance(project).getFileColor(dir.getVirtualFile()); - if (c != null && color == null) { - color = c; - } else if (c != null && color != null) { - color = null; - break; - } + if (file != null) { + color = FileColorManager.getInstance(project).getFileColor(file); + } else if (psi instanceof PsiDirectory) { + color = FileColorManager.getInstance(project).getFileColor(((PsiDirectory)psi).getVirtualFile()); + } else if (psi instanceof PsiDirectoryContainer) { + final PsiDirectory[] dirs = ((PsiDirectoryContainer)psi).getDirectories(); + for (PsiDirectory dir : dirs) { + Color c = FileColorManager.getInstance(project).getFileColor(dir.getVirtualFile()); + if (c != null && color == null) { + color = c; + } else if (c != null && color != null) { + color = null; + break; } } } - - if (color != null) { - g.setColor(color); - g.fillRect(0, bounds.y, getWidth(), bounds.height); - } } } - config.restore(); + return color; } } diff --git a/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java b/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java index ce554a30b2fe..6537c8c6b7f5 100644 --- a/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java +++ b/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java @@ -282,10 +282,40 @@ public class Tree extends JTree implements ComponentWithEmptyText, ComponentWith paintNodeContent(g); } + if (isFileColorsEnabled()) { + paintFileColorGutter(g); + } + super.paintComponent(g); myEmptyText.paint(this, g); } + protected void paintFileColorGutter(final Graphics g) { + final GraphicsConfig config = new GraphicsConfig(g); + final Rectangle rect = getVisibleRect(); + final int firstVisibleRow = getClosestRowForLocation(rect.x, rect.y); + final int lastVisibleRow = getClosestRowForLocation(rect.x, rect.y + rect.height); + + for (int row = firstVisibleRow; row <= lastVisibleRow; row++) { + final TreePath path = getPathForRow(row); + final Rectangle bounds = getRowBounds(row); + final Object component = path.getLastPathComponent(); + final Object object = ((DefaultMutableTreeNode)component).getUserObject(); + + Color color = getFileColorFor(object); + if (color != null) { + g.setColor(color); + g.fillRect(0, bounds.y, getWidth(), bounds.height); + } + } + config.restore(); + } + + @Nullable + protected Color getFileColorFor(Object object) { + return null; + } + @Override protected void processKeyEvent(KeyEvent e) { super.processKeyEvent(e);