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:
Julian Smart
2012-01-25 15:10:09 +00:00
parent eccdb55165
commit cc2aecdef5
7 changed files with 369 additions and 41 deletions

View File

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