| /* |
| * 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.projectView.PresentationData; |
| import com.intellij.ide.todo.HighlightedRegionProvider; |
| import com.intellij.ide.todo.SmartTodoItemPointer; |
| import com.intellij.ide.todo.TodoTreeBuilder; |
| import com.intellij.ide.util.treeView.AbstractTreeNode; |
| import com.intellij.openapi.diagnostic.Logger; |
| import com.intellij.openapi.editor.Document; |
| import com.intellij.openapi.editor.RangeMarker; |
| import com.intellij.openapi.editor.highlighter.EditorHighlighter; |
| import com.intellij.openapi.editor.highlighter.HighlighterIterator; |
| import com.intellij.openapi.editor.markup.TextAttributes; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.psi.search.TodoItem; |
| import com.intellij.ui.HighlightedRegion; |
| import org.jetbrains.annotations.NotNull; |
| |
| import javax.swing.*; |
| import java.awt.*; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| |
| public final class TodoItemNode extends BaseToDoNode<SmartTodoItemPointer> implements HighlightedRegionProvider{ |
| private static final Logger LOG=Logger.getInstance("#com.intellij.ide.toDo.TodoItemNodeDescriptor"); |
| |
| private final ArrayList<HighlightedRegion> myHighlightedRegions; |
| |
| public TodoItemNode(Project project, |
| SmartTodoItemPointer value, |
| TodoTreeBuilder builder) { |
| super(project, value, builder); |
| RangeMarker rangeMarker = getValue().getRangeMarker(); |
| LOG.assertTrue(rangeMarker.isValid()); |
| |
| myHighlightedRegions=new ArrayList<HighlightedRegion>(); |
| |
| } |
| |
| @Override |
| public int getFileCount(final SmartTodoItemPointer val) { |
| return 1; |
| } |
| |
| @Override |
| public int getTodoItemCount(final SmartTodoItemPointer val) { |
| return 1; |
| } |
| |
| @Override |
| public ArrayList<HighlightedRegion> getHighlightedRegions(){ |
| return myHighlightedRegions; |
| } |
| |
| @Override |
| @NotNull |
| public Collection<AbstractTreeNode> getChildren() { |
| return Collections.emptyList(); |
| } |
| |
| @Override |
| public void update(PresentationData presentation) { |
| TodoItem todoItem=getValue().getTodoItem(); |
| RangeMarker myRangeMarker=getValue().getRangeMarker(); |
| if(!todoItem.getFile().isValid()||!myRangeMarker.isValid()){ |
| setValue(null); |
| return; |
| } |
| |
| myHighlightedRegions.clear(); |
| |
| // Update name |
| |
| Document document=getValue().getDocument(); |
| CharSequence chars = document.getCharsSequence(); |
| int startOffset=myRangeMarker.getStartOffset(); |
| int endOffset=myRangeMarker.getEndOffset(); |
| |
| LOG.assertTrue(startOffset>-1); |
| LOG.assertTrue(startOffset<=document.getTextLength()); |
| LOG.assertTrue(endOffset>-1); |
| LOG.assertTrue(endOffset<document.getTextLength()+1); |
| |
| int lineNumber = document.getLineNumber(startOffset); |
| LOG.assertTrue(lineNumber>-1); |
| LOG.assertTrue(lineNumber<document.getLineCount()); |
| |
| int lineStartOffset = document.getLineStartOffset(lineNumber); |
| LOG.assertTrue(lineStartOffset>-1); |
| LOG.assertTrue(lineStartOffset<=startOffset); |
| LOG.assertTrue(lineStartOffset<=document.getTextLength()); |
| |
| int columnNumber=startOffset-lineStartOffset; |
| LOG.assertTrue(columnNumber>-1); |
| |
| // skip all white space characters |
| |
| while(chars.charAt(lineStartOffset) == '\t' || chars.charAt(lineStartOffset)==' '){ |
| lineStartOffset++; |
| } |
| |
| int lineEndOffset = document.getLineEndOffset(lineNumber); |
| LOG.assertTrue(lineEndOffset>=0); |
| LOG.assertTrue(lineEndOffset<=document.getTextLength()); |
| |
| String lineColumnPrefix="("+(lineNumber+1)+", "+(columnNumber+1)+") "; |
| |
| String highlightedText = chars.subSequence(lineStartOffset, Math.min(lineEndOffset, chars.length())).toString();; |
| |
| String newName=lineColumnPrefix+highlightedText; |
| |
| // Update icon |
| |
| Icon newIcon=todoItem.getPattern().getAttributes().getIcon(); |
| |
| // Update highlighted regions |
| |
| myHighlightedRegions.clear(); |
| EditorHighlighter highlighter = myBuilder.getHighlighter(todoItem.getFile(),document); |
| HighlighterIterator iterator=highlighter.createIterator(lineStartOffset); |
| while(!iterator.atEnd()){ |
| int start=Math.max(iterator.getStart(),lineStartOffset); |
| int end=Math.min(iterator.getEnd(),lineEndOffset); |
| if(lineEndOffset<start||lineEndOffset<end){ |
| break; |
| } |
| TextAttributes attributes=iterator.getTextAttributes(); |
| int fontType = attributes.getFontType(); |
| if ((fontType & Font.BOLD) != 0){ // suppress bold attribute |
| attributes = attributes.clone(); |
| attributes.setFontType(fontType & ~Font.BOLD); |
| } |
| HighlightedRegion region=new HighlightedRegion( |
| lineColumnPrefix.length()+start-lineStartOffset, |
| lineColumnPrefix.length()+end-lineStartOffset, |
| attributes |
| ); |
| myHighlightedRegions.add(region); |
| iterator.advance(); |
| } |
| |
| TextAttributes attributes=todoItem.getPattern().getAttributes().getTextAttributes(); |
| HighlightedRegion region=new HighlightedRegion( |
| lineColumnPrefix.length()+startOffset-lineStartOffset, |
| lineColumnPrefix.length()+endOffset-lineStartOffset, |
| attributes |
| ); |
| myHighlightedRegions.add(region); |
| |
| // |
| |
| presentation.setPresentableText(newName); |
| presentation.setIcon(newIcon); |
| } |
| |
| @Override |
| public String getTestPresentation() { |
| return "Item: "+getValue().getTodoItem().getTextRange(); |
| } |
| |
| @Override |
| public int getWeight() { |
| return 5; |
| } |
| } |