2012-06-15 11 views
8

Mi chiedevo se c'è un modo semplice per visualizzare i numeri di riga con il campo di testo StyledText - anche se le linee sono avvolte. Lo sto usando nella mia applicazione e se il contenuto diventa grande, alcuni numeri di riga sarebbero belli.Java SWT mostra i numeri di riga per StyledText

Grazie.

+0

Non c'è un vero e semplice modo per quanto ne so; puoi sempre inserire una casella di testo non modificabile a sinistra dell'editor di testo. – purtip31

+0

Verifica l'implementazione che i ragazzi di Eclipse stanno utilizzando. –

+0

@Adam Stanno usando un 'SourceViewer' come mostrato [qui] (http://www.dsource.org/projects/dwt/wiki/JFaceTextExample). Ho provato questo esempio, ma in qualche modo non ero in grado di farlo funzionare correttamente. Stava facendo cose strane su runtime. Ad ogni modo, vorrei mantenere il mio 'StyleText' :) – kon

risposta

5

La chiave è org.eclipse.swt.custom.Bullet. È fondamentalmente un simbolo (o nel nostro caso un numero) che puoi aggiungere all'inizio di una riga.

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

Funziona bene. Manca solo per ridisegnare tutte le linee se la quantità totale di righe aumenta da 9 a 10. Oppure se una linea viene rimossa nel mezzo del file. Grazie. – kon

1

Credo che l'utilizzo di LineStyleListener dovrebbe funzionare. Qualcosa sulla falsariga di:

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

Potresti per favore citare qualche altro dettaglio sul tuo approccio? Sul web, ho appena trovato un sacco di esempi con 'LineStyleListener' che evidenzia il contenuto di una linea in un certo modo, ad es. [questo esempio] (http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/TurnsecharactersredusingaLineStyleListener.htm). Grazie. – kon

1

Questo è un modo per utilizzare proiettili che aggiorna i numeri quando il contenuto cambia:

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

Come un lato nota per colorare i numeri di riga:

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

dove LINE_NUMBER_BG e LINE_NUMBER_FG potrebbe essere un oggetto RGB come:

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

Questa è la mia implementazione operativa.

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

noti che l'eventuale sovraccarico di evidenziazione della sintassi ricalcolo quando chiama draw() è probabile che sia accettabile, perché lineGetStyle() sono chiamati solo con linee attualmente sullo schermo.