]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/button.cpp
correct bug with using uninitialized end variable (unused variable warnings are not...
[wxWidgets.git] / src / os2 / button.cpp
index 46892a89fc769fe17608a0786b09bb0775a2b23b..41fa9c9cbc19ab5b7ced118f03c7480482e3ab28 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        button.cpp
+// Name:        src/os2/button.cpp
 // Purpose:     wxButton
 // Author:      David Webster
 // Modified by:
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
+#include "wx/button.h"
+
 #ifndef WX_PRECOMP
-    #include "wx/button.h"
+    #include "wx/app.h"
     #include "wx/brush.h"
     #include "wx/panel.h"
     #include "wx/bmpbuttn.h"
     #include "wx/settings.h"
     #include "wx/dcscreen.h"
     #include "wx/scrolwin.h"
+    #include "wx/toplevel.h"
 #endif
 
+#include "wx/stockitem.h"
 #include "wx/os2/private.h"
 
 #define BUTTON_HEIGHT_FROM_CHAR_HEIGHT(cy) (11*EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy)/10)
@@ -39,19 +43,21 @@ IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl)
 
 // Button
 
-bool wxButton::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 wxButton::Create( wxWindow*          pParent,
+                       wxWindowID         vId,
+                       const wxString&    rsLbl,
+                       const wxPoint&     rPos,
+                       const wxSize&      rSize,
+                       long               lStyle,
+                       const wxValidator& rValidator,
+                       const wxString&    rsName)
 {
+    wxString rsLabel(rsLbl);
+    if (rsLabel.empty() && wxIsStockID(vId))
+        rsLabel = wxGetStockLabel(vId);
+
+    wxString                        sLabel = ::wxPMTextToLabel(rsLabel);
+
     SetName(rsName);
 #if wxUSE_VALIDATORS
     SetValidator(rValidator);
@@ -74,7 +80,7 @@ bool wxButton::Create(
 
     m_hWnd = (WXHWND)::WinCreateWindow( GetHwndOf(pParent)   // Parent handle
                                        ,WC_BUTTON            // A Button class window
-                                       ,(PSZ)rsLabel.c_str() // Button text
+                                       ,sLabel.c_str()  // Button text
                                        ,lStyle               // Button style
                                        ,0, 0, 0, 0           // Location and size
                                        ,GetHwndOf(pParent)   // Owner handle
@@ -85,7 +91,7 @@ bool wxButton::Create(
                                       );
     if (m_hWnd == 0)
     {
-        return FALSE;
+        return false;
     }
 
     //
@@ -106,21 +112,21 @@ bool wxButton::Create(
             ,rSize.y
            );
     delete pButtonFont;
-    return TRUE;
+    return true;
 } // end of wxButton::Create
 
 wxButton::~wxButton()
 {
-    wxPanel*                        pPanel = wxDynamicCast(GetParent(), wxPanel);
+    wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow);
 
-    if (pPanel)
+    if (tlw)
     {
-        if (pPanel->GetDefaultItem() == this)
+        if (tlw->GetDefaultItem() == this)
         {
             //
             // Don't leave the panel with invalid default item
             //
-            pPanel->SetDefaultItem(NULL);
+            tlw->SetDefaultItem(NULL);
         }
     }
 } // end of wxButton::~wxButton
@@ -135,6 +141,7 @@ wxSize wxButton::DoGetBestSize() const
     int                             nWidthButton;
     int                             nWidthChar;
     int                             nHeightChar;
+    wxFont                          vFont = (wxFont)GetFont();
 
     GetTextExtent( rsLabel
                   ,&nWidthButton
@@ -144,7 +151,7 @@ wxSize wxButton::DoGetBestSize() const
     wxGetCharSize( GetHWND()
                   ,&nWidthChar
                   ,&nHeightChar
-                  ,(wxFont*)&GetFont()
+                  ,&vFont
                  );
 
     //
@@ -160,7 +167,7 @@ wxSize wxButton::DoGetBestSize() const
     //
     // Need a little extra to make it look right
     //
-    nHeightButton += nHeightChar/1.5;
+    nHeightButton += (int)(nHeightChar/1.5);
 
     if (!HasFlag(wxBU_EXACTFIT))
     {
@@ -224,89 +231,92 @@ bool wxButton::SendClickEvent()
     return ProcessCommand(vEvent);
 } // end of wxButton::SendClickEvent
 
-void wxButton::SetDefault()
+wxWindow *wxButton::SetDefault()
 {
-    wxWindow*                       pParent = GetParent();
-
-    wxCHECK_RET( pParent, _T("button without parent?") );
-
     //
-    // Set this one as the default button both for wxWindows and Windows
+    // Set this one as the default button both for wxWidgets and Windows
     //
-    wxWindow*                       pWinOldDefault = pParent->SetDefaultItem(this);
-    UpdateDefaultStyle( this
-                       ,pWinOldDefault
-                      );
+    wxWindow* pWinOldDefault = wxButtonBase::SetDefault();
+
+    SetDefaultStyle( wxDynamicCast(pWinOldDefault, wxButton), false);
+    SetDefaultStyle( this, true );
+
+    return pWinOldDefault;
 } // end of wxButton::SetDefault
 
 void wxButton::SetTmpDefault()
 {
-    wxWindow*                       pParent = GetParent();
+    wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow);
 
-    wxCHECK_RET( pParent, _T("button without parent?") );
+    wxCHECK_RET( tlw, _T("button without top level window?") );
 
-    wxWindow*                       pWinOldDefault = pParent->GetDefaultItem();
-    pParent->SetTmpDefaultItem(this);
-    if (pWinOldDefault != this)
-    {
-        UpdateDefaultStyle( this
-                           ,pWinOldDefault
-                          );
-    }
-    //else: no styles to update
+    wxWindow*                       pWinOldDefault = tlw->GetDefaultItem();
+
+    tlw->SetTmpDefaultItem(this);
+    SetDefaultStyle( wxDynamicCast(pWinOldDefault, wxButton), false);
+    SetDefaultStyle( this, true );
 } // end of wxButton::SetTmpDefault
 
 void wxButton::UnsetTmpDefault()
 {
-    wxWindow*                       pParent = GetParent();
+    wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow);
 
-    wxCHECK_RET( pParent, _T("button without parent?") );
+    wxCHECK_RET( tlw, _T("button without top level window?") );
 
-    pParent->SetTmpDefaultItem(NULL);
+    tlw->SetTmpDefaultItem(NULL);
 
-    wxWindow*                       pWinOldDefault = pParent->GetDefaultItem();
+    wxWindow*                       pWinOldDefault = tlw->GetDefaultItem();
 
-    if (pWinOldDefault != this)
-    {
-        UpdateDefaultStyle( pWinOldDefault
-                           ,this
-                          );
-    }
-    //else: we had been default before anyhow
+    SetDefaultStyle( this, false );
+    SetDefaultStyle( wxDynamicCast(pWinOldDefault, wxButton), true );
 } // end of wxButton::UnsetTmpDefault
 
-void wxButton::UpdateDefaultStyle(
-  wxWindow*                         pWinDefault
-, wxWindow*                         pWinOldDefault)
+void wxButton::SetDefaultStyle(
+  wxButton*                         pBtn
+, bool                              bOn
+)
 {
-    wxButton*                       pBtnOldDefault = wxDynamicCast(pWinOldDefault, wxButton);
     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;
 
-    if ( pBtnOldDefault && pBtnOldDefault != pWinDefault )
+    //
+    // First, let DefDlgProc() know about the new default button
+    //
+    if (bOn)
+    {
+        if (!wxTheApp->IsActive())
+            return;
+
+        //
+        // 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)
     {
-        lStyle = ::WinQueryWindowULong(GetHwndOf(pBtnOldDefault), QWL_STYLE);
         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
         {
-            // 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();
-        }
-    }
-
-    wxButton*                       pBtnDefault = wxDynamicCast(pWinDefault, wxButton);
-
-    if (pBtnDefault)
-    {
-        lStyle = ::WinQueryWindowULong(GetHwndOf(pBtnDefault), QWL_STYLE);
-        if ((lStyle & BS_USERBUTTON) != BS_USERBUTTON)
-        {
-            lStyle != BS_DEFAULT;
-            ::WinSetWindowULong(GetHwndOf(pBtnDefault), QWL_STYLE, lStyle);
+            //
+            pBtn->Refresh();
         }
     }
 } // end of wxButton::UpdateDefaultStyle
@@ -315,12 +325,9 @@ void wxButton::UpdateDefaultStyle(
 // event/message handlers
 // ----------------------------------------------------------------------------
 
-bool wxButton::OS2Command(
-  WXUINT                            uParam
-, WXWORD                            wId
-)
+bool wxButton::OS2Command(WXUINT uParam, WXWORD WXUNUSED(wId))
 {
-    bool                            bProcessed = FALSE;
+    bool bProcessed = false;
 
     switch (uParam)
     {
@@ -329,21 +336,20 @@ bool wxButton::OS2Command(
             bProcessed = SendClickEvent();
             break;
     }
+
     return bProcessed;
 } // end of wxButton::OS2Command
 
-WXHBRUSH wxButton::OnCtlColor(
-  WXHDC                             pDC
-, WXHWND                            pWnd
-, WXUINT                            nCtlColor
-, WXUINT                            uMessage
-, WXWPARAM                          wParam
-, WXLPARAM                          lParam
-)
+WXHBRUSH wxButton::OnCtlColor( WXHDC    WXUNUSED(pDC),
+                               WXHWND   WXUNUSED(pWnd),
+                               WXUINT   WXUNUSED(nCtlColor),
+                               WXUINT   WXUNUSED(uMessage),
+                               WXWPARAM WXUNUSED(wParam),
+                               WXLPARAM WXUNUSED(lParam) )
 {
-    wxBrush*                        pBackgroundBrush = wxTheBrushList->FindOrCreateBrush( GetBackgroundColour()
-                                                                                         ,wxSOLID
-                                                                                        );
+    wxBrush* pBackgroundBrush = wxTheBrushList->FindOrCreateBrush( GetBackgroundColour()
+                                                                  ,wxSOLID
+                                                                  );
 
     return (WXHBRUSH)pBackgroundBrush->GetResourceHandle();
 } // end of wxButton::OnCtlColor
@@ -384,11 +390,9 @@ WXDWORD wxButton::OS2GetStyle(
     return dwStyle;
 } // end of wxButton::OS2GetStyle
 
-MRESULT wxButton::WindowProc(
-  WXUINT                            uMsg
-, WXWPARAM                          wParam
-, WXLPARAM                          lParam
-)
+MRESULT wxButton::WindowProc( WXUINT   uMsg,
+                              WXWPARAM wParam,
+                              WXLPARAM lParam )
 {
     //
     // When we receive focus, we want to temporary become the default button in
@@ -431,4 +435,3 @@ MRESULT wxButton::WindowProc(
                                      ,lParam
                                     ));
 } // end of wxWindowProc
-