| /* |
| * Copyright 2000-2009 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.todo.nodes; |
| |
| import com.intellij.ide.IdeBundle; |
| import com.intellij.ide.projectView.PresentationData; |
| import com.intellij.ide.projectView.ViewSettings; |
| import com.intellij.ide.projectView.impl.ProjectRootsUtil; |
| import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode; |
| import com.intellij.ide.todo.HighlightedRegionProvider; |
| import com.intellij.ide.todo.TodoTreeBuilder; |
| import com.intellij.ide.todo.TodoTreeStructure; |
| import com.intellij.ide.util.treeView.AbstractTreeNode; |
| import com.intellij.openapi.editor.colors.EditorColorsScheme; |
| import com.intellij.openapi.editor.markup.TextAttributes; |
| import com.intellij.openapi.ide.CopyPasteManager; |
| import com.intellij.openapi.project.IndexNotReadyException; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.roots.ProjectRootManager; |
| import com.intellij.openapi.vcs.FileStatusManager; |
| import com.intellij.openapi.vfs.VirtualFile; |
| import com.intellij.psi.PsiDirectory; |
| import com.intellij.psi.PsiFile; |
| import com.intellij.psi.impl.file.DirectoryIconProvider; |
| import com.intellij.ui.HighlightedRegion; |
| import com.intellij.usageView.UsageTreeColors; |
| import com.intellij.usageView.UsageTreeColorsScheme; |
| |
| import java.awt.*; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Iterator; |
| |
| public final class TodoDirNode extends PsiDirectoryNode implements HighlightedRegionProvider { |
| private final ArrayList<HighlightedRegion> myHighlightedRegions; |
| private final TodoTreeBuilder myBuilder; |
| |
| |
| public TodoDirNode(Project project, |
| PsiDirectory directory, |
| TodoTreeBuilder builder) { |
| super(project, directory, ViewSettings.DEFAULT); |
| myBuilder = builder; |
| myHighlightedRegions = new ArrayList<HighlightedRegion>(2); |
| } |
| |
| @Override |
| public ArrayList<HighlightedRegion> getHighlightedRegions() { |
| return myHighlightedRegions; |
| } |
| |
| @Override |
| protected void updateImpl(PresentationData data) { |
| super.updateImpl(data); |
| int fileCount = getFileCount(getValue()); |
| if (getValue() == null || !getValue().isValid() || fileCount == 0) { |
| setValue(null); |
| return; |
| } |
| |
| VirtualFile directory = getValue().getVirtualFile(); |
| boolean isProjectRoot = !ProjectRootManager.getInstance(getProject()).getFileIndex().isInContent(directory); |
| String newName = isProjectRoot || getStructure().getIsFlattenPackages() ? getValue().getVirtualFile().getPresentableUrl() : getValue().getName(); |
| |
| int nameEndOffset = newName.length(); |
| int todoItemCount = getTodoItemCount(getValue()); |
| newName = IdeBundle.message("node.todo.group", newName, todoItemCount, fileCount); |
| |
| myHighlightedRegions.clear(); |
| |
| TextAttributes textAttributes = new TextAttributes(); |
| Color newColor = FileStatusManager.getInstance(getProject()).getStatus(getValue().getVirtualFile()).getColor(); |
| |
| if (CopyPasteManager.getInstance().isCutElement(getValue())) { |
| newColor = CopyPasteManager.CUT_COLOR; |
| } |
| textAttributes.setForegroundColor(newColor); |
| myHighlightedRegions.add(new HighlightedRegion(0, nameEndOffset, textAttributes)); |
| |
| EditorColorsScheme colorsScheme = UsageTreeColorsScheme.getInstance().getScheme(); |
| myHighlightedRegions.add( |
| new HighlightedRegion(nameEndOffset, newName.length(), colorsScheme.getAttributes(UsageTreeColors.NUMBER_OF_USAGES))); |
| |
| data.setPresentableText(newName); |
| } |
| |
| @Override |
| protected void setupIcon(PresentationData data, PsiDirectory psiDirectory) { |
| final VirtualFile virtualFile = psiDirectory.getVirtualFile(); |
| if (ProjectRootsUtil.isModuleContentRoot(virtualFile, psiDirectory.getProject())) { |
| data.setIcon(patchIcon(new DirectoryIconProvider().getIcon(psiDirectory, 0), virtualFile)); |
| } else { |
| super.setupIcon(data, psiDirectory); |
| } |
| } |
| |
| private TodoTreeStructure getStructure() { |
| return myBuilder.getTodoTreeStructure(); |
| } |
| |
| @Override |
| public Collection<AbstractTreeNode> getChildrenImpl() { |
| return TodoTreeHelper.getInstance(getProject()).getDirectoryChildren(getValue(), myBuilder, getSettings().isFlattenPackages()); |
| } |
| |
| public int getFileCount(PsiDirectory directory) { |
| Iterator<PsiFile> iterator = myBuilder.getFiles(directory); |
| int count = 0; |
| try { |
| while (iterator.hasNext()) { |
| PsiFile psiFile = iterator.next(); |
| if (getStructure().accept(psiFile)) { |
| count++; |
| } |
| } |
| } |
| catch (IndexNotReadyException e) { |
| return count; |
| } |
| return count; |
| } |
| |
| public int getTodoItemCount(PsiDirectory directory) { |
| if (TodoTreeHelper.getInstance(getProject()).skipDirectory(directory)) { |
| return 0; |
| } |
| int count = 0; |
| Iterator<PsiFile> iterator = myBuilder.getFiles(directory); |
| while (iterator.hasNext()) { |
| PsiFile psiFile = iterator.next(); |
| count += getStructure().getTodoItemCount(psiFile); |
| } |
| return count; |
| } |
| |
| @Override |
| public int getWeight() { |
| return 2; |
| } |
| |
| |
| } |