]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/textctrl.cpp
set m_clipXX so dc.GetClippingBox returns real bounding box
[wxWidgets.git] / src / msw / textctrl.cpp
index cccb111c5d843bc780f41e75cd2a036ec0e3f668..e48ba50b35f9b573cab85320dd0d32b39126eacc 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        textctrl.cpp
+// Name:        msw/textctrl.cpp
 // Purpose:     wxTextCtrl
 // Author:      Julian Smart
 // Modified by:
 // Purpose:     wxTextCtrl
 // Author:      Julian Smart
 // Modified by:
@@ -58,7 +58,7 @@
 #   include <fstream>
 #endif
 
 #   include <fstream>
 #endif
 
-#if wxUSE_RICHEDIT && (!defined(__GNUWIN32__) || defined(wxUSE_NORLANDER_HEADERS))
+#if wxUSE_RICHEDIT && !defined(__GNUWIN32_OLD__)
     #include <richedit.h>
 #endif
 
     #include <richedit.h>
 #endif
 
@@ -175,11 +175,13 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
     if (m_windowStyle & wxTE_READONLY)
         msStyle |= ES_READONLY;
 
     if (m_windowStyle & wxTE_READONLY)
         msStyle |= ES_READONLY;
 
-    if (m_windowStyle & wxHSCROLL)
-        msStyle |= (WS_HSCROLL | ES_AUTOHSCROLL);
     if (m_windowStyle & wxTE_PASSWORD) // hidden input
         msStyle |= ES_PASSWORD;
 
     if (m_windowStyle & wxTE_PASSWORD) // hidden input
         msStyle |= ES_PASSWORD;
 
+   if (m_windowStyle & wxTE_AUTO_SCROLL)
+        msStyle |=  ES_AUTOHSCROLL;
+
+
     // we always want the characters and the arrows
     m_lDlgCode = DLGC_WANTCHARS | DLGC_WANTARROWS;
 
     // we always want the characters and the arrows
     m_lDlgCode = DLGC_WANTCHARS | DLGC_WANTARROWS;
 
@@ -237,7 +239,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
 #ifndef RICHEDIT_CLASS
                 wxString RICHEDIT_CLASS;
                 RICHEDIT_CLASS.Printf(_T("RichEdit%d0"), ver);
 #ifndef RICHEDIT_CLASS
                 wxString RICHEDIT_CLASS;
                 RICHEDIT_CLASS.Printf(_T("RichEdit%d0"), ver);
-#ifdef wxUSE_UNICODE
+#if wxUSE_UNICODE
                 RICHEDIT_CLASS += _T('W');
 #else // ANSI
                 RICHEDIT_CLASS += _T('A');
                 RICHEDIT_CLASS += _T('W');
 #else // ANSI
                 RICHEDIT_CLASS += _T('A');
@@ -264,7 +266,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
     //     might be -1 in which case we should use the default values (and
     //     SetSize called below takes care of it)
     m_hWnd = (WXHWND)::CreateWindowEx(exStyle,
     //     might be -1 in which case we should use the default values (and
     //     SetSize called below takes care of it)
     m_hWnd = (WXHWND)::CreateWindowEx(exStyle,
-                                      windowClass,
+                                      windowClass.c_str(),
                                       NULL,
                                       msStyle,
                                       0, 0, 0, 0,
                                       NULL,
                                       msStyle,
                                       0, 0, 0, 0,
@@ -374,9 +376,9 @@ wxString wxTextCtrl::GetValue() const
 #if wxUSE_RICHEDIT
     if ( m_isRich )
     {
 #if wxUSE_RICHEDIT
     if ( m_isRich )
     {
-        wxString str;
-
         int len = GetWindowTextLength(GetHwnd()) + 1;
         int len = GetWindowTextLength(GetHwnd()) + 1;
+
+        wxString str;
         wxChar *p = str.GetWriteBuf(len);
 
         TEXTRANGE textRange;
         wxChar *p = str.GetWriteBuf(len);
 
         TEXTRANGE textRange;
@@ -419,7 +421,7 @@ void wxTextCtrl::SetValue(const wxString& value)
     {
         wxString valueDos = wxTextFile::Translate(value, wxTextFileType_Dos);
 
     {
         wxString valueDos = wxTextFile::Translate(value, wxTextFileType_Dos);
 
-        SetWindowText(GetHwnd(), valueDos);
+        SetWindowText(GetHwnd(), valueDos.c_str());
 
         AdjustSpaceLimit();
     }
 
         AdjustSpaceLimit();
     }
@@ -556,7 +558,7 @@ void wxTextCtrl::SetInsertionPoint(long pos)
     SendMessage(hWnd, EM_SETSEL, 0, MAKELPARAM(pos, pos));
 #endif // Win32/16
 
     SendMessage(hWnd, EM_SETSEL, 0, MAKELPARAM(pos, pos));
 #endif // Win32/16
 
-    static const char *nothing = "";
+    static const wxChar *nothing = _T("");
     SendMessage(hWnd, EM_REPLACESEL, 0, (LPARAM)nothing);
 }
 
     SendMessage(hWnd, EM_REPLACESEL, 0, (LPARAM)nothing);
 }
 
@@ -809,7 +811,16 @@ int wxTextCtrl::GetLineLength(long lineNo) const
 
 wxString wxTextCtrl::GetLineText(long lineNo) const
 {
 
 wxString wxTextCtrl::GetLineText(long lineNo) const
 {
+    // TODO this should probably be optimized by using GetWriteBuf()
+
     size_t len = (size_t)GetLineLength(lineNo) + 1;
     size_t len = (size_t)GetLineLength(lineNo) + 1;
+    if ( len < sizeof(WORD) )
+    {
+        // there must be at least enough place for the length WORD in the
+        // buffer
+        len += sizeof(WORD);
+    }
+
     char *buf = (char *)malloc(len);
     *(WORD *)buf = len;
     int noChars = (int)SendMessage(GetHwnd(), EM_GETLINE, lineNo, (LPARAM)buf);
     char *buf = (char *)malloc(len);
     *(WORD *)buf = len;
     int noChars = (int)SendMessage(GetHwnd(), EM_GETLINE, lineNo, (LPARAM)buf);
@@ -880,7 +891,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
             if ( !(m_windowStyle & wxTE_MULTILINE) )
             {
                 wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
             if ( !(m_windowStyle & wxTE_MULTILINE) )
             {
                 wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
-                event.SetEventObject( this );
+                InitCommandEvent(event);
                 if ( GetEventHandler()->ProcessEvent(event) )
                     return;
             }
                 if ( GetEventHandler()->ProcessEvent(event) )
                     return;
             }
@@ -893,30 +904,19 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
             // 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.
             // 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
             {
                 wxNavigationKeyEvent eventNav;
                 eventNav.SetDirection(!event.ShiftDown());
             {
                 wxNavigationKeyEvent eventNav;
                 eventNav.SetDirection(!event.ShiftDown());
-                eventNav.SetWindowChange(FALSE);
+                eventNav.SetWindowChange(event.ControlDown());
                 eventNav.SetEventObject(this);
 
                 if ( GetParent()->GetEventHandler()->ProcessEvent(eventNav) )
                     return;
             }
             break;
                 eventNav.SetEventObject(this);
 
                 if ( GetParent()->GetEventHandler()->ProcessEvent(eventNav) )
                     return;
             }
             break;
-
-        default:
-            event.Skip();
-            return;
     }
 
     }
 
-    // don't just call event.Skip() because this will cause TABs and ENTERs
-    // be passed upwards and we don't always want this - instead process it
-    // right here
-
-    // FIXME
+    // no, we didn't process it
     event.Skip();
 }
 
     event.Skip();
 }
 
@@ -938,10 +938,8 @@ bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
         case EN_CHANGE:
             {
                 wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
         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 );
+                InitCommandEvent(event);
+                event.SetString(GetValue());
                 ProcessCommand(event);
             }
             break;
                 ProcessCommand(event);
             }
             break;
@@ -1022,27 +1020,27 @@ wxSize wxTextCtrl::DoGetBestSize() const
 // standard handlers for standard edit menu events
 // ----------------------------------------------------------------------------
 
 // standard handlers for standard edit menu events
 // ----------------------------------------------------------------------------
 
-void wxTextCtrl::OnCut(wxCommandEvent& event)
+void wxTextCtrl::OnCut(wxCommandEvent& WXUNUSED(event))
 {
     Cut();
 }
 
 {
     Cut();
 }
 
-void wxTextCtrl::OnCopy(wxCommandEvent& event)
+void wxTextCtrl::OnCopy(wxCommandEvent& WXUNUSED(event))
 {
     Copy();
 }
 
 {
     Copy();
 }
 
-void wxTextCtrl::OnPaste(wxCommandEvent& event)
+void wxTextCtrl::OnPaste(wxCommandEvent& WXUNUSED(event))
 {
     Paste();
 }
 
 {
     Paste();
 }
 
-void wxTextCtrl::OnUndo(wxCommandEvent& event)
+void wxTextCtrl::OnUndo(wxCommandEvent& WXUNUSED(event))
 {
     Undo();
 }
 
 {
     Undo();
 }
 
-void wxTextCtrl::OnRedo(wxCommandEvent& event)
+void wxTextCtrl::OnRedo(wxCommandEvent& WXUNUSED(event))
 {
     Redo();
 }
 {
     Redo();
 }