package com.tail;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
public class TextPanel extends JComponent {
private static final long serialVersionUID = 6001973725994078371L;
private Color BACKGROUND_1 = new Color(226,223,239);
private Color BACKGROUND_2 = new Color(209,220,231);
private static final int LINE_HEIGHT=18;
private static final int SEPARATION_LEFT = 4;
private static final int SEPARATION_RIGHT = 4;
private static final int SEPARATION_LINE_SIZE = 1;
//private Color LINE_NUMBER_TEXT_COLOR = new Color(88,190,91);
//private Color TEXT_COLOR = new Color(88,190,91).brighter();
private Color LINE_NUMBER_TEXT_COLOR = Color.GRAY;
private Color TEXT_COLOR = Color.BLACK;
private Font font = new Font("Consolas",Font.BOLD, 12);
private Font fontPlain = new Font("Consolas",Font.PLAIN, 12);
ArrayList<String> document;
FileReader reader;
private Dimension textBounds = new Dimension(0, 0);
private Point viewPortPoint = new Point(0,0);
public TextPanel() {
super();
document = new ArrayList<String>();
setOpaque(true);
setBackground(BACKGROUND_1);
initComponents();
}
public void addLine(String line){
document.add(line);
FontMetrics fm = this.getFontMetrics(font); // or another font
int strw = fm.stringWidth(String.valueOf(document.size()));
int newWidth = strw+SEPARATION_RIGHT+SEPARATION_LEFT+SEPARATION_LINE_SIZE + fm.stringWidth(line);
textBounds = new Dimension(Math.max(newWidth, textBounds.width), document.size()*LINE_HEIGHT);
this.repaint();
}
public void updateLines(int firsLine, List<String> lines){
}
public void addLines(ArrayList<String> lines){
document.addAll(lines);
FontMetrics fm = this.getFontMetrics(font);
int strw = fm.stringWidth(String.valueOf(document.size()));
int finalWidth = 0;
for (String line : lines){
int newWidth = strw+SEPARATION_RIGHT+SEPARATION_LEFT+SEPARATION_LINE_SIZE+ fm.stringWidth(line);
finalWidth = Math.max(finalWidth, newWidth);
}
textBounds = new Dimension(Math.max(finalWidth, textBounds.width), document.size()*LINE_HEIGHT);
this.repaint();
}
@Override
protected void paintComponent(Graphics g) {
Rectangle rect=g.getClipBounds();
((Graphics2D)g).setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
((Graphics2D)g).setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
g.setColor(Color.WHITE);
g.fillRect(rect.x,rect.y,rect.width,rect.height);
if (document.isEmpty()){
return;
}
int separation = (int)font.getStringBounds(String.valueOf(document.size()), ((Graphics2D)g).getFontRenderContext()).getWidth();
int cont=viewPortPoint.y/LINE_HEIGHT;
int posy=0;
int tope;
if (textBounds.height > (viewPortPoint.y+this.getSize().height)){
tope = this.getSize().height;
}else{
tope = textBounds.height;
}
//pintamos el pijama
while(posy < tope){
posy+=LINE_HEIGHT;
g.setColor(LINE_NUMBER_TEXT_COLOR);
g.setFont(font);
g.drawString(String.valueOf(cont+1), 0,posy-4);
//changeColor=!changeColor;
g.setFont(fontPlain);
g.setColor(TEXT_COLOR);
int stringSeparation = separation+SEPARATION_RIGHT+SEPARATION_LEFT+SEPARATION_LINE_SIZE;
g.drawString(document.get(cont),stringSeparation,posy-4);
cont++;
}
System.out.println("he pintado"+cont);
g.setColor(Color.GRAY);
g.fillRect(separation+SEPARATION_LEFT,rect.y,SEPARATION_LINE_SIZE,rect.height);
}
private void initComponents(){
this.addMouseWheelListener(new MouseAdapter() {
@Override
public void mouseWheelMoved(MouseWheelEvent arg0) {
System.out.println("qu� pasa t�o");
Dimension dim = TextPanel.this.getSize();
if ((dim.height+viewPortPoint.y)<textBounds.height){
viewPortPoint.translate(0, arg0.getWheelRotation()*LINE_HEIGHT);
TextPanel.this.repaint();
}
}
});
this.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent arg0) {
System.out.println("me muevo");
if (!TextPanel.this.isFocusOwner()){
TextPanel.this.requestFocusInWindow();
System.out.println("me HAGO due�o Y SE�OR DEL FOCO");
}
}
@Override
public void mouseDragged(MouseEvent arg0) {
System.out.println("dragueando"+System.currentTimeMillis());
}
});
this.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent arg0) {
if (arg0.getKeyCode()==KeyEvent.VK_PAGE_DOWN){
int y = viewPortPoint.y+TextPanel.this.getSize().height;
if (y>textBounds.height){
y = textBounds.height- TextPanel.this.getSize().height;
}
viewPortPoint.setLocation(0, y);
TextPanel.this.repaint();
}else if(arg0.getKeyCode()==KeyEvent.VK_PAGE_UP){
int y = viewPortPoint.y-TextPanel.this.getSize().height;
if (y<0){
y = 0;
}
viewPortPoint.setLocation(0, y);
TextPanel.this.repaint();
}
}
});
}
}