mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2026-02-12 15:07:11 -06:00
Tree on macOS: fixed Left and Right keys to collapse or expand nodes
This commit is contained in:
@@ -8,6 +8,8 @@ FlatLaf Change Log
|
|||||||
- TabbedPane: In scroll-tab-layout, the cropped line is now hidden. (issue #40)
|
- TabbedPane: In scroll-tab-layout, the cropped line is now hidden. (issue #40)
|
||||||
- Tree: UI default value `Tree.textBackground` now has a valid color and is no
|
- Tree: UI default value `Tree.textBackground` now has a valid color and is no
|
||||||
longer `null`.
|
longer `null`.
|
||||||
|
- Tree on macOS: Fixed <kbd>Left</kbd> and <kbd>Right</kbd> keys to collapse or
|
||||||
|
expand nodes.
|
||||||
- Button and ToggleButton: Support per component minimum height (set client
|
- Button and ToggleButton: Support per component minimum height (set client
|
||||||
property `JComponent.minimumHeight` to an integer). (issue #44)
|
property `JComponent.minimumHeight` to an integer). (issue #44)
|
||||||
- Button and ToggleButton: Do not apply minimum width if button border was
|
- Button and ToggleButton: Do not apply minimum width if button border was
|
||||||
|
|||||||
@@ -34,12 +34,15 @@ import java.util.function.Consumer;
|
|||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import javax.swing.AbstractButton;
|
import javax.swing.AbstractButton;
|
||||||
|
import javax.swing.InputMap;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JTabbedPane;
|
import javax.swing.JTabbedPane;
|
||||||
|
import javax.swing.KeyStroke;
|
||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.PopupFactory;
|
import javax.swing.PopupFactory;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.UIDefaults;
|
import javax.swing.UIDefaults;
|
||||||
|
import javax.swing.UIDefaults.LazyValue;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.UnsupportedLookAndFeelException;
|
import javax.swing.UnsupportedLookAndFeelException;
|
||||||
import javax.swing.plaf.ColorUIResource;
|
import javax.swing.plaf.ColorUIResource;
|
||||||
@@ -231,6 +234,7 @@ public abstract class FlatLaf
|
|||||||
|
|
||||||
initFonts( defaults );
|
initFonts( defaults );
|
||||||
initIconColors( defaults, isDark() );
|
initIconColors( defaults, isDark() );
|
||||||
|
initInputMaps( defaults );
|
||||||
|
|
||||||
// load defaults from properties
|
// load defaults from properties
|
||||||
List<Class<?>> lafClassesForDefaultsLoading = getLafClassesForDefaultsLoading();
|
List<Class<?>> lafClassesForDefaultsLoading = getLafClassesForDefaultsLoading();
|
||||||
@@ -337,6 +341,40 @@ public abstract class FlatLaf
|
|||||||
defaults.put( "Objects.BlackText", new ColorUIResource( 0x231F20 ) );
|
defaults.put( "Objects.BlackText", new ColorUIResource( 0x231F20 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void initInputMaps( UIDefaults defaults ) {
|
||||||
|
if( SystemInfo.IS_MAC ) {
|
||||||
|
// AquaLookAndFeel (the base for UI defaults on macOS) uses special
|
||||||
|
// action keys (e.g. "aquaExpandNode") for its macOS typical tree node
|
||||||
|
// expanding/collapsing, which are not available in FlatLaf.
|
||||||
|
// --> map the keys back to default Java actions
|
||||||
|
modifyInputMap( defaults, "Tree.focusInputMap",
|
||||||
|
"RIGHT", "selectChild",
|
||||||
|
"KP_RIGHT", "selectChild",
|
||||||
|
"LEFT", "selectParent",
|
||||||
|
"KP_LEFT", "selectParent",
|
||||||
|
"shift RIGHT", null,
|
||||||
|
"shift KP_RIGHT", null,
|
||||||
|
"shift LEFT", null,
|
||||||
|
"shift KP_LEFT", null,
|
||||||
|
"ctrl LEFT", null,
|
||||||
|
"ctrl KP_LEFT", null,
|
||||||
|
"ctrl RIGHT", null,
|
||||||
|
"ctrl KP_RIGHT", null
|
||||||
|
);
|
||||||
|
defaults.put( "Tree.focusInputMap.RightToLeft", new UIDefaults.LazyInputMap( new Object[] {
|
||||||
|
"RIGHT", "selectParent",
|
||||||
|
"KP_RIGHT", "selectParent",
|
||||||
|
"LEFT", "selectChild",
|
||||||
|
"KP_LEFT", "selectChild"
|
||||||
|
} ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void modifyInputMap( UIDefaults defaults, String key, Object... bindings ) {
|
||||||
|
// Note: not using `defaults.get(key)` here because this would resolve the lazy value
|
||||||
|
defaults.put( key, new LazyModifyInputMap( defaults.remove( key ), bindings ) );
|
||||||
|
}
|
||||||
|
|
||||||
private static void reSetLookAndFeel() {
|
private static void reSetLookAndFeel() {
|
||||||
EventQueue.invokeLater( () -> {
|
EventQueue.invokeLater( () -> {
|
||||||
LookAndFeel lookAndFeel = UIManager.getLookAndFeel();
|
LookAndFeel lookAndFeel = UIManager.getLookAndFeel();
|
||||||
@@ -445,4 +483,38 @@ public abstract class FlatLaf
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---- class LazyModifyInputMap -------------------------------------------
|
||||||
|
|
||||||
|
private static class LazyModifyInputMap
|
||||||
|
implements LazyValue
|
||||||
|
{
|
||||||
|
private final Object baseInputMap;
|
||||||
|
private final Object[] bindings;
|
||||||
|
|
||||||
|
public LazyModifyInputMap( Object baseInputMap, Object[] bindings ) {
|
||||||
|
this.baseInputMap = baseInputMap;
|
||||||
|
this.bindings = bindings;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object createValue( UIDefaults table ) {
|
||||||
|
// get base input map
|
||||||
|
InputMap inputMap = (baseInputMap instanceof LazyValue)
|
||||||
|
? (InputMap) ((LazyValue)baseInputMap).createValue( table )
|
||||||
|
: (InputMap) baseInputMap;
|
||||||
|
|
||||||
|
// modify input map (replace or remove)
|
||||||
|
for( int i = 0; i < bindings.length; i += 2 ) {
|
||||||
|
KeyStroke keyStroke = KeyStroke.getKeyStroke( (String) bindings[i] );
|
||||||
|
if( bindings[i + 1] != null )
|
||||||
|
inputMap.put( keyStroke, bindings[i + 1] );
|
||||||
|
else
|
||||||
|
inputMap.remove( keyStroke );
|
||||||
|
}
|
||||||
|
|
||||||
|
return inputMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user