]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/button.cpp
the handling of Home/End in wxScrollBar was reversed -- fixed now
[wxWidgets.git] / src / os2 / button.cpp
index 83301398f7ffbed054116a2f22aa8c8130004fe8..46892a89fc769fe17608a0786b09bb0775a2b23b 100644 (file)
@@ -71,14 +71,6 @@ bool wxButton::Create(
     //
     if (m_windowStyle & wxCLIP_SIBLINGS )
         lStyle |= 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)))
-            lStyle |= WS_CLIPSIBLINGS;
 
     m_hWnd = (WXHWND)::WinCreateWindow( GetHwndOf(pParent)   // Parent handle
                                        ,WC_BUTTON            // A Button class window
@@ -100,12 +92,20 @@ bool wxButton::Create(
     // Subclass again for purposes of dialog editing mode
     //
     SubclassWin(m_hWnd);
-    SetFont(pParent->GetFont());
+    wxFont*                          pButtonFont = new wxFont( 8
+                                                              ,wxSWISS
+                                                              ,wxNORMAL
+                                                              ,wxNORMAL
+                                                             );
+    SetFont(*pButtonFont);
+    SetXComp(0);
+    SetYComp(0);
     SetSize( rPos.x
             ,rPos.y
             ,rSize.x
             ,rSize.y
            );
+    delete pButtonFont;
     return TRUE;
 } // end of wxButton::Create
 
@@ -162,13 +162,19 @@ wxSize wxButton::DoGetBestSize() const
     //
     nHeightButton += 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,27 +227,64 @@ bool wxButton::SendClickEvent()
 void wxButton::SetDefault()
 {
     wxWindow*                       pParent = GetParent();
-    wxButton*                       pBtnOldDefault = NULL;
-    wxPanel*                        pPanel = wxDynamicCast(pParent, wxPanel);
-    long                            lStyle = 0L;
 
-    if (pParent)
+    wxCHECK_RET( pParent, _T("button without parent?") );
+
+    //
+    // Set this one as the default button both for wxWindows and Windows
+    //
+    wxWindow*                       pWinOldDefault = pParent->SetDefaultItem(this);
+    UpdateDefaultStyle( this
+                       ,pWinOldDefault
+                      );
+} // end of wxButton::SetDefault
+
+void wxButton::SetTmpDefault()
+{
+    wxWindow*                       pParent = GetParent();
+
+    wxCHECK_RET( pParent, _T("button without parent?") );
+
+    wxWindow*                       pWinOldDefault = pParent->GetDefaultItem();
+    pParent->SetTmpDefaultItem(this);
+    if (pWinOldDefault != this)
     {
-        wxWindow*                   pWinOldDefault = pParent->SetDefaultItem(this);
+        UpdateDefaultStyle( this
+                           ,pWinOldDefault
+                          );
+    }
+    //else: no styles to update
+} // end of wxButton::SetTmpDefault
+
+void wxButton::UnsetTmpDefault()
+{
+    wxWindow*                       pParent = GetParent();
+
+    wxCHECK_RET( pParent, _T("button without parent?") );
 
-        pBtnOldDefault = wxDynamicCast(pWinOldDefault, wxButton);
+    pParent->SetTmpDefaultItem(NULL);
+
+    wxWindow*                       pWinOldDefault = pParent->GetDefaultItem();
+
+    if (pWinOldDefault != this)
+    {
+        UpdateDefaultStyle( pWinOldDefault
+                           ,this
+                          );
     }
-    if (pBtnOldDefault && pBtnOldDefault != this)
+    //else: we had been default before anyhow
+} // end of wxButton::UnsetTmpDefault
+
+void wxButton::UpdateDefaultStyle(
+  wxWindow*                         pWinDefault
+, wxWindow*                         pWinOldDefault)
+{
+    wxButton*                       pBtnOldDefault = wxDynamicCast(pWinOldDefault, wxButton);
+    long                            lStyle;
+
+    if ( pBtnOldDefault && pBtnOldDefault != pWinDefault )
     {
-        //
-        // Remove the BS_DEFPUSHBUTTON style from the other button
-        //
         lStyle = ::WinQueryWindowULong(GetHwndOf(pBtnOldDefault), QWL_STYLE);
-
-        //
-        // Don't do it with the owner drawn buttons because it will reset
-        // BS_OWNERDRAW style bit too (BS_OWNERDRAW & BS_DEFPUSHBUTTON != 0)!
-        //
         if ((lStyle & BS_USERBUTTON) != BS_USERBUTTON)
         {
             lStyle &= ~BS_DEFAULT;
@@ -249,24 +292,24 @@ void wxButton::SetDefault()
         }
         else
         {
-            //
-            // Redraw the button - it will notice itself that it's not the
+            // redraw the button - it will notice itself that it's not the
             // default one any longer
-            //
             pBtnOldDefault->Refresh();
         }
     }
 
-    //
-    // Set this button as the default
-    //
-    lStyle = ::WinQueryWindowULong(GetHwnd(), QWL_STYLE);
-    if ((lStyle & BS_USERBUTTON) != BS_USERBUTTON)
+    wxButton*                       pBtnDefault = wxDynamicCast(pWinDefault, wxButton);
+
+    if (pBtnDefault)
     {
-        lStyle != BS_DEFAULT;
-        ::WinSetWindowULong(GetHwnd(), QWL_STYLE, lStyle);
+        lStyle = ::WinQueryWindowULong(GetHwndOf(pBtnDefault), QWL_STYLE);
+        if ((lStyle & BS_USERBUTTON) != BS_USERBUTTON)
+        {
+            lStyle != BS_DEFAULT;
+            ::WinSetWindowULong(GetHwndOf(pBtnDefault), QWL_STYLE, lStyle);
+        }
     }
-} // end of wxButton::SetDefault
+} // end of wxButton::UpdateDefaultStyle
 
 // ----------------------------------------------------------------------------
 // event/message handlers
@@ -318,7 +361,28 @@ void wxButton::MakeOwnerDrawn()
         lStyle |= BS_USERBUTTON;
         ::WinSetWindowULong(GetHwnd(), QWL_STYLE, lStyle);
     }
-} // end of wxCButton::MakeOwnerDrawn
+} // end of wxButton::MakeOwnerDrawn
+
+WXDWORD wxButton::OS2GetStyle(
+  long                              lStyle
+, WXDWORD*                          pdwExstyle
+) const
+{
+    //
+    // Buttons never have an external border, they draw their own one
+    //
+    WXDWORD                         dwStyle = wxControl::OS2GetStyle( (lStyle & ~wxBORDER_MASK) | wxBORDER_NONE
+                                                                     ,pdwExstyle
+                                                                    );
+
+    //
+    // We must use WS_CLIPSIBLINGS with the buttons or they would draw over
+    // each other in any resizeable dialog which has more than one button in
+    // the bottom
+    //
+    dwStyle |= WS_CLIPSIBLINGS;
+    return dwStyle;
+} // end of wxButton::OS2GetStyle
 
 MRESULT wxButton::WindowProc(
   WXUINT                            uMsg
@@ -327,12 +391,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
@@ -362,5 +430,5 @@ MRESULT wxButton::WindowProc(
                                      ,wParam
                                      ,lParam
                                     ));
-} // end of wxW indowProc
+} // end of wxWindowProc