]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/textctrl.cpp
remove the search for parent with wxTAB_TRAVERSAL style in SetDefaultStyle(): it...
[wxWidgets.git] / src / msw / textctrl.cpp
index 381a2e3c2eca6188ff1cf1103797ee956e673974..1b08d80b6d5dea4623a30bbcd48f20f3a39acfb3 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        msw/textctrl.cpp
+// Name:        src/msw/textctrl.cpp
 // Purpose:     wxTextCtrl
 // Author:      Julian Smart
 // Modified by:
@@ -206,7 +206,7 @@ wxBEGIN_FLAGS( wxTextCtrlStyle )
     wxFLAGS_MEMBER(wxTE_CENTRE)
     wxFLAGS_MEMBER(wxTE_RIGHT)
     wxFLAGS_MEMBER(wxTE_DONTWRAP)
-    wxFLAGS_MEMBER(wxTE_LINEWRAP)
+    wxFLAGS_MEMBER(wxTE_CHARWRAP)
     wxFLAGS_MEMBER(wxTE_WORDWRAP)
 
 wxEND_FLAGS( wxTextCtrlStyle )
@@ -227,11 +227,11 @@ wxEND_HANDLERS_TABLE()
 
 wxCONSTRUCTOR_6( wxTextCtrl , wxWindow* , Parent , wxWindowID , Id , wxString , Value , wxPoint , Position , wxSize , Size , long , WindowStyle)
 #else
-IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxTextCtrlBase)
 #endif
 
 
-BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
+BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase)
     EVT_CHAR(wxTextCtrl::OnChar)
     EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
 
@@ -258,10 +258,49 @@ BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
     EVT_SET_FOCUS(wxTextCtrl::OnSetFocus)
 END_EVENT_TABLE()
 
+// ----------------------------------------------------------------------------
+// function prototypes
+// ----------------------------------------------------------------------------
+
+LRESULT APIENTRY _EXPORT wxTextCtrlWndProc(HWND hWnd,
+                                           UINT message,
+                                           WPARAM wParam,
+                                           LPARAM lParam);
+
+// ---------------------------------------------------------------------------
+// global vars
+// ---------------------------------------------------------------------------
+
+// the pointer to standard text control wnd proc
+static WNDPROC gs_wndprocEdit = (WNDPROC)NULL;
+
 // ============================================================================
 // implementation
 // ============================================================================
 
+// ----------------------------------------------------------------------------
+// wnd proc for subclassed edit control
+// ----------------------------------------------------------------------------
+
+LRESULT APIENTRY _EXPORT wxTextCtrlWndProc(HWND hWnd,
+                                           UINT message,
+                                           WPARAM wParam,
+                                           LPARAM lParam)
+{
+    wxWindow *win = wxFindWinFromHandle((WXHWND)hWnd);
+
+    switch ( message )
+    {
+        case WM_CUT:
+        case WM_COPY:
+        case WM_PASTE:
+            if( win->HandleClipboardEvent( message ) )
+                return 0;
+            break;
+    }
+    return ::CallWindowProc(CASTWNDPROC gs_wndprocEdit, hWnd, message, wParam, lParam);
+}
+
 // ----------------------------------------------------------------------------
 // creation
 // ----------------------------------------------------------------------------
@@ -351,25 +390,28 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
         // found (or if msw.inkedit != 0 and the InkEd.dll is present).
         // However, an application can veto ink edit controls by either specifying
         // msw.inkedit = 0 or by removing wxTE_RICH[2] from the style.
-        
+        //
         if ((wxSystemSettings::HasFeature(wxSYS_TABLET_PRESENT) || wxSystemOptions::GetOptionInt(wxT("msw.inkedit")) != 0) &&
             !(wxSystemOptions::HasOption(wxT("msw.inkedit")) && wxSystemOptions::GetOptionInt(wxT("msw.inkedit")) == 0))
         {
             if (wxRichEditModule::LoadInkEdit())
-            {                
-                windowClass = INKEDIT_CLASS;                
+            {
+                windowClass = INKEDIT_CLASS;
+
+#if wxUSE_INKEDIT && wxUSE_RICHEDIT
                 m_isInkEdit = 1;
-                
+#endif
+
                 // Fake rich text version for other calls
                 m_verRichEdit = 2;
             }
         }
 #endif
-        
-        if (!m_isInkEdit)
+
+        if (!IsInkEdit())
         {
             if ( m_verRichEdit == 2 )
-            {            
+            {
                 if ( wxRichEditModule::Load(wxRichEditModule::Version_41) )
                 {
                     // yes, class name for version 4.1 really is 5.0
@@ -411,7 +453,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
                     m_verRichEdit = 0;
                 }
             }
-        } // !useInkEdit 
+        } // !useInkEdit
     }
 #endif // wxUSE_RICHEDIT
 
@@ -438,12 +480,12 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
             // Pass IEM_InsertText (0) as wParam, in order to have the ink always
             // converted to text.
             ::SendMessage(GetHwnd(), EM_SETINKINSERTMODE, 0, 0);
-            
+
             // Make sure the mouse can be used for input
             ::SendMessage(GetHwnd(), EM_SETUSEMOUSEFORINPUT, 1, 0);
         }
 #endif
-        
+
         // enable the events we're interested in: we want to get EN_CHANGE as
         // for the normal controls
         LPARAM mask = ENM_CHANGE;
@@ -476,6 +518,9 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
     }
 #endif // wxUSE_RICHEDIT
 
+    gs_wndprocEdit = wxSetWindowProc((HWND)GetHwnd(),
+                                     wxTextCtrlWndProc);
+
     return true;
 }
 
@@ -746,20 +791,24 @@ void wxTextCtrl::SetValue(const wxString& value)
     {
         DoWriteText(value, false /* not selection only */);
 
+        // mark the control as being not dirty - we changed its text, not the
+        // user
+        DiscardEdits();
+
         // for compatibility, don't move the cursor when doing SetValue()
         SetInsertionPoint(0);
     }
     else // same text
     {
+        // still reset the modified flag even if the value didn't really change
+        // because now it comes from the program and not the user (and do it
+        // before generating the event so that the event handler could get the
+        // expected value from IsModified())
+        DiscardEdits();
+
         // still send an event for consistency
         SendUpdateEvent();
     }
-
-    // we should reset the modified flag even if the value didn't really change
-
-    // mark the control as being not dirty - we changed its text, not the
-    // user
-    DiscardEdits();
 }
 
 #if wxUSE_RICHEDIT && (!wxUSE_UNICODE || wxUSE_UNICODE_MSLU)
@@ -1797,16 +1846,15 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
     switch ( event.GetKeyCode() )
     {
         case WXK_RETURN:
-            if ( !HasFlag(wxTE_MULTILINE) )
             {
                 wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
                 InitCommandEvent(event);
                 event.SetString(GetValue());
                 if ( GetEventHandler()->ProcessEvent(event) )
+                if ( !HasFlag(wxTE_MULTILINE) )
                     return;
+                //else: multiline controls need Enter for themselves
             }
-            //else: multiline controls need Enter for themselves
-
             break;
 
         case WXK_TAB:
@@ -2771,9 +2819,9 @@ bool wxRichEditModule::LoadInkEdit()
     static bool             ms_inkEditLibLoadAttemped;
     if (ms_inkEditLibLoadAttemped)
         ms_inkEditLib.IsLoaded();
-    
+
     ms_inkEditLibLoadAttemped = true;
-    
+
     wxLogNull logNull;
     return ms_inkEditLib.Load(wxT("inked"));
 }