X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/789295bf7bd4b58b0270800fb689fce0786dae15..4e938f5b0bffb7102fe4a3b2ba3baf7d5a067fb4:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index e2d8369a04..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 ) @@ -240,7 +255,7 @@ void wxTextCtrl::AdoptAttributesFromHWND() // 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; @@ -299,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 ++) { @@ -316,58 +331,20 @@ void wxTextCtrl::SetValue(const wxString& value) delete[] tmp; } else - SetWindowText(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; + int cx, cy; + wxGetCharSize(GetHWND(), &cx, &cy, &GetFont()); - AdjustForParentClientOrigin(x1, y1, sizeFlags); + int wText = DEFAULT_ITEM_WIDTH; + int hText = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); - 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; - - // Calculations may have made text size too small - if (control_height <= 0) - control_height = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); - - if (control_width <= 0) - control_width = DEFAULT_ITEM_WIDTH; - - MoveWindow(GetHwnd(), (int)control_x, (int)control_y, - (int)control_width, (int)control_height, TRUE); + return wxSize(wText, hText); } // Clipboard operations @@ -486,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); @@ -543,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()) { @@ -555,31 +532,37 @@ 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; SetWindowText(GetHwnd(), tmp_buffer); SendMessage(GetHwnd(), EM_SETMODIFY, FALSE, 0L); @@ -599,15 +582,15 @@ 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; @@ -664,7 +647,7 @@ void wxTextCtrl::AppendText(const wxString& text) void wxTextCtrl::Clear() { - SetWindowText(GetHwnd(), ""); + SetWindowText(GetHwnd(), _T("")); } bool wxTextCtrl::IsModified() const @@ -738,18 +721,23 @@ void wxTextCtrl::ShowPosition(long pos) int wxTextCtrl::GetLineLength(long lineNo) const { long charIndex = XYToPosition(0, lineNo); - 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 = 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 @@ -1002,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; } @@ -1010,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; } @@ -1018,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; } @@ -1026,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; } @@ -1086,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()); @@ -1117,26 +1105,6 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) event.Skip(); } -long wxTextCtrl::MSWGetDlgCode() -{ - // we always want the characters and the arrows - long lRc = 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 ) - lRc |= DLGC_WANTMESSAGE; - if ( m_windowStyle & wxTE_PROCESS_TAB ) - lRc |= DLGC_WANTTAB; - - return lRc; -} - bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) { switch (param) @@ -1183,17 +1151,23 @@ bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) void wxTextCtrl::AdjustSpaceLimit() { +#ifndef __WIN16__ unsigned int len = ::GetWindowTextLength(GetHwnd()), limit = ::SendMessage(GetHwnd(), EM_GETLIMITTEXT, 0, 0); if ( len > limit ) { limit = len + 0x8000; // 32Kb +#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? @@ -1273,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(); +}