From 97993b7b20b27bbd1e3b7601381dbc90d1cb7848 Mon Sep 17 00:00:00 2001
From: Radek Oslejsek <oslejsek@fi.muni.cz>
Date: Thu, 13 May 2021 15:35:42 +0200
Subject: [PATCH] Added new standsrd Option panel into the netbeans platform
 application

---
 .../options/TestOptionsPanelController.java   |  95 ++++++++++++++++++
 .../analyst/gui/options/TestPanel.form        |  66 ++++++++++++
 .../analyst/gui/options/TestPanel.java        |  77 ++++++++++++++
 .../analyst/gui/options/package-info.java     |   9 ++
 .../analyst/gui/options/Bundle.properties     |   1 +
 GUI/src/main/resources/logo-28x32.png         | Bin 0 -> 6879 bytes
 6 files changed, 248 insertions(+)
 create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/options/TestOptionsPanelController.java
 create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/options/TestPanel.form
 create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/options/TestPanel.java
 create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/options/package-info.java
 create mode 100644 GUI/src/main/resources/cz/fidentis/analyst/gui/options/Bundle.properties
 create mode 100644 GUI/src/main/resources/logo-28x32.png

diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/options/TestOptionsPanelController.java b/GUI/src/main/java/cz/fidentis/analyst/gui/options/TestOptionsPanelController.java
new file mode 100644
index 00000000..19b26bc9
--- /dev/null
+++ b/GUI/src/main/java/cz/fidentis/analyst/gui/options/TestOptionsPanelController.java
@@ -0,0 +1,95 @@
+package cz.fidentis.analyst.gui.options;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import javax.swing.JComponent;
+import javax.swing.SwingUtilities;
+import org.netbeans.spi.options.OptionsPanelController;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+
+/**
+ * Generated from NetBeans (secondary Option Panel).
+ * 
+ * @author Radek Oslejsek
+ */
+@OptionsPanelController.SubRegistration(
+        displayName = "#AdvancedOption_DisplayName_Test",
+        keywords = "#AdvancedOption_Keywords_Test",
+        keywordsCategory = "Advanced/Test"
+)
+@org.openide.util.NbBundle.Messages({"AdvancedOption_DisplayName_Test=Test", "AdvancedOption_Keywords_Test=test"})
+public final class TestOptionsPanelController extends OptionsPanelController {
+
+    private TestPanel panel;
+    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
+    private boolean changed;
+
+    @Override
+    public void update() {
+        getPanel().load();
+        changed = false;
+    }
+
+    @Override
+    public void applyChanges() {
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                getPanel().store();
+                changed = false;
+            }
+        });
+    }
+
+    @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; // new HelpCtx("...ID") if you have a help set
+    }
+
+    @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);
+    }
+
+    private TestPanel getPanel() {
+        if (panel == null) {
+            panel = new TestPanel(this);
+        }
+        return panel;
+    }
+
+    void changed() {
+        if (!changed) {
+            changed = true;
+            pcs.firePropertyChange(OptionsPanelController.PROP_CHANGED, false, true);
+        }
+        pcs.firePropertyChange(OptionsPanelController.PROP_VALID, null, null);
+    }
+
+}
diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/options/TestPanel.form b/GUI/src/main/java/cz/fidentis/analyst/gui/options/TestPanel.form
new file mode 100644
index 00000000..df4f0282
--- /dev/null
+++ b/GUI/src/main/java/cz/fidentis/analyst/gui/options/TestPanel.form
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+
+    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.
+
+-->
+
+<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <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" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
+              <EmptySpace pref="143" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
+              <EmptySpace pref="38" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Component class="javax.swing.JLabel" name="jLabel1">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="cz/fidentis/analyst/gui/options/Bundle.properties" key="TestPanel.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+  </SubComponents>
+</Form>
diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/options/TestPanel.java b/GUI/src/main/java/cz/fidentis/analyst/gui/options/TestPanel.java
new file mode 100644
index 00000000..3645d60d
--- /dev/null
+++ b/GUI/src/main/java/cz/fidentis/analyst/gui/options/TestPanel.java
@@ -0,0 +1,77 @@
+package cz.fidentis.analyst.gui.options;
+
+/**
+ * Test option panel. To be replaced with suitable implementation(s)
+ * Generated from NetBeans (secondary Option Panel)
+ * 
+ * @author Radek Oslejsek
+ */
+final class TestPanel extends javax.swing.JPanel {
+
+    private final TestOptionsPanelController controller;
+
+    TestPanel(TestOptionsPanelController controller) {
+        this.controller = controller;
+        initComponents();
+        // TODO listen to changes in form fields and call controller.changed()
+    }
+
+    /**
+     * 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.
+     */
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jLabel1 = new javax.swing.JLabel();
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(TestPanel.class, "TestPanel.jLabel1.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()
+                .addContainerGap()
+                .addComponent(jLabel1)
+                .addContainerGap(143, Short.MAX_VALUE))
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(jLabel1)
+                .addContainerGap(38, Short.MAX_VALUE))
+        );
+    }// </editor-fold>//GEN-END:initComponents
+
+    void load() {
+        // TODO read settings and initialize GUI
+        // Example:        
+        // someCheckBox.setSelected(Preferences.userNodeForPackage(TestPanel.class).getBoolean("someFlag", false));
+        // or for org.openide.util with API spec. version >= 7.4:
+        // someCheckBox.setSelected(NbPreferences.forModule(TestPanel.class).getBoolean("someFlag", false));
+        // or:
+        // someTextField.setText(SomeSystemOption.getDefault().getSomeStringProperty());
+    }
+
+    void store() {
+        // TODO store modified settings
+        // Example:
+        // Preferences.userNodeForPackage(TestPanel.class).putBoolean("someFlag", someCheckBox.isSelected());
+        // or for org.openide.util with API spec. version >= 7.4:
+        // NbPreferences.forModule(TestPanel.class).putBoolean("someFlag", someCheckBox.isSelected());
+        // or:
+        // SomeSystemOption.getDefault().setSomeStringProperty(someTextField.getText());
+    }
+
+    boolean valid() {
+        // TODO check whether form is consistent and complete
+        return true;
+    }
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JLabel jLabel1;
+    // End of variables declaration//GEN-END:variables
+}
diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/options/package-info.java b/GUI/src/main/java/cz/fidentis/analyst/gui/options/package-info.java
new file mode 100644
index 00000000..29f2b35b
--- /dev/null
+++ b/GUI/src/main/java/cz/fidentis/analyst/gui/options/package-info.java
@@ -0,0 +1,9 @@
+/**
+ * FIDENTIS settings integrated into the Options window of the NetBean Platform.
+ */
+@OptionsPanelController.ContainerRegistration(id = "Fidentis", categoryName = "#OptionsCategory_Name_Fidentis", iconBase = "logo-28x32.png", keywords = "#OptionsCategory_Keywords_Fidentis", keywordsCategory = "Fidentis")
+@NbBundle.Messages(value = {"OptionsCategory_Name_Fidentis=Fidentis", "OptionsCategory_Keywords_Fidentis=fidentis"})
+package cz.fidentis.analyst.gui.options;
+
+import org.netbeans.spi.options.OptionsPanelController;
+import org.openide.util.NbBundle;
diff --git a/GUI/src/main/resources/cz/fidentis/analyst/gui/options/Bundle.properties b/GUI/src/main/resources/cz/fidentis/analyst/gui/options/Bundle.properties
new file mode 100644
index 00000000..c7bbd768
--- /dev/null
+++ b/GUI/src/main/resources/cz/fidentis/analyst/gui/options/Bundle.properties
@@ -0,0 +1 @@
+TestPanel.jLabel1.text=TO DO
diff --git a/GUI/src/main/resources/logo-28x32.png b/GUI/src/main/resources/logo-28x32.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee2291925ff5aad496d15f9d5de9d12b4d1094a1
GIT binary patch
literal 6879
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
Tx6>#7C$_U*Wp&YVQ`Elz=ohOe

literal 0
HcmV?d00001

-- 
GitLab