package com.yoursway.swt.scrollbar; import org.eclipse.swt.custom.PaintObjectEvent; import org.eclipse.swt.custom.PaintObjectListener; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.GlyphMetrics; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; public class LineHeightsTool { private StyledText styledText; public LineHeightsTool(StyledText styledText) { if (styledText == null) throw new IllegalArgumentException("styledText is null"); this.styledText = styledText; installListener(); } public LineHeightsTool(Composite parent, int style) { styledText = new StyledText(parent, style); installListener(); } private void installListener() { styledText.addPaintObjectListener(new PaintObjectListener() { public void paintObject(PaintObjectEvent event) { StyleRange style = event.style; int start = style.start; String text = styledText.getText(start, start); event.gc.setFont(style.font); float fontHeight = style.font.getFontData()[0].height; event.gc.drawText(text, event.x, (int) (event.y + style.metrics.ascent - fontHeight), true); } }); } public StyledText styledText() { return styledText; } public void setLineProperties(int start, int length, int pxBeforeLine, int pxAfterLine) { int textLength = styledText.getText().length(); if (start < 0 || start >= textLength || start + length > textLength) throw new AssertionError("start & length are out of bounds"); for (int i = start; i < start + length; i++) { Rectangle bounds = styledText.getTextBounds(i, i); StyleRange oldRange = styledText.getStyleRangeAtOffset(i); Font font = null; if (oldRange == null) { oldRange = new StyleRange(); font = styledText.getFont(); } else { font = oldRange.font; if (font == null) font = styledText.getFont(); } float fontHeight = font.getFontData()[0].height; int ascent = (int) (pxBeforeLine + fontHeight); int descent = pxAfterLine; oldRange.metrics = new GlyphMetrics(ascent, descent, Math.max(4, bounds.width)); // XXX: 4! oldRange.start = i; oldRange.length = 1; styledText.setStyleRange(oldRange); } } }