Added further API for intercepting deletion and content insertion
Added simple implementation of locked objects to sample git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70465 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1113,12 +1113,26 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
|
||||
// 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)
|
||||
@@ -1128,13 +1142,25 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
|
||||
long pos = wxRichTextCtrl::FindNextWordPosition(-1);
|
||||
if (pos < newPos)
|
||||
{
|
||||
GetFocusObject()->DeleteRangeWithUndo(wxRichTextRange(pos+1, newPos), this, & GetBuffer());
|
||||
wxRichTextRange range(pos+1, newPos);
|
||||
if (CanDeleteRange(* GetFocusObject(), range.FromInternal()))
|
||||
{
|
||||
GetFocusObject()->DeleteRangeWithUndo(range, this, & GetBuffer());
|
||||
deletions ++;
|
||||
}
|
||||
processed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!processed)
|
||||
GetFocusObject()->DeleteRangeWithUndo(wxRichTextRange(newPos, newPos), this, & GetBuffer());
|
||||
{
|
||||
wxRichTextRange range(newPos, newPos);
|
||||
if (CanDeleteRange(* GetFocusObject(), range.FromInternal()))
|
||||
{
|
||||
GetFocusObject()->DeleteRangeWithUndo(range, this, & GetBuffer());
|
||||
deletions ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EndBatchUndo();
|
||||
@@ -1150,14 +1176,17 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
|
||||
|
||||
ScrollIntoView(m_caretPosition, WXK_LEFT);
|
||||
|
||||
wxRichTextEvent cmdEvent(
|
||||
wxEVT_COMMAND_RICHTEXT_DELETE,
|
||||
GetId());
|
||||
cmdEvent.SetEventObject(this);
|
||||
cmdEvent.SetFlags(flags);
|
||||
cmdEvent.SetPosition(m_caretPosition+1);
|
||||
cmdEvent.SetContainer(GetFocusObject());
|
||||
GetEventHandler()->ProcessEvent(cmdEvent);
|
||||
if (deletions > 0)
|
||||
{
|
||||
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();
|
||||
}
|
||||
@@ -1177,10 +1206,18 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
|
||||
|
||||
if (event.GetKeyCode() == WXK_RETURN)
|
||||
{
|
||||
BeginBatchUndo(_("Insert Text"));
|
||||
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())
|
||||
@@ -1219,12 +1256,21 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
|
||||
}
|
||||
else if (event.GetKeyCode() == WXK_BACK)
|
||||
{
|
||||
BeginBatchUndo(_("Delete Text"));
|
||||
|
||||
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)
|
||||
@@ -1234,13 +1280,25 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
|
||||
long pos = wxRichTextCtrl::FindNextWordPosition(-1);
|
||||
if (pos < newPos)
|
||||
{
|
||||
GetFocusObject()->DeleteRangeWithUndo(wxRichTextRange(pos+1, newPos), this, & GetBuffer());
|
||||
wxRichTextRange range(pos+1, newPos);
|
||||
if (CanDeleteRange(* GetFocusObject(), range.FromInternal()))
|
||||
{
|
||||
GetFocusObject()->DeleteRangeWithUndo(range, this, & GetBuffer());
|
||||
deletions ++;
|
||||
}
|
||||
processed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!processed)
|
||||
GetFocusObject()->DeleteRangeWithUndo(wxRichTextRange(newPos, newPos), this, & GetBuffer());
|
||||
{
|
||||
wxRichTextRange range(newPos, newPos);
|
||||
if (CanDeleteRange(* GetFocusObject(), range.FromInternal()))
|
||||
{
|
||||
GetFocusObject()->DeleteRangeWithUndo(range, this, & GetBuffer());
|
||||
deletions ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EndBatchUndo();
|
||||
@@ -1256,25 +1314,37 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
|
||||
|
||||
ScrollIntoView(m_caretPosition, WXK_LEFT);
|
||||
|
||||
wxRichTextEvent cmdEvent(
|
||||
wxEVT_COMMAND_RICHTEXT_DELETE,
|
||||
GetId());
|
||||
cmdEvent.SetEventObject(this);
|
||||
cmdEvent.SetFlags(flags);
|
||||
cmdEvent.SetPosition(m_caretPosition+1);
|
||||
cmdEvent.SetContainer(GetFocusObject());
|
||||
GetEventHandler()->ProcessEvent(cmdEvent);
|
||||
if (deletions > 0)
|
||||
{
|
||||
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)
|
||||
{
|
||||
BeginBatchUndo(_("Delete Text"));
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -1283,13 +1353,25 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
|
||||
long pos = wxRichTextCtrl::FindNextWordPosition(1);
|
||||
if (pos != -1 && (pos > newPos))
|
||||
{
|
||||
GetFocusObject()->DeleteRangeWithUndo(wxRichTextRange(newPos+1, pos), this, & GetBuffer());
|
||||
wxRichTextRange range(newPos+1, pos);
|
||||
if (CanDeleteRange(* GetFocusObject(), range.FromInternal()))
|
||||
{
|
||||
GetFocusObject()->DeleteRangeWithUndo(range, this, & GetBuffer());
|
||||
deletions ++;
|
||||
}
|
||||
processed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!processed && newPos < (GetLastPosition()-1))
|
||||
GetFocusObject()->DeleteRangeWithUndo(wxRichTextRange(newPos+1, newPos+1), this, & GetBuffer());
|
||||
{
|
||||
wxRichTextRange range(newPos+1, newPos+1);
|
||||
if (CanDeleteRange(* GetFocusObject(), range.FromInternal()))
|
||||
{
|
||||
GetFocusObject()->DeleteRangeWithUndo(range, this, & GetBuffer());
|
||||
deletions ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EndBatchUndo();
|
||||
@@ -1305,14 +1387,17 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
|
||||
|
||||
ScrollIntoView(m_caretPosition, WXK_LEFT);
|
||||
|
||||
wxRichTextEvent cmdEvent(
|
||||
wxEVT_COMMAND_RICHTEXT_DELETE,
|
||||
GetId());
|
||||
cmdEvent.SetEventObject(this);
|
||||
cmdEvent.SetFlags(flags);
|
||||
cmdEvent.SetPosition(m_caretPosition+1);
|
||||
cmdEvent.SetContainer(GetFocusObject());
|
||||
GetEventHandler()->ProcessEvent(cmdEvent);
|
||||
if (deletions > 0)
|
||||
{
|
||||
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();
|
||||
}
|
||||
@@ -1377,6 +1462,12 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
|
||||
}
|
||||
}
|
||||
|
||||
if (!CanInsertContent(* GetFocusObject(), m_caretPosition+1))
|
||||
return;
|
||||
|
||||
if (HasSelection() && !CanDeleteRange(* GetFocusObject(), GetSelectionRange()))
|
||||
return;
|
||||
|
||||
BeginBatchUndo(_("Insert Text"));
|
||||
|
||||
long newPos = m_caretPosition;
|
||||
@@ -3018,12 +3109,12 @@ bool wxRichTextCtrl::CanCopy() const
|
||||
|
||||
bool wxRichTextCtrl::CanCut() const
|
||||
{
|
||||
return HasSelection() && IsEditable();
|
||||
return CanDeleteSelection();
|
||||
}
|
||||
|
||||
bool wxRichTextCtrl::CanPaste() const
|
||||
{
|
||||
if ( !IsEditable() )
|
||||
if ( !IsEditable() || !GetFocusObject() || !CanInsertContent(* GetFocusObject(), m_caretPosition+1))
|
||||
return false;
|
||||
|
||||
return GetBuffer().CanPasteFromClipboard();
|
||||
@@ -3031,7 +3122,7 @@ bool wxRichTextCtrl::CanPaste() const
|
||||
|
||||
bool wxRichTextCtrl::CanDeleteSelection() const
|
||||
{
|
||||
return HasSelection() && IsEditable();
|
||||
return HasSelection() && IsEditable() && CanDeleteRange(* GetFocusObject(), GetSelectionRange());
|
||||
}
|
||||
|
||||
|
||||
@@ -4460,6 +4551,16 @@ bool wxRichTextDropSource::GiveFeedback(wxDragResult WXUNUSED(effect))
|
||||
}
|
||||
#endif // wxUSE_DRAG_AND_DROP
|
||||
|
||||
bool wxRichTextCtrl::CanDeleteRange(wxRichTextParagraphLayoutBox& WXUNUSED(container), const wxRichTextRange& WXUNUSED(range)) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool wxRichTextCtrl::CanInsertContent(wxRichTextParagraphLayoutBox& WXUNUSED(container), long WXUNUSED(pos)) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
#if wxRICHTEXT_USE_OWN_CARET
|
||||
|
||||
|
||||
Reference in New Issue
Block a user