X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4676948b6814c97b93c431a8cbcd8c0352c87ba9..7d2d5d81951888e76f93b33aca9899a9c480022b:/src/msw/textctrl.cpp?ds=inline diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 05df7e86d2..dc40f52b81 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -13,7 +13,7 @@ // declarations // ============================================================================ -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "textctrl.h" #endif @@ -52,6 +52,7 @@ #include #include "wx/msw/private.h" +#include "wx/msw/winundef.h" #include #include @@ -115,7 +116,72 @@ IMPLEMENT_DYNAMIC_CLASS(wxRichEditModule, wxModule) // event tables and other macros // ---------------------------------------------------------------------------- +#if wxUSE_EXTENDED_RTTI +WX_DEFINE_FLAGS( wxTextCtrlStyle ) + +WX_BEGIN_FLAGS( wxTextCtrlStyle ) + // new style border flags, we put them first to + // use them for streaming out + WX_FLAGS_MEMBER(wxBORDER_SIMPLE) + WX_FLAGS_MEMBER(wxBORDER_SUNKEN) + WX_FLAGS_MEMBER(wxBORDER_DOUBLE) + WX_FLAGS_MEMBER(wxBORDER_RAISED) + WX_FLAGS_MEMBER(wxBORDER_STATIC) + WX_FLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + WX_FLAGS_MEMBER(wxSIMPLE_BORDER) + WX_FLAGS_MEMBER(wxSUNKEN_BORDER) + WX_FLAGS_MEMBER(wxDOUBLE_BORDER) + WX_FLAGS_MEMBER(wxRAISED_BORDER) + WX_FLAGS_MEMBER(wxSTATIC_BORDER) + WX_FLAGS_MEMBER(wxNO_BORDER) + + // standard window styles + WX_FLAGS_MEMBER(wxTAB_TRAVERSAL) + WX_FLAGS_MEMBER(wxCLIP_CHILDREN) + WX_FLAGS_MEMBER(wxTRANSPARENT_WINDOW) + WX_FLAGS_MEMBER(wxWANTS_CHARS) + WX_FLAGS_MEMBER(wxNO_FULL_REPAINT_ON_RESIZE) + WX_FLAGS_MEMBER(wxALWAYS_SHOW_SB ) + WX_FLAGS_MEMBER(wxVSCROLL) + WX_FLAGS_MEMBER(wxHSCROLL) + + WX_FLAGS_MEMBER(wxTE_PROCESS_ENTER) + WX_FLAGS_MEMBER(wxTE_PROCESS_TAB) + WX_FLAGS_MEMBER(wxTE_MULTILINE) + WX_FLAGS_MEMBER(wxTE_PASSWORD) + WX_FLAGS_MEMBER(wxTE_READONLY) + WX_FLAGS_MEMBER(wxHSCROLL) + WX_FLAGS_MEMBER(wxTE_RICH) + WX_FLAGS_MEMBER(wxTE_RICH2) + WX_FLAGS_MEMBER(wxTE_AUTO_URL) + WX_FLAGS_MEMBER(wxTE_NOHIDESEL) + WX_FLAGS_MEMBER(wxTE_LEFT) + WX_FLAGS_MEMBER(wxTE_CENTRE) + WX_FLAGS_MEMBER(wxTE_RIGHT) + WX_FLAGS_MEMBER(wxTE_DONTWRAP) + WX_FLAGS_MEMBER(wxTE_LINEWRAP) + WX_FLAGS_MEMBER(wxTE_WORDWRAP) + +WX_END_FLAGS( wxTextCtrlStyle ) + +IMPLEMENT_DYNAMIC_CLASS_XTI(wxTextCtrl, wxControl,"wx/textctrl.h") + +WX_BEGIN_PROPERTIES_TABLE(wxTextCtrl) + WX_PROPERTY( Font , wxFont , SetFont , GetFont ,, 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) + WX_PROPERTY( Value , wxString , SetValue, GetValue, wxEmptyString , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + WX_PROPERTY_FLAGS( WindowStyle , wxTextCtrlStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style +WX_END_PROPERTIES_TABLE() + +WX_BEGIN_HANDLERS_TABLE(wxTextCtrl) +WX_END_HANDLERS_TABLE() + +WX_CONSTRUCTOR_6( wxTextCtrl , wxWindow* , Parent , wxWindowID , Id , wxString , Value , wxPoint , Position , wxSize , Size , long , WindowStyle) +#else IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl) +#endif + BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) EVT_CHAR(wxTextCtrl::OnChar) @@ -143,6 +209,8 @@ BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) #ifdef __WIN16__ EVT_ERASE_BACKGROUND(wxTextCtrl::OnEraseBackground) #endif + + EVT_SET_FOCUS(wxTextCtrl::OnSetFocus) END_EVENT_TABLE() // ============================================================================ @@ -161,6 +229,7 @@ void wxTextCtrl::Init() m_privateContextMenu = NULL; m_suppressNextUpdate = FALSE; + m_isNativeCaretShown = true; } wxTextCtrl::~wxTextCtrl() @@ -464,30 +533,32 @@ wxString wxTextCtrl::GetRange(long from, long to) const int len = GetWindowTextLength(GetHwnd()); if ( len > from ) { - // alloc one extra WORD as needed by the control - wxChar *p = str.GetWriteBuf(++len); + { + // alloc one extra WORD as needed by the control + wxStringBuffer tmp(str, ++len); + wxChar *p = tmp; - TEXTRANGE textRange; - textRange.chrg.cpMin = from; - textRange.chrg.cpMax = to == -1 ? len : to; - textRange.lpstrText = p; + TEXTRANGE textRange; + textRange.chrg.cpMin = from; + textRange.chrg.cpMax = to == -1 ? len : to; + textRange.lpstrText = p; - (void)SendMessage(GetHwnd(), EM_GETTEXTRANGE, 0, (LPARAM)&textRange); + (void)SendMessage(GetHwnd(), EM_GETTEXTRANGE, + 0, (LPARAM)&textRange); - if ( m_verRichEdit > 1 ) - { - // RichEdit 2.0 uses just CR ('\r') for the newlines which is - // neither Unix nor Windows style - convert it to something - // reasonable - for ( ; *p; p++ ) + if ( m_verRichEdit > 1 ) { - if ( *p == _T('\r') ) - *p = _T('\n'); + // RichEdit 2.0 uses just CR ('\r') for the + // newlines which is neither Unix nor Windows + // style - convert it to something reasonable + for ( ; *p; p++ ) + { + if ( *p == _T('\r') ) + *p = _T('\n'); + } } } - str.UngetWriteBuf(); - if ( m_verRichEdit == 1 ) { // convert to the canonical form - see comment below @@ -527,6 +598,11 @@ void wxTextCtrl::SetValue(const wxString& value) { DoWriteText(value, FALSE /* not selection only */); } + else // same text + { + // still send an event for consistency + SendUpdateEvent(); + } // we should reset the modified flag even if the value didn't really change @@ -1192,13 +1268,16 @@ wxString wxTextCtrl::GetLineText(long lineNo) const len += sizeof(WORD); wxString str; - wxChar *buf = str.GetWriteBuf(len); - - *(WORD *)buf = (WORD)len; - len = (size_t)::SendMessage(GetHwnd(), EM_GETLINE, lineNo, (LPARAM)buf); - buf[len] = 0; + { + wxStringBufferLength tmp(str, len); + wxChar *buf = tmp; - str.UngetWriteBuf(len); + *(WORD *)buf = (WORD)len; + len = (size_t)::SendMessage(GetHwnd(), EM_GETLINE, + lineNo, (LPARAM)buf); + buf[len] = 0; + tmp.SetLength(len); + } return str; } @@ -1239,6 +1318,27 @@ bool wxTextCtrl::CanRedo() const return ::SendMessage(GetHwnd(), EM_CANUNDO, 0, 0) != 0; } +// ---------------------------------------------------------------------------- +// caret handling (Windows only) +// ---------------------------------------------------------------------------- + +bool wxTextCtrl::ShowNativeCaret(bool show) +{ + if ( show != m_isNativeCaretShown ) + { + if ( !(show ? ::ShowCaret(GetHwnd()) : ::HideCaret(GetHwnd())) ) + { + // not an error, may simply indicate that it's not shown/hidden + // yet (i.e. it had been hidden/showh 2 times before) + return false; + } + + m_isNativeCaretShown = show; + } + + return true; +} + // ---------------------------------------------------------------------------- // implemenation details // ---------------------------------------------------------------------------- @@ -1634,7 +1734,7 @@ void wxTextCtrl::OnRedo(wxCommandEvent& WXUNUSED(event)) Redo(); } -void wxTextCtrl::OnDelete(wxCommandEvent& event) +void wxTextCtrl::OnDelete(wxCommandEvent& WXUNUSED(event)) { long from, to; GetSelection(& from, & to); @@ -1642,7 +1742,7 @@ void wxTextCtrl::OnDelete(wxCommandEvent& event) Remove(from, to); } -void wxTextCtrl::OnSelectAll(wxCommandEvent& event) +void wxTextCtrl::OnSelectAll(wxCommandEvent& WXUNUSED(event)) { SetSelection(-1, -1); } @@ -1710,6 +1810,15 @@ void wxTextCtrl::OnRightClick(wxMouseEvent& event) event.Skip(); } +void wxTextCtrl::OnSetFocus(wxFocusEvent& WXUNUSED(event)) +{ + // be sure the caret remains invisible if the user had hidden it + if ( !m_isNativeCaretShown ) + { + ::HideCaret(GetHwnd()); + } +} + // the rest of the file only deals with the rich edit controls #if wxUSE_RICHEDIT @@ -1805,7 +1914,7 @@ bool wxTextCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) } return TRUE; } - + // not processed, leave it to the base class return wxTextCtrlBase::MSWOnNotify(idCtrl, lParam, result); } @@ -2233,6 +2342,7 @@ void wxRichEditModule::OnExit() if ( ms_hRichEdit[i] ) { ::FreeLibrary(ms_hRichEdit[i]); + ms_hRichEdit[i] = NULL; } } }