Theme Editor: preview improvements:

- remember state of "enabled", "focused" and "buttonType" and sync it with all editors
- added "_" button near "JMenuBar" label to test menu underline selection
This commit is contained in:
Karl Tauber
2021-09-07 14:31:09 +02:00
parent 6018f83a22
commit 0d44ade6ea
5 changed files with 139 additions and 23 deletions

View File

@@ -826,14 +826,14 @@ class FlatThemeFileEditor
state.put( KEY_WINDOW_BOUNDS, x + "," + y + ',' + width + ',' + height ); state.put( KEY_WINDOW_BOUNDS, x + "," + y + ',' + width + ',' + height );
} }
private static void putPrefsBoolean( Preferences prefs, String key, boolean value, boolean defaultValue ) { static void putPrefsBoolean( Preferences prefs, String key, boolean value, boolean defaultValue ) {
if( value != defaultValue ) if( value != defaultValue )
prefs.putBoolean( key, value ); prefs.putBoolean( key, value );
else else
prefs.remove( key ); prefs.remove( key );
} }
private static void putPrefsString( Preferences prefs, String key, String value ) { static void putPrefsString( Preferences prefs, String key, String value ) {
if( !StringUtils.isEmpty( value ) ) if( !StringUtils.isEmpty( value ) )
prefs.put( key, value ); prefs.put( key, value );
else else

View File

@@ -41,7 +41,11 @@ class FlatThemePreview
private final FlatSyntaxTextArea textArea; private final FlatSyntaxTextArea textArea;
private final Timer timer; private final Timer timer;
private final Preferences state; final Preferences state;
private final FlatThemePreviewAll allTab;
private final FlatThemePreviewButtons buttonsTab;
private final FlatThemePreviewSwitches switchesTab;
private final Map<LazyValue, Object> lazyValueCache = new WeakHashMap<>(); private final Map<LazyValue, Object> lazyValueCache = new WeakHashMap<>();
private int runWithUIDefaultsGetterLevel; private int runWithUIDefaultsGetterLevel;
@@ -53,9 +57,12 @@ class FlatThemePreview
initComponents(); initComponents();
// add tabs // add tabs
tabbedPane.addTab( "All", createPreviewTab( new FlatThemePreviewAll( this ) ) ); allTab = new FlatThemePreviewAll( this );
tabbedPane.addTab( "Buttons", createPreviewTab( new FlatThemePreviewButtons() ) ); buttonsTab = new FlatThemePreviewButtons( this );
tabbedPane.addTab( "Switches", createPreviewTab( new FlatThemePreviewSwitches() ) ); switchesTab = new FlatThemePreviewSwitches();
tabbedPane.addTab( "All", createPreviewTab( allTab ) );
tabbedPane.addTab( "Buttons", createPreviewTab( buttonsTab ) );
tabbedPane.addTab( "Switches", createPreviewTab( switchesTab ) );
selectRecentTab(); selectRecentTab();
tabbedPane.addChangeListener( e -> selectedTabChanged() ); tabbedPane.addChangeListener( e -> selectedTabChanged() );
@@ -85,8 +92,14 @@ class FlatThemePreview
private void selectRecentTab() { private void selectRecentTab() {
int selectedTab = state.getInt( KEY_SELECTED_TAB, -1 ); int selectedTab = state.getInt( KEY_SELECTED_TAB, -1 );
if( selectedTab >= 0 && selectedTab < tabbedPane.getTabCount() ) if( selectedTab >= 0 && selectedTab < tabbedPane.getTabCount() ) {
tabbedPane.setSelectedIndex( selectedTab ); tabbedPane.setSelectedIndex( selectedTab );
switch( selectedTab ) {
case 0: allTab.activated(); break;
case 1: buttonsTab.activated(); break;
}
}
} }
private void selectedTabChanged() { private void selectedTabChanged() {

View File

@@ -39,6 +39,10 @@ import net.miginfocom.swing.*;
class FlatThemePreviewAll class FlatThemePreviewAll
extends JPanel extends JPanel
{ {
private static final String KEY_ENABLED = "preview.enabled";
private static final String KEY_FOCUSED = "preview.focused";
private static final String KEY_MENU_UNDERLINE_SELECTION = "preview.menuUnderlineSelection";
private final FlatThemePreview preview; private final FlatThemePreview preview;
FlatThemePreviewAll( FlatThemePreview preview ) { FlatThemePreviewAll( FlatThemePreview preview ) {
@@ -78,6 +82,27 @@ class FlatThemePreviewAll
} ); } );
} }
void activated() {
boolean enabled = preview.state.getBoolean( KEY_ENABLED, true );
boolean focused = preview.state.getBoolean( KEY_FOCUSED, false );
boolean menuUnderlineSelection = preview.state.getBoolean( KEY_MENU_UNDERLINE_SELECTION, false );
if( enabled != enabledCheckBox.isSelected() ) {
enabledCheckBox.setSelected( enabled );
enabledChanged();
}
if( focused != focusedCheckBox.isSelected() ) {
focusedCheckBox.setSelected( focused );
focusedChanged();
}
if( menuUnderlineSelection != menuUnderlineSelectionButton.isSelected() ) {
menuUnderlineSelectionButton.setSelected( menuUnderlineSelection );
menuUnderlineSelectionChanged();
}
}
private void enabledChanged() { private void enabledChanged() {
boolean enabled = enabledCheckBox.isSelected(); boolean enabled = enabledCheckBox.isSelected();
@@ -89,10 +114,12 @@ class FlatThemePreviewAll
preview.runWithUIDefaultsGetter( () -> { preview.runWithUIDefaultsGetter( () -> {
enableDisable( this, enabled ); enableDisable( this, enabled );
} ); } );
FlatThemeFileEditor.putPrefsBoolean( preview.state, KEY_ENABLED, enabled, true );
} }
private void enableDisable( Component comp, boolean enabled ) { private void enableDisable( Component comp, boolean enabled ) {
if( comp != enabledCheckBox && comp != focusedCheckBox && comp != menu2 ) if( !isControlComponent( comp ) )
comp.setEnabled( enabled ); comp.setEnabled( enabled );
if( !(comp instanceof Container) || comp instanceof JInternalFrame ) if( !(comp instanceof Container) || comp instanceof JInternalFrame )
@@ -120,15 +147,19 @@ class FlatThemePreviewAll
} }
private void focusedChanged() { private void focusedChanged() {
Predicate<JComponent> value = focusedCheckBox.isSelected() && enabledCheckBox.isSelected() boolean focused = focusedCheckBox.isSelected();
Predicate<JComponent> value = focused && enabledCheckBox.isSelected()
? value = c -> true ? value = c -> true
: null; : null;
focusComponent( this, value ); focusComponent( this, value );
repaint(); repaint();
FlatThemeFileEditor.putPrefsBoolean( preview.state, KEY_FOCUSED, focused,false );
} }
private void focusComponent( Component comp, Object value ) { private void focusComponent( Component comp, Object value ) {
if( comp != enabledCheckBox && comp != focusedCheckBox && comp != menu2 && comp instanceof JComponent ) if( !isControlComponent( comp ) && comp instanceof JComponent )
((JComponent)comp).putClientProperty( FlatClientProperties.COMPONENT_FOCUS_OWNER, value ); ((JComponent)comp).putClientProperty( FlatClientProperties.COMPONENT_FOCUS_OWNER, value );
if( !(comp instanceof Container) || comp instanceof JInternalFrame ) if( !(comp instanceof Container) || comp instanceof JInternalFrame )
@@ -142,6 +173,20 @@ class FlatThemePreviewAll
} }
} }
private boolean isControlComponent( Component c ) {
return c == enabledCheckBox ||
c == focusedCheckBox ||
c == menuUnderlineSelectionButton ||
c == menu2;
}
private void menuUnderlineSelectionChanged() {
boolean menuUnderlineSelection = menuUnderlineSelectionButton.isSelected();
UIManager.put( "MenuItem.selectionType", menuUnderlineSelection ? "underline" : null );
FlatThemeFileEditor.putPrefsBoolean( preview.state, KEY_MENU_UNDERLINE_SELECTION, menuUnderlineSelection, false );
}
private void changeProgress() { private void changeProgress() {
int value = slider3.getValue(); int value = slider3.getValue();
progressBar1.setValue( value ); progressBar1.setValue( value );
@@ -204,6 +249,7 @@ class FlatThemePreviewAll
JScrollPane scrollPane9 = new JScrollPane(); JScrollPane scrollPane9 = new JScrollPane();
JTextPane textPane1 = new JTextPane(); JTextPane textPane1 = new JTextPane();
JLabel menuBarLabel = new JLabel(); JLabel menuBarLabel = new JLabel();
menuUnderlineSelectionButton = new FlatToggleButton();
JMenuBar menuBar1 = new JMenuBar(); JMenuBar menuBar1 = new JMenuBar();
menu2 = new JMenu(); menu2 = new JMenu();
JMenuItem menuItem3 = new JMenuItem(); JMenuItem menuItem3 = new JMenuItem();
@@ -482,6 +528,15 @@ class FlatThemePreviewAll
menuBarLabel.setText("JMenuBar:"); menuBarLabel.setText("JMenuBar:");
add(menuBarLabel, "cell 0 12"); add(menuBarLabel, "cell 0 12");
//---- menuUnderlineSelectionButton ----
menuUnderlineSelectionButton.setText("_");
menuUnderlineSelectionButton.setButtonType(FlatButton.ButtonType.toolBarButton);
menuUnderlineSelectionButton.setToolTipText("menu underline selection");
menuUnderlineSelectionButton.setFocusable(false);
menuUnderlineSelectionButton.setFont(menuUnderlineSelectionButton.getFont().deriveFont(menuUnderlineSelectionButton.getFont().getSize() - 2f));
menuUnderlineSelectionButton.addActionListener(e -> menuUnderlineSelectionChanged());
add(menuUnderlineSelectionButton, "cell 0 12");
//======== menuBar1 ======== //======== menuBar1 ========
{ {
@@ -769,6 +824,7 @@ class FlatThemePreviewAll
private JCheckBox enabledCheckBox; private JCheckBox enabledCheckBox;
private JCheckBox focusedCheckBox; private JCheckBox focusedCheckBox;
private FlatTextField textField1; private FlatTextField textField1;
private FlatToggleButton menuUnderlineSelectionButton;
private JMenu menu2; private JMenu menu2;
private JSlider slider1; private JSlider slider1;
private JSlider slider3; private JSlider slider3;

View File

@@ -296,6 +296,20 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 12" "value": "cell 0 12"
} ) } )
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatToggleButton" ) {
name: "menuUnderlineSelectionButton"
"text": "_"
"buttonType": enum com.formdev.flatlaf.extras.components.FlatButton$ButtonType toolBarButton
"toolTipText": "menu underline selection"
"focusable": false
"font": new com.jformdesigner.model.SwingDerivedFont( null, 0, -2, false )
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuUnderlineSelectionChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 12"
} )
add( new FormContainer( "javax.swing.JMenuBar", new FormLayoutManager( class javax.swing.JMenuBar ) ) { add( new FormContainer( "javax.swing.JMenuBar", new FormLayoutManager( class javax.swing.JMenuBar ) ) {
name: "menuBar1" name: "menuBar1"
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) { add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {

View File

@@ -16,11 +16,11 @@
package com.formdev.flatlaf.themeeditor; package com.formdev.flatlaf.themeeditor;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Component; import java.awt.Component;
import java.util.Objects; import java.util.Objects;
import java.util.function.Predicate; import java.util.function.Predicate;
import javax.swing.*; import javax.swing.*;
import com.formdev.flatlaf.FlatClientProperties;
import net.miginfocom.swing.*; import net.miginfocom.swing.*;
/** /**
@@ -29,31 +29,64 @@ import net.miginfocom.swing.*;
class FlatThemePreviewButtons class FlatThemePreviewButtons
extends JPanel extends JPanel
{ {
FlatThemePreviewButtons() { private static final String KEY_BUTTON_TYPE = "preview.buttonType";
private final FlatThemePreview preview;
FlatThemePreviewButtons( FlatThemePreview preview ) {
this.preview = preview;
initComponents(); initComponents();
} }
private void buttonTypeChanged() { void activated() {
Object buttonType = null; String buttonType = preview.state.get( KEY_BUTTON_TYPE, null );
if( !Objects.equals( buttonType, getButtonType() ) ) {
setButtonType( buttonType );
buttonTypeChanged();
}
}
private String getButtonType() {
String buttonType = null;
if( squareButton.isSelected() ) if( squareButton.isSelected() )
buttonType = FlatClientProperties.BUTTON_TYPE_SQUARE; buttonType = BUTTON_TYPE_SQUARE;
else if( roundRectButton.isSelected() ) else if( roundRectButton.isSelected() )
buttonType = FlatClientProperties.BUTTON_TYPE_ROUND_RECT; buttonType = BUTTON_TYPE_ROUND_RECT;
else if( tabButton.isSelected() ) else if( tabButton.isSelected() )
buttonType = FlatClientProperties.BUTTON_TYPE_TAB; buttonType = BUTTON_TYPE_TAB;
else if( toolBarButtonButton.isSelected() ) else if( toolBarButtonButton.isSelected() )
buttonType = FlatClientProperties.BUTTON_TYPE_TOOLBAR_BUTTON; buttonType = BUTTON_TYPE_TOOLBAR_BUTTON;
else if( borderlessButton.isSelected() ) else if( borderlessButton.isSelected() )
buttonType = FlatClientProperties.BUTTON_TYPE_BORDERLESS; buttonType = BUTTON_TYPE_BORDERLESS;
return buttonType;
}
private void setButtonType( String buttonType ) {
switch( String.valueOf( buttonType ) ) {
case BUTTON_TYPE_SQUARE: squareButton.setSelected( true ); break;
case BUTTON_TYPE_ROUND_RECT: roundRectButton.setSelected( true ); break;
case BUTTON_TYPE_TAB: tabButton.setSelected( true ); break;
case BUTTON_TYPE_TOOLBAR_BUTTON: toolBarButtonButton.setSelected( true ); break;
case BUTTON_TYPE_BORDERLESS: borderlessButton.setSelected( true ); break;
default: noneButton.setSelected( true ); break;
}
}
private void buttonTypeChanged() {
String buttonType = getButtonType();
for( Component c : getComponents() ) { for( Component c : getComponents() ) {
if( !(c instanceof AbstractButton) ) if( !(c instanceof AbstractButton) )
continue; continue;
AbstractButton b = (AbstractButton) c; AbstractButton b = (AbstractButton) c;
if( !Objects.equals( b.getClientProperty( FlatClientProperties.BUTTON_TYPE ), FlatClientProperties.BUTTON_TYPE_HELP ) ) if( !Objects.equals( b.getClientProperty( BUTTON_TYPE ), BUTTON_TYPE_HELP ) )
b.putClientProperty( FlatClientProperties.BUTTON_TYPE, buttonType ); b.putClientProperty( BUTTON_TYPE, buttonType );
} }
FlatThemeFileEditor.putPrefsString( preview.state, KEY_BUTTON_TYPE, buttonType );
} }
private void initComponents() { private void initComponents() {
@@ -664,7 +697,7 @@ class FlatThemePreviewButtons
} }
} ); } );
putClientProperty( FlatClientProperties.COMPONENT_FOCUS_OWNER, putClientProperty( COMPONENT_FOCUS_OWNER,
(Predicate<JComponent>) c -> { (Predicate<JComponent>) c -> {
return ((TestStateButton)c).isStateFocused(); return ((TestStateButton)c).isStateFocused();
} ); } );
@@ -734,7 +767,7 @@ class FlatThemePreviewButtons
} }
} ); } );
putClientProperty( FlatClientProperties.COMPONENT_FOCUS_OWNER, putClientProperty( COMPONENT_FOCUS_OWNER,
(Predicate<JComponent>) c -> { (Predicate<JComponent>) c -> {
return ((TestStateToggleButton)c).isStateFocused(); return ((TestStateToggleButton)c).isStateFocused();
} ); } );