2016-03-29 10 views
1

Я разрабатываю (богатый) редактор на основе SWT StyledText. Есть одна особенность, которую я до сих пор не могу решить. Я хочу, чтобы мой редактор помещал курсор в ширину табуляции как начало предыдущей строки, когда пользователь нажимает Ctrl + u (аналогично Eclipse или Notepad ++, когда пользователи нажимают клавишу Enter). Я пробовал несколько методов, но ничего не работает для меня. Пожалуйста, взгляните на мой пример. Каждое предложение приветствуется. Заранее спасибо.SWT StyledText: Занять позицию следующей строки до ширины табуляции предыдущей строки

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

ответ

2

Если я вас правильно понял, вы хотите, чтобы переместить курсор на следующую строку и отступ на столько «белых пространств» как есть ведущие пробелы в предыдущей строке.

Я удивлен, что это не лучший способ сделать это (или, может быть, я просто не нашел), но это будет делать эту работу:

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

Да, это именно то, что я хотеть сделать. Большое спасибо. Я тоже думаю о том, чтобы заполнить «», но не смог заставить его работать. PS: Я работаю на дисплее Брайля, а белые пробелы иногда не очень хороши, потому что на дисплее Брайля одновременно отображаются ограниченные отображаемые символы (40 символов). Но я попытаюсь справиться с этим. Благодарю. – APex

+0

@APex Вы также можете использовать вкладки. – Baz

+0

Да .. Я тоже пытаюсь это сделать. Спасибо. – APex

 Смежные вопросы

  • Нет связанных вопросов^_^