2016-08-31 4 views
1

Предположит следующие ситуации: У нас есть документ, который содержит пробела
(, например обозначенные как _) И мы знак вставки за этими (4) пространствамиXText - AutoEdits с забоем

_ _ _ _| 

Я хочу, чтобы редактор удалял все 4 пробела вместо одного, когда пользователь нажимает обратно.

Я простирающийся DefaultIndentLineAutoEditStrategy где я переопределить следующий метод

public void customizeDocumentCommand(IDocument d, DocumentCommand c)

Я столкнулся с двумя проблемами:

  1. Как обнаружить забой были использованы из DocumentCommand? Если вы используете newline, то c.text содержит "\n" или "\r\n", но если вы используете обратное пространство, оно равно "".
  2. Как вставить еще 3 пробела? Добавление "\b" в c.text не работает.
+1

делает установка command.offset и command.length не помогают? –

+0

Хорошо я обнаруживаю такое обратное пространство if (c.text.equals ("") && c.length == 1) и c.offset- = 3; c.length = 4; просто сделал трюк. Благодарю. – Smarty77

ответ

0

Хорошо, мне удалось реализовать его.

  1. if (c.text.equals("") && c.length == 1) условие определяет использование забой/удалить
  2. Удаление более 3-х символов может быть сделано следующим образом:
    c.offset-=3; c.length=4;

целом реализация может выглядеть следующим образом:

private void handleBackspace(IDocument d, DocumentCommand c) { 
     if (c.offset == -1 || d.getLength() == 0) 
      return; 
     int p = (c.offset == d.getLength() ? c.offset - 1 : c.offset); 
     IRegion info; 
     try { 
      info = d.getLineInformationOfOffset(p); 
      String line = d.get(info.getOffset(), info.getLength()); 
      int lineoffset = info.getOffset(); 
      /*Make sure unindent is made only if user is indented and has caret in correct position */ 
      if ((p-lineoffset+1)%4==0&&((line.startsWith(" ") && !line.startsWith("  ")) || (line.startsWith("  ") && !line.startsWith("   ")))){ //1 or 2 level fixed indent 
       c.offset-=3; 
       c.length=4; 
      } 

     }catch (org.eclipse.jface.text.BadLocationException e) { 
      e.printStackTrace(); 
     } 
    }