X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/789295bf7bd4b58b0270800fb689fce0786dae15..7c5457867870a0a33951def66373f5a76ec3ae4a:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index e2d8369a04..db6f5009c4 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,7 +331,7 @@ void wxTextCtrl::SetValue(const wxString& value) delete[] tmp; } else - SetWindowText(GetHwnd(), (const char *)value); + SetWindowText(GetHwnd(), (const wxChar *)value); AdjustSpaceLimit(); } @@ -486,7 +501,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 +558,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 +570,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 +620,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 +685,7 @@ void wxTextCtrl::AppendText(const wxString& text) void wxTextCtrl::Clear() { - SetWindowText(GetHwnd(), ""); + SetWindowText(GetHwnd(), _T("")); } bool wxTextCtrl::IsModified() const @@ -1002,7 +1023,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 +1031,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 +1039,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 +1047,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; } @@ -1117,26 +1138,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 +1184,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?