Replaced duplicated code with ApplyControlBackspace method

This commit is contained in:
Waldi Ravens 2016-03-27 16:47:28 +02:00
parent 77552eff7e
commit d6119dc525
3 changed files with 115 additions and 93 deletions

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}
}