package rocks.inspectit.ui.rcp.util;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.Bullet;
import org.eclipse.swt.custom.LineStyleEvent;
import org.eclipse.swt.custom.LineStyleListener;
import org.eclipse.swt.custom.ST;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.GlyphMetrics;
import org.eclipse.swt.widgets.Display;
/**
* LineStyleListener for {@link StyledText} that draws line numbers.
*
* @author Alexander Wert
*
*/
public class LineNumbersStyleListener implements LineStyleListener {
/**
* Text to apply the line style to.
*/
private StyledText styledText;
/**
* Constructor.
*
* @param styledText
* Text to apply the line style to.
*/
public LineNumbersStyleListener(StyledText styledText) {
super();
this.styledText = styledText;
this.styledText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
// redraw line numbers
LineNumbersStyleListener.this.styledText.redraw();
}
});
}
@Override
public void lineGetStyle(LineStyleEvent event) {
StyleRange range = new StyleRange();
range.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_GRAY);
int maxNumLine = styledText.getLineCount();
int bulletLength = Integer.toString(maxNumLine).length();
// right padding
int widthBullet = ((bulletLength + 1) * styledText.getLineHeight()) / 2;
range.metrics = new GlyphMetrics(0, 0, widthBullet);
event.bullet = new Bullet(ST.BULLET_TEXT, range);
event.bullet.text = String.format("%" + bulletLength + "s", styledText.getLineAtOffset(event.lineOffset) + 1);
}
/**
* Applies {@link LineNumbersStyleListener} to given text.
*
* @param styledText
* Text to apply the line style to.
*/
public static void apply(StyledText styledText) {
styledText.addLineStyleListener(new LineNumbersStyleListener(styledText));
}
}