X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/efe66bbc0e9f463a6dd3ad49717474dd801bebf3..adb799d6ef8e1ba754ab08b26e64fa40219f95f8:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 07593f4f37..5f85cb94b0 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -162,9 +162,9 @@ wxBEGIN_PROPERTIES_TABLE(wxTextCtrl) wxEVENT_PROPERTY( TextUpdated , wxEVT_COMMAND_TEXT_UPDATED , wxCommandEvent ) wxEVENT_PROPERTY( TextEnter , wxEVT_COMMAND_TEXT_ENTER , wxCommandEvent ) - wxPROPERTY( Font , wxFont , SetFont , GetFont ,, 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) + wxPROPERTY( Font , wxFont , SetFont , GetFont , EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) wxPROPERTY( Value , wxString , SetValue, GetValue, wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - wxPROPERTY_FLAGS( WindowStyle , wxTextCtrlStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style + wxPROPERTY_FLAGS( WindowStyle , wxTextCtrlStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style wxEND_PROPERTIES_TABLE() wxBEGIN_HANDLERS_TABLE(wxTextCtrl) @@ -199,9 +199,6 @@ BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo) EVT_UPDATE_UI(wxID_CLEAR, wxTextCtrl::OnUpdateDelete) EVT_UPDATE_UI(wxID_SELECTALL, wxTextCtrl::OnUpdateSelectAll) -#ifdef __WIN16__ - EVT_ERASE_BACKGROUND(wxTextCtrl::OnEraseBackground) -#endif EVT_SET_FOCUS(wxTextCtrl::OnSetFocus) END_EVENT_TABLE() @@ -242,6 +239,11 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString& name) { +#ifdef __WXWINCE__ + if ((style & wxBORDER_MASK) == 0) + style |= wxBORDER_SIMPLE; +#endif + // base initialization if ( !CreateBase(parent, id, pos, size, style, validator, name) ) return FALSE; @@ -688,7 +690,7 @@ struct wxStreamOutData }; DWORD CALLBACK -wxRichEditStreamOut(DWORD dwCookie, BYTE *buf, LONG cb, LONG *pcb) +wxRichEditStreamOut(DWORD_PTR dwCookie, BYTE *buf, LONG cb, LONG *pcb) { *pcb = 0; @@ -1179,7 +1181,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) ) { @@ -1194,7 +1196,6 @@ void wxTextCtrl::DoSetSelection(long from, long to, bool scrollCaret) { HWND hWnd = GetHwnd(); -#ifdef __WIN32__ #if wxUSE_RICHEDIT if ( IsRich() ) { @@ -1250,10 +1251,6 @@ void wxTextCtrl::DoSetSelection(long from, long to, bool scrollCaret) } #endif // wxUSE_RICHEDIT } -#else // Win16 - // WPARAM is 0: selection is scrolled into view - SendMessage(hWnd, EM_SETSEL, (WPARAM)0, (LPARAM)MAKELONG(from, to)); -#endif // Win32/16 } // ---------------------------------------------------------------------------- @@ -1679,7 +1676,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) switch ( event.GetKeyCode() ) { case WXK_RETURN: - if ( !(m_windowStyle & wxTE_MULTILINE) ) + if ( !HasFlag(wxTE_MULTILINE) ) { wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId); InitCommandEvent(event); @@ -1692,10 +1689,26 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) break; case WXK_TAB: - // always produce navigation event - even if we process 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 + // 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 + // otherwise nothing happens at all, but when the same control is + // created inside a dialog, IsDialogMessage() *does* switch focus + // all by itself and so if we do it here as well, it is advanced + // twice and goes to the next control... to prevent this from + // happening we're doing this ugly check, the logic being that if + // we don't have focus then it had been already changed to the next + // control + // + // 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 ) { wxNavigationKeyEvent eventNav; eventNav.SetDirection(!event.ShiftDown()); @@ -1712,9 +1725,9 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) event.Skip(); } -long wxTextCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) +WXLRESULT wxTextCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { - long lRc = wxTextCtrlBase::MSWWindowProc(nMsg, wParam, lParam); + WXLRESULT lRc = wxTextCtrlBase::MSWWindowProc(nMsg, wParam, lParam); if ( nMsg == WM_GETDLGCODE ) { @@ -1851,40 +1864,8 @@ WXHBRUSH wxTextCtrl::OnCtlColor(WXHDC pDC, WXHWND WXUNUSED(pWnd), WXUINT WXUNUSE return (WXHBRUSH)brush->GetResourceHandle(); } -// In WIN16, need to override normal erasing because -// Ctl3D doesn't use the wxWindows background colour. -#ifdef __WIN16__ -void wxTextCtrl::OnEraseBackground(wxEraseEvent& event) -{ - wxColour col(m_backgroundColour); - -#if wxUSE_CTL3D - if (m_useCtl3D) - col = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); -#endif - - RECT rect; - ::GetClientRect(GetHwnd(), &rect); - - COLORREF ref = wxColourToRGB(col); - HBRUSH hBrush = ::CreateSolidBrush(ref); - if ( !hBrush ) - wxLogLastError(wxT("CreateSolidBrush")); - - HDC hdc = (HDC)event.GetDC()->GetHDC(); - - int mode = ::SetMapMode(hdc, MM_TEXT); - - ::FillRect(hdc, &rect, hBrush); - ::DeleteObject(hBrush); - ::SetMapMode(hdc, mode); - -} -#endif // Win16 - bool wxTextCtrl::AdjustSpaceLimit() { -#ifndef __WIN16__ unsigned int limit = ::SendMessage(GetHwnd(), EM_GETLIMITTEXT, 0, 0); // HACK: we try to automatically extend the limit for the amount of text @@ -1926,7 +1907,6 @@ bool wxTextCtrl::AdjustSpaceLimit() ::SendMessage(GetHwnd(), EM_LIMITTEXT, limit, 0); } } -#endif // !Win16 // we changed the limit return TRUE; @@ -1947,13 +1927,17 @@ wxSize wxTextCtrl::DoGetBestSize() const int wText = DEFAULT_ITEM_WIDTH; - int hText = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); + int hText = cy; if ( m_windowStyle & wxTE_MULTILINE ) { hText *= wxMax(GetNumberOfLines(), 5); } //else: for single line control everything is ok + // we have to add the adjustments for the control height only once, not + // once per line, so do it after multiplication above + hText += EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy) - cy; + return wxSize(wText, hText); } @@ -2322,7 +2306,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() ) @@ -2380,12 +2364,11 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style) if (style.HasLeftIndent()) { - pf.dwMask |= PFM_STARTINDENT; + pf.dwMask |= PFM_STARTINDENT | PFM_OFFSET; // Convert from 1/10 mm to TWIPS pf.dxStartIndent = (int) (((double) style.GetLeftIndent()) * mm2twips / 10.0) ; - - // TODO: do we need to specify dxOffset? + pf.dxOffset = (int) (((double) style.GetLeftSubIndent()) * mm2twips / 10.0) ; } if (style.HasRightIndent()) @@ -2547,7 +2530,7 @@ bool wxTextCtrl::GetStyle(long position, wxTextAttr& style) // do format the selection (void) ::SendMessage(GetHwnd(), EM_GETPARAFORMAT, 0, (LPARAM) &pf) ; - style.SetLeftIndent( (int) ((double) pf.dxStartIndent * twips2mm * 10.0) ); + style.SetLeftIndent( (int) ((double) pf.dxStartIndent * twips2mm * 10.0), (int) ((double) pf.dxOffset * twips2mm * 10.0) ); style.SetRightIndent( (int) ((double) pf.dxRightIndent * twips2mm * 10.0) ); if (pf.wAlignment == PFA_CENTER) @@ -2563,7 +2546,7 @@ bool wxTextCtrl::GetStyle(long position, wxTextAttr& style) size_t i; for (i = 0; i < (size_t) pf.cTabCount; i++) { - tabStops[i] = (int) ((double) (pf.rgxTabs[i] & 0xFFFF) * twips2mm * 10.0) ; + tabStops.Add( (int) ((double) (pf.rgxTabs[i] & 0xFFFF) * twips2mm * 10.0) ); } if ( changeSel )