package com.jetbrains.actionscript.profiler.base; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.psi.PsiElement; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.ui.FileColorManager; import com.intellij.util.ui.ColumnInfo; import com.jetbrains.actionscript.profiler.util.ResolveUtil; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.table.TableCellRenderer; import javax.swing.tree.DefaultMutableTreeNode; import java.awt.*; import java.util.Map; /** * @author: Fedor.Korotkov */ public class ColoredSortableTreeTable extends BaseSortableTreeTable { @Nullable private final Project project; @Nullable private final ProjectFileIndex projectFileIndex; private final Map<String, Color> qName2ColorCache = new THashMap<>(); private final Map<String, Color> path2ColorCache = new THashMap<>(); public ColoredSortableTreeTable(ColumnInfo[] columns, @Nullable Project project) { super(columns); this.project = project; projectFileIndex = project == null ? null : ProjectFileIndex.SERVICE.getInstance(project); } public void clearColorCaches() { qName2ColorCache.clear(); path2ColorCache.clear(); } @NotNull @Override public Component prepareRenderer(@NotNull TableCellRenderer renderer, int row, int column) { final JComponent jComponent = (JComponent)super.prepareRenderer(renderer, row, column); if (jComponent.getBackground() == getSelectionBackground()) { return jComponent; } final Object value = getValueAt(row, 0); Color color = tryGetBackgroundByPath(value); if (color == null) { color = tryGetBackgroundByQName(value); } jComponent.setOpaque(true); jComponent.setBackground(color); return jComponent; } @Nullable private Color tryGetBackgroundByQName(Object value) { QNameProducer qNameProducer = null; if (value instanceof QNameProducer) { qNameProducer = (QNameProducer)value; } if (value instanceof DefaultMutableTreeNode && ((DefaultMutableTreeNode)value).getUserObject() instanceof QNameProducer) { qNameProducer = (QNameProducer)((DefaultMutableTreeNode)value).getUserObject(); } if (project == null || qNameProducer == null || qNameProducer.getQName() == null) { return null; } Color color = qName2ColorCache.get(qNameProducer.getQName()); if (color != null) { return color; } final PsiElement psiElement = ResolveUtil.findClassByQName(qNameProducer.getQName(), GlobalSearchScope.allScope(project)); if (psiElement != null) { color = FileColorManager.getInstance(project).getRendererBackground(psiElement.getContainingFile()); } qName2ColorCache.put(qNameProducer.getQName(), color); return color; } @Nullable private Color tryGetBackgroundByPath(Object value) { FilePathProducer filePathProducer = null; if (value instanceof FilePathProducer) { filePathProducer = (FilePathProducer)value; } if (value instanceof DefaultMutableTreeNode && ((DefaultMutableTreeNode)value).getUserObject() instanceof FilePathProducer) { filePathProducer = (FilePathProducer)((DefaultMutableTreeNode)value).getUserObject(); } if (projectFileIndex == null || filePathProducer == null || filePathProducer.getFilePath() == null) { return null; } Color color = path2ColorCache.get(filePathProducer.getFilePath()); final VirtualFile vf = VirtualFileManager.getInstance().findFileByUrl(VfsUtil.pathToUrl(filePathProducer.getFilePath())); if (vf != null && projectFileIndex.isInSource(vf)) { color = FileColorManager.getInstance(project).getRendererBackground(vf); } path2ColorCache.put(filePathProducer.getFilePath(), color); return color; } }