/*
* FindBugs - Find Bugs in Java programs
* Copyright (C) 2006, University of Maryland
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307, USA
*/
package edu.umd.cs.findbugs.sourceViewer;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Shape;
import java.util.WeakHashMap;
import javax.swing.text.Element;
import javax.swing.text.ParagraphView;
import javax.swing.text.View;
import edu.umd.cs.findbugs.gui2.Driver;
// Code inspired by http://www.developer.com/java/other/article.php/3318421
class NumberedParagraphView extends ParagraphView {
public final static int NUMBERS_WIDTH= (int) Driver.getFontSize()*3+9;
HighlightInformation highlight;
public NumberedParagraphView(Element e, HighlightInformation highlight) {
super(e);
this.highlight = highlight;
}
// protected void setInsets(short top, short left, short bottom,
// short right) {super.setInsets
// (top,(short)(left+NUMBERS_WIDTH),
// bottom,right);
//}
@Override
public void paint(Graphics g, Shape allocation) {
Rectangle r = (allocation instanceof Rectangle) ?
(Rectangle)allocation : allocation.getBounds();
Color oldColor = g.getColor();
Integer lineNumber = getLineNumber();
Color highlightColor = highlight.getHighlight(lineNumber);
if (highlightColor != null) {
g.setColor(highlightColor);
g.fillRect(r.x, r.y, r.width, r.height);
g.setColor(oldColor);
}
// r.x += NUMBERS_WIDTH;
super.paint(g, r);
FontMetrics metrics = g.getFontMetrics();
g.setColor(Color.GRAY);
String lineNumberString = lineNumber.toString();
int width = metrics.stringWidth(lineNumberString);
int numberX = r.x - width-9 + NUMBERS_WIDTH;
int numberY = r.y + metrics.getAscent();
g.drawString(lineNumberString, numberX, numberY);
g.setColor(oldColor);
// System.out.println("Drawing line for " + lineNumber + " @ " + numberX +"," + numberY);
// r.x -= NUMBERS_WIDTH;
}
public int getPreviousLineCount0() {
int lineCount = 0;
View parent = this.getParent();
int count = parent.getViewCount();
for (int i = 0; i < count; i++) {
if (parent.getView(i) == this) {
break;
}
else {
lineCount += parent.getView(i).getViewCount();
}
}
return lineCount;
}
static WeakHashMap<Element, Integer> elementLineNumberCache = new WeakHashMap<Element, Integer>();
public Integer getLineNumber() {
Element element = this.getElement();
Integer result = elementLineNumberCache.get(element);
if (result != null) return result;
Element parent = element.getParentElement();
int count = parent.getElementCount();
for (int i = 0; i < count; i++) {
elementLineNumberCache.put(parent.getElement(i), i+1);
}
result = elementLineNumberCache.get(element);
if (result != null) return result;
return -1;
}
}