]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/checkbox.cpp
don't use strlen() to verify the length of the string as it can contain embedded...
[wxWidgets.git] / src / os2 / checkbox.cpp
index 83117513887cdfb363c35635af9339c59bb2aad3..84d93fc94b39162d987fd5ca6a03be44121db7ec 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        checkbox.cpp
+// Name:        src/os2/checkbox.cpp
 // Purpose:     wxCheckBox
 // Author:      David Webster
 // Modified by:
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
+#include "wx/checkbox.h"
+
 #ifndef WX_PRECOMP
-    #include "wx/checkbox.h"
     #include "wx/brush.h"
+    #include "wx/scrolwin.h"
+    #include "wx/dcscreen.h"
+    #include "wx/settings.h"
 #endif
 
 #include "wx/os2/private.h"
 IMPLEMENT_DYNAMIC_CLASS(wxCheckBox, wxControl)
 IMPLEMENT_DYNAMIC_CLASS(wxBitmapCheckBox, wxCheckBox)
 
+extern void  wxAssociateWinWithHandle( HWND         hWnd
+                                      ,wxWindowOS2* pWin
+                                     );
+
 // ============================================================================
 // implementation
 // ============================================================================
@@ -34,146 +42,79 @@ IMPLEMENT_DYNAMIC_CLASS(wxBitmapCheckBox, wxCheckBox)
 // wxCheckBox
 // ----------------------------------------------------------------------------
 
-bool wxCheckBox::OS2Command(
-  WXUINT                            WXUNUSED(uParam)
-, WXWORD                            WXUNUSED(wId)
-)
+bool wxCheckBox::OS2Command( WXUINT WXUNUSED(uParam),
+                             WXWORD WXUNUSED(wId) )
 {
-    wxCommandEvent                  rEvent( wxEVT_COMMAND_CHECKBOX_CLICKED
-                                           ,m_windowId
-                                          );
+    wxCommandEvent rEvent( wxEVT_COMMAND_CHECKBOX_CLICKED, m_windowId );
     rEvent.SetInt(GetValue());
     rEvent.SetEventObject(this);
     ProcessCommand(rEvent);
-    return TRUE;
+    return true;
 } // end of wxCheckBox::OS2Command
 
-bool wxCheckBox::Create(
-  wxWindow*                         pParent
-, wxWindowID                        vId
-, const wxString&                   rsLabel
-, const wxPoint&                    rPos
-, const wxSize&                     rSize
-, long                              lStyle
-#if wxUSE_VALIDATORS
-, const wxValidator&                rValidator
-#endif
-, const wxString&                   rsName
-)
+bool wxCheckBox::Create(wxWindow* pParent,
+                        wxWindowID vId,
+                        const wxString& rsLabel,
+                        const wxPoint& rPos,
+                        const wxSize& rSize,
+                        long lStyle,
+                        const wxValidator& rValidator,
+                        const wxString& rsName )
 {
-    SetName(rsName);
-#if wxUSE_VALIDATORS
-    SetValidator(rValidator);
-#endif
-    if (pParent)
-        pParent->AddChild(this);
-
-    SetBackgroundColour(pParent->GetBackgroundColour());
-    SetForegroundColour(pParent->GetForegroundColour());
-    m_windowStyle = lStyle;
-
-    wxString                        sLabel = rsLabel;
-
-    if (sLabel == wxT(""))
-        sLabel = wxT(" "); // Apparently needed or checkbox won't show
-
-    if (vId == -1 )
-        m_windowId = NewControlId();
-    else
-        m_windowId = vId;
-
-    int                             nX      = rPos.x;
-    int                             nY      = rPos.y;
-    int                             nWidth  = rSize.x;
-    int                             nHeight = rSize.y;
-    long                            lSstyle = 0L;
-
-    lSstyle = BS_AUTOCHECKBOX |
-              WS_TABSTOP      |
-              WS_VISIBLE;
-    if (lStyle & wxCLIP_SIBLINGS )
-        lSstyle |= WS_CLIPSIBLINGS;
-
-    //
-    // If the parent is a scrolled window the controls must
-    // have this style or they will overlap the scrollbars
-    //
-    if (pParent)
-        if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) ||
-            pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)))
-            lSstyle |= WS_CLIPSIBLINGS;
-
-    m_hWnd = (WXHWND)::WinCreateWindow ( GetHwndOf(pParent)
-                                        ,WC_BUTTON
-                                        ,rsLabel.c_str()
-                                        ,lSstyle
-                                        ,0, 0, 0, 0
-                                        ,GetWinHwnd(pParent)
-                                        ,HWND_TOP
-                                        ,(HMENU)m_windowId
-                                        ,NULL
-                                        ,NULL
-                                       );
-
-    //
-    // Subclass again for purposes of dialog editing mode
-    //
-    SubclassWin(m_hWnd);
-
-    LONG                            lColor = (LONG)m_backgroundColour.GetPixel();
-
+    if (!CreateControl( pParent
+                       ,vId
+                       ,rPos
+                       ,rSize
+                       ,lStyle
+                       ,rValidator
+                       ,rsName
+                      ))
+        return false;
+
+
+    long osStyle = BS_AUTOCHECKBOX | WS_TABSTOP | WS_VISIBLE;
+
+    bool bOk = OS2CreateControl( wxT("BUTTON")
+                           ,osStyle
+                           ,rPos
+                           ,rSize
+                           ,rsLabel
+                           ,0
+                          );
+    m_backgroundColour = pParent->GetBackgroundColour();
+
+    LONG lColor = (LONG)m_backgroundColour.GetPixel();
     ::WinSetPresParam( m_hWnd
                       ,PP_BACKGROUNDCOLOR
                       ,sizeof(LONG)
                       ,(PVOID)&lColor
                      );
-
-    SetFont(pParent->GetFont());
-
-    SetSize( nX
-            ,nY
-            ,nWidth
-            ,nHeight
-           );
-    return TRUE;
+    wxAssociateWinWithHandle(m_hWnd, this);
+    return bOk;
 } // end of wxCheckBox::Create
 
-void wxCheckBox::SetLabel(
-  const wxString&                   rsLabel
-)
+void wxCheckBox::SetLabel( const wxString& rsLabel )
 {
-    ::WinSetWindowText(GetHwnd(), rsLabel.c_str());
+    wxString  sLabel=::wxPMTextToLabel(rsLabel);
+    ::WinSetWindowText(GetHwnd(), (PSZ)sLabel.c_str());
 } // end of wxCheckBox::SetLabel
 
 wxSize wxCheckBox::DoGetBestSize() const
 {
-    static int                      nCheckSize = 0;
-
-    if (!nCheckSize)
-    {
-        wxScreenDC                  vDc;
-
-        vDc.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
-
-        //
-        // The height of a standard button in the dialog units is 8,
-        // translate this to pixels (as one dialog unit is precisely equal to
-        // 8 character heights, it's just the char height)
-        //
-        nCheckSize = vDc.GetCharHeight();
-    }
-
-    int                             nWidthCheckbox;
-    int                             nHeightCheckbox;
-    wxString                        sStr = wxGetWindowText(GetHWND());
-
-    if (!sStr.IsEmpty())
+    // We should probably compute nCheckSize but it seems to be a constant
+    // independent of its label's font size and not made available by OS/2.
+    int      nCheckSize = RADIO_SIZE;
+    int      nWidthCheckbox;
+    int      nHeightCheckbox;
+    wxString sStr = wxGetWindowText(GetHWND());
+
+    if (!sStr.empty())
     {
         GetTextExtent( sStr
                       ,&nWidthCheckbox
                       ,&nHeightCheckbox
                      );
-        nWidthCheckbox += nCheckSize + GetCharWidth();
+        nWidthCheckbox += nCheckSize;
 
         if (nHeightCheckbox < nCheckSize)
             nHeightCheckbox = nCheckSize;
@@ -184,14 +125,10 @@ wxSize wxCheckBox::DoGetBestSize() const
         nHeightCheckbox = nCheckSize;
     }
 
-    return wxSize( nWidthCheckbox
-                  ,nHeightCheckbox
-                 );
+    return wxSize( nWidthCheckbox, nHeightCheckbox );
 } // end of wxCheckBox::DoGetBestSize
 
-void wxCheckBox::SetValue(
-  bool                              bValue
-)
+void wxCheckBox::SetValue( bool bValue )
 {
     ::WinSendMsg(GetHwnd(), BM_SETCHECK, (MPARAM)bValue, 0);
 } // end of wxCheckBox::SetValue
@@ -205,9 +142,7 @@ bool wxCheckBox::GetValue() const
     return((LONGFROMMR(::WinSendMsg(GetHwnd(), BM_QUERYCHECK, (MPARAM)0, (MPARAM)0)) == 1L));
 } // end of wxCheckBox::GetValue
 
-void wxCheckBox::Command (
-  wxCommandEvent&                  rEvent
-)
+void wxCheckBox::Command ( wxCommandEvent& rEvent )
 {
     SetValue((rEvent.GetInt() != 0));
     ProcessCommand(rEvent);
@@ -217,18 +152,14 @@ void wxCheckBox::Command (
 // wxBitmapCheckBox
 // ----------------------------------------------------------------------------
 
-bool wxBitmapCheckBox::Create(
-  wxWindow*                         pParent
-, wxWindowID                        vId
-, const wxBitmap*                   pLabel
-, const wxPoint&                    rPos
-, const wxSize&                     rSize
-, long                              lStyle
-#if wxUSE_VALIDATORS
-, const wxValidator&                rValidator
-#endif
-, const wxString&                   rsName
-)
+bool wxBitmapCheckBox::Create( wxWindow*          pParent,
+                               wxWindowID         vId,
+                               const wxBitmap*    WXUNUSED(pLabel),
+                               const wxPoint&     rPos,
+                               const wxSize&      rSize,
+                               long               lStyle,
+                               const wxValidator& rValidator,
+                               const wxString&    rsName)
 {
     SetName(rsName);
 #if wxUSE_VALIDATORS
@@ -271,13 +202,10 @@ bool wxBitmapCheckBox::Create(
            );
 
     ::WinShowWindow(hButton, TRUE);
-    return TRUE;
+    return true;
 } // end of wxBitmapCheckBox::Create
 
-void wxBitmapCheckBox::SetLabel(
-  const wxBitmap&                   rBitmap
-)
+void wxBitmapCheckBox::SetLabel( const wxBitmap& WXUNUSED(rBitmap) )
 {
     wxFAIL_MSG(wxT("not implemented"));
 }  // end of wxBitmapCheckBox::SetLabel
-