1 package de.lathanda.eos.common.gui;
3 import static de.lathanda.eos.gui.icons.Icons.*;
6 import java.awt.Dimension;
8 import java.awt.FontMetrics;
9 import java.awt.Graphics;
10 import java.awt.Insets;
11 import java.awt.Point;
12 import java.awt.Rectangle;
13 import java.awt.event.MouseEvent;
14 import java.awt.event.MouseListener;
15 import java.awt.geom.Rectangle2D;
16 import javax.swing.JPanel;
17 import javax.swing.border.CompoundBorder;
18 import javax.swing.border.EmptyBorder;
19 import javax.swing.border.MatteBorder;
20 import javax.swing.event.DocumentEvent;
21 import javax.swing.event.DocumentListener;
22 import javax.swing.text.BadLocationException;
23 import javax.swing.text.Element;
24 import javax.swing.text.JTextComponent;
25 import javax.swing.text.Utilities;
27 import de.lathanda.eos.base.util.GuiToolkit;
28 import de.lathanda.eos.common.gui.GuiConfiguration.GuiConfigurationListener;
29 import de.lathanda.eos.gui.icons.Icons;
37 private static final long serialVersionUID = 4837891668872540779L;
39 private JTextComponent component;
42 private FontMetrics fontMetrics;
48 this.component = component;
49 this.sourceCode = sourceCode;
50 setBorder(
new CompoundBorder(
new MatteBorder(0, 0, 0, 2, Color.GRAY),
new EmptyBorder(0, 5, 0, 5)));
51 sourceCode.addDocumentListener(
this);
53 addMouseListener(
this);
59 private void updateSize() {
60 int digits = Math.max(String.valueOf(lines).length(), 3);
61 Insets insets = getInsets();
62 setWidth(insets.left + insets.right + fontMetrics.charWidth(
'0') * digits);
65 private void setWidth(
int width) {
66 if (this.width != width) {
76 fontMetrics = getFontMetrics(font);
77 descent = fontMetrics.getDescent();
83 super.paintComponent(g);
84 Rectangle clip = g.getClipBounds();
85 Insets insets = getInsets();
86 int rightBorder = getWidth() - insets.right;
87 int position = component.viewToModel2D(
new Point(0, clip.y));
90 endPosition = component.viewToModel2D(
new Point(0, clip.y + clip.height));
91 }
catch (ArrayIndexOutOfBoundsException arioobe) {
92 endPosition = sourceCode.getLength();
95 int center = getWidth() / 2;
96 Element root = sourceCode.getDefaultRootElement();
97 while (position <= endPosition) {
99 lineNumber = root.getElementIndex(position) + 1;
100 Rectangle2D r = component.modelToView2D(position);
102 g.drawImage(BREAKPOINT, (
int) (center - r.getHeight() / 2), (
int) r.getY(),
103 (
int) r.getHeight(), (
int) r.getHeight(),
null);
104 }
else if (sourceCode.
hasError(lineNumber)) {
105 g.drawImage(
Icons.
ERROR, (
int) (center - r.getHeight() / 2), (
int) (r.getY()), (
int) r.getHeight(),
106 (
int) r.getHeight(),
null);
109 int stringWidth = fontMetrics.stringWidth(String.valueOf(lineNumber));
110 int x = rightBorder - stringWidth;
111 int y = (int) (r.getY() + r.getHeight() - descent);
112 g.drawString(String.valueOf(lineNumber), x, y);
114 position = Utilities.getRowEnd(component, position) + 1;
115 }
catch (BadLocationException e) {
139 return new Dimension(width, 1000000);
149 int position = component.viewToModel2D(
new Point(0, me.getY()));
synchronized void addConfigurationListener(GuiConfigurationListener cf)
static final GuiConfiguration def
void setSideInformation(SideInformation sideInformation)
boolean hasError(int linenumber)
boolean hasBreakpoint(int linenumber)
void setToggleBreakpoint(int position)