2012-06-15 10 views
8

Me preguntaba si hay una forma sencilla de mostrar los números de línea con el campo de texto StyledText, incluso si las líneas están ajustadas. Lo estoy usando en mi aplicación y si el contenido llega a ser grande, algunos números de línea serían agradables.Java SWT show Números de línea para StyledText

Gracias.

+0

No hay una verdadera manera directa hasta donde yo sé; siempre puedes poner un cuadro de texto no editable a la izquierda de tu editor de texto. – purtip31

+0

Comprueba la implementación que están usando los chicos de Eclipse. –

+0

@ Adam Están usando un 'SourceViewer' como se muestra [aquí] (http://www.dsource.org/projects/dwt/wiki/JFaceTextExample). Intenté este ejemplo, pero de alguna manera no pude hacerlo funcionar correctamente. Estaba haciendo cosas extrañas en tiempo de ejecución. De todos modos, me gustaría mantener mi 'StyleText' :) – kon

Respuesta

5

La clave es org.eclipse.swt.custom.Bullet. Básicamente es un símbolo (o en nuestro caso un número) que puede agregar al comienzo de una línea.

//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

Funciona bien. Simplemente no vuelve a dibujar todas las líneas si la cantidad total de líneas aumenta de 9 a 10. O si se eliminan las líneas en el medio del archivo. Gracias. – kon

1

Creo que el uso de un LineStyleListener debería funcionar. Algo a lo largo de las líneas de:

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

¿Podría mencionar algunos detalles más sobre su enfoque? En la web, acabo de encontrar un montón de ejemplos con 'LineStyleListener' resaltando el contenido de una línea de cierta manera, p. [este ejemplo] (http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/TurnsecharactersredusingaLineStyleListener.htm). Gracias. – kon

1

Esta es una manera de utilizar balas que actualiza los números cuando los cambios de contenido:

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

Como nota lateral para colorear los números de línea:

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

donde LINE_NUMBER_BG y LINE_NUMBER_FG podría ser un objeto RGB como:

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

Esta es mi implementación de trabajo.

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

Tenga en cuenta que la posible sobrecarga de resaltado de sintaxis nuevo cálculo cuando se llama a volver a dibujar() es probable que sea aceptable, porque lineGetStyle() sólo se les llama con líneas actualmente en pantalla.

Cuestiones relacionadas