]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/textctrl.cpp
Weekly catch up.
[wxWidgets.git] / src / os2 / textctrl.cpp
index d49c34d97589870df878cc60be459de3fbd32035..b99d13006c242d2f9bdbcbcee4bacb971bb6f0d4 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
     //
@@ -114,21 +117,11 @@ bool wxTextCtrl::Create(
         return FALSE;
 
     wxPoint                         vPos = rPos; // The OS/2 position
+    SWP                             vSwp;
 
     if (pParent )
     {
         pParent->AddChild(this);
-        //
-        // OS2 uses normal coordinates, no bassackwards Windows ones
-        //
-        vPos.y = pParent->GetSize().y - (vPos.y + rSize.y);
-    }
-    else
-    {
-        RECTL                   vRect;
-
-        ::WinQueryWindowRect(HWND_DESKTOP, &vRect);
-        vPos.y = vRect.yTop - (vPos.y + rSize.y);
     }
 
     m_windowStyle = lStyle;
@@ -140,8 +133,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 +145,7 @@ bool wxTextCtrl::Create(
     }
     else
     {
-        lSstyle |= ES_LEFT;
+        lSstyle |= ES_LEFT | ES_AUTOSCROLL | ES_MARGIN;
 
         if (m_windowStyle & wxHSCROLL)
             lSstyle |=  ES_AUTOSCROLL;
@@ -161,16 +154,17 @@ bool wxTextCtrl::Create(
         if (m_windowStyle & wxTE_PASSWORD) // hidden input
             lSstyle |= ES_UNREADABLE;
     }
+
     if (m_bIsMLE)
     {
         m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
                                            ,WC_MLE                   // Window class
                                            ,(PSZ)rsValue.c_str()     // Initial Text
                                            ,(ULONG)lSstyle           // Style flags
-                                           ,(LONG)vPos.x             // X pos of origin
-                                           ,(LONG)vPos.y             // Y pos of origin
-                                           ,(LONG)rSize.x            // field width
-                                           ,(LONG)rSize.y            // field height
+                                           ,(LONG)0                  // X pos of origin
+                                           ,(LONG)0                  // Y pos of origin
+                                           ,(LONG)0                  // field width
+                                           ,(LONG)0                  // field height
                                            ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
                                            ,HWND_TOP                 // initial z position
                                            ,(ULONG)vId               // Window identifier
@@ -184,10 +178,10 @@ bool wxTextCtrl::Create(
                                            ,WC_ENTRYFIELD            // Window class
                                            ,(PSZ)rsValue.c_str()     // Initial Text
                                            ,(ULONG)lSstyle           // Style flags
-                                           ,(LONG)vPos.x             // X pos of origin
-                                           ,(LONG)vPos.y             // Y pos of origin
-                                           ,(LONG)rSize.x            // field width
-                                           ,(LONG)rSize.y            // field height
+                                           ,(LONG)0                  // X pos of origin
+                                           ,(LONG)0                  // Y pos of origin
+                                           ,(LONG)0                  // field width
+                                           ,(LONG)0                  // field height
                                            ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
                                            ,HWND_TOP                 // initial z position
                                            ,(ULONG)vId               // Window identifier
@@ -206,26 +200,30 @@ bool wxTextCtrl::Create(
     //
     // Set font, position, size and initial value
     //
-    wxFont&                         vFontParent = pParent->GetFont();
-
-    if (vFontParent.Ok())
-    {
-        SetFont(vFontParent);
-    }
-    else
-    {
-        SetFont(wxSystemSettings::GetSystemFont(wxSYS_SYSTEM_FONT));
-    }
+    wxFont*                          pTextFont = new wxFont( 10
+                                                            ,wxMODERN
+                                                            ,wxNORMAL
+                                                            ,wxNORMAL
+                                                           );
+    SetFont(*pTextFont);
     if (!rsValue.IsEmpty())
     {
         SetValue(rsValue);
     }
     SetupColours();
-    SetSize( rPos.x
-            ,rPos.y
+    //
+    // If X and/or Y are not zero the difference is the compensation value
+    // for margins for OS/2 controls.
+    //
+    ::WinQueryWindowPos(m_hWnd, &vSwp);
+    SetXComp(vSwp.x);
+    SetYComp(vSwp.y);
+    SetSize( vPos.x
+            ,vPos.y
             ,rSize.x
             ,rSize.y
            );
+    delete pTextFont;
     return TRUE;
 } // end of wxTextCtrl::Create
 
@@ -254,13 +252,73 @@ void wxTextCtrl::AdoptAttributesFromHWND()
     }
 } // end of wxTextCtrl::AdoptAttributesFromHWND
 
+WXDWORD wxTextCtrl::OS2GetStyle(
+  long                              lStyle
+, WXDWORD*                          pdwExstyle
+) const
+{
+    //
+    // Default border for the text controls is the sunken one
+    //
+    if ((lStyle & wxBORDER_MASK) == wxBORDER_DEFAULT )
+    {
+        lStyle |= wxBORDER_SUNKEN;
+    }
+
+    long                            dwStyle = wxControl::OS2GetStyle( lStyle
+                                                                     ,pdwExstyle
+                                                                    );
+
+    dwStyle = WS_VISIBLE | WS_TABSTOP;
+
+    //
+    // Single and multiline edit fields are two different controls in PM
+    //
+    if ( m_windowStyle & wxTE_MULTILINE )
+    {
+        dwStyle |= MLS_BORDER | MLS_WORDWRAP;
+        if ((m_windowStyle & wxTE_NO_VSCROLL) == 0)
+            dwStyle |= MLS_VSCROLL;
+        if (m_windowStyle & wxHSCROLL)
+            dwStyle |= MLS_HSCROLL;
+        if (m_windowStyle & wxTE_READONLY)
+            dwStyle |= MLS_READONLY;
+    }
+    else
+    {
+        dwStyle |= ES_LEFT | ES_AUTOSCROLL | ES_MARGIN;
+        if (m_windowStyle & wxHSCROLL)
+            dwStyle |=  ES_AUTOSCROLL;
+        if (m_windowStyle & wxTE_READONLY)
+            dwStyle |= ES_READONLY;
+        if (m_windowStyle & wxTE_PASSWORD) // hidden input
+            dwStyle |= ES_UNREADABLE;
+    }
+    return dwStyle;
+} // end of wxTextCtrl::OS2GetStyle
+
+void wxTextCtrl::SetWindowStyleFlag(
+  long                              lStyle
+)
+{
+    wxControl::SetWindowStyleFlag(lStyle);
+} // end of wxTextCtrl::SetWindowStyleFlag
+
 void wxTextCtrl::SetupColours()
 {
     wxColour                        vBkgndColour;
 
-    vBkgndColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW);
+    vBkgndColour = wxSystemSettings::GetColour(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,7 +365,10 @@ void wxTextCtrl::WriteText(
   const wxString&                   rsValue
 )
 {
-    ::WinSetWindowText(GetHwnd(), rsValue.c_str());
+    if (m_bIsMLE)
+        ::WinSendMsg(GetHwnd(), MLM_INSERT, MPARAM((PCHAR)rsValue.c_str()), MPARAM(0));
+    else
+        ::WinSetWindowText(GetHwnd(), rsValue.c_str());
     AdjustSpaceLimit();
 } // end of wxTextCtrl::WriteText
 
@@ -324,6 +385,14 @@ void wxTextCtrl::Clear()
     ::WinSetWindowText(GetHwnd(), "");
 } // end of wxTextCtrl::Clear
 
+bool wxTextCtrl::EmulateKeyPress(
+  const wxKeyEvent&                 rEvent
+)
+{
+    SetFocus();
+    return(wxTextCtrlBase::EmulateKeyPress(rEvent));
+} // end of wxTextCtrl::EmulateKeyPress
+
 // ----------------------------------------------------------------------------
 // Clipboard operations
 // ----------------------------------------------------------------------------
@@ -942,12 +1011,19 @@ WXHBRUSH wxTextCtrl::OnCtlColor(
     else
         ::GpiSetBackMix(hPS, BM_OVERPAINT);
     if (!IsEnabled() && (GetWindowStyle() & wxTE_MULTILINE) == 0)
-        vColBack = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
+        vColBack = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
     ::GpiSetBackColor(hPS, vColBack.GetPixel());
     ::GpiSetColor(hPS, vColFore.GetPixel());
     return (WXHBRUSH)pBackgroundBrush->GetResourceHandle();
 } // end of wxTextCtrl::OnCtlColor
 
+bool wxTextCtrl::OS2ShouldPreProcessMessage(
+  WXMSG*                            pMsg
+)
+{
+    return wxControl::OS2ShouldPreProcessMessage(pMsg);
+} // end of wxTextCtrl::OS2ShouldPreProcessMessage
+
 void wxTextCtrl::OnChar(
   wxKeyEvent&                       rEvent
 )
@@ -1107,11 +1183,11 @@ 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)
     {
-        hText *= wxMin(GetNumberOfLines(), 5);
+        hText *= wxMax(GetNumberOfLines(), 5);
     }
     //else: for single line control everything is ok
     return wxSize(wText, hText);
@@ -1209,3 +1285,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
+