]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/textctrl.cpp
VTK wrapper of vtkRenderWindow for wxPython. Tested on MSW so far.
[wxWidgets.git] / src / msw / textctrl.cpp
index 0a3471b403f09cc226d01408acbb0eff6f7e0617..fc7e926e8c4bd7f6203dee2d747972302ef729ec 100644 (file)
@@ -57,7 +57,7 @@
 #   include <fstream>
 #endif
 
-#if wxUSE_RICHEDIT && !defined(__GNUWIN32__)
+#if wxUSE_RICHEDIT && (!defined(__GNUWIN32__) || defined(wxUSE_NORLANDER_HEADERS))
     #include <richedit.h>
 #endif
 
@@ -112,10 +112,11 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
                         const wxString& name)
 {
     // base initialization
-    if ( !CreateBase(parent, id, pos, size, style, name) )
+    if ( !CreateBase(parent, id, pos, size, style, validator, name) )
         return FALSE;
 
-    SetValidator(validator);
+    // Validator was set in CreateBase
+    //SetValidator(validator);
     if ( parent )
         parent->AddChild(this);
 
@@ -128,15 +129,20 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
     if ( m_windowStyle & wxTE_MULTILINE )
     {
         wxASSERT_MSG( !(m_windowStyle & wxTE_PROCESS_ENTER),
-                      _T("wxTE_PROCESS_ENTER style is ignored for multiline "
+                      wxT("wxTE_PROCESS_ENTER style is ignored for multiline "
                          "text controls (they always process it)") );
 
-        msStyle |= ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL;
+        msStyle |= ES_MULTILINE | ES_WANTRETURN;
+        if ((m_windowStyle & wxTE_NO_VSCROLL) == 0)
+            msStyle |= WS_VSCROLL;
         m_windowStyle |= wxTE_PROCESS_ENTER;
     }
     else
         msStyle |= ES_AUTOHSCROLL;
 
+    if (m_windowStyle & wxHSCROLL)
+        msStyle |= (WS_HSCROLL | ES_AUTOHSCROLL);
+
     if (m_windowStyle & wxTE_READONLY)
         msStyle |= ES_READONLY;
 
@@ -161,17 +167,14 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
         m_lDlgCode |= DLGC_WANTTAB;
 
     // do create the control - either an EDIT or RICHEDIT
-    const wxChar *windowClass = _T("EDIT");
+    const wxChar *windowClass = wxT("EDIT");
 
 #if wxUSE_RICHEDIT
-    // multiline edit controls are RICHEDITs except for those which have a
-    // simple border (VZ: why??)
-    if ( (m_windowStyle & wxTE_MULTILINE) &&
-         !(m_windowStyle & wxSIMPLE_BORDER) )
+    if ( m_windowStyle & wxTE_RICH )
     {
         msStyle |= ES_AUTOVSCROLL;
         m_isRich = TRUE;
-        windowClass = _T("RICHEDIT");
+        windowClass = wxT("RICHEDIT");
     }
     else
         m_isRich = FALSE;
@@ -198,7 +201,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
                                       wxGetInstance(),
                                       NULL);
 
-    wxCHECK_MSG( m_hWnd, FALSE, _T("Failed to create text ctrl") );
+    wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create text ctrl") );
 
 #if wxUSE_CTL3D
     if ( want3D )
@@ -257,7 +260,7 @@ void wxTextCtrl::AdoptAttributesFromHWND()
 
   GetClassName(hWnd, buf, WXSIZEOF(buf));
 
-  if ( wxStricmp(buf, _T("EDIT")) == 0 )
+  if ( wxStricmp(buf, wxT("EDIT")) == 0 )
     m_isRich = FALSE;
   else
     m_isRich = TRUE;
@@ -293,9 +296,12 @@ void wxTextCtrl::SetValue(const wxString& value)
 {
     wxString valueDos = wxTextFile::Translate(value, wxTextFileType_Dos);
 
-    SetWindowText(GetHwnd(), valueDos);
+    if ( valueDos != GetValue() )
+    {
+        SetWindowText(GetHwnd(), valueDos);
 
-    AdjustSpaceLimit();
+        AdjustSpaceLimit();
+    }
 }
 
 void wxTextCtrl::WriteText(const wxString& value)
@@ -315,7 +321,7 @@ void wxTextCtrl::AppendText(const wxString& text)
 
 void wxTextCtrl::Clear()
 {
-    SetWindowText(GetHwnd(), _T(""));
+    SetWindowText(GetHwnd(), wxT(""));
 }
 
 // ----------------------------------------------------------------------------
@@ -603,17 +609,41 @@ long wxTextCtrl::XYToPosition(long x, long y) const
     return (long)(x + charIndex);
 }
 
-void wxTextCtrl::PositionToXY(long pos, long *x, long *y) const
+bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const
 {
     HWND hWnd = GetHwnd();
 
     // This gets the line number containing the character
-    int lineNo = (int)SendMessage(hWnd, EM_LINEFROMCHAR, (WPARAM)pos, (LPARAM)0);
+    int lineNo;
+#if wxUSE_RICHEDIT
+    if ( m_isRich )
+    {
+        lineNo = (int)SendMessage(hWnd, EM_EXLINEFROMCHAR, 0, (LPARAM)pos);
+    }
+    else
+#endif // wxUSE_RICHEDIT
+        lineNo = (int)SendMessage(hWnd, EM_LINEFROMCHAR, (WPARAM)pos, 0);
+
+    if ( lineNo == -1 )
+    {
+        // no such line
+        return FALSE;
+    }
+
     // This gets the char index for the _beginning_ of this line
     int charIndex = (int)SendMessage(hWnd, EM_LINEINDEX, (WPARAM)lineNo, (LPARAM)0);
+    if ( charIndex == -1 )
+    {
+        return FALSE;
+    }
+
     // The X position must therefore be the different between pos and charIndex
-    *x = (long)(pos - charIndex);
-    *y = (long)lineNo;
+    if ( x )
+        *x = (long)(pos - charIndex);
+    if ( y )
+        *y = (long)lineNo;
+
+    return TRUE;
 }
 
 void wxTextCtrl::ShowPosition(long pos)