]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/textctrl.cpp
reSWIGged
[wxWidgets.git] / src / msw / textctrl.cpp
index 25aecb4bdfb2e7344edabcad5047bced359c395f..6cbd982bc684e6faa740111205d32068e8a8bf13 100644 (file)
@@ -220,15 +220,12 @@ void wxTextCtrl::Init()
     m_privateContextMenu = NULL;
     m_suppressNextUpdate = false;
     m_isNativeCaretShown = true;
+    m_isCaretAtEnd = true;
 }
 
 wxTextCtrl::~wxTextCtrl()
 {
-    if (m_privateContextMenu)
-    {
-        delete m_privateContextMenu;
-        m_privateContextMenu = NULL;
-    }
+    delete m_privateContextMenu;
 }
 
 bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
@@ -346,8 +343,6 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
     if ( !MSWCreateControl(windowClass, msStyle, pos, size, valueWin) )
         return false;
 
-    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
-
 #if wxUSE_RICHEDIT
     if ( IsRich() )
     {
@@ -943,8 +938,6 @@ void wxTextCtrl::DoWriteText(const wxString& value, bool selectionOnly)
                 SendUpdateEvent();
         }
     }
-
-    AdjustSpaceLimit();
 }
 
 void wxTextCtrl::AppendText(const wxString& text)
@@ -954,7 +947,8 @@ void wxTextCtrl::AppendText(const wxString& text)
     WriteText(text);
 
 #if wxUSE_RICHEDIT
-    if ( IsMultiLine() && GetRichVersion() > 1 )
+    // don't do this if we're frozen, saves some time
+    if ( !IsFrozen() && IsMultiLine() && GetRichVersion() > 1 )
     {
         // setting the caret to the end and showing it simply doesn't work for
         // RichEdit 2.0 -- force it to still do what we want
@@ -1084,6 +1078,8 @@ void wxTextCtrl::SetEditable(bool editable)
 void wxTextCtrl::SetInsertionPoint(long pos)
 {
     DoSetSelection(pos, pos);
+
+    m_isCaretAtEnd = pos == GetLastPosition();
 }
 
 void wxTextCtrl::SetInsertionPointEnd()
@@ -1093,8 +1089,11 @@ void wxTextCtrl::SetInsertionPointEnd()
     // if it doesn't actually move the caret anywhere and so the simple fact of
     // doing it results in horrible flicker when appending big amounts of text
     // to the control in a few chunks (see DoAddText() test in the text sample)
-    if ( GetInsertionPoint() == GetLastPosition() )
+    if ( m_isCaretAtEnd || GetInsertionPoint() == GetLastPosition() )
+    {
+        m_isCaretAtEnd = true;
         return;
+    }
 
     long pos;
 
@@ -1212,7 +1211,7 @@ void wxTextCtrl::DoSetSelection(long from, long to, bool scrollCaret)
         ::SendMessage(hWnd, EM_SETSEL, (WPARAM)from, (LPARAM)to);
     }
 
-    if ( scrollCaret )
+    if ( scrollCaret && !IsFrozen() )
     {
 #if wxUSE_RICHEDIT
         // richedit 3.0 (i.e. the version living in riched20.dll distributed
@@ -1473,6 +1472,9 @@ void wxTextCtrl::ShowPosition(long pos)
 
     if (linesToScroll != 0)
       (void)::SendMessage(hWnd, EM_LINESCROLL, (WPARAM)0, (LPARAM)linesToScroll);
+
+    // be pessimistic
+    m_isCaretAtEnd = false;
 }
 
 long wxTextCtrl::GetLengthOfLineContainingPos(long pos) const
@@ -1549,6 +1551,9 @@ void wxTextCtrl::Undo()
     if (CanUndo())
     {
         ::SendMessage(GetHwnd(), EM_UNDO, 0, 0);
+
+        // it's not necessarily at the end any more
+        m_isCaretAtEnd = false;
     }
 }
 
@@ -1563,6 +1568,9 @@ void wxTextCtrl::Redo()
 #endif
         // Same as Undo, since Undo undoes the undo, i.e. a redo.
         ::SendMessage(GetHwnd(), EM_UNDO, 0, 0);
+
+        // it's not necessarily at the end any more
+        m_isCaretAtEnd = false;
     }
 }
 
@@ -1848,38 +1856,12 @@ bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
     return true;
 }
 
-WXHBRUSH wxTextCtrl::OnCtlColor(WXHDC pDC, WXHWND WXUNUSED(pWnd), WXUINT WXUNUSED(nCtlColor),
-#if wxUSE_CTL3D
-                               WXUINT message,
-                               WXWPARAM wParam,
-                               WXLPARAM lParam
-#else
-                               WXUINT WXUNUSED(message),
-                               WXWPARAM WXUNUSED(wParam),
-                               WXLPARAM WXUNUSED(lParam)
-#endif
-    )
+WXHBRUSH wxTextCtrl::MSWControlColor(WXHDC hDC)
 {
-#if wxUSE_CTL3D
-    if ( m_useCtl3D )
-    {
-        HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
-        return (WXHBRUSH) hbrush;
-    }
-#endif // wxUSE_CTL3D
-
-    HDC hdc = (HDC)pDC;
-    wxColour colBack = GetBackgroundColour();
+    if ( !IsEnabled() && !HasFlag(wxTE_MULTILINE) )
+        return MSWControlColorDisabled(hDC);
 
-    if (!IsEnabled() && (GetWindowStyle() & wxTE_MULTILINE) == 0)
-        colBack = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
-
-    ::SetBkColor(hdc, wxColourToRGB(colBack));
-    ::SetTextColor(hdc, wxColourToRGB(GetForegroundColour()));
-
-    wxBrush *brush = wxTheBrushList->FindOrCreateBrush(colBack, wxSOLID);
-
-    return (WXHBRUSH)brush->GetResourceHandle();
+    return wxTextCtrlBase::MSWControlColorSolid(hDC);
 }
 
 bool wxTextCtrl::AdjustSpaceLimit()
@@ -2176,6 +2158,23 @@ bool wxTextCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
     return wxTextCtrlBase::MSWOnNotify(idCtrl, lParam, result);
 }
 
+// ----------------------------------------------------------------------------
+// Default colors for MSW text control
+//
+// Set default background color to the native white instead of
+// the default wxSYS_COLOUR_BTNFACE (is triggered with wxNullColour). 
+// ----------------------------------------------------------------------------
+
+wxVisualAttributes wxTextCtrl::GetDefaultAttributes() const
+{
+    wxVisualAttributes attrs;
+    attrs.font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+    attrs.colFg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
+    attrs.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); //white
+
+    return attrs;
+}
+
 // ----------------------------------------------------------------------------
 // colour setting for the rich edit controls
 // ----------------------------------------------------------------------------
@@ -2440,10 +2439,13 @@ bool wxTextCtrl::SetDefaultStyle(const wxTextAttr& style)
     if ( !wxTextCtrlBase::SetDefaultStyle(style) )
         return false;
 
-    // we have to do this or the style wouldn't apply for the text typed by the
-    // user
-    long posLast = GetLastPosition();
-    SetStyle(posLast, posLast, m_defaultStyle);
+    if ( IsEditable() )
+    {
+        // we have to do this or the style wouldn't apply for the text typed by
+        // the user
+        long posLast = GetLastPosition();
+        SetStyle(posLast, posLast, m_defaultStyle);
+    }
 
     return true;
 }