2012-06-15 7 views
8

Ich frage mich, ob es eine direkte Möglichkeit gibt, Zeilennummern mit StyledText Textfeld anzuzeigen - auch wenn Zeilen umgebrochen sind. Ich verwende es in meiner Anwendung und wenn Inhalt zu groß wird, wären einige Zeilennummern nett.Java SWT zeigen Zeilennummern für StyledText

Vielen Dank.

+0

Es gibt keinen wirklich direkten Weg, soweit ich weiß; Sie könnten immer ein nicht editierbares Textfeld links neben Ihrem Texteditor platzieren. – purtip31

+0

Überprüfen Sie die Implementierung der Eclipse-Jungs. –

+0

@Adam Sie verwenden einen 'SourceViewer' wie hier [hier] (http://www.dsource.org/projects/dwt/wiki/JFaceTextExample). Ich habe dieses Beispiel versucht, aber irgendwie konnte ich es nicht richtig laufen lassen. Es hat merkwürdige Sachen zur Laufzeit gemacht. Wie auch immer, ich würde gerne meinen 'StyleText' behalten :) – kon

Antwort

5

Der Schlüssel ist org.eclipse.swt.custom.Bullet. Es ist im Grunde ein Symbol (oder in unserem Fall eine Zahl), die Sie am Anfang einer Zeile hinzufügen können.

//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); 
    } 
}); 
+2

Es funktioniert gut. Es vermisst nur, alle Zeilen neu zu zeichnen, wenn die Gesamtanzahl der Zeilen von 9 auf 10 erhöht wird. Oder wenn eine Zeile in der Mitte der Datei entfernt wird. Vielen Dank. – kon

1

Ich glaube, dass die Verwendung eines LineStyleListener sollte funktionieren. Etwas entlang der Linien von:

styledText.addLineStyleListener(
    new LineStyleListener() { 
     @Override 
     public void lineGetStyle(LineStyleEvent event) { 
      String line = event.lineText; 
      int lineNumber = event.lineOffset; 
      // Do stuff to add line numbers 
     } 
    } 
); 
+0

Könnten Sie bitte etwas mehr Details über Ihren Ansatz erwähnen? Im Web habe ich gerade eine Reihe von Beispielen gefunden, in denen 'LineStyleListener' den Inhalt einer Zeile in einer bestimmten Weise, z. [dieses Beispiel] (http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/TurnsecharactersredusingaLineStyleListener.htm). Vielen Dank. – kon

1

Dies ist ein Weg, Kugeln zu verwenden, dass die Zahlen aktualisiert, wenn sich der Inhalt ändert:

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); 
    } 
}); 
0

Als Randbemerkung die Zeilennummern für die Färbung:

Device device = Display.getCurrent(); 
style.background = new Color(device, LINE_NUMBER_BG); 
style.foreground = new Color(device, LINE_NUMBER_FG); 

wo LINE_NUMBER_BG und LINE_NUMBER_FG könnte ein RGB-Objekt sein wie:

final RGB LINE_NUMBER_BG = new RBG(160, 80, 0); // brown 
final RGB LINE_NUMBER_FG = new RGB(255, 255, 255); // white 
4

Dies ist meine Arbeitsimplementierung.

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(); 
    } 
}); 

Beachten Sie, dass die mögliche Überkopfsyntaxhervorhebung, wenn die Neuberechnung neu zeichnen() aufgerufen wird wahrscheinlich akzeptabel, weil lineGetStyle() nur mit Linien zur Zeit auf dem Bildschirm aufgerufen.