// dummy value used for m_dropTarget, different from any valid pointer value
// (which are all even under Windows) and NULL
static wxDropTarget *
- wxRICHTEXT_DEFAULT_DROPTARGET = wx_reinterpret_cast(wxDropTarget *, 1);
+ wxRICHTEXT_DEFAULT_DROPTARGET = reinterpret_cast<wxDropTarget *>(1);
#endif // wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT
private:
int& m_count;
- DECLARE_NO_COPY_CLASS(UpdatesCountFilter)
+ wxDECLARE_NO_COPY_CLASS(UpdatesCountFilter);
};
// ----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase)
EVT_CHAR(wxTextCtrl::OnChar)
+ EVT_KEY_DOWN(wxTextCtrl::OnKeyDown)
EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
#if wxUSE_RICHEDIT
}
#endif
+#if wxUSE_INKEDIT
if (!IsInkEdit())
+#endif // wxUSE_INKEDIT
{
if ( m_verRichEdit == 2 )
{
valueWin = value;
}
+ // suppress events sent during control creation: we're called either from
+ // the ctor and then we shouldn't generate any events for compatibility
+ // with the other ports, or from SetWindowStyleFlag() and then we shouldn't
+ // generate the events because our text doesn't really change, the fact
+ // that we (sometimes) need to recreate the control is just an
+ // implementation detail
+ m_updatesCount = -2;
+
if ( !MSWCreateControl(windowClass.wx_str(), msStyle, pos, size, valueWin) )
return false;
+ m_updatesCount = -1;
+
#if wxUSE_RICHEDIT
if (IsRich())
{
else
#endif // wxUSE_RICHEDIT
{
- // retrieve all text
- str = wxGetWindowText(GetHWND());
+ // retrieve all text: wxTextEntry method works even for multiline
+ // controls and must be used for single line ones to account for hints
+ str = wxTextEntry::GetValue();
// need only a range?
if ( from < to )
// comparing it with the old one (chances are that it will be different
// anyhow, this comparison is there to avoid flicker for small single-line
// edit controls mostly)
- if ( (value.length() > 0x400) || (value != GetValue()) )
+ if ( (value.length() > 0x400) || (value != DoGetValue()) )
{
DoWriteText(value, flags /* doesn't include SelectionOnly here */);
// TODO: using memcpy() would improve performance a lot for big amounts of text
DWORD CALLBACK
-wxRichEditStreamIn(DWORD dwCookie, BYTE *buf, LONG cb, LONG *pcb)
+wxRichEditStreamIn(DWORD_PTR dwCookie, BYTE *buf, LONG cb, LONG *pcb)
{
*pcb = 0;
if (len == wxCONV_FAILED)
return false;
-#if wxUSE_WCHAR_T
- wxWCharBuffer wchBuf(len);
+ wxWCharBuffer wchBuf(len); // allocates one extra character
wchar_t *wpc = wchBuf.data();
-#else
- wchar_t *wchBuf = (wchar_t *)malloc((len + 1)*sizeof(wchar_t));
- wchar_t *wpc = wchBuf;
-#endif
- conv.MB2WC(wpc, value.mb_str(), value.length());
+ conv.MB2WC(wpc, value.mb_str(), len + 1);
#endif // wxUSE_UNICODE_MSLU
// finally, stream it in the control
EDITSTREAM eds;
wxZeroMemory(eds);
- eds.dwCookie = (DWORD)&wpc;
+ eds.dwCookie = (DWORD_PTR)&wpc;
// the cast below is needed for broken (very) old mingw32 headers
eds.pfnCallback = (EDITSTREAMCALLBACK)wxRichEditStreamIn;
event.Skip();
}
+void wxTextCtrl::OnKeyDown(wxKeyEvent& event)
+{
+ // richedit control doesn't send WM_PASTE, WM_CUT and WM_COPY messages
+ // when Ctrl-V, X or C is pressed and this prevents wxClipboardTextEvent
+ // from working. So we work around it by intercepting these shortcuts
+ // ourselves and emitting clipboard events (which richedit will handle,
+ // so everything works as before, including pasting of rich text):
+ if ( event.GetModifiers() == wxMOD_CONTROL && IsRich() )
+ {
+ switch ( event.GetKeyCode() )
+ {
+ case 'C':
+ Copy();
+ return;
+ case 'X':
+ Cut();
+ return;
+ case 'V':
+ Paste();
+ return;
+ default:
+ break;
+ }
+ }
+
+ // no, we didn't process it
+ event.Skip();
+}
+
WXLRESULT wxTextCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{
WXLRESULT lRc = wxTextCtrlBase::MSWWindowProc(nMsg, wParam, lParam);
else // !editable
{
// NB: use "=", not "|=" as the base class version returns
- // the same flags is this state as usual (i.e.
+ // the same flags in the disabled state as usual (i.e.
// including DLGC_WANTMESSAGE). This is strange (how
// does it work in the native Win32 apps?) but for now
// live with it.
void wxTextCtrl::OnDelete(wxCommandEvent& WXUNUSED(event))
{
- long from, to;
- GetSelection(& from, & to);
- if (from != -1 && to != -1)
- Remove(from, to);
+ RemoveSelection();
}
void wxTextCtrl::OnSelectAll(wxCommandEvent& WXUNUSED(event))
cf.yHeight = 20*font.GetPointSize(); // 1 pt = 20 twips
cf.bCharSet = lf.lfCharSet;
cf.bPitchAndFamily = lf.lfPitchAndFamily;
- wxStrncpy( cf.szFaceName, lf.lfFaceName, WXSIZEOF(cf.szFaceName) );
+ wxStrlcpy(cf.szFaceName, lf.lfFaceName, WXSIZEOF(cf.szFaceName));
// also deal with underline/italic/bold attributes: note that we must
// always set CFM_ITALIC &c bits in dwMask, even if we don't set the
// load the InkEdit library
bool wxRichEditModule::LoadInkEdit()
{
- static wxDynamicLibrary ms_inkEditLib;
- static bool ms_inkEditLibLoadAttemped;
if (ms_inkEditLibLoadAttemped)
- ms_inkEditLib.IsLoaded();
+ return ms_inkEditLib.IsLoaded();
ms_inkEditLibLoadAttemped = true;