]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/tglbtn.cpp
Enable variadic macros for VC9 and later.
[wxWidgets.git] / src / msw / tglbtn.cpp
index 41a518ba0e7f61dcb701fe3073bde7d7cd70a859..e4effb9ff07328cd2c307a210e6c0f4a199b7917 100644 (file)
@@ -8,7 +8,7 @@
 // Created:     08.02.01
 // RCS-ID:      $Id$
 // Copyright:   (c) 2000 Johnny C. Norris II
-// License:     wxWindows licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
@@ -38,9 +38,6 @@
     #include "wx/log.h"
 #endif // WX_PRECOMP
 
-#include "wx/renderer.h"
-#include "wx/dcclient.h"
-
 #include "wx/msw/private.h"
 #include "wx/msw/private/button.h"
 
@@ -58,33 +55,17 @@ wxDEFINE_EVENT( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEvent );
 // wxBitmapToggleButton
 //-----------------------------------------------------------------------------
 
-IMPLEMENT_DYNAMIC_CLASS(wxBitmapToggleButton, wxControl)
-
-BEGIN_EVENT_TABLE(wxBitmapToggleButton,wxToggleButtonBase)
-   EVT_PAINT(wxBitmapToggleButton::OnPaint)
-   EVT_MOUSE_EVENTS(wxBitmapToggleButton::OnMouse)
-   EVT_CHAR(wxBitmapToggleButton::OnChar)
-   EVT_SIZE(wxBitmapToggleButton::OnSize)
-END_EVENT_TABLE()
-
-void wxBitmapToggleButton::Init()
-{
-    m_depressed = false;
-    m_oldValue = false;
-    m_capturing = false;
-}
+IMPLEMENT_DYNAMIC_CLASS(wxBitmapToggleButton, wxToggleButton)
 
 bool wxBitmapToggleButton::Create( wxWindow *parent, wxWindowID id,
                 const wxBitmap& label,const wxPoint& pos, const wxSize& size, long style,
                 const wxValidator& validator, const wxString& name )
 {
-    Init();
-
-    if (!wxToggleButtonBase::Create( parent, id, pos, size, style, validator, name ))
+    if (!wxToggleButton::Create( parent, id, wxEmptyString, pos, size, style, validator, name ))
         return false;
-        
-    m_bitmap = label;
-    
+
+    SetBitmap(label);
+
     if (size.x == -1 || size.y == -1)
     {
         wxSize new_size = GetBestSize();
@@ -94,156 +75,10 @@ bool wxBitmapToggleButton::Create( wxWindow *parent, wxWindowID id,
             new_size.y = size.y;
         SetSize( new_size );
     }
-        
-    return true;
-}
-
-void wxBitmapToggleButton::SetValue(bool state)
-{
-    if (m_capturing) return;
-
-    if (state == m_depressed) return;
-    
-    m_depressed = state;
-    Refresh();
-}
-
-bool wxBitmapToggleButton::GetValue() const
-{
-    return m_depressed;
-}
-
-void wxBitmapToggleButton::SetLabel(const wxBitmap& label)
-{
-    m_bitmap = label;
-    m_disabledBitmap = wxBitmap();
-    
-    Refresh();
-}
 
-bool wxBitmapToggleButton::Enable(bool enable)
-{
-    if (m_capturing) return false;
-
-    if (!wxToggleButtonBase::Enable( enable ))
-      return false;
-      
-    Refresh();
-    
     return true;
 }
 
-void wxBitmapToggleButton::OnPaint(wxPaintEvent &WXUNUSED(event))
-{
-    wxSize size = GetSize();
-    
-    wxBitmap bitmap = m_bitmap;
-    
-    wxPaintDC dc(this);
-    wxRendererNative &renderer = wxRendererNative::Get();
-    int flags = 0;
-    if (m_depressed)
-        flags |= wxCONTROL_PRESSED;
-    wxRect rect(0,0,size.x,size.y);
-    renderer.DrawPushButton( this, dc, rect, flags );
-    
-    if (bitmap.IsOk())
-    {
-        if (!IsEnabled())
-        {
-            if (!m_disabledBitmap.IsOk())
-            {
-                wxImage image = m_bitmap.ConvertToImage();
-                m_disabledBitmap = wxBitmap( image.ConvertToGreyscale() );
-            }
-            
-            bitmap = m_disabledBitmap;
-        }
-    
-        wxSize bsize = bitmap.GetSize();
-        int offset = 0;
-        if (m_depressed) offset = 1;
-        dc.DrawBitmap( bitmap, (size.x-bsize.x) / 2 + offset, (size.y-bsize.y) / 2 + offset, true );
-    }
-    
-}
-
-void wxBitmapToggleButton::OnMouse(wxMouseEvent &event)
-{
-    if (!IsEnabled())
-        return;
-      
-    wxSize size = GetSize();
-    bool mouse_in = ((event.GetX() > 0) && (event.GetX() < size.x) && 
-                     (event.GetY() > 0) && (event.GetY() < size.y));
-    
-    if (m_capturing)
-    {
-        bool old_depressed = m_depressed;
-        if (mouse_in)
-            m_depressed = !m_oldValue;
-        else
-            m_depressed = m_oldValue;
-            
-        if (event.LeftUp())
-        {
-            ReleaseCapture();
-            m_capturing = false;
-            if (mouse_in)
-            {
-                wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, m_windowId);
-                event.SetInt(GetValue());
-                event.SetEventObject(this);
-                ProcessCommand(event);
-            }
-        }
-            
-        if (old_depressed != m_depressed)
-           Refresh();
-    }
-    else
-    {
-        if (event.LeftDown())
-        {
-            m_capturing = true;
-            m_oldValue = m_depressed;
-            m_depressed = !m_oldValue;
-            CaptureMouse();
-            Refresh();
-        }
-    }
-}
-
-void wxBitmapToggleButton::OnChar(wxKeyEvent &event)
-{
-   if (event.GetKeyCode() == WXK_SPACE)
-   {
-       m_depressed = !m_depressed;
-       Refresh();
-       
-       wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, m_windowId);
-       event.SetInt(GetValue());
-       event.SetEventObject(this);
-       ProcessCommand(event);
-   }
-}
-
-void wxBitmapToggleButton::OnSize(wxSizeEvent &WXUNUSED(event))
-{
-    Refresh();
-}
-
-wxSize wxBitmapToggleButton::DoGetBestSize() const
-{
-    if (!m_bitmap.IsOk())
-        return wxSize(16,16);
-      
-    wxSize ret = m_bitmap.GetSize();
-    ret.x += 8;
-    ret.y += 8;
-    return ret;
-}
-
 
 // ----------------------------------------------------------------------------
 // wxToggleButton
@@ -251,6 +86,11 @@ wxSize wxBitmapToggleButton::DoGetBestSize() const
 
 IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
 
+void wxToggleButton::Init()
+{
+    m_state = false;
+}
+
 // Single check box item
 bool wxToggleButton::Create(wxWindow *parent,
                             wxWindowID id,
@@ -260,6 +100,8 @@ bool wxToggleButton::Create(wxWindow *parent,
                             const wxValidator& validator,
                             const wxString& name)
 {
+    Init();
+
     if ( !CreateControl(parent, id, pos, size, style, validator, name) )
         return false;
 
@@ -273,7 +115,7 @@ bool wxToggleButton::Create(wxWindow *parent,
     WXDWORD msStyle = MSWGetStyle(style, &exstyle);
     msStyle |= wxMSWButton::GetMultilineStyle(label);
 
-    return MSWCreateControl(_T("BUTTON"), msStyle, pos, size, label, exstyle);
+    return MSWCreateControl(wxT("BUTTON"), msStyle, pos, size, label, exstyle);
 }
 
 WXDWORD wxToggleButton::MSWGetStyle(long style, WXDWORD *exstyle) const
@@ -294,26 +136,29 @@ WXDWORD wxToggleButton::MSWGetStyle(long style, WXDWORD *exstyle) const
     return msStyle;
 }
 
-wxSize wxToggleButton::DoGetBestSize() const
-{
-    return wxMSWButton::ComputeBestSize(const_cast<wxToggleButton *>(this));
-}
-
-void wxToggleButton::SetLabel(const wxString& label)
-{
-    wxMSWButton::UpdateMultilineStyle(GetHwnd(), label);
-
-    wxToggleButtonBase::SetLabel(label);
-}
-
 void wxToggleButton::SetValue(bool val)
 {
-   ::SendMessage(GetHwnd(), BM_SETCHECK, val, 0);
+    m_state = val;
+    if ( IsOwnerDrawn() )
+    {
+        Refresh();
+    }
+    else
+    {
+        ::SendMessage(GetHwnd(), BM_SETCHECK, val, 0);
+    }
 }
 
 bool wxToggleButton::GetValue() const
 {
-    return ::SendMessage(GetHwnd(), BM_GETCHECK, 0, 0) == BST_CHECKED;
+    if ( IsOwnerDrawn() )
+    {
+        return m_state;
+    }
+    else
+    {
+        return ::SendMessage(GetHwnd(), BM_GETCHECK, 0, 0) == BST_CHECKED;
+    }
 }
 
 void wxToggleButton::Command(wxCommandEvent& event)
@@ -322,8 +167,18 @@ void wxToggleButton::Command(wxCommandEvent& event)
     ProcessCommand(event);
 }
 
-bool wxToggleButton::MSWCommand(WXUINT WXUNUSED(param), WXWORD WXUNUSED(id))
+bool wxToggleButton::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
 {
+    if ( param != BN_CLICKED && param != BN_DBLCLK )
+        return false;
+
+    // first update the value so that user event handler gets the new
+    // toggle button value
+
+    // ownerdrawn buttons don't manage their state themselves unlike usual
+    // auto checkboxes so do it ourselves in any case
+    m_state = !m_state;
+
     wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, m_windowId);
     event.SetInt(GetValue());
     event.SetEventObject(this);
@@ -331,4 +186,12 @@ bool wxToggleButton::MSWCommand(WXUINT WXUNUSED(param), WXWORD WXUNUSED(id))
     return true;
 }
 
+wxAnyButton::State wxToggleButton::GetNormalState() const
+{
+    if ( GetValue() )
+        return State_Pressed;
+    else
+        return State_Normal;
+}
+
 #endif // wxUSE_TOGGLEBTN