package hr.fer.zemris.vhdllab.applets.texteditor.misc;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;
import javax.swing.text.Utilities;
/**
* Razred koji predstavlja komponentu koja se moze upariti s nekim
* {@link JEditorPane}-om i koja ce za njega prikazivati brojeve redaka
* uz posebno istaknut redak u kojem je kursor.
*
* @author marcupic
*
*/
public class LineNumbers extends JComponent {
/**
*
*/
private static final long serialVersionUID = 1L;
private JEditorPane textPane;
private int prefWidth;
private JViewport viewport;
public static LineNumbers createInstance(JEditorPane textPane, JScrollPane scrollPane, int prefWidth) {
JViewport vp = new JViewport();
LineNumbers ln = new LineNumbers(textPane, vp, prefWidth);
vp.setView(ln);
scrollPane.setRowHeader(vp);
return ln;
}
public LineNumbers(JEditorPane textPane, JViewport viewport, int prefWidth) {
this.textPane = textPane;
this.prefWidth = prefWidth;
this.viewport = viewport;
setPreferredSize(new Dimension(prefWidth,30));
textPane.addCaretListener(new CaretListener() {
@Override
public void caretUpdate(CaretEvent e) {
LineNumbers.this.repaint();
}
});
textPane.addComponentListener(new ComponentListener() {
@Override
public void componentShown(ComponentEvent e) {
}
@Override
public void componentResized(ComponentEvent e) {
int h = e.getComponent().getHeight();
if(h<1) return;
setSize(LineNumbers.this.prefWidth, h);
setPreferredSize(new Dimension(LineNumbers.this.prefWidth, h));
revalidate();
}
@Override
public void componentMoved(ComponentEvent e) {
}
@Override
public void componentHidden(ComponentEvent e) {
}
});
}
@Override
protected void paintComponent(Graphics g) {
Rectangle drawHere = viewport.getViewRect();
Font font = textPane.getFont();
g.setFont(font);
FontMetrics fm = g.getFontMetrics();
int fh = fm.getHeight();
g.setColor(new Color(230, 163, 4));
g.fillRect(drawHere.x, drawHere.y, drawHere.width, drawHere.height);
g.setColor(new Color(100, 100, 100));
g.drawLine(drawHere.x+drawHere.width-1, drawHere.y, drawHere.x+drawHere.width-1, drawHere.y+drawHere.height);
g.setFont(new Font("SansSerif", Font.PLAIN, 10));
g.setColor(Color.black);
fm = g.getFontMetrics();
int caretRow = getCaretRow(textPane, textPane.getCaret().getDot());
int prviVidljivi = drawHere.y / fh + 1;
g.setColor(Color.BLACK);
for(int i = prviVidljivi; ; i++) {
int y = (i)*fh;
if(y>drawHere.height+drawHere.y) break;
if(i==caretRow) {
g.setColor(new Color(255,235,235));
}
String s = Integer.toString(i);
g.drawString(s, getWidth()-3-fm.stringWidth(s), y);
if(i==caretRow) {
g.setColor(Color.BLACK);
}
}
}
public int getCaretRow(JTextComponent editor, int pos) {
int rn = (pos==0) ? 1 : 0;
try {
int offs=pos;
while( offs>0) {
offs=Utilities.getRowStart(editor, offs)-1;
rn++;
}
} catch (BadLocationException e) {
e.printStackTrace();
}
return rn;
}
}