diff --git a/flatlaf-demo/build.gradle.kts b/flatlaf-demo/build.gradle.kts
index 95fad062..a4e9d33e 100644
--- a/flatlaf-demo/build.gradle.kts
+++ b/flatlaf-demo/build.gradle.kts
@@ -28,6 +28,7 @@ dependencies {
implementation( project( ":flatlaf-core" ) )
implementation( "com.miglayout:miglayout-swing:5.2" )
implementation( "com.jgoodies:jgoodies-forms:1.9.0" )
+ implementation( "guru.nidi.com.kitfox:svgSalamander:1.1.2" )
}
java {
diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java
index dff0a182..25f2b9c5 100644
--- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java
+++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java
@@ -17,6 +17,7 @@
package com.formdev.flatlaf.demo;
import java.awt.*;
+import java.awt.event.*;
import javax.swing.*;
import net.miginfocom.swing.*;
@@ -36,12 +37,48 @@ class DemoFrame
tabbedPane.setSelectedIndex( tabIndex );
}
+ private void exitActionPerformed() {
+ dispose();
+ }
+
+ private void aboutActionPerformed() {
+ JOptionPane.showMessageDialog( this, "FlatLaf Demo", "About", JOptionPane.PLAIN_MESSAGE );
+ }
+
private void selectedTabChanged() {
FlatLafDemo.prefs.putInt( FlatLafDemo.KEY_TAB, tabbedPane.getSelectedIndex() );
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
+ JMenuBar menuBar1 = new JMenuBar();
+ JMenu fileMenu = new JMenu();
+ JMenuItem newMenuItem = new JMenuItem();
+ JMenuItem openMenuItem = new JMenuItem();
+ JMenuItem closeMenuItem = new JMenuItem();
+ JMenuItem exitMenuItem = new JMenuItem();
+ JMenu editMenu = new JMenu();
+ JMenuItem undoMenuItem = new JMenuItem();
+ JMenuItem redoMenuItem = new JMenuItem();
+ JMenuItem cutMenuItem = new JMenuItem();
+ JMenuItem copyMenuItem = new JMenuItem();
+ JMenuItem pasteMenuItem = new JMenuItem();
+ JMenuItem deleteMenuItem = new JMenuItem();
+ JMenu viewMenu = new JMenu();
+ JCheckBoxMenuItem checkBoxMenuItem1 = new JCheckBoxMenuItem();
+ JRadioButtonMenuItem radioButtonMenuItem1 = new JRadioButtonMenuItem();
+ JRadioButtonMenuItem radioButtonMenuItem2 = new JRadioButtonMenuItem();
+ JRadioButtonMenuItem radioButtonMenuItem3 = new JRadioButtonMenuItem();
+ JMenu helpMenu = new JMenu();
+ JMenuItem aboutMenuItem = new JMenuItem();
+ JToolBar toolBar1 = new JToolBar();
+ JButton backButton = new JButton();
+ JButton forwardButton = new JButton();
+ JButton cutButton = new JButton();
+ JButton copyButton = new JButton();
+ JButton pasteButton = new JButton();
+ JButton refreshButton = new JButton();
+ JToggleButton showToggleButton = new JToggleButton();
JPanel contentPanel = new JPanel();
tabbedPane = new JTabbedPane();
BasicComponentsPanel basicComponentsPanel = new BasicComponentsPanel();
@@ -57,6 +94,132 @@ class DemoFrame
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
+ //======== menuBar1 ========
+ {
+
+ //======== fileMenu ========
+ {
+ fileMenu.setText("File");
+
+ //---- newMenuItem ----
+ newMenuItem.setText("New");
+ newMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
+ fileMenu.add(newMenuItem);
+
+ //---- openMenuItem ----
+ openMenuItem.setText("Open");
+ openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
+ fileMenu.add(openMenuItem);
+ fileMenu.addSeparator();
+
+ //---- closeMenuItem ----
+ closeMenuItem.setText("Close");
+ closeMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
+ fileMenu.add(closeMenuItem);
+ fileMenu.addSeparator();
+
+ //---- exitMenuItem ----
+ exitMenuItem.setText("Exit");
+ exitMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
+ exitMenuItem.addActionListener(e -> exitActionPerformed());
+ fileMenu.add(exitMenuItem);
+ }
+ menuBar1.add(fileMenu);
+
+ //======== editMenu ========
+ {
+ editMenu.setText("Edit");
+
+ //---- undoMenuItem ----
+ undoMenuItem.setText("Undo");
+ undoMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
+ editMenu.add(undoMenuItem);
+
+ //---- redoMenuItem ----
+ redoMenuItem.setText("Redo");
+ redoMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
+ editMenu.add(redoMenuItem);
+ editMenu.addSeparator();
+
+ //---- cutMenuItem ----
+ cutMenuItem.setText("Cut");
+ cutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
+ editMenu.add(cutMenuItem);
+
+ //---- copyMenuItem ----
+ copyMenuItem.setText("Copy");
+ copyMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
+ editMenu.add(copyMenuItem);
+
+ //---- pasteMenuItem ----
+ pasteMenuItem.setText("Paste");
+ pasteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
+ editMenu.add(pasteMenuItem);
+ editMenu.addSeparator();
+
+ //---- deleteMenuItem ----
+ deleteMenuItem.setText("Delete");
+ deleteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
+ editMenu.add(deleteMenuItem);
+ }
+ menuBar1.add(editMenu);
+
+ //======== viewMenu ========
+ {
+ viewMenu.setText("View");
+
+ //---- checkBoxMenuItem1 ----
+ checkBoxMenuItem1.setText("Show Toolbar");
+ checkBoxMenuItem1.setSelected(true);
+ viewMenu.add(checkBoxMenuItem1);
+ viewMenu.addSeparator();
+
+ //---- radioButtonMenuItem1 ----
+ radioButtonMenuItem1.setText("Details");
+ radioButtonMenuItem1.setSelected(true);
+ viewMenu.add(radioButtonMenuItem1);
+
+ //---- radioButtonMenuItem2 ----
+ radioButtonMenuItem2.setText("Small Icons");
+ viewMenu.add(radioButtonMenuItem2);
+
+ //---- radioButtonMenuItem3 ----
+ radioButtonMenuItem3.setText("Large Icons");
+ viewMenu.add(radioButtonMenuItem3);
+ }
+ menuBar1.add(viewMenu);
+
+ //======== helpMenu ========
+ {
+ helpMenu.setText("Help");
+
+ //---- aboutMenuItem ----
+ aboutMenuItem.setText("About");
+ aboutMenuItem.addActionListener(e -> aboutActionPerformed());
+ helpMenu.add(aboutMenuItem);
+ }
+ menuBar1.add(helpMenu);
+ }
+ setJMenuBar(menuBar1);
+
+ //======== toolBar1 ========
+ {
+ toolBar1.add(backButton);
+ toolBar1.add(forwardButton);
+ toolBar1.addSeparator();
+ toolBar1.add(cutButton);
+ toolBar1.add(copyButton);
+ toolBar1.add(pasteButton);
+ toolBar1.addSeparator();
+ toolBar1.add(refreshButton);
+ toolBar1.addSeparator();
+
+ //---- showToggleButton ----
+ showToggleButton.setSelected(true);
+ toolBar1.add(showToggleButton);
+ }
+ contentPane.add(toolBar1, BorderLayout.NORTH);
+
//======== contentPanel ========
{
contentPanel.setLayout(new MigLayout(
@@ -80,7 +243,28 @@ class DemoFrame
contentPanel.add(controlBar, "cell 0 1");
}
contentPane.add(contentPanel, BorderLayout.CENTER);
+
+ //---- buttonGroup1 ----
+ ButtonGroup buttonGroup1 = new ButtonGroup();
+ buttonGroup1.add(radioButtonMenuItem1);
+ buttonGroup1.add(radioButtonMenuItem2);
+ buttonGroup1.add(radioButtonMenuItem3);
// JFormDesigner - End of component initialization //GEN-END:initComponents
+
+ undoMenuItem.setIcon( new ScaledSVGIcon( "icons/undo.svg" ) );
+ redoMenuItem.setIcon( new ScaledSVGIcon( "icons/redo.svg" ) );
+
+ cutMenuItem.setIcon( new ScaledSVGIcon( "icons/menu-cut.svg" ) );
+ copyMenuItem.setIcon( new ScaledSVGIcon( "icons/copy.svg" ) );
+ pasteMenuItem.setIcon( new ScaledSVGIcon( "icons/menu-paste.svg" ) );
+
+ backButton.setIcon( new ScaledSVGIcon( "icons/back.svg" ) );
+ forwardButton.setIcon( new ScaledSVGIcon( "icons/forward.svg" ) );
+ cutButton.setIcon( new ScaledSVGIcon( "icons/menu-cut.svg" ) );
+ copyButton.setIcon( new ScaledSVGIcon( "icons/copy.svg" ) );
+ pasteButton.setIcon( new ScaledSVGIcon( "icons/menu-paste.svg" ) );
+ refreshButton.setIcon( new ScaledSVGIcon( "icons/refresh.svg" ) );
+ showToggleButton.setIcon( new ScaledSVGIcon( "icons/show.svg" ) );
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.jfd b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.jfd
index 698ff58f..a13b97ed 100644
--- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.jfd
+++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.jfd
@@ -12,6 +12,42 @@ new FormModel {
"defaultCloseOperation": 2
"$locationPolicy": 2
"$sizePolicy": 2
+ add( new FormContainer( "javax.swing.JToolBar", new FormLayoutManager( class javax.swing.JToolBar ) ) {
+ name: "toolBar1"
+ add( new FormComponent( "javax.swing.JButton" ) {
+ name: "backButton"
+ } )
+ add( new FormComponent( "javax.swing.JButton" ) {
+ name: "forwardButton"
+ } )
+ add( new FormComponent( "javax.swing.JToolBar$Separator" ) {
+ name: "separator5"
+ } )
+ add( new FormComponent( "javax.swing.JButton" ) {
+ name: "cutButton"
+ } )
+ add( new FormComponent( "javax.swing.JButton" ) {
+ name: "copyButton"
+ } )
+ add( new FormComponent( "javax.swing.JButton" ) {
+ name: "pasteButton"
+ } )
+ add( new FormComponent( "javax.swing.JToolBar$Separator" ) {
+ name: "separator6"
+ } )
+ add( new FormComponent( "javax.swing.JButton" ) {
+ name: "refreshButton"
+ } )
+ add( new FormComponent( "javax.swing.JToolBar$Separator" ) {
+ name: "separator7"
+ } )
+ add( new FormComponent( "javax.swing.JToggleButton" ) {
+ name: "showToggleButton"
+ "selected": true
+ } )
+ }, new FormLayoutConstraints( class java.lang.String ) {
+ "value": "North"
+ } )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "insets dialog,hidemode 3"
"$columnConstraints": "[grow,fill]"
@@ -63,9 +99,125 @@ new FormModel {
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "Center"
} )
+ menuBar: new FormContainer( "javax.swing.JMenuBar", new FormLayoutManager( class javax.swing.JMenuBar ) ) {
+ name: "menuBar1"
+ add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
+ name: "fileMenu"
+ "text": "File"
+ add( new FormComponent( "javax.swing.JMenuItem" ) {
+ name: "newMenuItem"
+ "text": "New"
+ "accelerator": static javax.swing.KeyStroke getKeyStroke( 78, 4226, false )
+ } )
+ add( new FormComponent( "javax.swing.JMenuItem" ) {
+ name: "openMenuItem"
+ "text": "Open"
+ "accelerator": static javax.swing.KeyStroke getKeyStroke( 79, 4226, false )
+ } )
+ add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
+ name: "separator2"
+ } )
+ add( new FormComponent( "javax.swing.JMenuItem" ) {
+ name: "closeMenuItem"
+ "text": "Close"
+ "accelerator": static javax.swing.KeyStroke getKeyStroke( 87, 4226, false )
+ } )
+ add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
+ name: "separator1"
+ } )
+ add( new FormComponent( "javax.swing.JMenuItem" ) {
+ name: "exitMenuItem"
+ "text": "Exit"
+ "accelerator": static javax.swing.KeyStroke getKeyStroke( 81, 4226, false )
+ addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "exitActionPerformed", false ) )
+ } )
+ } )
+ add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
+ name: "editMenu"
+ "text": "Edit"
+ add( new FormComponent( "javax.swing.JMenuItem" ) {
+ name: "undoMenuItem"
+ "text": "Undo"
+ "accelerator": static javax.swing.KeyStroke getKeyStroke( 90, 4226, false )
+ } )
+ add( new FormComponent( "javax.swing.JMenuItem" ) {
+ name: "redoMenuItem"
+ "text": "Redo"
+ "accelerator": static javax.swing.KeyStroke getKeyStroke( 89, 4226, false )
+ } )
+ add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
+ name: "separator4"
+ } )
+ add( new FormComponent( "javax.swing.JMenuItem" ) {
+ name: "cutMenuItem"
+ "text": "Cut"
+ "accelerator": static javax.swing.KeyStroke getKeyStroke( 88, 4226, false )
+ } )
+ add( new FormComponent( "javax.swing.JMenuItem" ) {
+ name: "copyMenuItem"
+ "text": "Copy"
+ "accelerator": static javax.swing.KeyStroke getKeyStroke( 67, 4226, false )
+ } )
+ add( new FormComponent( "javax.swing.JMenuItem" ) {
+ name: "pasteMenuItem"
+ "text": "Paste"
+ "accelerator": static javax.swing.KeyStroke getKeyStroke( 86, 4226, false )
+ } )
+ add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
+ name: "separator3"
+ } )
+ add( new FormComponent( "javax.swing.JMenuItem" ) {
+ name: "deleteMenuItem"
+ "text": "Delete"
+ "accelerator": static javax.swing.KeyStroke getKeyStroke( 127, 0, false )
+ } )
+ } )
+ add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
+ name: "viewMenu"
+ "text": "View"
+ add( new FormComponent( "javax.swing.JCheckBoxMenuItem" ) {
+ name: "checkBoxMenuItem1"
+ "text": "Show Toolbar"
+ "selected": true
+ } )
+ add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
+ name: "separator8"
+ } )
+ add( new FormComponent( "javax.swing.JRadioButtonMenuItem" ) {
+ name: "radioButtonMenuItem1"
+ "text": "Details"
+ "selected": true
+ "$buttonGroup": new FormReference( "buttonGroup1" )
+ } )
+ add( new FormComponent( "javax.swing.JRadioButtonMenuItem" ) {
+ name: "radioButtonMenuItem2"
+ "text": "Small Icons"
+ "$buttonGroup": new FormReference( "buttonGroup1" )
+ } )
+ add( new FormComponent( "javax.swing.JRadioButtonMenuItem" ) {
+ name: "radioButtonMenuItem3"
+ "text": "Large Icons"
+ "$buttonGroup": new FormReference( "buttonGroup1" )
+ } )
+ } )
+ add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
+ name: "helpMenu"
+ "text": "Help"
+ add( new FormComponent( "javax.swing.JMenuItem" ) {
+ name: "aboutMenuItem"
+ "text": "About"
+ addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "aboutActionPerformed", false ) )
+ } )
+ } )
+ }
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 0 )
"size": new java.awt.Dimension( 800, 710 )
} )
+ add( new FormNonVisual( "javax.swing.ButtonGroup" ) {
+ name: "buttonGroup1"
+ }, new FormLayoutConstraints( null ) {
+ "location": new java.awt.Point( 0, 720 )
+ } )
}
}
diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/ScaledSVGIcon.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/ScaledSVGIcon.java
new file mode 100644
index 00000000..aef13317
--- /dev/null
+++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/ScaledSVGIcon.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2019 FormDev Software GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.formdev.flatlaf.demo;
+
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.net.URISyntaxException;
+import javax.swing.ImageIcon;
+import com.formdev.flatlaf.ui.FlatUIUtils;
+import com.formdev.flatlaf.util.UIScale;
+import com.kitfox.svg.app.beans.SVGIcon;
+
+/**
+ * @author Karl Tauber
+ */
+public class ScaledSVGIcon
+ extends ImageIcon
+{
+ private final SVGIcon svgIcon;
+
+ public ScaledSVGIcon( String name ) {
+ svgIcon = new SVGIcon();
+ svgIcon.setAntiAlias( true );
+
+ try {
+ svgIcon.setSvgURI( getClass().getResource( name ).toURI() );
+ } catch( URISyntaxException ex ) {
+ ex.printStackTrace();
+ }
+ }
+
+ @Override
+ public int getIconWidth() {
+ return UIScale.scale( svgIcon.getIconWidth() );
+ }
+
+ @Override
+ public int getIconHeight() {
+ return UIScale.scale( svgIcon.getIconHeight() );
+ }
+
+ @Override
+ public void paintIcon( Component c, Graphics g, int x, int y ) {
+ Graphics2D g2 = (Graphics2D) g.create();
+ try {
+ FlatUIUtils.setRenderingHints( g2 );
+
+ g2.translate( x, y );
+ UIScale.scaleGraphics( g2 );
+
+ svgIcon.paintIcon( c, g2, 0, 0 );
+ } finally {
+ g2.dispose();
+ }
+ }
+
+ @Override
+ public Image getImage() {
+ BufferedImage image = new BufferedImage( getIconWidth(), getIconHeight(), BufferedImage.TYPE_INT_ARGB );
+ Graphics2D g = image.createGraphics();
+ try {
+ paintIcon( null, g, 0, 0 );
+ } finally {
+ g.dispose();
+ }
+ return image;
+ }
+}
diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/LICENSE.txt b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/LICENSE.txt
new file mode 100644
index 00000000..186cd751
--- /dev/null
+++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/LICENSE.txt
@@ -0,0 +1,3 @@
+The icons in this folder are from IntelliJ IDEA Community Edition,
+which is licensed under the Apache 2.0 license. Copyright 2000-2019 JetBrains s.r.o.
+See: https://github.com/JetBrains/intellij-community/
diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/back.svg b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/back.svg
new file mode 100644
index 00000000..c5b84d14
--- /dev/null
+++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/back.svg
@@ -0,0 +1,9 @@
+
diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/copy.svg b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/copy.svg
new file mode 100644
index 00000000..cfbf4d6d
--- /dev/null
+++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/copy.svg
@@ -0,0 +1,6 @@
+
diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/forward.svg b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/forward.svg
new file mode 100644
index 00000000..0ce7c70f
--- /dev/null
+++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/forward.svg
@@ -0,0 +1,9 @@
+
diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/menu-cut.svg b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/menu-cut.svg
new file mode 100644
index 00000000..de353764
--- /dev/null
+++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/menu-cut.svg
@@ -0,0 +1,3 @@
+
diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/menu-paste.svg b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/menu-paste.svg
new file mode 100644
index 00000000..1debae89
--- /dev/null
+++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/menu-paste.svg
@@ -0,0 +1,3 @@
+
diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/redo.svg b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/redo.svg
new file mode 100644
index 00000000..98f4a4cb
--- /dev/null
+++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/redo.svg
@@ -0,0 +1,3 @@
+
diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/refresh.svg b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/refresh.svg
new file mode 100644
index 00000000..74318a20
--- /dev/null
+++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/refresh.svg
@@ -0,0 +1,3 @@
+
diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/show.svg b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/show.svg
new file mode 100644
index 00000000..370c995f
--- /dev/null
+++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/show.svg
@@ -0,0 +1,3 @@
+
diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/undo.svg b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/undo.svg
new file mode 100644
index 00000000..81bea6ba
--- /dev/null
+++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/icons/undo.svg
@@ -0,0 +1,3 @@
+