wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_CONTENT_INSERTED, wxRichTextEvent );
wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED, wxRichTextEvent );
wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_STYLE_CHANGED, wxRichTextEvent );
+wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_PROPERTIES_CHANGED, wxRichTextEvent );
wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_SELECTION_CHANGED, wxRichTextEvent );
wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_BUFFER_RESET, wxRichTextEvent );
wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_FOCUS_OBJECT_CHANGED, wxRichTextEvent );
{
Init();
Create(parent, id, value, pos, size, style, validator, name);
-
- SetDropTarget(new wxRichTextDropTarget(this));
}
/// Creation
m_contextMenu->AppendSeparator();
m_contextMenu->Append(wxID_RICHTEXT_PROPERTIES1, _("&Properties"));
+#if wxUSE_DRAG_AND_DROP
+ SetDropTarget(new wxRichTextDropTarget(this));
+#endif
+
return true;
}
m_editable = true;
m_caretAtLineStart = false;
m_dragging = false;
+#if wxUSE_DRAG_AND_DROP
m_preDrag = false;
+#endif
m_fullLayoutRequired = false;
m_fullLayoutTime = 0;
m_fullLayoutSavedPosition = 0;
drawingArea.SetPosition(GetLogicalPoint(drawingArea.GetPosition()));
wxRect availableSpace(GetClientSize());
+ wxRichTextDrawingContext context(& GetBuffer());
if (GetBuffer().IsDirty())
{
- GetBuffer().Layout(dc, availableSpace, wxRICHTEXT_FIXED_WIDTH|wxRICHTEXT_VARIABLE_HEIGHT);
+ GetBuffer().Layout(dc, context, availableSpace, availableSpace, wxRICHTEXT_FIXED_WIDTH|wxRICHTEXT_VARIABLE_HEIGHT);
GetBuffer().Invalidate(wxRICHTEXT_NONE);
SetupScrollbars();
}
if ((GetExtraStyle() & wxRICHTEXT_EX_NO_GUIDELINES) == 0)
flags |= wxRICHTEXT_DRAW_GUIDELINES;
- GetBuffer().Draw(dc, GetBuffer().GetOwnRange(), GetSelection(), drawingArea, 0 /* descent */, flags);
+ GetBuffer().Draw(dc, context, GetBuffer().GetOwnRange(), GetSelection(), drawingArea, 0 /* descent */, flags);
dc.DestroyClippingRegion();
long position = 0;
wxRichTextObject* hitObj = NULL;
wxRichTextObject* contextObj = NULL;
- int hit = GetBuffer().HitTest(dc, event.GetLogicalPosition(dc), position, & hitObj, & contextObj);
+ wxRichTextDrawingContext context(& GetBuffer());
+ int hit = GetBuffer().HitTest(dc, context, event.GetLogicalPosition(dc), position, & hitObj, & contextObj);
#if wxUSE_DRAG_AND_DROP
// If there's no selection, or we're not inside it, this isn't an attempt to initiate Drag'n'Drop
wxPoint logicalPt = event.GetLogicalPosition(dc);
wxRichTextObject* hitObj = NULL;
wxRichTextObject* contextObj = NULL;
+ wxRichTextDrawingContext context(& GetBuffer());
// Only get objects at this level, not nested, because otherwise we couldn't swipe text at a single level.
- int hit = GetFocusObject()->HitTest(dc, logicalPt, position, & hitObj, & contextObj, wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS);
+ int hit = GetFocusObject()->HitTest(dc, context, logicalPt, position, & hitObj, & contextObj, wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS);
#if wxUSE_DRAG_AND_DROP
if (m_preDrag)
long position = 0;
wxRichTextObject* hitObj = NULL;
wxRichTextObject* contextObj = NULL;
- int hit = GetBuffer().HitTest(dc, event.GetLogicalPosition(dc), position, & hitObj, & contextObj);
+ int hit = GetBuffer().HitTest(dc, context, event.GetLogicalPosition(dc), position, & hitObj, & contextObj);
wxRichTextParagraphLayoutBox* oldFocusObject = GetFocusObject();
wxRichTextParagraphLayoutBox* container = wxDynamicCast(contextObj, wxRichTextParagraphLayoutBox);
if (container && container != GetFocusObject() && container->AcceptsFocus())
flags = wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS;
container = GetFocusObject();
}
- int hit = container->HitTest(dc, logicalPt, position, & hitObj, & contextObj, flags);
+ wxRichTextDrawingContext context(& GetBuffer());
+ int hit = container->HitTest(dc, context, logicalPt, position, & hitObj, & contextObj, flags);
// See if we need to change the cursor
if (hit != wxRICHTEXT_HITTEST_NONE && !(hit & wxRICHTEXT_HITTEST_OUTSIDE) && hitObj)
{
wxRichTextParagraphLayoutBox* actualContainer = wxDynamicCast(contextObj, wxRichTextParagraphLayoutBox);
- wxRichTextAttr attr;
- if (actualContainer && GetStyle(position, attr, actualContainer))
- {
- if (attr.HasFlag(wxTEXT_ATTR_URL))
- {
- SetCursor(m_urlCursor);
- }
- else if (!attr.HasFlag(wxTEXT_ATTR_URL))
- {
- SetCursor(m_textCursor);
- }
- }
+ if (actualContainer)
+ ProcessMouseMovement(actualContainer, hitObj, position, logicalPt);
}
else
SetCursor(m_textCursor);
// Check for dragging across multiple containers
long position2 = 0;
wxRichTextObject* hitObj2 = NULL, *contextObj2 = NULL;
- int hit2 = GetBuffer().HitTest(dc, logicalPt, position2, & hitObj2, & contextObj2, 0);
+ wxRichTextDrawingContext context(& GetBuffer());
+ int hit2 = GetBuffer().HitTest(dc, context, logicalPt, position2, & hitObj2, & contextObj2, 0);
if (hit2 != wxRICHTEXT_HITTEST_NONE && !(hit2 & wxRICHTEXT_HITTEST_OUTSIDE) && hitObj2 && hitObj != hitObj2)
{
// See if we can find a common ancestor
wxPoint logicalPt = event.GetLogicalPosition(dc);
wxRichTextObject* hitObj = NULL;
wxRichTextObject* contextObj = NULL;
- int hit = GetFocusObject()->HitTest(dc, logicalPt, position, & hitObj, & contextObj);
+ wxRichTextDrawingContext context(& GetBuffer());
+ int hit = GetFocusObject()->HitTest(dc, context, logicalPt, position, & hitObj, & contextObj);
if (hitObj && hitObj->GetContainer() != GetFocusObject())
{
// 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)
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();
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();
}
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())
{
wxString text;
text = wxRichTextLineBreakChar;
- GetFocusObject()->InsertTextWithUndo(newPos+1, text, this, & GetBuffer());
+ GetFocusObject()->InsertTextWithUndo(& GetBuffer(), newPos+1, text, this);
m_caretAtLineStart = true;
PositionCaret();
}
else
- GetFocusObject()->InsertNewlineWithUndo(newPos+1, this, & GetBuffer(), wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE|wxRICHTEXT_INSERT_INTERACTIVE);
+ GetFocusObject()->InsertNewlineWithUndo(& GetBuffer(), newPos+1, this, wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE|wxRICHTEXT_INSERT_INTERACTIVE);
EndBatchUndo();
SetDefaultStyleToCursorStyle();
}
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)
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();
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)
{
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();
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();
}
}
}
+ if (!CanInsertContent(* GetFocusObject(), m_caretPosition+1))
+ return;
+
+ if (HasSelection() && !CanDeleteRange(* GetFocusObject(), GetSelectionRange()))
+ return;
+
BeginBatchUndo(_("Insert Text"));
long newPos = m_caretPosition;
#else
wxString str = (wxChar) event.GetKeyCode();
#endif
- GetFocusObject()->InsertTextWithUndo(newPos+1, str, this, & GetBuffer(), 0);
+ GetFocusObject()->InsertTextWithUndo(& GetBuffer(), newPos+1, str, this, 0);
EndBatchUndo();
}
}
+bool wxRichTextCtrl::ProcessMouseMovement(wxRichTextParagraphLayoutBox* container, wxRichTextObject* WXUNUSED(obj), long position, const wxPoint& WXUNUSED(pos))
+{
+ wxRichTextAttr attr;
+ if (container && GetStyle(position, attr, container))
+ {
+ if (attr.HasFlag(wxTEXT_ATTR_URL))
+ {
+ SetCursor(m_urlCursor);
+ }
+ else if (!attr.HasFlag(wxTEXT_ATTR_URL))
+ {
+ SetCursor(m_textCursor);
+ }
+ return true;
+ }
+ else
+ return false;
+}
+
/// Delete content if there is a selection, e.g. when pressing a key.
bool wxRichTextCtrl::DeleteSelectedContent(long* newPos)
{
wxRichTextObject* hitObj = NULL;
wxRichTextObject* contextObj = NULL;
- int hitTest = container->HitTest(dc, pt, newPos, & hitObj, & contextObj, hitTestFlags);
+ wxRichTextDrawingContext context(& GetBuffer());
+ int hitTest = container->HitTest(dc, context, pt, newPos, & hitObj, & contextObj, hitTestFlags);
if (hitObj &&
((hitTest & wxRICHTEXT_HITTEST_NONE) == 0) &&
wxRichTextObject* hitObj = NULL;
wxRichTextObject* contextObj = NULL;
- int hit = ((wxRichTextCtrl*)this)->GetFocusObject()->HitTest(dc, pt2, *pos, & hitObj, & contextObj, wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS);
+ wxRichTextDrawingContext context((wxRichTextBuffer*) & GetBuffer());
+ int hit = ((wxRichTextCtrl*)this)->GetFocusObject()->HitTest(dc, context, pt2, *pos, & hitObj, & contextObj, wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS);
if ((hit & wxRICHTEXT_HITTEST_BEFORE) && (hit & wxRICHTEXT_HITTEST_OUTSIDE))
return wxTE_HT_BEFORE;
wxPoint logicalPt = GetLogicalPoint(pt);
wxRichTextObject* contextObj = NULL;
- hit = GetBuffer().HitTest(dc, logicalPt, position, &hitObj, &contextObj, flags);
+ wxRichTextDrawingContext context(& GetBuffer());
+ hit = GetBuffer().HitTest(dc, context, logicalPt, position, &hitObj, &contextObj, flags);
wxRichTextParagraphLayoutBox* container = wxDynamicCast(contextObj, wxRichTextParagraphLayoutBox);
return container;
{
wxString valueUnix = wxTextFile::Translate(value, wxTextFileType_Unix);
- GetFocusObject()->InsertTextWithUndo(m_caretPosition+1, valueUnix, this, & GetBuffer(), wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE);
+ GetFocusObject()->InsertTextWithUndo(& GetBuffer(), m_caretPosition+1, valueUnix, this, wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE);
if ( flags & SetValue_SendEvent )
wxTextCtrl::SendTextUpdatedEvent(this);
bool wxRichTextCtrl::WriteImage(const wxRichTextImageBlock& imageBlock, const wxRichTextAttr& textAttr)
{
- return GetFocusObject()->InsertImageWithUndo(m_caretPosition+1, imageBlock, this, & GetBuffer(), 0, textAttr);
+ return GetFocusObject()->InsertImageWithUndo(& GetBuffer(), m_caretPosition+1, imageBlock, this, 0, textAttr);
}
bool wxRichTextCtrl::WriteImage(const wxBitmap& bitmap, wxBitmapType bitmapType, const wxRichTextAttr& textAttr)
// The object returned is the one actually inserted into the buffer,
// while the original one is deleted.
- wxRichTextObject* obj = GetFocusObject()->InsertObjectWithUndo(m_caretPosition+1, textBox, this, & GetBuffer(), wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE);
+ wxRichTextObject* obj = GetFocusObject()->InsertObjectWithUndo(& GetBuffer(), m_caretPosition+1, textBox, this, wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE);
wxRichTextBox* box = wxDynamicCast(obj, wxRichTextBox);
return box;
}
// The object returned is the one actually inserted into the buffer,
// while the original one is deleted.
- wxRichTextObject* obj = GetFocusObject()->InsertObjectWithUndo(m_caretPosition+1, table, this, & GetBuffer(), wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE);
+ wxRichTextObject* obj = GetFocusObject()->InsertObjectWithUndo(& GetBuffer(), m_caretPosition+1, table, this, wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE);
wxRichTextTable* tableResult = wxDynamicCast(obj, wxRichTextTable);
return tableResult;
}
/// Insert a newline (actually paragraph) at the current insertion point.
bool wxRichTextCtrl::Newline()
{
- return GetFocusObject()->InsertNewlineWithUndo(m_caretPosition+1, this, & GetBuffer(), wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE);
+ return GetFocusObject()->InsertNewlineWithUndo(& GetBuffer(), m_caretPosition+1, this, wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE);
}
/// Insert a line break at the current insertion point.
{
wxString text;
text = wxRichTextLineBreakChar;
- return GetFocusObject()->InsertTextWithUndo(m_caretPosition+1, text, this, & GetBuffer());
+ return GetFocusObject()->InsertTextWithUndo(& GetBuffer(), m_caretPosition+1, text, this);
}
// ----------------------------------------------------------------------------
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();
bool wxRichTextCtrl::CanDeleteSelection() const
{
- return HasSelection() && IsEditable();
+ return HasSelection() && IsEditable() && CanDeleteRange(* GetFocusObject(), GetSelectionRange());
}
if (idx >= 0 && idx < m_contextMenuPropertiesInfo.GetCount())
{
wxRichTextObject* obj = m_contextMenuPropertiesInfo.GetObject(idx);
- if (obj && obj->CanEditProperties())
- obj->EditProperties(this, & GetBuffer());
+ if (obj && CanEditProperties(obj))
+ EditProperties(obj, this);
m_contextMenuPropertiesInfo.Clear();
}
if (pt != wxDefaultPosition)
{
wxPoint logicalPt = GetLogicalPoint(ScreenToClient(pt));
- int hit = GetBuffer().HitTest(dc, logicalPt, position, & hitObj, & contextObj);
+ wxRichTextDrawingContext context(& GetBuffer());
+ int hit = GetBuffer().HitTest(dc, context, logicalPt, position, & hitObj, & contextObj);
if (hit == wxRICHTEXT_HITTEST_ON || hit == wxRICHTEXT_HITTEST_BEFORE || hit == wxRICHTEXT_HITTEST_AFTER)
{
}
if (addPropertyCommands)
- m_contextMenuPropertiesInfo.AddItems(actualContainer, hitObj);
+ m_contextMenuPropertiesInfo.AddItems(this, actualContainer, hitObj);
}
else
{
if (addPropertyCommands)
- m_contextMenuPropertiesInfo.AddItems(GetFocusObject(), NULL);
+ m_contextMenuPropertiesInfo.AddItems(this, GetFocusObject(), NULL);
}
}
else
{
if (addPropertyCommands)
- m_contextMenuPropertiesInfo.AddItems(GetFocusObject(), NULL);
+ m_contextMenuPropertiesInfo.AddItems(this, GetFocusObject(), NULL);
}
}
else
if (hitObj && actualContainer)
{
if (addPropertyCommands)
- m_contextMenuPropertiesInfo.AddItems(actualContainer, hitObj);
+ m_contextMenuPropertiesInfo.AddItems(this, actualContainer, hitObj);
}
else
{
if (addPropertyCommands)
- m_contextMenuPropertiesInfo.AddItems(GetFocusObject(), NULL);
+ m_contextMenuPropertiesInfo.AddItems(this, GetFocusObject(), NULL);
}
}
return container->GetUncombinedStyle(position, style);
}
+bool wxRichTextCtrl::SetProperties(const wxRichTextRange& range, const wxRichTextProperties& properties, int flags)
+{
+ return GetFocusObject()->SetProperties(range.ToInternal(), properties, flags);
+}
+
/// Set font, and also the buffer attributes
bool wxRichTextCtrl::SetFont(const wxFont& font)
{
if (!container)
container = GetFocusObject();
- if (container->FindPosition(dc, position, pt, & height, m_caretAtLineStart))
+ wxRichTextDrawingContext context(& GetBuffer());
+ if (container->FindPosition(dc, context, position, pt, & height, m_caretAtLineStart))
{
// Caret height can't be zero
if (height == 0)
PrepareDC(dc);
+ wxRichTextDrawingContext context(& GetBuffer());
GetBuffer().Defragment();
GetBuffer().UpdateRanges(); // If items were deleted, ranges need recalculation
- GetBuffer().Layout(dc, availableSpace, flags);
+ GetBuffer().Layout(dc, context, availableSpace, availableSpace, flags);
GetBuffer().Invalidate(wxRICHTEXT_NONE);
if (!IsFrozen())
// If at the start of a paragraph, use the next position.
long pos = GetAdjustedCaretPosition(GetCaretPosition());
- if (GetUncombinedStyle(pos, attr))
+ wxRichTextObject* obj = GetFocusObject()->GetLeafObjectAtPosition(pos);
+ if (obj && obj->IsTopLevel())
+ {
+ // Don't use the attributes of a top-level object, since they might apply
+ // to content of the object, e.g. background colour.
+ SetDefaultStyle(wxRichTextAttr());
+ return true;
+ }
+ else if (GetUncombinedStyle(pos, attr))
{
SetDefaultStyle(attr);
return true;
wxRichTextParagraphLayoutBox* originContainer = GetSelection().GetContainer();
wxRichTextParagraphLayoutBox* destContainer = GetFocusObject(); // This will be the drop container, not necessarily the same as the origin one
-
wxRichTextBuffer* richTextBuffer = ((wxRichTextBufferDataObject*)DataObj)->GetRichTextBuffer();
if (richTextBuffer)
{
originContainer->DeleteRangeWithUndo(selectionrange, this, &GetBuffer());
}
- destContainer->InsertParagraphsWithUndo(position+1, *richTextBuffer, this, &GetBuffer(), 0);
+ destContainer->InsertParagraphsWithUndo(&GetBuffer(), position+1, *richTextBuffer, this, 0);
ShowPosition(position + richTextBuffer->GetOwnRange().GetEnd());
delete richTextBuffer;
originContainer->DeleteRangeWithUndo(selectionrange, this, &GetBuffer());
}
-
SelectNone();
Refresh();
}
}
#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
// Add appropriate menu items for the current container and clicked on object
// (and container's parent, if appropriate).
-int wxRichTextContextMenuPropertiesInfo::AddItems(wxRichTextObject* container, wxRichTextObject* obj)
+int wxRichTextContextMenuPropertiesInfo::AddItems(wxRichTextCtrl* ctrl, wxRichTextObject* container, wxRichTextObject* obj)
{
Clear();
- if (obj && obj->CanEditProperties())
- AddItem(obj->GetPropertiesMenuLabel(), obj);
+ if (obj && ctrl->CanEditProperties(obj))
+ AddItem(ctrl->GetPropertiesMenuLabel(obj), obj);
- if (container && container != obj && container->CanEditProperties() && m_labels.Index(container->GetPropertiesMenuLabel()) == wxNOT_FOUND)
- AddItem(container->GetPropertiesMenuLabel(), container);
+ if (container && container != obj && ctrl->CanEditProperties(container) && m_labels.Index(ctrl->GetPropertiesMenuLabel(container)) == wxNOT_FOUND)
+ AddItem(ctrl->GetPropertiesMenuLabel(container), container);
- if (container && container->GetParent() && container->GetParent()->CanEditProperties() && m_labels.Index(container->GetParent()->GetPropertiesMenuLabel()) == wxNOT_FOUND)
- AddItem(container->GetParent()->GetPropertiesMenuLabel(), container->GetParent());
+ if (container && container->GetParent() && ctrl->CanEditProperties(container->GetParent()) && m_labels.Index(ctrl->GetPropertiesMenuLabel(container->GetParent())) == wxNOT_FOUND)
+ AddItem(ctrl->GetPropertiesMenuLabel(container->GetParent()), container->GetParent());
return GetCount();
}