From 24fe022d3aceddfbd32eb6b0bb5eba16627de4d6 Mon Sep 17 00:00:00 2001
From: Carlos Machado <58347209+cjmach@users.noreply.github.com>
Date: Sun, 9 Jun 2024 17:14:48 +0100
Subject: [PATCH 1/6] Move DJ Swing initialization to module installer.
---
djns/manifest.mf | 1 +
djns/nbproject/genfiles.properties | 2 +-
djns/nbproject/project.xml | 24 +++++++++++++++++++
.../pt/cjmach/netbeans/djns/Installer.java | 19 +++++++++++++++
.../djns/browser/DjnsBrowserImpl.java | 7 ------
5 files changed, 45 insertions(+), 8 deletions(-)
create mode 100644 djns/src/pt/cjmach/netbeans/djns/Installer.java
diff --git a/djns/manifest.mf b/djns/manifest.mf
index 5be0e4f..38f9b4b 100644
--- a/djns/manifest.mf
+++ b/djns/manifest.mf
@@ -1,6 +1,7 @@
Manifest-Version: 1.0
AutoUpdate-Show-In-Client: true
OpenIDE-Module: pt.cjmach.netbeans.djns
+OpenIDE-Module-Install: pt/cjmach/netbeans/djns/Installer.class
OpenIDE-Module-Layer: pt/cjmach/netbeans/djns/layer.xml
OpenIDE-Module-Localizing-Bundle: pt/cjmach/netbeans/djns/Bundle.properties
OpenIDE-Module-Specification-Version: 1.1
diff --git a/djns/nbproject/genfiles.properties b/djns/nbproject/genfiles.properties
index 17b330e..961b64a 100644
--- a/djns/nbproject/genfiles.properties
+++ b/djns/nbproject/genfiles.properties
@@ -3,6 +3,6 @@ build.xml.script.CRC32=7652be79
build.xml.stylesheet.CRC32=15ca8a54@2.80
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=375f4386
+nbproject/build-impl.xml.data.CRC32=cd07b957
nbproject/build-impl.xml.script.CRC32=9797c51f
nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.92
diff --git a/djns/nbproject/project.xml b/djns/nbproject/project.xml
index 9bbf886..ed9b12b 100644
--- a/djns/nbproject/project.xml
+++ b/djns/nbproject/project.xml
@@ -31,6 +31,14 @@
7.76
+
+ org.openide.modules
+
+
+
+ 7.68
+
+
org.openide.util
@@ -47,6 +55,22 @@
8.41
+
+ org.openide.util.ui
+
+
+
+ 9.29
+
+
+
+ org.openide.windows
+
+
+
+ 6.97
+
+
pt.cjmach.netbeans.djns.browser
diff --git a/djns/src/pt/cjmach/netbeans/djns/Installer.java b/djns/src/pt/cjmach/netbeans/djns/Installer.java
new file mode 100644
index 0000000..0ec4bad
--- /dev/null
+++ b/djns/src/pt/cjmach/netbeans/djns/Installer.java
@@ -0,0 +1,19 @@
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ * Click nbfs://nbhost/SystemFileSystem/Templates/NetBeansModuleDevelopment-files/moduleInstall.java to edit this template
+ */
+package pt.cjmach.netbeans.djns;
+
+import chrriis.dj.nativeswing.swtimpl.NativeInterface;
+import chrriis.dj.nativeswing.swtimpl.netbeans.NativeInterfaceNetBeansHandler;
+import org.openide.modules.ModuleInstall;
+
+public class Installer extends ModuleInstall {
+
+ @Override
+ public void restored() {
+ NativeInterfaceNetBeansHandler.initialize();
+ NativeInterface.open();
+ }
+
+}
diff --git a/djns/src/pt/cjmach/netbeans/djns/browser/DjnsBrowserImpl.java b/djns/src/pt/cjmach/netbeans/djns/browser/DjnsBrowserImpl.java
index c0bce0c..6c9d15f 100644
--- a/djns/src/pt/cjmach/netbeans/djns/browser/DjnsBrowserImpl.java
+++ b/djns/src/pt/cjmach/netbeans/djns/browser/DjnsBrowserImpl.java
@@ -18,14 +18,12 @@
package pt.cjmach.netbeans.djns.browser;
import chrriis.dj.nativeswing.NSComponentOptions;
-import chrriis.dj.nativeswing.swtimpl.NativeInterface;
import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;
import chrriis.dj.nativeswing.swtimpl.components.WebBrowserAdapter;
import chrriis.dj.nativeswing.swtimpl.components.WebBrowserEvent;
import chrriis.dj.nativeswing.swtimpl.components.WebBrowserListener;
import chrriis.dj.nativeswing.swtimpl.components.WebBrowserNavigationEvent;
import chrriis.dj.nativeswing.swtimpl.components.WebBrowserWindowWillOpenEvent;
-import chrriis.dj.nativeswing.swtimpl.netbeans.NativeInterfaceNetBeansHandler;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.net.MalformedURLException;
@@ -58,11 +56,6 @@ class DjnsBrowserImpl extends HtmlBrowser.Impl {
private int progress;
private final WebBrowserListener browserListener;
- static {
- NativeInterfaceNetBeansHandler.initialize();
- NativeInterface.open();
- }
-
public DjnsBrowserImpl() {
browserListener = new BrowserListener();
propChangeSupport = new PropertyChangeSupport(this);
From 2d4663622cd21508f0879d6dd59fa1a938ab2184 Mon Sep 17 00:00:00 2001
From: Carlos Machado <58347209+cjmach@users.noreply.github.com>
Date: Sun, 9 Jun 2024 17:18:44 +0100
Subject: [PATCH 2/6] Add NativeDialogBuilder and expose required packages.
---
.../nbproject/genfiles.properties | 4 +-
.../nbproject/project.xml | 4 +-
.../nbproject/genfiles.properties | 8 +-
.../nbproject/project.xml | 4 +-
.../nbproject/genfiles.properties | 4 +-
.../nbproject/project.xml | 4 +-
.../nbproject/genfiles.properties | 4 +-
.../nbproject/project.xml | 4 +-
.../nbproject/genfiles.properties | 8 +-
.../nbproject/project.xml | 4 +-
.../nbproject/genfiles.properties | 8 +-
.../nbproject/project.xml | 5 +-
djns/nbproject/genfiles.properties | 2 +-
djns/nbproject/project.xml | 1 +
.../netbeans/djns/dialog/DialogType.java | 10 +
.../djns/dialog/NativeDialogBuilder.java | 233 ++++++++++++++++++
.../djns/dialog/OpenNativeDialogAction.java | 36 +++
17 files changed, 318 insertions(+), 25 deletions(-)
create mode 100644 djns/src/pt/cjmach/netbeans/djns/dialog/DialogType.java
create mode 100644 djns/src/pt/cjmach/netbeans/djns/dialog/NativeDialogBuilder.java
create mode 100644 djns/src/pt/cjmach/netbeans/djns/dialog/OpenNativeDialogAction.java
diff --git a/djns-swt-cocoa-macosx-aarch64/nbproject/genfiles.properties b/djns-swt-cocoa-macosx-aarch64/nbproject/genfiles.properties
index 1e39c11..a0e43d3 100644
--- a/djns-swt-cocoa-macosx-aarch64/nbproject/genfiles.properties
+++ b/djns-swt-cocoa-macosx-aarch64/nbproject/genfiles.properties
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=8cec4aaa
+build.xml.data.CRC32=b73d1e95
build.xml.script.CRC32=a26f62a4
build.xml.stylesheet.CRC32=15ca8a54@2.92
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=8cec4aaa
+nbproject/build-impl.xml.data.CRC32=b73d1e95
nbproject/build-impl.xml.script.CRC32=c8510446
nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.92
diff --git a/djns-swt-cocoa-macosx-aarch64/nbproject/project.xml b/djns-swt-cocoa-macosx-aarch64/nbproject/project.xml
index 6a93fd7..d5d7c48 100644
--- a/djns-swt-cocoa-macosx-aarch64/nbproject/project.xml
+++ b/djns-swt-cocoa-macosx-aarch64/nbproject/project.xml
@@ -23,7 +23,9 @@
-
+
+ chrriis.dj.nativeswing.swtimpl.components.core
+
ext/DJNativeSwing-SWTCore.jar
release/modules/ext/DJNativeSwing-SWTCore.jar
diff --git a/djns-swt-cocoa-macosx-x86_64/nbproject/genfiles.properties b/djns-swt-cocoa-macosx-x86_64/nbproject/genfiles.properties
index 7771877..d2a0666 100644
--- a/djns-swt-cocoa-macosx-x86_64/nbproject/genfiles.properties
+++ b/djns-swt-cocoa-macosx-x86_64/nbproject/genfiles.properties
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=60a660c4
+build.xml.data.CRC32=80ae4190
build.xml.script.CRC32=862c6b80
-build.xml.stylesheet.CRC32=15ca8a54@2.80
+build.xml.stylesheet.CRC32=15ca8a54@2.92
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=60a660c4
+nbproject/build-impl.xml.data.CRC32=80ae4190
nbproject/build-impl.xml.script.CRC32=425cae01
-nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.80
+nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.92
diff --git a/djns-swt-cocoa-macosx-x86_64/nbproject/project.xml b/djns-swt-cocoa-macosx-x86_64/nbproject/project.xml
index 08602bf..5aad303 100644
--- a/djns-swt-cocoa-macosx-x86_64/nbproject/project.xml
+++ b/djns-swt-cocoa-macosx-x86_64/nbproject/project.xml
@@ -23,7 +23,9 @@
-
+
+ chrriis.dj.nativeswing.swtimpl.components.core
+
ext/swt-cocoa-macosx-x86_64.jar
release/modules/ext/swt-cocoa-macosx-x86_64.jar
diff --git a/djns-swt-gtk-linux-aarch64/nbproject/genfiles.properties b/djns-swt-gtk-linux-aarch64/nbproject/genfiles.properties
index 6897a73..e2453a9 100644
--- a/djns-swt-gtk-linux-aarch64/nbproject/genfiles.properties
+++ b/djns-swt-gtk-linux-aarch64/nbproject/genfiles.properties
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=77c0b219
+build.xml.data.CRC32=de29771e
build.xml.script.CRC32=30a1f23c
build.xml.stylesheet.CRC32=15ca8a54@2.92
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=77c0b219
+nbproject/build-impl.xml.data.CRC32=de29771e
nbproject/build-impl.xml.script.CRC32=be0ec097
nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.92
diff --git a/djns-swt-gtk-linux-aarch64/nbproject/project.xml b/djns-swt-gtk-linux-aarch64/nbproject/project.xml
index ff92bf6..546dd1b 100644
--- a/djns-swt-gtk-linux-aarch64/nbproject/project.xml
+++ b/djns-swt-gtk-linux-aarch64/nbproject/project.xml
@@ -23,7 +23,9 @@
-
+
+ chrriis.dj.nativeswing.swtimpl.components.core
+
ext/swt-4.25-gtk-linux-aarch64.jar
release/modules/ext/swt-4.25-gtk-linux-aarch64.jar
diff --git a/djns-swt-gtk-linux-ppc64/nbproject/genfiles.properties b/djns-swt-gtk-linux-ppc64/nbproject/genfiles.properties
index cb1a485..c623e05 100644
--- a/djns-swt-gtk-linux-ppc64/nbproject/genfiles.properties
+++ b/djns-swt-gtk-linux-ppc64/nbproject/genfiles.properties
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=283374d5
+build.xml.data.CRC32=0b689509
build.xml.script.CRC32=4ed57078
build.xml.stylesheet.CRC32=15ca8a54@2.92
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=283374d5
+nbproject/build-impl.xml.data.CRC32=0b689509
nbproject/build-impl.xml.script.CRC32=e3c014c2
nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.92
diff --git a/djns-swt-gtk-linux-ppc64/nbproject/project.xml b/djns-swt-gtk-linux-ppc64/nbproject/project.xml
index 5282d04..b34f35a 100644
--- a/djns-swt-gtk-linux-ppc64/nbproject/project.xml
+++ b/djns-swt-gtk-linux-ppc64/nbproject/project.xml
@@ -23,7 +23,9 @@
-
+
+ chrriis.dj.nativeswing.swtimpl.components.core
+
ext/swt-4.25-gtk-linux-ppc64le.jar
release/modules/ext/swt-4.25-gtk-linux-ppc64le.jar
diff --git a/djns-swt-gtk-linux-x86_64/nbproject/genfiles.properties b/djns-swt-gtk-linux-x86_64/nbproject/genfiles.properties
index 4ea891a..6fd9407 100644
--- a/djns-swt-gtk-linux-x86_64/nbproject/genfiles.properties
+++ b/djns-swt-gtk-linux-x86_64/nbproject/genfiles.properties
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=238326f1
+build.xml.data.CRC32=7e9f711f
build.xml.script.CRC32=12845596
-build.xml.stylesheet.CRC32=15ca8a54@2.80
+build.xml.stylesheet.CRC32=15ca8a54@2.92
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=238326f1
+nbproject/build-impl.xml.data.CRC32=7e9f711f
nbproject/build-impl.xml.script.CRC32=c1d9ef41
-nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.80
+nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.92
diff --git a/djns-swt-gtk-linux-x86_64/nbproject/project.xml b/djns-swt-gtk-linux-x86_64/nbproject/project.xml
index 22cd24f..22369f1 100644
--- a/djns-swt-gtk-linux-x86_64/nbproject/project.xml
+++ b/djns-swt-gtk-linux-x86_64/nbproject/project.xml
@@ -23,7 +23,9 @@
-
+
+ chrriis.dj.nativeswing.swtimpl.components.core
+
ext/swt-4.25-gtk-linux-x86_64.jar
release/modules/ext/swt-4.25-gtk-linux-x86_64.jar
diff --git a/djns-swt-win32-win32-x86_64/nbproject/genfiles.properties b/djns-swt-win32-win32-x86_64/nbproject/genfiles.properties
index 89cfcd9..86a897d 100644
--- a/djns-swt-win32-win32-x86_64/nbproject/genfiles.properties
+++ b/djns-swt-win32-win32-x86_64/nbproject/genfiles.properties
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=88305667
+build.xml.data.CRC32=d1e1da1d
build.xml.script.CRC32=7d38c2ab
-build.xml.stylesheet.CRC32=15ca8a54@2.80
+build.xml.stylesheet.CRC32=15ca8a54@2.92
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=88305667
+nbproject/build-impl.xml.data.CRC32=d1e1da1d
nbproject/build-impl.xml.script.CRC32=c16237f3
-nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.80
+nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.92
diff --git a/djns-swt-win32-win32-x86_64/nbproject/project.xml b/djns-swt-win32-win32-x86_64/nbproject/project.xml
index 2d61c19..265cdba 100644
--- a/djns-swt-win32-win32-x86_64/nbproject/project.xml
+++ b/djns-swt-win32-win32-x86_64/nbproject/project.xml
@@ -23,7 +23,10 @@
-
+
+ chrriis.dj.nativeswing.swtimpl.components.core
+ chrriis.dj.nativeswing.swtimpl.components.win32.core
+
ext/swt-win32-win32-x86_64.jar
release/modules/ext/swt-win32-win32-x86_64.jar
diff --git a/djns/nbproject/genfiles.properties b/djns/nbproject/genfiles.properties
index 961b64a..d722805 100644
--- a/djns/nbproject/genfiles.properties
+++ b/djns/nbproject/genfiles.properties
@@ -3,6 +3,6 @@ build.xml.script.CRC32=7652be79
build.xml.stylesheet.CRC32=15ca8a54@2.80
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=cd07b957
+nbproject/build-impl.xml.data.CRC32=15ca784d
nbproject/build-impl.xml.script.CRC32=9797c51f
nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.92
diff --git a/djns/nbproject/project.xml b/djns/nbproject/project.xml
index ed9b12b..ff48d9a 100644
--- a/djns/nbproject/project.xml
+++ b/djns/nbproject/project.xml
@@ -74,6 +74,7 @@
pt.cjmach.netbeans.djns.browser
+ pt.cjmach.netbeans.djns.dialog
diff --git a/djns/src/pt/cjmach/netbeans/djns/dialog/DialogType.java b/djns/src/pt/cjmach/netbeans/djns/dialog/DialogType.java
new file mode 100644
index 0000000..2fd6690
--- /dev/null
+++ b/djns/src/pt/cjmach/netbeans/djns/dialog/DialogType.java
@@ -0,0 +1,10 @@
+package pt.cjmach.netbeans.djns.dialog;
+
+/**
+ *
+ * @author cmachado
+ */
+public enum DialogType {
+ FILE,
+ DIRECTORY;
+}
diff --git a/djns/src/pt/cjmach/netbeans/djns/dialog/NativeDialogBuilder.java b/djns/src/pt/cjmach/netbeans/djns/dialog/NativeDialogBuilder.java
new file mode 100644
index 0000000..700ab3c
--- /dev/null
+++ b/djns/src/pt/cjmach/netbeans/djns/dialog/NativeDialogBuilder.java
@@ -0,0 +1,233 @@
+package pt.cjmach.netbeans.djns.dialog;
+
+import chrriis.dj.nativeswing.swtimpl.components.JDirectoryDialog;
+import chrriis.dj.nativeswing.swtimpl.components.JFileDialog;
+import java.awt.Component;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import javax.swing.UIManager;
+import javax.swing.filechooser.FileNameExtensionFilter;
+import org.openide.util.NbPreferences;
+import org.openide.windows.WindowManager;
+
+/**
+ *
+ * @author cmachado
+ */
+public class NativeDialogBuilder {
+
+ private final String key;
+ private final DialogType type;
+ private String title;
+ private File defaultWorkingDir;
+ private String description;
+ // TODO: Allow to add filters
+ private final List filters;
+ private FileNameExtensionFilter filter;
+ private boolean acceptAllFilesFilter;
+
+ public NativeDialogBuilder(Class> key) {
+ this(key, DialogType.FILE);
+ }
+
+ public NativeDialogBuilder(Class> key, DialogType type) {
+ this(key.getName(), type);
+ }
+
+ public NativeDialogBuilder(String key, DialogType type) {
+ Objects.requireNonNull(key, "key");
+ this.key = key;
+ this.type = type;
+ this.filters = new ArrayList<>();
+ }
+
+ public NativeDialogBuilder addFileFilter(FileNameExtensionFilter filter) {
+ Objects.requireNonNull(filter, "filter");
+ filters.add(filter);
+ return this;
+ }
+
+ private String getWorkingDirectory() {
+ return NbPreferences.forModule(NativeDialogBuilder.class).get(key + ".workingdir", null);
+ }
+
+ private void setWorkingDirectory(String dir) {
+ NbPreferences.forModule(NativeDialogBuilder.class).put(key + ".workingdir", dir);
+ }
+
+ public NativeDialogBuilder setAcceptAllFileFilterUsed(boolean accept) {
+ acceptAllFilesFilter = accept;
+ return this;
+ }
+
+ public NativeDialogBuilder setDefaultWorkingDirectory(File dir) {
+ defaultWorkingDir = dir;
+ return this;
+ }
+
+ public NativeDialogBuilder setDescription(String description) {
+ this.description = description;
+ return this;
+ }
+
+ public NativeDialogBuilder setFileFilter(FileNameExtensionFilter filter) {
+ this.filter = filter;
+ return this;
+ }
+
+ public NativeDialogBuilder setTitle(String title) {
+ this.title = title;
+ return this;
+ }
+
+ public File showOpenDialog() {
+ return showOpenDialog(WindowManager.getDefault().getMainWindow());
+ }
+
+ public File showOpenDialog(Component parent) {
+ switch (type) {
+ case FILE:
+ JFileDialog fileDialog = createFileDialog(
+ JFileDialog.DialogType.OPEN_DIALOG_TYPE,
+ JFileDialog.SelectionMode.SINGLE_SELECTION);
+ fileDialog.show(parent);
+ String selectedFileName = fileDialog.getSelectedFileName();
+ if (selectedFileName == null) {
+ return null;
+ }
+ String parentDir = fileDialog.getParentDirectory();
+ setWorkingDirectory(parentDir);
+ return new File(parentDir, selectedFileName);
+
+ case DIRECTORY:
+ JDirectoryDialog directoryDialog = createDirectoryDialog();
+ directoryDialog.show(parent);
+ String selectedDir = directoryDialog.getSelectedDirectory();
+ if (selectedDir == null) {
+ return null;
+ }
+ setWorkingDirectory(selectedDir);
+ return new File(selectedDir);
+ }
+ return null; // should not happen
+ }
+
+ public File[] showMultiOpenDialog() {
+ return showMultiOpenDialog(WindowManager.getDefault().getMainWindow());
+ }
+
+ public File[] showMultiOpenDialog(Component parent) {
+ // ignores DialogType
+ JFileDialog dialog = createFileDialog(
+ JFileDialog.DialogType.OPEN_DIALOG_TYPE,
+ JFileDialog.SelectionMode.MULTIPLE_SELECTION);
+ dialog.show(parent);
+ String[] selectedFileNames = dialog.getSelectedFileNames();
+ if (selectedFileNames == null) {
+ return null;
+ }
+ String parentDir = dialog.getParentDirectory();
+ setWorkingDirectory(parentDir);
+
+ File[] result = new File[selectedFileNames.length];
+ for (int i = 0; i < selectedFileNames.length; i++) {
+ String fileName = selectedFileNames[i];
+ result[i] = new File(parentDir, fileName);
+ }
+ return result;
+ }
+
+ public File showSaveDialog() {
+ return showSaveDialog(WindowManager.getDefault().getMainWindow());
+ }
+
+ public File showSaveDialog(Component parent) {
+ // ignores DialogType
+ JFileDialog dialog = createFileDialog(
+ JFileDialog.DialogType.SAVE_DIALOG_TYPE,
+ JFileDialog.SelectionMode.MULTIPLE_SELECTION);
+ dialog.setConfirmedOverwrite(true);
+ dialog.show(parent);
+ String selectedFileName = dialog.getSelectedFileName();
+ if (selectedFileName == null) {
+ return null;
+ }
+ String parentDir = dialog.getParentDirectory();
+ setWorkingDirectory(parentDir);
+ return new File(parentDir, selectedFileName);
+ }
+
+ private JDirectoryDialog createDirectoryDialog() {
+ JDirectoryDialog dialog = new JDirectoryDialog();
+ dialog.setTitle(title);
+ dialog.setMessage(description);
+ String path = getWorkingDirectory();
+ if (path != null) {
+ dialog.setSelectedDirectory(path);
+ } else if (defaultWorkingDir != null && defaultWorkingDir.isDirectory()) {
+ dialog.setSelectedDirectory(defaultWorkingDir.getAbsolutePath());
+ }
+ return dialog;
+ }
+
+ private JFileDialog createFileDialog(JFileDialog.DialogType dialogType, JFileDialog.SelectionMode selectionMode) {
+ JFileDialog dialog = new JFileDialog();
+ dialog.setDialogType(dialogType);
+ dialog.setSelectionMode(selectionMode);
+ dialog.setTitle(title);
+ setupFilters(dialog);
+
+ String path = getWorkingDirectory();
+ if (path != null) {
+ dialog.setParentDirectory(path);
+ } else if (defaultWorkingDir != null && defaultWorkingDir.isDirectory()) {
+ dialog.setParentDirectory(defaultWorkingDir.getAbsolutePath());
+ }
+ return dialog;
+ }
+
+ private void setupFilters(JFileDialog dialog) {
+ ArrayList extensionFilters = new ArrayList<>();
+ ArrayList extensionFilterNames = new ArrayList<>();
+ int selectedFilter = -1;
+ for (int i = 0; i < filters.size(); i++) {
+ FileNameExtensionFilter extensionFilter = filters.get(i);
+ extensionFilters.add(getExtensionFilters(extensionFilter));
+ extensionFilterNames.add(extensionFilter.getDescription());
+ if (extensionFilter == filter) {
+ selectedFilter = i;
+ }
+ }
+ if (selectedFilter < 0) {
+ if (filter == null) {
+ selectedFilter = 0;
+ } else { // filters list does not contain filter
+ String extensionFilter = getExtensionFilters(filter);
+ String extensionFilterName = filter.getDescription();
+ selectedFilter = filters.size();
+ extensionFilters.add(extensionFilter);
+ extensionFilterNames.add(extensionFilterName);
+ }
+ }
+ if (acceptAllFilesFilter) {
+ extensionFilters.add("*");
+ extensionFilterNames.add(UIManager.getString("FileChooser.acceptAllFileFilterText"));
+ }
+ if (!extensionFilters.isEmpty()) {
+ dialog.setExtensionFilters(
+ extensionFilters.toArray(String[]::new),
+ extensionFilterNames.toArray(String[]::new),
+ selectedFilter);
+ }
+ }
+
+ private String getExtensionFilters(FileNameExtensionFilter extensionFilter) {
+ String[] extensions = extensionFilter.getExtensions();
+ for (int j = 0; j < extensions.length; j++) {
+ extensions[j] = "*." + extensions[j];
+ }
+ return String.join(";", extensions);
+ }
+}
diff --git a/djns/src/pt/cjmach/netbeans/djns/dialog/OpenNativeDialogAction.java b/djns/src/pt/cjmach/netbeans/djns/dialog/OpenNativeDialogAction.java
new file mode 100644
index 0000000..5154a65
--- /dev/null
+++ b/djns/src/pt/cjmach/netbeans/djns/dialog/OpenNativeDialogAction.java
@@ -0,0 +1,36 @@
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ * Click nbfs://nbhost/SystemFileSystem/Templates/NetBeansModuleDevelopment-files/actionListener.java to edit this template
+ */
+package pt.cjmach.netbeans.djns.dialog;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import javax.swing.filechooser.FileNameExtensionFilter;
+import org.openide.awt.ActionID;
+import org.openide.awt.ActionReference;
+import org.openide.awt.ActionRegistration;
+import org.openide.util.NbBundle.Messages;
+
+@ActionID(
+ category = "Tools",
+ id = "pt.cjmach.netbeans.djns.dialog.OpenNativeDialogAction"
+)
+@ActionRegistration(
+ displayName = "#CTL_OpenNativeDialogAction"
+)
+@ActionReference(path = "Menu/Tools", position = 0)
+@Messages("CTL_OpenNativeDialogAction=Open Dialog...")
+public final class OpenNativeDialogAction implements ActionListener {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ NativeDialogBuilder builder = new NativeDialogBuilder(OpenNativeDialogAction.class)
+ .setTitle("Testing 123...")
+ .setAcceptAllFileFilterUsed(true)
+ .setFileFilter(new FileNameExtensionFilter("Image files", "jpg", "gif", "png"));
+ File file = builder.showSaveDialog();
+ System.out.println(file);
+ }
+}
From b92d8e216b891ea6666b9392924d5635c72421cd Mon Sep 17 00:00:00 2001
From: Carlos Machado <58347209+cjmach@users.noreply.github.com>
Date: Sun, 9 Jun 2024 17:25:07 +0100
Subject: [PATCH 3/6] Remove action used for testing native dialogs.
---
.../djns/dialog/OpenNativeDialogAction.java | 36 -------------------
1 file changed, 36 deletions(-)
delete mode 100644 djns/src/pt/cjmach/netbeans/djns/dialog/OpenNativeDialogAction.java
diff --git a/djns/src/pt/cjmach/netbeans/djns/dialog/OpenNativeDialogAction.java b/djns/src/pt/cjmach/netbeans/djns/dialog/OpenNativeDialogAction.java
deleted file mode 100644
index 5154a65..0000000
--- a/djns/src/pt/cjmach/netbeans/djns/dialog/OpenNativeDialogAction.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
- * Click nbfs://nbhost/SystemFileSystem/Templates/NetBeansModuleDevelopment-files/actionListener.java to edit this template
- */
-package pt.cjmach.netbeans.djns.dialog;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.io.File;
-import javax.swing.filechooser.FileNameExtensionFilter;
-import org.openide.awt.ActionID;
-import org.openide.awt.ActionReference;
-import org.openide.awt.ActionRegistration;
-import org.openide.util.NbBundle.Messages;
-
-@ActionID(
- category = "Tools",
- id = "pt.cjmach.netbeans.djns.dialog.OpenNativeDialogAction"
-)
-@ActionRegistration(
- displayName = "#CTL_OpenNativeDialogAction"
-)
-@ActionReference(path = "Menu/Tools", position = 0)
-@Messages("CTL_OpenNativeDialogAction=Open Dialog...")
-public final class OpenNativeDialogAction implements ActionListener {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- NativeDialogBuilder builder = new NativeDialogBuilder(OpenNativeDialogAction.class)
- .setTitle("Testing 123...")
- .setAcceptAllFileFilterUsed(true)
- .setFileFilter(new FileNameExtensionFilter("Image files", "jpg", "gif", "png"));
- File file = builder.showSaveDialog();
- System.out.println(file);
- }
-}
From c5c2c97a6eef6a392d44fd496952f0f99ca29b59 Mon Sep 17 00:00:00 2001
From: Carlos Machado <58347209+cjmach@users.noreply.github.com>
Date: Sun, 9 Jun 2024 17:27:02 +0100
Subject: [PATCH 4/6] Add license header.
---
.../cjmach/netbeans/djns/dialog/DialogType.java | 17 +++++++++++++++++
.../djns/dialog/NativeDialogBuilder.java | 17 +++++++++++++++++
2 files changed, 34 insertions(+)
diff --git a/djns/src/pt/cjmach/netbeans/djns/dialog/DialogType.java b/djns/src/pt/cjmach/netbeans/djns/dialog/DialogType.java
index 2fd6690..b4e7310 100644
--- a/djns/src/pt/cjmach/netbeans/djns/dialog/DialogType.java
+++ b/djns/src/pt/cjmach/netbeans/djns/dialog/DialogType.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2024 Carlos Machado
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
package pt.cjmach.netbeans.djns.dialog;
/**
diff --git a/djns/src/pt/cjmach/netbeans/djns/dialog/NativeDialogBuilder.java b/djns/src/pt/cjmach/netbeans/djns/dialog/NativeDialogBuilder.java
index 700ab3c..ce1a2f6 100644
--- a/djns/src/pt/cjmach/netbeans/djns/dialog/NativeDialogBuilder.java
+++ b/djns/src/pt/cjmach/netbeans/djns/dialog/NativeDialogBuilder.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2024 Carlos Machado
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
package pt.cjmach.netbeans.djns.dialog;
import chrriis.dj.nativeswing.swtimpl.components.JDirectoryDialog;
From b742d5206e51020c93bac8596d2767abaf8de12f Mon Sep 17 00:00:00 2001
From: Carlos Machado <58347209+cjmach@users.noreply.github.com>
Date: Sun, 9 Jun 2024 17:41:29 +0100
Subject: [PATCH 5/6] Clean comment.
---
djns/src/pt/cjmach/netbeans/djns/dialog/NativeDialogBuilder.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/djns/src/pt/cjmach/netbeans/djns/dialog/NativeDialogBuilder.java b/djns/src/pt/cjmach/netbeans/djns/dialog/NativeDialogBuilder.java
index ce1a2f6..ab902ad 100644
--- a/djns/src/pt/cjmach/netbeans/djns/dialog/NativeDialogBuilder.java
+++ b/djns/src/pt/cjmach/netbeans/djns/dialog/NativeDialogBuilder.java
@@ -40,7 +40,6 @@ public class NativeDialogBuilder {
private String title;
private File defaultWorkingDir;
private String description;
- // TODO: Allow to add filters
private final List filters;
private FileNameExtensionFilter filter;
private boolean acceptAllFilesFilter;
From 520c67321f0eeba258bf049efff43b6ba613f549 Mon Sep 17 00:00:00 2001
From: Carlos Machado <58347209+cjmach@users.noreply.github.com>
Date: Mon, 10 Jun 2024 05:14:42 +0100
Subject: [PATCH 6/6] Add html preview multiview element.
---
djns/manifest.mf | 1 +
djns/nbproject/genfiles.properties | 2 +-
djns/nbproject/project.xml | 58 +++++++++++++
.../browser/HtmlPreviewMultiViewElement.java | 81 +++++++++++++++++++
4 files changed, 141 insertions(+), 1 deletion(-)
create mode 100644 djns/src/pt/cjmach/netbeans/djns/browser/HtmlPreviewMultiViewElement.java
diff --git a/djns/manifest.mf b/djns/manifest.mf
index 38f9b4b..19adf96 100644
--- a/djns/manifest.mf
+++ b/djns/manifest.mf
@@ -4,5 +4,6 @@ OpenIDE-Module: pt.cjmach.netbeans.djns
OpenIDE-Module-Install: pt/cjmach/netbeans/djns/Installer.class
OpenIDE-Module-Layer: pt/cjmach/netbeans/djns/layer.xml
OpenIDE-Module-Localizing-Bundle: pt/cjmach/netbeans/djns/Bundle.properties
+OpenIDE-Module-Requires: org.openide.windows.WindowManager
OpenIDE-Module-Specification-Version: 1.1
diff --git a/djns/nbproject/genfiles.properties b/djns/nbproject/genfiles.properties
index d722805..5fddda3 100644
--- a/djns/nbproject/genfiles.properties
+++ b/djns/nbproject/genfiles.properties
@@ -3,6 +3,6 @@ build.xml.script.CRC32=7652be79
build.xml.stylesheet.CRC32=15ca8a54@2.80
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=15ca784d
+nbproject/build-impl.xml.data.CRC32=2e0bc9fb
nbproject/build-impl.xml.script.CRC32=9797c51f
nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.92
diff --git a/djns/nbproject/project.xml b/djns/nbproject/project.xml
index ff48d9a..cd3a8a7 100644
--- a/djns/nbproject/project.xml
+++ b/djns/nbproject/project.xml
@@ -23,6 +23,24 @@
1.55
+
+ org.netbeans.core.multiview
+
+
+
+ 1
+ 1.64
+
+
+
+ org.netbeans.modules.settings
+
+
+
+ 1
+ 1.69
+
+
org.openide.awt
@@ -31,6 +49,30 @@
7.76
+
+ org.openide.dialogs
+
+
+
+ 7.66
+
+
+
+ org.openide.filesystems
+
+
+
+ 9.33
+
+
+
+ org.openide.loaders
+
+
+
+ 7.90
+
+
org.openide.modules
@@ -39,6 +81,22 @@
7.68
+
+ org.openide.nodes
+
+
+
+ 7.65
+
+
+
+ org.openide.text
+
+
+
+ 6.88
+
+
org.openide.util
diff --git a/djns/src/pt/cjmach/netbeans/djns/browser/HtmlPreviewMultiViewElement.java b/djns/src/pt/cjmach/netbeans/djns/browser/HtmlPreviewMultiViewElement.java
new file mode 100644
index 0000000..6f04645
--- /dev/null
+++ b/djns/src/pt/cjmach/netbeans/djns/browser/HtmlPreviewMultiViewElement.java
@@ -0,0 +1,81 @@
+package pt.cjmach.netbeans.djns.browser;
+
+import chrriis.dj.nativeswing.NSComponentOptions;
+import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.StyledDocument;
+import org.netbeans.core.spi.multiview.MultiViewElement;
+import org.netbeans.core.spi.multiview.text.MultiViewEditorElement;
+import org.openide.cookies.EditorCookie;
+import org.openide.loaders.DataObject;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ *
+ * @author cmachado
+ */
+@MultiViewElement.Registration(displayName = "#LBL_HTMLPREVIEW_ELEM",
+ // iconBase = "org/myorg/abcfiletype/Datasource.gif",
+ mimeType = "text/html",
+ persistenceType = TopComponent.PERSISTENCE_NEVER,
+ preferredID = "HtmlPreviewMultiViewElement",
+ position = 3000)
+@NbBundle.Messages({
+ "LBL_HTMLPREVIEW_ELEM=Preview"
+})
+public class HtmlPreviewMultiViewElement extends MultiViewEditorElement {
+
+ private JWebBrowser browser;
+ private boolean needsUpdate = true;
+
+ public HtmlPreviewMultiViewElement(Lookup lookup) {
+ super(lookup);
+ DataObject htmlObject = getLookup().lookup(DataObject.class);
+ htmlObject.addPropertyChangeListener(new PropertyChangeListener() {
+
+ @Override
+ public void propertyChange(PropertyChangeEvent pce) {
+ if (DataObject.PROP_MODIFIED.equals(pce.getPropertyName())) {
+ updateName();
+ }
+ }
+ });
+ }
+
+ @Override
+ public void componentShowing() {
+ // TODO: Update content only when there's actually a change.
+ // It's currently updating the content everytime we select the view.
+ getVisualRepresentation().setHTMLContent(getHTMLContent());
+ }
+
+ private String getHTMLContent() {
+ DataObject htmlObject = getLookup().lookup(DataObject.class);
+ EditorCookie cookie = htmlObject.getCookie(EditorCookie.class);
+ StyledDocument document = cookie.getDocument();
+ if (document == null) {
+ return null;
+ }
+ try {
+ return document.getText(0, document.getLength());
+ } catch (BadLocationException ex) {
+ return "";
+ }
+
+ }
+
+ @Override
+ public JWebBrowser getVisualRepresentation() {
+ if (browser == null) {
+ browser = new JWebBrowser(NSComponentOptions.destroyOnFinalization());
+ browser.setJavascriptEnabled(true);
+ browser.setDefaultPopupMenuRegistered(false);
+ browser.setBarsVisible(false);
+ }
+ return browser;
+ }
+}