You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ge...@apache.org on 2021/03/29 20:06:59 UTC

[netbeans] branch master updated: Update FlatLaf from 1.0 to 1.1.1 and added "FlatLaf" options panel under "Appearance" category

This is an automated email from the ASF dual-hosted git repository.

geertjan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new f9a147f  Update FlatLaf from 1.0 to 1.1.1 and added "FlatLaf" options panel under "Appearance" category
     new dfab059  Merge pull request #2839 from DevCharly/flatlaf-1.1-and-options
f9a147f is described below

commit f9a147f7e7058881fd9bf87cd1c6596c9f78e5b0
Author: Karl Tauber <ka...@jformdesigner.com>
AuthorDate: Mon Mar 29 19:09:14 2021 +0200

    Update FlatLaf from 1.0 to 1.1.1 and added "FlatLaf" options panel under "Appearance" category
---
 platform/libs.flatlaf/external/binaries-list       |   2 +-
 ...f-1.0-license.txt => flatlaf-1.1.1-license.txt} |   4 +-
 platform/libs.flatlaf/nbproject/project.properties |   2 +-
 platform/libs.flatlaf/nbproject/project.xml        |   4 +-
 .../o.n.swing.laf.flatlaf/nbproject/project.xml    |  17 ++
 .../netbeans/swing/laf/flatlaf/Bundle.properties   |  10 +
 .../netbeans/swing/laf/flatlaf/FlatLFCustoms.java  |   7 +
 .../swing/laf/flatlaf/FlatLafOptionsPanel.form     | 121 ++++++++++++
 .../swing/laf/flatlaf/FlatLafOptionsPanel.java     | 209 +++++++++++++++++++++
 .../laf/flatlaf/FlatLafOptionsPanelController.java | 141 ++++++++++++++
 .../netbeans/swing/laf/flatlaf/FlatLafPrefs.java   |  85 +++++++++
 11 files changed, 596 insertions(+), 6 deletions(-)

diff --git a/platform/libs.flatlaf/external/binaries-list b/platform/libs.flatlaf/external/binaries-list
index cb336c4..059194f 100644
--- a/platform/libs.flatlaf/external/binaries-list
+++ b/platform/libs.flatlaf/external/binaries-list
@@ -15,4 +15,4 @@
 # specific language governing permissions and limitations
 # under the License.
 
-A807C984F00B683C65503803720821F12E136E93 com.formdev:flatlaf:1.0
+21EF33DBED3B07C5A9E2BB67118BBDF0E930ACCC com.formdev:flatlaf:1.1.1
diff --git a/platform/libs.flatlaf/external/flatlaf-1.0-license.txt b/platform/libs.flatlaf/external/flatlaf-1.1.1-license.txt
similarity index 99%
rename from platform/libs.flatlaf/external/flatlaf-1.0-license.txt
rename to platform/libs.flatlaf/external/flatlaf-1.1.1-license.txt
index c2b9305..dd9f5f4 100644
--- a/platform/libs.flatlaf/external/flatlaf-1.0-license.txt
+++ b/platform/libs.flatlaf/external/flatlaf-1.1.1-license.txt
@@ -1,7 +1,7 @@
 Name: FlatLaf Look and Feel
 Description: FlatLaf Look and Feel
-Version: 1.0
-Files: flatlaf-1.0.jar
+Version: 1.1.1
+Files: flatlaf-1.1.1.jar
 License: Apache-2.0
 Origin: FormDev Software GmbH.
 URL: https://www.formdev.com/flatlaf/
diff --git a/platform/libs.flatlaf/nbproject/project.properties b/platform/libs.flatlaf/nbproject/project.properties
index f0135fe..9018fcb 100644
--- a/platform/libs.flatlaf/nbproject/project.properties
+++ b/platform/libs.flatlaf/nbproject/project.properties
@@ -20,4 +20,4 @@ javac.compilerargs=-Xlint:unchecked
 javac.source=1.8
 nbm.target.cluster=platform
 
-release.external/flatlaf-1.0.jar=modules/ext/flatlaf-1.0.jar
+release.external/flatlaf-1.1.1.jar=modules/ext/flatlaf-1.1.1.jar
diff --git a/platform/libs.flatlaf/nbproject/project.xml b/platform/libs.flatlaf/nbproject/project.xml
index 88ba2c3..79f5476 100644
--- a/platform/libs.flatlaf/nbproject/project.xml
+++ b/platform/libs.flatlaf/nbproject/project.xml
@@ -30,8 +30,8 @@
                 <package>com.formdev.flatlaf.util</package>
             </public-packages>
             <class-path-extension>
-                <runtime-relative-path>ext/flatlaf-1.0.jar</runtime-relative-path>
-                <binary-origin>external/flatlaf-1.0.jar</binary-origin>
+                <runtime-relative-path>ext/flatlaf-1.1.1.jar</runtime-relative-path>
+                <binary-origin>external/flatlaf-1.1.1.jar</binary-origin>
             </class-path-extension>
         </data>
     </configuration>
diff --git a/platform/o.n.swing.laf.flatlaf/nbproject/project.xml b/platform/o.n.swing.laf.flatlaf/nbproject/project.xml
index 06ad263..08b6834 100644
--- a/platform/o.n.swing.laf.flatlaf/nbproject/project.xml
+++ b/platform/o.n.swing.laf.flatlaf/nbproject/project.xml
@@ -82,6 +82,23 @@
                         <specification-version>7.75</specification-version>
                     </run-dependency>
                 </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.options.api</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.57</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util.lookup</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>8.46</specification-version>
+                    </run-dependency>
+                </dependency>
             </module-dependencies>
             <public-packages/>
         </data>
diff --git a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/Bundle.properties b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/Bundle.properties
index d6a62f7..5cf37b6 100644
--- a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/Bundle.properties
+++ b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/Bundle.properties
@@ -23,3 +23,13 @@ OpenIDE-Module-Short-Description=FlatLaf Look and Feels
 
 Editors/FontsColors/FlatLafDark=FlatLaf Dark
 Editors/FontsColors/FlatLafLight=FlatLaf Light
+
+FlatLaf_DisplayName=FlatLaf
+KW_FlatLafOptions=FlatLaf, Look and Feel, Window decorations, Unified title bar, Embedded menu bar, underline menu, mnemonics
+
+FlatLafOptionsPanel.useWindowDecorationsCheckBox.text=&Window decorations
+FlatLafOptionsPanel.restartLabel.text=(needs restart)
+FlatLafOptionsPanel.unifiedTitleBarCheckBox.text=&Unified title bar background
+FlatLafOptionsPanel.menuBarEmbeddedCheckBox.text=&Embedded menu bar
+FlatLafOptionsPanel.underlineMenuSelectionCheckBox.text=Use underline menu &selection
+FlatLafOptionsPanel.alwaysShowMnemonicsCheckBox.text=Always show &mnemonics
diff --git a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLFCustoms.java b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLFCustoms.java
index 0e198b8..cecbfa4 100644
--- a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLFCustoms.java
+++ b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLFCustoms.java
@@ -50,6 +50,13 @@ public class FlatLFCustoms extends LFCustoms {
         };
 
         return new Object[] {
+            // options
+            "TitlePane.useWindowDecorations", FlatLafPrefs.isUseWindowDecorations(),
+            "TitlePane.unifiedBackground", FlatLafPrefs.isUnifiedTitleBar(),
+            "TitlePane.menuBarEmbedded", FlatLafPrefs.isMenuBarEmbedded(),
+            "MenuItem.selectionType", FlatLafPrefs.isUnderlineMenuSelection() ? "underline" : null,
+            "Component.hideMnemonics", !FlatLafPrefs.isAlwaysShowMnemonics(),
+
             // necessary for org.openide.explorer.propertysheet.PropertySheet and others
             CONTROLFONT, UIManager.getFont("Label.font"), // NOI18N
 
diff --git a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.form b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.form
new file mode 100644
index 0000000..90aeab6
--- /dev/null
+++ b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.form
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <Properties>
+    <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+      <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+        <EmptyBorder bottom="10" left="10" right="10" top="10"/>
+      </Border>
+    </Property>
+  </Properties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" attributes="0">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <Component id="useWindowDecorationsCheckBox" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace type="separate" max="-2" attributes="0"/>
+                      <Component id="restartLabel" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <Component id="unifiedTitleBarCheckBox" min="-2" max="-2" attributes="0"/>
+                  <Component id="menuBarEmbeddedCheckBox" min="-2" max="-2" attributes="0"/>
+                  <Component id="underlineMenuSelectionCheckBox" min="-2" max="-2" attributes="0"/>
+                  <Component id="alwaysShowMnemonicsCheckBox" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace pref="155" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="useWindowDecorationsCheckBox" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="restartLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="unifiedTitleBarCheckBox" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="menuBarEmbeddedCheckBox" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="underlineMenuSelectionCheckBox" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="alwaysShowMnemonicsCheckBox" min="-2" max="-2" attributes="0"/>
+              <EmptySpace pref="156" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Component class="javax.swing.JCheckBox" name="useWindowDecorationsCheckBox">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/swing/laf/flatlaf/Bundle.properties" key="FlatLafOptionsPanel.useWindowDecorationsCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="useWindowDecorationsCheckBoxActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JCheckBox" name="menuBarEmbeddedCheckBox">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/swing/laf/flatlaf/Bundle.properties" key="FlatLafOptionsPanel.menuBarEmbeddedCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="menuBarEmbeddedCheckBoxActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JCheckBox" name="unifiedTitleBarCheckBox">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/swing/laf/flatlaf/Bundle.properties" key="FlatLafOptionsPanel.unifiedTitleBarCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="unifiedTitleBarCheckBoxActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JCheckBox" name="underlineMenuSelectionCheckBox">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/swing/laf/flatlaf/Bundle.properties" key="FlatLafOptionsPanel.underlineMenuSelectionCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="underlineMenuSelectionCheckBoxActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JCheckBox" name="alwaysShowMnemonicsCheckBox">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/swing/laf/flatlaf/Bundle.properties" key="FlatLafOptionsPanel.alwaysShowMnemonicsCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="alwaysShowMnemonicsCheckBoxActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JLabel" name="restartLabel">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/swing/laf/flatlaf/Bundle.properties" key="FlatLafOptionsPanel.restartLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+  </SubComponents>
+</Form>
diff --git a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.java b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.java
new file mode 100644
index 0000000..d347e5d
--- /dev/null
+++ b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.java
@@ -0,0 +1,209 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.netbeans.swing.laf.flatlaf;
+
+import com.formdev.flatlaf.util.SystemInfo;
+import org.netbeans.spi.options.OptionsPanelController;
+
+/**
+ * @author Karl Tauber
+ */
+@OptionsPanelController.Keywords(
+    keywords={"#KW_FlatLafOptions"},
+    location="Appearance",
+    tabTitle="#FlatLaf_DisplayName"
+)
+public class FlatLafOptionsPanel extends javax.swing.JPanel {
+
+    private final FlatLafOptionsPanelController controller;
+
+    /**
+     * Creates new form FlatLafOptionsPanel
+     */
+    public FlatLafOptionsPanel(FlatLafOptionsPanelController controller) {
+        this.controller = controller;
+        initComponents();
+        updateEnabled();
+    }
+
+    private void updateEnabled() {
+        boolean supportsWindowDecorations = SystemInfo.isWindows_10_orLater;
+        useWindowDecorationsCheckBox.setEnabled(supportsWindowDecorations);
+        restartLabel.setEnabled(supportsWindowDecorations);
+        unifiedTitleBarCheckBox.setEnabled(supportsWindowDecorations && useWindowDecorationsCheckBox.isSelected());
+        menuBarEmbeddedCheckBox.setEnabled(supportsWindowDecorations && useWindowDecorationsCheckBox.isSelected());
+
+        restartLabel.setVisible(supportsWindowDecorations && FlatLafPrefs.isUseWindowDecorations() && !useWindowDecorationsCheckBox.isSelected());
+    }
+
+    /**
+     * This method is called from within the constructor to initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is always
+     * regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        useWindowDecorationsCheckBox = new javax.swing.JCheckBox();
+        menuBarEmbeddedCheckBox = new javax.swing.JCheckBox();
+        unifiedTitleBarCheckBox = new javax.swing.JCheckBox();
+        underlineMenuSelectionCheckBox = new javax.swing.JCheckBox();
+        alwaysShowMnemonicsCheckBox = new javax.swing.JCheckBox();
+        restartLabel = new javax.swing.JLabel();
+
+        setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
+
+        org.openide.awt.Mnemonics.setLocalizedText(useWindowDecorationsCheckBox, org.openide.util.NbBundle.getMessage(FlatLafOptionsPanel.class, "FlatLafOptionsPanel.useWindowDecorationsCheckBox.text")); // NOI18N
+        useWindowDecorationsCheckBox.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                useWindowDecorationsCheckBoxActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(menuBarEmbeddedCheckBox, org.openide.util.NbBundle.getMessage(FlatLafOptionsPanel.class, "FlatLafOptionsPanel.menuBarEmbeddedCheckBox.text")); // NOI18N
+        menuBarEmbeddedCheckBox.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                menuBarEmbeddedCheckBoxActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(unifiedTitleBarCheckBox, org.openide.util.NbBundle.getMessage(FlatLafOptionsPanel.class, "FlatLafOptionsPanel.unifiedTitleBarCheckBox.text")); // NOI18N
+        unifiedTitleBarCheckBox.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                unifiedTitleBarCheckBoxActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(underlineMenuSelectionCheckBox, org.openide.util.NbBundle.getMessage(FlatLafOptionsPanel.class, "FlatLafOptionsPanel.underlineMenuSelectionCheckBox.text")); // NOI18N
+        underlineMenuSelectionCheckBox.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                underlineMenuSelectionCheckBoxActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(alwaysShowMnemonicsCheckBox, org.openide.util.NbBundle.getMessage(FlatLafOptionsPanel.class, "FlatLafOptionsPanel.alwaysShowMnemonicsCheckBox.text")); // NOI18N
+        alwaysShowMnemonicsCheckBox.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                alwaysShowMnemonicsCheckBoxActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(restartLabel, org.openide.util.NbBundle.getMessage(FlatLafOptionsPanel.class, "FlatLafOptionsPanel.restartLabel.text")); // NOI18N
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(useWindowDecorationsCheckBox)
+                        .addGap(18, 18, 18)
+                        .addComponent(restartLabel))
+                    .addComponent(unifiedTitleBarCheckBox)
+                    .addComponent(menuBarEmbeddedCheckBox)
+                    .addComponent(underlineMenuSelectionCheckBox)
+                    .addComponent(alwaysShowMnemonicsCheckBox))
+                .addContainerGap(155, Short.MAX_VALUE))
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(useWindowDecorationsCheckBox)
+                    .addComponent(restartLabel))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(unifiedTitleBarCheckBox)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(menuBarEmbeddedCheckBox)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(underlineMenuSelectionCheckBox)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(alwaysShowMnemonicsCheckBox)
+                .addContainerGap(156, Short.MAX_VALUE))
+        );
+    }// </editor-fold>//GEN-END:initComponents
+
+    private void useWindowDecorationsCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useWindowDecorationsCheckBoxActionPerformed
+        updateEnabled();
+        fireChanged();
+    }//GEN-LAST:event_useWindowDecorationsCheckBoxActionPerformed
+
+    private void unifiedTitleBarCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unifiedTitleBarCheckBoxActionPerformed
+        fireChanged();
+    }//GEN-LAST:event_unifiedTitleBarCheckBoxActionPerformed
+
+    private void menuBarEmbeddedCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuBarEmbeddedCheckBoxActionPerformed
+        fireChanged();
+    }//GEN-LAST:event_menuBarEmbeddedCheckBoxActionPerformed
+
+    private void underlineMenuSelectionCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_underlineMenuSelectionCheckBoxActionPerformed
+        fireChanged();
+    }//GEN-LAST:event_underlineMenuSelectionCheckBoxActionPerformed
+
+    private void alwaysShowMnemonicsCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_alwaysShowMnemonicsCheckBoxActionPerformed
+        fireChanged();
+    }//GEN-LAST:event_alwaysShowMnemonicsCheckBoxActionPerformed
+
+    private void fireChanged() {
+        boolean isChanged = false;
+        if(useWindowDecorationsCheckBox.isSelected() != FlatLafPrefs.isUseWindowDecorations()
+                || unifiedTitleBarCheckBox.isSelected() != FlatLafPrefs.isUnifiedTitleBar()
+                || menuBarEmbeddedCheckBox.isSelected() != FlatLafPrefs.isMenuBarEmbedded()
+                || underlineMenuSelectionCheckBox.isSelected() != FlatLafPrefs.isUnderlineMenuSelection()
+                || alwaysShowMnemonicsCheckBox.isSelected() != FlatLafPrefs.isAlwaysShowMnemonics()) {
+            isChanged = true;
+        }
+        controller.changed(isChanged);
+    }
+
+    protected void load() {
+        useWindowDecorationsCheckBox.setSelected(FlatLafPrefs.isUseWindowDecorations());
+        unifiedTitleBarCheckBox.setSelected(FlatLafPrefs.isUnifiedTitleBar());
+        menuBarEmbeddedCheckBox.setSelected(FlatLafPrefs.isMenuBarEmbedded());
+        underlineMenuSelectionCheckBox.setSelected(FlatLafPrefs.isUnderlineMenuSelection());
+        alwaysShowMnemonicsCheckBox.setSelected(FlatLafPrefs.isAlwaysShowMnemonics());
+
+        updateEnabled();
+    }
+
+    protected boolean store() {
+        FlatLafPrefs.setUseWindowDecorations(useWindowDecorationsCheckBox.isSelected());
+        FlatLafPrefs.setUnifiedTitleBar(unifiedTitleBarCheckBox.isSelected());
+        FlatLafPrefs.setMenuBarEmbedded(menuBarEmbeddedCheckBox.isSelected());
+        FlatLafPrefs.setUnderlineMenuSelection(underlineMenuSelectionCheckBox.isSelected());
+        FlatLafPrefs.setAlwaysShowMnemonics(alwaysShowMnemonicsCheckBox.isSelected());
+        return false;
+    }
+
+    boolean valid() {
+        // TODO check whether form is consistent and complete
+        return true;
+    }
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JCheckBox alwaysShowMnemonicsCheckBox;
+    private javax.swing.JCheckBox menuBarEmbeddedCheckBox;
+    private javax.swing.JLabel restartLabel;
+    private javax.swing.JCheckBox underlineMenuSelectionCheckBox;
+    private javax.swing.JCheckBox unifiedTitleBarCheckBox;
+    private javax.swing.JCheckBox useWindowDecorationsCheckBox;
+    // End of variables declaration//GEN-END:variables
+}
diff --git a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanelController.java b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanelController.java
new file mode 100644
index 0000000..1114aab
--- /dev/null
+++ b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanelController.java
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.netbeans.swing.laf.flatlaf;
+
+import com.formdev.flatlaf.FlatLaf;
+import java.awt.Window;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import javax.swing.JComponent;
+import javax.swing.SwingUtilities;
+import javax.swing.UIDefaults;
+import javax.swing.UIManager;
+import org.netbeans.spi.options.OptionsPanelController;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author charly
+ */
+@OptionsPanelController.SubRegistration(
+    displayName="#FlatLaf_DisplayName",
+    keywords="#KW_FlatLafOptions",
+    keywordsCategory="Appearance/FlatLaf",
+    location = "Appearance"
+)
+public class FlatLafOptionsPanelController extends OptionsPanelController {
+    
+    private FlatLafOptionsPanel panel;
+    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
+    private boolean changed;
+
+    @Override
+    public void update() {
+        getPanel().load();
+        changed = false;
+    }
+
+    @Override
+    public void applyChanges() {
+        if (!changed) {
+            return;
+        }
+
+        SwingUtilities.invokeLater(() -> {
+            boolean oldUseWindowDecorations = FlatLafPrefs.isUseWindowDecorations();
+            boolean oldUnifiedTitleBar = FlatLafPrefs.isUnifiedTitleBar();
+            boolean oldMenuBarEmbedded = FlatLafPrefs.isMenuBarEmbedded();
+            boolean oldUnderlineMenuSelection = FlatLafPrefs.isUnderlineMenuSelection();
+            boolean oldAlwaysShowMnemonics = FlatLafPrefs.isAlwaysShowMnemonics();
+
+            getPanel().store();
+            changed = false;
+
+            UIDefaults defaults = UIManager.getDefaults();
+            defaults.put("TitlePane.useWindowDecorations", FlatLafPrefs.isUseWindowDecorations());
+            defaults.put("TitlePane.unifiedBackground", FlatLafPrefs.isUnifiedTitleBar());
+            defaults.put("TitlePane.menuBarEmbedded", FlatLafPrefs.isMenuBarEmbedded());
+            defaults.put("MenuItem.selectionType", FlatLafPrefs.isUnderlineMenuSelection() ? "underline" : null);
+            defaults.put("Component.hideMnemonics", !FlatLafPrefs.isAlwaysShowMnemonics());
+
+            if (oldUseWindowDecorations != FlatLafPrefs.isUseWindowDecorations()
+                    || oldUnifiedTitleBar != FlatLafPrefs.isUnifiedTitleBar()) {
+                FlatLaf.updateUI();
+            } else if (oldMenuBarEmbedded != FlatLafPrefs.isMenuBarEmbedded()
+                    || oldUnderlineMenuSelection != FlatLafPrefs.isUnderlineMenuSelection()
+                    || oldAlwaysShowMnemonics != FlatLafPrefs.isAlwaysShowMnemonics()) {
+                for (Window w : Window.getWindows()) {
+                    w.revalidate();
+                    w.repaint();
+                }
+            }
+        });
+    }
+
+    @Override
+    public void cancel() {
+        // need not do anything special, if no changes have been persisted yet
+    }
+
+    @Override
+    public boolean isValid() {
+        return getPanel().valid();
+    }
+
+    @Override
+    public boolean isChanged() {
+        return changed;
+    }
+
+    @Override
+    public HelpCtx getHelpCtx() {
+        return null;
+    }
+
+    @Override
+    public JComponent getComponent(Lookup masterLookup) {
+        return getPanel();
+    }
+
+    @Override
+    public void addPropertyChangeListener(PropertyChangeListener l) {
+        pcs.addPropertyChangeListener(l);
+    }
+
+    @Override
+    public void removePropertyChangeListener(PropertyChangeListener l) {
+        pcs.removePropertyChangeListener(l);
+    }
+
+    protected FlatLafOptionsPanel getPanel() {
+        if (panel == null) {
+            panel = new FlatLafOptionsPanel(this);
+        }
+        return panel;
+    }
+
+    protected void changed(boolean isChanged) {
+        if (!changed) {
+            pcs.firePropertyChange(OptionsPanelController.PROP_CHANGED, false, true);
+        }
+        changed = isChanged;
+        pcs.firePropertyChange(OptionsPanelController.PROP_VALID, null, null);
+    }
+}
diff --git a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafPrefs.java b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafPrefs.java
new file mode 100644
index 0000000..403a8e7
--- /dev/null
+++ b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafPrefs.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.netbeans.swing.laf.flatlaf;
+
+import java.util.prefs.Preferences;
+import org.openide.util.NbPreferences;
+
+/**
+ *
+ * @author Karl Tauber
+ */
+class FlatLafPrefs {
+
+    private static final String USE_WINDOW_DECORATIONS = "useWindowDecorations";
+    private static final String UNIFIED_TITLE_BAR = "unifiedTitleBar";
+    private static final String MENU_BAR_EMBEDDED = "menuBarEmbedded";
+    private static final String UNDERLINE_MENU_SELECTION = "underlineMenuSelection";
+    private static final String ALWAYS_SHOW_MNEMONICS = "alwaysShowMnemonics";
+
+    private static final Preferences prefs = NbPreferences.forModule(FlatLafPrefs.class);
+
+    static boolean isUseWindowDecorations() {
+        return prefs.getBoolean(USE_WINDOW_DECORATIONS, true);
+    }
+
+    static void setUseWindowDecorations(boolean value) {
+        putBoolean(USE_WINDOW_DECORATIONS, value, true);
+    }
+
+    static boolean isUnifiedTitleBar() {
+        return prefs.getBoolean(UNIFIED_TITLE_BAR, false);
+    }
+
+    static void setUnifiedTitleBar(boolean value) {
+        putBoolean(UNIFIED_TITLE_BAR, value, false);
+    }
+
+    static boolean isMenuBarEmbedded() {
+        return prefs.getBoolean(MENU_BAR_EMBEDDED, true);
+    }
+
+    static void setMenuBarEmbedded(boolean value) {
+        putBoolean(MENU_BAR_EMBEDDED, value, true);
+    }
+
+    static boolean isUnderlineMenuSelection() {
+        return prefs.getBoolean(UNDERLINE_MENU_SELECTION, false);
+    }
+
+    static void setUnderlineMenuSelection(boolean value) {
+        putBoolean(UNDERLINE_MENU_SELECTION, value, false);
+    }
+
+    static boolean isAlwaysShowMnemonics() {
+        return prefs.getBoolean(ALWAYS_SHOW_MNEMONICS, false);
+    }
+
+    static void setAlwaysShowMnemonics(boolean value) {
+        putBoolean(ALWAYS_SHOW_MNEMONICS, value, false);
+    }
+
+    private static void putBoolean(String key, boolean value, boolean def) {
+        if (value != def) {
+            prefs.putBoolean(key, value);
+        } else {
+            prefs.remove(key);
+        }
+    }
+}

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists