EOS 2  1.1.0
Einfache Objektbasierte Sprache
SideInformation.java
gehe zur Dokumentation dieser Datei
1 package de.lathanda.eos.common.gui;
2 
3 import static de.lathanda.eos.gui.icons.Icons.*;
4 
5 import java.awt.Color;
6 import java.awt.Dimension;
7 import java.awt.Font;
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;
26 
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;
30 
36 public class SideInformation extends JPanel implements DocumentListener, GuiConfigurationListener, MouseListener {
37  private static final long serialVersionUID = 4837891668872540779L;
38  private SourceCode sourceCode;
39  private JTextComponent component;
40 
41  private int descent;
42  private FontMetrics fontMetrics;
43  private Font font;
44  private int lines;
45  private int width;
46 
47  public SideInformation(JTextComponent component, SourceCode sourceCode) {
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);
52  sourceCode.setSideInformation(this);
53  addMouseListener(this);
54  setFont(GuiToolkit.createFont(Font.SERIF, Font.PLAIN, GuiConfiguration.def.getFontsize()));
55  updateSize();
57  }
58 
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);
63  }
64 
65  private void setWidth(int width) {
66  if (this.width != width) {
67  this.width = width;
68  this.invalidate();
69  }
70  }
71 
72  @Override
73  public void setFont(Font font) {
74  super.setFont(font);
75  this.font = font;
76  fontMetrics = getFontMetrics(font);
77  descent = fontMetrics.getDescent();
78  updateSize();
79  }
80 
81  @Override
82  protected void paintComponent(Graphics g) {
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));
88  int endPosition;
89  try {
90  endPosition = component.viewToModel2D(new Point(0, clip.y + clip.height));
91  } catch (ArrayIndexOutOfBoundsException arioobe) {
92  endPosition = sourceCode.getLength();
93  }
94  int lineNumber = 1;
95  int center = getWidth() / 2;
96  Element root = sourceCode.getDefaultRootElement();
97  while (position <= endPosition) {
98  try {
99  lineNumber = root.getElementIndex(position) + 1;
100  Rectangle2D r = component.modelToView2D(position);
101  if (sourceCode.hasBreakpoint(lineNumber)) {
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);
107  } else {
108  g.setFont(font);
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);
113  }
114  position = Utilities.getRowEnd(component, position) + 1;
115  } catch (BadLocationException e) {
116  break; // or endless loop would occure
117  }
118  }
119  lines = lineNumber;
120  }
121 
122  @Override
123  public void changedUpdate(DocumentEvent e) {
124  repaint();
125  }
126 
127  @Override
128  public void insertUpdate(DocumentEvent e) {
129  repaint();
130  }
131 
132  @Override
133  public void removeUpdate(DocumentEvent e) {
134  repaint();
135  }
136 
137  @Override
138  public Dimension getPreferredSize() {
139  return new Dimension(width, 1000000);
140  }
141 
142  @Override
143  public void fontsizeChanged(int fontsize) {
144  setFont(GuiToolkit.createFont(Font.SERIF, Font.PLAIN, fontsize));
145  }
146 
147  @Override
148  public void mouseClicked(MouseEvent me) {
149  int position = component.viewToModel2D(new Point(0, me.getY()));
150  sourceCode.setToggleBreakpoint(position);
151  repaint();
152  }
153 
154  @Override
155  public void mouseEntered(MouseEvent me) {
156  }
157 
158  @Override
159  public void mouseExited(MouseEvent me) {
160  }
161 
162  @Override
163  public void mousePressed(MouseEvent me) {
164  }
165 
166  @Override
167  public void mouseReleased(MouseEvent me) {
168  }
169 }
static Font createFont(String name, int style, int size)
Definition: GuiToolkit.java:89
synchronized void addConfigurationListener(GuiConfigurationListener cf)
SideInformation(JTextComponent component, SourceCode sourceCode)
void setSideInformation(SideInformation sideInformation)
boolean hasError(int linenumber)
boolean hasBreakpoint(int linenumber)
Impressum