]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/radiobut.cpp
wxUniversal fixes:
[wxWidgets.git] / src / os2 / radiobut.cpp
index 65baab38b6731c39dd876d22546002a693ce1e41..f30fb7e20170ffa518d36f692a10f878b8eadd7e 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
 // Name:        radiobut.cpp
 // Purpose:     wxRadioButton
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
-// Created:     ??/??/98
+// Created:     10/12/99
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) David Webster
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "radiobut.h"
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
 #endif
 
+#ifndef WX_PRECOMP
+#include <stdio.h>
+#include "wx/setup.h"
 #include "wx/radiobut.h"
+#include "wx/brush.h"
+#include "wx/dcscreen.h"
+#include "wx/settings.h"
+#endif
+
+#include "wx/os2/private.h"
 
-#if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxRadioButton, wxControl)
-#endif
 
-bool wxRadioButton::Create(wxWindow *parent, wxWindowID id,
-                  const wxString& label,
-           const wxPoint& pos,
-           const wxSize& size, long style,
-           const wxValidator& validator,
-           const wxString& name)
+void wxRadioButton::Init()
 {
-    SetName(name);
-    SetValidator(validator);
+    m_bFocusJustSet = FALSE;
+} // end of wxRadioButton::Init
 
-    if (parent) parent->AddChild(this);
+void wxRadioButton::Command (
+  wxCommandEvent&                   rEvent
+)
+{
+    SetValue ((rEvent.GetInt() != 0) );
+    ProcessCommand (rEvent);
+} // end of wxRadioButton::Command
 
-    if ( id == -1 )
-           m_windowId = (int)NewControlId();
-    else
-           m_windowId = id;
+bool wxRadioButton::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
+)
+{
+    if ( !CreateControl( pParent
+                        ,vId
+                        ,rPos
+                        ,rSize
+                        ,lStyle
+#if wxUSE_VALIDATORS
+                        ,rValidator
+#endif
+                        ,rsName))
+        return FALSE;
 
-    m_windowStyle = style ;
+    long                            lSstyle = HasFlag(wxRB_GROUP) ? WS_GROUP : 0;
 
-    // TODO create radiobutton
-    return FALSE;
-}
+    lSstyle |= BS_AUTORADIOBUTTON;
 
-void wxRadioButton::SetLabel(const wxString& label)
-{
-    // TODO
-}
+    if (HasFlag(wxCLIP_SIBLINGS))
+        lSstyle |= WS_CLIPSIBLINGS;
+
+    if (!OS2CreateControl( _T("BUTTON")
+                          ,lSstyle
+                          ,rPos
+                          ,rSize
+                          ,rsLabel
+                          ,0
+                         ))
+        return FALSE;
+
+    if (HasFlag(wxRB_GROUP))
+        SetValue(TRUE);
+
+    wxFont*                          pTextFont = new wxFont( 10
+                                                            ,wxMODERN
+                                                            ,wxNORMAL
+                                                            ,wxNORMAL
+                                                           );
+    SetFont(*pTextFont);
+    SetSize( rPos.x
+            ,rPos.y
+            ,rSize.x
+            ,rSize.y
+           );
+    delete pTextFont;
+    return TRUE;
+} // end of wxRadioButton::Create
 
-void wxRadioButton::SetValue(bool value)
+wxSize wxRadioButton::DoGetBestSize() const
 {
-    // TODO
-}
+    static int                      snRadioSize = 0;
+
+    if (!snRadioSize)
+    {
+        wxScreenDC                  vDC;
+
+        vDC.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
+        snRadioSize = vDC.GetCharHeight();
+    }
+
+    wxString                        sStr = GetLabel();
+    int                             nRadioWidth;
+    int                             nRadioHeight;
 
+    if (!sStr.empty())
+    {
+        GetTextExtent( sStr
+                      ,&nRadioWidth
+                      ,&nRadioHeight
+                     );
+        nRadioWidth += snRadioSize + GetCharWidth();
+        if (nRadioHeight < snRadioSize)
+            nRadioHeight = snRadioSize;
+    }
+    else
+    {
+        nRadioWidth  = snRadioSize;
+        nRadioHeight = snRadioSize;
+    }
+    return wxSize( nRadioWidth
+                  ,nRadioHeight
+                 );
+} // end of wxRadioButton::DoGetBestSize
+
+//
 // Get single selection, for single choice list items
+//
 bool wxRadioButton::GetValue() const
 {
-    // TODO
-    return FALSE;
-}
+    return((::WinSendMsg((HWND) GetHWND(), BM_QUERYCHECK, (MPARAM)0L, (MPARAM)0L) != 0));
+} // end of wxRadioButton::GetValue
 
-void wxRadioButton::Command (wxCommandEvent & event)
+bool wxRadioButton::OS2Command(
+  WXUINT                            wParam
+, WXWORD                            wId
+)
 {
-  SetValue ( (event.m_commandInt != 0) );
-  ProcessCommand (event);
+    if (wParam == BN_CLICKED)
+    {
+        wxCommandEvent              rEvent( wxEVT_COMMAND_RADIOBUTTON_SELECTED
+                                           ,m_windowId
+                                          );
+
+        rEvent.SetEventObject(this);
+        ProcessCommand(rEvent);
+        return TRUE;
+    }
+    else
+        return FALSE;
+} // end of wxRadioButton::OS2Command
+
+void wxRadioButton::SetFocus()
+{
+    // when the radio button receives a WM_SETFOCUS message it generates a
+    // BN_CLICKED which is totally unexpected and leads to catastrophic results
+    // if you pop up a dialog from the radio button event handler as, when the
+    // dialog is dismissed, the focus is returned to the radio button which
+    // generates BN_CLICKED which leads to showing another dialog and so on
+    // without end!
+    //
+    // to aviod this, we drop the pseudo BN_CLICKED events generated when the
+    // button gains focus
+    m_bFocusJustSet = TRUE;
+
+    wxControl::SetFocus();
 }
 
+void wxRadioButton::SetLabel(
+  const wxString&                   rsLabel
+)
+{
+    ::WinSetWindowText((HWND)GetHWND(), (const char *)rsLabel.c_str());
+} // end of wxRadioButton::SetLabel
+
+void wxRadioButton::SetValue(
+  bool                              bValue
+)
+{
+    ::WinSendMsg((HWND)GetHWND(), BM_SETCHECK, (MPARAM)bValue, (MPARAM)0);
+} // end of wxRadioButton::SetValue