/////////////////////////////////////////////////////////////////////////////
-// Name: src/richtext/richeditctrl.cpp
+// Name: src/richtext/richtextctrl.cpp
// Purpose: A rich edit control
// Author: Julian Smart
// Modified by:
validator, name))
return false;
- if (!GetFont().Ok())
+ if (!GetFont().IsOk())
{
SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
}
if (GetCaret())
GetCaret()->Show();
PositionCaret();
+#else
+#if !defined(__WXMAC__)
+ // Causes caret dropouts on Mac
+ PositionCaret();
+#endif
#endif
}
// For now, don't handle shift-click when we're selecting multiple objects.
if (event.ShiftDown() && GetFocusObject() == oldFocusObject && m_selectionState == wxRichTextCtrlSelectionState_Normal)
- {
- if (!m_selection.IsValid())
- ExtendSelection(oldCaretPos, m_caretPosition, wxRICHTEXT_SHIFT_DOWN);
- else
- ExtendSelection(m_caretPosition, m_caretPosition, wxRICHTEXT_SHIFT_DOWN);
- }
+ ExtendSelection(oldCaretPos, m_caretPosition, wxRICHTEXT_SHIFT_DOWN);
else
SelectNone();
}
SetDefaultStyleToCursorStyle();
ScrollIntoView(m_caretPosition, WXK_RIGHT);
+ cmdEvent.SetPosition(m_caretPosition);
GetEventHandler()->ProcessEvent(cmdEvent);
Update();
wxSize clientSize = GetClientSize();
clientSize.y -= GetBuffer().GetBottomMargin();
- return (rect.GetBottom() > (startY + GetBuffer().GetTopMargin())) && (rect.GetTop() < (startY + clientSize.y));
+ return (rect.GetTop() >= (startY + GetBuffer().GetTopMargin())) && (rect.GetBottom() <= (startY + clientSize.y));
}
void wxRichTextCtrl::SetCaretPosition(long position, bool showAtLineStart)
}
wxRichTextParagraphLayoutBox* container = GetFocusObject();
- int hitTestFlags = wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS;
+ int hitTestFlags = wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS|wxRICHTEXT_HITTEST_NO_FLOATING_OBJECTS;
if (notInThisObject)
{
// If we know we're navigating out of the current object,
// try to find an object anywhere in the buffer at the new position (up or down a bit)
container = & GetBuffer();
- hitTestFlags = 0;
+ hitTestFlags &= ~wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS;
if (noLines > 0) // going down
{
wxRichTextObject* contextObj = NULL;
int hitTest = container->HitTest(dc, pt, newPos, & hitObj, & contextObj, hitTestFlags);
- if (hitTest != wxRICHTEXT_HITTEST_NONE && hitObj)
+ if (hitObj &&
+ ((hitTest & wxRICHTEXT_HITTEST_NONE) == 0) &&
+ (! (hitObj == (& m_buffer) && ((hitTest & wxRICHTEXT_HITTEST_OUTSIDE) != 0))) // outside the buffer counts as 'do nothing'
+ )
{
if (notInThisObject)
{
event.Skip();
}
+// Force any pending layout due to large buffer
+void wxRichTextCtrl::ForceDelayedLayout()
+{
+ if (m_fullLayoutRequired)
+ {
+ m_fullLayoutRequired = false;
+ m_fullLayoutTime = 0;
+ GetBuffer().Invalidate(wxRICHTEXT_ALL);
+ ShowPosition(m_fullLayoutSavedPosition);
+ Refresh(false);
+ Update();
+ }
+}
/// Idle-time processing
void wxRichTextCtrl::OnIdle(wxIdleEvent& event)
void wxRichTextCtrl::PaintBackground(wxDC& dc)
{
wxColour backgroundColour = GetBackgroundColour();
- if (!backgroundColour.Ok())
+ if (!backgroundColour.IsOk())
backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
// Clear the background
if (sz.x < 1 || sz.y < 1)
return false;
- if (!m_bufferBitmap.Ok() || m_bufferBitmap.GetWidth() < sz.x || m_bufferBitmap.GetHeight() < sz.y)
+ if (!m_bufferBitmap.IsOk() || m_bufferBitmap.GetWidth() < sz.x || m_bufferBitmap.GetHeight() < sz.y)
m_bufferBitmap = wxBitmap(sz.x, sz.y);
- return m_bufferBitmap.Ok();
+ return m_bufferBitmap.IsOk();
}
#endif
bool wxRichTextCtrl::WriteImage(const wxBitmap& bitmap, wxBitmapType bitmapType, const wxRichTextAttr& textAttr)
{
- if (bitmap.Ok())
+ if (bitmap.IsOk())
{
wxRichTextImageBlock imageBlock;
wxImage image = bitmap.ConvertToImage();
- if (image.Ok() && imageBlock.MakeImageBlock(image, bitmapType))
+ if (image.IsOk() && imageBlock.MakeImageBlock(image, bitmapType))
return WriteImage(imageBlock, textAttr);
}
// Editing
// ----------------------------------------------------------------------------
-void wxRichTextCtrl::Replace(long WXUNUSED(from), long WXUNUSED(to),
+void wxRichTextCtrl::Replace(long from, long to,
const wxString& value)
{
BeginBatchUndo(_("Replace"));
+ SetSelection(from, to);
+
+ wxRichTextAttr attr = GetDefaultStyle();
+
DeleteSelectedContent();
+ SetDefaultStyle(attr);
+
DoWriteText(value, SetValue_SelectionOnly);
EndBatchUndo();
bool wxRichTextCtrl::CanUndo() const
{
- return GetCommandProcessor()->CanUndo();
+ return GetCommandProcessor()->CanUndo() && IsEditable();
}
bool wxRichTextCtrl::CanRedo() const
{
- return GetCommandProcessor()->CanRedo();
+ return GetCommandProcessor()->CanRedo() && IsEditable();
}
// ----------------------------------------------------------------------------