package javax.swing.text;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.EventListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList;
public class DefaultCaret extends Rectangle
implements Caret, FocusListener, MouseListener, MouseMotionListener
{
private static final long serialVersionUID = 228155774675466193L;
protected ChangeEvent changeEvent = new ChangeEvent(this);
protected EventListenerList listenerList = new EventListenerList();
private JTextComponent textComponent;
private boolean selectionVisible = true;
private int blinkRate = 0;
private int dot = 0;
private int mark = 0;
private Point magicCaretPosition = null;
private boolean visible = true;
private Object highlightEntry;
public void mouseDragged(MouseEvent event)
{
}
public void mouseMoved(MouseEvent event)
{
}
public void mouseClicked(MouseEvent event)
{
}
public void mouseEntered(MouseEvent event)
{
}
public void mouseExited(MouseEvent event)
{
}
public void mousePressed(MouseEvent event)
{
}
public void mouseReleased(MouseEvent event)
{
}
public void focusGained(FocusEvent event)
{
}
public void focusLost(FocusEvent event)
{
}
protected void moveCaret(MouseEvent event)
{
}
protected void positionCaret(MouseEvent event)
{
}
public void deinstall(JTextComponent c)
{
textComponent.removeFocusListener(this);
textComponent.removeMouseListener(this);
textComponent.removeMouseMotionListener(this);
textComponent = null;
}
public void install(JTextComponent c)
{
textComponent = c;
textComponent.addFocusListener(this);
textComponent.addMouseListener(this);
textComponent.addMouseMotionListener(this);
repaint();
}
public void setMagicCaretPosition(Point p)
{
magicCaretPosition = p;
}
public Point getMagicCaretPosition()
{
return magicCaretPosition;
}
public int getMark()
{
return mark;
}
private void handleHighlight()
{
Highlighter highlighter = textComponent.getHighlighter();
if (highlighter == null)
return;
int p0 = Math.min(dot, mark);
int p1 = Math.max(dot, mark);
if (selectionVisible && p0 != p1)
{
try
{
if (highlightEntry == null)
highlightEntry = highlighter.addHighlight(p0, p1, getSelectionPainter());
else
highlighter.changeHighlight(highlightEntry, p0, p1);
}
catch (BadLocationException e)
{
throw new InternalError();
}
}
else
{
if (highlightEntry != null)
{
highlighter.removeHighlight(highlightEntry);
highlightEntry = null;
}
}
}
public void setSelectionVisible(boolean v)
{
if (selectionVisible == v)
return;
selectionVisible = v;
handleHighlight();
repaint();
}
public boolean isSelectionVisible()
{
return selectionVisible;
}
protected final void repaint()
{
if (textComponent != null)
textComponent.repaint();
}
public void paint(Graphics g)
{
if (textComponent == null)
return;
int dot = getDot();
Rectangle rect = null;
try
{
rect = textComponent.modelToView(dot);
}
catch (BadLocationException e)
{
return;
}
if (rect == null)
return;
if (visible)
{
g.setColor(textComponent.getCaretColor());
g.drawLine(rect.x, rect.y, rect.x, rect.y + rect.height);
}
}
public EventListener[] getListeners(Class listenerType)
{
return listenerList.getListeners(listenerType);
}
public void addChangeListener(ChangeListener listener)
{
listenerList.add(ChangeListener.class, listener);
}
public void removeChangeListener(ChangeListener listener)
{
listenerList.remove(ChangeListener.class, listener);
}
public ChangeListener[] getChangeListeners()
{
return (ChangeListener[]) getListeners(ChangeListener.class);
}
protected void fireStateChanged()
{
ChangeListener[] listeners = getChangeListeners();
for (int index = 0; index < listeners.length; ++index)
listeners[index].stateChanged(changeEvent);
}
protected final JTextComponent getComponent()
{
return textComponent;
}
public int getBlinkRate()
{
return blinkRate;
}
public void setBlinkRate(int rate)
{
blinkRate = rate;
}
public int getDot()
{
return dot;
}
public void moveDot(int dot)
{
this.dot = dot;
handleHighlight();
repaint();
}
public void setDot(int dot)
{
this.dot = dot;
this.mark = dot;
handleHighlight();
repaint();
}
public boolean isVisible()
{
return visible;
}
public void setVisible(boolean v)
{
visible = v;
repaint();
}
protected Highlighter.HighlightPainter getSelectionPainter()
{
return DefaultHighlighter.DefaultPainter;
}
}