2016-03-12 9 views
1

Мне нужен элемент управления текстовым редактором для редактирования столбцов в моем приложении.Как реализовать режим редактирования столбца ScintillaNET

Как блокнота ++alt+mouse drag выбрать текстовый блок, или тянуть вниз длинный вертикальный курсор и нажать клавишу, чтобы вставить символ для каждой строки над курсором.

Я попытался ScintillaNET но not suppor the column-modet для вставки, просто можно удалить выбранный текст блока

мне нужно ниже эффекта (Notepad ++), но ScintillaNET получил:

notepad++ScintillaNET

ответ

1

Я нашел способ решать. Использование ScintillaNET.

Но кодирование не хватает красоты :)

class SelWrap 
{ 
    public int Begin { get; set; } 
    public int Length { get; set; } 
} 

//... 

editor.KeyDown += (s, e) => 
{ 
    // filter alt we will hold down alt to make vertical selection 
    if (e.Alt) return; 

    var tb = editor; 
    if (tb.Selections.Count < 2) return; // no in column mode 

    e.SuppressKeyPress = true; //block input, handle by below code 

    //refered from post #5825820 
    var input = Utility.GetCharFromKey(e.KeyCode).ToString(); 
    if (input == "\0") 
    { 
     //SystemSounds.Beep.Play(); 
     return; 
    } 

    var array = tb.Selections 
     .OrderBy(p => p.Start) 
     .Select(p => new SelWrap{Begin=p.Start, Length=p.End - p.Start }) 
     .ToArray(); 

    //do process every caret(or selection) 
    for (var i = 0; i < array.Length; i++) 
    { 
     var item = array[i]; 

     if (item.Length > 0) 
     { 
      //if has selected text, just clean 
      tb.DeleteRange(item.Begin, item.Length); 

      for (var j = i + 1; j < array.Length; j++) 
      { 
       array[j].Begin -= item.Length; 
      } 
     } 

     if (input == "\b") //backspace 
     { 
      if (item.Length != 0) continue; 

      //delete a char before caret 
      tb.DeleteRange(item.Begin - 1, 1); 

      for (var j = i; j < array.Length; j++) 
      { 
       array[j].Begin--; 
      } 
     } 
     else //just insert that 
     { 
      tb.InsertText(item.Begin, input); 

      for (var j = i; j < array.Length; j++) 
      { 
       array[j].Begin++; 
      } 
     } 

    } 

    //restore caret status to keep column mode 
    tb.ClearSelections(); 
    tb.SetSelection(array[0].Begin, array[0].Begin); 
    for (var i = 1; i < array.Length; i++) 
    { 
     var item = array[i]; 
     tb.AddSelection(item.Begin, item.Begin); 
    } 
}; 

//...