mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-10-28 15:02:35 +01:00
Replaced duplicated code with ApplyControlBackspace method
This commit is contained in:
parent
77552eff7e
commit
d6119dc525
@ -1,4 +1,5 @@
|
||||
using Nikse.SubtitleEdit.Core;
|
||||
using Nikse.SubtitleEdit.Logic;
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
@ -10,7 +11,6 @@ namespace Nikse.SubtitleEdit.Controls
|
||||
/// </summary>
|
||||
public class SETextBox : TextBox
|
||||
{
|
||||
private const string BreakChars = " \".!?,:;¿¡()[]{}<>♪♫-/#*|\t\r\n";
|
||||
private string _dragText = string.Empty;
|
||||
private int _dragStartFrom = 0;
|
||||
private long _dragStartTicks = 0;
|
||||
@ -37,34 +37,7 @@ namespace Nikse.SubtitleEdit.Controls
|
||||
}
|
||||
else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Back)
|
||||
{
|
||||
if (SelectionLength == 0)
|
||||
{
|
||||
var s = Text;
|
||||
var index = SelectionStart;
|
||||
var deleteFrom = index - 1;
|
||||
|
||||
if (deleteFrom > 0 && deleteFrom < s.Length)
|
||||
{
|
||||
if (s[deleteFrom] == ' ')
|
||||
deleteFrom--;
|
||||
while (deleteFrom > 0 && !BreakChars.Contains(s[deleteFrom]))
|
||||
{
|
||||
deleteFrom--;
|
||||
}
|
||||
if (deleteFrom == index - 1)
|
||||
{
|
||||
var breakCharsNoSpace = BreakChars.Substring(1);
|
||||
while (deleteFrom > 0 && breakCharsNoSpace.Contains(s[deleteFrom - 1]))
|
||||
{
|
||||
deleteFrom--;
|
||||
}
|
||||
}
|
||||
if (s[deleteFrom] == ' ')
|
||||
deleteFrom++;
|
||||
Select(deleteFrom, index - deleteFrom);
|
||||
Paste(string.Empty);
|
||||
}
|
||||
}
|
||||
UiUtil.ApplyControlBackspace(this);
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
}
|
||||
@ -87,7 +60,7 @@ namespace Nikse.SubtitleEdit.Controls
|
||||
SelectionStart = _dragStartFrom;
|
||||
SelectionLength = _dragText.Length;
|
||||
|
||||
DataObject dataObject = new DataObject();
|
||||
var dataObject = new DataObject();
|
||||
dataObject.SetText(_dragText, TextDataFormat.UnicodeText);
|
||||
dataObject.SetText(_dragText, TextDataFormat.Text);
|
||||
|
||||
@ -124,7 +97,7 @@ namespace Nikse.SubtitleEdit.Controls
|
||||
else
|
||||
{
|
||||
bool justAppend = index == Text.Length - 1 && index > 0;
|
||||
const string expectedChars = @";:]<.!?";
|
||||
const string expectedChars = ":;]<.!?";
|
||||
if (_dragFromThis)
|
||||
{
|
||||
_dragFromThis = false;
|
||||
@ -132,7 +105,7 @@ namespace Nikse.SubtitleEdit.Controls
|
||||
if (milliseconds < 400)
|
||||
{
|
||||
SelectionLength = 0;
|
||||
if (index == Text.Length - 1 && index > 0)
|
||||
if (justAppend)
|
||||
index++;
|
||||
SelectionStart = index;
|
||||
return; // too fast - nobody can drag'n'drop this fast
|
||||
@ -208,7 +181,7 @@ namespace Nikse.SubtitleEdit.Controls
|
||||
}
|
||||
|
||||
SelectionStart = index + 1;
|
||||
SelectCurrentWord();
|
||||
UiUtil.SelectWordAtCaret(this);
|
||||
}
|
||||
|
||||
_dragRemoveOld = false;
|
||||
@ -237,7 +210,7 @@ namespace Nikse.SubtitleEdit.Controls
|
||||
{
|
||||
if (m.Msg == WM_DBLCLICK || m.Msg == WM_LBUTTONDBLCLK)
|
||||
{
|
||||
SelectCurrentWord();
|
||||
UiUtil.SelectWordAtCaret(this);
|
||||
return;
|
||||
}
|
||||
if (m.Msg == WM_LBUTTONDOWN)
|
||||
@ -249,26 +222,5 @@ namespace Nikse.SubtitleEdit.Controls
|
||||
base.WndProc(ref m);
|
||||
}
|
||||
|
||||
private void SelectCurrentWord()
|
||||
{
|
||||
var i = SelectionStart;
|
||||
while (i > 0 && !BreakChars.Contains(Text[i - 1]))
|
||||
{
|
||||
i--;
|
||||
}
|
||||
SelectionStart = i;
|
||||
|
||||
var selectionLength = 0;
|
||||
for (; i < Text.Length; i++)
|
||||
{
|
||||
if (BreakChars.Contains(Text[i]))
|
||||
{
|
||||
break;
|
||||
}
|
||||
selectionLength++;
|
||||
}
|
||||
SelectionLength = selectionLength;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
using Nikse.SubtitleEdit.Core;
|
||||
using Nikse.SubtitleEdit.Logic;
|
||||
using Nikse.SubtitleEdit.Logic.Networking;
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
@ -8,7 +9,6 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
public sealed partial class NetworkChat : Form
|
||||
{
|
||||
private Logic.Networking.NikseWebServiceSession _networkSession;
|
||||
private string breakChars = "\".!?,)([]<>:;♪{}-/#*| ¿¡" + Environment.NewLine + "\t";
|
||||
|
||||
protected override bool ShowWithoutActivation
|
||||
{
|
||||
@ -74,44 +74,15 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
e.SuppressKeyPress = true;
|
||||
buttonSendChat_Click(null, null);
|
||||
}
|
||||
else
|
||||
else if (e.KeyData == (Keys.Control | Keys.A))
|
||||
{
|
||||
if (e.KeyData == (Keys.Control | Keys.A))
|
||||
{
|
||||
textBoxChat.SelectAll();
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Back)
|
||||
{
|
||||
int index = textBoxChat.SelectionStart;
|
||||
if (textBoxChat.SelectionLength == 0)
|
||||
{
|
||||
var s = textBoxChat.Text;
|
||||
int deleteFrom = index - 1;
|
||||
|
||||
if (deleteFrom > 0 && deleteFrom < s.Length)
|
||||
{
|
||||
if (s[deleteFrom] == ' ')
|
||||
deleteFrom--;
|
||||
while (deleteFrom > 0 && !breakChars.Contains(s[deleteFrom]))
|
||||
{
|
||||
deleteFrom--;
|
||||
}
|
||||
if (deleteFrom == index - 1)
|
||||
{
|
||||
while (deleteFrom > 0 && breakChars.Replace(" ", string.Empty).Contains(s[deleteFrom - 1]))
|
||||
{
|
||||
deleteFrom--;
|
||||
}
|
||||
}
|
||||
if (s[deleteFrom] == ' ')
|
||||
deleteFrom++;
|
||||
textBoxChat.Text = s.Remove(deleteFrom, index - deleteFrom);
|
||||
textBoxChat.SelectionStart = deleteFrom;
|
||||
}
|
||||
}
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
textBoxChat.SelectAll();
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
else if (e.KeyData == (Keys.Control | Keys.Back))
|
||||
{
|
||||
UiUtil.ApplyControlBackspace(textBoxChat);
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6,6 +6,7 @@ using Nikse.SubtitleEdit.Logic.VideoPlayers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
@ -392,5 +393,103 @@ namespace Nikse.SubtitleEdit.Logic
|
||||
label.Text = sb.ToString();
|
||||
}
|
||||
|
||||
private const string BreakChars = "\",:;.¡!¿?()[]{}<>♪♫-–—/#*|";
|
||||
|
||||
public static void ApplyControlBackspace(TextBox textBox)
|
||||
{
|
||||
if (textBox.SelectionLength == 0)
|
||||
{
|
||||
var text = textBox.Text;
|
||||
var deleteUpTo = textBox.SelectionStart;
|
||||
if (deleteUpTo > 0 && deleteUpTo <= text.Length)
|
||||
{
|
||||
text = text.Substring(0, deleteUpTo);
|
||||
var textElementIndices = StringInfo.ParseCombiningCharacters(text);
|
||||
var index = textElementIndices.Length;
|
||||
var textIndex = deleteUpTo;
|
||||
var deleteFrom = -1;
|
||||
while (index > 0)
|
||||
{
|
||||
index--;
|
||||
textIndex = textElementIndices[index];
|
||||
if (!IsSpaceCategory(CharUnicodeInfo.GetUnicodeCategory(text, textIndex)))
|
||||
break;
|
||||
}
|
||||
if (index > 0 && text[textIndex] == '>') // HTML tag?
|
||||
{
|
||||
var openingBracketIndex = text.LastIndexOf('<', textIndex - 1);
|
||||
if (openingBracketIndex >= 0 && text.IndexOf('>', openingBracketIndex + 1) == textIndex)
|
||||
deleteFrom = openingBracketIndex; // delete whole tag
|
||||
}
|
||||
if (deleteFrom < 0)
|
||||
{
|
||||
if (BreakChars.Contains(text[textIndex]))
|
||||
deleteFrom = -2;
|
||||
while (index > 0)
|
||||
{
|
||||
index--;
|
||||
textIndex = textElementIndices[index];
|
||||
if (IsSpaceCategory(CharUnicodeInfo.GetUnicodeCategory(text, textIndex)))
|
||||
{
|
||||
if (deleteFrom > -2)
|
||||
{
|
||||
if (deleteFrom < 0)
|
||||
deleteFrom = textElementIndices[index + 1];
|
||||
break;
|
||||
}
|
||||
deleteFrom = textElementIndices[index + 1];
|
||||
if (!":!?".Contains(text[deleteFrom]))
|
||||
break;
|
||||
}
|
||||
else if (BreakChars.Contains(text[textIndex]))
|
||||
{
|
||||
if (deleteFrom > -2)
|
||||
{
|
||||
if (deleteFrom < 0)
|
||||
deleteFrom = textElementIndices[index + 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
deleteFrom = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (deleteFrom < deleteUpTo)
|
||||
{
|
||||
if (deleteFrom < 0)
|
||||
deleteFrom = 0;
|
||||
textBox.Select(deleteFrom, deleteUpTo - deleteFrom);
|
||||
textBox.Paste(string.Empty);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void SelectWordAtCaret(TextBox textBox)
|
||||
{
|
||||
var text = textBox.Text;
|
||||
var endIndex = textBox.SelectionStart;
|
||||
var startIndex = endIndex;
|
||||
|
||||
while (startIndex > 0 && !IsSpaceCategory(CharUnicodeInfo.GetUnicodeCategory(text[startIndex - 1])) && !BreakChars.Contains(text[startIndex - 1]))
|
||||
{
|
||||
startIndex--;
|
||||
}
|
||||
textBox.SelectionStart = startIndex;
|
||||
|
||||
while (endIndex < text.Length && !IsSpaceCategory(CharUnicodeInfo.GetUnicodeCategory(text[endIndex])) && !BreakChars.Contains(text[endIndex]))
|
||||
{
|
||||
endIndex++;
|
||||
}
|
||||
textBox.SelectionLength = endIndex - startIndex;
|
||||
}
|
||||
|
||||
private static bool IsSpaceCategory(UnicodeCategory c)
|
||||
{
|
||||
return c == UnicodeCategory.SpaceSeparator || c == UnicodeCategory.Control || c == UnicodeCategory.LineSeparator || c == UnicodeCategory.ParagraphSeparator;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user