]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/button.cpp
Copied from src/msw/gsocket.c revision 1.61
[wxWidgets.git] / src / os2 / button.cpp
index 133a6f6cd57ecfa6657873d00742e8547c1bb654..5c4e70d5a0804ffe3e16b92b5a4d96048b9a8f0f 100644 (file)
@@ -13,6 +13,7 @@
 #include "wx/wxprec.h"
 
 #ifndef WX_PRECOMP
+    #include "wx/app.h"
     #include "wx/button.h"
     #include "wx/brush.h"
     #include "wx/panel.h"
@@ -46,12 +47,13 @@ bool wxButton::Create(
 , const wxPoint&                    rPos
 , const wxSize&                     rSize
 , long                              lStyle
-#if wxUSE_VALIDATORS
 , const wxValidator&                rValidator
-#endif
 , const wxString&                   rsName
 )
 {
+
+    wxString                        sLabel = ::wxPMTextToLabel(rsLabel);
+
     SetName(rsName);
 #if wxUSE_VALIDATORS
     SetValidator(rValidator);
@@ -74,7 +76,7 @@ bool wxButton::Create(
 
     m_hWnd = (WXHWND)::WinCreateWindow( GetHwndOf(pParent)   // Parent handle
                                        ,WC_BUTTON            // A Button class window
-                                       ,(PSZ)rsLabel.c_str() // Button text
+                                       ,(PSZ)sLabel.c_str()  // Button text
                                        ,lStyle               // Button style
                                        ,0, 0, 0, 0           // Location and size
                                        ,GetHwndOf(pParent)   // Owner handle
@@ -160,15 +162,21 @@ wxSize wxButton::DoGetBestSize() const
     //
     // Need a little extra to make it look right
     //
-    nHeightButton += nHeightChar/1.5;
+    nHeightButton += (int)(nHeightChar/1.5);
 
-    wxSize                          vSize = GetDefaultSize();
+    if (!HasFlag(wxBU_EXACTFIT))
+    {
+        wxSize                      vSize = GetDefaultSize();
 
-    if (nWidthButton > vSize.x)
-        vSize.x = nWidthButton;
-    if (nHeightButton > vSize.y)
-        vSize.y = nHeightButton;
-    return vSize;
+        if (nWidthButton > vSize.x)
+            vSize.x = nWidthButton;
+        if (nHeightButton > vSize.y)
+            vSize.y = nHeightButton;
+        return vSize;
+    }
+    return wxSize( nWidthButton
+                  ,nHeightButton
+                 );
 } // end of wxButton::DoGetBestSize
 
 /* static */
@@ -221,31 +229,95 @@ bool wxButton::SendClickEvent()
 void wxButton::SetDefault()
 {
     wxWindow*                       pParent = GetParent();
-    wxButton*                       pBtnOldDefault = NULL;
-    wxPanel*                        pPanel = wxDynamicCast(pParent, wxPanel);
-    long                            lStyle = 0L;
 
-    if (pParent)
-    {
-        wxWindow*                   pWinOldDefault = pParent->SetDefaultItem(this);
+    wxCHECK_RET( pParent, _T("button without parent?") );
 
-        pBtnOldDefault = wxDynamicCast(pWinOldDefault, wxButton);
-    }
-    if (pBtnOldDefault && pBtnOldDefault != this)
+    //
+    // Set this one as the default button both for wxWidgets and Windows
+    //
+    wxWindow*                       pWinOldDefault = pParent->SetDefaultItem(this);
+
+    SetDefaultStyle( wxDynamicCast(pWinOldDefault, wxButton)
+                    ,FALSE
+                   );
+    SetDefaultStyle( this
+                    ,TRUE
+                   );
+} // end of wxButton::SetDefault
+
+void wxButton::SetTmpDefault()
+{
+    wxWindow*                       pParent = GetParent();
+
+    wxCHECK_RET( pParent, _T("button without parent?") );
+
+    wxWindow*                       pWinOldDefault = pParent->GetDefaultItem();
+
+    pParent->SetTmpDefaultItem(this);
+    SetDefaultStyle( wxDynamicCast(pWinOldDefault, wxButton)
+                    ,FALSE
+                   );
+    SetDefaultStyle( this
+                    ,TRUE
+                   );
+} // end of wxButton::SetTmpDefault
+
+void wxButton::UnsetTmpDefault()
+{
+    wxWindow*                       pParent = GetParent();
+
+    wxCHECK_RET( pParent, _T("button without parent?") );
+
+    pParent->SetTmpDefaultItem(NULL);
+
+    wxWindow*                       pWinOldDefault = pParent->GetDefaultItem();
+
+    SetDefaultStyle( this
+                    ,FALSE
+                   );
+    SetDefaultStyle( wxDynamicCast(pWinOldDefault, wxButton)
+                    ,TRUE
+                   );
+} // end of wxButton::UnsetTmpDefault
+
+void wxButton::SetDefaultStyle(
+  wxButton*                         pBtn
+, bool                              bOn
+)
+{
+    long                            lStyle;
+    //
+    // We may be called with NULL pointer -- simpler to do the check here than
+    // in the caller which does wxDynamicCast()
+    //
+    if (!pBtn)
+        return;
+
+    //
+    // First, let DefDlgProc() know about the new default button
+    //
+    if (bOn)
     {
-        //
-        // Remove the BS_DEFPUSHBUTTON style from the other button
-        //
-        lStyle = ::WinQueryWindowULong(GetHwndOf(pBtnOldDefault), QWL_STYLE);
+        if (!wxTheApp->IsActive())
+            return;
 
         //
-        // Don't do it with the owner drawn buttons because it will reset
-        // BS_OWNERDRAW style bit too (BS_OWNERDRAW & BS_DEFPUSHBUTTON != 0)!
+        // In OS/2 the dialog/panel doesn't really know it has a default
+        // button, the default button simply has that style.  We'll just
+        // simulate by setting focus to it
         //
+        pBtn->SetFocus();
+    }
+    lStyle = ::WinQueryWindowULong(GetHwndOf(pBtn), QWL_STYLE);
+    if (!(lStyle & BS_DEFAULT) == bOn)
+    {
         if ((lStyle & BS_USERBUTTON) != BS_USERBUTTON)
         {
-            lStyle &= ~BS_DEFAULT;
-            ::WinSetWindowULong(GetHwndOf(pBtnOldDefault), QWL_STYLE, lStyle);
+            if (bOn)
+                lStyle |= BS_DEFAULT;
+            else
+                lStyle &= ~BS_DEFAULT;
+            ::WinSetWindowULong(GetHwndOf(pBtn), QWL_STYLE, lStyle);
         }
         else
         {
@@ -253,20 +325,10 @@ void wxButton::SetDefault()
             // Redraw the button - it will notice itself that it's not the
             // default one any longer
             //
-            pBtnOldDefault->Refresh();
+            pBtn->Refresh();
         }
     }
-
-    //
-    // Set this button as the default
-    //
-    lStyle = ::WinQueryWindowULong(GetHwnd(), QWL_STYLE);
-    if ((lStyle & BS_USERBUTTON) != BS_USERBUTTON)
-    {
-        lStyle != BS_DEFAULT;
-        ::WinSetWindowULong(GetHwnd(), QWL_STYLE, lStyle);
-    }
-} // end of wxButton::SetDefault
+} // end of wxButton::UpdateDefaultStyle
 
 // ----------------------------------------------------------------------------
 // event/message handlers
@@ -348,12 +410,16 @@ MRESULT wxButton::WindowProc(
 )
 {
     //
-    // When we receive focus, we want to become the default button in our
-    // parent panel
+    // When we receive focus, we want to temporary become the default button in
+    // our parent panel so that pressing "Enter" would activate us -- and when
+    // losing it we should restore the previous default button as well
     //
     if (uMsg == WM_SETFOCUS)
     {
-        SetDefault();
+        if (SHORT1FROMMP(lParam) == TRUE)
+            SetTmpDefault();
+        else
+            UnsetTmpDefault();
 
         //
         // Let the default processign take place too