Implement support for button mnemonics in wxOSX/Cocoa.
Set the mnemonic as "key equivalent". Closes #12917. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72809 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		@@ -600,10 +600,11 @@ wxMSW:
 | 
				
			|||||||
- Don't send any events from wxSpinCtrl::SetRange() even if the value changed.
 | 
					- Don't send any events from wxSpinCtrl::SetRange() even if the value changed.
 | 
				
			||||||
- Display system drag images during drag and drop if available (PeterO).
 | 
					- Display system drag images during drag and drop if available (PeterO).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
wxOSX:
 | 
					wxOSX/Cocoa:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Fix pages range in the print dialog (Auria).
 | 
					- Fix pages range in the print dialog (Auria).
 | 
				
			||||||
- Implement image support in wxNotebook for wxOSX/Cocoa (Malcolm MacLeod).
 | 
					- Implement image support in wxNotebook (Malcolm MacLeod).
 | 
				
			||||||
 | 
					- Add support for button mnemonics (joostn).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
2.9.4: (released 2012-07-09)
 | 
					2.9.4: (released 2012-07-09)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -49,6 +49,10 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    virtual bool        OSXHandleClicked( double timestampsec );
 | 
					    virtual bool        OSXHandleClicked( double timestampsec );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if wxOSX_USE_COCOA
 | 
				
			||||||
 | 
					    void OSXSetAcceleratorFromLabel(const wxString& label);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
protected:
 | 
					protected:
 | 
				
			||||||
    DECLARE_DYNAMIC_CLASS(wxButton)
 | 
					    DECLARE_DYNAMIC_CLASS(wxButton)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -101,6 +101,9 @@ void wxButton::SetLabel(const wxString& label)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wxAnyButton::SetLabel(label);
 | 
					    wxAnyButton::SetLabel(label);
 | 
				
			||||||
 | 
					#if wxOSX_USE_COCOA
 | 
				
			||||||
 | 
					    OSXSetAcceleratorFromLabel(label);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
wxWindow *wxButton::SetDefault()
 | 
					wxWindow *wxButton::SetDefault()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,7 @@
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "wx/button.h"
 | 
					#include "wx/button.h"
 | 
				
			||||||
 | 
					#include "wx/toplevel.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "wx/osx/private.h"
 | 
					#include "wx/osx/private.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -171,6 +172,23 @@ public:
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void SetAcceleratorFromLabel(const wxString& label)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        const int accelPos = wxControl::FindAccelIndex(label);
 | 
				
			||||||
 | 
					        if ( accelPos != wxNOT_FOUND )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            wxString accelstring(label[accelPos + 1]); // Skip '&' itself
 | 
				
			||||||
 | 
					            accelstring.MakeLower();
 | 
				
			||||||
 | 
					            wxCFStringRef cfText(accelstring);
 | 
				
			||||||
 | 
					            [GetNSButton() setKeyEquivalent:cfText.AsNSString()];
 | 
				
			||||||
 | 
					            [GetNSButton() setKeyEquivalentModifierMask:NSCommandKeyMask];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [GetNSButton() setKeyEquivalent:@""];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    NSButton *GetNSButton() const
 | 
					    NSButton *GetNSButton() const
 | 
				
			||||||
@@ -183,6 +201,23 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
} // anonymous namespace
 | 
					} // anonymous namespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Set the keyboard accelerator key from the label (e.g. "Click &Me")
 | 
				
			||||||
 | 
					void wxButton::OSXSetAcceleratorFromLabel(const wxString& label)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    // Skip setting the accelerator for the default buttons as this would
 | 
				
			||||||
 | 
					    // overwrite the default "Enter" which should be preserved.
 | 
				
			||||||
 | 
					    wxTopLevelWindow * const
 | 
				
			||||||
 | 
					        tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow);
 | 
				
			||||||
 | 
					    if ( tlw )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if ( tlw->GetDefaultItem() == this )
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wxButtonCocoaImpl *impl = static_cast<wxButtonCocoaImpl*>(GetPeer());
 | 
				
			||||||
 | 
					    impl->SetAcceleratorFromLabel(label);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern "C" void SetBezelStyleFromBorderFlags(NSButton *v, long style);
 | 
					extern "C" void SetBezelStyleFromBorderFlags(NSButton *v, long style);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
// set bezel style depending on the wxBORDER_XXX flags specified by the style
 | 
					// set bezel style depending on the wxBORDER_XXX flags specified by the style
 | 
				
			||||||
@@ -266,7 +301,9 @@ wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [v setButtonType:NSMomentaryPushInButton];
 | 
					    [v setButtonType:NSMomentaryPushInButton];
 | 
				
			||||||
    return new wxButtonCocoaImpl( wxpeer, v );
 | 
					    wxButtonCocoaImpl* const impl = new wxButtonCocoaImpl( wxpeer, v );
 | 
				
			||||||
 | 
					    impl->SetAcceleratorFromLabel(label);
 | 
				
			||||||
 | 
					    return impl;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wxWidgetCocoaImpl::SetDefaultButton( bool isDefault )
 | 
					void wxWidgetCocoaImpl::SetDefaultButton( bool isDefault )
 | 
				
			||||||
@@ -274,7 +311,10 @@ void wxWidgetCocoaImpl::SetDefaultButton( bool isDefault )
 | 
				
			|||||||
    if ( [m_osxView isKindOfClass:[NSButton class]] )
 | 
					    if ( [m_osxView isKindOfClass:[NSButton class]] )
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if ( isDefault )
 | 
					        if ( isDefault )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            [(NSButton*)m_osxView setKeyEquivalent: @"\r" ];
 | 
					            [(NSButton*)m_osxView setKeyEquivalent: @"\r" ];
 | 
				
			||||||
 | 
					            [(NSButton*)m_osxView setKeyEquivalentModifierMask: 0];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            [(NSButton*)m_osxView setKeyEquivalent: @"" ];
 | 
					            [(NSButton*)m_osxView setKeyEquivalent: @"" ];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user