+ {
+ return;
+ }
+ default:
+ {
+ }
+ }
+
+ // Must process this before translation, otherwise it's translated into a WXK_DELETE event.
+ if (event.CmdDown() && event.GetKeyCode() == WXK_BACK)
+ {
+ if (!IsEditable())
+ {
+ return;
+ }
+
+ if (HasSelection() && !CanDeleteRange(* GetFocusObject(), GetSelectionRange()))
+ {
+ return;
+ }
+
+ BeginBatchUndo(_("Delete Text"));
+
+ long newPos = m_caretPosition;
+
+ bool processed = DeleteSelectedContent(& newPos);
+
+ int deletions = 0;
+ if (processed)
+ deletions ++;
+
+ // Submit range in character positions, which are greater than caret positions,
+ // so subtract 1 for deleted character and add 1 for conversion to character position.
+ if (newPos > -1)
+ {
+ if (event.CmdDown())
+ {
+ long pos = wxRichTextCtrl::FindNextWordPosition(-1);
+ if (pos < newPos)
+ {
+ wxRichTextRange range(pos+1, newPos);
+ if (CanDeleteRange(* GetFocusObject(), range.FromInternal()))
+ {
+ GetFocusObject()->DeleteRangeWithUndo(range, this, & GetBuffer());
+ deletions ++;
+ }
+ processed = true;
+ }
+ }
+
+ if (!processed)
+ {
+ wxRichTextRange range(newPos, newPos);
+ if (CanDeleteRange(* GetFocusObject(), range.FromInternal()))
+ {
+ GetFocusObject()->DeleteRangeWithUndo(range, this, & GetBuffer());
+ deletions ++;
+ }
+ }
+ }
+
+ EndBatchUndo();
+
+ if (GetLastPosition() == -1)
+ {
+ GetFocusObject()->Reset();
+
+ m_caretPosition = -1;
+ PositionCaret();
+ SetDefaultStyleToCursorStyle();
+ }
+
+ ScrollIntoView(m_caretPosition, WXK_LEFT);
+
+ // Always send this event; wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED will be sent only if there is an actual deletion.
+ {
+ wxRichTextEvent cmdEvent(
+ wxEVT_COMMAND_RICHTEXT_DELETE,
+ GetId());
+ cmdEvent.SetEventObject(this);
+ cmdEvent.SetFlags(flags);
+ cmdEvent.SetPosition(m_caretPosition+1);
+ cmdEvent.SetContainer(GetFocusObject());
+ GetEventHandler()->ProcessEvent(cmdEvent);
+ }
+
+ Update();
+ }
+ else
+ event.Skip();
+
+ return;
+ }
+
+ // all the other keys modify the controls contents which shouldn't be
+ // possible if we're read-only
+ if ( !IsEditable() )
+ {
+ event.Skip();
+ return;
+ }
+
+ if (event.GetKeyCode() == WXK_RETURN)
+ {
+ if (!CanInsertContent(* GetFocusObject(), m_caretPosition+1))
+ return;
+
+ long newPos = m_caretPosition;
+
+ if (HasSelection() && !CanDeleteRange(* GetFocusObject(), GetSelectionRange()))
+ {
+ return;
+ }
+
+ BeginBatchUndo(_("Insert Text"));
+
+ DeleteSelectedContent(& newPos);
+
+ if (event.ShiftDown())
+ {
+ wxString text;
+ text = wxRichTextLineBreakChar;
+ GetFocusObject()->InsertTextWithUndo(& GetBuffer(), newPos+1, text, this);
+ m_caretAtLineStart = true;
+ PositionCaret();
+ }
+ else
+ GetFocusObject()->InsertNewlineWithUndo(& GetBuffer(), newPos+1, this, wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE|wxRICHTEXT_INSERT_INTERACTIVE);
+
+ EndBatchUndo();
+ SetDefaultStyleToCursorStyle();
+
+ ScrollIntoView(m_caretPosition, WXK_RIGHT);
+
+ wxRichTextEvent cmdEvent(
+ wxEVT_COMMAND_RICHTEXT_RETURN,
+ GetId());
+ cmdEvent.SetEventObject(this);
+ cmdEvent.SetFlags(flags);
+ cmdEvent.SetPosition(newPos+1);
+ cmdEvent.SetContainer(GetFocusObject());
+
+ if (!GetEventHandler()->ProcessEvent(cmdEvent))
+ {
+ // Generate conventional event
+ wxCommandEvent textEvent(wxEVT_COMMAND_TEXT_ENTER, GetId());
+ InitCommandEvent(textEvent);
+
+ GetEventHandler()->ProcessEvent(textEvent);
+ }
+ Update();
+ }
+ else if (event.GetKeyCode() == WXK_BACK)
+ {
+ long newPos = m_caretPosition;
+
+ if (HasSelection() && !CanDeleteRange(* GetFocusObject(), GetSelectionRange()))
+ {
+ return;
+ }
+
+ BeginBatchUndo(_("Delete Text"));
+
+ bool processed = DeleteSelectedContent(& newPos);
+
+ int deletions = 0;
+ if (processed)
+ deletions ++;
+
+ // Submit range in character positions, which are greater than caret positions,
+ // so subtract 1 for deleted character and add 1 for conversion to character position.
+ if (newPos > -1)
+ {
+ if (event.CmdDown())
+ {
+ long pos = wxRichTextCtrl::FindNextWordPosition(-1);
+ if (pos < newPos)
+ {
+ wxRichTextRange range(pos+1, newPos);
+ if (CanDeleteRange(* GetFocusObject(), range.FromInternal()))
+ {
+ GetFocusObject()->DeleteRangeWithUndo(range, this, & GetBuffer());
+ deletions ++;
+ }
+ processed = true;
+ }
+ }
+
+ if (!processed)
+ {
+ wxRichTextRange range(newPos, newPos);
+ if (CanDeleteRange(* GetFocusObject(), range.FromInternal()))
+ {
+ GetFocusObject()->DeleteRangeWithUndo(range, this, & GetBuffer());
+ deletions ++;
+ }
+ }
+ }
+
+ EndBatchUndo();
+
+ if (GetLastPosition() == -1)
+ {
+ GetFocusObject()->Reset();
+
+ m_caretPosition = -1;
+ PositionCaret();
+ SetDefaultStyleToCursorStyle();
+ }
+
+ ScrollIntoView(m_caretPosition, WXK_LEFT);
+
+ // Always send this event; wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED will be sent only if there is an actual deletion.
+ {
+ wxRichTextEvent cmdEvent(
+ wxEVT_COMMAND_RICHTEXT_DELETE,
+ GetId());
+ cmdEvent.SetEventObject(this);
+ cmdEvent.SetFlags(flags);
+ cmdEvent.SetPosition(m_caretPosition+1);
+ cmdEvent.SetContainer(GetFocusObject());
+ GetEventHandler()->ProcessEvent(cmdEvent);
+ }
+
+ Update();
+ }
+ else if (event.GetKeyCode() == WXK_DELETE)
+ {
+ long newPos = m_caretPosition;
+
+ if (HasSelection() && !CanDeleteRange(* GetFocusObject(), GetSelectionRange()))
+ {
+ return;
+ }
+
+ BeginBatchUndo(_("Delete Text"));
+
+ bool processed = DeleteSelectedContent(& newPos);
+
+ int deletions = 0;
+ if (processed)
+ deletions ++;
+
+ // Submit range in character positions, which are greater than caret positions,
+ if (newPos < GetFocusObject()->GetOwnRange().GetEnd()+1)
+ {
+ if (event.CmdDown())
+ {
+ long pos = wxRichTextCtrl::FindNextWordPosition(1);
+ if (pos != -1 && (pos > newPos))
+ {
+ wxRichTextRange range(newPos+1, pos);
+ if (CanDeleteRange(* GetFocusObject(), range.FromInternal()))
+ {
+ GetFocusObject()->DeleteRangeWithUndo(range, this, & GetBuffer());
+ deletions ++;
+ }
+ processed = true;
+ }
+ }
+
+ if (!processed && newPos < (GetLastPosition()-1))
+ {
+ wxRichTextRange range(newPos+1, newPos+1);
+ if (CanDeleteRange(* GetFocusObject(), range.FromInternal()))
+ {
+ GetFocusObject()->DeleteRangeWithUndo(range, this, & GetBuffer());
+ deletions ++;
+ }
+ }
+ }
+
+ EndBatchUndo();
+
+ if (GetLastPosition() == -1)
+ {
+ GetFocusObject()->Reset();
+
+ m_caretPosition = -1;
+ PositionCaret();
+ SetDefaultStyleToCursorStyle();
+ }
+
+ ScrollIntoView(m_caretPosition, WXK_LEFT);
+
+ // Always send this event; wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED will be sent only if there is an actual deletion.
+ {
+ wxRichTextEvent cmdEvent(
+ wxEVT_COMMAND_RICHTEXT_DELETE,
+ GetId());
+ cmdEvent.SetEventObject(this);
+ cmdEvent.SetFlags(flags);
+ cmdEvent.SetPosition(m_caretPosition+1);
+ cmdEvent.SetContainer(GetFocusObject());
+ GetEventHandler()->ProcessEvent(cmdEvent);
+ }
+
+ Update();
+ }
+ else
+ {
+ long keycode = event.GetKeyCode();
+ switch ( keycode )
+ {
+ case WXK_ESCAPE: