StyledText
行が折り返されていても、テキストフィールドで行番号を表示する簡単な方法があるかどうか疑問に思いました。私は自分のアプリケーションでそれを使用していますが、コンテンツが大きくなった場合は、いくつかの行番号がいいでしょう。
ありがとうございました。
StyledText
行が折り返されていても、テキストフィールドで行番号を表示する簡単な方法があるかどうか疑問に思いました。私は自分のアプリケーションでそれを使用していますが、コンテンツが大きくなった場合は、いくつかの行番号がいいでしょう。
ありがとうございました。
キーはorg.eclipse.swt.custom.Bulletです。これは基本的に、行の先頭に追加できる記号(またはこの場合は数字)です。
//text is your StyledText
text.addLineStyleListener(new LineStyleListener()
{
public void lineGetStyle(LineStyleEvent e)
{
//Set the line number
e.bulletIndex = text.getLineAtOffset(e.lineOffset);
//Set the style, 12 pixles wide for each digit
StyleRange style = new StyleRange();
style.metrics = new GlyphMetrics(0, 0, Integer.toString(text.getLineCount()+1).length()*12);
//Create and set the bullet
e.bullet = new Bullet(ST.BULLET_NUMBER,style);
}
});
これは私の実用的な実装です。
styledText.addLineStyleListener(new LineStyleListener() {
@Override
public void lineGetStyle(LineStyleEvent event) {
// Using ST.BULLET_NUMBER sometimes results in weird alignment.
//event.bulletIndex = styledText.getLineAtOffset(event.lineOffset);
StyleRange styleRange = new StyleRange();
styleRange.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_GRAY);
int maxLine = styledText.getLineCount();
int bulletLength = Integer.toString(maxLine).length();
// Width of number character is half the height in monospaced font, add 1 character width for right padding.
int bulletWidth = (bulletLength + 1) * styledText.getLineHeight() / 2;
styleRange.metrics = new GlyphMetrics(0, 0, bulletWidth);
event.bullet = new Bullet(ST.BULLET_TEXT, styleRange);
// getLineAtOffset() returns a zero-based line index.
int bulletLine = styledText.getLineAtOffset(event.lineOffset) + 1;
event.bullet.text = String.format("%" + bulletLength + "s", bulletLine);
}
});
styledText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
// For line number redrawing.
styledText.redraw();
}
});
lineGetStyle()は現在画面上にある行でのみ呼び出されるため、redraw()を呼び出すときに構文を強調表示する再計算のオーバーヘッドが許容される可能性が高いことに注意してください。
LineStyleListenerの使用はうまくいくはずだと思います。次のようなもの:
styledText.addLineStyleListener(
new LineStyleListener() {
@Override
public void lineGetStyle(LineStyleEvent event) {
String line = event.lineText;
int lineNumber = event.lineOffset;
// Do stuff to add line numbers
}
}
);
これは、コンテンツが変更されたときに番号を更新する箇条書きを使用する方法です。
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
int maxLine = text.getLineCount();
int lineCountWidth = Math.max(String.valueOf(maxLine).length(), 3);
StyleRange style = new StyleRange();
style.metrics = new GlyphMetrics(0, 0, lineCountWidth * 8 + 5);
Bullet bullet = new Bullet(ST.BULLET_NUMBER, style);
text.setLineBullet(0, text.getLineCount(), null);
text.setLineBullet(0, text.getLineCount(), bullet);
}
});
行番号に色を付けるための補足として:
Device device = Display.getCurrent();
style.background = new Color(device, LINE_NUMBER_BG);
style.foreground = new Color(device, LINE_NUMBER_FG);
ここでLINE_NUMBER_BG
、およびLINE_NUMBER_FG
は次のようなRGBオブジェクトである可能性があります。
final RGB LINE_NUMBER_BG = new RBG(160, 80, 0); // brown
final RGB LINE_NUMBER_FG = new RGB(255, 255, 255); // white