]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/textctrl.cpp
We need to update the scrollbar even if it's not shown, otherwise it can get stuck...
[wxWidgets.git] / src / os2 / textctrl.cpp
index c567806c24450816f2841ebcf142ab24750649a7..be45467059a00b41b823ed7a70da71c3e598dbd6 100644 (file)
@@ -97,15 +97,10 @@ bool wxTextCtrl::Create(
 , const wxPoint&                    rPos
 , const wxSize&                     rSize
 , long                              lStyle
-#if wxUSE_VALIDATORS
 , const wxValidator&                rValidator
-#endif
 , const wxString&                   rsName
 )
 {
-    HWND                            hParent;
-    int                             nTempy;
-
     //
     // Base initialization
     //
@@ -114,12 +109,10 @@ bool wxTextCtrl::Create(
                      ,rPos
                      ,rSize
                      ,lStyle
-#if wxUSE_VALIDATORS
                      ,rValidator
-#endif
                      ,rsName
                     ))
-        return FALSE;
+        return false;
 
     wxPoint                         vPos = rPos; // The OS/2 position
     SWP                             vSwp;
@@ -130,7 +123,7 @@ bool wxTextCtrl::Create(
     }
 
     m_windowStyle = lStyle;
-    m_bIsMLE = FALSE;
+    m_bIsMLE = false;
 
     long                            lSstyle = WS_VISIBLE | WS_TABSTOP;
 
@@ -140,7 +133,7 @@ bool wxTextCtrl::Create(
     if ( m_windowStyle & wxTE_MULTILINE )
     {
         lSstyle |= MLS_BORDER | MLS_WORDWRAP;
-        m_bIsMLE = TRUE;
+        m_bIsMLE = true;
 
         if ((m_windowStyle & wxTE_NO_VSCROLL) == 0)
             lSstyle |= MLS_VSCROLL;
@@ -198,7 +191,7 @@ bool wxTextCtrl::Create(
 
     if (m_hWnd == 0)
     {
-        return FALSE;
+        return false;
     }
 
     SubclassWin(GetHWND());
@@ -212,7 +205,7 @@ bool wxTextCtrl::Create(
                                                             ,wxNORMAL
                                                            );
     SetFont(*pTextFont);
-    if (!rsValue.IsEmpty())
+    if (!rsValue.empty())
     {
         SetValue(rsValue);
     }
@@ -230,7 +223,7 @@ bool wxTextCtrl::Create(
             ,rSize.y
            );
     delete pTextFont;
-    return TRUE;
+    return true;
 } // end of wxTextCtrl::Create
 
 //
@@ -463,10 +456,10 @@ bool wxTextCtrl::CanCut() const
 
 bool wxTextCtrl::CanPaste() const
 {
-    bool                            bIsTextAvailable = FALSE;
+    bool                            bIsTextAvailable = false;
 
     if (!IsEditable())
-        return FALSE;
+        return false;
 
     //
     // Check for straight text on clipboard
@@ -509,8 +502,17 @@ void wxTextCtrl::SetInsertionPoint(
 
 void wxTextCtrl::SetInsertionPointEnd()
 {
-    long                            lPos = GetLastPosition();
+    wxTextPos                       lPos = GetLastPosition();
 
+    //
+    // We must not do anything if the caret is already there because calling
+    // SetInsertionPoint() thaws the controls if Freeze() had been called even
+    // 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())
+        return;
     SetInsertionPoint(lPos);
 } // end of wxTextCtrl::SetInsertionPointEnd
 
@@ -528,7 +530,7 @@ long wxTextCtrl::GetInsertionPoint() const
     return (dwPos & 0xFFFF);
 } // end of wxTextCtrl::GetInsertionPoint
 
-long wxTextCtrl::GetLastPosition() const
+wxTextPos wxTextCtrl::GetLastPosition() const
 {
     HWND                            hWnd = GetHwnd();
     long                            lCharIndex;
@@ -602,8 +604,6 @@ void wxTextCtrl::Replace(
 {
 #if wxUSE_CLIPBOARD
     HWND                            hWnd      = GetHwnd();
-    long                            lFromChar = lFrom;
-    long                            lToChar   = lTo;
 
     //
     // Set selection and remove it
@@ -640,8 +640,6 @@ void wxTextCtrl::Remove(
 )
 {
     HWND                            hWnd      = GetHwnd();
-    long                            lFromChar = lFrom;
-    long                            lToChar   = lTo;
 
     if (m_bIsMLE)
     {
@@ -665,7 +663,7 @@ void wxTextCtrl::SetSelection(
     long                            lToChar = lTo;
 
     //
-    // If from and to are both -1, it means (in wxWindows) that all text should
+    // If from and to are both -1, it means (in wxWidgets) that all text should
     // be selected. Translate into Windows convention
     //
     if ((lFrom == -1L) && (lTo == -1L))
@@ -689,9 +687,9 @@ bool wxTextCtrl::LoadFile(
         // Update the size limit if needed
         //
         AdjustSpaceLimit();
-        return TRUE;
+        return true;
     }
-    return FALSE;
+    return false;
 } // end of wxTextCtrl::LoadFile
 
 bool wxTextCtrl::IsModified() const
@@ -705,6 +703,15 @@ bool wxTextCtrl::IsModified() const
     return bRc;
 } // end of wxTextCtrl::IsModified
 
+void wxTextCtrl::MarkDirty()
+{
+    if (m_bIsMLE)
+        ::WinSendMsg(GetHwnd(), MLM_SETCHANGED, MPFROMLONG(TRUE), 0);
+    else
+        // EM controls do not have a SETCHANGED, what can we do??
+        wxFAIL_MSG( _T("not implemented") );
+}
+
 //
 // Makes 'unmodified'
 //
@@ -735,7 +742,6 @@ long wxTextCtrl::XYToPosition(
 , long                              lY
 ) const
 {
-    HWND                            hWnd = GetHwnd();
     long                            lCharIndex = 0L;
     long                            lLen;
 
@@ -767,7 +773,7 @@ bool wxTextCtrl::PositionToXY(
     if (nLineNo == -1)
     {
         // no such line
-        return FALSE;
+        return false;
     }
 
     //
@@ -799,7 +805,7 @@ bool wxTextCtrl::PositionToXY(
 
     if (lCharIndex == -1)
     {
-        return FALSE;
+        return false;
     }
 
     //
@@ -810,7 +816,7 @@ bool wxTextCtrl::PositionToXY(
     if (plY)
         *plY = nLineNo;
 
-    return TRUE;
+    return true;
 } // end of wxTextCtrl::PositionToXY
 
 void wxTextCtrl::ShowPosition(
@@ -950,7 +956,7 @@ bool wxTextCtrl::CanUndo() const
     if (m_bIsMLE)
         bOk = (::WinSendMsg(GetHwnd(), MLM_QUERYUNDO, 0, 0) != 0);
     else
-        bOk = FALSE; // can't undo regular edit fields in PM
+        bOk = false; // can't undo regular edit fields in PM
     return bOk;
 } // end of wxTextCtrl::CanUndo
 
@@ -961,7 +967,7 @@ bool wxTextCtrl::CanRedo() const
     if (m_bIsMLE)
         bOk = (::WinSendMsg(GetHwnd(), MLM_QUERYUNDO, 0, 0) != 0);
     else
-        bOk = FALSE; // can't undo regular edit fields in PM
+        bOk = false; // can't undo regular edit fields in PM
     return bOk;
 } // end of wxTextCtrl::CanRedo
 
@@ -998,7 +1004,6 @@ WXHBRUSH wxTextCtrl::OnCtlColor(
 )
 {
     HPS                             hPS = (HPS)hWxDC;
-    wxBrush*                        pBrush = NULL;
     wxColour                        vColBack = GetBackgroundColour();
     wxColour                        vColFore = GetForegroundColour();
     wxBrush*                        pBackgroundBrush = wxTheBrushList->FindOrCreateBrush( GetBackgroundColour()
@@ -1033,7 +1038,7 @@ void wxTextCtrl::OnChar(
   wxKeyEvent&                       rEvent
 )
 {
-    switch (rEvent.KeyCode())
+    switch (rEvent.GetKeyCode())
     {
         case WXK_RETURN:
             if ( !(m_windowStyle & wxTE_MULTILINE) )
@@ -1060,7 +1065,7 @@ void wxTextCtrl::OnChar(
                 wxNavigationKeyEvent    vEventNav;
 
                 vEventNav.SetDirection(!rEvent.ShiftDown());
-                vEventNav.SetWindowChange(FALSE);
+                vEventNav.SetWindowChange(false);
                 vEventNav.SetEventObject(this);
 
                 if ( GetEventHandler()->ProcessEvent(vEventNav) )
@@ -1098,7 +1103,6 @@ bool wxTextCtrl::OS2Command(
                                           );
 
                 InitCommandEvent(vEvent);
-                vEvent.SetString((char*)GetValue().c_str());
                 ProcessCommand(vEvent);
             }
             break;
@@ -1113,15 +1117,15 @@ bool wxTextCtrl::OS2Command(
         case EN_SCROLL:
         case EN_INSERTMODETOGGLE:
         case EN_MEMERROR:
-            return FALSE;
+            return false;
         default:
-            return FALSE;
+            return false;
     }
 
     //
     // Processed
     //
-    return TRUE;
+    return true;
 } // end of wxTextCtrl::OS2Command
 
 void wxTextCtrl::AdjustSpaceLimit()
@@ -1140,10 +1144,11 @@ void wxTextCtrl::AdjustSpaceLimit()
     }
     else
     {
-        ENTRYFDATA*                 pEfd;
+        ENTRYFDATA                  Efd;
         WNDPARAMS                   vParams;
 
         vParams.fsStatus = WPM_CBCTLDATA;
+        vParams.pCtlData = &Efd;
         vParams.cbCtlData = sizeof(ENTRYFDATA);
 
         if (::WinSendMsg( GetHwnd()
@@ -1151,10 +1156,7 @@ void wxTextCtrl::AdjustSpaceLimit()
                          ,&vParams
                          ,0
                         ))
-        {
-            pEfd = (ENTRYFDATA*)vParams.pCtlData;
-            uLimit = (unsigned int)pEfd->cchEditLimit;
-        }
+            uLimit = (unsigned int)Efd.cchEditLimit;
         else
             uLimit = 32; //PM's default
     }
@@ -1168,16 +1170,18 @@ void wxTextCtrl::AdjustSpaceLimit()
         if (m_bIsMLE)
             ::WinSendMsg(GetHwnd(), MLM_SETTEXTLIMIT, MPFROMLONG(uLimit), 0);
         else
-            ::WinSendMsg(GetHwnd(), EM_SETTEXTLIMIT, MPFROMLONG(uLimit), 0);
+            ::WinSendMsg(GetHwnd(), EM_SETTEXTLIMIT, MPFROMSHORT(uLimit), 0);
     }
 } // end of wxTextCtrl::AdjustSpaceLimit
 
 bool wxTextCtrl::AcceptsFocus() const
 {
     //
-    // We don't want focus if we can't be edited
+    // We don't want focus if we can't be edited unless we're a multiline
+    // control because then it might be still nice to get focus from keyboard
+    // to be able to scroll it without mouse
     //
-    return IsEditable() && wxControl::AcceptsFocus();
+    return (IsEditable() || IsMultiLine()) && wxControl::AcceptsFocus();
 } // end of wxTextCtrl::Command
 
 wxSize wxTextCtrl::DoGetBestSize() const
@@ -1188,7 +1192,7 @@ wxSize wxTextCtrl::DoGetBestSize() const
     wxGetCharSize(GetHWND(), &nCx, &nCy, (wxFont*)&GetFont());
 
     int                             wText = DEFAULT_ITEM_WIDTH;
-    int                             hText = (EDIT_HEIGHT_FROM_CHAR_HEIGHT(nCy) * .8);
+    int                             hText = (int)(EDIT_HEIGHT_FROM_CHAR_HEIGHT(nCy) * .8);
 
     if (m_windowStyle & wxTE_MULTILINE)
     {
@@ -1321,7 +1325,7 @@ bool wxTextCtrl::SetBackgroundColour(
 {
     if (m_bIsMLE)
         ::WinSendMsg(GetHwnd(), MLM_SETBACKCOLOR, (MPARAM)rColour.GetPixel(), MLE_INDEX);
-    return TRUE;
+    return true;
 } // end of wxTextCtrl::SetBackgroundColour
 
 bool wxTextCtrl::SetForegroundColour(
@@ -1330,7 +1334,7 @@ bool wxTextCtrl::SetForegroundColour(
 {
     if (m_bIsMLE)
         ::WinSendMsg(GetHwnd(), MLM_SETTEXTCOLOR, (MPARAM)rColour.GetPixel(), MLE_INDEX);
-    return TRUE;
+    return true;
 } // end of wxTextCtrl::SetForegroundColour
 
 bool wxTextCtrl::SetStyle(
@@ -1377,6 +1381,6 @@ bool wxTextCtrl::SetStyle(
     //
     // TODO:: finish this part
     //
-    return TRUE;
+    return true;
 } // end of wxTextCtrl::SetStyle