protected internal override void CharEntered(CharacterEventArgs e) { var ch = e.Character; lock (RenderRule) { switch (ch) { case '\b': { //Backspace <= remove selected or remove before cursor if (RenderRule.HasSelected) { RenderRule.RemoveSelected(); } else { RenderRule.BackSpace(); } break; } case '\n': case '\r': { //New Line <= Insert character after cursor if (RenderRule.HasSelected) { RenderRule.RemoveSelected(); } RenderRule.Insert(ch); break; } case '\t': { //Tabs currently not supported return; } case (char)3: { //Copy Clipboard.SetDataObject(RenderRule.GetSelected(), true); break; } case (char)22: { //Paste if (RenderRule.HasSelected) { RenderRule.RemoveSelected(); } var dataObject = Clipboard.GetDataObject(); if (dataObject != null) { var text = dataObject.GetData(DataFormats.Text).ToString(); RenderRule.Insert(text); } break; } case (char)24: { //Cut if (RenderRule.HasSelected) { Clipboard.SetDataObject(RenderRule.GetSelected(), true); RenderRule.RemoveSelected(); } break; } default: { //Add the character if (RenderRule.HasSelected) { RenderRule.RemoveSelected(); } RenderRule.Insert(ch); RenderRule.SelectedChar = null; break; } } RenderRule.BakeText(); } ResetTimer(); }