X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/89b674772cc165690533e3226e2f5ab944a27eb3..fbd11d30c8499ef25989974ef6ec16fb5b759668:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index e285303d8d..00ff8362af 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -245,12 +245,9 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, #endif // base initialization - if ( !CreateBase(parent, id, pos, size, style, validator, name) ) + if ( !CreateControl(parent, id, pos, size, style, validator, name) ) return FALSE; - if ( parent ) - parent->AddChild(this); - // translate wxWin style flags to MSW ones WXDWORD msStyle = MSWGetCreateWindowFlags(); @@ -461,7 +458,12 @@ WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const if ( style & wxTE_DONTWRAP ) { // automatically scroll the control horizontally as necessary - msStyle |= WS_HSCROLL; + // + // NB: ES_AUTOHSCROLL is needed for richedit controls or they don't + // show horz scrollbar at all, even in spite of WS_HSCROLL, and as + // it doesn't seem to do any harm for plain edit controls, add it + // always + msStyle |= WS_HSCROLL | ES_AUTOHSCROLL; } if ( style & wxTE_READONLY ) @@ -1181,7 +1183,7 @@ bool wxTextCtrl::IsEditable() const void wxTextCtrl::SetSelection(long from, long to) { - // if from and to are both -1, it means (in wxWindows) that all text should + // if from and to are both -1, it means (in wxWidgets) that all text should // be selected - translate into Windows convention if ( (from == -1) && (to == -1) ) { @@ -1359,7 +1361,7 @@ bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const } wxTextCtrlHitTestResult -wxTextCtrl::HitTest(const wxPoint& pt, wxTextCoord *col, wxTextCoord *row) const +wxTextCtrl::HitTest(const wxPoint& pt, long *posOut) const { // first get the position from Windows LPARAM lParam; @@ -1438,11 +1440,8 @@ wxTextCtrl::HitTest(const wxPoint& pt, wxTextCoord *col, wxTextCoord *row) const else rc = wxTE_HT_ON_TEXT; - // finally translate to column/row - if ( !PositionToXY(pos, col, row) ) - { - wxFAIL_MSG( _T("PositionToXY() not expected to fail in HitTest()") ); - } + if ( posOut ) + *posOut = pos; return rc; } @@ -1533,6 +1532,11 @@ wxString wxTextCtrl::GetLineText(long lineNo) const void wxTextCtrl::SetMaxLength(unsigned long len) { +#if wxUSE_RICHEDIT + if (IsRich()) + ::SendMessage(GetHwnd(), EM_EXLIMITTEXT, 0, (LPARAM) (DWORD) len); + else +#endif ::SendMessage(GetHwnd(), EM_LIMITTEXT, len, 0); } @@ -1552,6 +1556,11 @@ void wxTextCtrl::Redo() { if (CanRedo()) { +#if wxUSE_RICHEDIT + if (GetRichVersion() > 1) + ::SendMessage(GetHwnd(), EM_REDO, 0, 0); + else +#endif // Same as Undo, since Undo undoes the undo, i.e. a redo. ::SendMessage(GetHwnd(), EM_UNDO, 0, 0); } @@ -1564,6 +1573,11 @@ bool wxTextCtrl::CanUndo() const bool wxTextCtrl::CanRedo() const { +#if wxUSE_RICHEDIT + if (GetRichVersion() > 1) + return ::SendMessage(GetHwnd(), EM_CANREDO, 0, 0) != 0; + else +#endif return ::SendMessage(GetHwnd(), EM_CANUNDO, 0, 0) != 0; } @@ -1689,11 +1703,6 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) break; case WXK_TAB: - // always produce navigation event -- even if we process TAB - // ourselves the fact that we got here means that the user code - // decided to skip processing of this TAB -- probably to let it - // do its default job. - // ok, so this is getting absolutely ridiculous but I don't see // any other way to fix this bug: when a multiline text control is // inside a wxFrame, we need to generate the navigation event as @@ -1708,15 +1717,24 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) // the right thing to do would, of course, be to understand what // the hell is IsDialogMessage() doing but this is beyond my feeble // forces at the moment unfortunately - if ( FindFocus() == this ) + if ( !(m_windowStyle & wxTE_PROCESS_TAB)) { - wxNavigationKeyEvent eventNav; - eventNav.SetDirection(!event.ShiftDown()); - eventNav.SetWindowChange(event.ControlDown()); - eventNav.SetEventObject(this); - - if ( GetParent()->GetEventHandler()->ProcessEvent(eventNav) ) - return; + if ( FindFocus() == this ) + { + int flags = 0; + if (!event.ShiftDown()) + flags |= wxNavigationKeyEvent::IsForward ; + if (event.ControlDown()) + flags |= wxNavigationKeyEvent::WinChange ; + if (Navigate(flags)) + return; + } + } + else + { + // Insert tab since calling the default Windows handler + // doesn't seem to do it + WriteText(wxT("\t")); } break; } @@ -1923,7 +1941,7 @@ bool wxTextCtrl::AcceptsFocus() const wxSize wxTextCtrl::DoGetBestSize() const { int cx, cy; - wxGetCharSize(GetHWND(), &cx, &cy, &GetFont()); + wxGetCharSize(GetHWND(), &cx, &cy, GetFont()); int wText = DEFAULT_ITEM_WIDTH; @@ -2306,7 +2324,7 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style) cf.dwEffects |= CFE_UNDERLINE; } - // strikeout fonts are not supported by wxWindows + // strikeout fonts are not supported by wxWidgets } if ( style.HasTextColour() )