diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d6c6c2d..afd4dd72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ FlatLaf Change Log string. (issue #134) - ComboBox: Fixed width of popup, which was too small if popup is wider than combo box and vertical scroll bar is visible. (issue #137) +- MenuItem on macOS: Removed plus characters from accelerator text and made + modifier key order conform with macOS standard. (issue #141) ## 0.38 diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java index 2c2103e8..b49d2df1 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java @@ -41,6 +41,7 @@ import javax.swing.text.View; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.util.Graphics2DProxy; import com.formdev.flatlaf.util.HiDPIUtils; +import com.formdev.flatlaf.util.SystemInfo; /** * Renderer for menu items. @@ -418,36 +419,78 @@ debug*/ private KeyStroke cachedAccelerator; private String cachedAcceleratorText; + private boolean cachedAcceleratorLeftToRight; private String getAcceleratorText() { KeyStroke accelerator = menuItem.getAccelerator(); if( accelerator == null ) return null; - if( accelerator == cachedAccelerator ) + boolean leftToRight = menuItem.getComponentOrientation().isLeftToRight(); + + if( accelerator == cachedAccelerator && leftToRight == cachedAcceleratorLeftToRight ) return cachedAcceleratorText; cachedAccelerator = accelerator; cachedAcceleratorText = getTextForAccelerator( accelerator ); + cachedAcceleratorLeftToRight = leftToRight; return cachedAcceleratorText; } protected String getTextForAccelerator( KeyStroke accelerator ) { StringBuilder buf = new StringBuilder(); - int modifiers = accelerator.getModifiers(); - if( modifiers != 0 ) - buf.append( InputEvent.getModifiersExText( modifiers ) ).append( acceleratorDelimiter ); + boolean leftToRight = menuItem.getComponentOrientation().isLeftToRight(); + // modifiers + int modifiers = accelerator.getModifiers(); + if( modifiers != 0 ) { + if( SystemInfo.isMacOS ) { + if( leftToRight ) + buf.append( getMacOSModifiersExText( modifiers, leftToRight ) ); + } else + buf.append( InputEvent.getModifiersExText( modifiers ) ).append( acceleratorDelimiter ); + } + + // key int keyCode = accelerator.getKeyCode(); if( keyCode != 0 ) buf.append( KeyEvent.getKeyText( keyCode ) ); else buf.append( accelerator.getKeyChar() ); + // modifiers if right-to-left on macOS + if( modifiers != 0 && !leftToRight && SystemInfo.isMacOS ) + buf.append( getMacOSModifiersExText( modifiers, leftToRight ) ); + return buf.toString(); } + protected String getMacOSModifiersExText( int modifiers, boolean leftToRight ) { + StringBuilder buf = new StringBuilder(); + + if( (modifiers & InputEvent.CTRL_DOWN_MASK) != 0 ) + buf.append( controlGlyph ); + if( (modifiers & (InputEvent.ALT_DOWN_MASK | InputEvent.ALT_GRAPH_DOWN_MASK)) != 0 ) + buf.append( optionGlyph ); + if( (modifiers & InputEvent.SHIFT_DOWN_MASK) != 0 ) + buf.append( shiftGlyph ); + if( (modifiers & InputEvent.META_DOWN_MASK) != 0 ) + buf.append( commandGlyph ); + + // reverse order for right-to-left + if( !leftToRight ) + buf.reverse(); + + return buf.toString(); + } + + private static final char + controlGlyph = 0x2303, + optionGlyph = 0x2325, + shiftGlyph = 0x21E7, + commandGlyph = 0x2318; + //---- class MinSizeIcon -------------------------------------------------- private class MinSizeIcon