blob: bea5cd2f42555c41611f51eba008ebd0c601ee78 [file] [log] [blame]
/*
* 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;
}
}