2016-03-29 5 views
1

Ich entwickle einen (Rich) Editor basierend auf SWT StyledText. Es gibt eine Eigenschaft, die ich bis jetzt nicht lösen kann. Ich möchte, dass mein Editor den Cursor auf die Tabulatorbreite als Anfang der vorherigen Zeile setzt, wenn der Benutzer Strg + u drückt (ähnlich wie Eclipse oder Notepad ++, wenn Benutzer die Eingabetaste drücken). Ich habe mehrere Methoden ausprobiert, aber nichts funktioniert für mich. Bitte sehen Sie sich mein Beispiel an. Jeder Vorschlag ist willkommen. Danke im Voraus.SWT StyledText: Position caret der nächsten Zeile Tabulatorbreite der vorherigen Zeile

StyledText text = new StyledText(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); 
    text.setTabs(5); 
    text.setText(""); 
    text.setLeftMargin(5); 
    text.setBounds(0, 0, 512, 391); 
    text.addKeyListener(new KeyAdapter() { 
     @Override 
     public void keyPressed(KeyEvent e) { 
      int currentLine = text.getLineAtOffset(text.getCaretOffset()); 
      int currCaretOffset = text.getCaretOffset(); 
      if(e.stateMask == SWT.CTRL && e.keyCode == 'u'){ 
       //text.setIndent(text.getOffsetAtLine(currentLine));//doesn't work 
       text.append("\n"); 
       //text.append("\t");//doesn't work 
       text.setCaretOffset(text.getCharCount()+text.getTabs());//doesn't work 
       System.out.println("caret offset "+text.getCaretOffset()); 
      }    
     } 
    }); 

Antwort

2

Wenn ich Sie richtig verstehe, möchten Sie den Cursor in die nächste Zeile bewegen und sie von so vielen „weißen Flecken“ einrücken, wie es führende Leerzeichen in der vorherigen Zeile.

Ich bin überrascht, dass es nicht ein besserer Weg, dies zu tun (oder vielleicht habe ich eine gerade nicht gefunden), aber das wird die Arbeit erledigen:

private static final int TAB_WIDTH = 5; 

public static void main(String[] args) 
{ 
    final Display display = new Display(); 
    final Shell shell = new Shell(display); 
    shell.setText("Stackoverflow"); 
    shell.setLayout(new FillLayout()); 

    StyledText text = new StyledText(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); 
    text.setTabs(TAB_WIDTH); 
    text.setText(""); 
    text.setLeftMargin(5); 
    text.setBounds(0, 0, 512, 391); 
    text.addListener(SWT.KeyUp, (e) -> { 
     if (e.stateMask == SWT.CTRL && e.keyCode == 'u') 
     { 
      int currentLine = text.getLineAtOffset(text.getCaretOffset()); 
      String textAtLine = text.getLine(currentLine); 
      int spaces = getLeadingSpaces(textAtLine); 
      text.insert("\n"); 
      text.setCaretOffset(text.getCaretOffset() + 1); 
      for (int i = 0; i < spaces; i++) 
       text.append(" "); 

      text.setCaretOffset(text.getCaretOffset() + spaces); 
     } 
    }); 

    shell.pack(); 
    shell.open(); 
    shell.setSize(400, 300); 

    while (!shell.isDisposed()) 
    { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    display.dispose(); 
} 

private static int getLeadingSpaces(String line) 
{ 
    int counter = 0; 

    char[] chars = line.toCharArray(); 
    for (char c : chars) 
    { 
     if (c == '\t') 
      counter += TAB_WIDTH; 
     else if (c == ' ') 
      counter++; 
     else 
      break; 
    } 

    return counter; 
} 
+0

Ja, das ist genau das, was ich möchte tun. Vielen Dank. Ich denke auch daran, mich mit "" zu füllen, habe es aber nicht geschafft, es zum Laufen zu bringen. PS: Ich arbeite für die Braille-Anzeige, und Leerräume sind manchmal nicht so gut, weil die Braille-Anzeige die Anzeigezeichen auf einmal begrenzt (40 Zeichen). Aber ich werde versuchen, es zu schaffen. Vielen Dank. – APex

+0

@APex Sie können stattdessen auch Tabs verwenden. – Baz

+0

Ja .. Ich versuche das auch zu tun. Danke. – APex

Verwandte Themen