X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/42e69d6b435a4dd5415caf3750db62cf45b6f373..4e938f5b0bffb7102fe4a3b2ba3baf7d5a067fb4:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 7388f2817e..9fdb36b9ef 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -135,7 +135,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, if (m_windowStyle & wxTE_MULTILINE) { wxASSERT_MSG( !(m_windowStyle & wxTE_PROCESS_ENTER), - "wxTE_PROCESS_ENTER style is ignored for multiline controls" ); + _T("wxTE_PROCESS_ENTER style is ignored for multiline controls") ); msStyle |= ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL ; // WS_BORDER m_windowStyle |= wxTE_PROCESS_ENTER; @@ -151,14 +151,29 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, if (m_windowStyle & wxTE_PASSWORD) // hidden input msStyle |= ES_PASSWORD; - const char *windowClass = "EDIT"; + // we always want the characters and the arrows + m_lDlgCode = DLGC_WANTCHARS | DLGC_WANTARROWS; + + // we may have several different cases: + // 1. normal case: both TAB and ENTER are used for dialog navigation + // 2. ctrl which wants TAB for itself: ENTER is used to pass to the next + // control in the dialog + // 3. ctrl which wants ENTER for itself: TAB is used for dialog navigation + // 4. ctrl which wants both TAB and ENTER: Ctrl-ENTER is used to pass to + // the next control + if ( m_windowStyle & wxTE_PROCESS_ENTER ) + m_lDlgCode |= DLGC_WANTMESSAGE; + if ( m_windowStyle & wxTE_PROCESS_TAB ) + m_lDlgCode |= DLGC_WANTTAB; + + const wxChar *windowClass = _T("EDIT"); #if wxUSE_RICHEDIT if ( m_windowStyle & wxTE_MULTILINE ) { msStyle |= ES_AUTOVSCROLL; m_isRich = TRUE; - windowClass = "RichEdit" ; + windowClass = _T("RichEdit") ; } else m_isRich = FALSE; @@ -172,7 +187,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, #if wxUSE_RICHEDIT if (m_windowStyle & wxSIMPLE_BORDER) { - windowClass = "EDIT"; + windowClass = _T("EDIT"); m_isRich = FALSE; } #endif @@ -187,7 +202,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, 0, 0, 0, 0, (HWND) ((wxWindow*)parent)->GetHWND(), (HMENU)m_windowId, wxGetInstance(), NULL); - wxCHECK_MSG( m_hWnd, FALSE, "Failed to create text ctrl" ); + wxCHECK_MSG( m_hWnd, FALSE, _T("Failed to create text ctrl") ); #if wxUSE_CTL3D if ( want3D ) @@ -235,12 +250,12 @@ void wxTextCtrl::AdoptAttributesFromHWND() { wxWindow::AdoptAttributesFromHWND(); - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); long style = GetWindowLong((HWND) hWnd, GWL_STYLE); // retrieve the style to see whether this is an edit or richedit ctrl #if wxUSE_RICHEDIT - char buf[256]; + wxChar buf[256]; #ifndef __WIN32__ GetClassName((HWND) hWnd, buf, 256); @@ -259,7 +274,7 @@ void wxTextCtrl::AdoptAttributesFromHWND() wxString str(buf); str.UpperCase(); - if (str == "EDIT") + if (str == _T("EDIT")) m_isRich = FALSE; else m_isRich = TRUE; @@ -283,12 +298,7 @@ void wxTextCtrl::SetupColours() wxString wxTextCtrl::GetValue() const { - int length = GetWindowTextLength((HWND) GetHWND()); - char *s = new char[length+1]; - GetWindowText((HWND) GetHWND(), s, length+1); - wxString str(s); - delete[] s; - return str; + return wxGetWindowText(GetHWND()); } void wxTextCtrl::SetValue(const wxString& value) @@ -304,7 +314,7 @@ void wxTextCtrl::SetValue(const wxString& value) } if (singletons > 0) { - char *tmp = new char[len + singletons + 1]; + wxChar *tmp = new wxChar[len + singletons + 1]; int j = 0; for (i = 0; i < len; i ++) { @@ -317,60 +327,24 @@ void wxTextCtrl::SetValue(const wxString& value) j ++; } tmp[j] = 0; - SetWindowText((HWND) GetHWND(), tmp); + SetWindowText(GetHwnd(), tmp); delete[] tmp; } else - SetWindowText((HWND) GetHWND(), (const char *)value); + SetWindowText(GetHwnd(), (const wxChar *)value); + + AdjustSpaceLimit(); } -void wxTextCtrl::DoSetSize(int x, int y, int width, int height, int sizeFlags) +wxSize wxTextCtrl::DoGetBestSize() { - int currentX, currentY; - GetPosition(¤tX, ¤tY); - int x1 = x; - int y1 = y; - int w1 = width; - int h1 = height; - - if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - x1 = currentX; - if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - y1 = currentY; - - AdjustForParentClientOrigin(x1, y1, sizeFlags); - - int cx; // button font dimensions - int cy; - - wxGetCharSize(GetHWND(), &cx, &cy, & this->GetFont()); - - int control_width, control_height, control_x, control_y; - - // If we're prepared to use the existing size, then... - if (width == -1 && height == -1 && ((sizeFlags & wxSIZE_AUTO) != wxSIZE_AUTO)) - { - GetSize(&w1, &h1); - } - - // Deal with default size (using -1 values) - if (w1<=0) - w1 = DEFAULT_ITEM_WIDTH; - - control_x = x1; - control_y = y1; - control_width = w1; - control_height = h1; + int cx, cy; + wxGetCharSize(GetHWND(), &cx, &cy, &GetFont()); - // Calculations may have made text size too small - if (control_height <= 0) - control_height = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); + int wText = DEFAULT_ITEM_WIDTH; + int hText = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); - if (control_width <= 0) - control_width = DEFAULT_ITEM_WIDTH; - - MoveWindow((HWND) GetHWND(), (int)control_x, (int)control_y, - (int)control_width, (int)control_height, TRUE); + return wxSize(wText, hText); } // Clipboard operations @@ -378,7 +352,7 @@ void wxTextCtrl::Copy() { if (CanCopy()) { - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); SendMessage(hWnd, WM_COPY, 0, 0L); } } @@ -387,7 +361,7 @@ void wxTextCtrl::Cut() { if (CanCut()) { - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); SendMessage(hWnd, WM_CUT, 0, 0L); } } @@ -396,20 +370,20 @@ void wxTextCtrl::Paste() { if (CanPaste()) { - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); SendMessage(hWnd, WM_PASTE, 0, 0L); } } void wxTextCtrl::SetEditable(bool editable) { - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); SendMessage(hWnd, EM_SETREADONLY, (WPARAM)!editable, (LPARAM)0L); } void wxTextCtrl::SetInsertionPoint(long pos) { - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); #ifdef __WIN32__ #if wxUSE_RICHEDIT if ( m_isRich) @@ -447,18 +421,18 @@ long wxTextCtrl::GetInsertionPoint() const CHARRANGE range; range.cpMin = 0; range.cpMax = 0; - SendMessage((HWND) GetHWND(), EM_EXGETSEL, 0, (LPARAM) &range); + SendMessage(GetHwnd(), EM_EXGETSEL, 0, (LPARAM) &range); return range.cpMin; } #endif - DWORD Pos=(DWORD)SendMessage((HWND) GetHWND(), EM_GETSEL, 0, 0L); + DWORD Pos=(DWORD)SendMessage(GetHwnd(), EM_GETSEL, 0, 0L); return Pos&0xFFFF; } long wxTextCtrl::GetLastPosition() const { - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); // Will always return a number > 0 (according to docs) int noLines = (int)SendMessage(hWnd, EM_GETLINECOUNT, (WPARAM)0, (LPARAM)0L); @@ -476,7 +450,7 @@ long wxTextCtrl::GetLastPosition() const void wxTextCtrl::Replace(long from, long to, const wxString& value) { #if wxUSE_CLIPBOARD - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); long fromChar = from; long toChar = to; @@ -489,7 +463,7 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value) SendMessage(hWnd, WM_CUT, (WPARAM)0, (LPARAM)0); // Now replace with 'value', by pasting. - wxSetClipboardData(wxDF_TEXT, (wxObject *) (const char *)value, 0, 0); + wxSetClipboardData(wxDF_TEXT, (wxObject *) (const wxChar *)value, 0, 0); // Paste into edit control SendMessage(hWnd, WM_PASTE, (WPARAM)0, (LPARAM)0L); @@ -500,7 +474,7 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value) void wxTextCtrl::Remove(long from, long to) { - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); long fromChar = from; long toChar = to; @@ -515,7 +489,7 @@ void wxTextCtrl::Remove(long from, long to) void wxTextCtrl::SetSelection(long from, long to) { - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); long fromChar = from; long toChar = to; // if from and to are both -1, it means @@ -546,7 +520,7 @@ bool wxTextCtrl::LoadFile(const wxString& file) Clear(); // ifstream input(WXSTRINGCAST file, ios::nocreate | ios::in); - ifstream input(WXSTRINGCAST file, ios::in); + ifstream input(MBSTRINGCAST file.mb_str(wxConvFile), ios::in); if (!input.bad()) { @@ -558,37 +532,45 @@ bool wxTextCtrl::LoadFile(const wxString& file) #ifdef __SALFORDC__ struct _stat stat_buf; - if (stat((char*) (const char*) file, &stat_buf) < 0) + if (stat(MBSTRINGCAST file.mb_str(wxConvFile), &stat_buf) < 0) return FALSE; #else struct stat stat_buf; - if (stat(file, &stat_buf) < 0) + if (stat(file.mb_str(wxConvFile), &stat_buf) < 0) return FALSE; #endif -// char *tmp_buffer = (char*)farmalloc(stat_buf.st_size+1); +// wxChar *tmp_buffer = (wxChar*)farmalloc(stat_buf.st_size+1); // This may need to be a bigger buffer than the file size suggests, // if it's a UNIX file. Give it an extra 1000 just in case. - char *tmp_buffer = (char*)farmalloc((size_t)(stat_buf.st_size+1+1000)); + wxChar *tmp_buffer = (wxChar*)farmalloc((size_t)(stat_buf.st_size+1+1000)); + char *read_buffer = new char[512]; long no_lines = 0; long pos = 0; while (!input.eof() && input.peek() != EOF) { - input.getline(wxBuffer, 500); - int len = strlen(wxBuffer); + input.getline(read_buffer, 500); + int len = strlen(read_buffer); wxBuffer[len] = 13; wxBuffer[len+1] = 10; wxBuffer[len+2] = 0; - strcpy(tmp_buffer+pos, wxBuffer); - pos += strlen(wxBuffer); +#if wxUSE_UNICODE + pos += wxConvCurrent->MB2WC(tmp_buffer+pos, read_buffer, (size_t)-1); +#else + strcpy(tmp_buffer+pos, read_buffer); + pos += strlen(read_buffer); +#endif no_lines++; } + delete[] read_buffer; -// SendMessage((HWND) GetHWND(), WM_SETTEXT, 0, (LPARAM)tmp_buffer); - SetWindowText((HWND) GetHWND(), tmp_buffer); - SendMessage((HWND) GetHWND(), EM_SETMODIFY, FALSE, 0L); + SetWindowText(GetHwnd(), tmp_buffer); + SendMessage(GetHwnd(), EM_SETMODIFY, FALSE, 0L); farfree(tmp_buffer); + // update the size limit if needed + AdjustSpaceLimit(); + return TRUE; } return FALSE; @@ -600,22 +582,22 @@ bool wxTextCtrl::SaveFile(const wxString& file) { wxString theFile(file); - if (theFile == "") + if (theFile == _T("")) theFile = m_fileName; - if (theFile == "") + if (theFile == _T("")) return FALSE; m_fileName = theFile; - ofstream output((char*) (const char*) theFile); + ofstream output(MBSTRINGCAST theFile.mb_str(wxConvFile)); if (output.bad()) return FALSE; // This will only save 64K max - unsigned long nbytes = SendMessage((HWND) GetHWND(), WM_GETTEXTLENGTH, 0, 0); + unsigned long nbytes = SendMessage(GetHwnd(), WM_GETTEXTLENGTH, 0, 0); char *tmp_buffer = (char*)farmalloc((size_t)(nbytes+1)); - SendMessage((HWND) GetHWND(), WM_GETTEXT, (WPARAM)(nbytes+1), (LPARAM)tmp_buffer); + SendMessage(GetHwnd(), WM_GETTEXT, (WPARAM)(nbytes+1), (LPARAM)tmp_buffer); char *pstr = tmp_buffer; // Convert \r\n to just \n @@ -627,7 +609,7 @@ bool wxTextCtrl::SaveFile(const wxString& file) } farfree(tmp_buffer); - SendMessage((HWND) GetHWND(), EM_SETMODIFY, FALSE, 0L); + SendMessage(GetHwnd(), EM_SETMODIFY, FALSE, 0L); return TRUE; } @@ -651,8 +633,10 @@ void wxTextCtrl::WriteText(const wxString& text) j ++; } newtext[j] = 0; - SendMessage((HWND) GetHWND(), EM_REPLACESEL, 0, (LPARAM)newtext); + SendMessage(GetHwnd(), EM_REPLACESEL, 0, (LPARAM)newtext); delete[] newtext; + + AdjustSpaceLimit(); } void wxTextCtrl::AppendText(const wxString& text) @@ -663,18 +647,18 @@ void wxTextCtrl::AppendText(const wxString& text) void wxTextCtrl::Clear() { - SetWindowText((HWND) GetHWND(), ""); + SetWindowText(GetHwnd(), _T("")); } bool wxTextCtrl::IsModified() const { - return (SendMessage((HWND) GetHWND(), EM_GETMODIFY, 0, 0) != 0); + return (SendMessage(GetHwnd(), EM_GETMODIFY, 0, 0) != 0); } // Makes 'unmodified' void wxTextCtrl::DiscardEdits() { - SendMessage((HWND) GetHWND(), EM_SETMODIFY, FALSE, 0L); + SendMessage(GetHwnd(), EM_SETMODIFY, FALSE, 0L); } /* @@ -684,12 +668,12 @@ void wxTextCtrl::DiscardEdits() int wxTextCtrl::GetNumberOfLines() const { - return (int)SendMessage((HWND) GetHWND(), EM_GETLINECOUNT, (WPARAM)0, (LPARAM)0); + return (int)SendMessage(GetHwnd(), EM_GETLINECOUNT, (WPARAM)0, (LPARAM)0); } long wxTextCtrl::XYToPosition(long x, long y) const { - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); // This gets the char index for the _beginning_ of this line int charIndex = (int)SendMessage(hWnd, EM_LINEINDEX, (WPARAM)y, (LPARAM)0); @@ -698,7 +682,7 @@ long wxTextCtrl::XYToPosition(long x, long y) const void wxTextCtrl::PositionToXY(long pos, long *x, long *y) const { - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); // This gets the line number containing the character int lineNo = (int)SendMessage(hWnd, EM_LINEFROMCHAR, (WPARAM)pos, (LPARAM)0); @@ -711,7 +695,7 @@ void wxTextCtrl::PositionToXY(long pos, long *x, long *y) const void wxTextCtrl::ShowPosition(long pos) { - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); // To scroll to a position, we pass the number of lines and characters // to scroll *by*. This means that we need to: @@ -737,18 +721,23 @@ void wxTextCtrl::ShowPosition(long pos) int wxTextCtrl::GetLineLength(long lineNo) const { long charIndex = XYToPosition(0, lineNo); - HWND hWnd = (HWND) GetHWND(); - int len = (int)SendMessage(hWnd, EM_LINELENGTH, (WPARAM)charIndex, (LPARAM)0); + int len = (int)SendMessage(GetHwnd(), EM_LINELENGTH, charIndex, 0); return len; } wxString wxTextCtrl::GetLineText(long lineNo) const { - HWND hWnd = (HWND) GetHWND(); - *(WORD *)wxBuffer = 512; - int noChars = (int)SendMessage(hWnd, EM_GETLINE, (WPARAM)lineNo, (LPARAM)wxBuffer); - wxBuffer[noChars] = 0; - return wxString(wxBuffer); + size_t len = (size_t)GetLineLength(lineNo); + char *buf = (char *)malloc(len); + *(WORD *)buf = len; + int noChars = (int)SendMessage(GetHwnd(), EM_GETLINE, lineNo, (LPARAM)buf); + buf[noChars] = 0; + + wxString str(buf); + + free(buf); + + return str; } bool wxTextCtrl::CanCopy() const @@ -773,7 +762,7 @@ bool wxTextCtrl::CanPaste() const if (m_isRich) { int dataFormat = 0; // 0 == any format - return (::SendMessage( (HWND) GetHWND(), EM_CANPASTE, (WPARAM) (UINT) dataFormat, 0) != 0); + return (::SendMessage( GetHwnd(), EM_CANPASTE, (WPARAM) (UINT) dataFormat, 0) != 0); } #endif if (!IsEditable()) @@ -794,7 +783,7 @@ void wxTextCtrl::Undo() { if (CanUndo()) { - ::SendMessage((HWND) GetHWND(), EM_UNDO, 0, 0); + ::SendMessage(GetHwnd(), EM_UNDO, 0, 0); } } @@ -803,18 +792,18 @@ void wxTextCtrl::Redo() if (CanRedo()) { // Same as Undo, since Undo undoes the undo, i.e. a redo. - ::SendMessage((HWND) GetHWND(), EM_UNDO, 0, 0); + ::SendMessage(GetHwnd(), EM_UNDO, 0, 0); } } bool wxTextCtrl::CanUndo() const { - return (::SendMessage((HWND) GetHWND(), EM_CANUNDO, 0, 0) != 0); + return (::SendMessage(GetHwnd(), EM_CANUNDO, 0, 0) != 0); } bool wxTextCtrl::CanRedo() const { - return (::SendMessage((HWND) GetHWND(), EM_CANUNDO, 0, 0) != 0); + return (::SendMessage(GetHwnd(), EM_CANUNDO, 0, 0) != 0); } // If the return values from and to are the same, there is no @@ -825,7 +814,7 @@ void wxTextCtrl::GetSelection(long* from, long* to) const if (m_isRich) { CHARRANGE charRange; - ::SendMessage((HWND) GetHWND(), EM_EXGETSEL, 0, (LPARAM) (CHARRANGE*) & charRange); + ::SendMessage(GetHwnd(), EM_EXGETSEL, 0, (LPARAM) (CHARRANGE*) & charRange); *from = charRange.cpMin; *to = charRange.cpMax; @@ -837,7 +826,7 @@ void wxTextCtrl::GetSelection(long* from, long* to) const WPARAM wParam = (WPARAM) (DWORD*) & dwStart; // receives starting position LPARAM lParam = (LPARAM) (DWORD*) & dwEnd; // receives ending position - ::SendMessage((HWND) GetHWND(), EM_GETSEL, wParam, lParam); + ::SendMessage(GetHwnd(), EM_GETSEL, wParam, lParam); *from = dwStart; *to = dwEnd; @@ -845,7 +834,8 @@ void wxTextCtrl::GetSelection(long* from, long* to) const bool wxTextCtrl::IsEditable() const { - long style = ::GetWindowLong((HWND) GetHWND(), GWL_STYLE); + long style = ::GetWindowLong(GetHwnd(), GWL_STYLE); + return ((style & ES_READONLY) == 0); } @@ -1000,7 +990,7 @@ wxTextCtrl& wxTextCtrl::operator<<(const wxString& s) wxTextCtrl& wxTextCtrl::operator<<(float f) { wxString str; - str.Printf("%.2f", f); + str.Printf(_T("%.2f"), f); AppendText(str); return *this; } @@ -1008,7 +998,7 @@ wxTextCtrl& wxTextCtrl::operator<<(float f) wxTextCtrl& wxTextCtrl::operator<<(double d) { wxString str; - str.Printf("%.2f", d); + str.Printf(_T("%.2f"), d); AppendText(str); return *this; } @@ -1016,7 +1006,7 @@ wxTextCtrl& wxTextCtrl::operator<<(double d) wxTextCtrl& wxTextCtrl::operator<<(int i) { wxString str; - str.Printf("%d", i); + str.Printf(_T("%d"), i); AppendText(str); return *this; } @@ -1024,7 +1014,7 @@ wxTextCtrl& wxTextCtrl::operator<<(int i) wxTextCtrl& wxTextCtrl::operator<<(long i) { wxString str; - str.Printf("%ld", i); + str.Printf(_T("%ld"), i); AppendText(str); return *this; } @@ -1084,13 +1074,13 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) break; case WXK_TAB: - // only produce navigation event if we don't process TAB ourself or - // if it's a Shift-Tab keypress (we assume nobody will ever need - // this key combo for himself) + // 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. // // NB: Notice that Ctrl-Tab is handled elsewhere and Alt-Tab is // handled by Windows - if ( event.ShiftDown() || !(m_windowStyle & wxTE_PROCESS_TAB) ) { wxNavigationKeyEvent eventNav; eventNav.SetDirection(!event.ShiftDown()); @@ -1115,101 +1105,71 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) event.Skip(); } -long wxTextCtrl::MSWGetDlgCode() +bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) { - // we always want the characters and the arrows - long lRc = DLGC_WANTCHARS | DLGC_WANTARROWS; + switch (param) + { + case EN_SETFOCUS: + case EN_KILLFOCUS: + { + wxFocusEvent event(param == EN_KILLFOCUS ? wxEVT_KILL_FOCUS + : wxEVT_SET_FOCUS, + m_windowId); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); + } + break; - // we may have several different cases: - // 1. normal case: both TAB and ENTER are used for dialog navigation - // 2. ctrl which wants TAB for itself: ENTER is used to pass to the next - // control in the dialog - // 3. ctrl which wants ENTER for itself: TAB is used for dialog navigation - // 4. ctrl which wants both TAB and ENTER: Ctrl-ENTER is used to pass to - // the next control - if ( m_windowStyle & wxTE_PROCESS_ENTER ) - lRc |= DLGC_WANTMESSAGE; - if ( m_windowStyle & wxTE_PROCESS_TAB ) - lRc |= DLGC_WANTTAB; + case EN_CHANGE: + { + wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); + wxString val(GetValue()); + if ( !val.IsNull() ) + event.m_commandString = WXSTRINGCAST val; + event.SetEventObject( this ); + ProcessCommand(event); + } + break; - return lRc; -} + case EN_ERRSPACE: + // the text size limit has been hit - increase it + AdjustSpaceLimit(); + break; -bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) -{ -/* - // Debugging - wxDebugMsg("Edit control %d: ", (int)id); - switch (param) - { - case EN_SETFOCUS: - wxDebugMsg("EN_SETFOCUS\n"); - break; - case EN_KILLFOCUS: - wxDebugMsg("EN_KILLFOCUS\n"); - break; - case EN_CHANGE: - wxDebugMsg("EN_CHANGE\n"); - break; - case EN_UPDATE: - wxDebugMsg("EN_UPDATE\n"); - break; - case EN_ERRSPACE: - wxDebugMsg("EN_ERRSPACE\n"); - break; - case EN_MAXTEXT: - wxDebugMsg("EN_MAXTEXT\n"); - break; - case EN_HSCROLL: - wxDebugMsg("EN_HSCROLL\n"); - break; - case EN_VSCROLL: - wxDebugMsg("EN_VSCROLL\n"); - break; - default: - wxDebugMsg("Unknown EDIT notification\n"); - break; - } -*/ - switch (param) - { - case EN_SETFOCUS: - case EN_KILLFOCUS: - { - wxFocusEvent event(param == EN_KILLFOCUS ? wxEVT_KILL_FOCUS - : wxEVT_SET_FOCUS, - m_windowId); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent(event); - } - break; + // the other notification messages are not processed + case EN_UPDATE: + case EN_MAXTEXT: + case EN_HSCROLL: + case EN_VSCROLL: + default: + return FALSE; + } - case EN_CHANGE: - { - wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); - wxString val(GetValue()); - if ( !val.IsNull() ) - event.m_commandString = WXSTRINGCAST val; - event.SetEventObject( this ); - ProcessCommand(event); - } - break; + // processed + return TRUE; +} - // the other notification messages are not processed - case EN_UPDATE: - case EN_ERRSPACE: - case EN_MAXTEXT: - case EN_HSCROLL: - case EN_VSCROLL: - default: - return FALSE; - } +void wxTextCtrl::AdjustSpaceLimit() +{ +#ifndef __WIN16__ + unsigned int len = ::GetWindowTextLength(GetHwnd()), + limit = ::SendMessage(GetHwnd(), EM_GETLIMITTEXT, 0, 0); + if ( len > limit ) + { + limit = len + 0x8000; // 32Kb - // processed - return TRUE; +#if wxUSE_RICHEDIT + if ( m_isRich || limit > 0xffff ) +#else + if ( limit > 0xffff ) +#endif + ::SendMessage(GetHwnd(), EM_LIMITTEXT, 0, limit); + else + ::SendMessage(GetHwnd(), EM_LIMITTEXT, limit, 0); + } +#endif } - // For Rich Edit controls. Do we need it? #if 0 #if wxUSE_RICHEDIT @@ -1287,3 +1247,8 @@ void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event) event.Enable( CanRedo() ); } +bool wxTextCtrl::AcceptsFocus() const +{ + // we don't want focus if we can't be edited + return IsEditable() && wxControl::AcceptsFocus(); +}