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; + } +}