]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/textctrl.cpp
fix for unicode crashes by Dimitri
[wxWidgets.git] / src / os2 / textctrl.cpp
index f80abd0f4cc1b359cd87fdb1abe82f683251069f..0e4b7a4461ddd4f490f8f7c4ed4cde41d8599516 100644 (file)
@@ -18,6 +18,7 @@
 
 #ifndef WX_PRECOMP
     #include "wx/textctrl.h"
+    #include "wx/scrolwin.h"
     #include "wx/settings.h"
     #include "wx/brush.h"
     #include "wx/utils.h"
@@ -43,7 +44,7 @@
 #   include <fstream>
 #endif
 
-#if defined(__EMX__) && !defined(MLE_INDEX)
+#if !defined(MLE_INDEX)
 #define MLE_INDEX  0
 #define MLE_RGB    1
 #endif
@@ -98,6 +99,8 @@ bool wxTextCtrl::Create(
 , const wxString&                   rsName
 )
 {
+    HWND                            hParent;
+    int                             nTempy;
     //
     // Base initialization
     //
@@ -118,17 +121,33 @@ bool wxTextCtrl::Create(
     if (pParent )
     {
         pParent->AddChild(this);
+        hParent = GetWinHwnd(pParent);
         //
         // OS2 uses normal coordinates, no bassackwards Windows ones
         //
-//        vPos.y = pParent->GetSize().y - (vPos.y + rSize.y);
+        if (pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)) ||
+            pParent->IsKindOf(CLASSINFO(wxScrolledWindow))
+           )
+        {
+            wxWindow*               pGrandParent = NULL;
+
+            pGrandParent = pParent->GetParent();
+            if (pGrandParent)
+                nTempy = pGrandParent->GetSize().y - (vPos.y + rSize.y);
+            else
+                nTempy = pParent->GetSize().y - (vPos.y + rSize.y);
+        }
+        else
+            nTempy = pParent->GetSize().y - (vPos.y + rSize.y);
+        vPos.y = nTempy;
     }
     else
     {
         RECTL                   vRect;
 
         ::WinQueryWindowRect(HWND_DESKTOP, &vRect);
-//        vPos.y = vRect.yTop - (vPos.y + rSize.y);
+        hParent = HWND_DESKTOP;
+        vPos.y = vRect.yTop - (vPos.y + rSize.y);
     }
 
     m_windowStyle = lStyle;
@@ -140,8 +159,8 @@ bool wxTextCtrl::Create(
     //
     if ( m_windowStyle & wxTE_MULTILINE )
     {
+        lSstyle |= MLS_BORDER | MLS_WORDWRAP;
         m_bIsMLE = TRUE;
-        m_windowStyle |= wxTE_PROCESS_ENTER;
 
         if ((m_windowStyle & wxTE_NO_VSCROLL) == 0)
             lSstyle |= MLS_VSCROLL;
@@ -152,7 +171,7 @@ bool wxTextCtrl::Create(
     }
     else
     {
-        lSstyle |= ES_LEFT;
+        lSstyle |= ES_LEFT | ES_AUTOSCROLL | ES_MARGIN;
 
         if (m_windowStyle & wxHSCROLL)
             lSstyle |=  ES_AUTOSCROLL;
@@ -161,6 +180,10 @@ bool wxTextCtrl::Create(
         if (m_windowStyle & wxTE_PASSWORD) // hidden input
             lSstyle |= ES_UNREADABLE;
     }
+    if ( pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)) ||
+         pParent->IsKindOf(CLASSINFO(wxScrolledWindow))
+       )
+        lSstyle |= WS_CLIPSIBLINGS;
     if (m_bIsMLE)
     {
         m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
@@ -221,8 +244,8 @@ bool wxTextCtrl::Create(
         SetValue(rsValue);
     }
     SetupColours();
-    SetSize( rPos.x
-            ,rPos.y
+    SetSize( vPos.x
+            ,vPos.y
             ,rSize.x
             ,rSize.y
            );
@@ -261,6 +284,14 @@ void wxTextCtrl::SetupColours()
     vBkgndColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW);
     SetBackgroundColour(vBkgndColour);
     SetForegroundColour(GetParent()->GetForegroundColour());
+    if (m_bIsMLE)
+    {
+        ::WinSendMsg( GetHwnd()
+                     ,MLM_SETTEXTCOLOR
+                     ,(MPARAM)GetParent()->GetForegroundColour().GetPixel()
+                     ,(MPARAM)MLE_RGB
+                    );
+    }
 } // end of wxTextCtrl::SetupColours
 
 // ----------------------------------------------------------------------------
@@ -307,19 +338,6 @@ void wxTextCtrl::WriteText(
   const wxString&                   rsValue
 )
 {
-    if (m_defaultStyle.HasFont() || m_defaultStyle.HasTextColour())
-    {
-        long                        lStart;
-        long                        lEnd;
-
-        GetSelection( &lStart
-                     ,&lEnd
-                    );
-        SetStyle( lStart
-                 ,lEnd
-                 ,m_defaultStyle
-                );
-    }
     ::WinSetWindowText(GetHwnd(), rsValue.c_str());
     AdjustSpaceLimit();
 } // end of wxTextCtrl::WriteText
@@ -618,52 +636,6 @@ void wxTextCtrl::SetSelection(
         ::WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT((USHORT)lFromChar, (USHORT)lToChar), (MPARAM)0);
 } // end of wxTextCtrl::SetSelection
 
-bool wxTextCtrl::SetStyle(
-  long                              lStart
-, long                              lEnd
-, const wxTextAttr&                 rStyle
-)
-{
-    HWND                            hWnd = GetHwnd();
-    //
-    // Order the range if needed
-    //
-    if (lStart > lEnd)
-    {
-        long                        lTmp = lStart;
-
-        lStart = lEnd;
-        lEnd = lTmp;
-    }
-
-    //
-    // We can only change the format of the selection, so select the range we
-    // want and restore the old selection later
-    long                            lStartOld;
-    long                            lEndOld;
-
-    GetSelection( &lStartOld
-                 ,&lEndOld
-                );
-
-    //
-    // But do we really have to change the selection?
-    //
-    bool                            bChangeSel = lStart != lStartOld || lEnd != lEndOld;
-
-    if (bChangeSel)
-    {
-        if (m_bIsMLE)
-            ::WinSendMsg(hWnd, MLM_SETSEL, MPFROM2SHORT((USHORT)lStart, (USHORT)lEnd), 0);
-        else
-            ::WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT((USHORT)lStart, (USHORT)lEnd), 0);
-    }
-    //
-    // TODO:: finish this by setting fonts and colors
-    //
-    return TRUE;
-} // end of wxTextCtrl::SetStyle
-
 bool wxTextCtrl::LoadFile(
   const wxString&                   rsFile
 )
@@ -1166,7 +1138,7 @@ wxSize wxTextCtrl::DoGetBestSize() const
     wxGetCharSize(GetHWND(), &nCx, &nCy, (wxFont*)&GetFont());
 
     int                             wText = DEFAULT_ITEM_WIDTH;
-    int                             hText = EDIT_HEIGHT_FROM_CHAR_HEIGHT(nCy);
+    int                             hText = (EDIT_HEIGHT_FROM_CHAR_HEIGHT(nCy) * .8);
 
     if (m_windowStyle & wxTE_MULTILINE)
     {
@@ -1268,3 +1240,50 @@ bool wxTextCtrl::SetForegroundColour(
     return TRUE;
 } // end of wxTextCtrl::SetForegroundColour
 
+bool wxTextCtrl::SetStyle(
+  long                              lStart
+, long                              lEnd
+, const wxTextAttr&                 rStyle
+)
+{
+    HWND                            hWnd = GetHwnd();
+
+    if (lStart > lEnd)
+    {
+        long                        lTmp = lStart;
+
+        lStart = lEnd;
+        lEnd   = lTmp;
+    }
+
+    //
+    // We can only change the format of the selection, so select the range we
+    // want and restore the old selection later
+    //
+    long                            lStartOld;
+    long                            lEndOld;
+
+    GetSelection( &lStartOld
+                 ,&lEndOld
+                );
+
+    //
+    // But do we really have to change the selection?
+    //
+    bool                            bChangeSel = lStart != lStartOld ||
+                                                 lEnd != lEndOld;
+
+    if (bChangeSel)
+    {
+        if (m_bIsMLE)
+            ::WinSendMsg(hWnd, MLM_SETSEL, MPFROM2SHORT((USHORT)lStart, (USHORT)lEnd), 0);
+        else
+            ::WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT((USHORT)lStart, (USHORT)lEnd), 0);
+    }
+
+    //
+    // TODO:: finish this part
+    //
+    return TRUE;
+} // end of wxTextCtrl::SetStyle
+