1 33 34 package edu.rice.cs.drjava.ui; 35 36 import java.awt.*; 37 import javax.swing.*; 38 39 import edu.rice.cs.drjava.DrJava; 40 import edu.rice.cs.drjava.config.OptionConstants; 41 42 46 public class LineEnumRule extends JComponent { 47 48 private static final int BORDER_PADDING = 3; 49 50 51 static int SIZE = 35; 52 53 54 private int _increment; 55 56 57 protected DefinitionsPane _pane; 58 59 60 protected FontMetrics _fm; 61 62 protected Font _newFont; 63 64 protected FontMetrics _nfm; 65 66 71 public LineEnumRule(DefinitionsPane p) { 72 _pane = p; 73 _fm = _pane.getFontMetrics(_pane.getFont()); 74 _increment = _fm.getHeight(); 75 76 _newFont = _getLineNumFont(); 77 _nfm = getFontMetrics(_newFont); 78 SIZE = (int) _nfm.getStringBounds("99999", getGraphics()).getWidth() + 3; 80 } 81 82 86 public Dimension getPreferredSize() { 87 return new Dimension( SIZE, (int)_pane.getPreferredSize().getHeight()); 88 } 89 90 94 public void updateFont() { 95 _fm = _pane.getFontMetrics(_pane.getFont()); 96 _newFont = _getLineNumFont(); 97 _nfm = getFontMetrics(_newFont); 99 SIZE = (int) _nfm.getStringBounds("99999", getGraphics()).getWidth() + 3; 101 } 102 103 106 public void paintComponent(Graphics g) { 107 Rectangle drawHere = g.getClipBounds(); 108 109 Color backg = DrJava.getConfig().getSetting 111 (OptionConstants.DEFINITIONS_BACKGROUND_COLOR); 112 g.setColor(backg); 113 g.fillRect(drawHere.x, drawHere.y, drawHere.width, drawHere.height); 114 115 g.setFont(_newFont); 117 Color foreg = DrJava.getConfig().getSetting 118 (OptionConstants.DEFINITIONS_NORMAL_COLOR); 119 g.setColor(foreg); 120 121 int start = (drawHere.y / _increment) * _increment; 123 int end = (((drawHere.y + drawHere.height) / _increment) + 1) * _increment; 124 125 126 int baseline = (int) (( _nfm.getAscent() + _fm.getHeight() - _fm.getDescent())/2.0 ); 127 128 for (int i = start; i < end; i += _increment) { 135 String text = Integer.toString(i/_increment +1); 139 140 SIZE = (int) _nfm.getStringBounds("99999", g).getWidth() + BORDER_PADDING; 143 int offset = SIZE - ((int) (_nfm.getStringBounds(text, g).getWidth() + 1)); 144 145 if (text != null) { 147 g.drawString(text, offset, i + baseline + 3); 150 } 151 } 152 } 153 154 159 private Font _getLineNumFont() { 160 Font lnf = DrJava.getConfig().getSetting(OptionConstants.FONT_LINE_NUMBERS); 161 FontMetrics mets = getFontMetrics(lnf); 162 Font mainFont = _pane.getFont(); 163 164 if (mets.getHeight() > _fm.getHeight()) { 166 float newSize; 170 if (lnf.getSize() > mainFont.getSize()) { 171 newSize = mainFont.getSize2D(); 172 } 173 else { 175 newSize = lnf.getSize2D() - 1f; 176 } 177 178 do { 180 lnf = lnf.deriveFont(newSize); 181 mets = getFontMetrics(lnf); 182 newSize -= 1f; 183 } while (mets.getHeight() > _fm.getHeight()); 184 } 185 186 return lnf; 187 } 188 } 189 | Popular Tags |