ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#] Column editing function in TextBox
    프로그래밍/C# 2020. 9. 29. 09:45

     열 편집 기능 (Column editing function)

     현재 Notepad++, 비주얼 스튜디오 등등 편집기에서 대부분 사용 가능한 기능입니다. 보통 Alt + 마우스 드래그 또는 Shift + Alt + 방향키 조합을 통해서 사용하는데요. 저희가 자연스럽게 사용하던 기능들은 사실 복잡한 구현이 필요합니다. C# 에서 사용하는 TextBox 또는 RichTextBox 에서는 이러한 기능을 사용할 수 없기 때문이죠.

     

    Currently, it is a feature that is mostly available in editors such as Notepad++ and Visual Studio. Usually, it is used through the combination of Alt + mouse drag or Shift + Alt + arrow keys. The features we used naturally require complex implementations. This is because these features are not available in TextBox or RichTextBox used in C#.

     

     

    하지만 이러한 기능을 사용자에게서 요청받을 수 있습니다. 그래서 저희는 이 기능을 구현하기 위해 Scintilla.NET 이라는 패키지를 사용합니다. 이 패키지를 다운로드하는 방법은 여기 에 있습니다. 아래에 사진은 열 편집 기능을 보여주고 있습니다. 자세한 소스코드는 깃허브에 올려놓겠습니다.

     

    However, these functions may be requested by users. So we use a package called Scintilla.NET to implement this feature. Here's how to download this package. The photo below shows the column editing function. The detailed source code will be posted on GitHub.

     

     

     

     

     

     

     소스코드 (Source Code)

    아래 코드는 Scintilla.NET 을 기반으로 소스코드입니다. TextArea 안에 KeyDown 이벤트를 통해서 구현하였고 Converter 함수를 통해 예외처리를 해줬습니다. 단순히 들어오는 입력을 모든 줄에 대입해주는 방식입니다. BackSpace 와 Delete 키는 따로 구현을 해주었습니다. 혹시 보시면서 어려운 부분이 있으면 댓글에 남겨주세요.

     

     The code below is the source code based on Scintilla.NET. Implemented through KeyDown event in TextArea, and exception handling through Converter function. It is a method of simply assigning incoming input to all lines. The BackSpace and Delete keys were implemented separately. If you have any difficulties while watching, please leave it in the comments.

     

            private void TextArea_KeyDown(object sendor, KeyEventArgs e)
            {
                if (e.Alt) return;
    
                var edit = TextArea;
    
                // Exception 
                if (edit.Selections.Count < 2) return; // no in column mode
                if (e.KeyCode == Keys.Enter) return; // enter is new line
                if ((e.KeyValue >= 37 && e.KeyValue <= 40)
                    || (e.KeyValue >= 112 && e.KeyValue <= 130)) return;
    
                e.SuppressKeyPress = true;
    
                var input = e.KeyCode.ToString();
    
                // Function key
                if (input == "ShiftKey" || e.Modifiers == Keys.Shift) keyShift = 1;
                else if (input == "Capital") keyCapslock = !keyCapslock;
    
                // Converter
                if (e.KeyValue >= 65 && e.KeyValue <= 90) // Alphabet
                {
                    input = KeyConverterAlphabet(e.KeyValue);
                }
                else
                {
                    input = KeyConverter(input);
                }
    
    
                var array = edit.Selections
                    .OrderBy(Selection => Selection.Start)
                    .Select(Selection => new SelWrap { Begin = Selection.Start, Length = Selection.End - Selection.Start })
                    .ToArray();
    
                // Excluding special keys ex) F1, Delete ...
                if (input.Length < 3)
                {
    
                    for (var i = 0; i < array.Length; i++)
                    {
                        var lineInfo = array[i];
    
                        if (lineInfo.Length > 0)
                        {
                            edit.DeleteRange(lineInfo.Begin, lineInfo.Length);
    
                            for (var j = i + 1; j < array.Length; j++)
                            {
                                array[j].Begin -= lineInfo.Length;
                            }
    
                        }
    
                        if (input == "\b")
                        {
                            if (lineInfo.Length != 0) continue;
    
                            edit.DeleteRange(lineInfo.Begin - 1, 1);
    
                            for (var j = i; j < array.Length; j++)
                            {
                                array[j].Begin--;
                            }
    
                        }
                        else if (input == "dd")
                        {
                            if (lineInfo.Length != 0) continue;
    
                            edit.DeleteRange(lineInfo.Begin, 1);
    
                            for (var j = i + 1; j < array.Length; j++)
                            {
                                array[j].Begin--;
                            }
    
    
                        }
                        else
                        {
                            edit.InsertText(lineInfo.Begin, input);
    
                            for (var j = i; j < array.Length; j++)
                            {
                                array[j].Begin++;
                            }
                        }
    
                    }
                }
    
                edit.ClearSelections();
                edit.SetSelection(array[0].Begin, array[0].Begin);
                for (var i = 1; i < array.Length; i++)
                {
                    var item = array[i];
                    edit.AddSelection(item.Begin, item.Begin);
                }
    
    
            }
    

     

    댓글

Designed by Tistory.